//! What differs between equal-button-count `GP_DIALOG` adjacent pairs? //! //! All 39 share button names and rows. That is consistent with a LANGUAGE PAIR and //! equally with TWO DIALOGS SHARING A BUTTON TEMPLATE (two yes/no boxes differing //! only in their message sprite). The difference is in what else differs: a //! language pair should differ in the SAME slots with locale-marked names. //! //! cargo run -p sylpheed-formats --example dialog_pair_diffs use std::collections::BTreeSet; use std::path::PathBuf; use sylpheed_formats::{pak::PakArchive, ui_layout}; fn names(ar: &PakArchive, i: usize) -> Option> { let by = ar.read(&ar.entries()[i]).ok()?; let b = ui_layout::parse_build(&by)?; Some(b.elements.iter().map(|e| e.name.clone()).collect()) } fn main() { let root = PathBuf::from(std::env::var("SYLPHEED_DISC").expect("SYLPHEED_DISC")); let ar = PakArchive::open(root.join("dat/GP_DIALOG.pak")).expect("GP_DIALOG"); let n = ar.entries().len(); let mut shown = 0; for k in (0..n).step_by(2) { let (Some(a), Some(b)) = (names(&ar, k), names(&ar, k + 1)) else { continue; }; if a == b { continue; } let oa: Vec<&String> = a.difference(&b).collect(); let ob: Vec<&String> = b.difference(&a).collect(); // only the equal-button-count ones let ba = a.iter().filter(|x| x.contains("btn")).count(); let bb = b.iter().filter(|x| x.contains("btn")).count(); if ba != bb { continue; } if shown < 6 { println!( "entries {k:3}/{:<3} shared {} only-in-{k}: {:?} only-in-{}: {:?}", k + 1, a.intersection(&b).count(), oa, k + 1, ob ); shown += 1; } } }