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:
1 parent
599d5b0506
commit
bb72a01a3e
7 files changed
+145
-19
No files matched your search
+36
-1
@@ -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.
|
||||
|
||||
Reference in new issue
Block a user