- Swap the command deck's "Build" slot for a "Scan" slot that fires an
omnidirectional sonar pulse from the ship across the tether region.
- The wavefront is clipped to the union of tether circles: it is absorbed
at the rim (bright absorbing arc + TetherField.excite shiver) instead of
flying into empty space.
- Objects inside the region ring as the front crosses them (shock rings,
RGB ghost, scale pulse); the starfield ripples and the camera thumps /
rolls with the wave, then restores itself on completion or cancel.
- New modules: js/scan/ScanPulse.js (rendering + lifecycle),
js/scan/ScanGeometry.js (pure circle-circle window math).
- All tuning lives in data/scan.json; the one SFX is the new "scan" key
in data/sfx.json. Results are a seam for now — finishScan logs the
in-region objects and reports the count in the console slot.
- Tests: dev/scan.test.mjs (geometry unit tests) and
dev/scan-test.html/.mjs (headless flow test driving the real scene).
- Add Terran shop placeholder assets (two PNGs + one MP4).
The player starts with a level-1 tether anchored on the home world:
a circular zone 5120 px from the planet's center. The ship may fly
anywhere in the UNION of its tethers' zones — where zones overlap there
is no line and no wall — and the union's boundary is a hard barrier,
rendered as a thick cyberpunk glitch dotted line (marching dashes,
additive glow + RGB fringe, ambient glitch bursts with dash flicker,
radial displacement and data drops, contact shudder + camera kick +
throttled console toast where the ship bumps it).
- data/tether.json: level radii (5120 x 1.25^lv), the starting tether,
barrier line/look, glitch and contact tuning (manifest-registered)
- js/tether/Tether.js: pure range math (union membership, clamp to the
nearest union boundary point + normal, visibleArcs = each tether's
share of the union boundary) — Node-tested
- js/tether/TetherField.js: scene-facing field — add/remove/setLevel
seam for future builds/upgrades, per-frame ship constraint, and the
barrier renderer (on-screen dot culling only)
- js/scenes/GameScene.js: home tether at the system origin, HUD
readout (level / range / anchor per tether), click-to-fly and
autopilot targets clamped to the union boundary, contact feedback,
destruction on shutdown
- dev/tether.test.mjs: 29 checks incl. the two-direction boundary
property (no line in overlaps, no gaps in the line) and a numeric
nearest-boundary cross-check (worst 0.79 px)
- dev/smoke-game.mjs: ?tethers / ?homeLevel / ?report dev hooks for
manual and headless verification
- README + PROJECT_NOTES: the system, its rules and its layering
Verified in headless Chromium: clean boot (menu + game), barrier
rendering (calm and glitch-burst frames), union boundary with two
tethers (arcs meet at the rim crossings, lens is line-free), ship
clamped exactly onto the rim from outside, contact toast fired.