Blood fountains at neck height over a body lying flat

Two notes off the bench, both about the fall.

THE BLEEDING DID NOT STOP. bleed()'s wound anchors are ABSOLUTE WORLD HEIGHTS —
the headless neck spurt is pinned at y = 1.5 m, the torn arm at 1.15 — so a
corpse lying flat through the whole 2 s floor hold kept spraying from where its
neck used to be, two metres above itself. Oliver: "the dynamic bleeding must
stop during fall as this looks like blood fountains midair." The line calling it
already said "open wounds bleed every frame they're STANDING" and never enforced
it; now it does. Measured on the headless stage: 20 particles emitted while
walking, 0 during the fall. Only the body G.matchFall owns is suppressed —
everything else on court bleeds as before.

THE SLIDE NOW FINISHES BEFORE THE RISE. "The slide must be finished before the
rise" — a body pushing itself back onto its feet is planted, and still drifting
while it stands up reads as the court moving under it. fallSlideMix goes
[.10 .30 .45 .15] -> [.12 .35 .53 0], the rise's share redistributed across the
first three IN PROPORTION so the total travel is unchanged: 0.06 / 0.26 / 0.41 /
0.000 m, still 0.77 m end to end.

Watch fall3: it carries 0.41 m over its 2 s hold now. The ease-out front-loads
it so it should still read as a skid that settles rather than a creep, and if it
drags, share moves back into fall2.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-08-13 08:23:19 +02:00
1 parent f1af5c9a72
commit 031a203bb4
3 files changed
+13 -4

No files matched your search

+1 -1
View File
@@ -431,6 +431,6 @@ if (location.hostname !== 'splatter-tennis.wuwi.one') {
</div>
</div>
</div>
<script type="module" src="src/main.js?v=208"></script>
<script type="module" src="src/main.js?v=209"></script>
</body>
</html>
+6 -2
View File
@@ -9,8 +9,12 @@ export const TUNE = {
playerSpeed: 5.4, aiSpeed: 4.3,
reach: 1.3, aiReach: 1.6, // tight contact radius: the assist positions you, the tap must be honest
fallSlideDist: 0.5, // s of run the collapse travels: total slide = the body's speed x this
fallSlideMix: [0.10, 0.30, 0.45, 0.15], // how that total is shared across fall1/fall2/fall3/rise, so
// the landing SKIDS and the rise still moves. Tuned in #bench (FALL button).
fallSlideMix: [0.12, 0.35, 0.53, 0], // how the total is shared across fall1/fall2/fall3/rise, so the
// landing SKIDS. THE RISE GETS NOTHING — "the slide must be finished before
// the rise": a body pushing itself back onto its feet is planted, and still
// drifting while it stands up reads as the court moving under it. The 0.15
// it used to take is redistributed across the first three in proportion, so
// the total travel is unchanged. Tuned in #bench with the FALL button.
proneSink: 0.20, // how far a fall3 frame drops, as a fraction of its own drawn height:
// its lowest ink is the RACKET, so bottom-aligning it floats the body
// (see the note at drawZombie's drawStatic call)
+6 -1
View File
@@ -1018,7 +1018,12 @@ export function updateZombies(dt) {
if (zb.burnT > 0 && burnTick(zb, i, dt)) continue; // the fire finished it — the array moved under us
// a chapter boss is excluded: bossAI owns BOTH of its axes, and leaving this in advanced it twice
if (!held && zb.variant !== 'B') zb.z += zb.v * (zb.burnT > 0 ? TUNE.burnPanic : 1) * dt;
bleed(zb); // open wounds bleed every frame they're standing
// ...AND A BODY ON THE GROUND IS NOT STANDING, which this line already said and did not enforce.
// bleed()'s wound anchors are ABSOLUTE world heights — the headless neck spurt is pinned at
// y = 1.5 m — so a corpse lying flat through the fall kept spraying from where its neck used to
// be, two metres above itself. Oliver: "this looks like blood fountains midair." The falling body
// is the one G.matchFall owns; every other body on court bleeds as before.
if (!(G.matchFall && zb.variant === 'r')) bleed(zb); // open wounds bleed every frame they're standing
if (zb.shieldT > 0) zb.shieldT -= dt; // staggered chair comes back up when this runs out
if (zb.hitT > 0) zb.hitT -= dt; // boss contact cooldown (see TUNE.bossHitCool)