re: Stage\script.tbl's 11 non-MISSION fields, and the mission dialogue table

structures/mission-script-ssb.md owns this manifest and names its 40
fields but never read the 11 that are not MISSION<n> = StageNN.ssb.
They are DIALOG_MESSAGE, DIALOG_LOCAL_STRING, FONT (+size), TEXT_POS,
TEXT_LINES and the five pgmsg_*.prt.  Two sibling records were also
unread: GP_TEST (PATH = dat\GP_TEST\, a debug archive not on the disc)
and TEXTS (a second text style).

Probed 7 values x 33 prefixes x 41 archives.  One resolves:
message\MissionDialogMessage.tbl, in all six GP_MAIN_GAME_* paks --
200 records, 25280 bytes, every name S<NN>_P<n>_<KIND> with five kinds
40 each (HINT_PAUSE, HINT, OBJECTIVE, GRAPH, LOSE), fields positional
and tagged 0..3, each value a message key.  An index from (stage,
phase, kind) to the localised strings, on the same S<NN>_P<n> keying
the ISL corpus already uses.

Control: the 40 stage-phases span stages 1-16 and 24-29 -- a subset of
the 28 shipped, and the six with no hints are exactly 18-23, the
tutorials.  A fifth independent route to the story/tutorial split, and
it gives the phase count per stage.

The other six do not resolve, with the control in the same sweep:
MissionDialog_local_string.tbl and all five pgmsg_*.prt are not a pak
entry under any of the 33 prefixes, while
message\MissionDialogMessage.tbl and Stage\script.tbl both resolve in
6 archives.

name_hash is CASE-INSENSITIVE (message\ == Message\); tag_hash is not.

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:37:31 +00:00
parent ccdc226022
commit acbcd8d75c
5 changed files with 248 additions and 0 deletions

View File

@@ -0,0 +1,77 @@
# ✅ `Stage\script.tbl` — the 11 non-`MISSION` fields, and where they point
[mission-script-ssb](mission-script-ssb.md) owns this manifest and names its
40 fields; **it never read the 11 that are not `MISSION<n> = StageNN.ssb`.**
This does, and follows each value into the archives. Artefact
`../data/script-manifest.txt`, regenerator `tools/re-capture/script_manifest.py`.
```
DIALOG_MESSAGE MissionDialogMessage.tbl
DIALOG_LOCAL_STRING MissionDialog_local_string.tbl
FONT dat\fonts.pak+HGRGE00.TTF FONT_SIZE 15
TEXT_POS 128,128,16 TEXT_LINES 30
MISSION_START_PRT pgmsg_start.prt MISSION_END_PRT pgmsg_end.prt
MISSION_UPDATE_PRT pgmsg_update.prt MISSION_FAILED_PRT pgmsg_failed.prt
MISSION_RESTART_PRT pgmsg_restart.prt
```
Two sibling records in the same file, also unread until now:
`GP_TEST` (`PATH = dat\GP_TEST\` — a debug archive that is **not on the disc**)
and `TEXTS` (`FONT_SIZE 33`, `TEXT_LINES 3`, `TEXT_POS 296,565,39` — a second,
larger text style beside `SCRIPTS`'s own 15/30/`128,128,16`).
## 🔑 `message\MissionDialogMessage.tbl` — found, and it is keyed by stage AND phase
Probed 7 values × 33 prefixes × 41 archives. **One resolves**:
`message\MissionDialogMessage.tbl`, in all six `GP_MAIN_GAME_*` paks.
**200 records, 25 280 bytes**, every name of the form
`S<NN>_P<n>_<KIND>` with five kinds, 40 each:
| kind | fields | reading |
|---|---:|---|
| `HINT_PAUSE` | 4 | the pause menu's hint lines |
| `HINT` | 4 | 🟡 in-mission hint |
| `OBJECTIVE` | 4 | 🟡 the objective text |
| `GRAPH` | 3 | 🟡 |
| `LOSE` | 1 | 🟡 the failure line |
The fields are **positional, tagged 0…3**, and each value is a message key:
`S10_P1_HINT_PAUSE``S10_P1_Hint_Pause_00 … _03`. So this is an index from
(stage, phase, kind) to the localised strings — the same `S<NN>_P<n>` keying the
ISL corpus uses for [mission phases](isl-phase-guards.md).
🧪 **Control — the 22 stages are exactly the STORY stages.** The 40 stage-phases
span stages **116 and 2429**; that is a subset of the 28 shipped, and the six
with no hints at all are **1823**, the tutorials
([stage-numbering-and-player-craft](stage-numbering-and-player-craft.md)). A
fifth independent route to the same story/tutorial split, and it also gives the
**phase count per stage** — 1 to 3, e.g. S02 and S03 have 3, S10 and S13 have 1.
## 🟡 The other six values do not resolve — with a working control
`MissionDialog_local_string.tbl` and all five `pgmsg_*.prt` are **not a pak
entry** under any of the 33 prefixes tried (`message\`, `Stage\`, `2d\`, `ui\`,
`prt\`, six language dirs, and the language dirs under `Stage\` and `message\`).
The control is in the same loop and in the same sweep:
`message\MissionDialogMessage.tbl` **does** resolve, and so does
`Stage\script.tbl` itself, both in 6 archives.
This is the same wall [mission-phase-advance](../mission-phase-advance.md) hit
for the manifest's KEYS — but that sweep probed `MISSION1..33` and
`MISSION_*_PRT` as names. This one probes the **values**, which had never been
read, and closes them the same way.
## ⚠️ `name_hash` is CASE-INSENSITIVE
`name_hash("message\\a.tbl") == name_hash("Message\\A.TBL")`. `tag_hash` is
**not** (`tag_hash("Abc") != tag_hash("abc")`). Already noted for archive lookup
in [sound-pak-contents](sound-pak-contents.md); worth repeating because it
doubles the apparent hit count of any prefix sweep.
## 🟡 Not settled
* Where the five `pgmsg_*.prt` screen parts and
`MissionDialog_local_string.tbl` actually live.
* What `GRAPH` selects, and why `LOSE` carries exactly one entry.
* `dat\GP_TEST\` is named by the manifest and is not on the disc — a debug path
left in, not a missing asset. Not chased.