Fresh-eyes review outcomes as two parallel-safe Opus briefs: - WORKSHOP_CARTRIDGE.md: the stylus node becomes a five-stage cartridge assembly - seat/rotate the cart, crimp four color-coded wires onto stubborn pins (catenary carry, continuity lamp), torque screws evenly (tilt = azimuth error), balance the counterweight while RIDING the seesawing tonearm, then a needle-drop test where every mistake is audible + drawn on a diegetic scope. Multiplayer-shared state. - GLOWUP_ART.md: atlas v2 (32px, tile variants), selective LED bloom, screen-print decals + party flyers, mixer-face density, PCB pagodas. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
112 lines
6.1 KiB
Markdown
112 lines
6.1 KiB
Markdown
# BRIEF — The Glow-Up (art & atmosphere pass)
|
||
|
||
*Fresh-eyes verdict: the bones are great, the surfaces are underdressed.
|
||
This pass closes the gap to the concept art. Pure art/atmosphere — no
|
||
gameplay logic — so it can run in parallel with WORKSHOP_CARTRIDGE.md.*
|
||
|
||
**For one Opus 4.8 session.** Read `docs/CONTRACTS.md`,
|
||
`docs/INTEGRATION_NOTES.md`, `src/engine/atlas.ts`, `src/engine/renderer.ts`,
|
||
`src/worldgen/buildBooth.ts`, `src/fx/` first.
|
||
|
||
**You own:** `src/engine/atlas.ts`, `src/engine/renderer.ts`,
|
||
`src/worldgen/**` (dressing additions), `src/fx/**` (decals module),
|
||
`src/ui/Menu.ts` (one settings row). **Merge point with the workshop
|
||
brief:** `src/main.ts` and `src/worldgen/buildBooth.ts` — keep your edits
|
||
small and additive there. Do not touch `src/machines/**`, `src/interact/**`,
|
||
`src/audio/**`, `src/net/**`, `server/**`.
|
||
|
||
## Findings this brief fixes (from the review, with screenshots taken)
|
||
|
||
1. **Mixer face is an empty black plain** — knob clusters are specks on a
|
||
82×95 desert; real DJMs are dense. No screen-print labels anywhere.
|
||
2. **PCB Depths read as green wallpaper** — one tile repeated makes
|
||
astroturf, not circuitry; caverns lack vertical interest.
|
||
3. **Textures are flat at 16px** — brushed_alu reads as concrete speckle
|
||
up close; vinyl tiers are matte plastic; no tile variation anywhere.
|
||
4. **LEDs don't bloom** — emissive blocks read as flat colored squares;
|
||
the concept art's glow is absent.
|
||
5. Fader alleys/vents are void-black slots with no depth cues.
|
||
|
||
## Tasks
|
||
|
||
### G1. Atlas v2 (engine/atlas.ts)
|
||
- Tiles 16→**32 px**, and give patterns **per-block-position variation**:
|
||
hash (x,y,z) → one of up to 4 painted variants per pattern (requires
|
||
the mesher's UV path to pick a variant — if that's invasive, an
|
||
acceptable fallback is 4 variants painted for `pcb` only, chosen by a
|
||
world-position hash in the shader patch; document your choice).
|
||
- Pattern quality: `brushed` = long directional strokes (not noise);
|
||
`grooves` = concentric arcs with a subtle specular line; `pcb` = 3–4
|
||
variants that visually tile into routed traces + via dots + silkscreen
|
||
flecks; `plywood` = longer wavy grain, end-grain variant for `ply_edge`.
|
||
- Keep `NearestFilter` chunkiness — sharper *pattern*, same voxel soul.
|
||
- Material feel: give the two chunk materials a slightly higher
|
||
`envMapIntensity`-free polish via roughness tuning only (no env maps).
|
||
|
||
### G2. Bloom (engine/renderer.ts + main.ts + Menu)
|
||
- Selective bloom for emissive: `EffectComposer` + `UnrealBloomPass`
|
||
(three/examples), threshold tuned so ONLY LEDs/strobe/lamps bloom
|
||
(~strength 0.55, radius 0.4). This is the single biggest step toward
|
||
the concept art.
|
||
- Gate on quality: add a `bloom` boolean to Settings (default on;
|
||
auto-off when quality = 'fast'). `createRenderer` returns a `render()`
|
||
that internally uses the composer when enabled — main.ts keeps calling
|
||
`render()` unchanged apart from passing the setting through.
|
||
- Budget: ≥ 100 fps must survive on the current test machine; measure
|
||
before/after and record numbers in your handoff.
|
||
|
||
### G3. Screen-print decal system (fx/decals.ts + worldgen anchors)
|
||
- A tiny module that bakes text/markings onto canvas textures applied as
|
||
thin plane meshes (0.05 proud, `polygonOffset` to avoid z-fight).
|
||
- Print set (all positions derived from LAYOUT/anchors):
|
||
- Mixer face: `CH 1–4` under each fader alley, tick marks along alleys,
|
||
`TURNCRAFT-800` model text at the top edge, crossfader `A ↔ B`.
|
||
- Decks: `START·STOP`, `33` `45` beside buttons, pitch `+/−` scale,
|
||
Technics-style script line on the plinth rear ("Quartz Direct Drive").
|
||
- Patch bay: tiny socket numbers. Fuse box: `FUSE 250V`.
|
||
- Booth walls: 3–4 procedural **party flyers** (canvas typography:
|
||
random gig names from a word bank, big condensed type, one accent
|
||
color each) pasted like posters near the patch bay and front lip.
|
||
- Keep total decal draw calls < 25 (merge planes per gear piece where easy).
|
||
|
||
### G4. Worldgen density pass (buildBooth.ts — additive only)
|
||
- **Mixer face**: mushroom knob caps (2×2 cap on 1×1 stem, mixed heights)
|
||
replacing the flat single-voxel caps; double the knob rows per channel
|
||
strip (EQ + trim + filter row); 1-voxel panel seam grooves (matte_black
|
||
→ rubber lines) sectioning the face; LED pips beside each alley.
|
||
- **PCB Depths**: IC-chip **pagoda buildings** (matte_black slabs on
|
||
solder pin-legs you can walk under, 2–3 sizes, a few stacked), ribbon
|
||
cable walls (alternating cable_black/cable_white columns), more copper
|
||
trace inlays connecting features, sparse led_green "status" pips near
|
||
ICs (they pulse post-win via existing emissive boost — free).
|
||
- **Fader alleys/vents**: a dim led_amber pip at the bottom of each alley
|
||
and inside vent mouths so dark slots read as *deep*, not void.
|
||
- Keep `buildBooth` deterministic (same seed), build time < 800 ms, and
|
||
do NOT move any LAYOUT/QUEST_POS anchor (machines depend on them).
|
||
|
||
### G5. Record material moment
|
||
- The vinyl tier sides get a subtle groove-sheen: a fine repeating
|
||
light/dark ring texture on the tier side cylinders (machines/platter.ts
|
||
is workshop-owned — instead provide the improved texture via
|
||
`blockMaterial`'s existing tint path or hand the workshop session a
|
||
`recordSideTexture()` in `src/fx/decals.ts` and note it in your handoff
|
||
for them to wire — do not edit platter.ts yourself).
|
||
|
||
## Acceptance
|
||
|
||
- [ ] Before/after screenshots of: mixer face, PCB depths, deck top,
|
||
full-booth win state (use `window.TURNCRAFT_CINE`)
|
||
- [ ] Bloom on LEDs only (plywood must NOT glow), toggleable, fps ≥ 100
|
||
measured and recorded
|
||
- [ ] All decals legible at play distance, no z-fighting while circling
|
||
- [ ] buildBooth deterministic, anchors untouched (grep QUEST_POS usage),
|
||
build < 800 ms, chunk meshes < 600
|
||
- [ ] `npm run typecheck` clean, zero console errors, live smoke of the
|
||
full quest still passes (don't break the game for prettiness)
|
||
- [ ] Handoff note listing every file touched + the two merge points
|
||
|
||
## Out of scope
|
||
|
||
Mobs/critters, mobile UI, new blocks (atlas is at 31/32 ids — variants
|
||
must come from painting, not new ids), any machines/audio/net code.
|