From 0570a0647db7992b2725231c3f908e3848fc11b1 Mon Sep 17 00:00:00 2001 From: "Claude (auto-RE)" Date: Tue, 11 Aug 2026 20:50:06 +0000 Subject: [PATCH] re: SHAB is the per-stage record table -- record 0 is Stage 01, and c is its best time EXTRAS -> MISSION SELECT renders per-stage records and they match the table. Stage 01 shows "High Score 4612 P EASY / Best Time 05:24.77 EASY" while SHAB[0] is (2, 4101, 324773, FILETIME): 324773 ms IS 5m24.773s, the displayed best time. Sixteen records, sixteen story stages -> the table is indexed by stage, and record 0 is Stage 01, the only stage this save has cleared. a = 2 difficulty of the record (both entries tagged EASY) b = 4101 NOT the displayed high score 4612; equals GHAD +24/+28 c = 324773 best clear time in ms -- confirmed against the screen d,e FILETIME This also explains the probe that filled SHAB[1] and changed nothing: the table holds stage RECORDS, not progress, and Stage 02 has never been cleared so its record is legitimately empty. Promotes the earlier "per-stage result record" guess to confirmed for the layout. Route: title -> EXTRAS -> MISSION SELECT. Only cleared stages are selectable (16 d-pad presses never left Stage 01) and the screen has its own difficulty selector (Y). Co-Authored-By: Claude Opus 5 (1M context) --- docs/re/structures/savegame-format.md | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/docs/re/structures/savegame-format.md b/docs/re/structures/savegame-format.md index 1d99da84..c1122386 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