The colour goes on the court, and the dead go off like everyone else
"the colored zombies should also explode like they did before and make the normal splash sound on destruction.. no bleeps please.. can we make the color as a color circle the walk on? the sign they're holding is not nice. also remove the ball slicing in this mode.. this leads to unwanted hits". The silent deaths were my bug: the hook in killZombie did drillKill(zb) and then RETURNED, and everything below that return is the death — decal, pile, 36-particle burst, splat, headshot crack. It resolves after the splice and without returning now. Both halves are load-bearing and each was a bug in turn: splice first or a freshly drawn combination names the corpse; don't return, or the body simply vanishes. The colour is a disc on the court the body walks on, drawn before the sprite. The bib was a flat quad pinned to a walking sprite — UI stuck onto a character, covering the art it sat on. On the ground it takes the court's own perspective, measures 12.4px across at the spawn line against a chest patch's few, and hides none of the sprite. A hard dark rim plus a bright inner line is what keeps it from reading as another gore decal. No slicing in the drill: a cut ball leaves the corpse and strikes whatever it finds next, which in a mode where the wrong body is the failure is the game choosing your target for you, badly. And the mode has no sound of its own now, deliberately. The umpire reading the list was vetoed, the arpeggio that replaced him was vetoed. blip() is deleted. A kill bursts and splats like every other kill in this game; the strip carries the list. 28 tests. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
abd6d4f789
commit
d775ac40ec
7 files changed
+96
-72
No files matched your search
+13
-7
@@ -477,12 +477,6 @@ function killZombie(i, quiet) {
|
||||
const zb = zombies[i];
|
||||
// The drill's ONE rule, read at the single point every weapon routes through — hooking the ball
|
||||
// path instead would have the swish, the pellets and the blast silently exempt from the order.
|
||||
// SPLICE FIRST, THEN RESOLVE. drillKill can draw a new combination on the spot (a double fault
|
||||
// re-calls the survivors, an emptied batch brings in the next one) and it draws from whatever is
|
||||
// standing in `zombies` — so running it before the splice let the new combination name the body
|
||||
// that was in the middle of dying. That is a round asking for a colour which is not on court,
|
||||
// i.e. exactly the un-winnable state this mode is built to make impossible.
|
||||
if (G.drill && zb.bib !== undefined) { zombies.splice(i, 1); drillKill(zb); return; }
|
||||
const mul = GORE_MUL[zb.variant] || 1;
|
||||
// BEFORE the early returns below: the ball machine is furniture but it is still a thing you put
|
||||
// down, so it earns a row. The barrel is loot and scores nothing anywhere else in the game —
|
||||
@@ -491,6 +485,15 @@ function killZombie(i, quiet) {
|
||||
if (zb.variant !== 'o')
|
||||
tally(zb.variant === 'B' ? 'B' + Math.max(0, BOSS_ART.indexOf(zb.art)) : zb.variant, CAUSE);
|
||||
zombies.splice(i, 1);
|
||||
// THE DRILL RESOLVES HERE — after the splice, and WITHOUT returning. Both halves are load-bearing:
|
||||
// splice first, because drillKill can draw a new combination on the spot (a double fault
|
||||
// re-calls the survivors, an emptied batch brings in the next one) off whatever is standing in
|
||||
// `zombies` — resolving first let the new combination name the body that was in the middle of
|
||||
// dying, i.e. a round asking for a colour that is not on court;
|
||||
// and no early return, because everything below is the DEATH — the blood decal, the pile, the
|
||||
// particle burst, the splat and the headshot crack. The first cut returned here and bibbed
|
||||
// bodies died silently and cleanly, which is not what this game does to anybody.
|
||||
if (G.drill && zb.bib !== undefined) drillKill(zb);
|
||||
if (zb.variant === 'B') bossDeath(zb); // before endBossFight below, so the card can wait on it
|
||||
if (zb.variant === 'o') { popBarrel(zb); return; } // a container: it pays out and scores NOTHING
|
||||
if (zb.variant === 'm') { // furniture, not a body: no blood, no mound, no mop boy
|
||||
@@ -704,7 +707,10 @@ function splatter(i, fanfare = true) { // the MAIN ball hit a zombie
|
||||
// steward or boss ever carries one on. See sliceCarom for why this is a single strike and not a
|
||||
// steer. The new arc is solved from the CORPSE's position, not the ball's, because at this point
|
||||
// in the frame the ball is still a hair short of the body it just burst.
|
||||
if (ball.chain > 0) {
|
||||
// NOT IN THE DRILL. A slice leaves the corpse and strikes whatever it finds next — in a mode where
|
||||
// hitting the wrong body IS the failure that is the game choosing your target for you, and choosing
|
||||
// it badly. Oliver: "remove the ball slicing in this mode.. this leads to unwanted hits".
|
||||
if (ball.chain > 0 && !G.drill) {
|
||||
const nx = nearestTo(zx, zz, TUNE.sliceR, ball, TUNE.sliceArc * Math.PI / 180);
|
||||
if (nx) {
|
||||
ball.chain--;
|
||||
|
||||
Reference in new issue
Block a user