75 lines
4.4 KiB
Markdown
75 lines
4.4 KiB
Markdown
# 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, 8–14 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)
|
||
2–3 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 (3–4 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 1–4 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.
|