Commit Graph
6 Commits
Author SHA1 Message Date
wuwiandClaude Opus 4.8 ae8c04d413 UI polish: logo start screen, broadcast scoreboard, kill pips, best-run
- start screen: SPLATTER TENNIS logo + slogan, controls kept
- scoreboard redrawn as a real broadcast board (server ball, name, sets,
  games, highlighted points cell); weapon stock moved to a status strip
- kills-to-next-point pips (NEXT ○○○) so the K-kill gate is visible;
  TUNE.killPips toggles it
- miss-debug HUD off by default (TUNE.missHud 0), dev-only now
- eaten screen crows "NEW BEST" when the run beats the stored high score

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 15:10:29 +02:00
wuwiandClaude Fable 5 c506a631c2 Split the monolith into ES modules; hoist scattered magic numbers
game.js (830 lines) -> 9 modules, native ES modules so still zero build step:
  dom      canvas handles (imports nothing; keeps cycles harmless)
  config   TUNE (live-tunable) + structural constants
  state    all mutable game state (G) + setupPoint/sendBoy
  audio    sfx synthesis, recorded umpire voice, reverb, speech fallback
  input    keyboard + touch, exports axes and takeFlickAim()
  gameplay ballistics, swings, serve, rules, AI, update loop
  render   camera, viewport, sprites, crowd, all drawing
  panel    T tuning UI
  main     boot, loop, intro, window.T test hooks

Deduped into named constants: bounce tempo (was in 3 places), contact
height band, intercept zone depth, home positions, player bounds, toss
params, shot depths, pose hold time, sprite scale, actor heights. Also
extracted drawShadow/drawBall/expirePose from repeated code.

One intentional import cycle (input <-> gameplay), safe: both sides only
call functions at runtime, never during module evaluation.

Regression-verified in browser sims: point cycle, CPU returns 11/12,
assist contract 8/8, corner-winner gradient intact (0/12 perfect corners
returned, 10/12 center balls returned).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 15:38:15 +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 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