Journal, localization, and audio
Journal UI, spoken dialogue, and embedded scene choices use different lookup systems. A fix in one does not repair the others.
Identify the lookup path
| Player-facing content | Authoritative key | Runtime owners |
|---|---|---|
| Quest title, objective, mappin, message, shard, onscreen | Textual secondary key | Journal entry plus ArchiveXL-registered onscreen localization |
| Spoken subtitle | Unsigned numeric localization RUID | Scene line plus subtitle map plus subtitle entries |
| Spoken audio | Same unsigned numeric RUID | Scene line plus VO map plus WEM ResourcePath |
| Player choice label | Scene-local numeric locstring ID | Choice option to screenplay option to embedded locStore descriptor/payload |
The screenplay item ID is not a localization RUID. The caption CName on a
choice is useful authoring/debug text but is not the authoritative rendered
label.
Journal entry is missing or has the wrong state
Trace one entry from definition to operation:
- Confirm the journal resource is packed and registered under the journal registration class.
- Copy the exact full
gameJournalPath.realPathfrom the quest node. - Split the path into components and verify each parent/child ID in the journal tree.
- Verify
fileEntryIndexidentifies the component represented by the containinggameJournalFileEntry; it is not the objective’s child index. - Confirm the quest edge enters the correct journal node socket, such as
Active,Succeeded,Failed, orInactive. - Check the starting save for an existing state or visited flag.
- Confirm the localized key exists only after the state transition itself is known to occur.
| Symptom | Likely first boundary |
|---|---|
| No entry and no state transition | Registration, path, fileEntryIndex, or graph socket |
| Entry exists with blank title | Onscreen localization registration/key |
| Objective activates but pin does not | Mappin journal child/state and world marker lookup |
| Entry is already succeeded on first test | Starting save or an earlier candidate’s graph state |
| File/shard exists but read gate never advances | Exact entry path, visited-state condition, and save lineage |
Do not rewrite localization while the journal node itself never executes.
Journal/UI text is blank
Compare the journal field and onscreen entry character for character:
journal localized field secondary key
-> registered en-us onscreen resource
-> localizationPersistenceOnScreenEntry.secondaryKey
-> femaleVariant / maleVariant text
Then inspect:
- correct
localization.onscreenslocale registration; - exact packed resource path;
primaryKey/secondaryKeyshape used by the focused lab;- duplicate secondary keys in the installed candidate set;
- current save state, since an inactive journal entry cannot display its text.
Do not convert a textual onscreen key into a scene RUID. They are separate domains.
Subtitle is missing
For one spoken line, make a four-column audit:
| Join | Expected equality |
|---|---|
| Scene screenplay line | locstringId.ruid equals the authored spoken-line RUID |
| Subtitle map | Registered map points to the exact subtitle-entries ResourcePath |
| Subtitle entry | stringId equals the scene RUID |
| Locale | Map is registered for the locale being tested |
Check ArchiveXL logs for the map registration and missing nested path. A subtitle map can register while its entries resource is absent from the archive.
Subtitle works but audio is silent
Keep the proven subtitle join unchanged and audit the VO branch:
- confirm
localization.vomapsregistration for the tested locale; - confirm the VO entry
stringIdequals the scene RUID; - confirm female and male ResourcePaths intentionally target existing WEMs;
- list/extract the archive and hash each WEM;
- confirm the game follows the expected gender path;
- compare format/provenance with the chapter’s known synthetic or authored source, without substituting extracted vanilla audio.
A present WEM is not proof of a valid VO-map join, and a valid VO-map join is not proof that the WEM encoding is accepted. Change one boundary per candidate.
Choice label is blank, stale, or belongs to another option
Trace the complete scene-local chain:
choice node option screenplayOptionId
-> screenplayStore.options[].itemId
-> option locstringId
-> locStore.vdEntries matching locale, ID, and signature
-> descriptor vpeIndex
-> locStore.vpEntries[vpeIndex]
Then verify:
- every option ID resolves to one screenplay option;
- descriptor locale blocks are contiguous in the evidence-matched order;
locstringIdvalues are sorted numerically as unsigned integers within the arrangement being copied, not lexicographically as decimal strings;- duplicate descriptors preserve their intended relative mapping;
- every
vpeIndexremains zero-based and points to the matching payload; - descriptor and payload
variantIdvalues match without signed truncation.
Legacy evidence showed a scene whose correct captions coexisted with blank and stale rendered labels. Round-trip serialization preserved the malformed order; it did not repair it. Treat ordering as authored data.
Localization isolation matrix
| Test | What a pass proves | What remains unproved |
|---|---|---|
| Journal state changes with placeholder-visible debug inspection | Graph path/state operation | Onscreen localization and player presentation |
| Onscreen title/objective renders | Journal/UI lookup | Scene subtitle, audio, and choices |
| Subtitle renders with audio disabled/unchanged | Scene-to-subtitle path | VO-map/WEM path |
| WEM plays with matching subtitle | Spoken-line external joins | Choice locStore |
| Every choice label maps correctly | Embedded locStore chain | Branch behavior and scene cleanup |
After fixing a lookup, repeat the scene or journal route from a save eligible for that transition. A save that already visited the message or passed the scene node cannot prove first presentation.
Previous: Actors, scenes, and lipsync. Next: Save state and clean retests.