Attempted to refute sylpheed-port's leaf table by measuring it against the disc. It SURVIVES to the digit: ptloop01 -> pteff03, cycle span 600, x track -639..1521, scale (100, 600); ptloop02 -> pteff03a, span 720, x -839..1721, scale (100, 800). The existing ptloop_leaf_sweep_at.rs samples only t=340..540 -- a window chosen to compare two competing fits -- so it could never have shown the extent. That gap is what let my "ptloop01/02 do not free-run" claim stand: measured over the parent's 200x90 pivot rect, which a leaf travelling -639..1521 is almost never inside. ptloop_leaf_extent.rs sweeps the whole cycle instead. New fact neither of us had: the leaves are IDENTICAL on entries 4, 5 AND 7 -- the title, the main menu and the JP title. Same leaf names, spans, x tracks, scales and parent rest position. So the menu declares exactly the same sweep as the title, and the still-open menu question is about the game's behaviour rather than a different declaration. The quad is 400 px wide at scale_x 100 % -- not widened -- and scale_y 600/800 % makes it 1080/1440 px tall, taller than the screen. A full-height strip crossing the frame and going off both sides, which is why a phase-to-phase diff covers the union of two positions and looks frame-wide. And my own "centre running x~921->1041" was a 30-unit window of a 600-unit cycle whose centre spans -439..1721. A sub-range is not an extent -- the same caution as a pivot not being a bounding box, one level up, and I made both errors within a day. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v
52 lines
2.8 KiB
Rust
52 lines
2.8 KiB
Rust
//! The FULL extent of the two title sweep leaves, across their whole cycle.
|
|
//!
|
|
//! `ptloop_leaf_sweep_at.rs` samples t=340..540 — a window chosen to compare two
|
|
//! competing fits — so it never showed how far the leaves travel. That gap let a
|
|
//! claim stand that `ptloop01/02` "do not free-run", measured over the PARENT's
|
|
//! 200x90 rect, which is a pivot anchor the leaf spends almost no time inside.
|
|
//! `sylpheed-port` reports x tracks of -639..1521 and -839..1721 from their
|
|
//! export; this checks that against the disc.
|
|
//!
|
|
//! cargo run -p sylpheed-formats --example ptloop_leaf_extent
|
|
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_TITLE.pak")).expect("GP_TITLE.pak");
|
|
for entry in [4usize, 5, 7] {
|
|
let Ok(by) = ar.read(&ar.entries()[entry]) else { continue };
|
|
let Some(b) = ui_layout::parse_build(&by) else { continue };
|
|
println!("\n######## GP_TITLE entry {entry} ########");
|
|
for parent in ["ptloop01", "ptloop02"] {
|
|
let Some(el) = b.elements.iter().find(|e| e.name.starts_with(parent)) else {
|
|
println!(" {parent}: not present in this build"); continue };
|
|
let Some(&(off, size)) = b.records.get(&el.name) else {
|
|
println!(" {}: no nested record", el.name); continue };
|
|
let span = u32::from_be_bytes(by[off + 8..off + 12].try_into().unwrap());
|
|
let Some(lb) = ui_layout::parse_build(&by[off..off + size]) else {
|
|
println!(" {}: leaf will not parse", el.name); continue };
|
|
println!(" {} parent rest ({},{}) nested cycle span {span}",
|
|
el.name, el.keyframes.last().map(|k| k.x).unwrap_or(0),
|
|
el.keyframes.last().map(|k| k.y).unwrap_or(0));
|
|
for le in &lb.elements {
|
|
let (mut lo, mut hi) = (i64::MAX, i64::MIN);
|
|
let (mut sxs, mut sys) = (Vec::new(), Vec::new());
|
|
for t in 0..=span {
|
|
if let Some(k) = le.pose_at(t) {
|
|
lo = lo.min(k.x as i64); hi = hi.max(k.x as i64);
|
|
if !sxs.contains(&k.scale_x) { sxs.push(k.scale_x) }
|
|
if !sys.contains(&k.scale_y) { sys.push(k.scale_y) }
|
|
}
|
|
}
|
|
let w = (le.pivot_x * 2) as i64;
|
|
println!(" leaf {:<12} pivot {}x{} quad w={w} x track {lo} .. {hi} \
|
|
(centre {} .. {}) scale_x {:?} scale_y {:?}",
|
|
le.name, le.pivot_x, le.pivot_y,
|
|
lo + le.pivot_x as i64, hi + le.pivot_x as i64, sxs, sys);
|
|
}
|
|
}
|
|
}
|
|
println!("--- END ---");
|
|
}
|