//! Is `GP_DIALOG` 2/3 the ONLY build on the disc with four buttons at 259/329/399/469? //! //! Both agents recorded the same reach on the DIFFICULTY identification: entries //! 2/3 are picked out by button count and geometry, not by a binding from //! `DLG_SELECT_DIFFICULTY` to a pak entry, so "another four-button dialog with the //! same rows would be indistinguishable". This tests whether such a rival exists. //! //! CONTROL: the scan must find GP_DIALOG 2 and 3 themselves. A rival-search that //! cannot find the incumbent proves nothing. //! //! cargo run -p sylpheed-formats --example four_button_row_rivals use std::path::PathBuf; use sylpheed_formats::{pak::PakArchive, ui_layout}; const WANT: [i32; 4] = [259, 329, 399, 469]; fn main() { let root = PathBuf::from(std::env::var("SYLPHEED_DISC").expect("SYLPHEED_DISC")); let mut paks: Vec<_> = std::fs::read_dir(root.join("dat")) .expect("dat") .filter_map(|e| e.ok().map(|e| e.path())) .filter(|p| p.extension().map(|x| x == "pak").unwrap_or(false)) .collect(); paks.sort(); let (mut incumbent, mut rivals) = (0, 0); for p in &paks { let Ok(ar) = PakArchive::open(p) else { continue; }; let pname = p.file_name().unwrap().to_string_lossy().to_string(); for (i, e) in ar.entries().iter().enumerate() { let Ok(by) = ar.read(e) else { continue }; let Some(b) = ui_layout::parse_build(&by) else { continue; }; let mut ys: Vec = b .elements .iter() .filter(|el| el.name.contains("btn") && !el.name.contains('f')) .map(|el| el.rest().map(|k| k.y).unwrap_or(el.pivot_y as i32)) .collect(); ys.sort(); ys.dedup(); if ys.len() != 4 { continue; } let close = ys.iter().zip(WANT.iter()).all(|(a, b)| (a - b).abs() <= 6); if close { let is_inc = pname == "GP_DIALOG.pak" && (i == 2 || i == 3); if is_inc { incumbent += 1 } else { rivals += 1 } println!( " {}{pname:24} entry {i:4} rows {ys:?}", if is_inc { "INCUMBENT " } else { "RIVAL " } ); } } } println!( "\ncontrol: found {incumbent} incumbent build(s) (want 2) — {}", if incumbent == 2 { "PASSED" } else { "FAILED" } ); println!("{rivals} rival build(s) elsewhere on the disc"); }