The flick aims relative to the player: a full sweep from where you stand, not from the court's centre

Third round of the flick report, and this was the core all along: 'when
the opponent and the player are both standing in the left service box it
is virtually impossible to flick the ball into the left out. no matter
how hard/good I flick.' The lane was absolute — a full flick asked for
flickWidth off the court's CENTRE — so the gesture saturated near a
sideline: from x -2 a perfect left flick moved the ball under 2 m and
could never pass the line, and the better the timing the firmer the cap,
because scatter was the only thing that could cross it. 'Left is
impossible, right works' was never left-vs-right: it was
toward-the-near-sideline vs across-the-court.

TUNE.aimAnchor: the anchor slides from the court centre to the player's
own x as the swipe commits (ch.x * |sway| * aimAnchor), so a flat tap is
exactly what it always was and a full flick is a full sweep from where
you stand — including past the line. Out-by-aim is a choice now, per
Oliver's explicit direction; the placement ring already turns red for
it. 0 restores the absolute lane, blendable live in the panel. Player
rally lanes only; the opponent's lanes and the centre-stated pOut
invariants are untouched. Verified in his exact scene: full left flick
from the left box lands -5 (the alley), half swipe -3.07, full right
+1.93.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Fable 5 committed 2026-08-20 14:25:24 +02:00
1 parent 60127436a0
commit 7e5c3ab399
5 files changed
+75 -2

No files matched your search

+14 -1
View File
@@ -189,7 +189,20 @@ function doHit(ch, quality, aim) {
// symmetric scatter is its width mechanic (matchWide clamps it, not this).
let e = err();
if (ch.side === 'P' && sway && e * Math.sign(sway) < 0) e *= TUNE.aimTrust;
tx = sway * (toFar ? TUNE.flickWidth : 2.7) * reach + e;
// THE FLICK AIMS RELATIVE TO YOU, not to the court (2026-08-20, third round of the same
// report: "when the opponent and the player are both standing in the left service box it is
// virtually impossible to flick the ball into the left out. no matter how hard/good I flick").
// The lane was ABSOLUTE — a full flick asked for 3.95 m from the court's centre — so standing
// near a sideline saturated the gesture: from x -2 a perfect left flick moved the ball under
// 2 m and could never pass the line, while the same swipe from centre swept the court. The
// anchor now slides from centre to the player's own x as the swipe commits (|sway|), so a
// flat tap is exactly what it always was and a full flick is a full sweep FROM WHERE YOU
// STAND — including past the line: out-by-aim is his explicit ask ("not about the possibility
// of the ball going out but rather the aiming itself"). TUNE.aimAnchor blends it (0 = the old
// absolute lane, 1 = fully relative) so the panel can A/B the feel live. Player only; the
// opponent's lanes and every pOut invariant are stated from centre and unchanged there.
const anchor = ch.side === 'P' ? ch.x * Math.abs(sway) * TUNE.aimAnchor : 0;
tx = anchor + sway * (toFar ? TUNE.flickWidth : 2.7) * reach + e;
const tzBase = aim.az < 0 ? SHOT_DEPTH.deep : aim.az > 0 ? SHOT_DEPTH.short : SHOT_DEPTH.mid;
tz = (toFar ? tzBase : COURT.L - tzBase) + err() * 0.8;
// A FORWARD FLICK IS A SMASH. Up-screen is the far court, so flicking INTO the court asked for