Flight (js/flight/): tube-mode controller in spline space (s,x,y) — flow-locked forward motion, throttle as a spring-back lean, boost + i-frames, banking chase cam on the parallel-transport frame, arcade wall response (shove + graze damage, never a hard stop). Twin-stick input: WASD/left-stick moves the ship in the disc, mouse/right-stick aims, Shift/Ctrl is throttle. Gamepad supported. Combat (js/combat/): lysozyme cannon (pooled, instanced, heat-limited with hysteresis lockout) + antacid torpedo emitting level:neutralize. Enemy framework with floater/seeker/turret and turn-rate-limited homing darts, spawned from C's level:event. Coat/hull model and the full bus surface E builds against. Measured (deterministic stepper): flow-lock exact (3s at flow 14 -> s=44.0); boost peak 30.8 u/s; heat 4s fire -> 2s lockout; wall slam 13.3 coat at 11.3 u/s with forward speed untouched; 10 combat draws at 55 live enemies (budget <=80); 0.10 ms/frame CPU; 0 leaks over 20 create/dispose cycles. fps NOT claimed — rAF does not run in the automated pane. Evidence: docs/shots/laneB/. Three findings escalated in LANE_B_NOTES: - qa.sh gate #1 is a no-op: node --check silently exits 0 on ESM, so the syntax gate has never checked anything. I shipped a real SyntaxError past a GREEN qa. Fix + verification handed to F. - Surf is structurally broken: the peristalsis wave (13.64 u/s) is slower than the player (19.6 u/s), so level 2's signature mechanic loses to mashing throttle. Not tunable from this lane; escalated to A/F with options. - Custom ShaderMaterials need #include <colorspace_fragment>, else ART_BIBLE's hostile amber reaches the display as rgb(255,26,6). Fixed here; stub/walls inherit it. js/flight/dev.html is a dev harness (boot.js has no player wiring yet); it retires once F pastes the snippet in LANE_B_NOTES. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
40 lines
2.7 KiB
Markdown
40 lines
2.7 KiB
Markdown
# Lane B — progress log
|
||
|
||
## 2026-07-16 · Round 1 — flight + first blood, on the stub
|
||
|
||
Built the whole Lane B round-1 slice against `?stub=1`: `flight/{tuning,input,player,ship,emissive}.js`
|
||
and `combat/{balance,weapons,enemies,index}.js`. Round-1 asks 1–4 all landed; arena/6DOF deferred to
|
||
round 2 as instructed.
|
||
|
||
**Shipped**
|
||
- Tube controller in spline space `(s, x, y)`: flow-locked forward motion, throttle as a spring-back
|
||
lean, boost + i-frames, banking chase cam on the parallel-transport frame, arcade wall response
|
||
(shove + graze damage, never a hard stop).
|
||
- Twin-stick input (WASD/left-stick = disc, mouse/right-stick = aim, Shift/Ctrl = throttle), gamepad
|
||
supported. Throttle deliberately not on WASD.
|
||
- Lysozyme cannon (pooled, instanced, heat-limited with hysteresis lockout) + antacid torpedo emitting
|
||
`level:neutralize`. Enemy framework + floater/seeker/turret + turn-rate-limited homing darts.
|
||
- Coat/hull model and the full bus surface E builds against.
|
||
|
||
**Measured** (deterministic fixed-timestep stepper): flow-lock exact (3 s at flow 14 → s=44.0);
|
||
boost peak 30.8 u/s; heat cycle 4 s fire → 2 s lockout; wall slam 13.3 coat at 11.3 u/s impact with
|
||
forward speed untouched; **10 combat draws at 55 live enemies** (budget ≤80); ~5.7k combat tris;
|
||
0.10 ms/frame CPU; **0 leaks** across 20 create→dispose cycles. fps deliberately not claimed — rAF
|
||
doesn't run in the automated pane. Evidence in `docs/shots/laneB/`.
|
||
|
||
**Findings escalated** (detail in LANE_B_NOTES):
|
||
1. **`tools/qa.sh` gate #1 never checks anything** — `node --check` silently exits 0 on ESM. I shipped
|
||
a real SyntaxError past a GREEN qa. Fix + verification handed to F.
|
||
2. **Surf is structurally broken** — the peristalsis wave (13.64 u/s) is slower than the player
|
||
(19.6 u/s), so level 2's signature mechanic is a trap: riding a crest loses to mashing throttle.
|
||
Not tunable from my lane (measured: identical ~3.0 u gained at gain 0.4/0.75/1.2). Escalated to
|
||
A/F with two options and a request for `biome.waveSpeed`.
|
||
3. **Custom ShaderMaterials need `#include <colorspace_fragment>`** — without it ART_BIBLE's hostile
|
||
amber `#ff5a2a` reaches the display as rgb(255,26,6). Fixed in mine; F's stub and A's walls inherit it.
|
||
4. `flowPulse` missing from the TECH contract; nobody owns the `level:event` emitter; `world.sample()`
|
||
allocates on the hot path; `player:state`/`combat:state` bus additions needed for E's HUD.
|
||
|
||
**Blocked on nothing.** Built entirely against the stub per instructions; boot.js still has no player
|
||
wiring (F's file), so `web/js/flight/dev.html` is a dev harness that boots stub+player+combat. It
|
||
retires the moment F pastes the snippet in NOTES §→ Lane F #1.
|