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>
64 lines
3.1 KiB
Markdown
64 lines
3.1 KiB
Markdown
# TURNCRAFT — Integration Guide
|
|
|
|
Run this phase AFTER the five lanes land, in one session (the integrator may
|
|
be any agent; it completes `src/main.ts` and may make minimal cross-lane glue
|
|
fixes, documenting every one).
|
|
|
|
## Pre-flight
|
|
|
|
1. `npm i && npm run typecheck` — must be clean with all lanes merged.
|
|
2. Read every lane's `HANDOFF.md` (in each owned directory). They list stubs
|
|
and contract friction — resolve friction FIRST, before wiring.
|
|
3. Open all five demo pages; each lane's acceptance boxes should be checkable.
|
|
|
|
## Wiring order (src/main.ts)
|
|
|
|
1. `createRenderer(#app)` → renderer, scene, camera, `setEmissiveBoost`.
|
|
2. `new VoxelWorld(WORLD_X, WORLD_Y, WORLD_Z)`.
|
|
3. `buildBooth(world)` (Lane C) — time it; expect < 500 ms.
|
|
4. `ChunkManager(world, scene, atlas)` — initial full mesh; expect < 3 s.
|
|
5. `createMachines(world)` (Lane D) with `QUEST_POS` from
|
|
`src/worldgen/questPositions.ts`; add `getObject3Ds()` to scene.
|
|
6. `new PlayerController(world, { getColliders: machines.getColliders,
|
|
camera, domElement, spawn: SPAWN })` (Lane B, spawn from Lane C).
|
|
7. `new Interaction(world, player, machines, hotbar)` (Lane D).
|
|
8. `AudioEngine` + `FxSystem({ scene, setEmissiveBoost })` + `Hud` (Lane E);
|
|
audio init gated behind Lane E's start overlay click.
|
|
9. Loop: fixed-step accumulator at `FIXED_DT`, max `MAX_SUBSTEPS`:
|
|
`machines.update(dt)` → `player.update(dt)` → `interaction.update(dt)` →
|
|
`fx.update(dt)` + `audio.updateListener(player)` per frame →
|
|
`chunkManager.update()` → render.
|
|
|
|
## Smoke tests (manual, in order)
|
|
|
|
1. **Spawn**: on Deck A plinth, facing mixer, 60 fps, booth fully visible,
|
|
world dim (pre-repair), groove silent.
|
|
2. **Ride**: press deck A start — platter spins up (no stylus yet = no
|
|
music), step on: you ride. Center calm, rim brisk. 45 + rim + jump flings
|
|
you toward the mixer.
|
|
3. **Mine/build**: break dust blocks, place a bridge from plinth to mixer,
|
|
auto-step up knob stems.
|
|
4. **Quest end-to-end**: complete all five nodes per DESIGN §6 — each fires a
|
|
subtitle, an LED trace, and one more stem. Power switch finale: win
|
|
sequence plays, both decks spin, booth fully lit and audio-reactive.
|
|
5. **Soak**: 10 minutes of free play — no console errors, no fps decay
|
|
(watch for per-frame allocation creep), audio never drifts.
|
|
|
|
## Known integration risks (check these specifically)
|
|
|
|
- Lane C's duck-typed `fillBox` fallback vs Lane A's real one — verify the
|
|
real path is taken (log once).
|
|
- Chunk dirty flood during quest LED traces if Lane E ever setBlocks — it
|
|
must NOT (sprites only); grep `setBlock` outside A/C/D.
|
|
- Platter collider height vs Lane C's platter-well depth: player must step
|
|
from plinth top onto the record (≤1 voxel lip, B's auto-step covers it).
|
|
- Double-grounding: player standing where a kinematic cylinder overlaps
|
|
voxels (well rim) — B resolves voxels first, then platforms; verify no
|
|
jitter standing on the rim edge.
|
|
- Audio autoplay policy: nothing audible before the start-overlay click.
|
|
|
|
## After integration
|
|
|
|
- `npm run build` must produce a deployable static bundle.
|
|
- Deploy per the deploy-map skill (partly.party) when John says ship.
|