From fd113868bc7d8c0ded7a9668123d92c028ec52bc Mon Sep 17 00:00:00 2001 From: Sylpheed RE agent Date: Tue, 25 Aug 2026 21:01:55 +0000 Subject: [PATCH] re: decode the IXUD localised text -- 534 entries, six languages 534 IXUD entries across 36 paks, 94 distinct keys, 92 resolved by name. Content identified: mission objective/lose/hint panels, 91 bonus-objective banners, scripted radio, cutscene dialogue, the reactive combat-chatter pool (MSG_ADAN 23,236 fields, MSG_RHIN 21,196, ...), resupply barks, speaker labels and the hangar weapon Name/Desc/Condition. Verified independently: language\MissionDialog_local_string.tbl decodes to 600 fields with the trailer identity holding, giving Stage 02's real objectives -- phase 1 'Shoot down all invading enemy fighters / while watching out for attacks / on the ACROPOLIS', phase 2 'Protect the Admiral's ship the CALIBAN', phase 3 'Destroy the interstellar cruise missiles'. That matches the script exactly: the phase-1 condition polls three enemy squadrons and the escort's loss is the fail branch, and phase 2 is positional, which is why no kill count appears there. The .ssb symbol names (S02_P1_OBJECTIVE etc.) are NOT IXUD keys -- they are records in an IDXD map, message\MissionDialogMessage.tbl, whose positional fields list the lowercase per-line IXUD names; *_GRAPH holds a texture instead. Structure: one record per object (except the six 63-record hangar files), 624,440 named fields, 55% of them empty line slots, no control characters, the only escape a literal two-char \n in block-text tables, and records/fields in ascending key order so lookup is a binary search. '[OB]' turns out to be a HUD marker label in this text -- the same one the REMAINING OB work chased. Six languages confirmed D/E/F/I/J/S; J omits the trailing empty line slot in 78 of 86 objects. Two keys remain unresolved, byte-identical across all six paks (untranslated Japanese voice transcripts). Also corrects mission-objectives-text.md: SUBOBJ_009 does have text, and SUBOBJ_005 is two fields. --- docs/re/mission-objectives-text.md | 7 ++ docs/re/structures/ixud-localised-text.md | 92 +++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 docs/re/structures/ixud-localised-text.md diff --git a/docs/re/mission-objectives-text.md b/docs/re/mission-objectives-text.md index 405b26fb..49842cbd 100644 --- a/docs/re/mission-objectives-text.md +++ b/docs/re/mission-objectives-text.md @@ -1,3 +1,10 @@ +> ✅ **CORRECTED 2026-08-25** by decoding the IXUD containers directly — see +> [structures/ixud-localised-text](structures/ixud-localised-text.md). +> Two errors here: `SUBOBJ_009` **does** have text (`'You destroyed all enemy +> units!'` — all 91 of 91 sub-objectives have an `_Mes_L1` string), and +> `SUBOBJ_005` is **two** fields (`'You rescued'` + `'the ally destroyer!'`), +> which a single-line rendering drops. + # The mission script in plain English — and why phase 1 never completed Status: ✅ the localised string tables are decoded and readable; ✅ the phase diff --git a/docs/re/structures/ixud-localised-text.md b/docs/re/structures/ixud-localised-text.md new file mode 100644 index 00000000..b017e913 --- /dev/null +++ b/docs/re/structures/ixud-localised-text.md @@ -0,0 +1,92 @@ +# `IXUD` — the game's localised text, decoded + +Status: ✅ enumeration, structure and content; ✅ six languages confirmed; +🔴 two of 94 keys unresolved. + +The container and its hash are in [idxd-tag-hash](idxd-tag-hash.md). This is what +is **inside** them — the text the port needs. + +## ✅ Where they are + +**534 IXUD entries, 94 distinct TOC keys, 92 resolved by name.** + +| pak | entries | +|---|---| +| `GP_MAIN_GAME_{D,E,F,I,J,S}` | 86 each = **516** | +| `GP_CHALLENGE`, `GP_HANGAR_ARSENAL` | 6 each | +| `GP_DIALOG`, `GP_LEADERBOARD`, `GP_SAVE_LOAD` | 2 each | + +Two naming conventions: language paks use `language\` (the `` comes +from the `LocalStringFiles` records of the IDXD manifests in the same pak); +other paks use `\`, e.g. `eng\Strings.tbl`. + +## ✅ What the text is + +* `MissionDialog_local_string.tbl` — mission objective / lose / hint panels +* `SUBObjective_local_string.tbl` — 91 bonus-objective banners, two lines each +* `ScriptMessage_S` / `…guide` — scripted in-mission radio, and the tutorial voice +* `DemoMessage_S` — cutscene dialogue +* `PresetMessage_S` — the bulk: reactive combat chatter keyed by speaker + class (`MSG_ADAN` 23,236 fields, `MSG_RHIN` 21,196, `MSG_TCAF` 17,148, …) +* `Mes_hokyu_*` — resupply/docking barks (*hokyu* = 補給, resupply) +* `CharacterName_string.tbl` — 63 speaker labels +* the hangar `Strings.tbl` — per-weapon `Name` / `Desc` / `Condition` + +## ✅ Stage 02's objectives, verified here + +`S02_P1_OBJECTIVE` and friends — the five-name groups in the `.ssb` symbol +tables — are **not** IXUD keys. They are record names in an **IDXD** map, +`message\MissionDialogMessage.tbl`, whose positional fields list the *lowercase* +per-line IXUD names. `*_GRAPH` is the odd one: a single named field holding a +texture, `pgmsg_stg02_1.t32`. + +Decoded independently here (600 fields, trailer identity holds): + +``` +S02_P1_Objective_00 'Shoot down all invading enemy fighters' +S02_P1_Objective_01 'while watching out for attacks' +S02_P1_Objective_02 'on the ACROPOLIS.' +S02_P2_Objective_00 "Protect the Admiral's ship the CALIBAN" +S02_P3_Objective_00 'Destroy the interstellar cruise missiles' +``` + +🔑 **Phase 1's objective is "shoot down all invading enemy fighters … while +watching out for attacks on the ACROPOLIS"** — which matches the script exactly: +the condition polls three enemy squadrons, and the escort's loss is the fail +branch. And phase 2's is *"protect the CALIBAN until it enters the safe zone"* — +positional, which is why no kill count appears there. + +## ✅ Structure + +* 528 of 534 objects hold **one** record; the six hangar files hold 63 each. +* **624,440 named fields, 48 positional** (only the hangar `CATEGORY_DESC`). +* A logical message is split across **fields**, not inside a string: + `__` with `` = `00`–`03`. **55 % of all fields are the + empty string** — unused line slots. +* **No control characters anywhere.** The only escape is a literal two-character + `\n`, and only in block-text tables (hangar, challenge, dialog). Per-line + mission tables never use it. `%s` appears 18 times, all in the hangar. +* `[…]` is display text, not markup — the HUD marker labels `[HO]`, `[GA]`, + `[TA]`, `[OB]`, `[WP]`. **That is where `[OB]` comes from**, the marker the + earlier `REMAINING OB` work chased. +* Records and fields are stored in **ascending key/tag order**, so lookup is a + binary search — no roster scan needed. + +## ✅ Six languages: D/E/F/I/J/S = German, English, French, Italian, Japanese, Spanish + +Same TOC key, same record key, same field tags; only values differ. Verified on +`S02_P1_Objective_00`: English *"Shoot down all invading enemy fighters"*, +Japanese *「母艦《アクロポリス》への攻撃に」*. + +D/E/F/I/S share identical field name-sets; **J differs in 78 of 86 objects** +because it omits the trailing empty line slot. + +## 🔴 Not resolved + +* **Two keys** — `0x298964b2` (981 fields) and `0xee019650` (135) — appear in + all six language paks and are in no manifest. They decode fine and are + **byte-identical across all six**, i.e. Japanese-only `MSG_VOICE_*` + transcripts that were never localised. Their names are unknown. +* `GP_DIALOG`'s `eng` and `jpn` objects are byte-identical Japanese, and + `GP_SAVE_LOAD`'s "English" table is half Japanese — shipped untranslated, not + a decoding error.