Make the double tap a stance that holds the net
Oliver on v376: "wenn man doppeltippt, geht er minimal vor". His own ball's flight covered 4-9 m of the 10 to the net. His next ball was met from mid-court, outside the net zone, and the recovery after that volley walked him straight back to the baseline. The double tap now sets a stance (P.post) that lasts until the next double tap, a lob he has to run down, or the end of the point. Every recovery heads for the net at full pace, and every incoming ball is planned as a net man's. The 'back' stance clears once he is behind the net zone, so short balls still pull him in. Measured: contacts while committed are ~35% at the net and ~40% around the service line, and he no longer falls back. The base ladder is unchanged. New test; v377. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
48d1069e40
commit
ba8d13a867
6 files changed
+72
-11
No files matched your search
@@ -1573,6 +1573,30 @@ test('THE DOUBLE TAP at the net is the way back; a long down-flick is only the l
|
||||
assert.ok(back.fromNet > TUNE.netFrom, `...and he is back behind the net zone: ${back.fromNet.toFixed(1)} m`);
|
||||
});
|
||||
|
||||
test('THE DOUBLE TAP is a STANCE: a volley from mid-court keeps him coming in, not walking back', () => {
|
||||
// Oliver on v376: "wenn man doppeltippt, geht er minimal vor". His own ball's flight covers 4-9 m of the 10,
|
||||
// his next ball was met from mid-court — outside the net zone — and the recovery after it took him straight
|
||||
// back to the baseline. P.post holds the net until the next double tap, a lob he runs down, or the point.
|
||||
const assist = TUNE.autoAssist; TUNE.autoAssist = 1.15;
|
||||
const after = post => {
|
||||
freshSplatter(); startMatch(); G.interlude.introT = 0;
|
||||
const rz = oppOf(); Object.assign(rz, { x: 3, z: -0.6, swingCool: 999, swingT: -1 });
|
||||
G.phase = 'rally'; G.wasServe = false;
|
||||
Object.assign(P, { x: 0, z: COURT.netZ + 9, swingT: -1 }); // his volley was struck 9 m out
|
||||
P.post = post;
|
||||
const v = solveShot(0, 1, P.z - 0.4, 1, 3, 18);
|
||||
Object.assign(ball, { active: true, scored: false, lastHit: 'P', bounces: 0, rx: null, spin: 1, soft: false,
|
||||
approach: null, retreat: null, x: 0, y: 1, z: P.z - 0.4, vx: v.vx, vy: v.vy, vz: v.vz, g: TUNE.gravity });
|
||||
for (let i = 0; i < 60 && ball.active; i++) { rz.swingCool = 999; update(DT); }
|
||||
return Math.abs(P.z - COURT.netZ);
|
||||
};
|
||||
try {
|
||||
const committed = after('net'), loose = after(null);
|
||||
assert.ok(committed < TUNE.netFrom, `committed to the net, he keeps coming in: ${committed.toFixed(1)} m`);
|
||||
assert.ok(loose > 9, `without the stance the old recovery still walks him back: ${loose.toFixed(1)} m`);
|
||||
} finally { TUNE.autoAssist = assist; }
|
||||
});
|
||||
|
||||
test('an INCOMING ball keeps every tap a swing: the double tap never eats a shot', () => {
|
||||
freshSplatter(); startMatch(); G.interlude.introT = 0;
|
||||
oppOf().swingCool = 999;
|
||||
|
||||
Reference in new issue
Block a user