Answer the playtest: a net for the lock, and a duel that pays
The hang: I could not reproduce it or pin it on one latch, so this is two things. A root-cause fix — iOS does not guarantee a touchend when you switch apps mid-drag, and the held G.aim it leaves behind blocks the uncaught-toss retoss forever — and a watchdog for whatever else is out there. The watchdog does not time how long you have been blocked, because a horde blocks you for fifteen honest seconds; it watches whether the clock that should release you is moving, and logs the frozen state before letting go. The duel: past about game 20 all four tins sit at wCap and a won duel handed over literally nothing. It falls through to the barrel weapons now. The prize also stops borrowing the praise channel — arriving in the same slot as PERFECT made it read as another compliment. It gets a card with its own icon. The turn into zombie mode was unwatchable because the zoom started ON it, and the curve render applies is zero at t=0, so the camera only arrived half a second after he had changed. It peaks on the turn now, and the swap lands on a hitstop, a flash and a burst so it reads as an event rather than a glitch. Laser down from 0.55 to 0.22 — zap() sums four voices, so its vol was never one voice's level. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
20a742fbf3
commit
a1a8a61422
7 files changed
+130
-17
No files matched your search
@@ -151,6 +151,18 @@ const endTouch = e => {
|
||||
cv.addEventListener('touchend', endTouch, { passive: false });
|
||||
cv.addEventListener('touchcancel', endTouch, { passive: false });
|
||||
|
||||
// A DRAG THAT NEVER ENDS LOCKS THE GAME. `stick` and `G.aim` are only cleared by the touchend for
|
||||
// the matching identifier — and that event is not guaranteed: switch apps, pull the notification
|
||||
// shade, take a call, and iOS tears the touch down without always delivering touchend OR
|
||||
// touchcancel. What is left behind is a held slingshot: `G.aim` set forever, which keeps the
|
||||
// uncaught-toss retoss from firing (see the `!G.aim` guard in update) and leaves the player in the
|
||||
// toss phase with the ball on the floor, unable to serve or step. Dropping the gesture whenever the
|
||||
// page stops being visible costs nothing — you cannot be mid-pull while looking at another app.
|
||||
const dropGesture = () => { resetInput(); G.aim = null; };
|
||||
addEventListener('visibilitychange', () => { if (document.hidden) dropGesture(); });
|
||||
addEventListener('blur', dropGesture);
|
||||
addEventListener('pagehide', dropGesture);
|
||||
|
||||
// Mouse/desktop dismissal. Registered ONLY on fine pointers: on a touch screen pointerdown
|
||||
// fires before touchstart, so a shared handler would clear the modal and let the touchstart
|
||||
// below it fall through into a serve — exactly the swallowed-gesture bug.
|
||||
|
||||
Reference in new issue
Block a user