GP_DIALOG has exactly 140 entries against the table's 70 records, a 2:1 ratio that would make the unbound join an ordering question. It does not hold: adjacent pairing gives identical element-name sets on 2 of 65 pairs, halves pairing on 0. GP_TITLE's language pairs share element sets exactly, so identical sets are the signature there; in GP_DIALOG almost nothing matches. Residual and unexplained: the only two adjacent pairs that DO match are entries 0/1 and 2/3, and 2/3 is the DIFFICULTY build. A reading I am not asserting: dialog text may be baked into language-specific sprites, which would explain the 63 by construction but leaves the 2 needing their own explanation. Not tested. The join stays unbound; positional ordering is now ruled out, which narrows where to look next. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v
30 lines
1.2 KiB
Rust
30 lines
1.2 KiB
Rust
//! How is `GP_DIALOG.pak` organised? Testing whether dialog id maps positionally.
|
|
//!
|
|
//! The dialog table gives name -> id (70 records, `DLG_SELECT_DIFFICULTY` = 2000)
|
|
//! and the disc gives a unique four-button build at GP_DIALOG entries 2/3. Nothing
|
|
//! joins them. If the archive were laid out in table order, or in id order, the
|
|
//! join would be positional — this checks.
|
|
//!
|
|
//! cargo run -p sylpheed-formats --example dialog_pak_shape
|
|
use sylpheed_formats::{pak::PakArchive, ui_layout};
|
|
use std::path::PathBuf;
|
|
|
|
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 builds = 0;
|
|
let mut with_btn = 0;
|
|
for e in ar.entries() {
|
|
let Ok(by) = ar.read(e) else { continue };
|
|
if let Some(b) = ui_layout::parse_build(&by) {
|
|
builds += 1;
|
|
if b.elements.iter().any(|el| el.name.contains("btn")) {
|
|
with_btn += 1;
|
|
}
|
|
}
|
|
}
|
|
println!("entries {n}, parse as builds {builds}, of those with a btn element {with_btn}");
|
|
println!("dialog table has 70 records; 70 x 2 (EN/JP) = 140");
|
|
}
|