re: 268 voice references name a bank that does not exist — one whole family

Following up the incidental gap from the DEMO_* work. Resolving every VOICE_*
token the way the engine does -- token, then eng\sounds.tbl for its directory,
then sound.pak -- gives 4175 resolved and 268 unresolved of 4443 distinct.

The gap is in the manifest, not the archive: the unresolved tokens are not
listed in sounds.tbl at all, and of the 4175 that ARE listed, every one is
present in the pak. Nothing is listed-then-missing.

By family, script-used ids against sounds.tbl-listed ids:

  VOICE_A_   696 [0..772]  listed 683   missing  14
  VOICE_B_   391 [0..422]  listed 383   missing   8
  VOICE_C_   429 [0..489]  listed 366   missing  63
  VOICE_D_   508 [0..598]  listed 387   missing 126
  VOICE_E_    44 [0..43]   listed   0   missing  44  <- the whole family

Two different shapes, and the distinction matters. A/B/C/D lose short runs
scattered through an otherwise dense range -- 11,12,13 / 56,57 / 181,182,183
/ 389-392 -- which is what cut dialogue looks like. VOICE_E_ is absent
entirely: 44 ids used, none listed, no VOICE_E_* anywhere in the manifest. A
whole speaker or category, cut.

For the port: a missing voice bank is a RETAIL condition, not a decode bug. A
reimplementation must tolerate an unresolvable VOICE_* reference, the same way
it must tolerate SUBTITLE_S12B.tbl resolving in no language.

Limit stated: measured on GP_MAIN_GAME_E.pak and eng\sounds.tbl only; whether
the other five languages drop the same ids is untested.

An earlier probe of mine checked only three sound.pak directories and would
have mis-attributed this; sounds.tbl lists five, including Briefing. Resolving
through the manifest rather than guessing directories is what makes the 268
trustworthy.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
This commit is contained in:
Sylpheed RE agent
2026-08-26 02:22:46 +00:00
parent 197ae49123
commit 6c951a9b02

View File

@@ -200,3 +200,38 @@ IDXD objects, so it found 0 of them. Confirming it needs an IXUD-aware sweep.
**268 of the 4443 `VOICE_*` tokens do not resolve either.** That is a separate
gap and is not explained by the `DEMO_*` finding.
### ✅ 268 voice references on the disc name a bank that does not exist
Resolving every `VOICE_*` token the message tables use the way the engine does —
token → `eng\sounds.tbl` for its directory → `sound.pak` — gives **4175 resolved,
268 unresolved** out of 4443 distinct tokens.
The unresolved ones are **not** listed in `sounds.tbl` at all. Nothing is listed
and then missing from the pak: of the 4175 that *are* listed, **every one is
present**. So the gap is in the manifest, not the archive.
By family, comparing the ids the scripts use against the ids `sounds.tbl` lists:
| family | ids used | listed | **missing** |
|---|---|---|---|
| `VOICE_A_` | 696 `[0..772]` | 683 | 14 |
| `VOICE_B_` | 391 `[0..422]` | 383 | 8 |
| `VOICE_C_` | 429 `[0..489]` | 366 | 63 |
| `VOICE_D_` | 508 `[0..598]` | 387 | **126** |
| **`VOICE_E_`** | **44 `[0..43]`** | **0** | **44 — the whole family** |
Two different shapes:
* `A`/`B`/`C`/`D` lose **short runs** scattered through an otherwise dense range —
`11,12,13`, `56,57`, `181,182,183`, `389…392`. That is what cut dialogue looks
like: lines written, referenced, and never recorded.
* **`VOICE_E_` is absent entirely** — 44 ids used, none listed, no `VOICE_E_*`
anywhere in the manifest. A whole speaker or category, cut.
**For the port:** a missing voice bank is a *retail* condition, not a decode bug.
A reimplementation must tolerate an unresolvable `VOICE_*` reference and carry on,
the same way it must tolerate `SUBTITLE_S12B.tbl` resolving in no language.
🟡 Measured on `GP_MAIN_GAME_E.pak` and `eng\sounds.tbl` only. Whether the other
five languages drop the same ids is untested.