Go to file
type-two d39c0b9358 [lane A] Procedural epithelium: a Voronoi cell pavement in the wall shader
Stolen from the shader half of Sebastian Lague's graphics-library video (the Voronoi farm-plot
trick), because it turns out to be an anatomy tool rather than a decoration: mucosa at SEM scale
IS a Voronoi diagram. Lane D's own oral prompt asks FLUX for a "cobblestone pavement of flat
polygonal squamous epithelial cells" — that is a Voronoi described in English, and generating it
in the fragment shader instead is free, never repeats, and can do the one thing a baked texture
never will: BREATHE. Membrane width rides vPulse, the same wave the vertex shader displaces
with, so the pavement compresses exactly where the muscle contracts.

- F2-F1 Voronoi (9-tap), multiplied into the detail LUMINANCE, never added — D's texture stays
  the author of the look and this is structure underneath it. Applied to both the textured and
  the assets-optional fallback path.
- Rides D's own tiling (duv * scale), so cells hold their physical size on a radius-7 hiatus and
  a radius-70 sea — the upstream arc-length fix does that work for free.
- Compiled out with a define, not branched out on a uniform: a biome that wants no pavement pays
  nothing for nine hashes a pixel.

Per-biome, because a pavement is a CLAIM ABOUT TISSUE and not a filter: oral 0.50 (squamous
epithelium is the strongest case in the body), appendix 0.48 and colon 0.42 (biofilm mats are
literally cells), stomach 0.38 (gastric pits), small intestine 0.20 and esophagus 0.18 (villi
are projections and folds are folds — there it is a whisper that only breaks the texture repeat).

Verified: per-biome values reach the material (esophagus 0.18, not the 0.35 default), the effect
reads on the wall at gameplay distance, and world.hash() is byte-identical (bea3807c) before and
after — this is pixels only, the determinism law is untouched.

Not measured: frame cost on real hardware. Nine hashes per wall pixel is not free and the budget
is 60fps on mid laptops; if it bites, the honest lever is dropping the low-gain biomes to 0
(which compiles it out entirely) rather than cheapening the shader.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-25 23:53:26 +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 A] Procedural epithelium: a Voronoi cell pavement in the wall shader 2026-07-25 23:53:26 +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.