Project Sylpheed stores its UI/story text in IXUD entries as UTF-16LE, interleaved `text, key` (a prose string immediately followed by the identifier that names it). TextIndex::build(pak) scans a language pak's IXUD entries and indexes every pair — 8457 English keys from GP_MAIN_GAME_E: objectives, hints, lose conditions, character names, and cutscene dialogue. This makes the whole game read in English: the 16-mission campaign (Repel the surprise attack → Shoot down Margras → the Prometheus Driver finale), each mission's briefing, and the named cast (Katana, Raymond, Ellen, Crichton, …) all resolve. API: get / objectives / lose_conditions / hints / character_name. 3 tests. Examples: campaign / dossier print the readable campaign + cast. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
16 lines
772 B
Rust
16 lines
772 B
Rust
use sylpheed_formats::{game_data, localization::TextIndex, PakArchive};
|
|
fn main(){
|
|
let disc=std::env::var("SYLPHEED_DISC").unwrap();
|
|
let pak=PakArchive::open(format!("{disc}/dat/GP_MAIN_GAME_E.pak")).unwrap();
|
|
let text=TextIndex::build(&pak);
|
|
for n in 1..=16u32{
|
|
let sid=format!("S{n:02}");
|
|
// primary objective across phases (first that resolves)
|
|
let obj:Vec<String>=(1..=3).flat_map(|p|text.objectives(&sid,p)).map(|s|s.to_string()).collect();
|
|
let lose:Vec<String>=(1..=3).flat_map(|p|text.lose_conditions(&sid,p)).map(|s|s.to_string()).collect();
|
|
let full_obj=obj.join(" ");
|
|
let full_lose=lose.into_iter().take(2).collect::<Vec<_>>().join(" ");
|
|
println!("{sid}\t{full_obj}\t{full_lose}");
|
|
}
|
|
}
|