Narrative
Status: COMPLETE — Full design documented
Last updated: October 30, 2026
Dark Tower — Narrative Design
Status: COMPLETE — Full design documented
Subsystem: Story structure, branching design, choice philosophy, arc design, NPCs, relationships Primary sources:
DarkTowerClueTypes, , , , card data indark_citadel.dark_citadel_cards
Narrative Design Philosophy
Dark Tower is fundamentally a clue-driven branching narrative. Unlike choose-your-own-adventure where paths diverge and reconverge, DC uses an additive clue inventory model: players accumulate clues as they play, and those clues determine which options become visible at any point in the story.
Key principle: The story doesn't fork into isolated branches — it flows forward while clue state determines what the player sees and experiences along the way. A player with 12 clues at Arc One's end has a fundamentally richer experience than a player with 3, even if they visit many of the same cards.
The Five Storylines
Each storyline is an independent narrative engine sharing the same character, equipment, and combat system. The storyline is determined by the card ID range:
| Storyline | Game ID | Card Range | Chapters | Tone |
|---|---|---|---|---|
| Dark Tower (main) | DARK_CITADEL |
30000-109999 | 60 | Epic fantasy adventure |
| Zoo Keeper | ZOO_KEEPER |
110000-129999 | 20 | Lighter, zoo/animal comedy |
| Chess Maven | CHESS_MAVEN |
130000-159999 | 20 | Intellectual strategy narrative |
| Ghost Stories | GHOST_STORIES |
160000-179999 | 2 | Horror/supernatural |
| Last Light in the Dark | LAST_LIGHT_IN_THE_DARK |
180000+ | 11 | Dark psychological drama |
Volume distribution: Last Light contains 432K of 612K total cards (71%) — it is by far the deepest narrative in the engine.
Story Structure: The Main Story (Dark Tower)
Chapter Hierarchy
Storyline (Dark Tower Main)
└── Arc One (Chapters 1-N, approx. 60 total)
└── Cards (the fundamental unit)
└── Options (player choices, 1-4 words each)
└── Overlays (combat/check if triggered)
The main story has 60 chapters. Chapters are logical groupings of cards (currentChapterNumber on the card model). Chapter progression is tracked via endOfChapterNumber on options — selecting an option with this field set marks that chapter complete.
Arc One Ending System
The most sophisticated narrative outcome system is Arc One's ending router at Card 35877. The ending is determined entirely by how many clues the player has found:
| Clues Found | Ending | Narrative Meaning |
|---|---|---|
| 12+ | Total Victory | All threads resolved, all allies safe |
| 8-11 | Pyrrhic Victory | Victory but William dies |
| 4-7 | Tragic Victory | Victory with multiple character deaths |
| 0-3 | Defeat | Story ends badly |
Design intent: The ending is a consequence of engagement, not a choice. Players who thoroughly investigate get better outcomes. This rewards curiosity and re-exploration without blocking progress.
Clue System
How Clues Work
Clues are the primary branching mechanism in DC. They are boolean flags stored in (a Set<DarkTowerClueTypes> with 1000+ types).
CLUE_UNLOCKED_CHAPTER_* is the exception. The same names gate every storyline's chapter menu, and one character plays every storyline, so those grants live in chapterUnlocksByStoryline under the storyline that earned them (MAIN_STORY, LAST_LIGHT, CHESS_MAVEN, ZOO_KEEPER, GHOST_STORIES). A chapter earned in one storyline does not open another's chapter menu. The shared set still holds the main story's copy, which main-story quests and latest read. A copy that is only in the shared set belongs to the main story. Every other clue stays on the shared set and carries across storylines with the character. The menu gate is : a chapter option is scoped by its nextCardId storyline range, then by the card in play.
A character whose side-storyline unlocks were granted before the per-storyline sets existed has them restored by (driven by scripts/darktower/side_storyline_unlock_backfill.py): the chapter its storylineProgress card reached in each side storyline, through that storyline's meta_chapters start cards, names the chapters 2 through N it had unlocked. An ascended character gets only the chapters its shared set still holds, because ascension clears the shared set and not storylineProgress.
DarkTowerClueTypes is append-only. The cached character is written to Redis with enums by ordinal, so a constant inserted or moved before the end re-reads every cached character's clues as their neighbours, and the write-behind flush saves the wrong names to MySQL. pins the order of every enum any Redis cache writes by ordinal, the cached character's among them, in cached-enum-ordinal-pins.txt.
| Option Field | Logic | Effect |
|---|---|---|
cluesRequiredToSee |
AND | Player must have ALL of these to see the option |
cluesMissingToSee |
NOT | Player must have NONE of these to see the option |
cluesPlayerWillFind |
ADD | These clues are added when the option is selected |
removeTheseClues |
REMOVE | These clues are removed (marks story state consumed) |
Clue-Gated Fast Travel
The teleport menu (baseTeleportMenu()) filters available locations by discovered clues. Players unlock fast travel destinations by finding location clues during exploration. This ties narrative progress directly to navigation capability.
Story Quality vs. Clue Count
The clue system creates emergent story quality without hard gates. Players who rush may miss clue-granting options and arrive at the Arc One ending with 3 clues (Defeat) even if they completed all combat. Players who explore thoroughly accumulate 12+ clues and reach Total Victory.
NPC Relationships
Named Characters
The punishment system reveals the named NPCs whose relationships can be damaged:
| NPC | Role |
|---|---|
| William | Primary companion / ally (dies in Pyrrhic Victory) |
| Isabel | Secondary companion |
| Trinity | Secondary character |
| Cuthbert | Supporting character |
| Chelsea | Supporting character |
| Nigel | Supporting character |
| Lucas | Supporting character |
| Rylee | Supporting character |
Punishment type RELATIONSHIP_HURT_[NAME] damages the relationship with that specific NPC.
DESIGNED 2026-06-17 (gd-02): the dedicated design effort this RESOLVED note called for is now authored in questline-and-npcs.md Part 2 — numeric per-NPC relationship scores moved by the EXISTING [NAME]_RELATIONSHIP_IMPROVE reward + [NAME]_RELATIONSHIP_HURT punishment types, 5 tiers, one-time payoffs (companion unlock, Title Shop entry, and who survives the Arc One ending), and NPC arcs as quest chains. Build epics Q1–Q3 flagged there.
NPC Relationship Design Intent
Naming specific NPCs in the punishment system suggests the design intent is personal investment in specific characters rather than an abstract reputation meter. William's death in the Pyrrhic Victory ending makes this explicit — player choices about which clues to find determine who survives.
Branching Design Patterns
Pattern 1: Clue Accumulation (Soft Gating)
Most branching in DC uses soft gates — options are visible but lead to different experiences based on clue state. A player with fewer clues follows the "naive protagonist" path; one with more takes a more informed route.
Pattern 2: Hard Gates (AND Requirement)
Some options are completely hidden until all required clues are obtained. These represent secrets — paths that only appear when the player has done the prerequisite work. Example: a hidden door only revealed after finding both the map clue AND the key clue.
Pattern 3: One-Way Doors (removeTheseClues)
Options that remove clues on selection mark points of no return within a narrative sequence. Once a clue is consumed, the option that required it disappears, preventing replay of the same branch.
Pattern 4: Seasonal Gates (Date Gating)
Options can be gated by monthStart/dayStart and monthEnd/dayEnd. This enables holiday events and seasonal content that appears/disappears based on real-world date. These are the only time-based gates in the system.
Story Card Types and Narrative Flow
Card status types from DarkTowerStatus serve narrative purposes:
| Status | Narrative Role |
|---|---|
NORMAL |
Standard story progression |
MENU |
Hub navigation (main menu, area menus) |
TUTORIAL |
New player onboarding — can be replayed |
INSANITY |
Escalating psychological horror sequence |
WAVES |
Combat gauntlet (narrative tension through repeated enemies) |
RAID |
Cooperative story content |
INVASION_WON / INVASION_LOST |
Post-event narrative outcome cards |
CITY / TERRITORY / DUNGEON |
User-generated content (creator tool) |
The Insanity Narrative Arc
INSANITY-status cards create a sub-narrative layer: as players navigate these cards, their insanity meter rises (see index.md). The escalating difficulty and eventual reset to card 15653 ("Landing Point Insane") means these sections have a built-in narrative rhythm: enter sanity sequence → experience escalation → break. This is repeated sanity-testing as a story device.
Story Switching Mechanic
Players can switch between the 5 storylines at any time (except during combat). The switch system saves and restores per-storyline progress:
Switch to Chess Maven:
1. Save current Dark Tower position (cardId -> storylineProgress["MAIN_STORY"])
2. Load Chess Maven position (storylineProgress["CHESS_MAVEN"] or default start)
3. Character carries over: level, equipment, inventory, gold unchanged
Design intent: All 5 storylines are independent standalone stories (originally separate games, consolidated into one engine). Players switch between them at will — this is a core feature, not a rare action. All storylines are available from session one with no unlock requirements. Character progression (level, equipment, inventory) carries across storylines. Chapter-unlock clues do not: CLUE_UNLOCKED_CHAPTER_* stays with the storyline that granted it.
Known issue: NLU routing for story switching is broken (#6165). Players must use setCardId admin workaround.
Resume / "latest" (fixed 2026-05-24, ; redefined 2026-08-20)
The legacy chapter-select menu (cards 1 Solo Menu -> 9 Chapter Select -> 8 Game Menu -> 10 Arc Menu -> 20 Undead Queen Chapter Menu) still exists in card data even though chapters auto-advance. Card 9's latest option carries freeTextDeclarationAction: DARK_TOWER_NEXT_CHAPTER.
Semantics: latest jumps to the newest chapter the player has unlocked, not the last-played card and not a free-explore cell. next chapter rides the same action but goes to the chapter after the one the player is in, so a player replaying chapter 3 with chapter 6 unlocked hears chapter 4 on next chapter and chapter 6 on latest. The generator tells them apart by what was said (: card 9's latest option, or "latest" or "newest" in the utterance); with no current chapter both go to the newest unlocked one. Unlock state comes from CLUE_UNLOCKED_CHAPTER_* clues; the target card is dark_citadel.meta_chapters.card_id_start for that chapter ( + ). On a card tagged to another storyline, the chapter number comes from that storyline's unlock set, not the main story's ladder. With no unlock clues the jump is chapter 1 start (30000). The jump only moves forward: a player whose current card is already in that chapter or a later one (DarkTowerCard.currentChapterNumber) stays on the card and hears "You are already in chapter N, the newest chapter you have reached". So a chapter-2 player whose unlock clue has not landed is never sent back to card 30000, and the newest chapter is never restarted from its first card (). This closed player_feedback 11507 / 11546 / 11605 / 11606 where latest resumed last-played or left the player on free explore.
Unlock map through chapter 60. maps each CLUE_UNLOCKED_CHAPTER_* grant to the chapter it unlocks. Chapters 31-50 are TWENTY_THIRTY_ONE through TWENTY_FIFTY. Chapters 51-60 use the authored natural names CLUE_UNLOCKED_CHAPTER_FIFTY_ONE through CLUE_UNLOCKED_CHAPTER_SIXTY; the TWENTY_ prefix does not continue past 50. A TWENTY_FIFTY_ONE spelling is not a member: the shared reads unknown enum values as null, so that key is silently never granted. Finishing chapter 55 grants FIFTY_SIX from the end-of-chapter option, so latest jumps to chapter 56 start (meta_chapters.card_id_start 65000), not chapter 50. CLUE_UNLOCKED_CHAPTER_SIXTY_ONE is not a map entry. JUnit: highestUnlocked_fiftySixIsNotStuckAtFifty, endChapterOption_fiftySixIsGrantedNotNull.
Part-1 tail menu: Ark 1 menu card 23 chapters 16-20 must use the same meta_chapters.card_id_start targets as End-Chapter auto-advance (34527 / 34827 / 34856 / 35428 / 35728). The stale +300 bridge cards (34500 / 34800 / 35100 / 35400 / 35700) loop or drop the player backward — the same class of bug fixed for chapter 13.
Chapter 18 to 19 advance: End Chapter 18 (35176) correctly continues to 35428 and grants CLUE_UNLOCKED_CHAPTER_NINETEEN. Card 35428 options now target 35709 (still chapter 19). move by navigates there immediately. fight has a combat overlay, so a single fight utterance enters combat on 35428 (still chapter 19); 35709 is the post-combat success card. The queen-weakness side path from 35141 through 35409 and 35410 returns to End Chapter 18 (35176), then 35428. Chapter 19 card 35550 proceed to battle continues to 70141, still chapter 19, not back to 35410.
Open design question (NOT yet decided): whether the whole legacy chapter-select menu tree should be retired in favor of pure launch auto-resume, and whether failed side-quest skill checks (e.g. cards 30641 orc-princess, 30650 caravan) should advance instead of looping back to hub 30605 (fb 7115, 7116).
Legacy chapter-select menu — stale +300 jump targets (fixed 2026-06-13, ; feedback 8865, 8833)
The Ark chapter-select menus (cards 20-25) jump each "start chapter N" option to 30000 + (N-1)*300, a fixed-300-cards-per-chapter assumption baked in when each chapter was a clean 300-card block. As chapters grew past 300 cards the real starts drifted (meta_chapters: ch13 = 33627, ch14 = 33927, ch15 = 34227, ...) while the menu kept the round +300 targets. Card 22's "a dark road" (chapter 13) pointed at 33600 — a chapter-12 leprechaun side-card (reached in normal play via card 33304 "pursue the leprechaun"), NOT the real chapter-13 start. A player who had unlocked chapter 13 and used the menu was told "let's start the thirteenth chapter," dropped onto a chapter-12 card they had already played, and then heard "You are on chapter 12" from what chapter — perceiving being stuck on chapter 12. Fix: card 22 "a dark road" nextCardId 33600 -> 33627, matching the authoritative End-Chapter-12 auto-advance (card 33324 "keep going" -> 33627, which grants CLUE_UNLOCKED_CHAPTER_THIRTEEN) and meta_chapters. Regression: scenario_test 2019, which uses the new setStoryClues PlayRequest test-seeder () to satisfy the CLUE_UNLOCKED_CHAPTER_THIRTEEN option gate hermetically.
Chapter 28 end card (fixed 2026-08-27, fb 11888). Card 38141 is the authored
end of chapter 28. It previously offered only main menu with nextCardId 0, so a player who
finished the chapter was dumped onto the main menu via the missing-card fallback — the same
chapter-stick class as pre-fix card 33324. Fix: add keep going → 38400 (chapter 29 start
from meta_chapters.card_id_start, granting CLUE_UNLOCKED_CHAPTER_TWENTY_NINE) and keep
main menu as the second option. continueText now ends "That is the end of chapter twenty eight."
Regression: scenario_test 3444 (keep going from 38141 asserts
character.currentDarkTowerGameCardId == 38400).
Chapter 29 completion (intended). Chapter 29 is not the end of the main story — chapter 30 (Blackbeard's Shadow, meta_chapters.card_id_start 39000) is live, and the story continues through chapter 60 to the Arc One ending router at card 35877, which unlocks the Ascendant's Path. Card 38506 is the authored end of chapter 29. It offers keep going to 39000 (granting CLUE_UNLOCKED_CHAPTER_TWENTY_THIRTY) and main menu as the second option. continueText ends "That is the end of chapter twenty nine." A nextCardId-0-only option dumps the player onto the main menu and leaves latest/chapters navigation on chapter 29, which replays the chapter and removes its achievement clues. Same chapter-stick class as card 38141.
Open design question (NOT decided — do not guess): the same menu's chapter-14 ("world at war" -> 33900) and chapter-15 ("devil in the details" -> 34200) options point at "Start Chapter N" bridge cards that are tagged as the PRIOR chapter (33900 = ch13, 34200 = ch14) yet are reached BOTH by the menu AND by that chapter's End-Chapter auto-advance (End-ch13 -> 33900, End-ch14 -> 34200). Unlike chapter 13's 33600 (an off-path side-card the menu uniquely mis-targeted), these bridge cards sit on the main narrative flow, so menu and auto-advance agree — only the card tag-vs-"start chapter N+1" copy is in tension. Whether the bridge cards should be re-tagged to the new chapter, or the spoken copy adjusted, is a narrative-authoring decision left unchanged here.
Quest System
Status: SHIPPED (code) — a real quest log built by questline-and-npcs.md Q1-Q3. The stub described below (pre-2026-06-17) is HISTORICAL — it was the exact
gap gd-02 flagged and questline-and-npcs.md closed. This section now points at the shipped system instead
of restating it; see questline-and-npcs.md for the full spec + build status per part.
What's live today
| Component | Source | Status |
|---|---|---|
| Command routing | DARK_TOWER_QUEST_LOOKUP in FreeTextDeclarationAction |
LIVE — reached via "quests" / "quest log" / "my quests" |
| Quest log readout | LIVE (Q1) — voice-first hub: MAIN next-step, accepted SIDE/ACHIEVEMENT quests, POST_STORY signpost | |
| Quest state machine | LIVE (Q1) — LOCKED to CLAIMED lifecycle, observer progress math, claim | |
| Quest catalog | DarkTowerQuestCatalog |
LIVE (Q1-Q3) — MAIN/SIDE/ACHIEVEMENT/POST_STORY quest definitions, including the DT_POST_STORY_ASCENDANT dual signpost (Q3) |
| NPC relationship quests | questline-and-npcs.md Part 2 (Q2) |
LIVE — npcRelationships tiers feed the RELATIONSHIP quest signal; arc quests advance NPC tiers on claim |
| Auction-winnings collect | LIVE, UNCHANGED — "collect" / "collect rewards" still gathers auction winnings AND claims finished quests (same action, branched in-code; no risky NLU repoint) | |
| Quest rewards | DarkTowerRewardTypes GUILD_REWARD_* + the pending-reward pipeline |
LIVE |
Full class-level detail, the LOCKED→CLAIMED state machine, the NLU wiring, and the deliberate Q1/Q2/Q3
scoping (what each part shipped vs deferred) live in questline-and-npcs.md — read that doc for anything
beyond this summary; do not re-duplicate its implementation detail here.
Remaining gap (deferred, not stubbed)
- Ascension carry-over wiring — the literal
ascendcommand,ascensionLevel, andCLUE_PATH_OF_ASCENSION_OPENdo not exist yet; Q3 proxied the POST_STORY unlock onCLUE_UNLOCKED_CHAPTER_THIRTEENand will repoint it once the post-story loop (Ascension / Hunter's Contracts / Trial of the Week,post-story-loop.md, PS1-PS4) ships. This is the ONLY quest-system gap left; it is a scoped dependency on a sibling system, not a stub.
Dead-End Detection and Narrative Completeness
The broken card detection system () identifies cards where no option leads to a valid next card. These dead-ends are tracked per storyline:
| Storyline | Dead-Ends |
|---|---|
| Dark Tower (main) | 438 |
| Last Light in the Dark | 3,186 |
| Chess Maven | 0 |
| Zoo Keeper | 46 |
| Ghost Stories | 156 |
Dead-ends are bugs, not intentional endings. All paths should interleave — every card should have at least one option leading to a valid next card. Dead-ends represent incomplete content connections that need to be fixed. Last Light's 3,186 dead-ends indicate significant content linking work remains.
Core Narrative Loop
Arrive at card (see continueText narrative)
-> Review available options (filtered by clue state)
-> Select option
-> (Optional) Skill check overlay: pass/fail → different card
-> (Optional) Combat overlay: win/lose → different card
-> (Default) Navigate to nextCardId
-> Find clues, trigger punishments/rewards
-> Story state updated
-> New options become available (clue-gated)
-> Loop
Design insight: Every action in DC is a narrative beat. Combat is not separate from story — it's embedded in options. A player selecting "charge the guard" might trigger both a STEALTH skill check (can they be stealthy?) and, if they fail, combat with the guard. The same card can have wildly different experiences based on a player's build and clue state.
Tone & Copy — Religious Language Audit (2026-05-12)
Status: DECIDED — decline broad copy pass; targeted soften shipped for 2 specific cards
Source
Player AMA5KOSFP25M6RRY (player_feedback id 2734): "this game keeps taking the name of my lord god in vain". Feedback row archived 2026-05-11; followup audit deferred from queue 19054 round 3 to round 4.
House Tone
Lincoln Cole adult-themed but not gratuitously offensive. The Dark Tower in-world gods system (Crone, Goat, Pyre, Bones, Spider — see index.md § Gods) is intentional mythological flavor; NPC references to "my god" or "your god" framed within the game's pantheon are in-fiction worldbuilding, not vain invocation, and stay.
Audit Scope
Regex audit across dark_citadel.dark_citadel_card.card_data for the storylines DARK_CITADEL and LAST_LIGHT_IN_THE_DARK (the two storylines voiced under the Dark Tower banner). Patterns: oh my god, god damn, goddamn, jesus christ, holy jesus, christ.*sake, swear to god, name of.*lord, lord god, dear god, good god, my god, god help, god knows, god forbid, in vain. Java engine code in backend/src/main/java/llitd/engines/handlers/darktower had zero hits.
Findings
- "in vain" appears ~45 times across DC cards as secular "your efforts are in vain" / "your search is in vain" usage. Not religious invocation. NO CHANGE.
- In-fiction god references (cards 30609 "a quick prayer to whatever God is listening", 34614/34615 NPC Joey "my god told me", "what does your god say about me") — intentional pantheon flavor per the DT gods system. NO CHANGE.
- Vain invocations targeted for soften:
- card 32142 (CHAPTER_EIGHT_CARD, DARK_CITADEL) — player option
textUserWillSay: "oh my god". Player-controlled exclamation; replaced with neutral alternative. - card 35174 (CHAPTER_EIGHTEEN_CARD, DARK_CITADEL) — NPC Matthew
textGameReadsBeforeNextContinue: "Dear god, can this day get any worse?"Voiced by the game, fits the complaint pattern; softened.
- card 32142 (CHAPTER_EIGHT_CARD, DARK_CITADEL) — player option
Other storyline hits (ZOO_KEEPER, CHESS_MAVEN, GHOST_STORIES) are out of scope for this audit and are not Dark Tower copy.
Going-Forward Rule
When authoring new DC / LAST_LIGHT cards: keep in-pantheon references (Crone, Goat, Pyre, Bones, Spider, "the gods", "their god") freely. Avoid Judeo-Christian vain invocations (oh my god, dear god, god damn, jesus, christ, swear to god) in BOTH player option text AND textGameReadsBeforeNextContinue / continueText / failure copy. Secular in vain (efforts/search/etc.) is fine.
Source Refs
- Source feedback:
claude.player_feedbackid 2734 - Locked queue:
work.taskid 19054 (decision_topicdt_deferred_themes_round_2) - Card audit: SQL regex against
dark_citadel.dark_citadel_card.card_data— 2 in-scope hits, 16 out-of-scope or false-positive hits
Progression-loss guard — saved card survives a failed load (fixed 2026-05-29, feedback 7900)
Status: FIXED — engine guard added; regression scenario_test 1656.
Player AMAXQQ3E reported intermittent progression loss — "forced back to chapter 1", their 3rd report — while deep in Last Light (saved at card 181030). Root cause is a data-integrity bug in the card load + navigation funnel, NOT story content:
- (every turn) and
DarkTowerBasicFeatures.getNextCard(every navigation) both load cards through . When a non-null card id fails to load — a transient Redis/Kryo cache miss, or one of Last Light's many broken/deserialize-failing cards —modifyAndWrapCardsilently substitutes the menu fallback (card 0). setDarkTowerCharacterCardthen persisted that menu card intocurrentDarkTowerGameCardId. A single failed load followed by any navigation permanently overwrote the player's deep saved position with chapter 1 / the main menu. Intermittent because transient cache misses and the specific broken cards a player hits are intermittent.- The same overwrite also fired on dead-end options (an option with a null
nextCardId— Last Light has 3,186 dead-ends):incrementCardForSetrouted the null target toMAIN_MENU_CARD_IDandsetDarkTowerCharacterCardsaved the menu card.
Fix (DarkTowerBasicFeatures.incrementCardForSet + + GameBasicProperties.darkTowerCardLoadFailed): the navigation funnel now refuses to overwrite a deep saved position (currentDarkTowerGameCardId >= 30000) when either (Guard A) a card the player needed failed to load this request — flagged via the request-scoped transient darkTowerCardLoadFailed set in modifyAndWrapCard — or (Guard B) the option is a dead-end with a null nextCardId. In both cases the player keeps their saved card, hears "your progress is safe", and is offered back / main menu escapes (progressionLossGuard). A transient miss resolves on the next request; a broken card no longer destroys the save. Card 0 stays a legitimate intentional menu target (the abandon flow), because the guards key on the load-failure/dead-end event, not on the destination card id.
Dead-ends remain content bugs to fix separately (see § Dead-End Detection) — the guard only stops them from erasing progress.
Dead-end vs transient-load copy (refined). The guard's two triggers now speak distinct copy.
Guard A (a transient card-load failure) keeps the retry-friendly "could not be loaded just now" line —
a cache miss may resolve on the next request. Guard B (a dead-end option with a null nextCardId) never
resolves on retry, so sharing that copy read as a glitch and players re-picked other dead-end options
on the same card, which felt like the story looping. Guard B now speaks "This path does not continue
from here, but your progress is safe. Say back to return to where you were, or say main menu." — naming
the path as not continuing and pointing only at the working escapes (back, main menu), which is what
breaks the perceived loop. Copy split in DarkTowerBasicFeatures.progressionLossPlayerMessage;
regression .
The underlying 3,186 Last Light dead-ends remain content bugs (see § Dead-End Detection).
A character on a hollowed card
A retired card is stored hollow: no description, and no option with words or a next card. moves a character saved on one to the entry card of the newest chapter it has unlocked when its game state loads, so a retire never strands a save. The launch recap names a place only when the last narrated card is the card the player stands on.