Splatter: re-toss mid-rally (keep the two-stage serve), leaner blood

Serve:
- Reverts the single-tap auto-serve. Firing a ball still needs the two-stage
  toss+fire gesture — but a tap mid-rally now RE-ARMS the toss (throws a new
  ball up) with the previous ball flying on as a ballistic clone, so you can
  toss the next serve without waiting for the last to leave play.

Blood:
- Wound bleed cut further: sparse (most frames emit nothing), thinner spread,
  lower rise, short-lived, capped low — a fine trickle, not a spray.
- Repainted z_gw / z_cw1 with clean stumps and almost no painted blood (the
  torso gash and shirt spatter are gone), so the dynamic trickle is the blood.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 4.8 committed 2026-07-17 21:17:17 +02:00
1 parent 52ba796d32
commit 13416ee749
6 files changed
+23 -18

No files matched your search

+9 -5
View File
@@ -567,15 +567,19 @@ export function keyPressed(code) {
if (G.interlude && G.interlude.introT > 0) return; // let the umpire finish announcing the duel
// splatter: a tap/flick during the brief 'over' beat re-arms the next serve immediately
if (G.mode === 'splatter' && G.phase === 'over') { ball.active = false; setupPoint(); }
// splatter rapid serve: a flick fires an aimed quick serve — in pretoss OR mid-rally (dragServe
// banishes any live ball so the next launches now). The duel is exempt: it serves like tennis.
// splatter serve stays a TWO-STAGE ritual — toss up, THEN fire — but the toss can start any
// time, even with a ball still in flight: the old ball flies on as a ballistic clone so the
// toss+fire pair chains without waiting for it to leave. A flick is the aimed one-motion
// variant (the reticle). The duel is exempt: it serves like tennis.
if (G.mode === 'splatter' && !G.interlude && score.server === 'P'
&& (G.phase === 'pretoss' || G.phase === 'rally')) {
const flick = takeFlickAim();
if (flick) { dragServe(flick); return; } // dragServe handles GUN (burst) and the live-ball banish
// a bare tap MID-RALLY serves at the auto-target too — pump the screen to keep the balls
// coming while the last one's still up. (pretoss keeps its toss ritual, handled below.)
if (G.phase === 'rally') { dragServe(null); return; }
if (G.phase === 'rally') { // a tap mid-rally re-arms the TOSS (stage one); the next tap fires
if (tryGunBurst()) return;
if (ball.active) extras.push({ x: ball.x, y: ball.y, z: ball.z, vx: ball.vx, vy: ball.vy, vz: ball.vz, pow: ball.pow || 0.5, t: 2.5 });
tossBall(P); return;
}
}
if (G.phase === 'pretoss' && score.server === 'P') {
if (tryGunBurst()) return; // GUN selected: the serve gesture pops a burst, no ball