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
@@ -581,6 +581,13 @@ export const TUNE = {
racketStride: 0.42, // m the racket zombie covers per walk frame — his cycle steps off GROUND
// COVERED, so he stops animating when he stops moving
racketSpeed: 2.8, // m/s the racket zombie shambles to chase a ball
aiRead: 0.8, // how much of the BOUNCE the racket zombie reads while the ball is in the air:
// 0 = the old pure pursuit of the live ball (a hard, angled serve was an
// automatic ace — 0/40 returned, measured), 1 = never wrong-footed. See racketAI.
matchRecvX: 2.45, // m off the centre line the match opponent WAITS on, receiving. The tennis mark
// (1.3) covers the T and concedes the corner; the box runs to 4.1. See matchReady.
aiReturnDash: 1.3, // ...and how much faster he moves for the SERVE only, the first step a
// returner takes. Serve-scoped on purpose: the rally is unchanged.
racketQMax: 0.55, // its return quality is capped here (slower, sloppier than the tennis CPU)
racketFlub: 0.2, // chance the racket zombie whiffs a return
missHud: 0, // show the last miss reason on screen (full log: T.G.missLog) — off; dev-only