diff --git a/docs/re/BACKLOG.md b/docs/re/BACKLOG.md index 6a71e208..7fdc8f6a 100644 --- a/docs/re/BACKLOG.md +++ b/docs/re/BACKLOG.md @@ -827,6 +827,35 @@ unknown, what evidence exists, and what the first step would be. Move an item in field; the stat keys in records not opened here (`MegaTons`, `BulletLimit`, `CrewCount`, `HP_CLASS`); why the roster lists 59 of 131. +* ❌ **(2026-08-27) CORRECTION — the mission dialogue table was ALREADY IN THE + CORPUS, and my headline negative was a FALSE NEGATIVE.** + [structures/mission-script-manifest](structures/mission-script-manifest.md), + artefact `data/script-manifest.txt` (8 insertions, 3 deletions — every deleted + line replaced by its corrected form). + ❌ The entry below 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, `pgmsg_stg02_1.t32`". I grepped the manifest doc and not the + text doc. **Third overclaim in four days** — the rule is now: grep the doc that + owns the DATA, not only the doc that owns the FILE. + ❌ **`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` (`S10_P1_GRAPH` -> `pgmsg_stg10_1.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` (`PATH = dat\GP_TEST\`, a debug archive not on the disc) and + `TEXTS` sibling records; the per-stage phase census (40 stage-phases over the + 22 story stages, 1-3 phases each, the six with none being 18-23); and the five + `pgmsg_*.prt` resolving nowhere under 34 prefixes x 41 archives, now with TWO + working controls in the same sweep. + * ✅ **(2026-08-27) `Stage\script.tbl`'s 11 NON-`MISSION` FIELDS, READ AT LAST — and one of them lands on the mission DIALOGUE table.** [structures/mission-script-manifest](structures/mission-script-manifest.md), diff --git a/docs/re/data/script-manifest.txt b/docs/re/data/script-manifest.txt index 88bf3eae..1023be16 100644 --- a/docs/re/data/script-manifest.txt +++ b/docs/re/data/script-manifest.txt @@ -24,9 +24,9 @@ TEXT_LINES '30' TEXT_POS '128,128,16' -## do those values resolve as pak entries? (33 prefixes x 41 archives) +## do those values resolve as pak entries? (34 prefixes x 41 archives) MissionDialogMessage.tbl FOUND as message\MissionDialogMessage.tbl in 6 archives - MissionDialog_local_string.tbl not found + MissionDialog_local_string.tbl FOUND as language\MissionDialog_local_string.tbl in 6 archives pgmsg_start.prt not found pgmsg_end.prt not found pgmsg_update.prt not found @@ -37,7 +37,12 @@ ## message\MissionDialogMessage.tbl -- 200 records, 25280 bytes name families S_P_: {'HINT_PAUSE': 40, 'HINT': 40, 'LOSE': 40, 'GRAPH': 40, 'OBJECTIVE': 40} - field counts: {4: 120, 3: 40, 1: 40} + per kind (total fields, NAMED fields) -> count: + GRAPH {(1, 1): 40} + HINT {(3, 0): 40} + HINT_PAUSE {(4, 0): 40} + LOSE {(4, 0): 40} + OBJECTIVE {(4, 0): 40} stages present (22): [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 24, 25, 26, 27, 28, 29] phases per stage: {1: 2, 2: 3, 3: 3, 4: 2, 5: 2, 6: 3, 7: 2, 8: 2, 9: 3, 10: 1, 11: 2, 12: 2, 13: 1, 14: 2, 15: 2, 16: 2, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1} CONTROL subset of the 28 shipped stages: True ; shipped with NO hints: [18, 19, 20, 21, 22, 23] diff --git a/docs/re/structures/mission-script-manifest.md b/docs/re/structures/mission-script-manifest.md index 8ba48236..69161446 100644 --- a/docs/re/structures/mission-script-manifest.md +++ b/docs/re/structures/mission-script-manifest.md @@ -20,20 +20,50 @@ Two sibling records in the same file, also unread until now: 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 +> ## ❌ 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. -Probed 7 values × 33 prefixes × 41 archives. **One resolves**: -`message\MissionDialogMessage.tbl`, in all six `GP_MAIN_GAME_*` paks. +## `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` | 4 | 🟡 in-mission hint | +| `HINT` | 3 | 🟡 in-mission hint | | `OBJECTIVE` | 4 | 🟡 the objective text | -| `GRAPH` | 3 | 🟡 | -| `LOSE` | 1 | 🟡 the failure line | +| `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 @@ -47,14 +77,13 @@ with no hints at all are **18–23**, the tutorials 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 +## 🟡 Five values still do not resolve — with two working controls -`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. +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 @@ -70,8 +99,6 @@ 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. +* 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. diff --git a/tools/re-capture/script_manifest.py b/tools/re-capture/script_manifest.py index 45a271f5..4fd6912a 100644 --- a/tools/re-capture/script_manifest.py +++ b/tools/re-capture/script_manifest.py @@ -39,7 +39,7 @@ def main(): targets = ['MissionDialogMessage.tbl', 'MissionDialog_local_string.tbl', 'pgmsg_start.prt', 'pgmsg_end.prt', 'pgmsg_update.prt', 'pgmsg_failed.prt', 'pgmsg_restart.prt'] - pre = ['', 'Stage\\', 'stage\\', 'message\\', 'msg\\', 'dialog\\', 'script\\', + pre = ['', 'Stage\\', 'stage\\', 'message\\', 'language\\', 'msg\\', 'dialog\\', 'script\\', 'SCRIPTS\\', 'GP_SCRIPT\\', '2d\\', 'ui\\', 'prt\\', 'view\\', 'dat\\', 'hidden\\'] for l in ['eng', 'jpn', 'fra', 'deu', 'ita', 'esp']: pre += [l + '\\', 'Stage\\' + l + '\\', 'message\\' + l + '\\'] @@ -70,7 +70,15 @@ def main(): nf[len(r['fields'])] += 1 print("\n## message\\MissionDialogMessage.tbl -- %d records, %d bytes" % (len(dr), len(b))) print(" name families S_P_: %s" % dict(fam)) - print(" field counts: %s" % dict(nf)) + shape = collections.defaultdict(collections.Counter) + for r in dr: + m = pat.match(r['squadron']) + if m: + shape[m.group(3)][(len(r['fields']), + sum(1 for t, n, v in r['fields'] if n is not None))] += 1 + print(" per kind (total fields, NAMED fields) -> count:") + for k in sorted(shape): + print(" %-12s %s" % (k, dict(shape[k]))) print(" stages present (%d): %s" % (len(st), sorted(st))) print(" phases per stage: %s" % {k: len(v) for k, v in sorted(st.items())}) H = {h for h, _ in pak_entries(mg)}