The serve gets stakes: tight apex window, depth rides quality, the strike flick aims

Three mechanical causes of 'no serve agency', measured then fixed:
- the 0.12 m perfect snap was ~0.3 s of hang time (now TUNE.apexSnap 0.05,
  and the gold band reads the same knob);
- the fixed mid-box target depth capped every good serve at ~36 m/s in the
  loft loop — player serve depth now rides quality, flush aims 0.3 m inside
  the service line (ladder: 49 / 52 hard / 36 mistimed / 30 bad);
- the strike flick was splatter-only — in tennis and the duel it now sways
  placement (horizontal) and buys pace (vertical, serveHard + serveHardSpin,
  the extra dive IS the clearance), paid for in scatter against the real
  fault machinery. Tap stays the safe second serve.

Phone verdict pending — see the PROJECT.md session log.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Fable 5 committed 2026-08-13 17:23:07 +02:00
1 parent c084d53497
commit de77ccfea5
6 files changed
+112 -20

No files matched your search

+13
View File
@@ -28,6 +28,19 @@ export const TUNE = {
// which is the "harder pull, faster ball" relationship, and it is in serveQualitySpeed's share
// of the pair. (baseShotSpeed is the rally volley — shared with tennis and the CPU.)
serveSpeed: 22.8, serveQualitySpeed: 26.4,
// THE TOSS STRIKE HAS REAL STAKES NOW (Oliver: "the golden mark is very easy to hit and hitting
// below it does not necessarily make a worse serve... no option to serve harder").
apexSnap: 0.05, // m of |ball - apex| that still counts flush (was a hardcoded 0.12 — at toss
// gravity that was ~0.3 s of PERFECT, which is why the mark felt free)
apexFall: 0.55, // m of miss at which quality hits the floor (was 0.9) — mistimes cost pace
// ...and the strike gesture AIMS it: a flick as you hit sways the target and buys pace.
serveAimX: 1.8, // m of sway a full flick puts on the target — centre box to the T or the line
serveHard: 9, // m/s of extra pace at full flick strength — the harder first serve
serveHardSpin: 0.45, // extra dip the hard serve carries. NOT free style: without it the loft
// loop cut the +9 m/s BELOW a plain flush serve (measured 47.2 vs 49.3) —
// the dive is what buys the pace its net clearance
serveHardErr: 1.6,// how much a hard serve multiplies the timing scatter: pace is paid for in
// faults, which is what makes tap = safe second serve a real decision
serveSpin: 1.3, // extra gravity a full-power serve carries (was a fixed 0.35). Without it the
// net-clearance loop ate the whole smash: a flat fast ball can't get over the
// tape AND come down on a target, so it got throttled back to walking pace.