A charge that passes, two strides that actually stride, a door in the corner

THE LEGS. Measured as lower-third silhouette difference between the two stride
frames: the groundskeeper, whose walk has always been right, is 0.80. The seller
was 0.017 — the same legs twice, which is why he hopped along on one of them.
Both sheets regenerated with the stride as the entire subject (one foot planted
ahead, the other trailing, and they SWAP): seller 0.42, champion 0.67.

Three things the champion's re-rolls proved, all of them the same lesson —
THE REFERENCE IS WHAT IT COPIES. Anchored on his own one-legged frame it drew
that pose again. Given a working walk from another boss alongside him "for the
legs only" it blended the two and returned a slim side-on walker, then a
pot-bellied man in cream. One character in the reference, one character out —
and pick the keeper by EYE, because the metric happily crowned the side view.

THE CHARGE. It rushed, then withdrew a fraction of what it covered, so it ended
the fight parked on top of you: dodge or die every two seconds with no window to
hit it, and nothing but a hitscan laser quick enough to use the window there
was — Oliver, "they come too close, they seem unbeatable". A rush now RETREATS
to its line afterwards, and to keep it from being toothless the other way (from
the band it ran out of clock 8 m short) the rush is TIMED rather than paced: it
covers whatever ground the retreat left in bossChargeT, so every charge arrives
and every charge has the same readable run-up. Measured over 30 s: five rushes,
each one reaching you, 13% of the fight in your face instead of all of it.

And the back room moved off the whole splash onto an invisible box in the TOP-
LEFT CORNER. Five taps in the middle of the screen — which is where your thumb
goes on the way to PLAY MATCH — now do nothing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-08-09 16:56:05 +02:00
1 parent 1bb528f7e0
commit d57433ed2b
10 files changed
+72 -23

No files matched your search

+18 -8
View File
@@ -175,16 +175,26 @@ function bossAI(zb, dt) {
const v = TUNE.bossChargeV * (A.speedMul ?? 1);
if (zb.charging) {
const dx = P.x - zb.x;
zb.x += Math.sign(dx) * Math.min(Math.abs(dx), TUNE.bossStrafe * dt);
zb.z = Math.min(P.z, zb.z + v * dt); // AT you and NO FURTHER: unclamped it ran
zb.x += Math.sign(dx) * Math.min(Math.abs(dx), TUNE.bossStrafe * dt); // it tracks your lane SLOWLY: a sidestep beats it
zb.z = Math.min(P.z, zb.z + zb.chargeV * dt); // AT you and NO FURTHER: unclamped it ran
if (zb.moveT <= 0) { zb.charging = false; zb.moveT = TUNE.bossChargeRest; } // off the back of the court
} else {
// It withdraws LESS than it charged, so the fight has a visible clock: it is nearer after every
// rush and arrives while you are still fighting it. A withdrawal that undid the whole charge
// made "the body is the weapon" untrue — it never once got near you, which is exactly what the
// physio's old 0.45 still did over a whole fight (`withdraw` is per design now).
zb.z = Math.max(TUNE.bossZMin, zb.z - v * (A.withdraw ?? 0.45) * dt);
if (zb.moveT <= 0) { zb.charging = true; zb.moveT = TUNE.bossChargeT; }
// AND IT FALLS BACK. A rush that ended where it landed left the boss parked on top of you for
// the rest of the fight: dodge or die every two seconds, with no window to hit it and nothing
// but a hitscan laser fast enough to use what window there was — Oliver, "they come too close,
// they seem unbeatable". So the retreat OUTRUNS the rush (retreat > 1) and stops at the front
// of the band rather than crawling a fraction of the way back. A charge is a threat that
// PASSES: you dodge it, and the ground it gives up again is your turn to hit it.
const home = TUNE.bossZMax, sp = v * (A.retreat ?? 1.3) * dt; // toward its LINE, from either side:
zb.z += Math.sign(home - zb.z) * Math.min(Math.abs(home - zb.z), sp); // backward off a rush, forward on the way in
// THE RUSH IS TIMED, NOT PACED. Whatever ground the retreat left between you, it covers it in
// bossChargeT — so every charge arrives, and every charge takes the same readable run-up to do
// it. Paced at a flat speed instead, the same fix that stopped it camping on you also stopped
// it ever reaching you: it started each rush from the band and ran out of clock 8 m short.
if (zb.moveT <= 0) {
zb.charging = true; zb.moveT = TUNE.bossChargeT;
zb.chargeV = Math.max(v, (P.z - zb.z) / TUNE.bossChargeT);
}
}
} else if (style === 'shadow') {
// paces — but the ground it paces over is centred on YOU, so it never stops moving and it takes