diff --git a/docs/re/captures/mission-select-stage01-record.png b/docs/re/captures/mission-select-stage01-record.png new file mode 100644 index 0000000..77d027c Binary files /dev/null and b/docs/re/captures/mission-select-stage01-record.png differ diff --git a/docs/re/structures/savegame-format.md b/docs/re/structures/savegame-format.md index 1d99da8..c112238 100644 --- a/docs/re/structures/savegame-format.md +++ b/docs/re/structures/savegame-format.md @@ -248,6 +248,37 @@ the Details panel, which makes **a per-stage result record** the obvious ๐ŸŸก re (one stage finished โ†’ one record filled). Falsifiable the moment a second stage is cleared: `SHAB[1]` should fill. +## The `SHAB` table is the per-stage record table โ€” record 0 is Stage 01 โœ… + +**2026-08-11.** `EXTRAS โ†’ MISSION SELECT` renders per-stage records, and they +match the table. For Stage 01 the screen shows + +> `High Score 4612 P EASY` ยท `Best Time 05:24.77 EASY` + +and `SHAB[0]` is `(a=2, b=4101, c=324773, FILETIME 2026-07-23 20:07:23)`, where +**`c = 324773 ms = 5 m 24.773 s`** โ€” exactly the displayed best time. With +sixteen records and sixteen story stages (see the `.rdata` section above), the +table is **indexed by stage**, and record 0 is Stage 01 โ€” the only stage this +save has cleared. + +| field | record 0 | reading | +|---|---|---| +| `a` | 2 | ๐ŸŸก the **difficulty of the record** โ€” the screen tags both entries `EASY`, and 2 is the only value present | +| `b` | 4101 | โ” **not** the displayed high score (4612). It equals GHAD `+24`/`+28`, so it is a points figure, not the score with bonus | +| `c` | **324773** | โœ… **best clear time, ms** โ€” `05:24.77` on screen | +| `d,e` | FILETIME | when the record was set | + +This also explains a probe that looked like a dead end: filling `SHAB[1]` changed +nothing on the save screen because the table holds **stage records, not +progress** โ€” and Stage 02, where this save sits, has never been cleared, so its +record is legitimately empty. It promotes the earlier ๐ŸŸก "per-stage result +record" guess to โœ… for the layout, with the time field named exactly. + +Evidence: [`captures/mission-select-stage01-record.png`](../captures/mission-select-stage01-record.png). +The route is `EXTRAS โ†’ MISSION SELECT` from the title menu; only cleared stages +are selectable (16 d-pad presses never left Stage 01), and the screen carries its +own **difficulty selector** (`Y`). + ## What this does and does not unlock It settles the format. It does **not** yet settle which field is stage-unlock