From 031a203bb4ddb0dc282dc1d1fa3cc4f71cc8b7c3 Mon Sep 17 00:00:00 2001 From: Oliver Rieger Date: Thu, 13 Aug 2026 08:23:19 +0200 Subject: [PATCH] Blood fountains at neck height over a body lying flat MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- index.html | 2 +- src/config.js | 8 ++++++-- src/zombies.js | 7 ++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/index.html b/index.html index e8960fa..102820f 100644 --- a/index.html +++ b/index.html @@ -431,6 +431,6 @@ if (location.hostname !== 'splatter-tennis.wuwi.one') { - + diff --git a/src/config.js b/src/config.js index 3943a04..cecae40 100644 --- a/src/config.js +++ b/src/config.js @@ -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) diff --git a/src/zombies.js b/src/zombies.js index 451e8cd..33ffd57 100644 --- a/src/zombies.js +++ b/src/zombies.js @@ -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)