Fly the modals in with a swoosh instead of cutting to them
m.in (0..1 over TUNE.modalIn, 0.34 s) is the entrance clock, ticked inside update()'s modal early-return — the one thing that animates while the world is frozen. Icon and title fly in from the right trailing two ghost copies as a speed streak, the body lines cascade in from the left one after another, everything on easeOutBack so it overshoots and settles rather than decelerating politely into place. The dim washes in over the first third. A descending noise sweep on arrival (swish is parameterised now — same six lines of Web Audio, opposite reading) and a low pock as it lands. Every x is rounded: a fractional x on a nearest-neighbour scaled image re-snaps its pixel columns, which is the boiling that once read as HUD flicker. Dismissal is gated on the entrance: while m.in < 1 dismissModal swallows the gesture but doesn't clear the modal, so a tap already in the air when a popup appears can't skip it — and swallowing rather than returning false is what keeps that tap from falling through into a serve. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
79fb43f60d
commit
4cf54603f3
6 files changed
+69
-15
No files matched your search
@@ -52,6 +52,15 @@ zombie. Getting caught = `G.mode='eaten'` = permadeath, and the run summary is t
|
||||
it, and the `pointerdown` dismisser is registered **only on `pointer: fine`** — on touch,
|
||||
pointerdown fires *before* touchstart, so a shared handler cleared the modal and let the
|
||||
touchstart underneath serve. `G.seen.<key>` gates first-time-only modals.
|
||||
**`m.in` (0..1 over `TUNE.modalIn`) is the arcade entrance** and the ONE thing that animates behind
|
||||
the freeze — it is ticked inside that same early-return, so it advances while nothing else does.
|
||||
Icon and title fly in from the right (with a two-ghost speed streak), body lines cascade from the
|
||||
left, all on `easeOutBack`; every x is `Math.round`ed, because a fractional x on a nearest-neighbour
|
||||
scaled image re-snaps its pixel columns (the boiling that once read as HUD flicker). A modal with no
|
||||
`in` field draws fully landed, so older/test call sites still work.
|
||||
While `m.in < 1`, `dismissModal` **returns true without dismissing** — it swallows the gesture but
|
||||
won't let a panic tap that was already mid-air skip a popup nobody has read. Returning false there
|
||||
would drop that tap through into a serve instead.
|
||||
- **`UI` in config.js is the accent palette** (hot/warm/pick/cream/dim/bad/ball). Every HUD colour
|
||||
goes through it. Gore reds are deliberately NOT in it — the splatter stays loud.
|
||||
- **`F(size, bold)` in render.js builds every canvas font string.** Bare `monospace` resolves to
|
||||
|
||||
Reference in new issue
Block a user