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.
3.7 KiB
✅ Stage\script.tbl — the 11 non-MISSION fields, and where they point
mission-script-ssb 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.
🧪 Control — the 22 stages are exactly the STORY stages. The 40 stage-phases span stages 1–16 and 24–29; that is a subset of the 28 shipped, and the six with no hints at all are 18–23, the tutorials (stage-numbering-and-player-craft). 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 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; worth repeating because it
doubles the apparent hit count of any prefix sweep.
🟡 Not settled
- Where the five
pgmsg_*.prtscreen parts andMissionDialog_local_string.tblactually live. - What
GRAPHselects, and whyLOSEcarries 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.