Lanes A (engine), B (player), C (worldgen), D (machines/quest), E (audio/fx/ui) as landed, each with HANDOFF.md + update docs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
165 lines
9.0 KiB
Markdown
165 lines
9.0 KiB
Markdown
# TURNCRAFT — Design Document
|
||
|
||
*Honey-I-Shrunk-the-DJ. A Minecraft-style voxel world contained entirely inside
|
||
a vinyl DJ booth: two Technics-style 1200 turntables, a 4-channel mixer, cables,
|
||
a patch bay, and the plywood console that holds it all.*
|
||
|
||
Read this together with [CONTRACTS.md](./CONTRACTS.md). Numbers quoted here are
|
||
defined once in `src/core/constants.ts` — the code is the source of truth.
|
||
|
||
---
|
||
|
||
## 1. Vision
|
||
|
||
You are ~7 mm tall, standing on a spinning record. The world is finite, dense,
|
||
and hand-authored — a diorama, not a landscape. Every zone is a piece of DJ
|
||
gear rendered at monumental scale: the mixer is a mesa of faders and knob
|
||
forests, the tonearm is a chrome bridge, an unplugged RCA lead is a rope
|
||
bridge into a canyon, and beneath the plinths lie glowing circuit-board caves.
|
||
|
||
The palette is deliberately restrained — greys, silvers, matte blacks, dark
|
||
rubber — inside a warm birch-plywood shell, with two loud accents: translucent
|
||
**blue vinyl** records and emissive **LEDs** (red/green/amber/blue). Think the
|
||
inspiration photo: utilitarian gear, warm wood, blue records.
|
||
|
||
The fantasy: *the booth is dead when you arrive.* Your job is to bring the mix
|
||
back — repair the signal chain, press start, and ride the record while the
|
||
whole world lights up in sync with the music.
|
||
|
||
## 2. Pillars
|
||
|
||
1. **The world IS the gear.** No abstract terrain. Every structure reads as a
|
||
real DJ-booth object at 4 mm/voxel scale.
|
||
2. **The platters spin and you can ride them.** Rotating kinematic platforms
|
||
are the signature mechanic. Everything else is standard voxel play.
|
||
3. **Sound is the win state.** Repairs unmute stems of one continuous house
|
||
groove; lights and particles react to it. A silent booth is a broken booth.
|
||
4. **Zero external assets.** All textures are procedurally painted, all audio
|
||
is synthesized. The repo builds from `npm i && npm run dev` alone.
|
||
|
||
## 3. Scale & World Map
|
||
|
||
1 voxel = 4 mm. Player: 1.8 voxels tall (~7 mm). World: **448 × 160 × 256**
|
||
voxels, chunked at 32³ (14 × 5 × 8 = 560 chunks, ~18 M voxels — trivially fits
|
||
in Uint8Arrays).
|
||
|
||
Vertical strata (Y):
|
||
|
||
| y | what |
|
||
|---|------|
|
||
| 0–40 | **Under-table**: inside the plywood console — record crate, parts bin, PCB caves under the gear, cable runs |
|
||
| 40 | **Tabletop** — plywood plateau the gear sits on |
|
||
| 40–80 | Turntable plinths (steel-grey mesas), mixer body |
|
||
| 80–85 | Plinth tops, platter + slipmat + record surface (85 = vinyl top) |
|
||
| 67 | Mixer face plate (knob forest, fader alleys) |
|
||
| 85–140 | Tonearm bridge, dust-cover glass arcs, booth walls, patch-bay wall |
|
||
|
||
Horizontal layout (X across, Z deep; see `LAYOUT` in constants.ts):
|
||
|
||
```
|
||
z=256 ─────────────────────────────────────────────── back
|
||
│ plywood back wall (z=200) — PATCH BAY dungeon │
|
||
│ C A B L E C A N Y O N (z 140–200) │
|
||
│ RCA/power leads as rope bridges & tunnels │
|
||
│ ┌────────────┐ ┌──────────┐ ┌────────────┐ │
|
||
│ │ DECK A │ │ MIXER │ │ DECK B │ │
|
||
│ │ x 24–136 │ │ x183–265 │ │ x 296–408 │ │
|
||
│ │ spindle │ │ 4ch face │ │ spindle │ │
|
||
│ │ (80, 96) │ │ plate │ │ (352, 96) │ │
|
||
│ └────────────┘ └──────────┘ └────────────┘ │
|
||
│ front lip / headphone ledge (z<48) │
|
||
z=0 ─────────────────────────────────────────────── front
|
||
x=0 x=448
|
||
```
|
||
|
||
## 4. Zones (biomes)
|
||
|
||
1. **Deck A — "The Blue Record"** (spawn). Steel-grey plinth mesa. On top: the
|
||
platter (rotating machine, not voxels) carrying a translucent blue vinyl
|
||
disc with a cream label. Strobe dots glow on the platter rim. The pitch
|
||
fader is a canyon slot in the plinth; start/stop is a giant press-plate;
|
||
the spindle is a climbable chrome pole. The tonearm arcs overhead as a
|
||
chrome bridge from its rest to over the record.
|
||
2. **The Mixer Massif** (center). Tallest mesa. Face plate at y=67 is a
|
||
grid-city: EQ **knob forest** (mushroom-cap knobs on stems), four **fader
|
||
alleys** (deep slots with sliding fader sleds), the **crossfader tram**
|
||
running left–right at the front, **VU towers** at the back — columns of
|
||
LED blocks that light bottom-to-top with the music. Speaker-mesh vents on
|
||
the sides are climbable ladders and the way into the mixer's interior.
|
||
3. **Cable Canyon** (behind the gear, z 140–200). Tangled RCA and power leads
|
||
spanning tabletop to back wall — walkable rope bridges (2×2 cable-block
|
||
tubes with red/white/gold RCA plug heads). Dust drifts here; dust-block
|
||
boulders to mine.
|
||
4. **The Patch Bay** (back wall, y 90–118). The wall-mounted RCA switcher from
|
||
the photo, scaled to a cliff-face dungeon: gold jack sockets are round
|
||
doorways into shallow rooms; one socket needs its plug pushed home (quest).
|
||
5. **PCB Depths** (under-table, y 0–40). Mine down through a plinth vent:
|
||
green circuit-board floors, copper-trace paths that glow faintly, solder
|
||
blob stalagmites, capacitor pillar rooms, the fuse box (quest), and the
|
||
record crate — a plywood cavern of giant vinyl slabs to spelunk between.
|
||
6. **Deck B — "The Silent Deck"** (mirror of A, but stopped, dust-covered, its
|
||
half-open glass dust cover forming a crystal cave overhead). Comes alive
|
||
only at the end.
|
||
|
||
## 5. Mechanics
|
||
|
||
- **Standard voxel play**: mine breakable blocks (dust, vinyl, knobs, LEDs…),
|
||
carry them in a 9-slot hotbar, place them to build bridges/stairs anywhere.
|
||
Structural blocks (plywood shell, cables) are unbreakable — the booth keeps
|
||
its shape.
|
||
- **Riding the record**: platters are kinematic rotating cylinders. Standing
|
||
on one adds its surface velocity to you. At "33" (2.0 game-RPM) the label
|
||
area is a lazy carousel and the rim is a brisk travelator; at "45" the rim
|
||
will fling you — which is a legitimate traversal move (record-edge launch
|
||
onto the mixer).
|
||
- **The needle plow**: while a deck plays, the stylus tracks slowly inward
|
||
along the groove spiral. Its contact shoe is a kinematic pusher — get in
|
||
front of it and it shoves you along the groove. Jumping the tonearm's
|
||
moving shadow is a mini-game.
|
||
- **Machine interactions** (press E / tap): start/stop plates toggle platters,
|
||
33/45 buttons switch speed, pitch faders scale RPM ±50%, channel faders and
|
||
crossfader slide (and duck their stem's volume live), the cue lamp toggles
|
||
headlamp-style local light.
|
||
- **No mobs in v1.** Ambience only: drifting dust motes, LED pulses. (Stretch:
|
||
static-spark wisps in Cable Canyon.)
|
||
|
||
## 6. The Quest — "Bring Back the Mix"
|
||
|
||
The booth starts silent and dim. Five signal-chain breaks (order-agnostic,
|
||
tracked in `SIGNAL_NODES`):
|
||
|
||
| node | where | fix |
|
||
|---|---|---|
|
||
| `stylus` | Deck A headshell is empty | find the chrome stylus block in the PCB Depths parts bin, carry it up, place it in the headshell socket |
|
||
| `rca` | Patch bay socket, back wall | walk Cable Canyon's loose lead to its plug, push the plug block into the gold socket |
|
||
| `crossfader` | Mixer crossfader slot | a dust boulder jams the tram — mine it out |
|
||
| `fuse` | Fuse box in PCB Depths | swap the blackened fuse block for a fresh one from the parts bin |
|
||
| `power` | Master switch, mixer rear | climb and press it (only lights up once the other four are done — it's the finale trigger) |
|
||
|
||
Each repair: a `signal:repair` event → an LED trace lights along the *actual
|
||
signal path* through the world (cartridge → tonearm → RCA → mixer → out), and
|
||
one more stem of the groove unmutes (drums → bass → chords → lead → full mix
|
||
with sweeps). Final repair: both platters spin up, every LED in the world goes
|
||
audio-reactive, `game:win` fires, and the player just… gets to ride records in
|
||
a living booth. Sandbox continues after the win.
|
||
|
||
## 7. Look & Feel
|
||
|
||
- **Rendering**: chunky voxels, per-face procedural 16×16 textures from a
|
||
canvas atlas (see palette in `src/core/blocks.ts`), soft baked-ish AO at
|
||
voxel corners, one warm key light + cool fill + emissive LED blocks.
|
||
Fog tinted warm plywood-brown at the world edges so the booth walls fade
|
||
like a horizon.
|
||
- **Audio**: one endless synthesized 118 BPM house groove in stems. Platter
|
||
start/stop bends pitch (the classic Technics spin-up/brake). Positional:
|
||
the music comes *from the decks*.
|
||
- **Feel targets**: 60 fps on a mid laptop; Minecraft-familiar controls
|
||
(WASD, space, mouse-look, E interact, LMB break, RMB place, 1–9 hotbar,
|
||
F toggles fly for debugging).
|
||
|
||
## 8. Out of Scope (v1)
|
||
|
||
Mobs, crafting, survival/health, saving, multiplayer, infinite terrain,
|
||
mobile controls. The diffusion-terrain research that inspired this project is
|
||
explicitly *not* needed: the world is a finite authored diorama.
|