The body mark was behind the body; the yellow ring was never mine
Two bugs, one report. THE MARK WAS DRAWN UNDER THE SPRITE. The whole band, target mark included, is painted before the sprite pass — which is right for the arc, since a nearer shambler should occlude the part of the flight behind it. But the mark is a mark ON a shambler, so it went down first and the body was then drawn straight over the top of it. It has never once been visible. Split out as drawAimMark and called after the near-side actors, which is the only place a highlight on a body can go. THE YELLOW CIRCLE WAS G.outMarker, not the aim at all. It is the tennis in/out call — "did that land in?" — and splatter never asks: `out` could not be true there, so it was an unconditional yellow ring on the grass carrying no information, sitting under the shambler for 1.3 s. That is longer than the gap before the next pull, which is why it was there "most of the time" and why it looked like the aim marking the feet. Now set only in tennis, from both the serve and the rally swing. Checked: tennis keeps its ring on serves AND rally shots, splatter has none anywhere, and the mark now draws over the torso at every pull strength. Note this leaves a splatter VOLLEY with no landing feedback at all. It had a ring that said nothing before, so nothing was lost, but say if the volley now feels blind. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
0ce857fedc
commit
ff9e09e3eb
2 files changed
+38
-17
No files matched your search
+11
-3
@@ -123,8 +123,14 @@ function doHit(ch, quality, aim) {
|
||||
ball.kills = 0; // fresh shot: multi-kill streak restarts
|
||||
ball.bomb = false; ball.flame = false; // only a consuming serve arms these; any other hit clears them
|
||||
if (ch.side === 'P') { // shot marker: where this will land — red means it's going out
|
||||
const ok = G.mode !== 'tennis' || (Math.abs(tx) <= COURT.W / 2 + 0.02 && tz >= -0.02 && tz <= COURT.netZ);
|
||||
G.outMarker = { x: tx, z: tz, out: !ok, t: 1.3 };
|
||||
// TENNIS ONLY. It answers "did that land in?", and splatter does not ask: `out` could never be
|
||||
// true there, so it was a permanent yellow ring on the grass carrying no information — and
|
||||
// sitting under the shambler for 1.3 s, which is longer than the gap before you aim again.
|
||||
// That ring, not the new mark, is the circle that seemed to live under their feet.
|
||||
if (G.mode === 'tennis') {
|
||||
const ok = Math.abs(tx) <= COURT.W / 2 + 0.02 && tz >= -0.02 && tz <= COURT.netZ;
|
||||
G.outMarker = { x: tx, z: tz, out: !ok, t: 1.3 };
|
||||
}
|
||||
G.aiReactT = 0; // CPU hasn't read the shot yet
|
||||
}
|
||||
sfx(ch.side === 'P' ? 'tennis-player' : 'tennis-opponent', 0.9, { reverb: true }); // recorded racket strike, per side
|
||||
@@ -257,7 +263,9 @@ function hitServe(sv, quality, aim = null) {
|
||||
}
|
||||
}
|
||||
if (wsel > 0 && slotStock(wsel) <= 0) G.weapon = 0; // that was the last tin — hand back to plain balls
|
||||
if (sv.side === 'P') G.outMarker = { x: boxX, z: tzs, out: G.mode === 'tennis' && !inServeBox(boxX, tzs), t: 1.3 };
|
||||
// tennis only, same reason as doHit's: a splatter serve lands at a shambler's feet, and the ring
|
||||
// sat there in yellow for 1.3 s saying nothing — right where the aim mark is trying to be read.
|
||||
if (sv.side === 'P' && G.mode === 'tennis') G.outMarker = { x: boxX, z: tzs, out: !inServeBox(boxX, tzs), t: 1.3 };
|
||||
G.phase = 'rally'; sfx(sv.side === 'P' ? 'tennis-player' : 'tennis-opponent', 0.9, { reverb: true }); // recorded serve strike, per side
|
||||
sv.pose = 'serve'; sv.poseT = 0;
|
||||
if (quality > 0.999) { G.flash = { text: 'PERFECT', t: 0.7 }; G.hitstop = 0.05; }
|
||||
|
||||
Reference in new issue
Block a user