Commit Graph
15 Commits
Author SHA1 Message Date
wuwiandClaude Fable 5 7069723042 Re-slice corrected bounce sheet; ball under the hand; stable landing rings
- p_bounce/p_bounce2 re-extracted from Oliver's corrected _sheet_pbounce.png
  (racket properly in the right hand)
- bounce ball offset 0.4 -> 0.32 so it sits under the reaching hand
- landing rings draw with integer-snapped center/radii and a solid 2px
  stroke — the sub-pixel anti-aliasing shimmer read as flickering

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 15:11:30 +02:00
wuwiandClaude Fable 5 91da24f1a7 Serve stance can no longer render mirrored
The sprite file was fine — drawChar mirrors sprites by P.facing, which
persisted from the last run direction, so the pre-serve bounce stance
randomly flipped (racket in the wrong hand, ball beside the wrong hand).
setupPoint now resets both players to the canonical righty stance.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 15:01:59 +02:00
wuwiandClaude Fable 5 34f31a65a2 4-frame ball boy run cycle; steady two-frame serve bounce stance
- boy runs on a proper 4-phase cycle (stride, pass, mirrored stride, pass)
- server holds the crouched bounce stance through pretoss instead of
  flickering to standing idle; hand-down/hand-up frames sync with the ball,
  which now bounces floor-to-hand height

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 14:55:21 +02:00
wuwiandClaude Fable 5 456e168c27 Topspin pace model, beatable CPU, boy run cycle, umpire reverb, z-order fix
- fake topspin: quality shots dive under extra effective gravity, so real pace
  (up to 28 m/s) can clear the net AND land in — without it the net-clearance
  loop silently slowed every shot to a coverable lob, which is why the CPU
  returned everything regardless of aim
- no grass-scraping: balls below ankle height (0.24m) are past you, both sides
- CPU: 0.45s shot-read delay, 4.3 m/s legs, half-speed recovery between shots.
  Verified gradient: perfect/good corner shots are winners, center balls and
  weak shots still come back
- player aimed shots go wider (3.3m vs 2.7m)
- ball boy: nano-banana mirrored stride frames (was stride-vs-hop), height
  1.2m, z-ordered against umpire and CPU (no more running over the chair)
- umpire voice through a synthesized convolver reverb — center-court PA echo

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 14:41:58 +02:00
wuwiandClaude Fable 5 f3c2af4ef5 Catchability contract: every ball reachable via auto-run, timing is the skill
- intercept() now picks a point the runner can actually reach in time
  (travel-time feasibility), falling back to the deepest hittable point
- tapping no longer slows the auto-run: anticipating a shot doesn't lose it
- assist legs slightly superhuman (1.15x) so positioning is guaranteed
- ball boy run frames regenerated with contrasting stride/gather poses
  (previous pair was near-identical, which read as no animation)

Verified: 10/10 CPU shots end inside the honest 1.3m contact radius with
zero manual movement.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 14:21:52 +02:00
wuwiandClaude Fable 5 769dea8755 Ball boys sprint across the field; honest hit registration
- ball boy redesign: spawns at the sideline on point end, sprints across at
  the ball's depth with a proper side-view run animation, scoops the ball
  mid-run, despawns off the other side (no more net-post idling/sliding)
- hit feel: ball snaps to the racket at the contact frame so hits visually
  connect; contact radius tightened 1.7 -> 1.3 (assist does the positioning,
  the tap must be honest); missed swings now play an audible swish

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 14:12:11 +02:00
wuwiandClaude Fable 5 9e6e686cff Landing rings, ball-boy fetching, 2x sprite density, assist flicker fix
- 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>
2026-07-11 13:56:18 +02:00
wuwiandClaude Fable 5 dc1e12b9b6 Recorded umpire voice, court staff, out-zone borders, intro overlay, no-cache deploys
- 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>
2026-07-11 13:38:28 +02:00
wuwiandClaude Fable 5 d69896ddb8 Assist predicts the interception point instead of chasing the ball
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>
2026-07-11 10:45:36 +02:00
wuwiandClaude Fable 5 9268529c8f Generated idle/serve animation sprites; assist runs at full speed with animation
- 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>
2026-07-11 10:22:10 +02:00
wuwiandClaude Fable 5 65bd187633 CPU returns clear the net; serve/idle/run animations; iOS speech unlock
- 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>
2026-07-11 10:12:48 +02:00
wuwiandClaude Fable 5 c176ff6950 Fix CPU never returning: gate/contact radius mismatch caused guaranteed early whiff
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>
2026-07-11 10:02:47 +02:00
wuwiandClaude Fable 5 05c7d636d8 Portrait mode and one-handed touch controls (drag/flick/tap)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 09:51:21 +02:00
wuwiandClaude Fable 5 c2ba256b3b Add touch controls and nginx Dockerfile for Coolify deploy
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 09:30:26 +02:00
wuwi 7bedb2d215 initial commit 2026-07-11 09:23:01 +02:00