The aim cloud goes quiet, and a mistimed flick falls short of the line

Hidden behind TUNE.aimCloud rather than deleted: the reading it gives — how
much width the swipe is buying, before the ball leaves — is the only teacher
the gesture has, and the panel can flip it back live for the next look at it.

And "a little harder to hit the out" is a number: flickReach 0.62 -> 0.52,
which halves the worst-case rate from about 15% to about 7%, with the test
tightened so it cannot drift back. The shape is untouched — a perfect flick
still never sails, a badly timed full swipe still can — but a mistimed one now
lands nearer the middle than the line, which is the only half of that trade a
player who cannot see his own timing can do anything about.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-08-18 07:58:47 +02:00
1 parent 1b16b422df
commit 7ff8671a22
5 files changed
+30 -7

No files matched your search

+14 -4
View File
@@ -69,12 +69,17 @@ export const TUNE = {
flickWidth: 3.95, // m off centre a PERFECTLY timed flick reaches. The singles line is 4.115,
// so this is the corner with 17 cm to spare. Raising it past the line does
// not make the flick punchier, it makes a perfect one go out.
flickReach: 0.62, // how much of an aimed shot's width a MISTIMED flick gets (1 = all of it).
flickReach: 0.52, // how much of an aimed shot's width a MISTIMED flick gets (1 = all of it).
// 0.42 made going out IMPOSSIBLE, which fixed the 8-in-10 bug and then
// overshot it: "flicking: too easy. i must be able to play out." At 0.62
// a mistimed flick CAN sail (~15% of the time at quality 0, on the worst
// half of the scatter) and a perfectly timed one never can — the risk is
// back and it is timing, not a coin toss, that decides it.
// a mistimed flick sailed ~15% of the time at quality 0 and a perfectly
// timed one never could — the risk was back, and timing rather than a
// coin toss decided it. 0.52 keeps that shape and halves the worst-case
// rate to ~7% ("make it a little harder to hit the out"): a badly timed
// flick now lands NEARER THE MIDDLE rather than nearer the line, which
// is the only half of the trade a player who cannot see his own timing
// can do anything about. THIS is the out dial — aimError is shared with
// the opponent's returns and with every aimed shot in the gore modes.
// Reach x quality must stay under the sideline once aimError is added on
// top, or the flick goes out — which is exactly the bug this fixed:
// 3.3 * 0.45 + 2.4 = 3.89 against a 4.11 m line. Raise it and the flick
@@ -86,6 +91,11 @@ export const TUNE = {
// of agency, the player can't really tell if there was skill or luck"). The serve already read its
// flick as a continuous strength; the rally does now too, on the same shape of numbers.
flickMin: 28, // px before a drag counts as a flick at all — input.js's own threshold
aimCloud: 0, // 1 draws the live aim cloud under the moving thumb (render's G.swipe
// block); 0 hides it. OFF after its first playtest — "hide the indicator
// for now" — kept as a switch rather than deleted because the reading it
// gives (how much width the swipe is buying, before the ball leaves) is
// the only teacher the gesture has, and the panel can flip it back live.
flickFull: 130, // ...and px of travel that buys the FULL width. About a third of a phone
// screen: a short swipe is a safe half-court ball, and only a committed
// one goes hunting the line, which is what makes going OUT a chosen risk.