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:
wuwiandClaude Fable 5 committed 2026-08-06 09:39:10 +02:00
1 parent d847c2e4a8
commit 8ab7ac0c25
4 files changed
+98 -10

No files matched your search

+10 -1
View File
@@ -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)