re: the disc's stage numbers, and the player's craft per stage

The corpus knew '28 stages' and 'six tutorials with no AIParams'.  It
did not know the NUMBERS, and they are not 1..28.  Hashing
stage\UnitGroup_S%02d.tbl for N=0..39 against GP_MAIN_GAME_E.pak:
1-16 and 18-29 ship, 17 does not -- 28 files -- and the six with no
AIParams_SNN.tbl are exactly 18-23.  So S01-S16 story, S17 absent,
S18-S23 tutorials, S24-S29 story: 22 + 6.

eng\GP_HANGAR_ARSENAL_3D.tbl's ResourceID record keys a player-craft
mesh by stage: Unit_St1_6 -> rou_f001 (DeltaSaber T), Unit_St7_16 ->
rou_f002 (W), plus six further fields tagged with the raw numbers
24,25,26,27,28,29 -> rou_f002 x4, rou_f004 (DeltaSaber A) at 28,
rou_f002.  The bare tags are the last six story-stage numbers.  Control
in the same record: tag_hash(name) == tag for 11/11 named fields, so
those six genuinely carry no name.

Cross-check from a different file: grouping the Arsenal pak's 168
stage-scoped entries by which _Player craft their loadout mounts gives
f001 = 6, f002 = 15, f004 = 1, tutorials 5+1 = 6, and every number
closes against ResourceID -- 6 = Unit_St1_6; 15 = Unit_St7_16 (10) plus
tags 24,25,26,27,29 (5); 1 = tag 28; 6+15+1+6 = 28.

So the player flies the DeltaSaber A in exactly one mission, S28, and
the DeltaSaber T only for the first six.

Not settled: the Arsenal entry filenames, so which of the 168 is S24 vs
S25 is constrained but not pinned.

New structure doc, artefact and regenerator; the other five artefacts
regenerate byte-identical.
This commit is contained in:
Sylpheed RE agent
2026-08-27 13:18:42 +00:00
parent 2b9709eaa0
commit 28a59d839f
5 changed files with 189 additions and 0 deletions

View File

@@ -0,0 +1,74 @@
# ✅✅ The disc's stage NUMBERING, and which craft the player flies in each
The corpus has known "the disc has 28 stages" and "the six tutorials have no
`AIParams`" for a while. **It did not know the stage NUMBERS.** They are not
1…28:
```
S01 … S16 story (16)
S17 ABSENT
S18 … S23 the tutorials (6) -- exactly the six with no AIParams_SNN.tbl
S24 … S29 story (6)
== 28 shipped, 22 of them story
```
Measured by hashing `stage\UnitGroup_S%02d.tbl` and `stage\AIParams_S%02d.tbl`
for N = 0…39 against `GP_MAIN_GAME_E.pak`. Artefact `../data/stage-numbering.txt`,
regenerator `tools/re-capture/stage_numbering.py`.
## The player's craft, per stage
`eng\GP_HANGAR_ARSENAL_3D.tbl` holds a `ResourceID` record whose `Unit_St*`
fields key a player-craft mesh by stage — and whose **remaining entries are
tagged with the raw stage NUMBER instead of a hashed name**:
| tag | field name | mesh |
|---|---|---|
| `tag_hash("Unit_St1_6")` | `Unit_St1_6` | `rou_f001` — DeltaSaber **T** |
| `tag_hash("Unit_St7_16")` | `Unit_St7_16` | `rou_f002` — DeltaSaber **W** |
| **24** | — | `rou_f002` |
| **25** | — | `rou_f002` |
| **26** | — | `rou_f002` |
| **27** | — | `rou_f002` |
| **28** | — | **`rou_f004` — DeltaSaber A** |
| **29** | — | `rou_f002` |
🔑 The six bare tags are `24 … 29`, and the disc's last six story stages are
**S24 … S29**. That is not a coincidence available to a guess: the numbering was
recovered independently, from the shipped filenames. **Control in the same
record: `tag_hash(name) == tag` for 11/11 of the named fields**, so the reader is
right and these six genuinely carry no name.
## 🧪 The cross-check — the Arsenal entries say the same thing
[The Arsenal pak is stage-scoped](hangar-loadout-system.md): 168 entries =
28 stages × 6 languages. Grouping them by which `_Player` craft their loadout
mounts:
| stages | player craft |
|---:|---|
| **6** | `UN_f001_TCAF_DeltaSaber_T_Player` |
| **15** | `UN_f002_TCAF_DeltaSaber_W_Player` |
| **1** | `UN_f004_TCAF_DeltaSaber_A_Player` |
| 5 + 1 | `…_T_Player_Ttrl1` / `_Ttrl2`**6 tutorials** |
Every number closes against `ResourceID`, from a different file:
* **f001 = 6** ⇔ `Unit_St1_6`.
* **f002 = 15** ⇔ `Unit_St7_16` (10 stages) **+** tags 24, 25, 26, 27, 29 (5) = 15.
* **f004 = 1** ⇔ tag 28 alone.
* **tutorials = 5 + 1 = 6** ⇔ the six stages with no `AIParams`.
* 6 + 15 + 1 + 6 = **28**.
🔑 So **the player flies the DeltaSaber A in exactly one mission — S28** — and
the DeltaSaber T only for the first six.
## 🟡 Not settled
* The Arsenal entry FILENAMES are still unrecovered, so *which* of the 168
entries is S24 vs S25 is not directly readable — the craft grouping constrains
it but does not pin it. `name_hash` probing over 8 templates × 40 indices × 6
languages resolved 0 (controls `<lang>\weapon.tbl`, `<lang>\strings.tbl`,
`<lang>\GP_HANGAR_ARSENAL_3D.tbl` all resolve, so the method works).
* Why the numbering skips S17 and parks the tutorials at S18S23 is a production
fact this cannot reach.