Decode the UNITS/ZUNITS player-unit tables (GP_HANGAR_ARSENAL.pak) into flight assignments: which pilot flies each callsign (Rhino1→Katana, Bird1→Sandra, …), plus the player craft. Assignments are `Callsign<N>- Pilot` tokens, extracted by shape. 138 configs; the distinct line-ups trace the campaign's story — Raymond leads Rhino flight early (Rhino1=Raymond, Rhino2=Katana), then Katana takes the lead (Rhino1=Katana, Rhino2=Ellen, Rhino3=Gene, Rhino4=Yoji). Example `flights` prints the line-ups. +1 test. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
18 lines
777 B
Rust
18 lines
777 B
Rust
use sylpheed_formats::{game_data as gd, PakArchive};
|
|
fn main(){
|
|
let disc=std::env::var("SYLPHEED_DISC").unwrap();
|
|
let pak=PakArchive::open(format!("{disc}/dat/GP_HANGAR_ARSENAL.pak")).unwrap();
|
|
let rosters=gd::load_pilot_rosters(&pak);
|
|
// distinct rosters by their pilot set
|
|
let mut seen=std::collections::BTreeSet::new(); let mut shown=0;
|
|
println!("{} pilot-roster configs; distinct line-ups:", rosters.len());
|
|
for r in &rosters{
|
|
let key:String=r.pilots.iter().map(|(c,p)|format!("{c}:{p}")).collect::<Vec<_>>().join(",");
|
|
if seen.insert(key) && shown<8 {
|
|
shown+=1;
|
|
let flt:Vec<String>=r.pilots.iter().map(|(c,p)|format!("{c}={p}")).collect();
|
|
println!(" {}", flt.join(" "));
|
|
}
|
|
}
|
|
}
|