Zombie mode: kills-per-point knob so a game isn't 4 pot-shots

1 kill = 1 point made a tennis game trivially short (4 kills). Gate
player scoring behind TUNE.killsPerPoint (default 3) — K kills bank one
point, the rest just splatter. Opponent breaches stay 1-for-1, so the
asymmetry is where the pressure comes from. Live-tunable in the T panel;
set to 1 to restore the old behavior.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 4.8 committed 2026-07-13 14:39:18 +02:00
1 parent 5d815a4fc8
commit aa8d2fff36
3 files changed
+4

No files matched your search

+1
View File
@@ -27,6 +27,7 @@ export const TUNE = {
gameBeatT: 1.6, // s the game-end beat lasts on even (non-changeover) games gameBeatT: 1.6, // s the game-end beat lasts on even (non-changeover) games
eatenR: 0.9, // m a shambler must close to eat you — matches the visual sprite overlap eatenR: 0.9, // m a shambler must close to eat you — matches the visual sprite overlap
zSnap: 1.4, // m free-aim magnetism: a zombie this close to your flick's landing point is the target zSnap: 1.4, // m free-aim magnetism: a zombie this close to your flick's landing point is the target
killsPerPoint: 3, // splatter: zombie kills to score ONE tennis point (1 = every kill scores, old behavior)
zSplatQ: 0.5, // min shot quality to splatter; below = stagger pushback zSplatQ: 0.5, // min shot quality to splatter; below = stagger pushback
zPushback: 1.4, // m a staggered zombie is knocked back zPushback: 1.4, // m a staggered zombie is knocked back
splatterOverT: 0.1, // s the spent-ball 'over' beat lasts before the next serve is armed splatterOverT: 0.1, // s the spent-ball 'over' beat lasts before the next serve is armed
+2
View File
@@ -221,6 +221,8 @@ function pointTo(side, reason) {
// The scoreboard IS the progression: games drive spawn pressure, 6 games = a set = a horde, // The scoreboard IS the progression: games drive spawn pressure, 6 games = a set = a horde,
// odd games end in a changeover breather. // odd games end in a changeover breather.
export function splatPoint(side, quiet = false) { export function splatPoint(side, quiet = false) {
if (side === 'P' && ++G.killCount < TUNE.killsPerPoint) return; // K kills bank one point; the rest just splatter
if (side === 'P') G.killCount = 0;
const gameOver = advancePoint(side); const gameOver = advancePoint(side);
if (gameOver) { if (gameOver) {
G.runGames++; G.runGames++;
+1
View File
@@ -44,6 +44,7 @@ export const G = {
interlude: false, // sudden-death duel vs the racket zombie: falsy, or {introT} while announcing interlude: false, // sudden-death duel vs the racket zombie: falsy, or {introT} while announcing
duelLerp: 0, // 0..1 — how far the court has returned to tennis colors for the duel duelLerp: 0, // 0..1 — how far the court has returned to tennis colors for the duel
horde: null, // active horde wave {t, spawnT, mgT} — machine-gun racket, no serving horde: null, // active horde wave {t, spawnT, mgT} — machine-gun racket, no serving
killCount: 0, // splatter: kills banked toward the next point (see TUNE.killsPerPoint)
runGames: 0, // games finished this run (either side) — the difficulty director runGames: 0, // games finished this run (either side) — the difficulty director
sets: [0, 0], // splatter sets won [you, them]; 6 games = a set = a horde sets: [0, 0], // splatter sets won [you, them]; 6 games = a set = a horde
changeover: false, // the odd-game breather: no spawns, no serving, the boys mop changeover: false, // the odd-game breather: no spawns, no serving, the boys mop