P19.2: integration — refresh goldens for the merged organic motion + finalize docs
Final golden sweep + doc finalization for the organic-animation pass. No .sx logic/render change; goldens + README only (CLAUDE.md is local-only/gitignored). Refreshed 8 stale goldens to the SHIPPED render (each verified deterministic): - p6_anim_swap/clear/fall, p6_fx, p6_inputlock_board (M3TE_FX=3 at swap/clear/fall segment phases): last captured at P13.1, so they still showed the PRE-organic flat tweens; now show the merged overshoot / pop-ripple / gravity-accel motion. - p17_fall, p17_stagger, p17_land (M3TE_FX=11 deep cascade): captured incrementally at P17.1/.2/.3 and never updated as later steps changed the shared cascade frame (P17.2 stagger, P17.3 squash, P18.2 burst ripple), so the committed PNGs no longer matched the shipped code (12-20% board-region diff). Re-captured to the final, fully-merged fall motion at their documented phases. README: - Added the previously-undocumented move-timeline frame recipes (swap/clear/fall/ after segment phases + the resting-board goldens), filling the doc gap. - Fixed the now-false P17 prose: p17_fall was described as a "pre-stagger lockstep reference" and p17_stagger as carrying "no squash" — both untrue once the full fall motion shipped. Now describes all three as the final combined motion, each pinned to foreground a different tell (accel / staircase / squash wave). Verified all 28 goldens: 8 refreshed, 20 unchanged (board+HUD region byte-identical over a status-bar/home-indicator crop), 0 removed. t=0 rest, win/lose, HUD, select, idle, FPS, p16/p18 and p11_combo_deep all reproduce. Gate green (ios-sim build + 22/22 logic tests; tests/gem_pose.sx + tests/easing.sx pin the t=0 rest invariant).
68
README.md
@@ -329,8 +329,7 @@ distance: in lockstep their gems share one height (a flat row); staggered, they
|
||||
form a diagonal. On seed 1337, `M3TE_FX=11` **round 4** refills columns 2–7 by one
|
||||
cell each (its fall window `[1.74, 1.96)` s); at `1.91` the leading column has just
|
||||
landed while the trailing column is still ~⅔ cell high, so the top row reads as a
|
||||
left-to-right staircase instead of a flat band (contrast `goldens/p17_fall.png`,
|
||||
which is pre-stagger lockstep):
|
||||
left-to-right staircase instead of a flat band:
|
||||
|
||||
```bash
|
||||
# Refilled row pouring in as a staggered cascade: goldens/p17_stagger.png
|
||||
@@ -379,10 +378,15 @@ env SIMCTL_CHILD_M3TE_FX=11 SIMCTL_CHILD_M3TE_ANIM_TIME=3.0 \
|
||||
xcrun simctl launch --terminate-running-process booted co.swipelab.m3te
|
||||
```
|
||||
|
||||
`goldens/p17_fall.png` stays the pre-stagger lockstep reference (P17.1) and
|
||||
`goldens/p17_stagger.png` the pure per-column stagger (P17.2); both pin moments where
|
||||
no column has landed yet, so neither carries squash. The change is render-only — no
|
||||
`board.sx` model change, and a resting board is untouched.
|
||||
All three fall goldens were re-captured in P19.2 to the final, fully-merged fall
|
||||
motion (gravity accel + per-column stagger + landing squash), each pinned to
|
||||
foreground a different tell of it: `goldens/p17_fall.png` (round 3 at `1.51`) catches
|
||||
the columns bunched HIGH under the gravity accel before any has landed (so it carries
|
||||
no squash); `goldens/p17_stagger.png` (round 4 at `1.91`) catches the left-to-right
|
||||
staircase as the leading column just touches down; and this golden (round 4 at `1.94`)
|
||||
catches the squash wave once the leading columns have landed-and-flattened while the
|
||||
trailing ones still pour in. The change is render-only — no `board.sx` model change,
|
||||
and a resting board is untouched.
|
||||
|
||||
### Organic combine — anticipation pop on clear (P18.1)
|
||||
|
||||
@@ -496,6 +500,58 @@ env SIMCTL_CHILD_M3TE_FPS=1 SIMCTL_CHILD_M3TE_ANIM_TIME=0 \
|
||||
digits are dynamic, compare the FPS text's PRESENCE in the top-left corner, not its
|
||||
exact value. Every other golden is captured with `M3TE_FPS` unset and is unaffected.
|
||||
|
||||
### Move-timeline frame goldens (P6.1 / P6.2)
|
||||
|
||||
The board-motion timeline (`board_anim.sx`: swap slide → matched-gem clear →
|
||||
collapse/refill fall) and the match-FX layer (`board_fx.sx`) were first locked by a
|
||||
set of frame goldens captured off ONE committed move. They use the same `M3TE_FX`
|
||||
hook as the FX captures above — `M3TE_FX=3` is the seed-1337 vertical red 3-match (a
|
||||
single round) — each pinned with `M3TE_ANIM_TIME` to a phase of the swap→clear→fall→
|
||||
settled timeline. Re-captured in P19.2 so each now shows the **organic** motion merged
|
||||
in P16–P18 (swap overshoot, anticipation-pop clear ripple, gravity-accel fall); the
|
||||
canonical per-feature organic goldens live in the P16/P17/P18 sections above, and
|
||||
these are the generic timeline frames at their segment midpoints.
|
||||
|
||||
```bash
|
||||
# Swap segment midpoint — the swapped gems caught PAST target (ease_out_back
|
||||
# overshoot): goldens/p6_anim_swap.png
|
||||
env SIMCTL_CHILD_M3TE_FX=3 SIMCTL_CHILD_M3TE_ANIM_TIME=0.08 \
|
||||
xcrun simctl launch --terminate-running-process booted co.swipelab.m3te
|
||||
# Clear segment midpoint — matched gems mid pop-ripple, composed with the burst and
|
||||
# "+30" popup. The SAME committed-move frame backs all three of:
|
||||
# goldens/p6_anim_clear.png == goldens/p6_fx.png == goldens/p6_inputlock_board.png
|
||||
env SIMCTL_CHILD_M3TE_FX=3 SIMCTL_CHILD_M3TE_ANIM_TIME=0.23 \
|
||||
xcrun simctl launch --terminate-running-process booted co.swipelab.m3te
|
||||
# Fall segment midpoint — the refilled column caught bunched high under gravity
|
||||
# accel: goldens/p6_anim_fall.png
|
||||
env SIMCTL_CHILD_M3TE_FX=3 SIMCTL_CHILD_M3TE_ANIM_TIME=0.41 \
|
||||
xcrun simctl launch --terminate-running-process booted co.swipelab.m3te
|
||||
# Settled board past the timeline — FX fully pruned, the move's final board. The
|
||||
# SAME settled frame backs all three of:
|
||||
# goldens/p6_anim_after.png == goldens/p5_swap_after.png == goldens/p6_fx_after.png
|
||||
env SIMCTL_CHILD_M3TE_FX=3 SIMCTL_CHILD_M3TE_ANIM_TIME=2.0 \
|
||||
xcrun simctl launch --terminate-running-process booted co.swipelab.m3te
|
||||
```
|
||||
|
||||
`p6_anim_clear` / `p6_fx` / `p6_inputlock_board` are one and the same frame — the
|
||||
timeline's clear segment, the burst/popup FX, and the input-locked in-flight board
|
||||
are all the same committed-move moment — as are the three settled `*_after` goldens.
|
||||
|
||||
The resting-board goldens — `goldens/p4_board.png`, `goldens/p4_hud.png`,
|
||||
`goldens/p9_polish.png`, and `goldens/p5_swap_before.png` (the swap's start pose) —
|
||||
are the seed-1337 board at rest, captured with no move committed:
|
||||
|
||||
```bash
|
||||
# Resting candy board / HUD (no move): p4_board.png, p4_hud.png, p9_polish.png,
|
||||
# p5_swap_before.png
|
||||
SIMCTL_CHILD_M3TE_ANIM_TIME=0 \
|
||||
xcrun simctl launch --terminate-running-process booted co.swipelab.m3te
|
||||
```
|
||||
|
||||
They match `goldens/p6_idle_t0.png` over the board+HUD region (the `t==0` rest
|
||||
invariant, `tests/gem_pose.sx`); only the status-bar clock and the bottom
|
||||
home-indicator chrome vary per grab, never the board or HUD.
|
||||
|
||||
## Audio bank (P10) — final model
|
||||
|
||||
The SFX bank (`audio.sx`) is a purely additive layer over iOS **System Sound
|
||||
|
||||
|
Before Width: | Height: | Size: 3.1 MiB After Width: | Height: | Size: 3.1 MiB |
|
Before Width: | Height: | Size: 3.2 MiB After Width: | Height: | Size: 3.2 MiB |
|
Before Width: | Height: | Size: 3.2 MiB After Width: | Height: | Size: 3.2 MiB |
|
Before Width: | Height: | Size: 3.2 MiB After Width: | Height: | Size: 3.2 MiB |
|
Before Width: | Height: | Size: 3.3 MiB After Width: | Height: | Size: 3.2 MiB |
|
Before Width: | Height: | Size: 3.2 MiB After Width: | Height: | Size: 3.2 MiB |
|
Before Width: | Height: | Size: 3.2 MiB After Width: | Height: | Size: 3.2 MiB |
|
Before Width: | Height: | Size: 3.2 MiB After Width: | Height: | Size: 3.2 MiB |