This repository has been archived on 2026-09-16. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Syplheed-Reborn/docs/re/structures/ixud-localised-text.md
Sylpheed RE agent 34c99a1568 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.
2026-08-25 21:01:55 +00:00

4.3 KiB
Raw Permalink Blame History

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 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> = 0003. 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 keys0x298964b2 (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.