atoms.lisp: When restoring an unstable position, continue the animation.
authorMark Wooding <mdw@distorted.org.uk>
Fri, 22 Mar 2013 22:34:41 +0000 (22:34 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Fri, 22 Mar 2013 22:34:41 +0000 (22:34 +0000)
Otherwise, the following thing goes wrong.  You make a move which starts
a chain reaction; you undo it before the reaction has resolved and there
are still atoms from other players; and then you redo the move.  At this
point, you have a static board and nobody can play, since both players
are :playing.

atoms.lisp

index 77329cf..eac69bc 100644 (file)
          do (restore player snap-player))
     (setf (game-player-index game) (slot-value snapshot 'player-index))
     (game-cancel-timeout game)
-    (changed game :refresh)))
+    (changed game :refresh)
+    (let ((critical-cells (loop for i below (array-total-size grid)
+                               for cell = (row-major-aref grid i)
+                               if (cell-critical-p cell)
+                               collect cell)))
+      (when critical-cells (perform-explosions game critical-cells)))))
 
 ;;;--------------------------------------------------------------------------
 ;;; The interactive board.