Built-in 64's slot-0 operand is a symbol-table-1 type-6 message id, and every one of them now has caption text: 2683 of 2683 call sites across the 28 stage scripts, 1338 distinct names, no residue of any kind. This only became reachable once build_caption_text was switched to the IXUD field table (537 -> 8800 lines); before that most of these names had nothing to resolve to. Adds isl_dialogue.py plus a committed Stage 02 sample. Does not settle which recording plays for a given line, multi-page captions, or the other five languages.
2.9 KiB
ISL request_script_message → caption text
✅ Settled 2026-08-26. Every mission-script message call resolves to the dialogue line it plays. The 28 stage scripts are readable as dialogue.
The link
Built-in 64 (request_script_message) takes one operand in slot 0: a
two-word symbol reference into symbol table 1. The symbol's name is a
message id such as MSG_VOICE_D_257. The text lives in the language pack's
IXUD blocks (dat/GP_MAIN_GAME_<lang>.pak) as a named field whose key is
<id>_<page>_<line>, read via the record/field table documented in
idxd-container.md.
MSG_VOICE_D_257 → field key `MSG_VOICE_D_257_000_00` → "Katana! Damn it!"
Evidence
Measured over all 28 StageNN.ssb:
| built-in 64 call sites | 2683 |
| slot 0 not staged | 0 |
| operand not in symbol table 1 | 0 |
| operand symbol type | 6 at all 2683 sites |
| distinct message names | 1338 |
names with caption text at _000_00 |
2683 / 2683 (100 %) |
There is no residue: no call site takes a different operand shape, no name is of a type other than 6, and no name is missing from the caption table. That totality is the result — a partial rate would have meant the operand encoding was only sometimes what I thought it was.
Name families and their share of call sites:
MSG_VOICE 2407 MSG_ADAN 118 MSG_ACRO 82
MSG_ADPL 38 MSG_TCAF 35 MSG_RHIN 3
MSG_VOICE_* is crew/wingman dialogue; the four-letter families are
ship-side announcements (ACRO = ACROPOLIS, ADAN/ADPL = ADAN,
TCAF, RHIN = Rhino flight).
Why this was not obvious earlier
The caption table only became readable on 2026-08-25, when build_caption_text
was switched from scraping adjacent string-pool tokens to reading the IXUD
field table — which took the extractable line count from 537 to 8800
(8800 of 8800 distinct keys). Before that the great majority of these 1338
names had no text to resolve to, and the 100 % figure was unreachable.
What this does not settle
- Which recording plays. The caption is the text; the voice bank binding is a separate and still-unresolved question — see voice-bank-leading-region.md and the known case of a generic line playing against a specific subtitle.
- Multi-line captions.
isl_dialogue.pyconcatenates pages_000_00through_000_03. Whether the game wraps by page or by line, and whether any id uses a page other than000, is unmeasured. - The other five languages. Only the English pack was swept.
- Ordering. The tool prints call sites in file order, which is script order, not necessarily play order — phases and branches are not resolved.
Tool
tools/re-capture/isl_dialogue.py <StageNN.ssb> [GP_MAIN_GAME_E.pak]
Sample output committed at ../data/isl-stage02-dialogue.txt (Stage 02, 213 message calls, 213 with text).