The host names the stakes: classic tennis, or the death match

Three chips under VS A FRIEND — the host's pick rides the room and the
start message rebuilds both courts on pairing. In the death match your
opponent IS the zombie: their lost points tear its wound stages, their
won points draw your blood, and bleeding out crosses the wire as the
other phone's win. The same receiver-is-judge verdicts drive the match
machinery through resolveInterlude, so the fall, the mop beat and the
burst come along unmodified. New: gushProne — the game-winning body
bleeds out on the ground, from prone-height anchors, until it bursts.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Fable 5 committed 2026-08-14 18:02:44 +02:00
1 parent 5e80c4e69d
commit c0b59eee90
10 files changed
+241 -26

No files matched your search

+19
View File
@@ -907,6 +907,20 @@ const BLEED = {
g: [[-0.30, 1.95, 1.10], [0.42, 1.90, 1.00], [0.05, 2.35, 2.00], [0.00, 1.20, 0.70]], // arm, both, head, gut
k: [[-0.36, 2.30, 1.15], [0.50, 2.24, 1.05], [0.06, 2.80, 2.10], [0.00, 1.50, 0.75]], // the same, a head higher
};
// the kill fall's bleed-out: low anchors around the corpse itself, thin drops but many — the flow
// reads as the body emptying, not as a heavier version of the standing trickle (blood stays thin,
// the settled rule; this is more EMISSIONS from where the body actually is)
function gushProne(zb) {
if (parts.length > 150) return;
for (let i = 0; i < TUNE.killGush; i++) {
if (Math.random() > 0.75) continue;
parts.push({
x: zb.x + (Math.random() * 2 - 1) * 0.55, y: 0.22 + Math.random() * 0.3, z: zb.z + (Math.random() * 2 - 1) * 0.3,
vx: (Math.random() * 2 - 1) * 0.9, vy: 0.5 + Math.random() * 1.1, vz: (Math.random() * 2 - 1) * 0.5,
t: 0.35 + Math.random() * 0.35, dark: Math.random() < 0.55 });
}
}
function bleed(zb) {
if (parts.length > 90) return;
let wounds;
@@ -1025,6 +1039,11 @@ export function updateZombies(dt) {
// 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
// ...but a game-winning body BLEEDS OUT where it lies: once the drop has landed it, the prone
// hold gushes from ground height until the burst (Oliver: "increased dynamic bleeding before
// exploding"). Deliberately NOT bleed() — its anchors are standing heights, and a corpse
// spraying from where its neck used to be is the "blood fountains midair" bug fixed above.
else if (G.matchFall.kill && G.matchFall.t > 0.25) gushProne(zb);
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)