not-tonight/lanes/LANE_CONTENT.md

4.4 KiB
Raw Blame History

LANE-CONTENT — Door depth & the moral layer (Phase 3, parallel)

Executor: Opus 4.8. Branch: lane/content (from main after Phase 2). Owns: src/scenes/door/, src/rules/, src/data/strings/ (door-related files), tests. Prereq reading: CLAUDE.md → docs/GAME_DESIGN.md §3.1/§4 → the Phase-2 REVIEW block in LANEHANDOVER.md.

Phase-2 reality (read before coding)

  • The night is now a real flow: NightScene owns clock/meters/audio/save and a NightContext (see its interface — sfx, requestLocation, beatIntervalMs are new since Phase 1). Door and Floor run concurrently ALL night; the player toggles via the doorway ("step inside") and the floor's entry exit.
  • While the player is on the floor, Kayden rules the real queue in DoorScene.kaydenRule() (admit 80%, same judge(), no UV stamp 1-in-7 — stamp accuracy is decided in NightScene.onVerdict).
  • Heat is run-scoped and saved; 3rd strike ends the night AND the run immediately (endReason: 'licence'). Nights chain Thu→Fri→Sat via NightSummaryScene.nextAction(); save.ts carries GameState.
  • ui/Stamp + sfx are live in the deny path; data/strings/door.ts has FAIL_TEXT.licence.

Deliverables (in priority order)

1. The Guest List clipboard (design §3.1 — specced, never built)

A desk clipboard panel: tonight's list (generated, 814 names, some misspelled versions of real patron names). Patrons with claimsGuestList get a "'m on the list" line when they step up; player cross-checks. knowsOwner patrons who are DENIED trigger the existing furious-Dazza path (judge already scores this — surface it: their step-up line should drop hints ("Terry said swing by"), and data/strings/dazza.ts has the owner-scare text to foreshadow). Misspelling rule: a name that ALMOST matches is usually legit (bad handwriting); an exact-match name on a confident patron is sometimes a lift. Tells, not certainty. Pure logic in rules/guestList.ts + tests.

2. Scripted moral encounters (design §4.3 — the heart)

23 scripted patrons injected per night by the generator override hook (generatePatron(ctx, clockMin, archetypeOverride) + a new scripted-encounter scheduler in rules/ or data/): the girl who needs back in to grab her mate (no stamp, over capacity), the freshly-dumped regular who just wants one quiet beer (already loose). Multi-beat dialogue via the existing toast/dialogue patterns. Doing the human thing costs Vibe or risks Heat; the game never says which choice was right. NO achievement chimes, no morality meter — the design doc is explicit that this stays unscored.

3. The Inspector (archetype exists, does nothing yet)

Activate inspector: reads as a boring punter at the rope (their doll is deliberately unremarkable). If admitted, they observe for ~30 clock-min: any live breach in that window (capacity over licensed, a maggot on the floor, underage inside) converts its deferred strike to IMMEDIATE. Then they leave and Dazza texts "that was the INSPECTOR you muppet". If denied — nothing happens, ever (they were just a quiet person; paranoia is the tax). Pure logic rules/inspector.ts + tests; wiring via bus events only.

4. The Incident Report (design §3.3 — lying groundwork)

On the Night Summary: a short form (34 incidents sampled from NightState.incidents) where the player picks a written account per incident — truthful or flattering. Store both truth and account in GameState.pastReports. Cross-night audit (contradictions → strikes) is Phase 4; THIS lane only builds the form + storage + one taste: a lie about a kayden incident can be contradicted by Kayden's own log line next morning (Dazza text). Keep the form fast — 20 seconds, not homework.

5. Sobriety line-walk (stretch)

The third challenge: cursor-follow line at the desk. Only if 14 land clean.

Constraints

  • All scoring through judge()/meters:delta/heat:strike — no new direct meter paths. New events need a CONTRACT CHANGE REQUEST (declaration-merge bridges are BANNED now — request and wait for the fold).
  • Kayden must interact sanely with everything you add (e.g. he auto-admits guest-list liars — that's fine and funny; make sure it can't crash).
  • Every pure module tested; play a full 3-night run before your handover and report what the run FELT like — the economy findings from Phase 1 are still open and your content changes the mix.