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>
This commit is contained in:
1 parent
c1f7268a04
commit
52b38e4a39
200 files changed
+153
-27
No files matched your search
+14
-2
@@ -152,9 +152,15 @@ function doHit(ch, quality, aim) {
|
||||
// timed flick is the full 3.3 with no scatter left on it at all. Placement is still earned;
|
||||
// it just stops being a coin toss you are punished for calling.
|
||||
const reach = ch.side === 'P' ? TUNE.flickReach + (1 - TUNE.flickReach) * quality : 1;
|
||||
tx = aim.ax * (toFar ? 3.3 : 2.7) * reach + err();
|
||||
tx = aim.ax * (toFar ? TUNE.flickWidth : 2.7) * reach + err();
|
||||
const tzBase = aim.az < 0 ? SHOT_DEPTH.deep : aim.az > 0 ? SHOT_DEPTH.short : SHOT_DEPTH.mid;
|
||||
tz = (toFar ? tzBase : COURT.L - tzBase) + err() * 0.8;
|
||||
// A FORWARD FLICK IS A SMASH. Up-screen is the far court, so flicking INTO the court asked for
|
||||
// depth and nothing else — the gesture had a direction with no consequence behind it. It buys
|
||||
// PACE now, scaled by timing like the width is. Note what it deliberately does not do: solveShot
|
||||
// still lands the ball on the same tz, so extra speed makes the shot flatter and earlier rather
|
||||
// than longer. A smash you can hit out on a whim would just be the bug above wearing a hat.
|
||||
if (ch.side === 'P' && aim.az < 0) s *= 1 + TUNE.smashBoost * quality;
|
||||
aimedLane = true;
|
||||
}
|
||||
tx = Math.max(-5, Math.min(5, tx));
|
||||
@@ -468,7 +474,13 @@ export function dismissModal() {
|
||||
// and not situation aware.. they seem random". `aside()` is the single entry point and it enforces
|
||||
// one shared cooldown (TUNE.asideEvery), so several triggers firing at once still yields one remark.
|
||||
export function aside(name, delay = 0.2) {
|
||||
if (G.mode !== 'splatter' || G.modal || G.changeover || G.interlude || G.card) return;
|
||||
// THE MATCH IS THE EXCEPTION to the interlude bar, exactly as sendBoy is: the match runs on a
|
||||
// PERMANENT interlude, so this line silently muted the umpire for an entire mode — the one mode
|
||||
// that is literally a tennis match he is sitting over. The shared asideEvery cooldown still holds,
|
||||
// which is the rule that keeps him situational rather than chatty ("too much and not situation
|
||||
// aware.. they seem random"). Cards still block him: a name plate is already the mode talking.
|
||||
if (G.mode !== 'splatter' || G.modal || G.changeover || G.card) return;
|
||||
if (G.interlude && !G.match) return;
|
||||
if (G.asideT > 0) return;
|
||||
G.asideT = TUNE.asideEvery;
|
||||
voice(name, delay, 0.95);
|
||||
|
||||
Reference in new issue
Block a user