re: find the mission wave data — stage records and the UnitGroup squadron roster

Sweeping the 811 unnamed IDXD objects in GP_MAIN_GAME_E.pak by schema turned up
schema 3c9ae32e: the per-stage definition record. 23 of them, one per stage,
each naming its background, resource package, collision set, message set,
nameplates, MapMesh/MapPath and EnumerateSquadron = UnitGroup_S<NN>.tbl.

That resolves two open threads at once:

  - MapPath = test.rgn hashes to 0x3506e972, a REGN object in MiscBin.pak, and
    MapMesh = test.col to 0x2cf7eb47, an MCOL object. REGN is a stage's map
    path data; MCOL is its collision mesh.

  - stage\UnitGroup_S02.tbl (0x019fd129, in all six language paks) is the
    Stage 02 squadron roster: 112 records, 112 squadron IDs, and a field
    vocabulary of FormationID / AIID / SideID / Count / DisableInterval, plus
    the unit model (UN_e010_ADAN_Attacker_S and friends, which match the XBG7
    mesh names we already decode), the MessageSet and the pilot character.

DisableInterval is the first direct evidence of the arrival-timing knob, which
is what the user's reframing predicted: the mission has a schedule with
parameters, not a fixed roster.

Container layout is only partly read. The 112x16 entry array was confirmed by
its boundary — keys increase for exactly 112 entries and break at 0x708, where
the next section header sits — not assumed. pak dump mislabels this file's
first key as its schema.

Refuted and recorded: the 16-byte record key is not the squadron ID's name
hash. name_hash("TCN001") = 0xd639f1a4 but the keys start 0x659aff47; 0 of 112
match.

Still open: the per-record payload fields, the meaning of the key, where the
interval values actually live, and the missing S17-S23 stage records.
This commit is contained in:
Sylpheed RE agent
2026-08-24 10:52:35 +00:00
parent bd9e12c091
commit 7482142abf
3 changed files with 169 additions and 5 deletions

View File

@@ -267,12 +267,26 @@ search cannot find a *schedule*.
on-disc keys are not the source paths.
* 🔴 **`STAGES = Static.slb` is a false lead.** It is a field of the *sound*
table; `.slb` is an XACT sound bank ([`structures/sound-slb.md`](structures/sound-slb.md)).
* **Not yet searched:** the ~800 unnamed objects in `GP_MAIN_GAME_<lang>.pak`,
and the executable itself.
* **FOUND — it is the `GP_MAIN_GAME_<lang>.pak` unnamed objects.**
Sweeping the 811 unnamed entries by schema turned up **schema `3c9ae32e`, the
per-stage definition record**: one per stage (`Stage_S01.xpr``Stage_S29.xpr`),
naming that stage's background, resource package, collision set, message set,
nameplates, `MapMesh`/`MapPath`, and — the point — its
**`EnumerateSquadron = UnitGroup_S<NN>.tbl`**.
`stage\UnitGroup_S02.tbl` (`0x019fd129`) is the Stage 02 roster: **112 records**,
112 squadron IDs (`TCN001`, `ADN101`, `ADT102`, …), and a field vocabulary of
`FormationID` / `AIID` / `SideID` / `Count` / **`DisableInterval`** plus the unit
model (`UN_e010_ADAN_Attacker_S`, matching our XBG7 names), the `MessageSet_*`,
and the pilot character. `DisableInterval` is the first direct evidence of the
timing knob. Same pass also settled `MapPath = test.rgn` → the `REGN` objects.
See [`structures/stage-definition-table.md`](structures/stage-definition-table.md).
🔴 Refuted along the way: the 16-byte record key is **not** the squadron
ID's name hash (0 of 112).
**First step:** dump the smallest `REGN` object's four sections (counts
`8, 6, 18`) and the three unnamed `DefTables` schemas — both are pure static
work, and either could carry per-map trigger or spawn records.
**First step (next):** read the `UnitGroup` per-record payload — three u32s per
entry — and find where the interval *values* live (the file's second section,
`Formation_*.tbl`, or `EnumSquadron_Test.tbl`). Also: S17S23 have no stage
record in `GP_MAIN_GAME_E.pak`; find where they are.
## The dynamic-RE state is not in git, and it was gone