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.
4.3 KiB
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. 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 panelsSUBObjective_local_string.tbl— 91 bonus-objective banners, two lines eachScriptMessage_S<NN>/…guide— scripted in-mission radio, and the tutorial voiceDemoMessage_S<NN>— cutscene dialoguePresetMessage_S<NN>— the bulk: reactive combat chatter keyed by speaker class (MSG_ADAN23,236 fields,MSG_RHIN21,196,MSG_TCAF17,148, …)Mes_hokyu_*— resupply/docking barks (hokyu = 補給, resupply)CharacterName_string.tbl— 63 speaker labels- the hangar
Strings.tbl— per-weaponName/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.%sappears 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 earlierREMAINING OBwork 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) and0xee019650(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-onlyMSG_VOICE_*transcripts that were never localised. Their names are unknown. GP_DIALOG'sengandjpnobjects are byte-identical Japanese, andGP_SAVE_LOAD's "English" table is half Japanese — shipped untranslated, not a decoding error.