Ten small flourishes, all borrowed machinery
Kills stutter the world a touch more per streak; a massacre borrows the boss's slow-mo; a boss death gets the transition's zoom punch. PERFECT contact flashes a spark ring. The sidestep and every real bounce kick up court-tinted dust. The net cord ripples where the ball clips it. The landing ring contracts on time-to-touchdown. Hot rally balls drag three fading ghosts. And every 8-15 seconds the floodlights stutter. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
d847c2e4a8
commit
8ab7ac0c25
4 files changed
+98
-10
No files matched your search
+10
-1
@@ -390,6 +390,10 @@ function wreckMachine(zb) {
|
||||
// through the crowd's roar, and the card that announces it waits until the pieces have landed.
|
||||
function bossDeath(zb) {
|
||||
G.slowT = TUNE.bossSlowT; // real seconds; main.js scales dt while it runs
|
||||
// ...and the camera leans in on it: the transition's punch-in, reused at a gentler magnification,
|
||||
// riding the slow-mo so the longest fight in the game ends on a camera moment. T is GAME time
|
||||
// (update ticks zoom with the scaled dt), so the peak lands mid-slow-mo and eases out after.
|
||||
G.zoom = { x: zb.x, z: zb.z, k: 1.22, t: 0, T: 0.8 };
|
||||
G.bossBurst = { x: zb.x, z: zb.z, t: 0.75 }; // the shockwave ring render.js draws
|
||||
G.shake = { t: 0.5, mag: 7 }; G.boomFlash = 0.12;
|
||||
boom(); splat(1, bodySize(zb)); cheer(4, 1); voice('unbelievable', 0.5); // the biggest body in the game, at its lowest
|
||||
@@ -590,11 +594,16 @@ function splatter(i, fanfare = true) { // the MAIN ball hit a zombie
|
||||
ball.vx *= TUNE.zPierce; ball.vz *= TUNE.zPierce; // keep enough pace to plow through the next
|
||||
if (!fanfare) return; // machine-gun pellets splatter but skip the streak fanfare / bomb meter
|
||||
ball.kills++; // this shot's running streak
|
||||
// splat micro-freeze: every ball kill stutters the world a touch, and the stutter grows with the
|
||||
// streak, so a triple kill physically hitches three times. max(), never assignment — a bomb's own
|
||||
// 0.18 s freeze must not be trimmed by the kills it causes.
|
||||
G.hitstop = Math.max(G.hitstop, Math.min(0.09, 0.03 + 0.012 * ball.kills));
|
||||
// escalating multi-kill fanfare — one shot, ≥2 zombies
|
||||
// ...and the stat is banked on the TRANSITION to 2, so a massacre of six is one multi-kill
|
||||
if (ball.kills === 2) { multiKill(); G.flash = { text: 'DOUBLE KILL', t: 0.9 }; cheer(1.6, 0.45); voice('double_kill', 0.4); }
|
||||
else if (ball.kills === 3) { G.flash = { text: 'TRIPLE KILL', t: 0.9 }; cheer(2.2, 0.6); voice('triple_kill', 0.4); }
|
||||
else if (ball.kills >= 4) { G.flash = { text: `MASSACRE ×${ball.kills}`, t: 0.9 }; cheer(2.8, 0.7); voice('unbelievable', 0.4); }
|
||||
else if (ball.kills >= 4) { G.flash = { text: `MASSACRE ×${ball.kills}`, t: 0.9 }; cheer(2.8, 0.7); voice('unbelievable', 0.4);
|
||||
G.slowT = Math.max(G.slowT, 0.35); } // a massacre borrows the boss's slow-mo — the infra already runs every frame
|
||||
}
|
||||
|
||||
// ---- horde wave: dense spawns + an auto-firing machine-gun racket (pellets, not the match ball)
|
||||
|
||||
Reference in new issue
Block a user