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>
6.1 KiB
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)
- 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.
- PCB Depths read as green wallpaper — one tile repeated makes astroturf, not circuitry; caverns lack vertical interest.
- Textures are flat at 16px — brushed_alu reads as concrete speckle up close; vinyl tiers are matte plastic; no tile variation anywhere.
- LEDs don't bloom — emissive blocks read as flat colored squares; the concept art's glow is absent.
- 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
pcbonly, 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 forply_edge. - Keep
NearestFilterchunkiness — 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
bloomboolean to Settings (default on; auto-off when quality = 'fast').createRendererreturns arender()that internally uses the composer when enabled — main.ts keeps callingrender()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,
polygonOffsetto avoid z-fight). - Print set (all positions derived from LAYOUT/anchors):
- Mixer face:
CH 1–4under each fader alley, tick marks along alleys,TURNCRAFT-800model text at the top edge, crossfaderA ↔ B. - Decks:
START·STOP,3345beside 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.
- Mixer face:
- 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
buildBoothdeterministic (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 arecordSideTexture()insrc/fx/decals.tsand 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 typecheckclean, 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.