A burst fires for its whole window, and the countdown is the tile itself

The gun, beacon, flamer and rocket fell silent the moment they cleared the court:
firing and steering were both gated on phase 'rally', and every beat raised by the
kill that empties the court (a point, a won game, the mop-up) parks the phase in
'over'. A burst is its own control mode for its whole len, like a horde — its own
clock is the only thing that ends it. Not fixed by forcing the phase back to rally:
a parked 'over' beat that never expires is how pendingHorde gets stranded.

The countdown moved off the tile's bottom edge (the rounded frame, and the bottom of
the screen) into the tile: the armed slot's well drains as a gold wash, clipped to
its own rounded path, under the icon and labels.

16 tests.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-08-11 16:49:02 +02:00
1 parent 5ea84f8511
commit c659b6882f
6 files changed
+59 -7

No files matched your search

+6 -1
View File
@@ -927,7 +927,12 @@ export function updateZombies(dt) {
G.mgT -= dt;
// whichever gun-like weapon is armed sets the rate and the round (see config.WEAPONS). A
const gw = WEAPONS[G.gunId] || WEAPONS.gun;
if (G.phase === 'rally' && gw.rate && (G.mgCool -= dt) <= 0) { firePellet(gw); G.mgCool = 1 / gw.rate; }
// NO PHASE GUARD. It used to require 'rally', and the beats that fire the moment a burst
// clears the court all park the phase in 'over' (a point, a won game, the mop-up) — so the
// weapon fell silent exactly when it had killed everything, which reads as the gun jamming
// ("it should just fire on"). A burst is its own control mode for its whole `len`, like a
// horde: the clock above is what ends it, never the beat playing behind it.
if (gw.rate && (G.mgCool -= dt) <= 0) { firePellet(gw); G.mgCool = 1 / gw.rate; }
if (G.mgT <= 0) { endBurst(); setupPoint(); } // window over: spend the tin, resume the serve loop
}
if (!G.horde && !G.changeover && !G.interlude && !G.clearing && !G.bossFight) { // breathers, duels, the mop-up after a won game AND a boss fight all get a quiet court (no new spawns)