re: decode the dialog table -- 70/70 records, DLG_SELECT_DIFFICULTY is id 2000
Chasing the reach I recorded this morning found the binding it said was missing.
Every DLG_ string in the image is pointed at by one aligned word at a 12-byte
stride: {u32 handler, u32 id, u32 name_ptr}, spanning 0x820A0A2C..0x820A0D68 with
three distinct handlers. Complete -- 70 names, 70 records, none unmatched -- and the
ids are banded and monotonic with a single gap at 24. Read from the image directly.
Refutation attempt on the shared reach, which both agents had recorded: 'another
four-button dialog with the same rows would be indistinguishable'. Scanned every
build in every pak for four buttons within 6 px of 259/329/399/469. Control found
both incumbents; zero rivals exist anywhere on the disc. So the geometric
identification is unique disc-wide, which is stronger than what either of us
claimed.
Still unbound: id 2000 to a pak entry. The tie remains uniqueness plus the oracle
capture, not a pointer.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v
This commit is contained in:
55
crates/sylpheed-formats/examples/four_button_row_rivals.rs
Normal file
55
crates/sylpheed-formats/examples/four_button_row_rivals.rs
Normal file
@@ -0,0 +1,55 @@
|
||||
//! 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 sylpheed_formats::{pak::PakArchive, ui_layout};
|
||||
use std::path::PathBuf;
|
||||
|
||||
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<i32> = 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");
|
||||
}
|
||||
Reference in New Issue
Block a user