The flick fires the moment it is a flick: the swing launches at the crossing, and the aim rides the thumb to contact
Oliver's service-line report: flicking the incoming ball LEFT was near impossible mid-court at the service line while RIGHT worked, easing toward the baseline. The lane math was symmetric to the centimetre — the defect was latency. The swing waited for the RELEASE, so the whole gesture ran as dead time on top of the windup: ~120 ms of lateness drops contact quality 1.0 -> 0.08, where flickReach halves the width and aimError drowns the rest. A left swipe is a right thumb's slowest direction, the service line leaves ~700-870 ms of budget (measured), and any swipe over FLICK_MS was silently dead. Left + service line was the slowest gesture meeting the shortest budget. Now, in rally modes: crossing flickMin fires the swing (once per gesture, rally phase only) and the vector stays LIVE — trySwing reads G.swipe at contact, with the released flickAim carrying the aim only when the ball arrives after the finger lifts. The FLICK_MS deadline goes with it where the crossing can fire; it survives where it cannot (gore free-aim, the serve strike). Serve gesture, duel, gore and keys untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
532dd3b83e
commit
6f9dea4ffc
5 files changed
+82
-15
No files matched your search
+4
-1
@@ -1283,7 +1283,10 @@ function trySwing(ch, isAI, qCap = TUNE.aiQualityMax) {
|
||||
let q = Math.max(0.05, 1 - off);
|
||||
if (Math.abs(t - center) * 1000 < TUNE.perfectMs) q = 1;
|
||||
ch.facing = dx >= 0 ? 1 : -1; // forehand right (righty), backhand left → mirrored sprite
|
||||
const flick = isAI ? null : takeFlickAim();
|
||||
// the LIVE swipe outranks the released one: since the crossing fires the swing (input.js), the
|
||||
// finger is usually still down at contact, and the vector under it NOW is the aim the player
|
||||
// means — the released flickAim only carries it when the ball arrives after the finger lifted.
|
||||
const flick = isAI ? null : (G.swipe || takeFlickAim());
|
||||
// SMART AIM (G.diff.smart, classic difficulty): with this probability the CPU plays the OPEN
|
||||
// COURT — the corner away from where you stand — instead of rolling a random lane. Random aim
|
||||
// sends a third of everything straight back to your racket; hunting the open corner is what
|
||||
|
||||
Reference in new issue
Block a user