P11.1: juicier match pops & brighter bursts (sx / iOS)

Visual-juice vibe-pass, FX-only — no logic/state changes, input gating
still owned by BoardAnim.active.

- board_fx.sx: bigger, punchier match bursts — peak size 1.95->2.50 cells,
  combo bonus 0.55->0.72, and the per-gem fx tints saturated a touch (low
  channel trimmed, dominant/mid lifted) so every burst pops as a brighter,
  more vivid candy colour. The hot per-pixel tint loop's hoisted locals are
  preserved (issue 0001).
- gem_anim.sx: snappier clear pop — faster rise (0.30->0.18 of the window)
  to a bigger overshoot (CLEAR_POP_A 0.22->0.34) so the matched-gem clear
  reads as a candy snap. gem_pose's clear-pop invariants still hold.
- main.sx: M3TE_FX=<n> deterministic match-FX capture hook, mirroring the
  M3TE_SELECT pattern. Commits the n-th currently-legal swap at startup via
  the normal plan_and_commit path and begins the move timeline + burst/popup
  FX; M3TE_ANIM_TIME pins the phase and the frame loop holds the move/FX
  frozen while pinned, so the burst + "+points" screenshot identically every
  run. A larger M3TE_ANIM_TIME captures the settled, FX-gone board. Startup-
  only and guarded, so normal play is untouched.
- README.md: document the new M3TE_FX pin alongside the other capture hooks.
- goldens/p6_fx_match.png: updated deterministic golden (iOS 26 sim,
  SIMCTL_CHILD_M3TE_FX=3 SIMCTL_CHILD_M3TE_ANIM_TIME=0.22) — the vertical
  red 3-match, burst region +1.4% mean luminance / 3.2:1 brighter:dimmer vs
  the same scene on the pre-juice constants.

Gate: ios-sim build links, 19/19 logic tests green (incl. gem_pose t=0 rest).
This commit is contained in:
swipelab
2026-06-05 20:36:25 +03:00
parent f8268a6171
commit b65e592a8c
5 changed files with 83 additions and 21 deletions

View File

@@ -74,19 +74,21 @@ land_squash :: (tl: f32) -> f32 {
}
// --- Clear pop ---------------------------------------------------------------
// The matched-gem clear: a brief outward pop then a collapse to nothing over its
// local 0..1, so the clear reads as a satisfying pop rather than a plain shrink.
// Composes with the existing particle burst / score popup (board_fx.sx).
CLEAR_POP_A :f32: 0.22;
// The matched-gem clear: a snappy outward pop then a collapse to nothing over its
// local 0..1, so the clear reads as a satisfying candy pop rather than a plain
// shrink. A fast rise to a bigger overshoot makes the snap read; the soft
// particle burst / score popup (board_fx.sx) compose on top.
CLEAR_POP_A :f32: 0.34; // overshoot height above resting scale
CLEAR_POP_RISE :f32: 0.18; // fraction of the window spent rising to the peak
clear_pop_scale :: (t: f32) -> f32 {
if t <= 0.0 { return 1.0; }
if t >= 1.0 { return 0.0; }
if t < 0.30 {
return 1.0 + CLEAR_POP_A * (t / 0.30);
if t < CLEAR_POP_RISE {
return 1.0 + CLEAR_POP_A * (t / CLEAR_POP_RISE);
}
peak := 1.0 + CLEAR_POP_A;
u := (t - 0.30) / 0.70;
u := (t - CLEAR_POP_RISE) / (1.0 - CLEAR_POP_RISE);
peak * (1.0 - u * u)
}