GUTS has had three bosses designed and none implemented. This is the first, and the framework the other two should reuse. Built to LANE_C_NOTES §Boss specs, phase table and all. WHY IT IS SMALL. A boss here is not a parallel entity system, it is a SCHEDULE over the enemy pool. The nodes and vents are ordinary enemies, so weapons hit them, the InstancedMesh draws them and enemy:die reports them for free; the fight's identity lives entirely in WHEN they can be hurt, which is two flags (`invuln`, `armor`) honoured by enemies.hurt(). boss.js is a state machine and nothing else. Faithful to C's table: P1 4 rim nodes, iris opens 2.5s every 8s P2 4 nodes, opens 1.8s every 5s, TWO armoured — and only the antacid torpedo strips them P3 the core alone, 60hp = C's "x5 hits", plus the 25s doom timer that kills you if you stall Telegraphs are C's too: a "deep gulp" 2s before each window (boss:telegraph + audio), and nodes go amber -> white-hot exactly when they become shootable — one uniform driven off `invuln`, so the thing that glows IS the thing you can hurt, always. Vents are turrets at fixed arcs: a turret already fires a telegraphed homing projectile on a cooldown, which is what an acid vent is. hp is B's call (C: "numbers need B's framework to tune against"). 150 per rim node means a ring outlives its first window, so you must come back for it — which is what lets the stomach's coat-drain be the real clock. C's pillar, verified: parked in the lair for 20s without fighting back, coat goes 100 -> 0. "A race against your coat, not its hp." Verified end-to-end: a paced pilot (11 shots/s, ~70% uptime) wins in 38.8s across 9 windows at 0.38 open-duty (spec: 31-36%); phases report 4/0 armoured, 4/2 armoured, 1 core; damage is refused while the iris is shut; the two armoured nodes consumed exactly 2 torpedo strips. Not included: C's arena churn (a force on the player, the one part of the spec that is a feel change rather than a schedule) — noted for the round that tunes it. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|---|---|---|
| .claude | ||
| docs | ||
| pipeline | ||
| tools | ||
| web | ||
| .gitignore | ||
| README.md | ||
GUTS — a fantastic voyage through the alimentary canal
Browser flight-combat game (three.js, zero build step). You pilot ENDO-1, a microscopic probe, mouth → rectum through five anatomically-grounded biomes: ride peristalsis down the esophagus, cross the acid sea of the stomach, thread the villi forest of the small intestine, survive the gas swamps of the colon. Fantastic Voyage × Star Fox × Descent.
- Design: docs/GDD.md · Look: docs/ART_BIBLE.md
- Architecture + contracts: docs/TECH.md
- Asset generation: docs/PIPELINE.md
- How we work (lanes/rounds): docs/PROCESS.md — read this first if you are a lane
- Current round: docs/LANES/ROUND1_INSTRUCTIONS.md
Run it
cd web && python3 -m http.server 8140
# http://localhost:8140 — the game
# http://localhost:8140/?stub=1&dbg=1 — stub world + debug HUD (works from day 0)
No bundler, no npm, no build. ES modules + import map; three.js r175 vendored in web/vendor/
(never CDN — the game must run offline). Before you finish a session: bash tools/qa.sh.
The one-paragraph tech pitch
The whole canal is a spline. World position is (s, θ, ρ) — distance along the canal,
angle and radius in the cross-section. Tube walls are chunked extrusions along
parallel-transport frames; peristalsis and breathing are vertex-shader displacement
(cheap, squishy, everywhere); collision is an analytic radius test (no physics engine).
Caverns (mouth, stomach) switch the same controller to free 6DOF. Look is synthetic
scanner — dark endoscope void, SEM-style monochrome walls with FLUX-generated detail
textures, emissive-coded enemies. Everything is seeded + deterministic, and every asset is
optional at runtime — the game boots and plays asset-free with procedural fallbacks.
Hard laws (all lanes)
- Determinism. No
Math.randomoutsidejs/core/rng.js. Seeded RNG only. qa.sh greps. - Assets are optional. Missing texture/model/audio ⇒ procedural fallback, never a crash.
- Eyeball everything. Visual work isn't done until a screenshot is in
docs/shots/laneX/. - Perf budget: ≤300 draw calls, 60 fps on M-series / mid laptop. Measure via
window.DBG. - Free-first. Local MODELBEAST generation before any paid API; fal.ai is a gated fallback (John's go). See PIPELINE.md.
- Git: stage only your exact paths, commit + push each session, never
git add ..
Deploy
Live: https://partly.party/gutsy/ — bash tools/deploy.sh (QA gate → rsync web/ minus
dev/ → docker cp into forum-nginx → verify). No build step; web/ ships as-is.
Two things to know before you touch it, both documented at length in the script header:
- It's ephemeral. Content lives in the container's own layer (like blobbo/glytch), so a
docker compose up --force-recreateor nginx image bump wipes it — re-run the script. The durable fix is a bind mount inforum/docker-compose.yml(what cratewars/roguelike use), which costs a forum-nginx recreate and brief partly.party downtime. - A 404 there returns HTTP 200. nginx's catch-all
try_files ... /index.htmlserves the arcade index for any missing file. Verify on content, never on status codes.
Origin: ssh://git@100.71.119.27:222/monster/guts.git.