The friend across the net is no shambler: he just bleeds, and then he bursts

Two retest findings, one root: the death match borrowed the roster's
body. Gone — nothing spawns, no walk-on card, the living opponent is the
whole picture. His damage reads as blood (bleedO: an anchor per point
taken this game, love to game point, thin drops as ever), the game
point bursts him where he stands, and IT RISES AGAIN brings him back
clean. The heal beat became a card in netplay — a modal freezes this
world while the other phone's keeps moving.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Fable 5 committed 2026-08-14 18:10:50 +02:00
1 parent c0b59eee90
commit 4c47295a73
6 files changed
+95 -68

No files matched your search

+20 -18
View File
@@ -1283,26 +1283,37 @@ function freshNetDeath(side) {
netMsg({ t: 'start', side, death: true });
}
test('netplay death match: the host\'s pick rebuilds the court on pairing', () => {
test('netplay death match: the host\'s pick rebuilds the court on pairing — friend, not roster body', () => {
freshNetDeath('B');
assert.ok(G.net && G.net.ready && G.net.death, 'the wire survives the mode swap');
assert.equal(G.mode, 'splatter');
assert.ok(G.match && G.interlude, 'the match machinery owns the court');
assert.ok(zombies.some(z => z.variant === 'r'), 'the body is on court');
assert.ok(!zombies.some(z => z.variant === 'r'), 'NO roster body — the friend IS the opponent');
assert.equal(G.hideO, false, 'the living opponent is the picture');
assert.equal(G.card, null, 'and no SHAMBLER walk-on card');
assert.equal(score.server, 'O', 'the host serves first here too');
assert.equal(G.modal, null, 'no popup may eat the first remote serve');
});
test('netplay death match: their verdicts wound the body, mine cost blood — no echo', () => {
test('netplay death match: their lost points read as BLOOD, and the game bursts the body', () => {
freshNetDeath('A');
const rz = zombies.find(z => z.variant === 'r');
const hp0 = rz.hp;
netMsg({ t: 'pt', win: 'you' }); // their phone judged: my ball beat them
assert.ok(rz.hp < hp0, 'my point tears at the body');
assert.equal(score.pts[0], 1, 'the point banks — bleedO rides this ramp');
assert.ok(!netTest.sent.some(m => m.t === 'pt'), 'applying a verdict does not echo one back');
const blood = G.hp;
netMsg({ t: 'pt', win: 'me' }); // their phone judged: their ball beat me
assert.equal(G.hp, blood - 1, 'their point draws my blood');
score.pts = [3, 0]; // game point against them: the flow at full ramp
const before = parts.length;
for (let i = 0; i < 30; i++) update(DT);
assert.ok(parts.length > before, 'a deeply wounded friend bleeds dynamically (bleedO)');
netMsg({ t: 'pt', win: 'you' }); // the game-winning point
assert.equal(score.games[0], 1, 'game banked');
assert.deepEqual(score.pts, [0, 0], 'the blood ramp resets with the body');
assert.equal(G.hideO, true, 'the burst took the body');
for (let i = 0; i < 60 * 25 && G.hideO; i++) update(DT);
assert.equal(G.hideO, false, 'the mop beat hands the court back and the friend rises again');
assert.equal(G.match.opp, 1, 'no roster climb — the same friend, every game');
});
test('netplay death match: the receiver judges — an untouched winner draws blood and crosses the wire', () => {
@@ -1329,18 +1340,9 @@ test('netplay death match: bleeding out is said on the wire, and the other phone
assert.equal(G.match.felled, 3, 'felled = the games that actually burst the body');
});
test('netplay death match: the same friend walks back on — no roster climb', () => {
freshNetDeath('A');
const opp0 = G.match.opp;
for (let i = 0; i < 4; i++) netMsg({ t: 'pt', win: 'you' }); // four points = the game = the burst
assert.equal(G.match.opp, opp0, 'the opponent number holds through the game win');
for (let i = 0; i < 60 * 25 && !zombies.some(z => z.variant === 'r'); i++) update(DT);
assert.ok(zombies.some(z => z.variant === 'r'), 'the body returns after the mop beat');
assert.equal(G.match.opp, opp0, 'as the same opponent, not the roster\'s next rung');
});
test('death match: the game-winning body bleeds out on the ground before it bursts', () => {
freshNetDeath('A');
test('death match (solo): the game-winning body bleeds out on the ground before it bursts', () => {
assert.ok(_startMatch(), 'solo match on a clean court');
G.modal = null; G.modalQ.length = 0;
const rz = zombies.find(z => z.variant === 'r');
G.matchFall = { t: 0.3, from: 1, vx: 0, x0: rz.x, kill: true }; // landed, prone, pre-burst
const before = parts.length;