The trail reads as motion, never as residue: the ghosts fade with the sprint
The lingering doubles were a real bug, not a taste problem: racketAI's !incoming return kept the last chase's vx/vz on the body, so the speed ghosts trailed a zombie that had already stopped. The velocity dies with the chase now (tested). The look is halved with it: ghost alphas 0.22/0.10 -> 0.11/0.05, trailK 0.05 -> 0.035 — a hint of speed in the corner of the eye, never a second body. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
4ea9af5442
commit
98b01fea5a
6 files changed
+22
-5
No files matched your search
+4
-1
@@ -1425,7 +1425,10 @@ function racketAI(rz, dt) {
|
||||
rz.swingCool -= dt;
|
||||
const incoming = ball.active && ball.lastHit === 'P' && ball.vz < 0
|
||||
&& (G.interlude || (ball.pow || 0) < TUNE.zSplatQ); // in the duel it plays EVERY ball — it's tennis now
|
||||
if (!incoming) { if (rz.pose === 'run') rz.pose = 'idle'; return; }
|
||||
// ...and the sprint velocity dies WITH the chase. This return kept the last chase's vx/vz on
|
||||
// the body, so the speed ghosts trailed a zombie that had already stopped ("teilweise bleiben
|
||||
// die doppelten ghosts länger sichtbar") — the trail must read as motion, never as residue.
|
||||
if (!incoming) { rz.vx = 0; rz.vz = 0; if (rz.pose === 'run') rz.pose = 'idle'; return; }
|
||||
// ANTICIPATION. He used to run at the ball's LIVE position, and against a serve that is a
|
||||
// trap: for the first third of the flight the ball is still up by YOUR baseline, so he ran
|
||||
// deep and straight while the ball was already leaving sideways, and only started sliding
|
||||
|
||||
Reference in new issue
Block a user