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.
This commit is contained in:
Sylpheed RE agent
2026-08-25 21:01:55 +00:00
parent dc2054f0be
commit 34c99a1568
2 changed files with 99 additions and 0 deletions

View File

@@ -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

View File

@@ -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\<file>` (the `<file>` comes
from the `LocalStringFiles` records of the IDXD manifests in the same pak);
other paks use `<lang3>\<file>`, 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<NN>` / `…guide` — scripted in-mission radio, and the tutorial voice
* `DemoMessage_S<NN>` — cutscene dialogue
* `PresetMessage_S<NN>` — 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:
`<ID>_<variant>_<line>` with `<line>` = `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.