New gem_anim.sx adds a purely-visual per-gem pose set driven by a single animation clock: a calm always-on idle breath (scale-pulse + bob, per-gem phase, ramped in from rest), a selection pop, a landing squash-bounce, and a clear pop. BoardView draws every settled gem through gem_pose_at / gem_pose_frame; the move timeline (P6.1) and FX (P6.2) are untouched and the input-lock semantics are unchanged (idle never locks input). Determinism: the idle is always-on, so main reads M3TE_ANIM_TIME=<seconds> to freeze the clock at a chosen phase (t==0 == the resting board, so the pre-P6.3 goldens reproduce) and M3TE_SELECT=<cellIndex> to force a selection for capture. tests/gem_pose.sx locks the t==0-rest invariant and the reaction envelopes headlessly (fails if the idle ramp is dropped). Goldens (deterministic capture): p6_idle_t0 (resting), p6_idle_mid (pinned mid-breath), p6_select (selection pop on cell 3,3). Purely visual: no change to model/score/moves/hit-testing.
14 lines
547 B
Plaintext
14 lines
547 B
Plaintext
== idle t=0 is rest for all cells ==
|
|
idle_t0_rest true
|
|
== idle mid-phase deforms, bounded ==
|
|
idle_mid_moves true idle_bounded true
|
|
== select pop envelope ==
|
|
select_start_rest true select_end_rest true select_mid_pops true
|
|
== land squash envelope ==
|
|
land_start_rest true land_end_rest true land_mid_wobbles true
|
|
== clear pop envelope ==
|
|
clear_start_full true clear_end_gone true clear_overshoots true
|
|
== gem motion land bookkeeping ==
|
|
motion_init true motion_no_land true motion_fresh_land true
|
|
ok: per-gem animation rests at t=0 and stays bounded
|