DESIGN.md: depth roadmap — classes, real-record trainspotting, bosses, art plan
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
a4ec2e7dd4
commit
2008668cb2
185
DESIGN.md
Normal file
185
DESIGN.md
Normal file
@ -0,0 +1,185 @@
|
||||
# VINYL GAUNTLET — depth design doc
|
||||
|
||||
*Where to take the game after the core loop. Written 2026-07-15, after Steps 1–7 shipped
|
||||
and the game went live at partly.party/vinylgauntlet. Companion to plan.md (which is done).*
|
||||
|
||||
## Where we are
|
||||
|
||||
The Gauntlet II skeleton works and is fun-as-rectangles-now-sprites: vibe drain, discount-bin
|
||||
generators, swarms, Sound Guy, airhorn, trainspot-to-exit, 3 hand-authored levels, announcer.
|
||||
What it lacks is exactly what Gauntlet II had that we haven't used yet — **classes, treasure,
|
||||
secrets, "shot the food", infinite depth** — plus the thing only WE can do: **real record data.**
|
||||
|
||||
Design constraints:
|
||||
- **cratewars owns buy/sell economy** (DopeWars clone). No shop/economy sim here — a nod at most.
|
||||
- All art is free via MODELBEAST flux_local (assets/queue.json → enqueue → collect → process).
|
||||
- partly.party audience includes phones (GAMES/CLAUDE.md: test Pixel-6-Pro width). Keyboard-only
|
||||
is leaving players on the table.
|
||||
- 9 generated assets already sitting unwired: record_pirate, crate_ghoul, goldrecord, turntable,
|
||||
lamp, checker/carpet floors, shelf/poster walls.
|
||||
|
||||
## The one big idea: trainspotting is real
|
||||
|
||||
We have `discogs_full` (10.4M records, local Postgres). Extract a curated JSON — say 100–500
|
||||
canonical records per genre (house, techno, hip hop, jungle, disco...) with artist / title /
|
||||
label / year. When you clear a level, the DJ Booth reveals **an actual record**:
|
||||
|
||||
> *TUNE IDENTIFIED: Rhythim Is Rhythim — Strings of Life (Transmat, 1987)*
|
||||
|
||||
Every ID goes into your **Trainspotter's Notebook** (localStorage): a persistent collection log
|
||||
across runs. "I've identified 74 of 500 tunes" is a real meta-progression hook that costs almost
|
||||
nothing to build, can't be copied by anyone without the data, and literally teaches record
|
||||
culture while you play. Genre = level theme (see Level Themes below), so your notebook fills by
|
||||
scene. Rare pulls (a 1-in-50 "grail" ID, gold-tinted in the notebook) give the gambling dopamine.
|
||||
|
||||
This is the game's soul. Everything else below is good arcade meat, but this is the hook.
|
||||
|
||||
## Gameplay depth
|
||||
|
||||
### Classes (Gauntlet II's core, still unused)
|
||||
Pick your digger at the title screen. Stats only — no new mechanics, huge replay value:
|
||||
|
||||
| Class | Tweak | Fantasy |
|
||||
|---|---|---|
|
||||
| **The Digger** | +25% move speed | fast fingers, first to the bins |
|
||||
| **The Selector** | vinyl does 2 dmg (kills nerds in 1... no — kills faster, 2-shot bins) | taste is a weapon |
|
||||
| **The Promoter** | starts with 1 lanyard, +1 airhorn | knows everyone |
|
||||
| **The Sound Tech** | Sound Guy drains half; immune to Shazam projectiles | speaks his language |
|
||||
|
||||
Implementation: a `CLASSES` table + 4 title-screen sprites. One session.
|
||||
|
||||
### Vibe states (DeepSeek's best mechanic idea)
|
||||
- **> 75%: Peak Time** — vinyl flies 20% faster
|
||||
- **25–75%: normal**
|
||||
- **< 25%: Burning Out** — 15% slower move, red vignette, desperate announcer
|
||||
Three thresholds, ~20 lines, makes espresso *feel* like relief.
|
||||
|
||||
### "Shot the espresso!"
|
||||
Vinyl destroys espresso pickups on contact. Announcer: *"Selector... shot the espresso."*
|
||||
The single most-remembered Gauntlet mechanic, nearly free to add, comedy + aim discipline.
|
||||
|
||||
### Enemy roster v2 (art already generated or one queue-run away)
|
||||
| Enemy | Behavior | Art |
|
||||
|---|---|---|
|
||||
| **Record Pirate** | beelines for the nearest *pickup*, steals it, flees to a wall and despawns. Kill him → drops it back + bonus gold record | ✅ generated |
|
||||
| **Crate Ghoul** | slow tank, 3 HP, spawns from bins on later levels (30% roll) | ✅ generated |
|
||||
| **Shazam Zombie** | stationary, lobs slow "what song is this?" projectiles (new pool) | queue it |
|
||||
| **Dust Mite** | tiny, fast, 1HP, spawns in packs of 5 from floor cracks in Archive levels | queue it |
|
||||
| **Mite Queen** | miniboss every 4th level: fat, slow, periodically vomits mites; 12 HP | queue it |
|
||||
|
||||
### Bosses (the Elite, from the bestiary)
|
||||
- **The Spectral Conductor** — level 8 boss. Doesn't attack; *conducts*: while alive, all
|
||||
generators spawn at 2x and enemies move 1.5x. Kill the conductor, the room calms. 20 HP,
|
||||
teleports between corners when hit 5 times.
|
||||
- **The Monstrous 78 RPM** — final(ish) boss: a giant spinning record that ricochets around
|
||||
the room Pong-style, spitting warped-record shards. Only vulnerable when it stops to
|
||||
"change sides" every 10s. Beat it → it IS the White Label (see Lore).
|
||||
|
||||
### Digging (hold E at crate walls)
|
||||
2-second channel, vulnerable, at any *wall_crate* tile (once per tile):
|
||||
- 70% common: +200 vibe · 25% rare: gold record (score) · 4% **Grail**: full vibe + flash
|
||||
- 1% **Bootleg**: every enemy on screen aggros you, announcer cackles
|
||||
Injects push-your-luck into wall geometry. The bestiary's "digging minigame" idea, minimal form.
|
||||
|
||||
### Treasure rooms (Gauntlet II secret sauce)
|
||||
Every 3rd level, a 20-second bonus maze: no enemies, floor covered in gold records, exit
|
||||
closes when timer ends. Pure greed, pure joy. One special map + a timer.
|
||||
|
||||
### Scoring & the arcade frame
|
||||
Score (kills ×10, gold records ×100, level clear ×500, notebook first-ID ×1000), lives = none
|
||||
(vibe IS lives, correct), **local high-score table** with 3-letter initials — it's going on
|
||||
partly.party next to an arcade landing; it should feel like a cab. Attract mode: title screen
|
||||
cycles logo → high scores → lore card → bestiary card (all art we can generate).
|
||||
|
||||
### Level themes (tilesets already half-generated)
|
||||
| Theme | Tiles | Enemy mix | Trainspot genre pool |
|
||||
|---|---|---|---|
|
||||
| **Record Shop** (lv 1–3) | parquet + crate walls ✅ | posers, nerds | disco, soul, funk |
|
||||
| **Record Fair** (lv 4–6) | carpet + shelf walls ✅ | + pirates, gatekeepers | hip hop, jazz |
|
||||
| **Club Night** (lv 7–9) | checker + poster walls ✅ | + shazam zombies, 2x sound guys | house, techno |
|
||||
| **The Archive** (lv 10+) | dark! radial light around player | mites, ghouls, queen | jungle, hardcore, white labels |
|
||||
|
||||
The Archive uses a darkness overlay (RenderTexture mask or Phaser Light2D) — visibility ~5 tiles,
|
||||
lamps (✅ generated) as light sources. Cheap dread.
|
||||
|
||||
### Procedural mazes after level 12
|
||||
Simple recursive-division maze gen seeded per-level-number: infinite game, deterministic
|
||||
(same level = same maze = speedrunnable). Hand-authored maps stay for levels 1–12.
|
||||
|
||||
### Mobile controls
|
||||
Twin-stick touch: left thumb = move (floating joystick), right thumb = fire direction,
|
||||
double-tap right = airhorn. Phaser pointer events, ~100 lines. Unlocks the actual partly.party
|
||||
audience. **This is Tier 1 important, not polish.**
|
||||
|
||||
### Co-op (later, honestly)
|
||||
Gauntlet is 4-player, and same-keyboard 2P (WASD+ZX vs arrows+,.) is one session of work —
|
||||
generators already stress-tested for swarms. Netplay: no (YAGNI until someone asks).
|
||||
|
||||
## Lore (arcade-thin, GODVERSE-flavored)
|
||||
|
||||
Keep it to attract-mode cards + one line between levels. The frame:
|
||||
|
||||
> **The last night of VINYL GAUNTLET** — the city's oldest record shop, closing forever at
|
||||
> dawn. Somewhere in its sub-basement Archive spins **The White Label**: a record with no
|
||||
> name, no artist, no year — the only tune never trainspotted. The shop won't let it go
|
||||
> quietly: the aisles rearrange, the bargain bins boil over with posers, and the Sound Guy
|
||||
> walks the walls like he owns them. You have until your vibe runs out.
|
||||
> **Dig deep. Name every tune. Reach the bottom.**
|
||||
|
||||
- Levels descend: Shop → Fair floor → Club in the basement → the Archive.
|
||||
- The announcer is the shop's ancient PA, half-senile, fully judgmental.
|
||||
- The Spectral Conductor was the shop's founder; the Monstrous 78 RPM is the White Label
|
||||
defending itself. Beat it and the notebook logs: *"??? — ??? (???, ????)" — identified.*
|
||||
Then the game loops harder (NG+ density), because the shop reopens in your dreams.
|
||||
- Cross-game nods, one-liners only: a poster tile for "CRATE WARS", a morp squeaking in a
|
||||
treasure room. partly.party shared-universe glue, zero mechanical weight.
|
||||
|
||||
## Art plan (all free on MODELBEAST)
|
||||
|
||||
Everything via the existing pipeline: add rows to `assets/queue.json` → `enqueue.py` →
|
||||
`collect.py` → `process_sprites.py`. klein-4b, ~12s/image, $0.
|
||||
|
||||
**Wire what exists first (0 generation):** pirate, ghoul, goldrecord, alt floors/walls,
|
||||
lamp, turntable (decor prop in shops).
|
||||
|
||||
**Queue batch 2 (~25 images, ~5 min GPU):**
|
||||
- Enemies: shazam_zombie, dust_mite, mite_queen, gatekeeper, warped_record_shard
|
||||
- Bosses at 768px→96px: spectral_conductor, monstrous_78rpm (2 frames: spinning/vulnerable)
|
||||
- Class portraits ×4 (256px busts for title screen) + 4 in-game player variants (palette-swap
|
||||
the digger via prompt: "red cap", "green hoodie"...)
|
||||
- UI: notebook icon, logo/title card, lore card art, boss splash cards
|
||||
- Tiles: archive_floor (dark stone), crack_in_floor (mite spawner), lamp_glow
|
||||
|
||||
**Direction/animation strategy (keep it lazy):** stay single-frame + code juice (bob, squash
|
||||
on hit, flip-x for left/right). FLUX won't give consistent 4-direction sheets without a fight;
|
||||
top-down Gauntlet reads fine with flip + bob. Revisit only if it looks wrong in play.
|
||||
|
||||
**Trainspot data:** one-off script `assets/extract_tunes.py` against local `discogs_full` →
|
||||
`public/tunes.json` ({genre: [{artist,title,label,year,grail}]}). Curate via
|
||||
have/want counts (Discogs popularity proxies) so the pool is canon, not noise.
|
||||
|
||||
## Build order (each tier = one working, shippable state)
|
||||
|
||||
**Tier 1 — "it's a real arcade game now" (1–2 sessions)**
|
||||
1. Wire the 9 existing assets: level themes per tileset, pirate + ghoul enemies, gold records
|
||||
2. Classes (4) + title-screen select
|
||||
3. Vibe states + shot-the-espresso + new announcer lines
|
||||
4. Score + high-score table (localStorage)
|
||||
5. Mobile twin-stick touch
|
||||
6. Cloudflare purge on deploy
|
||||
|
||||
**Tier 2 — "the hook" (1–2 sessions)**
|
||||
7. Trainspotter's Notebook + real-record reveals (discogs extract, genre pools per theme)
|
||||
8. Digging at crate walls + treasure rooms
|
||||
9. The Archive: darkness + lamps + mites + Mite Queen
|
||||
10. Procedural mazes past level 12
|
||||
|
||||
**Tier 3 — "the legend" (when it's earning attention)**
|
||||
11. Bosses: Spectral Conductor, Monstrous 78 RPM + White Label ending + NG+
|
||||
12. Attract mode (lore/bestiary/high-score cycle)
|
||||
13. Same-keyboard 2P co-op
|
||||
14. Arcade-landing menu entry
|
||||
|
||||
Not doing (and why): buy/sell economy (cratewars owns it), netplay (no demand),
|
||||
4-direction animation sheets (flip+bob reads fine), sound design beyond announcer+airhorn
|
||||
(Web Speech + oscillators ARE the aesthetic).
|
||||
Loading…
Reference in New Issue
Block a user