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

93 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# `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.