From 49cd4996f270b7d1d9087a028f2b4d600470e964 Mon Sep 17 00:00:00 2001 From: Sylpheed RE agent Date: Wed, 26 Aug 2026 06:46:50 +0000 Subject: [PATCH] re: RATC +0x0c is two u16s forming an ordered interval, not one number Read as a u32 it looks meaningless -- 179 distinct values up to 248581842. The raw values give it away (0x0007000F, 0x000F001A, 0x003C0064): two big-endian u16s. Over all 2985 bundles, high < low in 2985/2985 with no equal and no inverted cases, and both are bounded by the animation length at +0x08. Span runs 1-1200, clustering on 1/10/30/8/20; low equals the animation length in 4%. A strict ordering holding 2985 times rules out flags or a packed count. Which interval it is stays yellow -- playback range, loop region and active window all fit equally. Recorded the alternative I did NOT test: that (high, low) is simply the min and max keyframe time, making it a derived summary rather than an authored range. First step written down. The 34.9% of bundles with high == 0 leans against it but is not evidence on its own. --- docs/re/BACKLOG.md | 5 +++- docs/re/structures/ui-rat-layout.md | 45 ++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/docs/re/BACKLOG.md b/docs/re/BACKLOG.md index 05f8983..221c72f 100644 --- a/docs/re/BACKLOG.md +++ b/docs/re/BACKLOG.md @@ -303,7 +303,10 @@ See [`structures/ui-composable-bundles.md`](structures/ui-composable-bundles.md) at 1.0 rather than near zero (that histogram is what rules out a vacuous bound). 🟑 `+0x04` (`0x3C0000`/`0x1E0000` = 60.0/30.0 in 16.16) stays amber: the only supporting evidence is that the twelve 30.0 bundles cap at `+0x08`=30 - while the 2 843 60.0 ones reach 1 440. ❔ `+0x0c` and `+0x10` unexplained. + while the 2 843 60.0 ones reach 1 440. βœ… `+0x0c` is **two u16s forming an ordered + interval** β€” `high < low` in **2 985/2 985**, both bounded by the animation + length; 🟑 which interval, and ❔ whether it is authored or just the keyframe + min/max, is untested. `+0x10` still ❔. See [`structures/ui-rat-layout.md`](structures/ui-rat-layout.md). * 🟑 **What `opt ` links β€” a recordβ†’record reference** (2026-08-24, measured disc-wide and asserted). All **1 467** links reachable from a declaration table diff --git a/docs/re/structures/ui-rat-layout.md b/docs/re/structures/ui-rat-layout.md index ccb4d69..4665f0e 100644 --- a/docs/re/structures/ui-rat-layout.md +++ b/docs/re/structures/ui-rat-layout.md @@ -509,7 +509,7 @@ composable bundles with a real declaration table |---|---|---| | `+0x04` | **3** β€” `0x3C0000` Γ—2 843, `0x1E0000` Γ—12, `0x3C0001` Γ—4 | 🟑 **frame rate in 16.16**: `0x3C0000` is exactly `60.0`, `0x1E0000` exactly `30.0` | | `+0x08` | 22 β€” 30, 1200, 120, 60, … | βœ… the **animation length**, in the same unit as a keyframe's `time` β€” see below | -| `+0x0c` | 170 | ❔ | +| `+0x0c` | 179 as a u32 β€” but it is **two u16 fields**, see below | βœ… structure, 🟑 meaning | | `+0x10` | 83 β€” `0x9400`, `0x9200`, `0x8212`, … | ❔ flags; bit 15 set on **91 %** of all bundles | | `+0x18` | **2** β€” `1280` Γ—2 829 | βœ… **design width** | | `+0x1c` | **3** β€” `720` Γ—2 823 | βœ… **design height** | @@ -597,3 +597,46 @@ bundles and 1 on four. What that low field means is ❔. Nothing here measures a wall-clock duration, and **nothing in this container can**: the emulator runs on software Vulkan far from real time, so timing an animation would measure lavapipe, not the game. + + +## βœ… `+0x0c` is two `u16`s forming an ordered interval + +**2026-08-26.** Read as one `u32`, `+0x0c` looks meaningless β€” 179 distinct +values ranging to 248 581 842. Read as **two big-endian `u16`s** it is highly +structured. The tell is in the raw values: `0x0007000F`, `0x000F001A`, +`0x003C0064` β€” small numbers in both halves. + +Over all **2 985** RATC bundles on the disc: + +| | | +|---|---| +| `high < low` | **2 985 / 2 985 (100 %)** | +| `high == low` | 0 | +| `high > low` | 0 | +| `high ≀` animation length `+0x08` | **2 985 / 2 985** | +| `low ≀` animation length `+0x08` | **2 985 / 2 985** | + +`high` is 0 in 34.9 % and ranges 0–3 793; `low` ranges 1–3 794; the span +`low βˆ’ high` runs 1–1 200 and clusters on 1, 10, 30, 8, 20. `low` equals the +animation length exactly in 4.0 %. + +So the field is **an ordered pair bounded by the animation length, in the same +unit as `+0x08` and the keyframe times** β€” a time interval. A strict ordering +holding 2 985 times with no exceptions is not a coincidence, and it rules out +the field being flags or a packed count. + +🟑 **Which interval is not settled.** A playback range, a loop region and an +active window all fit an ordered pair inside the animation, and nothing measured +here separates them. + +❔ **The alternative I have not ruled out** is the obvious one: that +`(high, low)` is simply the **minimum and maximum keyframe time** in the bundle, +which would make it a derived summary rather than an authored range. That is +testable and I did not test it β€” it needs the keyframe times parsed per bundle, +which the `ui_layout` reader can do. **First step**: for each bundle, compare +`(high, low)` against `(min, max)` of its keyframe times. If they match, the +field is a cached extent; if `high` is often 0 where the first keyframe is not, +it is authored. The 34.9 % of bundles with `high == 0` is suggestive of the +latter but is not evidence on its own. + +`+0x10` is untouched by this and remains ❔. \ No newline at end of file