Go to file
type-two a3784c0371 [lane B+C] L5 Large Intestine: the dark, the gas, and The Blockage — the campaign is complete
The last level. 6 segments, 3200 units, 51 events, and the end of the game: `next: null`.

THE GAS. GDD: "flammable gas pockets: shooting inside one detonates it (hurts everyone —
risk/reward)". Built literally, as an entity whose kill() throws a blast:
  - one cannon pellet sets it off (hp 10) — the hazard has to be hair-trigger or "don't shoot
    near it" is not a constraint;
  - the blast reaches 16 units, FALLS OFF with distance, wipes foes, hurts YOU, and chains
    through other pockets, so a corridor of them is a fuse;
  - foe:false, so the pocket itself scores nothing — you are paid for what the blast KILLS,
    which makes the reward self-balancing.
Measured: one pellet into a line of four detonated all four; a blast took 4 virions and paid
240; the player takes 30.3 coat point-blank, 15.4 at mid range and 0 at 20 units. "Detonate
from max range" — which C's Blockage spec calls optimal play — is a real, measurable skill.

And the cruelty that makes the level: fog 0.075 is the densest in the game and there are no
real-time lights in GUTS, so THE POCKETS ARE THE LIGHTING. Clearing a room safely also clears
the lights. No new rendering path was added for the dark; the biome's fog and the emissives
already did it.

THE BLOCKAGE (LANE_C_NOTES §Boss specs 3) — 5 armoured plates -> 4 tumbling chunks -> the core
under a 30s doom timer, with gas pockets seeded into every phase, so the boss's own room is its
worst weakness. First cut ran 25.7s, shorter than the mid-game Guardian, which is the wrong
shape for a finale — its windows are continuous by spec, so hp went 120/130/150 -> 220/230/280.
Now: 49.7s brute-forcing the plates, 30.2s using the gas. The room is the weapon, and the
difference is 40%.

The reputation loop lands here as designed: two biofilm gates, the second sixty units from the
final boss. Five levels of deciding whether to shoot the cyan resolve into three phage escorts
and a full coat, or nothing at all, in the dark, at the door.

Registering L5 also closes two dangling threads — L4's ileocecal valve and LS_appendix's exit
both pointed at it and now resolve.

C's tooling: 6/6 levels valid, sim par 540 vs par-pace 505 (reachable, with room for the boss),
pressure 1.33/4.09/3.21/5.75/4.12, min clearance 8.30 vs the 2.5 law. par.score corrected
7000 -> 4000 and a missing checkpoint added at 3060 (the 30s law caught a 34.8s gap I had left
between the boss and the gate).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-26 11:35:28 +10:00
.claude [chore] Drop the throwaway preview ports 2026-07-25 22:52:08 +10:00
docs [lane B+C+F] The Appendix Sovereign: the secret boss, and a reputation you cannot fake 2026-07-25 23:25:36 +10:00
pipeline [lane A] MODELBEAST dresses the molecules: 5 matcaps, and the canal picks space-filling 2026-07-16 21:31:24 +10:00
tools [infra] Stamp the deploy: curl /gutsy/VERSION to see what is actually live 2026-07-17 23:04:05 +10:00
web [lane B+C] L5 Large Intestine: the dark, the gas, and The Blockage — the campaign is complete 2026-07-26 11:35:28 +10:00
.gitignore [lane A] The swept room + the acid sea, built — and it corrected me four times 2026-07-16 18:04:16 +10:00
README.md [infra] GUTS is live at partly.party/gutsy — deploy wired, ship-check clean 2026-07-17 23:02:04 +10:00

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.

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)

  1. Determinism. No Math.random outside js/core/rng.js. Seeded RNG only. qa.sh greps.
  2. Assets are optional. Missing texture/model/audio ⇒ procedural fallback, never a crash.
  3. Eyeball everything. Visual work isn't done until a screenshot is in docs/shots/laneX/.
  4. Perf budget: ≤300 draw calls, 60 fps on M-series / mid laptop. Measure via window.DBG.
  5. Free-first. Local MODELBEAST generation before any paid API; fal.ai is a gated fallback (John's go). See PIPELINE.md.
  6. 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-recreate or nginx image bump wipes it — re-run the script. The durable fix is a bind mount in forum/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.html serves 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.