#+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)
(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)))))
(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)
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.
: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
(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)
(defvar *window* nil)
+(export 'start-atom-game)
(defun start-atom-game (&rest initargs)
(when *window*
(gtk:widget-destroy *window*)
(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 --------------------------------------------------