Make the down-flick the soft ball: a short one drops, a long one lobs
Step 3 of the rally rework, Oliver's pick: in rally modes the down-flick is soft, always, and its length is how far — a dying drop just over the net at one end, an attacking lob over a net man at the other. One gesture, one meaning; not the context-armed lob that was cut. Ballistics from the cut lob (pace derived from the apex); backspin lives on ball.spin and every bounce planner reads it, netplay sends it. Against the CPU it was returned ~100% until the real-tennis reasons went in: soft balls are read late (disguise), a net man reacts to a pass and backpedals from a lob, and a lobbed or dug-out reply is a weak block. Four new tests; v363. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
f9b0dd2efb
commit
72760a9d1e
7 files changed
+215
-28
No files matched your search
+1
-1
@@ -7,7 +7,7 @@ import { gore } from './zombies.js'; // runtime-only cycle (zombies imports stat
|
||||
export const P = { x: 1.3, z: 22.8, side: 'P', pose: 'idle', poseT: 0, swingT: -1, facing: 1, runT: 0 };
|
||||
export const O = { x: -1.3, z: 1.0, side: 'O', pose: 'idle', poseT: 0, swingT: -1, facing: 1, runT: 0 };
|
||||
export const ball = { x: 0, y: 1, z: 20, vx: 0, vy: 0, vz: 0, g: 9.2,
|
||||
active: false, lastHit: 'P', bounces: 0, rx: null, approach: null, collected: false, kills: 0, bomb: false, flame: false,
|
||||
active: false, lastHit: 'P', bounces: 0, rx: null, approach: null, spin: 1, soft: false, collected: false, kills: 0, bomb: false, flame: false,
|
||||
// NETPLAY: THE CALLED BALL PLAYS OUT. A verdict used to freeze the ball where it was — on the
|
||||
// striker's phone that is mid-roll, a whole court away from the call, and it read as the game
|
||||
// loop stopping. `scored` means "this flight is decided": physics keeps running, every scoring
|
||||
|
||||
Reference in new issue
Block a user