The relative lane is vetoed; an aimed ball never lands on the wrong side of you

'No that's way too difficult now - I am dying constantly of out. revert
it.' aimAnchor is gone — the lane is absolute again, every out invariant
back exactly as tuned. What survives is the answer to his follow-up: the
ball sometimes flew a LITTLE RIGHT out of a left flick, because a
mistimed left flick's target sits only slightly left of CENTRE — which
is right of a player standing in the left service box. The absolute
lane's blind spot, stated the other way round.

The aimed target is now clamped to the player's own x on the flicked
side, bounded at flickWidth so a body parked in the alley clamps to the
corner rather than conjuring an out. From the left box a left flick goes
at least down your own line, from centre it can no longer cross centre,
a perfect corner flick and the crosscourt sweep are untouched, and the
outward scatter tail keeps the whole tuned out-risk. Verified in his
scene: ten rushed weak left flicks land -2.0..-2.7 where the same case
used to target -0.7..-1.3 (a visibly rightward flight); the clean full
flick still lands -3.92.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Fable 5 committed 2026-08-20 14:39:10 +02:00
1 parent 7e5c3ab399
commit 4052ab1404
5 files changed
+54 -54

No files matched your search

-8
View File
@@ -64,14 +64,6 @@ export const TUNE = {
// send the ball longer — solveShot still lands it on the same spot — it
// gets there flatter and sooner, which is what a smash is.
aimError: 2.4, // m of scatter at quality 0
aimAnchor: 1, // how much the flick's lane follows the PLAYER instead of the court.
// 0 = the old absolute lane (a full flick asks for flickWidth off the
// court's centre — saturates near a sideline: from x -2 a perfect left
// flick moved the ball under 2 m and could never find the line). 1 = the
// anchor slides to your own x as the swipe commits, so a full flick is a
// full sweep from where you stand — including past the line: out-by-aim
// is a choice now, and the ring already turns red for it. Blendable so
// the panel can A/B the feel live. Player's rally lanes only.
aimTrust: 0.3, // an aimed rally shot TRUSTS its flick: the scatter may still push the
// ball further OUT (the chosen out-risk keeps its exact shape) but only
// this fraction of an INWARD roll survives, so a mistimed left flick
+16 -14
View File
@@ -189,20 +189,22 @@ 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;
// 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;
tx = sway * (toFar ? TUNE.flickWidth : 2.7) * reach + e;
// ...AND AN AIMED BALL NEVER LANDS ON THE WRONG SIDE OF YOU. The lane is ABSOLUTE (a fully
// relative lane was tried 2026-08-20 and feel-vetoed the same day — "way too difficult now,
// I am dying constantly of out"), and an absolute lane has a blind spot: a mistimed left
// flick's target sits only slightly left of CENTRE, which is RIGHT of a player standing in
// the left service box — so the ball visibly flew right out of a left flick ("the ball
// sometimes actually flies a little to the right, although I flicked left"). The target is
// clamped to the player's own x on the flicked side now (bounded at flickWidth, so a body
// parked in the alley cannot conjure an out): from the left box a left flick goes at least
// down your own line, from centre it can no longer cross centre, and a perfect corner flick
// is untouched. No new out risk — the clamp only ever pulls the target TOWARD the line the
// player is standing on, never past flickWidth, and the outward scatter tail is unchanged.
if (ch.side === 'P' && sway) {
const bound = Math.max(-TUNE.flickWidth, Math.min(TUNE.flickWidth, ch.x));
tx = sway < 0 ? Math.min(tx, bound) : Math.max(tx, bound);
}
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