Pin the canvas height to what is actually visible, and three fixes
Viewport, again — the homescreen app was the case that broke it. Watching for a signal cannot work there: launched standalone, iOS resolves the CSS viewport once against a provisional box and never re-resolves it, so no resize, no layout change, nothing for a ResizeObserver to observe. Only a rotation forced the issue. So the CSS box is now a proposal: visualViewport says what is really visible and the height gets pinned in px to match, re-read on every fit — plus a short settle salvo after launch, since that launch announces nothing. - The countdown skipped the transition, where overT is parked at 9999 to hold the point flow. It read as RESUMING IN 9999 after the first game you ever win. - Countdown moved off the HUD line into the open, at a readable size. - A returned shot is a glancing blow now, not a mirror. Reversing the incoming line sent every parry straight back up it — into the thrower — so a boss handed you a free wound per volley. Contact across the racket face sets the angle: dead centre still goes back at him, which is a placement you earn. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e8116c6abb
commit
9a4d921706
4 files changed
+44
-15
No files matched your search
+9
-2
@@ -608,9 +608,16 @@ export function updateZombies(dt) {
|
||||
if (!done && P.swingT >= 0 && P.swingT <= TUNE.parryWindow
|
||||
&& dP < TUNE.parryReach && s.y < CONTACT.maxY) {
|
||||
// the parry: it becomes an `extras` clone — that array is already ballistic and already kills
|
||||
// zombies, so "returned shot is a live weapon" costs nothing to build
|
||||
// zombies, so "returned shot is a live weapon" costs nothing to build.
|
||||
// It is a GLANCING blow, not a mirror. Reversing the incoming line sent every return straight
|
||||
// back up the line it arrived on — which is where the thrower is standing — so a boss was a
|
||||
// free wound per throw. Where you meet the ball across the racket face now sets the angle:
|
||||
// hitting it back INTO him is a shot you have to place your feet for.
|
||||
const off = Math.max(-1, Math.min(1, (s.x - P.x) / TUNE.parryReach)); // -1..1 across the face
|
||||
const ang = (off * TUNE.parryDeflect + (Math.random() * 2 - 1) * TUNE.parryJitter) * Math.PI / 180;
|
||||
const sp = Math.hypot(s.vx, s.vz) * 1.15;
|
||||
extras.push({ x: s.x, y: s.y, z: s.z, g: TUNE.gravity, pow: TUNE.parryPow, t: 2.5,
|
||||
vx: s.vx * 0.3, vy: 4.2, vz: -Math.abs(s.vz) * 1.15 });
|
||||
vx: Math.sin(ang) * sp, vy: 4.2, vz: -Math.cos(ang) * sp });
|
||||
pock(0.85, 1300); G.flash = { text: 'RETURNED', t: 0.6 }; cheer(0.8, 0.3);
|
||||
done = true;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user