b61004a18d3825cb9f5950f65afa535b93073b7c
Three things from the phone test. The drag meant two different things depending on invisible state: aiming from pretoss, but walking the player around while the last ball was still in the air. That "mode between the hits" read as a bug, so it's gone — canAimServe now covers every phase of splatter, and firing over a live ball is allowed again (the old one flies on as a ballistic clone). That was the mid-rally re-toss that used to be the spam vector, and it's safe now because the brake moved into the pull: a rhythm of lazy 30px pulls fires 100 shots in 30s and kills NOTHING (the court fills up instead), while 85 committed full pulls kill 11. hitServe never had doHit's net-clearance loop, so every shot at a shambler hugging the tape died in the net — not balance, a missing loop. Both paths now trade pace for arc until the ball is genuinely over, and the ceiling goes 8 -> 12 tries because a target right behind the net needs a near-vertical drop (measured: clears the tape by 0.20m and connects). The trade is real: the loft arrives slower and the walk-lead was computed for the original pace, so a lob is honestly the less reliable shot. And the camera now rises and leans back a little while the slingshot is drawn. That steeper look is what makes the gap between the net and the bodies behind it readable — the shot that used to be blind. Eased once per frame before anything projects, since one sheared frame would be visible. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Languages
JavaScript
75.2%
Python
15.8%
HTML
7.3%
Shell
1.4%
Swift
0.2%