//! Per-phase MAIN objectives, straight from the localisation index. //! //! The mission-phase work went looking for what a phase asks the player to do //! and reconstructed it from `SUBObjective_local_string.tbl` — the *bonus* //! objectives — plus the guide script. `TextIndex` already indexes the main //! ones under `S_P_Objective_`, so this pins them as a disc test and //! makes the per-phase goals a checkable artifact rather than an inference. use sylpheed_formats::{localization::TextIndex, PakArchive}; fn pak() -> Option { let disc = std::env::var("SYLPHEED_DISC").ok()?; PakArchive::open(format!("{disc}/dat/GP_MAIN_GAME_E.pak")).ok() } #[test] fn stage02_has_a_main_objective_for_each_phase() { let Some(pak) = pak() else { eprintln!("SYLPHEED_DISC unset - skipping"); return; }; let text = TextIndex::build(&pak); assert!(text.len() > 0, "text index is empty"); for stage in ["S01", "S02"] { for phase in 1..=3u32 { let objs = text.objectives(stage, phase); eprintln!("{stage} phase {phase}: {} objective line(s)", objs.len()); for o in &objs { eprintln!(" {o}"); } for h in text.hints(stage, phase) { eprintln!(" hint: {h}"); } for l in text.lose_conditions(stage, phase) { eprintln!(" lose: {l}"); } } } // Phase 1 of Stage 02 is the case the wave work could not observe; if the // game states its goal at all, it is here. assert!( !text.objectives("S02", 1).is_empty(), "no main objective text for Stage 02 phase 1" ); }