diff --git a/docs/re/INDEX.md b/docs/re/INDEX.md index 9bbee68..7b04f57 100644 --- a/docs/re/INDEX.md +++ b/docs/re/INDEX.md @@ -22,7 +22,7 @@ Promote to a prose `structures/…md` file when a format needs behavioural notes | XBG7 mesh | 🟡/❔ | `sylpheed-formats/src/mesh.rs` + `tests/mesh_disc.rs` ([xbg7](structures/xbg7-mesh.md)) | weapons/props: declaration-driven variable stride (36 models), GPU-confirmed. **Stage containers: 5662 sub-models across 22 stages** via content-anchored grouped pools (`stage_models`). Quantized hero bodies (DeltaSaber `f004`) still declined | | Capital-ship part placement | 🟡 | `sylpheed-formats/src/ship.rs` (static) + [runtime capture](ship-placement-runtime-capture.md) | hull placement static-exact; external parts approximate statically. **Runtime capture** (Canary F10 → VS-constant WorldView) gives ground truth — validated on `e106` destroyer; not yet baked into the viewer | | Weapon fields defaulted on disc | ✅/🟡 | [runtime DATA SHEET](weapon-datasheet-runtime.md) | The Arsenal Gallery-Mode panel reads the live record: `Ammo Capacity` = `LoadingCount` ✅, `Max. Lock Ons` = `TriggerShotCount` ✅. Recovers `TriggerShotCount` for `wep_05`/`wep_60` (both **4**); brackets defaulted `Power`/`MaximumRange` via the letter classes. 9 of ~61 weapons reachable at 5 % save progress | -| UI screen layout (`.rat`) | ✅/🟡 | [ui-rat-layout](structures/ui-rat-layout.md) | One pak per UI screen; each RATC = one (context × language) build; every `.t32` sprite has a `.rat` **layout record** (BE u32; 1280×720 design space; scale/tint/X/Y, keyframes for animated elements, `opt ` link to the focused state). **The tutorial PAUSE menu rebuilds pixel-accurately from the disc.** `loop1.rat` (screen-level draw order) not yet decoded | +| UI screen layout (`.rat`) | ✅/🟡 | [ui-rat-layout](structures/ui-rat-layout.md) | One pak per UI screen; each RATC = one (context × language) build; every `.t32` sprite has a `.rat` **layout record** (BE u32; 1280×720 design space; scale/tint/X/Y, keyframes for animated elements, `opt ` link to the focused state). **The tutorial PAUSE menu and the title main menu both rebuild pixel-accurately from the disc.** `loop1.rat` (screen-level draw order) not yet decoded | ## Functions / code paths diff --git a/docs/re/captures/ui-layout/title-mainmenu-real-vs-rebuilt.png b/docs/re/captures/ui-layout/title-mainmenu-real-vs-rebuilt.png new file mode 100644 index 0000000..ba0ec54 Binary files /dev/null and b/docs/re/captures/ui-layout/title-mainmenu-real-vs-rebuilt.png differ diff --git a/docs/re/structures/ui-rat-layout.md b/docs/re/structures/ui-rat-layout.md index 5617ba0..a089dbe 100644 --- a/docs/re/structures/ui-rat-layout.md +++ b/docs/re/structures/ui-rat-layout.md @@ -136,6 +136,23 @@ game, twice, in that order — the records were never fitted to the picture. > proves nothing. The in-mission coordinates remain **unverified**: confirming them needs a > screenshot of a pause during an actual mission. +## It generalizes — the title screen + +The same method run against `GP_TITLE.pak` reproduces the **main menu**, which is a +different screen with a different item count and a different pitch: + +![main menu real vs rebuilt](captures/ui-layout/title-mainmenu-real-vs-rebuilt.png) + +`ptbtn01..05.rat` give X = 542 for all five and Y = 162 / 242 / 322 / 402 / 482 — an +**80 px** pitch, where the pause menu used 70. Measured against the screenshot, the sprite +tops land at a constant **+46 px** for all five (one reads 45, a 1-px edge-detection +wobble), and 46 is exactly the 45 px of Xenia window chrome plus one. So the record's Y is +the sprite's top edge in the guest framebuffer, to the pixel, on a second screen. + +`GP_TITLE.pak` also splits by sub-screen the way the pause pak splits by context: +`ptbtn00` alone (the `PRESS Ⓐ BUTTON` prompt), `ptbtn01..05` (main menu), `ptbtn11..13` +(the EXTRAS submenu), plus `pgloading_*` for the loading screen. + ## Two traps this caught Both were mistakes made during this analysis, caught by comparing against the real game —