re(ui): a RATC child's name is stated, not inferred -- and it was hiding every menu background
`ratc::parse` named each child by scanning backwards for the last printable run of bytes before its magic. The format states the name explicitly instead, in an `opt ` block: `"opt " | BE32 len | name | NUL | 3 bytes | magic` -- the same block `ui_layout::opt_link` already read for a button's focus link. The scan agrees with it 17 918 times out of 17 942 and is wrong 24 times, every one the same failure: the 3 trailing payload bytes are themselves printable and beat the real name. For `pteff05.t32` those bytes are `38 41 58` = `8AX`, so the full-resolution background of all five menu screens registered under a name no element declares, resolved to no sprite, and `compose` dropped it through an early `continue` that -- unlike the two arms above it -- records nothing. The screen lost its background and `screen render` still reported "all resolved". `8AX` was never a name. Docs that treated it as one are corrected here. Disc-wide, and the control is the 17 918 the scan already got right: the `opt ` reading reproduces every one of them. Effect on the five screens is the signature of the same art at twice the resolution -- mean brightness unmoved, high-frequency detail x1.15..x1.30 -- which is what the separately-measured `ui-8ax-fullres-background` result said the game draws. Also closes a long-standing dangling reference: `pmbase.t32`, recorded as "on the disc nowhere", is the `GP_STAGE_CLEAR` child the scan called `8AX`. RATC sibling references now resolve 10 148 of 10 148. Verified: 114/114 sylpheed-formats unit tests (including two new ones pinning the `8AX` case byte for byte and the no-block fallback), and every disc-gated integration suite in sylpheed-formats/sylpheed-cli.
This commit is contained in:
@@ -261,7 +261,26 @@ authored version can be deleted.
|
||||
setting rather than bake in.
|
||||
[`structures/ui-render-tone-curve.md`](../re/structures/ui-render-tone-curve.md)
|
||||
|
||||
* 🟡 **`screen render` silently drops one full-screen element per screen — and
|
||||
* ✅ **FIXED 2026-08-29 — the dropped background was a name-decoding defect, and
|
||||
`screen render` now draws it.** The reference composites for all five screens
|
||||
changed; regenerate anything you diffed against before that date. Cause: a
|
||||
RATC child's name is stated by an **`opt ` block** immediately before it
|
||||
(`"opt " | BE32 len | name | NUL | 3 bytes | magic`), and our parser instead
|
||||
guessed it from the last printable run of bytes. For this one child the 3
|
||||
trailing bytes are `38 41 58` = `"8AX"`, which beat the real name
|
||||
`pteff05.t32`. **`8AX` was never a name** — earlier text on this page treating
|
||||
it as one was wrong. Disc-wide: 18 002 children, 17 918 already agreed with the
|
||||
`opt ` reading and **24 did not**, every one the same 3-byte-tail failure.
|
||||
Effect on your five screens: mean brightness unmoved, high-frequency detail
|
||||
**×1.15…×1.30** — the same art at twice the resolution, which is exactly what
|
||||
[8AX](../re/structures/ui-8ax-fullres-background.md) said the game draws.
|
||||
⚠️ Both backgrounds are now drawn (`ptbase` upscaled, then the full-res one over
|
||||
it): correct, but wasted fill. Draw only the full-res one, taking its *timing*
|
||||
from `ptbase`'s element, which carries the keyframes.
|
||||
[`structures/ratc-child-names.md`](../re/structures/ratc-child-names.md)
|
||||
<details><summary>the original entry, kept because its reasoning still stands</summary>
|
||||
|
||||
🟡 **`screen render` silently drops one full-screen element per screen — and
|
||||
you must NOT simply draw it.** Auditing what the composer omits on your five
|
||||
screens: everything is accounted for (`kind & 0x4` ghost instances, `.prm`
|
||||
primitives, `loop*` animations) except **`pteff04.t32`** on the title and
|
||||
@@ -287,9 +306,11 @@ authored version can be deleted.
|
||||
full-screen layer over an identical one costs fill and hides later changes; and
|
||||
note `ptbase`'s element is the one carrying the keyframes, so you need its
|
||||
timing with `8AX`'s pixels.
|
||||
⚠️ It does not show whether `ptbase` is *also* drawn underneath — `8AX` is
|
||||
⚠️ It does not show whether `ptbase` is *also* drawn underneath — the full-res
|
||||
background is
|
||||
~86 % opaque and would hide it either way.
|
||||
[`structures/ui-8ax-fullres-background.md`](../re/structures/ui-8ax-fullres-background.md)
|
||||
</details>
|
||||
|
||||
* ✅ **Paint order: your exposure is two element pairs, on one screen.** We use
|
||||
an order *measured from the running game* where one exists and a derived order
|
||||
|
||||
Reference in New Issue
Block a user