Add 2012 to FSF copyright years for Emacs files
[bpt/emacs.git] / lisp / play / mpuz.el
index 3c1a9fd..f086931 100644 (file)
@@ -1,7 +1,6 @@
 ;;; mpuz.el --- multiplication puzzle for GNU Emacs
 
-;; Copyright (C) 1990, 2001, 2002, 2003, 2004, 2005,
-;;   2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 1990, 2001-2012  Free Software Foundation, Inc.
 
 ;; Author: Philippe Schnoebelen <phs@lsv.ens-cachan.fr>
 ;; Overhauled: Daniel Pfeiffer <occitan@esperanto.org>
 (random t)                             ; randomize
 
 (defcustom mpuz-silent 'error
-  "*Set this to nil if you want dings on inputs.
-t means never ding, and `error' means only ding on wrong input."
+  "Set this to nil if you want dings on inputs.
+The value t means never ding, and `error' means only ding on wrong input."
   :type '(choice (const :tag "No" nil)
                 (const :tag "Yes" t)
                 (const :tag "If correct" error))
   :group 'mpuz)
 
 (defcustom mpuz-solve-when-trivial t
-  "*Solve any row that can be trivially calculated from what you've found."
+  "Solve any row that can be trivially calculated from what you've found."
   :type 'boolean
   :group 'mpuz)
 
 (defcustom mpuz-allow-double-multiplicator nil
-  "*Allow 2nd factors like 33 or 77."
+  "Allow 2nd factors like 33 or 77."
   :type 'boolean
   :group 'mpuz)
 
 (defface mpuz-unsolved
   '((((class color)) (:foreground "red1" :bold t))
     (t (:bold t)))
-  "*Face to use for letters to be solved."
+  "Face to use for letters to be solved."
   :group 'mpuz)
 
 (defface mpuz-solved
   '((((class color)) (:foreground "green1" :bold t))
     (t (:bold t)))
-  "*Face to use for solved digits."
+  "Face to use for solved digits."
   :group 'mpuz)
 
 (defface mpuz-trivial
   '((((class color)) (:foreground "blue" :bold t))
     (t (:bold t)))
-  "*Face to use for trivial digits solved for you."
+  "Face to use for trivial digits solved for you."
   :group 'mpuz)
 
 (defface mpuz-text
   '((t (:inherit variable-pitch)))
-  "*Face to use for text on right."
+  "Face to use for text on right."
   :group 'mpuz)
 
 \f
@@ -87,34 +86,16 @@ t means never ding, and `error' means only ding on wrong input."
   :type 'hook
   :group 'mpuz)
 
-(defvar mpuz-mode-map nil
+(defvar mpuz-mode-map
+  (let ((map (make-sparse-keymap)))
+    (mapc (lambda (ch)
+            (define-key map (char-to-string ch) 'mpuz-try-letter))
+          "abcdefghijABCDEFGHIJ")
+    (define-key map "\C-g" 'mpuz-offer-abort)
+    (define-key map "?" 'describe-mode)
+    map)
   "Local keymap to use in Mult Puzzle.")
 
-(if mpuz-mode-map nil
-  (setq mpuz-mode-map (make-sparse-keymap))
-  (define-key mpuz-mode-map "a" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "b" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "c" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "d" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "e" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "f" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "g" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "h" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "i" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "j" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "A" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "B" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "C" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "D" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "E" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "F" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "G" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "H" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "I" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "J" 'mpuz-try-letter)
-  (define-key mpuz-mode-map "\C-g" 'mpuz-offer-abort)
-  (define-key mpuz-mode-map "?" 'describe-mode))
-
 (defun mpuz-mode ()
   "Multiplication puzzle mode.
 
@@ -171,7 +152,7 @@ You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]."
   "A permutation from [0..9] to [0..9].")
 
 (defvar mpuz-letter-to-digit (make-vector 10 0)
-  "The inverse of mpuz-digit-to-letter.")
+  "The inverse of `mpuz-digit-to-letter'.")
 
 (defmacro mpuz-to-digit (letter)
   (list 'aref 'mpuz-letter-to-digit letter))
@@ -198,17 +179,16 @@ You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]."
 (defvar mpuz-board (make-vector 10 nil)
   "The board associates to any digit the list of squares where it appears.")
 
-(defun mpuz-put-number-on-board (number row &rest l)
+(defun mpuz-put-number-on-board (number row &rest columns)
   "Put (last digit of) NUMBER on ROW and COLUMNS of the puzzle board."
   (let (digit)
-    (while l
+    (dolist (column columns)
       (setq digit (% number 10)
-           number (/ number 10))
-      (aset mpuz-board digit `((,row . ,(car l)) ,@(aref mpuz-board digit)))
-      (setq l (cdr l)))))
+            number (/ number 10))
+      (aset mpuz-board digit `((,row . ,column) ,@(aref mpuz-board digit))))))
 
 (defun mpuz-check-all-solved (&optional row col)
-  "Check whether all digits have been solved. Return t if yes."
+  "Check whether all digits have been solved.  Return t if yes."
   (catch 'solved
     (let (A B1 B2 C D E squares)
       (and mpuz-solve-when-trivial
@@ -294,12 +274,11 @@ You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]."
   "The general picture of the puzzle screen, as a string.")
 
 (defun mpuz-create-buffer ()
-  "Create (or recreate) the puzzle buffer. Return it."
+  "Create (or recreate) the puzzle buffer.  Return it."
   (let ((buf (get-buffer-create "*Mult Puzzle*"))
        (face '(face mpuz-text))
        buffer-read-only)
-    (save-excursion
-      (set-buffer buf)
+    (with-current-buffer buf
       (erase-buffer)
       (insert mpuz-framework)
       (set-text-properties 13 42 face)
@@ -320,12 +299,14 @@ You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]."
 (defun mpuz-paint-errors ()
   "Paint error count on the puzzle screen."
   (mpuz-switch-to-window)
-  (goto-line 3)
+  (goto-char (point-min))
+  (forward-line 2)
   (mpuz-paint-number (prin1-to-string mpuz-nb-errors)))
 
 (defun mpuz-paint-statistics ()
   "Paint statistics about previous games on the puzzle screen."
-  (goto-line 7)
+  (goto-char (point-min))
+  (forward-line 6)
   (mpuz-paint-number (prin1-to-string mpuz-nb-completed-games))
   (mpuz-paint-number
    (format "%.2f"
@@ -352,7 +333,8 @@ You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]."
                       ('mpuz-unsolved))))
        buffer-read-only)
     (mapc (lambda (square)
-           (goto-line (car square))    ; line before column!
+           (goto-char (point-min))
+           (forward-line (1- (car square)))    ; line before column!
            (move-to-column (cdr square))
            (insert char)
            (set-text-properties (1- (point)) (point) face)
@@ -423,8 +405,8 @@ You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]."
   "Propose a digit for a letter in puzzle."
   (interactive)
   (if mpuz-in-progress
-      (let (letter-char digit digit-char message)
-       (setq letter-char (upcase last-command-char)
+      (let (letter-char digit digit-char)
+       (setq letter-char (upcase last-command-event)
              digit (mpuz-to-digit (- letter-char ?A)))
        (cond ((mpuz-digit-solved-p digit)
               (message "%c already solved." letter-char)
@@ -452,8 +434,7 @@ You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]."
   "Propose LETTER-CHAR as code for DIGIT-CHAR."
   (let* ((letter (- letter-char ?A))
         (digit (- digit-char ?0))
-        (correct-digit (mpuz-to-digit letter))
-        (game mpuz-nb-completed-games))
+        (correct-digit (mpuz-to-digit letter)))
     (cond ((mpuz-digit-solved-p correct-digit)
           (message "%c has already been found." (+ correct-digit ?0)))
          ((mpuz-digit-solved-p digit)
@@ -516,5 +497,4 @@ You may abort a game by typing \\<mpuz-mode-map>\\[mpuz-offer-abort]."
 
 (provide 'mpuz)
 
-;; arch-tag: 2781d6ba-89e7-43b5-85c7-5d3a2e73feb1
 ;;; mpuz.el ends here