Give each landing gem a wide-and-short squash-&-settle bounce as it touches its destination, applied WITHIN the fall so EVERY cascade round bounces (staggered per column), not only the final whole-move settle. One envelope, one bounce: land_squash is now LAND_SQUASH_A * squash_envelope (P15.1) over its normalized window, so the per-round fall bounce and the settle bounce are the exact same shape. render_fall/render_clear age a per-column bounce from each column's touch-down instant (fall_landing_frac * FALL_ANIM_DUR) via the shared rest_squash + delivering_round helpers, so a gem still in the air draws unsquashed and only a landed gem flattens; the squash carries across the fall->clear seam. Double-bounce reconciliation (approach a): drive the bounce from the per-round fall and DROP the old whole-move "stamp at age 0" settle. The settle stamp is now BACK-DATED per column (clock - (total - round_land_time)) so render_gems resumes land_squash exactly where render_fall left off at the render_anim -> render_gems seam — one continuous bounce, no double-pop. Amplitude tuned 0.13 -> 0.18 (~13% peak) so the bounce reads while staying tasteful; durations unchanged, so the cascade-cue snapshots don't churn. M3TE_ANIM_TIME=0 still reproduces goldens/p6_idle_t0.png (a resting board carries no landing stamp). New goldens/p17_land.png pins a staggered landing mid-pour (M3TE_FX=11 ANIM_TIME=1.94). tests/easing.sx gains a landing-instant section pinning fall_landing_frac / round_land_time; tests/gem_pose.sx stays green (land_squash values are identical).
21 KiB
21 KiB