The previous commit announced message\MissionDialogMessage.tbl as a find. structures/ixud-localised-text.md OWNS it and already says S02_P1_OBJECTIVE and friends are record names in an IDXD map, message\MissionDialogMessage.tbl, whose positional fields list the lowercase per-line IXUD names -- and that *_GRAPH is the odd one, a single named field holding a texture. I grepped the manifest doc and not the text doc. Third overclaim in four days; the rule is now to grep the doc that owns the DATA, not only the doc that owns the FILE. Worse, the headline negative was wrong. MissionDialog_local_string.tbl DOES resolve -- as language\MissionDialog_local_string.tbl, IXUD, in all six GP_MAIN_GAME_* paks. My 33 prefixes omitted language\, which is precisely the convention ixud-localised-text.md records for language paks. A prefix sweep is only as good as its prefix list, and the list should come from the corpus. 'LOSE has exactly one entry' was wrong too. Per kind: HINT_PAUSE 4, HINT 3, LOSE 4, OBJECTIVE 4 positional fields, and GRAPH 1 NAMED field holding the .t32. The single-field bucket was GRAPH, not LOSE. What survives as new: the 11 non-MISSION field values read as a block; the GP_TEST and TEXTS sibling records; the per-stage phase census; and the five pgmsg_*.prt resolving nowhere under 34 prefixes x 41 archives, now with two working controls in the same sweep. Artefact 8 insertions / 3 deletions, every deleted line replaced by its corrected form; the other five regenerate byte-identical.
5.1 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).
❌ CORRECTION (2026-08-27, same day) — the dialogue table was ALREADY KNOWN,
and one "not found" was a FALSE NEGATIVE
This page announced
message\MissionDialogMessage.tblas a find. ixud-localised-text owns it and already states thatS02_P1_OBJECTIVEand friends "are record names in an IDXD map,message\MissionDialogMessage.tbl, whose positional fields list the lowercase per-line IXUD names", and that "*_GRAPHis the odd one: a single named field holding a texture,pgmsg_stg02_1.t32". I grepped the manifest doc and not the text doc. Third overclaim in four days.Worse, the sweep's headline negative was wrong.
MissionDialog_local_string.tblDOES resolve — aslanguage\MissionDialog_local_string.tbl, IXUD, in all sixGP_MAIN_GAME_*paks. My 33 prefixes omittedlanguage\, which is exactly the conventionixud-localised-text.mdrecords for language paks. A prefix sweep is only as good as its prefix list, and the list should have come from the corpus.Also wrong here: "
LOSEhas exactly one entry". Per kind the shapes areHINT_PAUSE4,HINT3,LOSE4,OBJECTIVE4 positional fields, andGRAPH1 NAMED field — the.t32texture. The single-field bucket wasGRAPH, notLOSE.What survives as new: the 11 field VALUES read as a block, the
GP_TESTandTEXTSsibling records, the per-stage phase census, and the fivepgmsg_*.prtstill resolving nowhere.
message\MissionDialogMessage.tbl — keyed by stage AND phase
Probed 7 values × 34 prefixes × 41 archives. Two resolve:
message\MissionDialogMessage.tbl (IDXD) and
language\MissionDialog_local_string.tbl (IXUD), each 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 |
3 | 🟡 in-mission hint |
OBJECTIVE |
4 | 🟡 the objective text |
LOSE |
4 | 🟡 the failure lines |
GRAPH |
1 NAMED | ✅ a .t32 texture — S10_P1_GRAPH → pgmsg_stg10_1.t32 |
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.
🟡 Five values still do not resolve — with two working controls
All five pgmsg_*.prt are not a pak entry under any of the 34 prefixes
tried. Two controls sit in the same sweep and both resolve in 6 archives:
message\MissionDialogMessage.tbl and
language\MissionDialog_local_string.tbl — the second only after the
correction above added language\.
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 live. 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.