guts/web/js/flight/dev.html
jing 0a038582a7 [lane B] Round 1: flight controller, cannon, enemy framework on the stub
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>
2026-07-16 08:56:32 +10:00

45 lines
1.8 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GUTS — Lane B flight/combat harness</title>
<!--
Lane B's dev harness. NOT the game — web/index.html is, and it's Lane F's.
This exists because boot.js has no player wiring yet (round 0 shipped a drift camera) and
Lane B may not edit boot.js. It boots the stub world + createPlayer + createCombat so the
controller can be flown and screenshotted this round.
Retire this once F pastes the snippet in LANE_B_NOTES.md §"-> Lane F".
http://localhost:8140/js/flight/dev.html
-->
<style>
html, body { margin: 0; height: 100%; overflow: hidden; background: #02100d; }
canvas { display: block; }
#dbg { position: fixed; left: 10px; bottom: 10px; color: #39e6ff;
font: 12px/1.5 ui-monospace, monospace; text-shadow: 0 0 4px #000;
pointer-events: none; z-index: 10; white-space: pre; }
#hint { position: fixed; inset: 0; display: grid; place-content: center; text-align: center;
color: #dff2ff; font: 14px/1.8 ui-monospace, monospace; background: #02100dcc;
z-index: 20; cursor: pointer; }
#hint b { color: #5affd2; font-size: 20px; letter-spacing: .2em; }
.gone { display: none !important; }
</style>
<script type="importmap">
{ "imports": { "three": "../../vendor/three.module.js",
"three/addons/": "../../vendor/addons/" } }
</script>
</head>
<body>
<div id="dbg"></div>
<div id="hint">
<b>ENDO-1</b>
<div>click to fly &middot; lane B harness</div>
<div style="opacity:.6">
WASD move in the tube &middot; mouse aim &middot; LMB cannon &middot; RMB/F torpedo<br>
Space boost &middot; Shift/Ctrl throttle &middot; ease off to surf the crest &middot; Esc release
</div>
</div>
<script type="module" src="./dev.js"></script>
</body>
</html>