The receiver stands where the serve can actually go

The trick: hard serve, slight slide, and the first ten opponents died where
they stood. Measured headless — that serve was returned 0 times out of 24 at
EVERY rung. Three things were wrong and all three were the same thing: he
waited on the tennis mark 1.3 m off the centre line (covering the T, conceding
the whole corner), he took no first step, and he chased the ball's LIVE
position, which during a serve is still up by the server's baseline.

Now: he waits on the bisector of the serves he has to cover, takes a
returner's first step (serve-scoped — the rally is untouched), and runs at the
bounce instead of at the ball. The slid serve comes back from rung one; a
flush serve into the very corner of the box still aces the bottom of the
ladder, which is the reward placement is supposed to earn.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-08-15 20:29:17 +02:00
1 parent ece27827e5
commit 86b8275f5d
6 files changed
+77 -10

No files matched your search

+7
View File
@@ -421,6 +421,13 @@ export function matchReady() { // exported for net.js: a paired death match re-p
// machinery is driven off — on exactly that spot, so the zombie simply takes it. One source for
// the mark, which is what stops the picture and the ballistics disagreeing about where it stands.
if (rz) {
// WHERE A RETURNER ACTUALLY STANDS. The tennis mark is 1.3 m off the centre line, and from
// there he bisects nothing: the T is one step away and the corner of the box is four. Measured
// headless, a flush serve with full sway into that corner was returned 0 times out of 20 at
// EVERY rung of the ladder — Oliver: "the first ten zombies can be killed the moment you
// serve". He now stands out on the bisector of the two serves he has to cover, which is what a
// real receiver does, and O takes the same mark so the picture and the ballistics still agree.
if (score.server === 'P') O.x = Math.sign(O.x || 1) * TUNE.matchRecvX;
rz.x = O.x; rz.z = score.server === 'O' ? O.z : 1.0;
rz.pose = 'idle'; rz.swingT = -1; rz.swingCool = 0.3;
rz.showFrame = null; rz.serveHold = 0;