The match walks back to centre — "unreachable" was the player, not the CPU

"every second ball is basically unreachable by an auto-run player.. are there
some hidden gestures I don't know about or is it just a very strong cpu?"

Neither. The match inherited gore-splatter's depth-only recovery — the
sidestep-protection rule — by being G.mode 'splatter'. One wide return pulled
you off centre and you stayed there, so the next ball to the opposite corner
was lost before it was struck. A player who never walks back experiences
every rally as unreachable, and it reads as CPU strength because the balls
keep landing where he isn't.

The match recovers to centre now, like tennis: real footwork, and in a rally
there is no artillery lane to protect. Gore splatter keeps depth-only — the
sidestep it protects has no role inside a rally. matchSpeedBase 1.4 -> 1.25:
it was calibrated against a player who couldn't move.

The full attacking vocabulary is recorded in PROJECT.md — nothing else is
hidden. The placement flick (aim during the swing) is taught nowhere on
touch; flagged as a ghost-hand lesson if the mode ships.

42 tests, 12 seeds clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-08-11 23:02:14 +02:00
1 parent 24be613c61
commit d6df582cd4
5 files changed
+55 -11

No files matched your search

+19
View File
@@ -570,6 +570,25 @@ test('THE DEATH LOOP: a fault before a lost point must not arm second-serve fore
assert.equal(G.serveNum, 1, '...whoever won it');
});
test('the match recovers to CENTRE between shots — a wide return must not strand you', () => {
// The match inherited gore-splatter's depth-only recovery (a sidestep-protection rule) by being
// G.mode 'splatter' — so one wide return pulled you off centre and you STAYED there, and the next
// ball to the opposite corner was unreachable before it was struck. "Every second ball is
// basically unreachable" was this, not CPU strength.
const assist = TUNE.autoAssist; TUNE.autoAssist = 1.15; // headless matchMedia reports desktop: assist off
try {
startMatch();
for (let i = 0; i < 2.0 * 60; i++) update(DT);
G.phase = 'rally';
P.x = 4.2; P.z = 22.8; // stranded wide by the last return
ball.active = true; ball.lastHit = 'P'; ball.vz = -8; ball.z = 8; ball.y = 1; // your ball, outbound: not chasing
const x0 = P.x;
for (let i = 0; i < 60; i++) update(DT);
assert.ok(Math.abs(P.x) < Math.abs(x0) - 0.5,
'auto-run walks back toward centre: ' + x0.toFixed(1) + ' -> ' + P.x.toFixed(1));
} finally { TUNE.autoAssist = assist; }
});
test('THE REAL DEATH LOOP: a toss after their rally touch is not their passing shot', () => {
// tossBall left ball.lastHit stale. After any rally the zombie touched last, the fresh toss still
// said lastHit 'O' — and the match serves from BEHIND the baseline (z 24.3), past the passing-shot