Searched RAM for HP 25000 (200+ hits, too common), for the rare float AttackVesselPoint 0.08 (64 hits, no window holds the unit's other values, one hit is a code constant), and for the ID string itself (two copies, each pointed at from -0x10, but the surrounding 256 words hold none of the numbers because that region is the IDXD string pool where values are ASCII). Hypothesis recorded as 🟡: IDXD is reflective and the engine likely reads values from the pool by key on demand, caching only the per-frame ones -- which is exactly what the 0x820af844 object contains at any dump depth. If so, a defaulted field has no value anywhere in data and the default is applied by code at read time, so Route B for the Ratio/Count family needs the read path or the static DuckDB route, not more scanning. The 13 Size_Y values worked because Size_Y is one of the cached fields. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
23 lines
861 B
Rust
23 lines
861 B
Rust
use sylpheed_formats::idxd::IdxdObject;
|
|
use sylpheed_formats::pak::PakArchive;
|
|
fn main() {
|
|
let disc = std::env::args().nth(1).unwrap();
|
|
let want = std::env::args().nth(2).unwrap();
|
|
let pak = PakArchive::open(format!("{disc}/dat/GP_MAIN_GAME_E.pak")).unwrap();
|
|
for e in pak.entries() {
|
|
let Ok(b) = pak.read(e) else { continue };
|
|
let Ok(o) = IdxdObject::parse(&b) else { continue };
|
|
let Some(id) = o.get_raw("ID") else { continue };
|
|
if !id.contains(&want) { continue; }
|
|
println!("=== {id}");
|
|
let mut seen = std::collections::BTreeSet::new();
|
|
for k in o.tokens() {
|
|
if let Some(v) = o.get_f32(k) {
|
|
if v != 0.0 && seen.insert(k.clone()) {
|
|
println!(" {:<28} {:<12} 0x{:08x}", k, v, v.to_bits());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|