feat(world): add the Lost Twins optional escort side-quest

Two separated brothers, Marlon (conservatory) and Malte (boiler room), can be
reunited as optional content. Carry each twin's marble to the other as proof
he's alive and that twin follows you; lead both to the foyer and they escape
together, granting a Brass Compass keepsake and unlocking a new top-priority
"No One Left Behind" ending. Purely optional — no main win condition depends
on it.

The new EscortEngine drives following and the foyer reunion from flags alone,
so save/load needs no format change (it reconciles follower placement on the
first tick after loading). Adds Room.removeNpc, one tick call in the game loop,
and a follower note appended by LookCommand. descriptionStates swap the twins'
home-room prose once they leave.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-02 10:31:25 +02:00
parent f8f7eb90f0
commit 41c79c3b96
10 changed files with 379 additions and 5 deletions

View File

@@ -122,3 +122,27 @@
id: shovel
name: Shovel
description: A rusty shovel. Sturdy enough to dig, though nothing here needs digging.
# ── The lost twins (optional escort side-quest) ──────────────────────────────
- type: plain
id: marlon_keepsake
name: Blue Marble
description: |
A child's blue glass marble, worn smooth from years in a pocket. Marlon's.
Somewhere its red twin is being clutched just as tightly.
- type: plain
id: malte_keepsake
name: Red Marble
description: |
A child's red glass marble, the mate to a blue one. Malte's — the only
thing he kept hold of when the dark took him.
- type: readable
id: brass_compass
name: Brass Compass
description: A small brass compass, pressed on you by two very grateful brothers.
readText: |
Engraved on the back, in a child's scratchy hand: "For the one who led us
out. — M & M." The needle, you notice, always settles toward the door.