//! Probe: does a `.rat` leaf record carry geometry the parent element does not? //! //! The GPU capture says the title submits `ptloop01`/`ptloop02` scaled 600 %/800 % //! and rotated +30.26°/−45.28°, while the export writes scale 100 % and rotation //! 0 for both. `ui_layout`'s own note says the rotated quads come from the //! **nested `.rat` leaf records**, which is where `export_screen` already looks //! for focus records and nowhere else. use sylpheed_formats::{pak::PakArchive, ui_layout}; fn main() { let disc = std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root"); let ar = PakArchive::open(format!("{disc}/dat/GP_TITLE.pak")).expect("open"); let e = &ar.entries()[4]; // entry 4 = the English title let bundle = ar.read(e).expect("read"); let b = ui_layout::parse_build(&bundle).expect("parse"); println!( "build has {} elements, {} records", b.elements.len(), b.records.len() ); let mut names: Vec<&String> = b.records.keys().collect(); names.sort(); println!("records: {names:?}"); for el in &b.elements { if !el.name.starts_with("ptloop") { continue; } let r = el.rest(); println!( "\nPARENT {} sprite={:?} -> rest scale {:?} rot {:?}", el.name, el.sprite, r.map(|r| (r.scale_x, r.scale_y)), r.map(|r| r.rotation_deg) ); if let Some(&(off, size)) = b.records.get(&el.name) { match ui_layout::parse_build(&bundle[off..off + size]) { Some(leaf) => { println!( " LEAF {} parses: {} element(s)", el.name, leaf.elements.len() ); for le in &leaf.elements { let lr = le.rest(); println!( " {:<20} rest scale {:?} rot {:?} pos {:?}", le.name, lr.map(|r| (r.scale_x, r.scale_y)), lr.map(|r| r.rotation_deg), lr.map(|r| (r.x, r.y)) ); for k in &le.keyframes { println!(" t={:?} scale=({},{}) rot={} pos=({},{}) fade={:#010x} u4={} u8={}", k.time, k.scale_x, k.scale_y, k.rotation_deg, k.x, k.y, k.fade, k.unknown_4, k.unknown_8); } } } None => println!(" LEAF {} does NOT parse as a build", el.name), } } else { println!(" no record named {}", el.name); } } }