Splatter aiming targets zombies anywhere; triple-tap the umpire to skip ahead
- doHit/hitServe in splatter mode lock onto zombies instead of tennis court depths: your flick picks the lane and depth band, the shot targets the best match anywhere on the court (including your own side) with a walking lead; serves auto-track the most advanced shambler - hidden shortcut: tap/click the umpire three times within 1.6s during tennis mode to summon the transition immediately Verified: near-side and far zombies killable, cheat triggers transition, tennis mode targeting untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
69e3a0c310
commit
60c5f72a0a
2 files changed
+65
-11
No files matched your search
@@ -3,12 +3,13 @@
|
||||
// Module map: config (tuning/constants) · state (mutable game state) · gameplay (logic/update)
|
||||
// render (camera/drawing) · input (keys/touch) · audio (sfx/umpire) · panel (T tuning UI)
|
||||
|
||||
import { TUNE } from './config.js';
|
||||
import { TUNE, COURT, UMP_H } from './config.js';
|
||||
import { P, O, ball, score, G, setupPoint } from './state.js';
|
||||
import { update, keyPressed, solveShot, inServeBox, inCourt } from './gameplay.js';
|
||||
import { update, keyPressed, solveShot, inServeBox, inCourt, forceZombies } from './gameplay.js';
|
||||
import { fitViewport, render, proj } from './render.js';
|
||||
import { voice } from './audio.js';
|
||||
import { zombies, spawnZombie } from './zombies.js';
|
||||
import { cv } from './dom.js';
|
||||
import './input.js';
|
||||
|
||||
let last = performance.now();
|
||||
@@ -30,6 +31,20 @@ function dismissIntro() {
|
||||
intro.addEventListener('pointerdown', e => { e.preventDefault(); dismissIntro(); });
|
||||
addEventListener('keydown', () => dismissIntro(), { once: true });
|
||||
|
||||
// hidden shortcut: tap the umpire three times to summon zombie mode early
|
||||
let umpTaps = [];
|
||||
cv.addEventListener('pointerdown', e => {
|
||||
const r = cv.getBoundingClientRect();
|
||||
const x = (e.clientX - r.left) / r.width * (cv.width / 2); // logical coords (RES = 2)
|
||||
const y = (e.clientY - r.top) / r.height * (cv.height / 2);
|
||||
const u = proj(7.1, 0, COURT.netZ);
|
||||
if (Math.abs(x - u.x) > 16 || y > u.y + 6 || y < u.y - UMP_H * u.s - 8) return;
|
||||
const now = performance.now();
|
||||
umpTaps = umpTaps.filter(t => now - t < 1600);
|
||||
umpTaps.push(now);
|
||||
if (umpTaps.length >= 3) { umpTaps = []; forceZombies(); }
|
||||
});
|
||||
|
||||
requestAnimationFrame(frame);
|
||||
|
||||
// exposed for in-browser sanity checks and simulated playtests
|
||||
|
||||
Reference in new issue
Block a user