Stop the auto-run shaking while it chases a ball

Oliver: "wenn der Autoplay den Ball versucht zu bekommen, zittert der
Player schnell hin und her". Measured: the run's target flipped by
metres every other frame. intercept samples the flight every 10 ms
against a 16.7 ms frame, so any candidate on a margin (a low bounce
peaking on the 0.45 m floor, a point on the back boundary, a dying drop)
passed one frame and failed the next. Frames with no candidate sent him
home and back. 9-62 reversals inside 200 ms per five minutes.

The chase now latches its plan: the flight is fixed at the strike, so
the first point stays the answer while his legs still make it in time,
net of any time he stood (split-step, heels). Reach is judged from where
the chase began, and the target eases with a start/stop hysteresis.
After: no reversals at any rung, timing unchanged. He wastes no steps,
so he is a little stronger, mostly at the bottom of the ladder. New
test; v375.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5.5 committed 2026-10-14 20:15:25 +02:00
1 parent 599d5b0506
commit bb72a01a3e
7 files changed
+145 -19

No files matched your search

+36 -1
View File
@@ -5676,6 +5676,39 @@ Lob vom Gegner als Volley annimmt, soll man derb schmettern"*.
- `tools/rally-sim.mjs`: `ATTACK=0.3`, `NETX=1` (attacks, lobs faced at the net, smashes, smashes won), and
`T_<knob>=<value>` sets any TUNE dial for a sweep.
### The auto-run stops shaking (2026-10-14, v375)
Oliver: *"wenn der Autoplay den Ball versucht zu bekommen, zittert der Player schnell hin und her. bitte glätten"*.
**Measured first** (`tools/rally-sim.mjs JITTER=1`, `=2` prints target jumps, `=3` the reversals):
- the target jumped ~10 cm a frame (p90 0.2-0.4 m), and 15-25% of chase frames moved it more than 20 cm;
- there were 9-62 direction reversals inside 200 ms per five minutes of play.
Smoothing the target alone (`runSmooth`) cut the small jumps 7x and fixed nothing. The shake was the PLAN
flipping by metres, every other frame, between two candidates:
- **The cause: margins against a sliding grid.** `intercept` samples the flight every 10 ms, the game steps
16.7 ms, so the sample phase slides every frame. A candidate sitting on any margin passed one frame and
failed the next:
- a low slice whose bounce peaks at ~0.46 m against the 0.45 m back-court floor;
- a point on the back boundary (`rallyBehind`);
- a dying drop at the 0.35 m floor (frames with no candidate at all sent him home, 10 m, and back).
Judging reach from where he stood made it worse, since his own step moved the answer. Each margin patched
with hysteresis just moved the flip to the next margin.
- **The fix: the chase LATCHES its plan** (`P.chase.plan`). The flight is fixed when the ball is struck, so
the point chosen first stays the answer while his legs still make it in time, net of any time he stood
(split-step, a put-away's heels: `P.chase.lost`). It re-plans only when that fails. Reach is judged from
where the chase began plus the time he has run (`P.chase`). The margin hysteresis (`runKeep`, 6 cm of
height, 10 cm of back boundary, holding the plan on an empty frame) stays as a second line, and so does the
eased target and a start/stop hysteresis (`runStop` 0.12 m against the 0.35 m start). `setupPoint`
clears it all.
- **After:** 0 reversals at rungs 4/8/12/15/18. The timing sweep is unchanged (−30 ms q 0.91, kiss q 1.00).
The ring leads contact by 5-14 ms, which is frame quantisation.
- **Side effect: he no longer wastes steps, so he is a little stronger.**
- Climb (σ60, level 26): bottom rungs 94 → 99%, mid ladder about +5, top unchanged (Champion 33 → 30).
- Classic (σ60, level 1): easy ~80 → ~93, hard ~30 → ~37.
- Not retuned yet: put it to his phone first.
- Test: the ring-tapping player chasing at rungs 4/12/18 for a minute each makes at most 2 reversals inside
200 ms. The old code makes 26. The early-tap test's floor moved 0.45 → 0.42: he now stops 0.12 m from his
mark instead of 0.35, so contact comes a hair later. The old curve still reads 0.33.
# OPEN — leftovers, in rough priority order
Nothing here is broken; these are known gaps and unverified risks.
@@ -5688,7 +5721,9 @@ Nothing here is broken; these are known gaps and unverified risks.
through, put-aways, on his heels). Awaiting the phone verdict on v373, especially the half-second
flat-footed read and the net rushers. See "Step 4 (b)" above.
v374 adds the player's own net game: long up-flick = attack and follow in, long down-flick = lob and
go back, and the SMASH. See "The player's way to the net and back" above. Fallback tag `rally-baseline-v360`.
go back, and the SMASH. See "The player's way to the net and back" above.
v375: the auto-run's shake is gone (a latched chase plan); he is a little stronger for it, so the bottom
of the Climb and classic easy may now be too easy. See "The auto-run stops shaking". Fallback tag `rally-baseline-v360`.
1. **`RES` 4 is unverified on a real phone under load.** It nearly doubled the fill rate (810 -> 1080
device px across). Oliver has not reported stutter, but he also has not played a late horde since.