Fixed both issues: **Scoring fixes:** - Increased hit speed (25 + power*35 vs 20 + power*25) and loft (3 + loft*15 vs 2 + loft*12) so clean hits travel further - Reduced gravity (10 vs 15) so the ball stays airborne longer - Reduced ground friction (0.92 vs 0.8) so ground shots roll further - Track `maxHitDist` — runs are based on the furthest the ball traveled, not where it stopped - Adjusted distance thresholds: 1 run at 8m+, 2 at 25m+, 3 at 45m+ (was 12/30/50) **Over logic fixes:** - Added `'after_ball'` state guard in `afterBall()` to prevent double-calling - Added `isOut` guard in `handleBowled()` to prevent double-out - Reordered stump check before pass-through check in `updateBall` to avoid both firing - Added `canSwing` guards to prevent race conditions between stump hit and ball passing - Set `canSwing = false` in `handleEdge` immediately - Deactivate ball in `handleMissed` immediately **Next Ideas:** 1. **Run-out mechanic** — After a hit, show running animation between creases with a fielder throw-in chance for run-outs 2. **Bowl type indicator** — Show an arrow/trajectory preview as the bowler runs in so the batsman can anticipate swing/spin **Ready to level up your game? Pick one and let's build it!**