# ✅ `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 = 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_P_` 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_P` 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. ## 🔎 Where `.prt` parts live — and why these five are the exception Followed up the next iteration. Read first: `ui-prm-primitives.md`, `ui-rat-layout.md`, `ui-screen-runtime.md` — they own the `.prt`/RATC/T8aD UI stack and describe element names *inside* bundles, not where the parts live. Artefact `../data/prt-parts.txt`, regenerator `tools/re-capture/prt_parts.py`. **A `.prt` IS a pak entry — under a LANGUAGE directory.** Of the **376** distinct `.prt` names referenced anywhere on the disc, **241 resolve** as an archive entry: 220 under `eng\` and `jpn\`, 38 under each of the other four. My earlier sweep had `eng\`…`esp\` in the list, so this is not the missing-prefix mistake again — the five simply are not there. | name | resolves under | |---|---| | `prbase.prt` | all six language dirs | | `palogo1.prt` | `eng\`, `jpn\` | | **all five `pgmsg_*.prt`** | **nothing, under any of 15 prefixes** | 🟡 **A partial lead, and its own refutation.** Four of the five have a same-stem **`_sub.rat` sub-bundle** inside every per-language *2D* pak (`pgmsg_start_sub.rat`, `_end_`, `_failed_`, `_restart_` — 6 archives each); **`pgmsg_update` has none**. Tempting as "the parts live as RATC sub-bundles", but the control kills the generalisation: **only 4 of 376 `.prt` stems have a `_sub.rat` at all** (the other 7 belong to `GP_BUNK`, `GP_SYSTEM`, `GP_MISSION_LOG`), and `prbase.prt` — which *does* ship as an entry — has no `_sub.rat`. So `_sub.rat` is not the container convention; it is something these four happen to have. **Still not settled**: where the five mission-banner parts actually are. What is now settled is that they are **not** pak entries while 241 of their siblings are, and that `pgmsg_update` is the odd one out even among them. ## 🟡 Not settled * Where the five `pgmsg_*.prt` screen parts live — see the section above for how far that got. * `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.