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:
@@ -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
|
||||
|
||||
92
docs/re/structures/ixud-localised-text.md
Normal file
92
docs/re/structures/ixud-localised-text.md
Normal 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.
|
||||
Reference in New Issue
Block a user