- white ring shows where the incoming ball will land; yellow/red ring shows
where your shot will land (red = going out) — Mario-Tennis-style feedback
- ball boys wait at the net posts, fetch every dead ball, and trot home
- canvas renders at 2x density, all sprites re-sliced at 112px; run/swing
sheets regenerated in the finer style
- assist: 0.35m deadzone + facing hysteresis kills the left/right flicker;
player reach 1.5 -> 1.7
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 23 pre-recorded umpire lines (macOS say, en-GB Daniel) played via WebAudio,
works on mobile; speechSynthesis stays as fallback only
- umpire chair + two ball boys (generated sprites) dress the court
- court redrawn: doubles alleys, white perimeter border, clearly darker out area
- intro overlay with control symbols; first tap dismisses it and unlocks audio
- nginx now serves everything Cache-Control: no-cache so a reload always
revalidates and picks up new deploys
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Same predictive brain as the CPU: simulate the trajectory, run to where the
ball will be hittable (x and z), and drift back to home position after your
own shot. Full speed while chasing, 55% while recovering.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- new 5-pose sheets per character: idle weight-shift x2, ball-bounce crouch,
serve trophy pose (toss), overhead smash
- serve shows toss stance through the ball toss, smash frame on contact
- auto-assist: full player speed, adds depth tracking after the bounce,
and drives the run animation + facing like manual movement
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- doHit now trades pace for loft when contact is low, margin scales with
shot quality; AI prefers waist-high interception instead of ankle-height
- serve stance held through toss, run cycle with bob, receiver split-step,
server bounces the ball while waiting
- speechSynthesis unlocked inside first touch gesture for iOS
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The AI armed its swing at aiReach+0.4 but contact required aiReach, so it
always swung one guaranteed-whiff too early and the 0.4s cooldown consumed
the whole approach window. Also: predictive interception instead of ball-chasing,
shorter whiff recovery, slightly faster legs.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>