diff --git a/docs/re/captures/arsenal-layout-validation.png b/docs/re/captures/arsenal-layout-validation.png new file mode 100644 index 0000000..bf97b5d Binary files /dev/null and b/docs/re/captures/arsenal-layout-validation.png differ diff --git a/docs/re/structures/ui-rat-layout.md b/docs/re/structures/ui-rat-layout.md index d0f32bd..08a01c9 100644 --- a/docs/re/structures/ui-rat-layout.md +++ b/docs/re/structures/ui-rat-layout.md @@ -277,3 +277,40 @@ the running game: [movie table](../movie-subtitle-link.md) uses. A sub-component reads identically: `psselect_win1` declares 4 elements, three of them **parented to element 0**, which is the parent-index field doing real work on an independent pak. + +### Validated against the running game, to ±2 px + +The layout above is a static parse; this is the check that it predicts what the +game actually draws. Booting to the ARSENAL and detecting the eight teal category +chips by colour gives their row centres, against the eight `prbtn1…8.rat` +placements from `eng\prmain_scr.prt`: + +``` +placement Y + pivotY(14) + chrome(45) observed centre diff + 166 225 224 -1 + 220 279 278 -1 + 276 335 334 -1 + 331 390 388 -2 + 385 444 444 +0 + 441 500 498 -2 + 496 555 554 -1 + 551 610 608 -2 +``` + +The spacings are the real signature: **54, 56, 55, 54, 56, 55, 55** predicted +against **54, 56, 54, 56, 54, 56, 54** observed — an irregular alternating pattern, +not a round number that could match by luck. The single free parameter is the +**45 px emulator window chrome** (title bar + menu bar), which is not part of the +game; the ±2 px residual is the centroid measurement, since a thresholded chip +centre is not exact. + +This confirms three things at once: the **declaration table is the element set**, +the **placement region gives real screen coordinates**, and the **pivot composes +additively** — `pivotY = 14` is half the 28 px chip, so placement is the top-left +and pivot carries the centre offset, exactly as the record layout says. + +**Not** confirmed by this: the max-dwell rule for *animated* elements. These eight +buttons are static (every keyframe identical), which is precisely why they make a +clean ruler. Validating the animation rule needs an element captured mid-slide. + +Evidence: [`captures/arsenal-layout-validation.png`](../captures/arsenal-layout-validation.png).