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:
1 parent
5ea84f8511
commit
c659b6882f
6 files changed
+59
-7
No files matched your search
@@ -63,7 +63,7 @@ globalThis.getComputedStyle = () => ({ paddingTop: '0' });
|
||||
const { G, P, score, ball, setupPoint } = await import('./src/state.js');
|
||||
const { update, forceZombies, splatPoint, restartRun } = await import('./src/gameplay.js');
|
||||
const { startDuel, resolveInterlude, startBossFight, endBossFight } = await import('./src/beats.js');
|
||||
const { zombies, spawnZombie } = await import('./src/zombies.js');
|
||||
const { zombies, spawnZombie, pellets } = await import('./src/zombies.js');
|
||||
const { TUNE, bossArt } = await import('./src/config.js');
|
||||
|
||||
const DT = 1 / 60;
|
||||
@@ -256,5 +256,18 @@ test('a chapter boss announces itself and hands the court back on its own', () =
|
||||
assert.ok(G.bossFight, 'the fight is on');
|
||||
});
|
||||
|
||||
test('a burst fires through the beat that follows the kill that emptied the court', () => {
|
||||
// The gun/flamer/beacon used to require phase 'rally', and every beat raised by clearing the
|
||||
// court (a point, a won game, the mop-up) parks the phase in 'over' — so the weapon fell silent
|
||||
// exactly when it had killed everything. Its OWN clock is the only thing that ends it.
|
||||
G.mgT = 2; G.gunId = 'flamer'; G.mgCool = 0;
|
||||
G.phase = 'over'; G.overT = 1.5; // the won-game beat, running behind the burst
|
||||
pellets.length = 0;
|
||||
for (let i = 0; i < 30; i++) { update(DT); zombies.length = 0; } // an empty court, as after the last kill
|
||||
assert.equal(G.phase, 'over', 'setup: the beat is still running');
|
||||
assert.ok(pellets.length > 0, 'the burst keeps firing through it');
|
||||
assert.ok(G.mgT > 0, 'and its window is still open');
|
||||
});
|
||||
|
||||
console.log(`\n${passed} tests passed`);
|
||||
process.exit(0); // render.js schedules viewport timers at load; don't let them outlive the report
|
||||
Reference in new issue
Block a user