L1 has been a 2-event skeleton since round 1, waiting (in its own status field) on "Lane B's arena-mode controller". That exists now, so C's round2_plan is built as written: molar crush-cycles, the saliva tide, amylase droplets, the three samples exactly where C put them (behind the molars / under the tongue / a tonsillar crypt), and the epiglottis exam. 24 events. The teaching order is the level: move (orbs, no current) -> LOOK (the arena opens and you can stop, which no other level allows) -> shoot (one droplet, then two) -> coat (the molar ring grazes you, mucin is right there) -> RESTRAINT -> flow returns (the tide, the funnel) -> the exam. Every verb alone, in the calmest room in the game, before anything is asked of it. Two hazards are deliberately re-used rather than invented: the molar crush IS a ring_gate and the saliva tide IS a non-lethal surge, so L2's gates and its reflux finale become callbacks instead of new ideas. THE MAST CELL (LANE_C_NOTES §Boss specs 5) sits at the exact midpoint. A sentinel immune cell: cyan, no attack, no chase, inert aura (auraDps 0 — it shares the floater's drift branch and its aura does literally nothing). Fly past and the encounter just ends. Shoot it and it degranulates — droplets close in from the walls (which is how "the cavity swells shut" is expressed, because a runtime tube radius is not in Lane A's contract), the coat bleeds, and past half health the airway closes on a 25s timer. You always get through. The only question is what you get through. It needed a new boss `kind: 'sentinel'` with its own update path, because forcing a thing with no rings and no windows through the phase machine would have been worse than a branch. Damage is the failure state, so every number describes a consequence rather than a fight. Verified, all three player choices: SPARE -> "spared", coat untouched at 100, karma +25, score 0. SHOOT -> "degranulated", coat 100->56. KILL -> "anaphylaxis-survived", coat 100->6. Score is 0 in every case: shooting it buys literally nothing, so no medal can ever reward the mistake. Two bugs the testing paid for: `def.phases[0]` crashed on a boss that has no phases, and the first degranulation drain (5/s) was UNDER the player's 8/s coat regen — measured coat going 80 -> 100 during a histamine cascade, i.e. the punishment was healing you. Now 14 and 22, which are net -6/s and -14/s against regen. L1 is no longer a skeleton: its checkpoint-gap and zero-samples warnings are gone, and the campaign now opens on a real tutorial instead of an empty mouth with a gate at the end. 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.