eb0e8775a43c567e9920110351ec1742419bb834
2
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
e1ce2486c0 |
SERVE UP was dropping you into gore whatever you picked
THE MENU BUG, and it explains three reports at once. cStart's handler was
`addEventListener('click', start)` — and addEventListener hands a listener the
MouseEvent as its first argument, so `start(modeId = pickedMode)` never saw its
default: modeId was an EVENT OBJECT. `G.classic = modeId === 'classic'` was
therefore always false and the zombie branch never fired. Picking CLASSIC or
ZOMBIE TENNIS on the setup screen did nothing at all; SERVE UP always started
the gore mode. A default parameter only applies to `undefined`, and a click
handler always passes something. `() => start()`.
That is also why "in normal tennis i dont see the ball circles and the serve
hint bar": there was no normal tennis to be in. Both are drawn unconditionally
in render() and the tennis struggle hints are already mode-gated correctly.
Verified through the real menu after the fix: CLASSIC gives mode=tennis with
no bodies on court, ZOMBIE gives match=true against the SHAMBLER in its own
body. Every other bare handler in the codebase takes no parameters — checked.
THE MOP BOY had the same class of bug one layer down. sendBoy was called and
mopWorthIt() refused: it tests `d.z >= COURT.netZ - 2`, the NEAR half, because
in the gore mode everything dies on the near court. A match's blood is all on
the FAR side, where the body stands and bleeds through four wound stages, so
the boy could never qualify. The near-side bias stays; the match is the
exception.
DANIEL was being dropped, not missing. Two causes, both mine: the asides were
queued at 0.7-1.5 s and matchPoint fires the score call at 0.4 s with a clip
over a second long — voice() drops anything that would start while he is still
talking (one man, one microphone). And asideEvery is 55 s, a whole match game.
Delays moved past the score call; matchAsideEvery is 15 s, which fits a mode
whose events are a limb and your blood rather than a wave of bodies.
THE FALL: quicker down, longer on the floor (0.09/0.11/2.0/0.30). And it was
genuinely SHRUNKEN — the generator draws fall rows smaller than standing rows
(the brute's buckle came back 190 px against a 224 px stance) and _zsheet's one
global scale preserved that faithfully, so the body shrank the moment it
started to fall. A fall row is anchored on its own buckle now, which must draw
at standing height. All seven generated families re-cut: 224/153/98/181 against
the hand-made racket family's 224/154/85/179 — the convergence is the check.
THE FLICK: 0.42 made going out impossible, which fixed the 8-in-10 bug and
overshot it ("too easy. i must be able to play out"). 0.62 puts risk back where
it belongs — ~15% out at quality 0, 5% at 0.75, and never on a perfect flick.
The test now asserts that shape: bounded, monotonically falling, zero at 1.
59 tests green.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|
|
52b38e4a39 |
Eight bodies on the card, and the umpire gets his voice back
THE FLICK, again. "i can barely reach the extremes of the court." It could reach 3.3 m against a 4.115 m line — safe, and too safe. TUNE.flickWidth is 3.95 now (96% of the way to the corner, 17 cm to spare) with flickReach 0.42, which keeps the guarantee intact: reach x timing + scatter stays inside the line at EVERY quality, worst case 4.06. 20% more reach, still impossible to send out by aiming. A FORWARD FLICK IS A SMASH. Up-screen is the far court, so flicking into it asked for depth and nothing else — a direction with no consequence behind it. It buys pace now (smashBoost, scaled by timing). Deliberately NOT distance: solveShot still lands it on the same spot, so the shot arrives flatter and sooner rather than longer. A smash you can hit out on a whim is just the old bug wearing a hat. THE FALL HOLDS. "the opponent should fall and then lie there for a quick moment, the player stands up too quick." fall3 goes 0.30 -> 0.62. A corpse that touches the ground and is instantly upright reads as a stumble. THE CARD. Ten opponents, six of them NEW bodies off the one-sheet pipeline (shambler, ball boy, steward, runner, groundskeeper, line judge), with the club pro's own body and the brute woven in as 7 and 8. It is a ladder of STAFF: the further you get, the further up the club the thing across the net used to be. Narrative and difficulty are the same list read twice, and a test walks all ten — whiff must fall every rung, names must fit the board's 8-char slot, speed may zigzag by character but never regress. Steeper per rung (speedPer .08->.11, pacePer .035->.05, flubKeep .82->.76): "in general this is too easy now". With aimed returns no longer sailing out, the player stopped handing over free points and the ladder had to earn them back. The opening got SOFTER at the same time — 0.72 where the old first opponent was 0.85. THE UMPIRE WAS MUTED IN THIS MODE and nobody noticed. aside() refused during any interlude; the match runs on a permanent one. So the single mode that is literally a tennis match he is sitting over was the one mode he never spoke in. Same bug shape as sendBoy, same fix. Six dry lines via say -v Daniel: two on taking a limb, two on your blood, one when there is nearly none left, one on felling the thing. asideEvery still gates him. ...and sendBoy had the identical bug, so the mop boy now comes out between games to the FAR court, where one body has been bleeding through four wound stages. Between games only, never mid-point. The line judge took two rolls: the first cut to 6 figures in its last row and _zsheet.py refused it rather than mis-slicing. That refusal is the feature. 59 tests green. Verified in the browser: SHAMBLER on court in its own body. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |