(bubbles-version): Bump value to "0.5".

(bubbles-mode-map): Move define-key statements here.
(bubbles-game-theme-menu): Ditto.
(bubbles-graphics-theme-menu): Ditto.
(bubbles-menu): Ditto.
(bubbles-mode): Initialize buffer-undo-list, redisplay.
(bubbles--initialize): Reset buffer-undo-list, redisplay.
(bubbles-plop): Set buffer-undo-list, redisplay.
(bubbles-undo): Reset buffer-undo-list, redisplay.
(bubbles--show-images): Take care of missing text properties.
This commit is contained in:
Thien-Thi Nguyen 2007-09-14 18:11:36 +00:00
parent 34acda03c2
commit a4fcacde1e
2 changed files with 125 additions and 86 deletions

View file

@ -1,3 +1,16 @@
2007-09-14 Ulf Jasper <ulf.jasper@web.de>
* play/bubbles.el (bubbles-version): Bump value to "0.5".
(bubbles-mode-map): Move define-key statements here.
(bubbles-game-theme-menu): Ditto.
(bubbles-graphics-theme-menu): Ditto.
(bubbles-menu): Ditto.
(bubbles-mode): Initialize buffer-undo-list, redisplay.
(bubbles--initialize): Reset buffer-undo-list, redisplay.
(bubbles-plop): Set buffer-undo-list, redisplay.
(bubbles-undo): Reset buffer-undo-list, redisplay.
(bubbles--show-images): Take care of missing text properties.
2007-09-14 Glenn Morris <rgm@gnu.org>
* startup.el (fancy-startup-text, fancy-about-text): Fix face

View file

@ -43,6 +43,9 @@
;;; History:
;; 0.5 (2007-09-14)
;; - Minor bugfixes.
;; 0.4 (2007-08-27)
;; - Allow for undoing last move.
;; - Bonus for removing all bubbles.
@ -78,7 +81,7 @@
;;; Code:
(defconst bubbles-version "0.4" "Version number of bubbles.el.")
(defconst bubbles-version "0.5" "Version number of bubbles.el.")
(require 'gamegrid)
(require 'cl)
@ -824,89 +827,98 @@ static char * dot3d_xpm[] = {
(bubbles--initialize-images)
(bubbles--update-faces-or-images))
;; bubbles mode map
(defvar bubbles-mode-map
(make-keymap 'bubbles-mode-map))
(define-key bubbles-mode-map "q" 'bubbles-quit)
(define-key bubbles-mode-map "\n" 'bubbles-plop)
(define-key bubbles-mode-map " " 'bubbles-plop)
(define-key bubbles-mode-map [double-down-mouse-1] 'bubbles-plop)
(define-key bubbles-mode-map [mouse-2] 'bubbles-plop)
(define-key bubbles-mode-map "\C-m" 'bubbles-plop)
(define-key bubbles-mode-map "u" 'bubbles-undo)
(define-key bubbles-mode-map "p" 'previous-line)
(define-key bubbles-mode-map "n" 'next-line)
(define-key bubbles-mode-map "f" 'forward-char)
(define-key bubbles-mode-map "b" 'backward-char)
;; game theme menu
(defvar bubbles-game-theme-menu (make-sparse-keymap "Game Theme"))
(define-key bubbles-game-theme-menu [bubbles-set-game-userdefined]
(list 'menu-item "User defined" 'bubbles-set-game-userdefined
:button '(:radio . (eq bubbles-game-theme 'user-defined))))
(define-key bubbles-game-theme-menu [bubbles-set-game-hard]
(list 'menu-item "Hard" 'bubbles-set-game-hard
:button '(:radio . (eq bubbles-game-theme 'hard))))
(define-key bubbles-game-theme-menu [bubbles-set-game-difficult]
(list 'menu-item "Difficult" 'bubbles-set-game-difficult
:button '(:radio . (eq bubbles-game-theme 'difficult))))
(define-key bubbles-game-theme-menu [bubbles-set-game-medium]
(list 'menu-item "Medium" 'bubbles-set-game-medium
:button '(:radio . (eq bubbles-game-theme 'medium))))
(define-key bubbles-game-theme-menu [bubbles-set-game-easy]
(list 'menu-item "Easy" 'bubbles-set-game-easy
:button '(:radio . (eq bubbles-game-theme 'easy))))
(defvar bubbles-game-theme-menu
(let ((menu (make-sparse-keymap "Game Theme")))
(define-key menu [bubbles-set-game-userdefined]
(list 'menu-item "User defined" 'bubbles-set-game-userdefined
:button '(:radio . (eq bubbles-game-theme 'user-defined))))
(define-key menu [bubbles-set-game-hard]
(list 'menu-item "Hard" 'bubbles-set-game-hard
:button '(:radio . (eq bubbles-game-theme 'hard))))
(define-key menu [bubbles-set-game-difficult]
(list 'menu-item "Difficult" 'bubbles-set-game-difficult
:button '(:radio . (eq bubbles-game-theme 'difficult))))
(define-key menu [bubbles-set-game-medium]
(list 'menu-item "Medium" 'bubbles-set-game-medium
:button '(:radio . (eq bubbles-game-theme 'medium))))
(define-key menu [bubbles-set-game-easy]
(list 'menu-item "Easy" 'bubbles-set-game-easy
:button '(:radio . (eq bubbles-game-theme 'easy))))
menu)
"Map for bubbles game theme menu.")
;; graphics theme menu
(defvar bubbles-graphics-theme-menu (make-sparse-keymap "Graphics Theme"))
(define-key bubbles-graphics-theme-menu [bubbles-set-graphics-theme-ascii]
(list 'menu-item "ASCII" 'bubbles-set-graphics-theme-ascii
:button '(:radio . (eq bubbles-graphics-theme 'ascii))))
(define-key bubbles-graphics-theme-menu [bubbles-set-graphics-theme-emacs]
(list 'menu-item "Emacs" 'bubbles-set-graphics-theme-emacs
:button '(:radio . (eq bubbles-graphics-theme 'emacs))))
(define-key bubbles-graphics-theme-menu [bubbles-set-graphics-theme-balls]
(list 'menu-item "Balls" 'bubbles-set-graphics-theme-balls
:button '(:radio . (eq bubbles-graphics-theme 'balls))))
(define-key bubbles-graphics-theme-menu [bubbles-set-graphics-theme-diamonds]
(list 'menu-item "Diamonds" 'bubbles-set-graphics-theme-diamonds
:button '(:radio . (eq bubbles-graphics-theme 'diamonds))))
(define-key bubbles-graphics-theme-menu [bubbles-set-graphics-theme-squares]
(list 'menu-item "Squares" 'bubbles-set-graphics-theme-squares
:button '(:radio . (eq bubbles-graphics-theme 'squares))))
(define-key bubbles-graphics-theme-menu [bubbles-set-graphics-theme-circles]
(list 'menu-item "Circles" 'bubbles-set-graphics-theme-circles
:button '(:radio . (eq bubbles-graphics-theme 'circles))))
(defvar bubbles-graphics-theme-menu
(let ((menu (make-sparse-keymap "Graphics Theme")))
(define-key menu [bubbles-set-graphics-theme-ascii]
(list 'menu-item "ASCII" 'bubbles-set-graphics-theme-ascii
:button '(:radio . (eq bubbles-graphics-theme 'ascii))))
(define-key menu [bubbles-set-graphics-theme-emacs]
(list 'menu-item "Emacs" 'bubbles-set-graphics-theme-emacs
:button '(:radio . (eq bubbles-graphics-theme 'emacs))))
(define-key menu [bubbles-set-graphics-theme-balls]
(list 'menu-item "Balls" 'bubbles-set-graphics-theme-balls
:button '(:radio . (eq bubbles-graphics-theme 'balls))))
(define-key menu [bubbles-set-graphics-theme-diamonds]
(list 'menu-item "Diamonds" 'bubbles-set-graphics-theme-diamonds
:button '(:radio . (eq bubbles-graphics-theme 'diamonds))))
(define-key menu [bubbles-set-graphics-theme-squares]
(list 'menu-item "Squares" 'bubbles-set-graphics-theme-squares
:button '(:radio . (eq bubbles-graphics-theme 'squares))))
(define-key menu [bubbles-set-graphics-theme-circles]
(list 'menu-item "Circles" 'bubbles-set-graphics-theme-circles
:button '(:radio . (eq bubbles-graphics-theme 'circles))))
menu)
"Map for bubbles graphics theme menu.")
;; menu
(defvar bubbles-menu (make-sparse-keymap "Bubbles"))
(define-key bubbles-menu [bubbles-quit]
(list 'menu-item "Quit" 'bubbles-quit))
(define-key bubbles-menu [bubbles]
(list 'menu-item "New game" 'bubbles))
(define-key bubbles-menu [bubbles-separator-1]
'("--"))
(define-key bubbles-menu [bubbles-save-settings]
(list 'menu-item "Save all settings" 'bubbles-save-settings))
(define-key bubbles-menu [bubbles-customize]
(list 'menu-item "Edit all settings" 'bubbles-customize))
(define-key bubbles-menu [bubbles-game-theme-menu]
(list 'menu-item "Game Theme" bubbles-game-theme-menu))
(define-key bubbles-menu [bubbles-graphics-theme-menu]
(list 'menu-item "Graphics Theme" bubbles-graphics-theme-menu
:enable 'bubbles--playing))
(define-key bubbles-menu [bubbles-separator-2]
'("--"))
(define-key bubbles-menu [bubbles-undo]
(list 'menu-item "Undo last move" 'bubbles-undo
:enable '(and bubbles--playing bubbles--save-data)))
(defvar bubbles-menu
(let ((menu (make-sparse-keymap "Bubbles")))
(define-key menu [bubbles-quit]
(list 'menu-item "Quit" 'bubbles-quit))
(define-key menu [bubbles]
(list 'menu-item "New game" 'bubbles))
(define-key menu [bubbles-separator-1]
'("--"))
(define-key menu [bubbles-save-settings]
(list 'menu-item "Save all settings" 'bubbles-save-settings))
(define-key menu [bubbles-customize]
(list 'menu-item "Edit all settings" 'bubbles-customize))
(define-key menu [bubbles-game-theme-menu]
(list 'menu-item "Game Theme" bubbles-game-theme-menu))
(define-key menu [bubbles-graphics-theme-menu]
(list 'menu-item "Graphics Theme" bubbles-graphics-theme-menu
:enable 'bubbles--playing))
(define-key menu [bubbles-separator-2]
'("--"))
(define-key menu [bubbles-undo]
(list 'menu-item "Undo last move" 'bubbles-undo
:enable '(and bubbles--playing (listp buffer-undo-list))))
menu)
"Map for bubbles menu.")
;; bind menu to mouse
(define-key bubbles-mode-map [down-mouse-3] bubbles-menu)
;; Put menu in menu-bar
(define-key bubbles-mode-map [menu-bar Bubbles]
(cons "Bubbles" bubbles-menu))
;; bubbles mode map
(defvar bubbles-mode-map
(let ((map (make-sparse-keymap 'bubbles-mode-map)))
;; (suppress-keymap map t)
(define-key map "q" 'bubbles-quit)
(define-key map "\n" 'bubbles-plop)
(define-key map " " 'bubbles-plop)
(define-key map [double-down-mouse-1] 'bubbles-plop)
(define-key map [mouse-2] 'bubbles-plop)
(define-key map "\C-m" 'bubbles-plop)
(define-key map "u" 'bubbles-undo)
(define-key map "p" 'previous-line)
(define-key map "n" 'next-line)
(define-key map "f" 'forward-char)
(define-key map "b" 'backward-char)
;; bind menu to mouse
(define-key map [down-mouse-3] bubbles-menu)
;; Put menu in menu-bar
(define-key map [menu-bar Bubbles] (cons "Bubbles" bubbles-menu))
map)
"Mode map for bubbles.")
(defun bubbles-mode ()
"Major mode for playing bubbles.
@ -916,7 +928,10 @@ static char * dot3d_xpm[] = {
(setq major-mode 'bubbles-mode)
(setq mode-name "Bubbles")
(setq buffer-read-only t)
(buffer-enable-undo)
(buffer-disable-undo)
(setq buffer-undo-list t)
(force-mode-line-update)
(redisplay)
(add-hook 'post-command-hook 'bubbles--mark-neighbourhood t t)
(run-hooks 'bubbles-mode-hook))
@ -1014,7 +1029,10 @@ Set `bubbles--col-offset' and `bubbles--row-offset'."
(bubbles-mode)
(bubbles--reset-score)
(bubbles--update-faces-or-images)
(bubbles--goto 0 0))
(bubbles--goto 0 0)
(setq buffer-undo-list t)
(force-mode-line-update)
(redisplay))
(defun bubbles--initialize-faces ()
"Prepare faces for playing `bubbles'."
@ -1196,7 +1214,6 @@ Use optional parameter POS instead of point if given."
(when (and bubbles--playing
(> bubbles--neighbourhood-score 0))
(setq bubbles--save-data (list bubbles--score (buffer-string)))
(setq buffer-undo-list '(apply bubbles-undo . nil))
(let ((inhibit-read-only t))
;; blank out current neighbourhood
(let ((row (bubbles--row (point)))
@ -1245,7 +1262,8 @@ Use optional parameter POS instead of point if given."
(dotimes (j (bubbles--grid-width))
(bubbles--goto i j)
(while (get-text-property (point) 'removed)
(setq shifted (or (bubbles--shift 'right i j) shifted))))))
(setq shifted (or (bubbles--shift 'right i j)
shifted))))))
(bubbles--update-faces-or-images)
(sleep-for 0.5))
(t ;; default shift-mode
@ -1259,7 +1277,8 @@ Use optional parameter POS instead of point if given."
(dotimes (k shifted-cols)
(let ((i (- (bubbles--grid-height) 2)))
(while (>= i 0)
(setq shifted (or (bubbles--shift 'right i j) shifted))
(setq shifted (or (bubbles--shift 'right i j)
shifted))
(setq i (1- i))))))))))
(when shifted
;;(sleep-for 0.5)
@ -1267,7 +1286,11 @@ Use optional parameter POS instead of point if given."
(sit-for 0)))
(put-text-property (point-min) (point-max) 'removed nil)
(unless (bubbles--neighbourhood-available)
(bubbles--game-over)))))
(bubbles--game-over)))
;; undo
(setq buffer-undo-list '((apply bubbles-undo . nil)))
(force-mode-line-update)
(redisplay)))
(defun bubbles-undo ()
"Undo last move."
@ -1279,7 +1302,10 @@ Use optional parameter POS instead of point if given."
(insert (cadr bubbles--save-data))
(bubbles--update-faces-or-images)
(setq bubbles--score (car bubbles--save-data))
(goto-char pos))))
(goto-char pos))
(setq buffer-undo-list t)
(force-mode-line-update)
(redisplay)))
(defun bubbles--shift (from row col)
"Move bubbles FROM one side to position ROW COL.
@ -1408,7 +1434,7 @@ Return t if new char is non-empty."
(dotimes (i (bubbles--grid-height))
(dotimes (j (bubbles--grid-width))
(forward-char 1)
(let ((index (get-text-property (point) 'index)))
(let ((index (or (get-text-property (point) 'index) -1)))
(let ((img bubbles--empty-image))
(if (>= index 0)
(setq img (nth index bubbles--images)))