DESIGN.md: full cast/map/scene table/puzzle spec + laserdisc research; ENGINE v2 mechanics

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
m3ultra 2026-07-19 19:02:11 +10:00
parent 7710c3a830
commit 11e4c557b2
3 changed files with 396 additions and 0 deletions

124
DESIGN.md Normal file
View File

@ -0,0 +1,124 @@
# RECORD STORE GUY — production design v1 (cast, map, scenes, puzzles)
Transcription-ready for the editor / shots JSON. Sources: WORLDS.md (creative),
research/laserdisc-research.md (structural analysis of DL/SA/DL2 — Gemini deep research).
## Mechanics adopted from the laserdisc canon
| From | Mechanic | RSG version |
|---|---|---|
| DL | Mirrored scenes (flipped video = "new" room) | `mirror: true` scene flag — engine flips video (CSS scaleX(-1)) AND swaps left/right inputs. FREE content doubling, zero credits. Use on: rack-jumps, canyon runs, asteroid weave. |
| DL | Failed-scene replay queue before finale | Scenes you died in (max 8) queue up and replay before Track 7 — "the Dead Wax remembers." Fits the remix boss volley perfectly. |
| SA | Difficulty tiers (Cadet skips 50%) | EASY "Casual Browser": skips the hardest scene per track, windows +0.2s. NORMAL "Collector". HARD "Completist": every scene, cue:false on repeat visits. |
| SA | ENERGIZE branch | **DROP THE NEEDLE**: flashing headphones prompt mid-scene; ignore = keep dodging (default path); hit action DURING flash = power-up branch — music surges, guy goes on offense, alternate cooler clip, bonus 500. Optional per scene; 4 planned (t2, t3, t5, t6). Costs 1 extra clip each — premium moments. |
| DL2 | Treasures (unprompted inputs) | **WHITE LABELS**: 7 hidden white-label records, one per track, flash ~0.5s in the background of a normal scene; unprompted ↑ during the flash collects (wrong guesses don't kill — they're ignored, DL2's cruelty declined). All 7 → true-ending stinger unlocks (the cat/PROMO scene + sequel tease). NO forced loop-back. |
| DL2 | Checkpoints per era | Already in engine (checkpoint per track start). |
## CAST (blocks.json roster — prompt blocks to be drafted in bible at concept-art time)
| id | who | role | notes |
|---|---|---|---|
| hero | Dez | player character | exists in blocks.json v1 |
| deadwax | The Dead Wax | villain, boss, world-warper | exists v1; also "remembers your deaths" |
| cat | Mildred, store cat | chaos neutral; stinger; Track-1 fake-out hazard | knocks things onto you; true-ending payoff |
| boringguy | The Boring Guy | Shift NPC — endurance monologue | beige everything, lanyard |
| namedropper | The Name-Dropper | Shift NPC — trap conversation | expensive jacket, never buys |
| postman | The Postman | Shift executioner (overquote) | kicks door in, standard-issue righteousness |
| accountant | The Accountant | Shift executioner (underquote) | rises through floor, adjusts glasses |
| creatures | (per-world, non-ingredient) | vinyl-fin sharks, sleeve-dactyls, security programs, THE NEEDLE | prompted per-shot, no ingredient stills needed |
## MAP (flow)
```
INTRO → T1 (4) → SH1 filing → T2 sea (5) → SH2 tape → T3 lava (4) → SH3 postage
→ T4 space (5) → SH4 boringguy → T5 grid (5) → SH5 namedropper → T6 runout (4)
→ SH6 mailers → [REPLAY QUEUE: died-in scenes] → T7 boss (3 volleys) → WIN
Branches: SH1 wrong-file → MISFILE DIMENSION (2-scene punishment loop, rejoins SH1)
needle-drop alts in t2s4, t3s4, t5s2, t6s1 (parallel premium clips)
7 white labels → +stinger after WIN
```
Checkpoints at every T#s1. Lives 5. A flawless run ≈ 45 scenes × ~5s ≈ 89 min of
video — right between Space Ace (8) and Dragon's Lair (12) perfect runs. Feels canon.
## SCENE TABLE (id | beat | player does | on fail | notes)
Windows/timings tuned in-editor later; inputs listed in order. (m)=mirror-eligible.
**T1 CLOSING TIME** — t1s1 shelf avalanche | ← | crushed, thumbs-up · t1s2 rolling 12"
boulder chase | ↑ vault counter | steamrolled into embossed pancake · t1s3 tape-tentacle
bin | → jump | mummified in tape (cat watches, unmoved) · t1s4 ceiling fan | ↓ duck |
fan-launched into the SALE bin. White label #1 flashes in t1s2 background shelf.
**SH1 FILING** — choice ←house/↑techno-under-house/→techno (1.5s). Wrong → death-pit
clip → MISFILE DIMENSION: mf1 endless wrong crates, alphabet closes in | ↓ hide behind
"Misc" divider | crushed by a falling serif A · mf2 climb out on a rope of taped-together
price stickers | ↑,action | sticker rope snaps, filed forever. Rejoins SH1 retry.
Da Brat D-or-B runs as SH1's second visit variant (either answer → customer-correction
scene, survive with ↓ nod).
**T2 SIDE A/SEA** — t2s1 floor liquefies | ↑ | glug · t2s2 rack-to-rack on wave peaks (m)
| →,→ | theatrical rack-tip topple · t2s3 shark run | ←,↑ | swallowed, shark burps
headphones · t2s4 whirlpool + tonearm [NEEDLE-DROP alt: guy surfs the tonearm itself]
| action | spindle-drain glug · t2s5 gatefold surf escape | →,action | wipeout, washed
into lost-property. White label #2 floats past in t2s3.
**T3 HOT WAX** — t3s1 crate stepping-stones, rhythm | →,→,↑ on beat | solemn Terminator
sink · t3s2 stalactite drip | ← | fresh-pressed 7" with his face · t3s3 sleeve-dactyls
| ↓ then action swat | carried off, single record floats down (m) · t3s4 geyser gauntlet
[NEEDLE-DROP alt: rides a geyser like an elevator, grabs white label #3 automatically]
| ↑,→,action | launched skyward.
**SH2 THE TAPE** — random:[thin-real, thick-real]. choice ←thin/→thick (1.5s). Wrong =
mimic eats arm; tableau: mimic politely re-shelves itself. Right → seal mailer, proceed.
**T4 B-SIDE/SPACE** — t4s1 decompression grab | action | polite forever-wave drift ·
t4s2 zero-g rack leaps (m) | →,↑ | ibid · t4s3 asteroid weave (m) | ←,→,← | 78rpm
impact · t4s4 black-hole spindle slingshot | action at perihelion (0.5s, hardest
non-boss window) | spaghettified into a groove · t4s5 re-entry record surf | hold ↓,
action bail | smoking crater, hand with record emerges. White label #4 orbits in t4s4.
**SH3 POSTAGE** — choice ←under/↑exact/→over (1.5s). Under → accountant rises, ends
you. Over → postman kicks door, executes. Exact → both nod, withdraw. (Both deaths
QUALITY-tier candidates.)
**T5 THE GRID** — t5s1 EQ-bar floor crossing on the quiet bars | → on beat ×2 |
derezzed to sad 8-bit sprite · t5s2 light-disc battle [NEEDLE-DROP alt: guy duel-wields
45s, aggressive counter-rush] | ←,action,→ | disc to chest, mannequin clang · t5s3
derezz-wall corridor run | ↑,↑ | ibid · t5s4 platter-lock gate | action on groove-gap
align | lock spits him into t5s1 (soft fail: replay, no death — variety) · t5s5
Technics light-cycle escape | hold →, ↑ ramp | wipeout → screensaver-bounce death.
White label #5 renders as the only NON-neon object in t5s3.
**SH4 BORING GUY** — endurance: ↓ nods at 4 conversational beats across one clip;
miss → he starts over (same clip, tighter windows); 3rd restart → time-lapse death
(cobwebs, seasons, skeleton in flannel).
**T6 THE RUN-OUT** — t6s1 needle chase, canyon sprint [NEEDLE-DROP alt: he jump-grabs
the needle's cartridge and RIDES it — segues to t6s3 skipping t6s2] | ↑,→,↑ | caught:
white-noise flash, a click in the groove forever (the eerie one) · t6s2 dust-boulder
storm | ↓ into scratch crevice | buried, coughs a shellac 78 · t6s3 ridge-ripple run
(m) | → at crest | flung a groove over, watches himself rerun it (meta) · t6s4 label
approach, tendrils erupt | action | yanked under the paper. White label #6 half-buried
in t6s2 dust.
**SH5 NAME-DROPPER** — trap choice: ↑enthusla = 45-min-conversation aging death /
↓ noncommittal grunt = survive / → name a rarer record = he evaporates in shame,
+1000, ALSO drops white label #7 as he vanishes (the only missable-by-politeness one).
**SH6 MAILERS** — rhythm fold ×4 | ↓,←,→,action on beats | fatal papercut, operatic
slow-mo, single tear.
**REPLAY QUEUE** — engine replays up to 8 died-in scenes ("the Dead Wax remembers"),
needle-skip transition card between each. Clear them → T7.
**T7 BOSS** — t7s1 tendril storm | ←,↓,→ | pressed into picture disc of his own face ·
t7s2 the remix: 1s hazard callbacks | 4-input chain (shark! geyser! disc! needle!) |
death = your statistically-most-died death replayed at 2x with the Dead Wax laughing ·
t7s3 platter run + THE NEEDLE LIFT | action, 0.4s, no cue on HARD | pressed between
platters. WIN → dawn, PROMO sticker, cold coffee. +7 labels → stinger: cat paws it
back out. RECORD STORE GUY WILL RETURN.
## Puzzle taxonomy (for the editor's window types)
reflex (arrow/action) · chain (24 inputs) · rhythm (inputs on beat) · choice
(branching, 1.5s) · endurance (n windows, miss = restart clip) · unprompted
(white labels — no cue, no fail) · needle-drop (optional action during flash →
branch) · hold (hold ↓/→ then release-input).
## Clip-count delta vs WORLDS.md budget
+2 Misfile Dimension, +4 needle-drop alts, +1 Da Brat variant, +1 stinger, 0 mirrors
(free): ≈ 72 final clips, ~4900 credits with same assumptions — still ~4100 contingency.

View File

@ -61,6 +61,19 @@ default death; a `choices` window must be the clip's last window; `random: ["a",
on a scene picks one of two clip/outcome sets per attempt (for THE TAPE mimic gag). on a scene picks one of two clip/outcome sets per attempt (for THE TAPE mimic gag).
Choice windows default to longer durations (1.5s) — they're decisions, not reflexes. Choice windows default to longer durations (1.5s) — they're decisions, not reflexes.
## v2 mechanics (spec'd in DESIGN.md — build after Phase 3)
- `mirror: true` scene flag: CSS `transform: scaleX(-1)` on the video + swap
left/right in input handling and cues. Free content doubling (Dragon's Lair trick).
- Replay queue: scenes died-in (cap 8) replay before the final track.
- Difficulty tiers: easy = skip scenes flagged `skippableOnEasy` + windows +0.2s;
hard = `cue:false` everywhere after first visit.
- `needledrop: {t, clip, bonus}` on a scene: optional action input during a flash
window branches to an alternate clip; ignoring it is not a fail.
- `collect: {t, input}` on a scene: unprompted input during a background flash sets
a flag (white labels); wrong unprompted inputs outside windows stay ignored.
- Endurance windows: `onMiss: "restart"` (replay clip, tighter windows), `maxRestarts`.
- Hold windows: `hold: true` — input must be held from window open to close.
## Player loop (player.js structure) ## Player loop (player.js structure)
1. **Boot**: fetch scenes.json → preload manifest. 1. **Boot**: fetch scenes.json → preload manifest.
2. **Preloader**: two `<video>` elements, A/B swap. While A plays scene N, B preloads 2. **Preloader**: two `<video>` elements, A/B swap. While A plays scene N, B preloads

File diff suppressed because one or more lines are too long