Record Store Guy: master plan, worlds design, engine spec, production bible
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
commit
9a5ed2d02b
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
engine/clips/*.mp4
|
||||
production/raw/
|
||||
.DS_Store
|
||||
*.env
|
||||
96
ENGINE.md
Normal file
96
ENGINE.md
Normal file
@ -0,0 +1,96 @@
|
||||
# RECORD STORE GUY engine spec — FMV QTE player
|
||||
|
||||
Pure static web app: no build step, no framework, no server logic. One HTML file,
|
||||
one JS file, one CSS file, one JSON scene graph, a folder of mp4 clips. Must run
|
||||
from `python3 -m http.server` locally and from nginx on the games VPS unchanged.
|
||||
|
||||
## Files
|
||||
```
|
||||
engine/
|
||||
index.html shell: <video>, overlay divs, HUD
|
||||
player.js all logic (~400 lines, vanilla ES6, no deps)
|
||||
styles.css arcade look: scanlines, CRT vignette, neon HUD
|
||||
scenes.json the scene graph (authored data, engine reads it verbatim)
|
||||
clips/*.mp4 24fps 1280x720 h264+aac, named <scene_id>_<kind>.mp4
|
||||
```
|
||||
|
||||
## scenes.json schema
|
||||
```jsonc
|
||||
{
|
||||
"meta": { "title": "RECORD STORE GUY", "lives": 5, "version": 1 },
|
||||
"start": "s01_entrance",
|
||||
"scenes": {
|
||||
"s01_entrance": {
|
||||
"clip": "clips/s01_action.mp4", // the scene's action clip
|
||||
"death": "clips/s01_death.mp4", // played on fail, then retry scene
|
||||
"windows": [ // 1..n QTE windows within the clip
|
||||
{
|
||||
"t": [3.2, 3.9], // seconds: window open..close
|
||||
"input": "right", // right|left|up|down|action (action = space/enter/click)
|
||||
"cue": true // show the flashing direction cue at t[0]
|
||||
}
|
||||
],
|
||||
"onSuccess": "s02_aisles", // next scene id, or "WIN"
|
||||
"checkpoint": false // true = death respawns here, not act start
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
Rules the engine enforces:
|
||||
- Input BEFORE the window opens = instant fail (Dragon's Lair rule — no button mashing).
|
||||
Grace: inputs in the 250ms before t[0] fail; earlier inputs are ignored (idle fidget).
|
||||
- No input by t[1] = fail. Wrong direction = fail.
|
||||
- Multiple windows per clip run in sequence; all must pass.
|
||||
- On fail: swap to death clip immediately (seek 0, play), then decrement lives.
|
||||
Lives 0 → game-over screen → attract. Otherwise retry the scene (or last checkpoint).
|
||||
- On success of last window: let action clip finish, then advance to onSuccess.
|
||||
|
||||
## Player loop (player.js structure)
|
||||
1. **Boot**: fetch scenes.json → preload manifest.
|
||||
2. **Preloader**: two `<video>` elements, A/B swap. While A plays scene N, B preloads
|
||||
scene N's death clip first (most likely next need), then N+1's action clip, via
|
||||
`preload="auto"` + `load()`. Also `fetch()` + blob-URL cache for clips ≤ ~8MB to
|
||||
guarantee gapless swap. Show % bar on boot for first 3 clips only.
|
||||
3. **Clock**: drive QTE timing off `video.currentTime` polled in `requestAnimationFrame`
|
||||
(NOT wall-clock setTimeout — survives decode stutter/tab throttling).
|
||||
4. **Input**: keydown (arrows + space/enter) and touch (swipe quadrants + tap = action).
|
||||
Map gamepad later (Gamepad API, d-pad + A). Ignore key auto-repeat.
|
||||
5. **Cue rendering**: at window open, flash a chunky neon arrow (direction) or ring
|
||||
(action) center-low on screen, CSS animation ~300ms pulse. Dragon's Lair barely
|
||||
cued; we cue by default — `cue:false` per window for hard mode later.
|
||||
6. **HUD**: lives as record icons top-left, scene name bottom-left (debug only), score
|
||||
= scenes cleared × 1000 minus deaths × 100, arcade font.
|
||||
7. **States**: ATTRACT (loop attract.mp4 or title card + "PRESS ANY KEY", high-score
|
||||
from localStorage) → PLAYING → DEATH → GAMEOVER → WIN (win.mp4 → credits → attract).
|
||||
8. **Debug mode** (`?debug=1`): timeline scrubber, windows drawn as colored bands on a
|
||||
bar under the video, current input state, frame-step keys (,/.), scene jump dropdown.
|
||||
This is how we'll tune every window against real Flow clips — build it FIRST.
|
||||
|
||||
## Feel-tuning constants (top of player.js, tweak in one place)
|
||||
```js
|
||||
const WINDOW_DEFAULT = 0.7; // s — default window length if authoring shorthand used
|
||||
const EARLY_GRACE = 0.25; // s before open where input = fail
|
||||
const DEATH_HOLD = 0.6; // s to hold last death frame before retry fade
|
||||
const CUE_LEAD = 0.0; // s to show cue before window opens (bump to 0.15 if too hard)
|
||||
```
|
||||
|
||||
## Placeholder clips — tools/make_placeholders.sh
|
||||
Generates test clips so the whole game is playable before any Flow spend. For each
|
||||
scene in scenes.json: 5s 1280x720 clip, solid color per scene, huge scene-id text,
|
||||
and at each QTE window a white flash + 1kHz beep + arrow glyph burned in at exactly
|
||||
t[0]..t[1] (drawtext + sine + overlay enable='between(t,A,B)'). Death placeholders =
|
||||
red background + "DEATH sXX". ffmpeg one-liner per clip; script reads scenes.json
|
||||
with python3 -c json. Also make attract/gameover/win placeholders.
|
||||
Ship scenes.json with 3 authored placeholder scenes so the loop is provable end-to-end.
|
||||
|
||||
## Post-processing real clips — tools/postprocess.sh
|
||||
`postprocess.sh <in.mp4|dir> <scene_id> <action|death>` → trim silence/dead frames
|
||||
(args for in/out points), scale/pad to 1280x720, 24fps, `-c:v libx264 -crf 20
|
||||
-pix_fmt yuv420p -movflags +faststart`, silent aac track if none (uniform streams =
|
||||
gapless swaps), output to engine/clips/ with canonical name, print duration so the
|
||||
author can set windows. Keep originals in production/raw/ untouched.
|
||||
|
||||
## Deploy
|
||||
rsync engine/ to botchat games VPS per deploy-map skill; it's static. Cache-bust
|
||||
scenes.json + player.js with ?v= query from meta.version. Verify live by curling
|
||||
the URL and loading in browser. ship-check before public link.
|
||||
123
PLAN.md
Normal file
123
PLAN.md
Normal file
@ -0,0 +1,123 @@
|
||||
# RECORD STORE GUY — master execution plan
|
||||
*(title FINAL — John's executive call, 2026-07-19)*
|
||||
|
||||
Dragon's Lair / Space Ace-style FMV QTE game: a guy in a record store surviving
|
||||
escalating, ridiculous, surreal hazards — the floor floods into a shark ocean,
|
||||
turns to lava, the roof rips off into space, the store goes full Tron. Uncharted-
|
||||
level setpiece adrenaline + Dragon's Lair wrong-move-you're-dead urgency + comedy.
|
||||
AI-generated 4–5s clips (Google Flow / Veo, John's 9000 paid credits) strung
|
||||
together by a web player demanding precisely-timed inputs. Creative design of the
|
||||
worlds/setpieces: **WORLDS.md** (read it after this file).
|
||||
|
||||
**Division of labor (hard rule):**
|
||||
- **Google Flow (9000 credits)** = ONLY the final in-game video clips. John paid for
|
||||
these and wants them used — but never wasted on tests that FLUX can do.
|
||||
- **MODELBEAST FLUX (`flux_local`, free, ~9s/image)** = all concept art, character
|
||||
bible references, style frames, marketing art, and the stills we upload to Flow
|
||||
as "ingredients" for character consistency.
|
||||
- **MODELBEAST local video ops** = optional pre-viz/animatics only, never final clips.
|
||||
|
||||
## Environment facts (verified 2026-07-19 on m3ultra)
|
||||
- MODELBEAST queue **UP**: `http://100.89.131.57:8777` (34 operators). This machine
|
||||
(m3ultra) IS the primary.
|
||||
- CLI: `~/Documents/MODELBEAST/mb` (stdlib-only python). Needs `MB_TOKEN` env var.
|
||||
**Token was NOT found on m3ultra** — it lives in `~/Documents/backnforth/.env` on
|
||||
**ultra** (per fleet skill), or create/read one via MODELBEAST web UI ⚙ Settings →
|
||||
Users → token, or `scripts/users.py`. Read from disk; never print/commit it.
|
||||
Example: `MB_TOKEN=$(ssh ultra@100.91.239.7 'grep MB_TOKEN ~/Documents/backnforth/.env | cut -d= -f2')` — or ask John which token to use. Guest tokens cap at 4 active jobs.
|
||||
- ffmpeg: `/opt/homebrew/bin/ffmpeg` ✅
|
||||
- Project dir created: `~/Documents/recordstoreguy/` with `bible/concept/`, `engine/clips/`, `tools/`.
|
||||
|
||||
## Phases
|
||||
|
||||
### Phase 1 — Engine shell with placeholder clips (zero credits)
|
||||
Build the full player before any real video exists. Placeholders prove the QTE feel.
|
||||
Spec: `ENGINE.md`. Placeholder generator: `tools/make_placeholders.sh` (ffmpeg
|
||||
test-pattern clips with big text + a visual "beep" flash at the QTE window so timing
|
||||
is testable by eye). Definition of done: playable in browser start→3 scenes→death→
|
||||
retry→win, lives counter, attract loop, debug overlay showing windows.
|
||||
|
||||
### Phase 2 — Bible + FLUX concept art (zero credits)
|
||||
`bible/BIBLE.md` holds the verbatim STYLE/CHARACTER/SET blocks (drafted — see file).
|
||||
Generate concept art on MODELBEAST; iterate until John approves each. Commands:
|
||||
|
||||
```sh
|
||||
cd ~/Documents/MODELBEAST
|
||||
export MB_TOKEN=... # from disk, see above
|
||||
./mb run flux_local -p prompt="<PROMPT>" -p seed=<N> --wait --download ~/Documents/recordstoreguy/bible/concept/
|
||||
```
|
||||
|
||||
Concept shot list (full prompts in BIBLE.md §Concept-art prompts):
|
||||
1. `hero_sheet` — Dez full-body turnaround, neutral pose, front+side
|
||||
2. `hero_face` — close-up head, 3/4 view (this becomes the Flow ingredient)
|
||||
3. `villain` — the antagonist (direction TBD with John — see Open Decisions)
|
||||
4. `store_wide` — the record store master set, wide establishing
|
||||
5. `store_backroom` — second set (stockroom / listening booth)
|
||||
6. `style_frame` — one full "this is what the game looks like" money shot
|
||||
7. `death_concept` — one comedic death (shelf of crates toppling)
|
||||
8. `title_card` — RECORD STORE GUY logo/marquee concept
|
||||
Run 3–4 seeds each, keep best. Free, so iterate hard BEFORE touching Flow.
|
||||
|
||||
### Phase 3 — Flow consistency test (~100 credits MAX, gated on John's approval)
|
||||
In Google Flow (browser; John logs in himself — never handle his credentials):
|
||||
1. Upload approved `hero_face` + `hero_sheet` FLUX stills as **ingredients**.
|
||||
2. Generate 5 test clips, Veo Fast (~20 cr each): same character, same set block,
|
||||
5 different one-sentence actions (walk-in, duck, grab record, get scared, run).
|
||||
3. Judge: does the face/outfit/style hold across clips? Log verdicts in
|
||||
`production/SHOTLOG.csv`. If it holds → green-light full production. If not →
|
||||
revise ingredients/style block with more FLUX iterations and retest (another ~100).
|
||||
|
||||
### Phase 4 — Story + scene graph (with John — mise en scène discussion)
|
||||
Creative direction now drafted in `WORLDS.md` (premise, 7 worlds, setpieces, deaths,
|
||||
clip budget). Remaining work this phase: John iterates WORLDS.md, then:
|
||||
- `scenes.json` fully authored (schema in ENGINE.md) with per-scene prompt sheets in
|
||||
`production/prompts/` — each sheet is the verbatim template with only the action
|
||||
sentence and camera line filled in.
|
||||
|
||||
### Phase 5 — Batch production in Flow (the 9000 credits)
|
||||
Budget: 9000 cr ≈ 450 Veo Fast gens. Keep-rate assumption 1-in-2.5 → ~180 usable
|
||||
clips. Target game: ~35 scenes × (1 action clip + 1 death clip) + intro + attract +
|
||||
game-over + win ≈ **80 final clips** → ~200–280 gens spent, leaving reserve for
|
||||
hero-moment quality gens (100 cr each, use sparingly: intro, final scene, best deaths).
|
||||
Discipline:
|
||||
- Work scene-by-scene from prompt sheets; NEVER freestyle a prompt in Flow.
|
||||
- Frame-chain within a scene (last frame → start frame / Flow extend) for continuity;
|
||||
hard cuts between scenes hide the rest.
|
||||
- Log every gen in `production/SHOTLOG.csv`: `scene_id,take,credits,verdict,notes`.
|
||||
Running credit total in the log; stop and re-plan if burn rate exceeds 2× budget line.
|
||||
- Download keepers to `production/raw/`, then `tools/postprocess.sh` (ffmpeg: trim,
|
||||
normalize to 24fps 1280×720 h264 + aac silent/or SFX bed, name `<scene_id>_<kind>.mp4`)
|
||||
into `engine/clips/`.
|
||||
|
||||
### Phase 6 — Sound + deploy
|
||||
- SFX/music: needle-drop crackle bed + stingers. (m1max is the audio machine but
|
||||
disk-critical — keep audio work local or ask John.)
|
||||
- Deploy: static site → botchat games VPS (`humanjing@100.71.119.27`, docker) next to
|
||||
the other partly.party games, per deploy-map skill. Verify live with cache-busted curl.
|
||||
- Run ship-check skill before exposing publicly.
|
||||
|
||||
## Decisions status
|
||||
1. **Title**: ✅ RECORD STORE GUY (final, John 2026-07-19).
|
||||
2. **Premise/worlds/tone**: ✅ surreal escalating setpiece worlds, Uncharted chaos +
|
||||
comedy deaths — designed in WORLDS.md (John reviews/iterates the specifics).
|
||||
3. **Art style**: OPEN — plan assumes 80s hand-drawn cel (Bluth-adjacent); alt is
|
||||
live-action FMV cheese. Style block in BIBLE.md is written for cel — decide before Phase 3.
|
||||
4. **Hero design**: OPEN — "Dez" is a placeholder design; John approves/redirects at
|
||||
concept-art review.
|
||||
5. **Villain**: recommended **The Dead Wax** (fits WORLDS.md arc) — confirm with John.
|
||||
|
||||
## File map
|
||||
```
|
||||
recordstoreguy/
|
||||
PLAN.md ← this file (master; Opus starts here)
|
||||
WORLDS.md ← creative design: premise, 7 worlds, setpieces, QTEs, deaths, clip budget
|
||||
ENGINE.md ← full engine spec (schema, player loop, QTE rules, placeholder script spec)
|
||||
bible/BIBLE.md ← style/character/set blocks, prompt grammar, concept-art prompts, Flow workflow
|
||||
bible/concept/ ← FLUX outputs land here
|
||||
engine/ ← index.html, player.js, styles.css, scenes.json, clips/
|
||||
tools/ ← make_placeholders.sh, postprocess.sh
|
||||
production/ ← (Phase 4+) prompts/, raw/, SHOTLOG.csv
|
||||
```
|
||||
Git: repo lives at `~/Documents/recordstoreguy`, remote already configured:
|
||||
`origin ssh://git@100.71.119.27:222/monster/recordstoreguy.git` (Gitea). Never commit
|
||||
tokens; engine/clips + production/raw are gitignored (video bulk stays out of git).
|
||||
163
WORLDS.md
Normal file
163
WORLDS.md
Normal file
@ -0,0 +1,163 @@
|
||||
# RECORD STORE GUY — worlds & setpiece design (v1 draft for John's review)
|
||||
|
||||
Tone target: **Uncharted setpiece adrenaline × Dragon's Lair urgency × Looney Tunes
|
||||
comedy.** Everything is always collapsing, flooding, erupting, or chasing the guy
|
||||
toward camera, and every wrong/late input is an instant, funny, held-tableau death.
|
||||
Because every clip is generated to exact spec, there is zero cost difference between
|
||||
"guy trips over a crate" and "the ocean is a spinning turntable whirlpool with a
|
||||
needle arm crashing down" — so we ALWAYS pick the wilder shot.
|
||||
|
||||
## Premise (one screen, shown as the intro clip)
|
||||
Closing time, night shift. The guy finds an unlabeled record in the returns bin,
|
||||
shrugs, drops the needle. The run-out groove bleeds black liquid vinyl — **the Dead
|
||||
Wax** — and the store starts *playing* him: each "track" warps the shop into a new
|
||||
hostile world. Survive all seven tracks, reach the turntable, and lift the tonearm
|
||||
at the exact right beat to end it.
|
||||
|
||||
Structure = a record: **7 worlds = 7 tracks**, side A (1–3) escalates the store, side
|
||||
B (4–6) leaves reality entirely, track 7 is the boss. Between worlds: a 2s "needle
|
||||
skip" transition clip (screen judders like a skipping record) — hides all continuity
|
||||
drift and became our scene-change idiom for free.
|
||||
|
||||
## The worlds
|
||||
|
||||
### Track 1 — CLOSING TIME (tutorial; the shop turns hostile)
|
||||
Set block: BIBLE SET-A (store floor, night, neon).
|
||||
Scenes (~4): shelf avalanche dodge (←), giant rolling 12" chases him down the aisle
|
||||
Indiana-Jones-boulder style (sprint, ↑ to vault the counter), cassette-tape tentacles
|
||||
burst from the bargain bin and whip at his ankles (jump →), ceiling fan rips loose
|
||||
and helicopters at head height (duck ↓).
|
||||
Deaths: flattened under crate avalanche, sneakers-and-thumbs-up tableau · steamrolled
|
||||
into a groove-embossed pancake by the rolling 12" · mummified in brown cassette tape,
|
||||
eyes blinking.
|
||||
|
||||
### Track 2 — SIDE A / SEA (the flood)
|
||||
Set block v1: > the record store flooded into an open ocean at night, aisles of
|
||||
> wooden record racks bobbing like rafts on rolling waves, neon store signs glowing
|
||||
> underwater, spray and foam, no walls, horizon of black water under a starless sky.
|
||||
Scenes (~5): floor liquefies, scramble onto a floating rack (↑) · rack-to-rack jumps
|
||||
across swells, timed to the wave peaks (→,→) · **shark run**: fins circle — the fins
|
||||
are records — sharks with vinyl dorsal fins lunge as he crosses a chain of half-
|
||||
sunk crates (←,↑) · whirlpool: the whole ocean starts SPINNING like a platter, a
|
||||
skyscraper-sized tonearm swings down, ride the outer groove-current and leap the
|
||||
needle as it plows past (action) · escape: surf a floating gatefold sleeve down a
|
||||
wave toward the stockroom door (→, action).
|
||||
Deaths: swallowed whole, camera holds on the shark burping out headphones · sucked
|
||||
down the spindle-hole at the whirlpool's center like a draining tub, glug ·
|
||||
mistimed jump, faceplants a rack that tips him in with theatrical slow topple.
|
||||
|
||||
### Track 3 — HOT WAX (lava)
|
||||
Set block v1: > the record store as a volcanic cavern, floor of glowing molten
|
||||
> orange vinyl, record crates floating like obsidian rafts, dripping melted records
|
||||
> hanging from shelves like stalactites, ember flecks in the air, red-black palette.
|
||||
Scenes (~4): hop the crate stepping-stones as they sink one beat after landing
|
||||
(→,→,↑ rhythm section — this is the "musical" QTE scene) · melted-record stalactite
|
||||
drips a lava blob — sidestep (←) · **sleeve-dactyls**: gatefold album covers flap off
|
||||
the walls like pterodactyls and dive-bomb (duck ↓, then action to swat one with a
|
||||
crate lid) · geyser finale: molten wax geysers erupt in sequence down the aisle,
|
||||
run the gauntlet toward camera, Uncharted-style collapse escape (↑,→, action).
|
||||
Deaths: sinks slowly into molten vinyl giving a solemn Terminator thumbs-up ·
|
||||
snatched by a sleeve-dactyl, exits screen-right screaming, feather (single record)
|
||||
floats down · one beat late on a geyser — launched skyward, lands as a freshly
|
||||
pressed 7" with his face as the label.
|
||||
|
||||
### Track 4 — B-SIDE / SPACE (roof rips off)
|
||||
Set block v1: > the record store torn open to deep space, shelving units drifting
|
||||
> in zero gravity trailing debris fields of floating records, Earth tiny below,
|
||||
> nebula light in purple and teal, the guy in a fishbowl bubble helmet formed from
|
||||
> his headphones' glow, silent starfield.
|
||||
Scenes (~5): decompression — grab a shelf as everything goes weightless (action) ·
|
||||
zero-g leaps between drifting racks, momentum only, one chance per push (→,↑) ·
|
||||
asteroid field of tumbling records — weave (←,→,←) · **the black hole spindle**: a
|
||||
spindle-shaped singularity starts pulling the whole debris field into orbit —
|
||||
slingshot around it Interstellar-style by kicking off a passing Marantz amplifier
|
||||
(action at perihelion, the hardest window in the game) · re-entry: ride a flaming
|
||||
record like a heat-shield surfboard back down through the atmosphere (hold ↓, then
|
||||
action to bail into the store's chimney).
|
||||
Deaths: drifts away slowly, tiny, waving politely forever · spaghettified into a
|
||||
long thin groove around the spindle singularity · re-entry mistimed — arrives as a
|
||||
smoking crater in the checkerboard floor, hand emerges holding the record, unharmed.
|
||||
|
||||
### Track 5 — THE GRID (sucked into the hi-fi — Tron world)
|
||||
Set block v1: > inside a computerized hi-fi system rendered as a neon wireframe
|
||||
> world, glowing cyan and magenta grid floor like a giant equalizer, towers of
|
||||
> circuit-board skyscrapers, records rendered as glowing light-discs, black sky
|
||||
> with scrolling waveform aurora, the guy outlined in neon piping.
|
||||
Scenes (~5): equalizer floor — the grid tiles are EQ bars pumping to the bass, cross
|
||||
during the quiet bars (→ on the beat, ✕2) · **light-disc battle**: Dead Wax security
|
||||
programs (faceless neon figures) fling light-discs — deflect (←), catch (action),
|
||||
throw back (→): first real "combat" volley of the game, 3-input chain · derezz
|
||||
tunnel: a wall of static deletion sweeps the corridor, outrun it toward camera (↑,↑)
|
||||
· hack the gate: giant spinning platter-lock, hit the action input when the groove
|
||||
gap aligns (action) · escape on a light-cycle that is obviously a Technics 1200
|
||||
with wheels (hold →, then ↑ off the ramp).
|
||||
Deaths: derezzes into pixels that reform as a sad 8-bit sprite of himself, bloop ·
|
||||
takes a light-disc to the chest, freezes, falls over rigid like a mannequin, clang ·
|
||||
light-cycle wipeout — respawns momentarily as a screensaver bouncing between screen
|
||||
edges.
|
||||
(Tron-adjacent styling note: neon-grid aesthetic is fine; avoid literal TRON
|
||||
trade-dress terms in prompts — our version is "inside a hi-fi", discs are records.)
|
||||
|
||||
### Track 6 — THE RUN-OUT (inside the groove — the Dead Wax's home)
|
||||
Set block v1: > a surreal endless landscape inside a record's run-out groove, black
|
||||
> glossy vinyl canyons with concentric ridge walls curving to the horizon, a distant
|
||||
> impossibly huge chrome needle plowing the groove like a ship's prow, dust motes
|
||||
> the size of boulders, single spotlight sun, oppressive silence.
|
||||
Scenes (~4): canyon sprint as THE NEEDLE plows up the groove behind him, monolith-
|
||||
sized, throwing a bow-wave of shredded vinyl (↑, →, ↑ escalating chase — the
|
||||
scariest sequence, minimal comedy, earn the finale) · boulder-dust storm — shelter
|
||||
in a scratch crevice at the right instant (↓) · groove-wall ridge-run: the walls
|
||||
ripple with the music, ride a ripple crest up and over into the next groove (→ at
|
||||
the crest) · the label: reach the paper label — a vast circular plain — as black
|
||||
tendrils erupt from the spindle hole ahead (final approach, action).
|
||||
Deaths: the needle catches him — screen-filling white scratch-noise flash, then he's
|
||||
a click in the groove forever (the one genuinely eerie death; earn it) · buried by a
|
||||
dust boulder, pops out coughing a 78rpm shellac · mistimes the ridge-run and is
|
||||
flung into the next groove over, has to watch himself rerun the same scene (meta gag).
|
||||
|
||||
### Track 7 — THE DEAD WAX (boss)
|
||||
Set block v1: > the record store restored but wrong, bathed in black glossy liquid
|
||||
> vinyl dripping upward, the Dead Wax towering as a shifting mass of molten records
|
||||
> and tonearm limbs over the sacred glowing turntable altar at the listening booth.
|
||||
Structure — three QTE volleys, Dragon's Lair final-dragon style:
|
||||
1. **Tendril storm**: dodge chain ←,↓,→ as vinyl tendrils smash the floor.
|
||||
2. **The remix**: the Dead Wax replays hazards from every world in 1s flashes (shark!
|
||||
geyser! disc! needle!) — 4-input rapid chain, one per callback. Victory-lap scene
|
||||
that reuses the audience's training.
|
||||
3. **The needle drop**: the guy leaps onto the spinning platter, runs against its
|
||||
rotation in place toward the tonearm, and must LIFT THE NEEDLE on the exact final
|
||||
beat of the music (action, tightest window in the game, 0.4s).
|
||||
Win clip: needle lifts → the Dead Wax deflates into an ordinary record with a
|
||||
"PROMO — NOT FOR SALE" sticker → dawn light, store normal, he sleeves the record,
|
||||
files it under "Misc", sips cold coffee. Stinger after credits: the store cat paws
|
||||
the record back out of the bin. RECORD STORE GUY WILL RETURN.
|
||||
Boss deaths: pressed between two giant platters into a limited-edition picture disc
|
||||
of his own face · the remix callbacks get him in whichever way he failed most (if
|
||||
engine tracks death stats, pick that clip — cheap personalization, huge laugh).
|
||||
|
||||
## Death design rules (the comedy engine)
|
||||
- Wile E. Coyote physics: instant, absurd, painless-looking, held tableau for
|
||||
DEATH_HOLD, hero always intact on retry. Never gore.
|
||||
- Every death is a *punchline to the specific mistake* — late jump gets a different
|
||||
death than wrong direction where the budget allows.
|
||||
- Budget trick: each world gets ONE generic world-death (splash/sink/derezz) shared
|
||||
across its scenes + scene-specific deaths only for the setpiece scenes. Dragon's
|
||||
Lair reused deaths constantly; nobody minded.
|
||||
|
||||
## Clip budget vs the 9000 credits
|
||||
| Bucket | clips | gens @1-in-2.5 keep | credits (Fast=20) |
|
||||
|---|---|---|---|
|
||||
| Action scenes: 31 (4+5+4+5+5+4+4 incl. boss volleys) | 31 | ~78 | ~1560 |
|
||||
| Deaths: 7 world-generic + ~14 scene-specific | 21 | ~53 | ~1060 |
|
||||
| Needle-skip transitions (1 per world, reused) | 7 | ~14 | ~280 |
|
||||
| Intro, win, stinger, attract, game-over | 5 | ~15 | ~300 |
|
||||
| Quality-tier re-shoots of ~8 hero moments (@100) | — | ~12 | ~1200 |
|
||||
| **Total** | **~64** | | **~4400** |
|
||||
Leaves ~4600 credits of contingency — enough to survive a 1-in-4 keep rate or add
|
||||
a whole bonus world (John will have ideas). Discipline rules in PLAN.md Phase 5 apply.
|
||||
|
||||
## QTE difficulty curve
|
||||
Track 1 windows 0.9s single inputs → mid-game 0.7s with 2–3 chains → Track 6 chase
|
||||
0.6s → boss finale 0.4s. Checkpoint at the start of each track (checkpoint:true),
|
||||
5 lives, so a run is tense but finishable — Dragon's Lair quarter-munching cruelty
|
||||
is the vibe, not the economics.
|
||||
93
bible/BIBLE.md
Normal file
93
bible/BIBLE.md
Normal file
@ -0,0 +1,93 @@
|
||||
# RECORD STORE GUY — production bible (v0 draft, pending John's art review)
|
||||
|
||||
The whole consistency strategy: **nothing is ever prompted freestyle.** Every image
|
||||
(FLUX) and every clip (Flow/Veo) is assembled from the verbatim blocks below plus
|
||||
ONE shot-specific action sentence and ONE camera line. Blocks are copy-pasted
|
||||
character-for-character. Edit a block → bump its version and regenerate the
|
||||
ingredient stills before generating any more clips with it.
|
||||
|
||||
## STYLE BLOCK v1 (verbatim in every prompt, FLUX and Flow)
|
||||
> 1980s hand-drawn cel animation, theatrical animated feature quality, thick
|
||||
> confident ink outlines, rich painterly gouache backgrounds, dramatic colored
|
||||
> rim lighting, saturated jewel-tone palette with deep shadows, subtle film grain,
|
||||
> 2D animation cel look, no photorealism, no 3D render, no CGI.
|
||||
|
||||
(If John flips to live-action FMV cheese, replace with: "early 1990s live-action
|
||||
full-motion-video game footage, shot on Betacam, slightly soft, practical neon
|
||||
lighting, theatrical overacting" — and regenerate everything. Decide BEFORE Phase 3.)
|
||||
|
||||
## HERO BLOCK v1 — "Dez" (placeholder design, John approves at concept review)
|
||||
> Dez, a lanky 20-something record store clerk with a tall messy black quiff,
|
||||
> olive skin, thick eyebrows, wearing an open red flannel shirt over a faded black
|
||||
> band t-shirt, rolled dark jeans, scuffed white hi-top sneakers, oversized silver
|
||||
> headphones worn around the neck, expressive rubber-limbed animation acting.
|
||||
|
||||
Notes: silhouette-first design (quiff + flannel + neck headphones reads at any
|
||||
size/angle — that's what survives gen drift). Keep clothing colors primary and few.
|
||||
|
||||
## VILLAIN candidates (pick one with John, then write VILLAIN BLOCK v1)
|
||||
1. **The Dead Wax** — an entity living in run-out grooves; black liquid vinyl that
|
||||
drips out of records and takes shapes. Great for varied deaths, easy consistency
|
||||
(it's a black glossy mass — gen drift can't hurt it). *(recommended)*
|
||||
2. **Mildred** — possessed store cat, eyes like spinning 45 adapters.
|
||||
3. **The Audiophile** — tyrannical ghost of the store's founder, cable-tentacles,
|
||||
tube-amp glow chest.
|
||||
|
||||
## SET BLOCKS v1
|
||||
**SET-A store floor:** > inside a cluttered independent record store at night, rows
|
||||
> of wooden crates packed with vinyl records, walls covered in gig posters and
|
||||
> album sleeves, a buzzing neon sign glowing red and cyan, dusty air, single
|
||||
> flickering fluorescent tube, checkerboard floor.
|
||||
|
||||
**SET-B backroom:** > the record store stockroom, floor-to-ceiling industrial
|
||||
> shelving stacked with record boxes, a single hanging bulb, a service hatch,
|
||||
> cobwebs, teetering towers of 7-inch singles.
|
||||
|
||||
**SET-C listening booth:** > a vintage wood-paneled listening booth with a glowing
|
||||
> turntable console, padded walls, a porthole window, warm amber light.
|
||||
|
||||
(3 sets is enough for a full gauntlet — Dragon's Lair reused rooms shamelessly.
|
||||
Add SET-D "the groove" (surreal inside-the-record void, black glossy landscape,
|
||||
concentric ridges to the horizon) if we pick villain #1.)
|
||||
|
||||
## PROMPT GRAMMAR
|
||||
**FLUX still:** `[STYLE] [HERO or VILLAIN] [SET] [pose/expression sentence] [framing line]`
|
||||
**Flow clip:** `[STYLE] [HERO] [VILLAIN if present] [SET] [ACTION: one sentence, one
|
||||
verb chain, ≤25 words] [CAMERA: one line, e.g. "static wide shot" / "slow push-in"]`
|
||||
Rules:
|
||||
- ONE action per clip. Veo garbles compound choreography. A scene needing two beats
|
||||
= two clips frame-chained.
|
||||
- Name the character every time ("Dez ducks…" never "he ducks…").
|
||||
- Camera: default static or slow push — wild moves amplify drift.
|
||||
- Deaths end on a held comedic tableau (readable freeze for DEATH_HOLD).
|
||||
- Negative/avoid line on every gen: "no text, no captions, no watermark, no extra
|
||||
people, no photorealism."
|
||||
|
||||
## FLOW WORKFLOW (Phase 3+; John drives the browser/login, never Claude with credentials)
|
||||
1. Ingredients: upload approved FLUX `hero_face` + `hero_sheet` (+ villain still).
|
||||
Every clip gen uses ingredients-to-video referencing them.
|
||||
2. Veo Fast (~20 cr) for all takes; quality (~100 cr) reserved for intro/win/hero deaths.
|
||||
3. Within-scene continuity: Flow "extend" / last-frame→first-frame chaining.
|
||||
Between scenes: hard cuts (hide drift; it's the Dragon's Lair idiom anyway).
|
||||
4. 16:9, and trim in post — never re-gen to fix length (postprocess.sh trims free).
|
||||
5. Log EVERY gen in production/SHOTLOG.csv before the next gen:
|
||||
`date,scene_id,take,mode,credits,verdict(keep/reject),drift_notes`.
|
||||
|
||||
## CONCEPT-ART PROMPTS (Phase 2, MODELBEAST flux_local, free — iterate hard)
|
||||
Compose per grammar above. Shot list + specific final sentences:
|
||||
1. `hero_sheet`: "character model sheet, full body turnaround, front view and side
|
||||
view, neutral standing pose, plain warm gray background" *(omit SET)*
|
||||
2. `hero_face`: "close-up head and shoulders portrait, three-quarter view, confident
|
||||
smirk, plain warm gray background" *(omit SET — this is the prime Flow ingredient)*
|
||||
3. `villain`: per chosen candidate + "emerging menacingly, full figure, dramatic low angle"
|
||||
4. `store_wide`: STYLE + SET-A + "wide establishing shot, empty of people, moody" *(omit HERO)*
|
||||
5. `store_backroom`: STYLE + SET-B same treatment
|
||||
6. `style_frame`: full grammar, SET-A, "Dez frozen mid-leap over a toppling crate of
|
||||
records as black vinyl tendrils snatch at his ankles, dramatic wide shot" — the money shot
|
||||
7. `death_concept`: SET-A, "Dez flattened under an avalanche of record crates, only
|
||||
sneakers and one hand visible giving a weak thumbs-up, comedic tableau"
|
||||
8. `title_card`: "vintage 1983 arcade cabinet marquee art with the title RECORD STORE GUY in
|
||||
chrome airbrushed lettering over a black vinyl record dripping like liquid" *(text
|
||||
WILL come out mangled — it's concept only; real logo gets drawn/typeset later)*
|
||||
Run seeds 1–4 per shot (`-p seed=N`), pick best, file as
|
||||
`bible/concept/<shot>_v1_s<seed>.png`. John reviews before anything touches Flow.
|
||||
Loading…
Reference in New Issue
Block a user