Steady the gold ring, and move the praise word off the ball

Oliver: the target ring twitches sometimes, and "shot of the day",
"textbook" etc. cover the ball. The timed ring re-solved every frame and a
small shift in the auto-run's target moved its moment by up to 158 ms in a
frame; the drawn cue now counts down on its own clock and eases toward
each solve (p99 jump 100 -> 17 ms). The rally's praise word rose straight
into the struck ball's path (and a serve's sat on the far bounce, where the
return comes back); it now lands under the player, behind his feet, and
stays put. Same moment, out of the way. v371.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5.5 committed 2026-10-14 13:52:34 +02:00
1 parent 8e4b298d92
commit d561050af8
7 files changed
+50 -8

No files matched your search

+3 -3
View File
@@ -4,7 +4,7 @@ import { cv, ctx } from './dom.js';
import { BENCH, BENCH_STAGES, ZFAMS, famFrames, racketStage, TUNE, UI, EATEN_BURST, EATEN_SUMMARY, EATEN_RESTART, DONE_RESTART, COURT, P_BOUNDS, PLAYER_H, BOY_H, UMP_H, UMP_X, MACH_H, BOSS_ART, ZWOUND, woundStage, BOUNCE_IDLE, SPRITE_H, zombieH , WEAPONS, RACK_ROW, TOSS, HEAD_CROP, TINT, SHOT_DEPTH, matchFoe, cupFixture, cupRoundName } from './config.js';
import { P, O, ball, score, crowd, G, court, tour, kit, skin } from './state.js';
import { RAISERS, FRAMES } from './crowd.js';
import { predictLanding, previewServe, slotId, slotStock, serveApexY, rallyFeel, swayOf, ringCue } from './gameplay.js';
import { predictLanding, previewServe, slotId, slotStock, serveApexY, rallyFeel, swayOf } from './gameplay.js';
import { drillQueue, drillLegal, drillMult } from './drill.js';
import { zombies, gore, piles, parts, pellets, extras, shots, pops } from './zombies.js';
import { runDelta, progress, prof, cupBest, hasPromo } from './profile.js';
@@ -1075,7 +1075,7 @@ function drawApproachRing() {
const rSweet = Math.max(6, p.s * 0.055); // the fixed target ring
let inBand, r;
if (TUNE.ringTime) { // TIMED (gameplay.ringCue): kiss = touch now
const c = ringCue();
const c = G.ring; // gameplay's STEADY copy of ringCue
if (!c || c.eta > TUNE.ringLead || c.eta < c.sweet - c.band) return; // not yet, or the moment has passed
inBand = c.gold;
r = rSweet * (1 + Math.max(0, c.eta - c.sweet) * 4); // closes onto the target as the moment nears
@@ -2883,7 +2883,7 @@ export function render() {
ctx.save();
ctx.globalAlpha = Math.min(1, f * 3); // holds, then a quick fade at the end
ctx.font = B(13); ctx.textAlign = 'center'; ctx.textBaseline = 'top';
shadowText(p.text, Math.round(pr.x), Math.round(pr.y - (1 - f) * 14), p.col || '#ffffff');
shadowText(p.text, Math.round(pr.x), Math.round(pr.y - (p.still ? 0 : (1 - f) * 14)), p.col || '#ffffff');
ctx.restore();
}
// (a PERFECT-contact spark ring lived here for one build — Oliver's verdict: too much. The