chiark / gitweb /
atoms.lisp: Don't start the game automatically.
[atoms] / atoms.lisp
index fa65755b3b179223be8f2035f6bbd7b7c4ee72f0..6aeb8de8647bc08a5c9bed700f0b32ea3894a58e 100644 (file)
@@ -26,8 +26,7 @@ (cl:defpackage #:atoms
        #+cmu #:ext
        #+sbcl #:sb-ext
        #+clisp #:ext)
-  #+clisp (:shadow #:map-dependents #:add-dependent #:remove-dependent)
-  (:export #:start-atom-game))
+  #+clisp (:shadow #:map-dependents #:add-dependent #:remove-dependent))
 (cl:in-package #:atoms)
 
 (eval-when (:compile-toplevel :load-toplevel :execute)
@@ -294,7 +293,7 @@ (defmethod game-update-scores (game)
                 (incf remaining)
                 (setf found player)))))
       (changed game :scores :players players)
-      (when (= remaining 1)
+      (when (and (= remaining 1) (>= (length players) 2))
        (setf (player-state found) :winning)
        (changed game :finished :victor found)))))
 
@@ -362,8 +361,8 @@ (defmethod play-cell ((game atom-game) player i j)
          (unless (cell-played cell player-index)
            (return-from escape))
          (setf (player-state player) :playing)
-         (changed game :processing-move)
-         (perform-explosions game (list cell)))))))
+         (changed game :processing-move))
+       (perform-explosions game (list cell))))))
 
 (defmethod restart-game ((game atom-game) &key grid players)
   (game-cancel-timeout game)
@@ -417,7 +416,12 @@ (defmethod restore ((game atom-game) (snapshot atom-game-snapshot))
          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.
@@ -742,7 +746,7 @@ (defclass new-game-dialogue (gtk:dialog)
                                               :step-increment 1))
    (count-adjustment :type gtk:adjustment
                     :initform (make-instance 'gtk:adjustment
-                                             :lower 2 :upper 20
+                                             :lower 1 :upper 20
                                              :step-increment 1))
    (players :type gtk:list-store
            :initform (make-instance 'gtk:list-store
@@ -995,17 +999,16 @@ (defun action-new-game (window)
 
 (defun update-undo-redo-sensitivity (window)
   (with-slots (actions game) window
-    (setf (gtk:action-sensitive-p
-          (gtk:action-group-get-action actions "undo"))
-         (undo-list game)
-         (gtk:action-sensitive-p
-          (gtk:action-group-get-action actions "redo"))
-         (redo-list game))))
+    (flet ((set-sensitive (act-name sensitivep)
+            (let ((act (gtk:action-group-get-action actions act-name)))
+              (setf (gtk:action-sensitive-p act) sensitivep))))
+      (set-sensitive "undo" (undo-list game))
+      (set-sensitive "redo" (redo-list game)))))
 
 (defmethod notify progn
     ((window atom-game-window) (game atom-game) aspect &key)
   (case aspect
-    ((:undo :redo :refresh :processing-move)
+    ((:undo :redo :refresh :start-turn)
      (update-undo-redo-sensitivity window))))
 
 (defun action-undo (window)
@@ -1146,6 +1149,7 @@ (defmethod shared-initialize :after
 
 (defvar *window* nil)
 
+(export 'start-atom-game)
 (defun start-atom-game (&rest initargs)
   (when *window*
     (gtk:widget-destroy *window*)
@@ -1153,6 +1157,8 @@ (defun start-atom-game (&rest initargs)
   (setf *window* (apply #'make-instance 'atom-game-window initargs))
   (gtk:widget-show-all *window*))
 
-(start-atom-game :width 7 :players (list "Mark" "Vicky"))
+#+debug
+(start-atom-game :width 7
+                :players '("Alice" "Bob"))
 
 ;;;----- That's all, folks --------------------------------------------------