P7.2 fix: reset per-gem landing state on restart
The restart button (BoardView.do_restart) reseeded the model and dropped selection/drag/anim/FX, but left GemMotion.land_at carrying the prior move's landing stamps. A restart fired right after a terminal cascade therefore replayed that move's squash-bounce on the freshly seeded board instead of showing a clean resting pose. Factor the landing reset into GemMotion.reset_landings (init now delegates to it) and call it from do_restart, so a restart returns every cell to its resting idle pose. The idle clock keeps running, so the always-on idle simply resumes from rest. Regression: tests/gem_pose.sx section 7 stamps a cell mid-squash, asserts it is squashing, then asserts reset_landings returns every cell to rest while leaving the clock untouched. Fails on the pre-fix (no-op reset) behaviour, passes after. Gate green: ios-sim build + 18/18 logic tests.
This commit is contained in:
@@ -487,14 +487,17 @@ BoardView :: struct {
|
||||
|
||||
// Restart action behind the banner's button: reseed the SAME starting level
|
||||
// through the model (board.restart) and drop every transient view layer
|
||||
// (selection, in-flight drag, move animation, FX) so the board returns to a
|
||||
// clean in_progress state.
|
||||
// (selection, in-flight drag, move animation, FX, and the per-gem landing
|
||||
// bounce) so the board returns to a clean, resting in_progress state. Without
|
||||
// the motion reset a restart fired right after a terminal cascade would carry
|
||||
// that move's landing squash onto the freshly seeded board.
|
||||
do_restart :: (self: *BoardView) {
|
||||
self.board.restart(self.seed);
|
||||
self.sel.clear();
|
||||
self.drag.clear();
|
||||
if self.anim != null { self.anim.init(); }
|
||||
if self.fx != null { self.fx.clear(); }
|
||||
self.motion.reset_landings();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user