The finishing shot is spent, and the wound skins come back
"one-shot is bad - way too easy - also we're losing all the nice gore animation sprites" and "I noticed the last kill of a game can carry to the spawn of a new zombie of the next round". drillOneShot is off. The second half of that note is the part worth remembering: a 1 hp body never passes through a wound stage, so every skin in ZWOUND — arm off, ribs out, still walking — is skipped and the roster's best art never renders at all. Kept as a switch, never a default. The carry-over was a real unfairness, not a curiosity. A ball keeps pace through a kill and travels UP-COURT, which is exactly where the next batch is born — so the shot that finished your round flew on into bodies that did not exist when you took it, and faulted you on a round you had not been shown yet. The shot that ends a round is spent now, and drillCaught does the same since it also refills the court up-court. Pierce within a batch is untouched: that is honest occlusion you could have read, this was not. Verified with real aimed serves through a whole round: round banks, ball goes inactive, the next batch walks on with 0 faults and a clean sequence, and the gang carries roster HP again (brute 5, ball boy 3). 33 tests, 15 seeds clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
0f524a08c9
commit
57e96d629e
5 files changed
+71
-22
No files matched your search
+8
-1
@@ -19,7 +19,7 @@
|
||||
// render.js reads DRILL_COLS and draws.
|
||||
|
||||
import { TUNE } from './config.js';
|
||||
import { G } from './state.js';
|
||||
import { G, ball } from './state.js';
|
||||
import { zombies, spawnZombie } from './zombies.js';
|
||||
import { voice } from './audio.js';
|
||||
|
||||
@@ -176,6 +176,12 @@ export function drillKill(zb) {
|
||||
if (d.step >= d.seq.length) { // round complete — and the next one is already here
|
||||
d.rounds++;
|
||||
d.msg = { text: 'GOOD', t: 0.9 };
|
||||
// THE SHOT THAT ENDS A ROUND IS SPENT. A ball keeps pace through a kill (TUNE.zPierce) and it
|
||||
// is travelling UP-COURT — which is exactly where the next batch is about to be born. So the
|
||||
// ball that finished your round flew on into bodies that did not exist when you took the shot
|
||||
// and faulted you on a round you had not been shown yet. Pierce WITHIN a batch stays: that is
|
||||
// honest occlusion you could have read. This is not.
|
||||
ball.active = false;
|
||||
newRound(d);
|
||||
}
|
||||
return;
|
||||
@@ -206,6 +212,7 @@ export function drillCaught(text = 'CAUGHT') {
|
||||
voice('game_opponent', 0.1);
|
||||
d.msg = { text, t: 1.8, bad: true };
|
||||
zombies.length = 0;
|
||||
ball.active = false; // same reason as the round-complete case: the court refills up-court
|
||||
d.seq = []; d.step = 0; d.faults = 0; d.spawnT = 0;
|
||||
d.t = Math.max(0, d.t - TUNE.drillCaughtBack); // ...and the ramp backs off a little
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user