The timing cues were match-only, and the walk cycles bounced
CLASSIC TENNIS, third time asked and this time actually found. Both cues open with a mode gate and I checked the wrong two features twice: drawApproachRing (the closing circles that show when to tap) and drawApexBand (the serve bar with the gold perfect window) each began `if (!G.match ...)`. So the mode whose whole pitch is "if the core tennis is good everything else is good" was the one mode with neither. They run on `G.match || G.mode === 'tennis'` now — the gore mode stays out on purpose, there is no rally there. A test reads both function bodies and fails if either is ever gated on the match alone again. (The two I kept pointing at — the landing ring and the placement ring — really are shared. They were just not the ones being asked about.) THE BOUNCING WAS IN THE ART, and measurable: the six generated families came back with the shuffle frame 30-44 px shorter than the stance it walks out of, against 9 px on the hand-made racket family. The game draws every frame at its own PNG height, so the body rose and dropped once per step. A walk cycle is one drawing with the legs moved and must be one height; _zsheet levels the stance and the stride pair now and leaves the forehand its own, exactly as the serve and the fall keep theirs. All seven families re-cut: spreads are 1-8 px. THE BENCH GETS BUTTONS. Arrow keys are not a control scheme on a phone, which is the device the walk has to be judged on — so every family and every wound stage was unreachable from the place the problem shows. Three on-screen pads: BODY, WOUND, POSE, the two-way ones split left/right. Geometry lives beside the drawing and input hit-tests the same function, the rule the rack established. THE FALL is quicker still (0.05/0.07/2.0/0.30): drop, lie there, get up. Three umpire lines pulled — ump_wound_you, ump_felled, ump_wound_opp2. Not funny enough to keep. Files deleted, call sites collapsed to the two that stay. 60 tests green. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e1ce2486c0
commit
eb0e8775a4
46 files changed
+81
-8
No files matched your search
@@ -6,6 +6,7 @@
|
||||
// (pretoss = no steering, horde = no serving, spawns keep coming → unrecoverable).
|
||||
|
||||
import assert from 'node:assert/strict';
|
||||
import { readFileSync } from 'node:fs';
|
||||
|
||||
// ---- DETERMINISM. This suite is a Dockerfile build stage: a red run blocks the deploy, so a test
|
||||
// that fails one run in five is worse than no gate at all — it trains you to re-run it. Two of the
|
||||
@@ -636,6 +637,20 @@ test('the match recovers to CENTRE between shots — a wide return must not stra
|
||||
} finally { TUNE.autoAssist = assist; }
|
||||
});
|
||||
|
||||
test('the tennis timing cues belong to CLASSIC tennis too, not just the match', () => {
|
||||
// Reported three times before it was believed, and it was a one-word gate each time: drawApproachRing
|
||||
// and drawApexBand both opened with `if (!G.match ...)`, so the mode whose whole pitch is "if the
|
||||
// core tennis is good everything else is good" was the one mode without the cues that make the
|
||||
// core tennis readable. Asserted on the SOURCE because these are draw calls with no state to
|
||||
// observe — what matters is that neither is gated on the match alone ever again.
|
||||
const src = readFileSync(new URL('./src/render.js', import.meta.url), 'utf8');
|
||||
for (const fn of ['drawApproachRing', 'drawApexBand']) {
|
||||
const body = src.slice(src.indexOf('function ' + fn), src.indexOf("function " + fn) + 900);
|
||||
assert.ok(!/if \(!G\.match \|\|/.test(body), `${fn} must not be gated on the match alone`);
|
||||
assert.ok(/G\.match \|\| G\.mode === 'tennis'/.test(body), `${fn} must also run in classic tennis`);
|
||||
}
|
||||
});
|
||||
|
||||
test('the opponent card is a RAMP: it starts easy and only gets harder', () => {
|
||||
// "the players should start easy and get harder over time." That is a property of the table, not
|
||||
// of any code, so the table is what gets asserted — a row edited into the wrong slot is otherwise
|
||||
|
||||
Reference in new issue
Block a user