re: Stage30-33 do not exist; AIParams is missing for exactly the tutorials

Probing pak entry names with name_hash across all 41 paks:
UnitGroup_SNN.tbl exists for exactly S01-S16 and S18-S29 = 28 stages.
S17 and S30-S33 are absent, so the 33-entry STAGENN_UNIT_MAX table is
headroom over a 28-stage game.  Control is built in: 28 hits from 33
probes shows the loop resolves entry names.

Corroboration that fell out of it: AIParams_SNN.tbl exists for S01-S16
and S24-S29 but is missing for exactly S18-S23 -- the six stages the
corpus identified as tutorials by a completely different route (their
lone guard is request_next() != 1).  Two unrelated methods, same six.

Stage_SNN.tbl probes find 0, which is expected: stagetbl.py documents
that the per-stage record is not name-addressed.

Drops the [phase+356]/[phase+360] consumer question: 243 non-stack lwz
reads from those offsets image-wide, and the only ISL-region hits are
the two writers plus two vtable calls.  Not a cheap static question.

Docs only; artefacts byte-identical.
This commit is contained in:
Sylpheed RE agent
2026-08-27 11:40:29 +00:00
parent e00ddd96fa
commit 491c66e742
2 changed files with 54 additions and 0 deletions

View File

@@ -692,6 +692,31 @@ unknown, what evidence exists, and what the first step would be. Move an item in
🟡 Still open: who CONSUMES `[phase+356]`/`[phase+360]`; whether `Stage30``Stage33`
exist; and the fallbacks behind the other 64 sections.
* ✅🟡 **(2026-08-27) `Stage30``Stage33` DO NOT EXIST — the 33-slot table is
headroom; and the `[phase+356]/[phase+360]` consumer is NOT findable by offset.
[structures/isl-condition-builtins](structures/isl-condition-builtins.md).**
✅ Probing pak entry names (`name_hash` — the right hash for *entry* names)
across all 41 paks: **`UnitGroup_SNN.tbl` exists for exactly S01S16 and
S18S29 = 28 stages**; S17 and S30S33 absent. The control is built in — 28
hits from 33 probes proves the loop resolves entry names. So the 33-entry
`STAGENN_UNIT_MAX` table is oversized headroom over a 28-stage game, and the
gate's `!= 16` skip of STAGE17 lines up with a stage that genuinely has no data
of any kind.
🔑 **An independent corroboration fell out of it.** `AIParams_SNN.tbl` exists
for S01S16 and S24S29 (22) — **missing for exactly S18S23**, precisely the
six stages the corpus identified as the TUTORIALS by a completely different
route (their only dominating condition is `request_next() != 1`). Tutorials
ship no AI parameters. Two unrelated methods, same six stages.
🟡 `Stage_SNN.tbl` probes find 0 — expected, not a failure: `stagetbl.py`
documents that the per-stage record is *not* name-addressed and must be found
by content.
🔴 **Dropping the `[phase+356]`/`[phase+360]` consumer.** Image-wide there are
**243 non-stack `lwz` reads from +356/+360**, across UI, sound, render and
script code — the offsets are far too common to attribute. Inside the ISL region
the only hits are the two writers plus two **vtable calls** (`0x82273400` slot
90, `0x82290ED8`). This needs type information the offset index does not carry;
it is not a cheap static question and should not be reopened as one.
## ✅✅ SOLVED — the mission freeze was a modal sign-in dialog (2026-08-26)
`XamShowSigninUI` opens a modal dialog and `xeXamDispatchDialog` blocks the

View File

@@ -424,6 +424,35 @@ word-hit might be real is settled: it is not a record key.
> ⇒ **`PLANE = 200` / `VESSEL = 20` for every stage** — now on a controlled test
> rather than a scan whose reader had never been checked.
### ✅ (2026-08-27) `Stage30``Stage33` do not exist — the 33-slot table is headroom
Probing the pak entry names (`name_hash`, the right hash for *entry* names) for
each stage-table family across all 41 paks:
| family | stages present |
|---|---|
| `stage\UnitGroup_S%02d.tbl` | **0116, 1829 — 28 stages** |
| `stage\AIParams_S%02d.tbl` | 0116, **2429 — 22 stages** |
| `stage\Stage_S%02d.tbl` | 0 — expected; `stagetbl.py` documents that the per-stage record is *not* name-addressed |
The control is built in: 28 hits out of 33 probes for `UnitGroup`, so the loop
resolves entry names correctly. **S17 and S30S33 are absent**, so the 33-entry
`STAGENN_UNIT_MAX` table is oversized headroom over a 28-stage game.
🔑 **An independent corroboration falls out of the second row.** `AIParams` is
missing for exactly **S18S23** — precisely the six stages this page identifies
as the tutorials by a completely different route (their only dominating
condition is `request_next() != 1`). Tutorials ship no AI parameters.
### 🟡 Who consumes `[phase+356]` / `[phase+360]`: not findable by offset
Image-wide there are **243 non-stack `lwz` reads from +356/+360**, spread across
the UI, sound, render and script subsystems — the offsets are far too common to
attribute. Inside the ISL region the only hits are the two writers in
`sub_82261F70` and two **vtable calls** (`0x82273400` slot 90, `0x82290ED8`).
Dropping this sub-item: it needs type information the offset index does not
carry.
🟡 Its neighbours belong to the same cluster: `builtin103` reads
`[phase+10156]` and `[phase+10152]` (9 and 7 writers), and a sibling vtable stub
clears `[phase+10152]`. The shape is an engine→script status trio, but that is a