4e4311b568
4 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
9f6e91fd8f |
[lane B+C] The Tapeworm and the churn: both deferrals closed, campaign ready for playtest
The two things I deferred out loud, built — and the second one turned out to be the primitive
the first was waiting on.
THE CHURN (the force primitive). Everything in hazards.js pushed the player RADIALLY; nothing
applied a tangential one, which is why both L3's cyclones and the Guardian's arena churn got
deferred. `churn` is now a hazard kind: a tangential impulse that REVERSES on a period, so it
cannot be leaned into, only re-read. Measured: 4.32 u/s of push, direction flipping.
- L3 s1100: cyclones spanning the sea, deliberately overlapping the first tide — the room
starts spinning you at the exact moment the safe air starts shrinking.
- The Pyloric Guardian carries its own (`def.churn` + per-phase `churnMul`), so C's spec is
finally honoured in full: "pushes you at the walls", x1.5 in P2, harder in P3. Measured
2.7 u/s on the player mid-fight. The boss.js header that said this was missing is corrected.
THE TAPEWORM (LANE_C_NOTES §2), the campaign's third pressure: a DISTANCE race. One new idea in
the schedule — `flee` — advances the boss's own s and drags its ring along at fixed offsets, so
6 proglottids string out 70 units down the tube ahead of you instead of sitting in a
cross-section. Fall 110 units behind and it is gone. Verified both ways: fall behind ->
"escaped" after 16.8s having seen only P1; keep up -> all three phases -> win. C's line was "a
chase you can lose without dying", and that is now literally the outcome table.
Placed at L4 s5460, immediately before the biofilm cash-out, so the chase and the reward land
together. L4's "no_miniboss_yet" note is replaced rather than left lying.
PRE-PLAYTEST SWEEP: 6/6 levels valid, all load with ZERO console errors, every level carries
exactly 3 biopsy samples, five bosses across the campaign (mast_cell / pyloric_guardian /
tapeworm / the_blockage / appendix_sovereign), 16,820 units of authored canal, and the chain
resolves L1 -> L2 -> L3 -> L4 -> L5 -> end with LS_appendix rejoining at L5.
Everything in the GDD's roster now exists except the numbers being right, and that is the part
only humans can tell us.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
||
|
|
87a4803bde |
[lane A+B+C] L3 Stomach: the acid sea, and pH as a resource you can see
The last skeleton. L3 has been 4 events since round 1, waiting (in its own status field) on
"the pH field" and a boss framework; both exist now, so the level is authored: 46 events,
2500 units, the sea, and the Guardian at the end of it.
THE PH MECHANIC, finally load-bearing. Lane A built an acid plane in round 2 and left two
hooks on it — depthAt() labelled "B:" and set() labelled "C's event pump drives this" — and
nothing had ever called either. Now:
- player.js scales the biome's ambient coat drain by SUBMERSION. Stomach 2.2/s x5 = 11/s
under the surface (measured: 8/s net of regen, and regen is off for 2.5s after any hit,
so it is brutal mid-fight); x0.15 above it, which is effectively safe air.
- a new `acid` level event names a target height and boot eases the sea toward it in step(),
so a RISING TIDE is a beat C can author. L3 uses two: -14 -> -6 mid-sea, then -6 -> +2 in
the antrum, where the surface goes ABOVE the centreline and the safe lane simply stops
existing. Measured: the identical spot (y -5) goes from 0/s to 9.67/s across that tide.
This is the GDD's "mucus shallows are safe lanes" expressed as DEPTH rather than wall-hugging,
which is better on two counts: it reads instantly (you can SEE the surface) and it makes the
vertical axis matter in the one level that is a room. Every collectible worth having is under it.
Gated on the sea's s-span, not on depthAt alone — depthAt returns a bare -1 outside the span
and that is indistinguishable from "1 unit above the surface", so reading it naively would have
quietly scaled ambient drain on every level in the game. Caught before it shipped.
Level: cardia (still teal, so the fundus can REVEAL the sea) -> fundus (the teaching room:
huge, low tide, nothing kills you fast) -> body (the sea proper, tide rises while you are in
it) -> antrum (no safe air left, only speed) -> pyloric antrum (the Guardian). H. pylori is
taught alone in the dome and tested in a rising sea; pepsin swarms scale 3 -> 6; bezoar_chunk
is a new catalogue row for the stomach's traffic.
L3 has NO commensals and no biofilm gate, which is anatomically exact — acid sterilises, which
is why H. pylori is famous for surviving it. So BIOME STANDING goes quiet for nine minutes and
comes back in L4, which makes L4's colonies read as relief rather than furniture.
C's sim: par 540s vs par-pace 555s ("requires pushing above par-pace"), pressure
3.75/1.50/2.44/2.16, min clearance 7.15 vs the 2.5 law, all 21 checkpoint gaps under 30s.
par.score corrected 9000 -> 5500, because 9000 was above everything the level can actually pay.
Deferred, and said out loud rather than quietly dropped: churn cyclones. A vortex that flings
the player is a FORCE and no hazard in the tree applies one; it wants the same A/B work as the
Guardian's arena churn and should land with it.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
||
|
|
2e85ec0622 |
[lane C] Round 2 WIP (session cut off): schema v2, surf-aware pacing, chase analysis, --probe
Landed before the cut: schema v2 (segments[].wave.amp override, validated — breathe stays biome-owned); hiatus re-authored tight AND calm (radius back to 6.5, amp 0.6, 3.3u steady clearance); par 210 -> 180 with full rationale (below throttle-only par-pace, above a surf run — the medal teaches the mechanic); finale surge 21 -> 24 so surfing is the stylish escape (required 1.20x); surf profile reads A's live CREST_FACTOR; chaseAnalysis() + escapability laws in validate; NEW --probe builds A's real canal and measures clearance against the model (all L2 segments clear the 2.5 floor, hiatus 3.75); isMain guard + importSpline shim — fixes A's selfcheck process.exit killing C's mid-run (qa.sh had been green on one level out of three). Cut off before: fly-through of the integrated build (blocked on B), pickup economy handover (B proposed numbers in balance.js meanwhile — reconcile), L1 encounter design doc, GDD boss folding, NOTES. Committed by F to protect the shared tree; levels selfcheck 3/3 GREEN. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
1b5ec767cd |
[lane C] Round 1: schema v1, levels registry + selfcheck + pacing sim, L2 vertical slice
Data spine: - Schema v1 ratified (TECH.md, C-owned). Additive over v0: schema/par/next, segment name, cross-section placement (theta/rho as a FRACTION of safe radius), spread, span, pickup+gate event types, hazard params. STUB_LEVEL synced (that const only, per ROUND1 §Lane C.1) — world.hash() unchanged (1bdf001), geometry provably untouched. - levels/index.js: registry + loader (node+browser, no THREE), real schema selfcheck (qa's --selfcheck hook is now live) and a pacing simulator (--sim). Consumes the other lanes' contracts live rather than restating them: A's biomes.js for ids and wave.amp+breathe, A's SKIN, B's tuning.js hull radius, B's balance.js for scores. - levels/enemies.js (fiction id -> archetype join table), levels/difficulty.js. L2_esophagus — the vertical slice, complete: 3600 units, 7 beats, 47 events, 65 enemies, 10 checkpoints, 3 samples, reflux-surge finale. L1/L3 skeletons (shape only). Anatomy is the level designer: the three real esophageal constrictions are the three setpieces, and all three enemies are real esophageal pathology (bolus chunk, eosinophilic esophagitis, candida esophagitis). Measured (node web/js/levels/index.js --selfcheck|--sim; qa GREEN): - selfcheck 3/3 valid, exit 0. - pressure curve 0.27 -> 2.14 -> 4.35 -> 0.69 -> 4.53 -> 6.35 -> 4.40 (breather/pressure/ spike/breather/pressure/peak/finale). - par 3:30 vs measured 2:47 speedrun / 3:19 par-pace / 4:22 timid; par.score 9000 of a 9400 kill budget (95%), computed from B's scores. - all 10 checkpoint gaps within the <=30s death-cost law (max 28.8s); min clearance 2.73. Two contract collisions found and resolved (LANE_C_NOTES): - Biome ids: authored mouth/pharynx/cardia/pylorus; A's registry has six canonical ids and rejected all four. A is right — biome = look, segments[].name = anatomy. Conformed. - Balance: my first enemies.js restated hp/size/speed/score that B owns in balance.js. Cut to a join table; index.js reads B's scores via scoreFor(). Caught live: A raised esophagus wave.amp 0.9 -> 1.4 mid-session, making the diaphragmatic hiatus unflyable (2.33 vs the 2.5 floor). Widened 6.5 -> 6.8. The invariant also failed my own aortic constriction's first draft (radius 7, symmetric squeeze) -> radius 9, directional. No in-engine flythrough: ?stub=1&lvl= does not compose (snippet offered to F) and the stub is single-segment, so it could only render beat 1. The pacing evidence is a kinematic model, not a playtest — it proves L2 is flyable, paced and survivable, not that it feels good. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |