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.
105 lines
5.1 KiB
Markdown
105 lines
5.1 KiB
Markdown
# ✅ `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`).
|
||
|
||
> ## ❌ 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.tbl` as a find.
|
||
> **[ixud-localised-text](ixud-localised-text.md) owns it** and already states
|
||
> that `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, `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.tbl` DOES resolve — as
|
||
> `language\MissionDialog_local_string.tbl`, IXUD, in all six
|
||
> `GP_MAIN_GAME_*` paks.** My 33 prefixes omitted `language\`, which is exactly
|
||
> 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 have come from
|
||
> the corpus.
|
||
>
|
||
> Also wrong here: "`LOSE` has exactly one entry". Per kind the shapes are
|
||
> `HINT_PAUSE` 4, `HINT` 3, `LOSE` 4, `OBJECTIVE` 4 positional fields, and
|
||
> **`GRAPH` 1 NAMED field** — the `.t32` texture. The single-field bucket was
|
||
> `GRAPH`, not `LOSE`.
|
||
>
|
||
> **What survives as new**: the 11 field VALUES read as a block, the `GP_TEST`
|
||
> and `TEXTS` sibling records, the per-stage phase census, and the five
|
||
> `pgmsg_*.prt` still 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](isl-phase-guards.md).
|
||
|
||
🧪 **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](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.
|
||
|
||
## 🟡 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](../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 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.
|