]> git.bundesbrandschatzamt.de Git - emacsconfig.git/commitdiff
update sokoban.
authorAndreas Gerler <baronNOSPAMbundesbrandschatzamt.de>
Tue, 13 Nov 2018 13:43:32 +0000 (14:43 +0100)
committerAndreas Gerler <baronNOSPAMbundesbrandschatzamt.de>
Tue, 13 Nov 2018 13:43:32 +0000 (14:43 +0100)
Signed-off-by: Andreas Gerler <baronNOSPAMbundesbrandschatzamt.de>
elpa/sokoban-1.23/sokoban-autoloads.el [new file with mode: 0644]
elpa/sokoban-1.23/sokoban-pkg.el [new file with mode: 0644]
elpa/sokoban-1.23/sokoban.el [new file with mode: 0644]
elpa/sokoban-1.4.6/ChangeLog [deleted file]
elpa/sokoban-1.4.6/sokoban-autoloads.el [deleted file]
elpa/sokoban-1.4.6/sokoban-pkg.el [deleted file]
elpa/sokoban-1.4.6/sokoban.el [deleted file]
elpa/sokoban-1.4.6/sokoban.levels [deleted file]

diff --git a/elpa/sokoban-1.23/sokoban-autoloads.el b/elpa/sokoban-1.23/sokoban-autoloads.el
new file mode 100644 (file)
index 0000000..fc3746d
--- /dev/null
@@ -0,0 +1,35 @@
+;;; sokoban-autoloads.el --- automatically extracted autoloads
+;;
+;;; Code:
+
+(add-to-list 'load-path (directory-file-name
+                         (or (file-name-directory #$) (car load-path))))
+
+\f
+;;;### (autoloads nil "sokoban" "sokoban.el" (0 0 0 0))
+;;; Generated autoloads from sokoban.el
+
+(autoload 'sokoban-mode "sokoban" "\
+Major mode to play sokoban.
+
+Commands:
+\\{sokoban-mode-map}
+
+\(fn)" t nil)
+
+(autoload 'sokoban "sokoban" "\
+Play sokoban.
+
+\(fn)" t nil)
+
+(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "sokoban" '("sokoban-")))
+
+;;;***
+\f
+;; Local Variables:
+;; version-control: never
+;; no-byte-compile: t
+;; no-update-autoloads: t
+;; coding: utf-8
+;; End:
+;;; sokoban-autoloads.el ends here
diff --git a/elpa/sokoban-1.23/sokoban-pkg.el b/elpa/sokoban-1.23/sokoban-pkg.el
new file mode 100644 (file)
index 0000000..ccf6183
--- /dev/null
@@ -0,0 +1,2 @@
+;;; -*- no-byte-compile: t -*-
+(define-package "sokoban" "1.23" "Play the Sokoban game in emacs" 'nil)
diff --git a/elpa/sokoban-1.23/sokoban.el b/elpa/sokoban-1.23/sokoban.el
new file mode 100644 (file)
index 0000000..a0fa9c8
--- /dev/null
@@ -0,0 +1,516 @@
+;;; sokoban.el --- Play the Sokoban game in emacs
+;; $Id: sokoban.el,v 1.23 2005/06/26 12:14:29 wilde Exp $
+
+;; Copyright (C) 2005  Sascha Wilde
+
+;; Version: 1.23
+;; Author: Sascha Wilde <swildeNOSPAMsha-bang.de>
+;; Keywords: games
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to
+;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Play Sokoban in emacs.
+
+;;; Code:
+
+(require 'cl)
+
+(defconst sokoban-version "0.14.1"
+  "Version string for this version of GNU-Emacs Sokoban.")
+
+(defconst sokoban-left  '(-1 .  0))
+(defconst sokoban-right '( 1 .  0))
+(defconst sokoban-down  '( 0 .  1))
+(defconst sokoban-up    '( 0 . -1))
+
+(defgroup sokoban nil
+  "Sokoban game for GNU Emacs."
+  :prefix "sokoban-"
+  :group 'games)
+
+(defcustom sokoban-playerfiles-dir "/tmp/"
+  "*The directory holding the sokoban playerfiles.
+Sokoban saves the information from `sokoban-player-stats' to a
+playerfile in this directory.  If you don't want to use
+playerfiles, set value to NIL."
+  :group 'sokoban
+  :type 'string)
+
+(defvar sokoban-player-stats nil
+  "Alist with player specific information as saved in the playerfiles.
+This holds the best results for each finished level and the
+players current level.")
+
+(defconst sokoban-playerfile-prefix "sokoban-pl-"
+  "The prefix used for sokoban playerfiles.")
+
+(defvar sokoban-best-players-list nil
+  "Alist with the best result for each level
+generated from all available playerfiles, if `sokoban-playerfiles-dir'
+is none nil.")
+
+(defcustom sokoban-levels-dir "/usr/local/share/sokoban-levels"
+  "*Directory holding the sokoban level files"
+  :group 'sokoban
+  :type 'string)
+
+(defcustom sokoban-levels-basename "sokoban-lvl."
+  "*Basename of the sokoban level files"
+  :group 'sokoban
+  :type 'string)
+
+(defcustom sokoban-start-level 1
+  "*Defines the level-numver to start with.
+This might be overwritten by the last level played,
+as saved in the playerfile."
+  :group 'sokoban
+  :type 'integer)
+
+(defcustom sokoban-undo-penalty 10
+  "*Defines the number of moves one undo costs."
+  :group 'sokoban
+  :type 'integer)
+
+(defcustom sokoban-player-char ?@
+  "*Defines the character used to diplay the player."
+  :group 'sokoban
+  :type 'character)
+
+(defcustom sokoban-boulder-char ?o
+  "*Defines the character used to diplay the boulders."
+  :group 'sokoban
+  :type 'character)
+
+(defcustom sokoban-pit-char ?.
+  "*Defines the character used to diplay the pits."
+  :group 'sokoban
+  :type 'character)
+
+(defcustom sokoban-filled-pit-char ?*
+  "*Defines the character used to diplay pits with boulders in level-files."
+  :group 'sokoban
+  :type 'character)
+
+(defface sokoban-boulder-face
+  '((((class color) (background dark))
+     (:foreground "yellow"
+      :weight  bold))
+    (((class color) (background light))
+     (:foreground "goldenrod4"
+      :weight  bold)))
+  "*Face used display boulders in sokoban game."
+  :group 'sokoban)
+
+(defface sokoban-pit-face
+  '((t (:foreground "blue"
+       :weight  bold)))
+  "*Face used display pits in sokoban game."
+  :group 'sokoban)
+
+(defface sokoban-player-face
+  '((t (:foreground "orange red")))
+  "*Face used display player in sokoban game."
+  :group 'sokoban)
+
+(defvar sokoban-boulder-face 'sokoban-boulder-face)
+(defvar sokoban-pit-face 'sokoban-pit-face)
+(defvar sokoban-player-face 'sokoban-player-face)
+
+(defconst sokoban-font-lock-keywords
+  `((,(regexp-quote (char-to-string sokoban-boulder-char))
+     . sokoban-boulder-face)
+    (,(regexp-quote (char-to-string sokoban-pit-char))
+     . sokoban-pit-face)
+    (,(regexp-quote (char-to-string sokoban-player-char))
+     . sokoban-player-face))
+  "Stuff to highlight in sokoban.")
+
+(defvar sokoban-mode-map nil
+  "Keymap for sokoban.")
+(setq sokoban-mode-map (make-sparse-keymap))
+(define-key sokoban-mode-map [up]    'sokoban-move-up)
+(define-key sokoban-mode-map [down]  'sokoban-move-down)
+(define-key sokoban-mode-map [left]  'sokoban-move-left)
+(define-key sokoban-mode-map [right] 'sokoban-move-right)
+(define-key sokoban-mode-map "u" 'sokoban-undo)
+(define-key sokoban-mode-map "b" 'sokoban-display-best-players-list)
+(define-key sokoban-mode-map ">" 'sokoban-goto-next-level)
+(define-key sokoban-mode-map "<" 'sokoban-goto-prev-level)
+
+(defvar sokoban-pits-list nil
+  "List of positions of all pits in buffer.  Buffer-local in sokoban-mode")
+(defvar sokoban-filled-pits nil
+  "Number of pits filled.  Buffer-local in sokoban-mode.")
+(defvar sokoban-level nil
+  "Number of current level.  Buffer-local in sokoban games.")
+(defvar sokoban-moves nil
+  "Number of moves made by player.  Buffer-local in sokoban-mode.")
+(defvar sokoban-player-pos nil
+  "Current position of player.  Buffer-local in sokoban-mode.")
+(defvar sokoban-player-last-pos nil
+  "Backup of last player position.  Buffer-local in sokoban-mode.")
+(defvar sokoban-game-info nil
+  "String with infos to the current game.  Buffer-local in sokoban-mode.")
+(defvar sokoban-level-best-string nil
+  "String holding the best result for the current level as displayed.")
+
+(defun sokoban-forward-line (arg)
+  "Like forward-line but preserve the current column.
+The implementation is rather simple, as we can make certain
+assumptions about the structure of a valid sokoban level buffer."
+  (let ((goal-column (current-column)))
+    (forward-line arg)
+    (move-to-column goal-column)))
+
+(defun sokoban-paint (char)
+  "Insert char at point, overwriting the old char.
+Extreme simple, but sufficient for our needs."
+  (let ((inhibit-read-only t))
+    (delete-char 1)
+    (insert (char-to-string char)))
+  t)
+
+(defun sokoban-update-score (level moves)
+  "Save number of moves for level to `sokoban-player-stats'."
+  (let* ((level-name (concat sokoban-levels-basename
+                            (number-to-string level)))
+        (entry (assoc level-name sokoban-player-stats)))
+    (if entry
+       (or (< (cdr entry) moves) (setcdr entry moves))
+      (push (cons level-name moves) sokoban-player-stats))))
+
+(defun sokoban-get-level-best (level &optional list)
+  "Get best result for level from `sokoban-player-stats'."
+  (if level
+      (let* ((level-name (concat sokoban-levels-basename
+                                (number-to-string level)))
+            (entry (assoc level-name
+                          (or list sokoban-player-stats))))
+       (if entry
+           (cdr entry)))))
+
+(defun sokoban-update-current-level (level)
+  "Save current level to `sokoban-player-stats'."
+  (let ((entry (assoc :level sokoban-player-stats)))
+    (if entry
+       (setcdr entry level)
+      (push (cons :level level) sokoban-player-stats))))
+
+(defun sokoban-save-playerfile ()
+  "Save `sokoban-player-stats' to playerfile."
+  (if sokoban-playerfiles-dir
+      (let ((filename (concat sokoban-playerfiles-dir "/"
+                             sokoban-playerfile-prefix
+                             (user-login-name))))
+       (with-temp-file filename
+         (prin1 sokoban-player-stats (current-buffer)))
+       (set-file-modes filename #o644))))
+
+(defun sokoban-load-playerfile ()
+  "Load `sokoban-player-stats' from playerfile."
+  (if sokoban-playerfiles-dir
+      (let ((filename (concat sokoban-playerfiles-dir "/"
+                             sokoban-playerfile-prefix
+                             (user-login-name))))
+       (if (file-readable-p filename)
+           (with-temp-buffer
+             (insert-file-contents filename nil)
+             (setq sokoban-player-stats
+                   (read (current-buffer))))))))
+
+(defun sokoban-gen-best-players-list ()
+  (if sokoban-playerfiles-dir
+      (let ((files (directory-files sokoban-playerfiles-dir
+                                   t (concat "^" sokoban-playerfile-prefix)
+                                   t)))
+       (dolist (filename files)
+         (if (file-readable-p filename)
+             (with-temp-buffer
+               (insert-file-contents filename nil)
+               (let ((stats (read (current-buffer)))
+                     (player (substring (file-name-nondirectory filename)
+                                        (1- (length sokoban-levels-basename)))))
+                 (dolist (entry stats)
+                   (let* ((level-name  (car entry))
+                          (best-entry (assoc level-name
+                                             sokoban-best-players-list)))
+                     (if (and (stringp level-name)
+                          (compare-strings level-name
+                                           0 (length sokoban-levels-basename)
+                                           sokoban-levels-basename
+                                           0 nil))
+                         (cond ((and best-entry
+                                     (> (cadr best-entry) (cdr entry)))
+                                (setcdr best-entry
+                                        (cons (cdr entry) player)))
+                               ((or (not best-entry)
+                                    (= (cadr best-entry) (cdr entry)))
+                                (push (cons level-name
+                                            (cons (cdr entry) player))
+                                      sokoban-best-players-list)))))))))))))
+
+
+(defun sokoban-display-best-players-list ()
+  (interactive)
+  (if sokoban-best-players-list
+      (progn
+       (switch-to-buffer (get-buffer-create "*Sokoban Best Players*"))
+       (erase-buffer)
+       (dolist (entry sokoban-best-players-list)
+         (let ((level-name (car entry)))
+           (if (and (stringp level-name)
+                    (compare-strings level-name
+                                     0 (length sokoban-levels-basename)
+                                     sokoban-levels-basename
+                                     0 nil))
+               (insert (format "%4s: %5d - %s\n"
+                               (substring level-name
+                                          (length sokoban-levels-basename))
+                               (cadr entry)
+                               (cddr entry))))))
+       (sort-columns nil (point-min) (point-max)))
+    (error "No best players list available")))
+
+(defun sokoban-refresh-pits ()
+  "Refresh and evaluate pits."
+  (save-excursion
+    (setq sokoban-filled-pits 0)
+    (dolist (pos sokoban-pits-list)
+      (goto-char pos)
+      (let ((char (char-after)))
+       (cond ((= char 32)
+              (sokoban-paint sokoban-pit-char))
+             ((= char sokoban-boulder-char)
+              (setq sokoban-filled-pits
+                    (1+ sokoban-filled-pits)))))))
+  (if (= sokoban-filled-pits (length sokoban-pits-list))
+      (sokoban-level-finished)))
+
+(defun sokoban-load-next-level (&optional arg)
+  "Load next level, with negative arg load previous level.
+If requested level doesn't exist, load `sokoban-start-level'."
+  (when (bound-and-true-p sokoban-level)
+    (setq sokoban-level (if (and arg (< arg 0))
+                           (1- sokoban-level)
+                         (1+ sokoban-level)))
+    (or (sokoban-load-level sokoban-level)
+       (progn
+         (setq sokoban-level sokoban-start-level)
+         (sokoban-load-level sokoban-level)))
+    (sokoban-init-level)
+    t))
+
+(defun sokoban-level-finished ()
+  (message
+   (format "You finished Level %d in %d moves.  Congratulations!"
+          (or (bound-and-true-p sokoban-level) 0)
+          sokoban-moves))
+  (when (bound-and-true-p sokoban-level)
+    (sokoban-update-score sokoban-level sokoban-moves))
+  (when (sokoban-load-next-level)
+    (sokoban-update-current-level sokoban-level)
+    (sokoban-save-playerfile)))
+
+(defun sokoban-find-player ()
+  (goto-char (point-min))
+  (search-forward (char-to-string sokoban-player-char))
+  (forward-char -1)
+  (setq sokoban-player-pos (point)))
+
+(defun sokoban-init-pits ()
+  "Reset and init `sokoban-pits-list'"
+  (setq sokoban-pits-list nil)
+  (save-excursion
+    (goto-char (point-min))
+    (while (search-forward (char-to-string sokoban-pit-char) nil t)
+      (push (1- (point)) sokoban-pits-list))
+    (goto-char (point-min))
+    (while (search-forward (char-to-string sokoban-filled-pit-char) nil t)
+      (forward-char -1)
+      (push (point) sokoban-pits-list)
+      (sokoban-paint sokoban-boulder-char))))
+
+
+(defun sokoban-move-player-here ()
+  "Move player to point.
+Move player char to point, repaint pits and evaluate game status."
+  (setq sokoban-player-pos (point))
+  (sokoban-paint sokoban-player-char)
+  (goto-char sokoban-player-last-pos)
+  (sokoban-paint 32)
+  (setq sokoban-moves (1+ sokoban-moves))
+  (sokoban-refresh-pits)
+  (sokoban-update-mode-line))
+
+(defun sokoban-move-player (direction)
+  (goto-char sokoban-player-pos)
+  (setq sokoban-player-last-pos (point))
+  (forward-char (car direction))
+  (sokoban-forward-line (cdr direction))
+  (cond ((or (= (char-after) 32) ; 32 is space
+            (= (char-after) sokoban-pit-char))
+        (sokoban-move-player-here))
+       ((= (char-after) sokoban-boulder-char)
+        (if (sokoban-move-boulder direction)
+            (sokoban-move-player-here)
+          (message "Can't move boulder!")))
+       (t (message "Ouch!")))
+  (goto-char sokoban-player-pos))
+
+(defun sokoban-move-boulder (direction)
+  "Move boulder at point into direction, if possible."
+  (let ((last-pos (point)))
+    (forward-char (car direction))
+    (sokoban-forward-line (cdr direction))
+    (prog1
+       (if (or (= (char-after) 32) ; 32 is space
+               (= (char-after) sokoban-pit-char))
+           (sokoban-paint sokoban-boulder-char)
+         nil)
+      (goto-char last-pos))))
+
+(defun sokoban-move-up ()
+  "Move the player up if possible."
+  (interactive)
+  (sokoban-move-player sokoban-up))
+
+(defun sokoban-move-down ()
+  "Move the player down if possible."
+  (interactive)
+  (sokoban-move-player sokoban-down))
+
+(defun sokoban-move-left ()
+  "Move the player left if possible."
+  (interactive)
+  (sokoban-move-player sokoban-left))
+
+(defun sokoban-move-right ()
+  "Move the player right if possible."
+  (interactive)
+  (sokoban-move-player sokoban-right))
+
+(defun sokoban-goto-next-level ()
+  "Jump to next level."
+  (interactive)
+  (sokoban-load-next-level))
+
+(defun sokoban-goto-prev-level ()
+  "Jump to previous level."
+  (interactive)
+  (sokoban-load-next-level -1))
+
+(defun sokoban-update-mode-line ()
+  (setq sokoban-game-info (format "Level:%d [%d|%d] -- Moves:%d%s"
+                                 (or (bound-and-true-p sokoban-level)
+                                     0)
+                                 sokoban-filled-pits
+                                 (length sokoban-pits-list)
+                                 sokoban-moves
+                                 (or sokoban-level-best-string ""))))
+
+(defun sokoban-undo ()
+  (interactive)
+  (let ((inhibit-read-only t))
+    (undo))
+  (sokoban-find-player)
+  (setq sokoban-moves (+ sokoban-moves sokoban-undo-penalty))
+  (sokoban-refresh-pits)
+  (sokoban-update-mode-line))
+
+(defun sokoban-load-level (num)
+  "Load sokoban level num."
+  (let ((inhibit-read-only t)
+       (level-file
+        (concat sokoban-levels-dir "/"
+                sokoban-levels-basename (number-to-string num))))
+    (when (file-exists-p level-file)
+      (insert-file-contents level-file nil nil nil t)
+      t)))
+
+(defun sokoban-init-level ()
+  "Initialize level elements."
+  (sokoban-init-pits)
+  (sokoban-refresh-pits)
+  (setq sokoban-moves 0)
+  (setq sokoban-level-best-string
+       (let ((best (sokoban-get-level-best sokoban-level))
+             (world-best (if sokoban-best-players-list
+                             (sokoban-get-level-best 
+                              sokoban-level
+                              sokoban-best-players-list))))
+         (if (or best world-best)
+             (format " [Best:%s%s]"
+                     (if best (number-to-string best) "")
+                     (if (and world-best
+                              (or (not best)
+                                  (< (car world-best) best)))
+                         (format " (%s:%d)"
+                                 (cdr world-best) (car world-best))
+                     "")))))
+  (sokoban-update-mode-line)
+  (sokoban-find-player)
+  (buffer-disable-undo (current-buffer))
+  (buffer-enable-undo))
+
+;;;###autoload
+(defun sokoban-mode ()
+  "Major mode to play sokoban.
+
+Commands:
+\\{sokoban-mode-map}"
+  (interactive)
+  (kill-all-local-variables)
+  (toggle-read-only 1)
+  (use-local-map sokoban-mode-map)
+  (make-local-variable 'font-lock-defaults)
+  (setq font-lock-defaults '(sokoban-font-lock-keywords
+                            t nil nil beginning-of-line))
+  (setq cursor-type nil)
+  (make-local-variable 'sokoban-level)
+  (make-local-variable 'sokoban-player-pos)
+  (make-local-variable 'sokoban-player-last-pos)
+  (make-local-variable 'sokoban-moves)
+  (make-local-variable 'sokoban-pits-list)
+  (make-local-variable 'sokoban-filled-pits)
+  (make-local-variable 'sokoban-game-info)
+  (setq major-mode 'sokoban-mode)
+  (setq mode-name "Sokoban")
+  (setq header-line-format
+       (list "Sokoban v" 'sokoban-version
+             " -- " 'sokoban-game-info))
+  (sokoban-init-level)
+  (run-hooks 'sokoban-mode-hook))
+
+;;;###autoload
+(defun sokoban ()
+  "Play sokoban."
+  (interactive)
+  (switch-to-buffer (generate-new-buffer "*Sokoban*"))
+  (sokoban-load-playerfile)
+  (setq sokoban-best-players-list nil)
+  (sokoban-gen-best-players-list)
+  (let ((level (or (cdr (assoc :level sokoban-player-stats))
+                  sokoban-start-level)))
+    (sokoban-load-level level)
+    (sokoban-mode)
+    (setq sokoban-level level))
+  (sokoban-init-level)
+  (sokoban-update-mode-line))
+
+(provide 'sokoban)
+;;; sokoban.el ends here
diff --git a/elpa/sokoban-1.4.6/ChangeLog b/elpa/sokoban-1.4.6/ChangeLog
deleted file mode 100644 (file)
index 43de58e..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-2017-09-08  Dieter Deyke  <dieter.deykeNOSPAMgmail.com>
-
-       * sokoban.el: Require at least emacs version 23.1 because of
-       load-user-emacs-file
-
-       Require at least emacs version 23.1 because of load-user-emacs-file
-       (thanks to Alex Dunn for this patch)
-
-       Unrelated additional changes:
-
-       - Mention key binding F for fit-frame-to-buffer in docstring
-
-2017-07-26  Dieter Deyke  <dieter.deykeNOSPAMgmail.com>
-
-       * sokoban.el: Add support for level data in xml format
-
-       Add support for level data in xml format as found on 
-       http://www.sourcecode.se/sokoban/levels
-
-       Unrelated additional changes:
-
-       - remove XEmacs-specific code
-
-       - add key binding 'F' to fit frame to buffer
-
-       - show the number of levels available in level file
-
-2017-07-18  Dieter Deyke  <dieter.deykeNOSPAMgmail.com>
-
-       * sokoban.el: Force sokoban-width to be at least 15 to accommodate score
-       display
-
-2017-07-17  Dieter Deyke  <dieter.deykeNOSPAMgmail.com>
-
-       * sokoban.el: Determine sokoban-width and sokoban-height dynamically
-
-       This avoids hard-coding sokoban-width and sokoban-height by scanning the
-       level file and finding the correct values dynamically.
-
-       Unrelated additional changes:
-
-       - remove unused variable 'sokoban-temp-buffer-name'
-
-       - change sokoban-next-level to use sokoban-goto-level in order to
-        range-check new level number
-
-       - change sokoban-goto-level to produce a more readable error message
-        when level is out of range
-
-2017-07-11  Dieter Deyke  <dieter.deykeNOSPAMgmail.com>
-
-       * packages/sokoban/sokoban.el: Change player and block color if on
-       target
-
-2017-07-08  Dieter Deyke  <dieter.deykeNOSPAMgmail.com>
-
-       Allow for player to start on a target, allow for wider and higher levels
-
-2017-07-08  Dieter Deyke  <dieter.deykeNOSPAMgmail.com>
-
-       Save sokoban-level when a level is completed, restore sokoban-level when
-       game is started
-
-2017-07-04  Stefan Monnier  <monnierNOSPAMiro.umontreal.ca>
-
-       * sokoban/sokoban.el (sokoban-draw-score): Fix off-by-one error
-
-       Reported by Dieter Deyke <dieter.deykeNOSPAMgmail.com>.
-
-2014-01-24  Stefan Monnier  <monnierNOSPAMiro.umontreal.ca>
-
-       * packages/sokoban/sokoban.el: Fix version.
-       * packages/sokoban/sokoban-pkg.el: Remove.
-
-2013-08-22  Stefan Monnier  <monnierNOSPAMiro.umontreal.ca>
-
-       Only keep the strictly necessary *-pkg.el files
-
-2013-03-28  Syohei YOSHIDA  <syohexNOSPAMgmail.com>
-
-       * sokoban.el (sokoban-init-level-data): Compatibility fix.
-
-2013-03-03  Stefan Monnier  <monnierNOSPAMiro.umontreal.ca>
-
-       * sokoban.el: Style tweaks.
-       (sokoban-level-file): Use load-file-name to find sokoban-levels.
-       (sokoban-init-level-data): Avoid messing with windows.  Use eobp and
-       dotimes.
-       (sokoban-display-options, sokoban-get-level-data, sokoban-init-buffer)
-       (sokoban-draw-score): Use dotimes.
-       (sokoban-add-move, sokoban-add-push): Use push.
-       (sokoban-goto-level): `signal' can't return.
-       (sokoban-mode): Use define-derived-mode.  Set vars locally.
-
-2013-03-02  Leo Liu  <sdl.webNOSPAMgmail.com>
-
-       Add sokoban game for emacs
-
diff --git a/elpa/sokoban-1.4.6/sokoban-autoloads.el b/elpa/sokoban-1.4.6/sokoban-autoloads.el
deleted file mode 100644 (file)
index f825eef..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-;;; sokoban-autoloads.el --- automatically extracted autoloads
-;;
-;;; Code:
-
-(add-to-list 'load-path (directory-file-name
-                         (or (file-name-directory #$) (car load-path))))
-
-\f
-;;;### (autoloads nil "sokoban" "sokoban.el" (0 0 0 0))
-;;; Generated autoloads from sokoban.el
-
-(autoload 'sokoban "sokoban" "\
-Sokoban.
-
-Push the blocks onto the target squares.
-
-sokoban-mode keybindings:
-   \\<sokoban-mode-map>
-\\[sokoban-start-game] Starts a new game of Sokoban
-\\[sokoban-restart-level]      Restarts the current level
-\\[sokoban-goto-level] Jumps to a specified level
-\\[fit-frame-to-buffer]        Fit frame to buffer
-\\[sokoban-move-left]  Move one square to the left
-\\[sokoban-move-right] Move one square to the right
-\\[sokoban-move-up]    Move one square up
-\\[sokoban-move-down]  Move one square down
-
-\(fn)" t nil)
-
-(define-key-after (lookup-key global-map [menu-bar tools games]) [sokoban] '(menu-item "Sokoban" sokoban) 'snake)
-
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "sokoban" '("sokoban-")))
-
-;;;***
-\f
-;;;### (autoloads nil nil ("sokoban-pkg.el") (0 0 0 0))
-
-;;;***
-\f
-;; Local Variables:
-;; version-control: never
-;; no-byte-compile: t
-;; no-update-autoloads: t
-;; coding: utf-8
-;; End:
-;;; sokoban-autoloads.el ends here
diff --git a/elpa/sokoban-1.4.6/sokoban-pkg.el b/elpa/sokoban-1.4.6/sokoban-pkg.el
deleted file mode 100644 (file)
index 91e0ac7..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-;; Generated package description from sokoban.el
-(define-package "sokoban" "1.4.6" "Implementation of Sokoban for Emacs." '((emacs "23.1")) :url "http://elpa.gnu.org/packages/sokoban.html" :keywords '("games"))
diff --git a/elpa/sokoban-1.4.6/sokoban.el b/elpa/sokoban-1.4.6/sokoban.el
deleted file mode 100644 (file)
index 4698450..0000000
+++ /dev/null
@@ -1,934 +0,0 @@
-;;; sokoban.el --- Implementation of Sokoban for Emacs.
-
-;; Copyright (C) 1998, 2013, 2017 Free Software Foundation, Inc.
-
-;; Author: Glynn Clements <glynn.clementsNOSPAMxemacs.org>
-;; Maintainer: Dieter Deyke <dieter.deykeNOSPAMgmail.com>
-;; Version: 1.4.6
-;; Package-Requires: ((emacs "23.1"))
-;; Created: 1997-09-11
-;; Keywords: games
-;; Package-Type: multi
-
-;; This file is part of XEmacs.
-
-;; XEmacs is free software; you can redistribute it and/or modify it
-;; under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3 of the License, or
-;; (at your option) any later version.
-
-;; XEmacs is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with XEmacs; see the file COPYING.  If not, write to the Free
-;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-;; 02111-1307, USA.
-
-;;; Synched up with: Not synched.
-
-;;; Commentary:
-
-;; Modified: 1998-01-09, conditionalised use of locate-data-directory
-;; Modified: 1998-01-27, added mouse interface code
-;;   (provided by Sean MacLennan <bn932NOSPAMfreenet.carleton.ca>
-;; Modified: 1998-02-06, fixed bug, where sokoban-done wasn't reset to
-;;   zero in sokoban-restart-level
-;; Modified: 1998-02-27, patches from Hrvoje Niksic
-;;   added bounds check to sokoban-goto-level
-;;   added popup menu
-;;   display level and score in modeline
-;; Modified: 1998-06-04, added `undo' feature
-;;   added number of blocks done/total to score and modeline
-;; Modified: 2003-06-14, update email address, remove URL
-
-;; The game is based upon XSokoban, by
-;; Michael Bischoff <mbiNOSPAMmo.math.nat.tu-bs.de>
-
-;; The levels and some of the pixmaps were
-;; taken directly from XSokoban
-
-;;; Code:
-
-(eval-when-compile
-  (require 'cl))
-
-(require 'gamegrid)
-(require 'xml)
-
-;; ;;;;;;;;;;;;; customization variables ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defvar sokoban-use-glyphs t
-  "Non-nil means use glyphs when available.")
-
-(defvar sokoban-use-color t
-  "Non-nil means use color when available.")
-
-(defvar sokoban-font "-*-courier-medium-r-*-*-*-200-100-75-*-*-iso8859-*"
-  "Name of the font used in X mode.")
-
-(defvar sokoban-buffer-name "*Sokoban*")
-
-(defvar sokoban-level-file
-  (if (fboundp 'locate-data-file)
-      (locate-data-file "sokoban.levels")
-    (or (locate-library "sokoban.levels")
-            (let ((file (expand-file-name
-                         "sokoban.levels"
-                         (if load-file-name
-                             (file-name-directory load-file-name)))))
-              (and (file-exists-p file) file))
-       (expand-file-name "sokoban.levels" data-directory))))
-
-(defvar sokoban-width)
-(defvar sokoban-height)
-
-(defvar sokoban-buffer-width)
-(defvar sokoban-buffer-height)
-
-(defvar sokoban-score-x)
-(defvar sokoban-score-y)
-
-(defvar sokoban-level-data nil)
-
-(defconst sokoban-state-filename (locate-user-emacs-file "sokoban-state"))
-
-;; ;;;;;;;;;;;;; constants ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defconst sokoban-floor-xpm "\
-/* XPM */
-static char * floor_xpm[] = {
-\"32 32 1 1\",
-\"  c None\",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-};
-")
-
-(defconst sokoban-target-xpm "\
-/* XPM */
-static char * target_xpm[] = {
-\"32 32 3 1\",
-\"  c None\",
-\". c black\",
-\"X c green\",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"          ............          \",
-\"          .XXXXXXXXXX.          \",
-\"           .XXXXXXXX.           \",
-\"            .XXXXXX.            \",
-\"      ..     .XXXX.     ..      \",
-\"      .X.     .XX.     .X.      \",
-\"      .XX.     ..     .XX.      \",
-\"      .XXX.          .XXX.      \",
-\"      .XXXX.        .XXXX.      \",
-\"      .XXXXX.      .XXXXX.      \",
-\"      .XXXXX.      .XXXXX.      \",
-\"      .XXXX.        .XXXX.      \",
-\"      .XXX.          .XXX.      \",
-\"      .XX.     ..     .XX.      \",
-\"      .X.     .XX.     .X.      \",
-\"      ..     .XXXX.     ..      \",
-\"            .XXXXXX.            \",
-\"           .XXXXXXXX.           \",
-\"          .XXXXXXXXXX.          \",
-\"          ............          \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-\"                                \",
-};
-")
-
-(defconst sokoban-wall-xpm "\
-/* XPM */
-static char * wall_xpm[] = {
-\"32 32 2 1\",
-\"  c white\",
-\". c SteelBlue\",
-\" .............................. \",
-\". ............................ .\",
-\".. .......................... . \",
-\"... ........................ . .\",
-\"....                        . . \",
-\".... ......................  . .\",
-\".... ...................... . . \",
-\".... ......................  . .\",
-\".... ...................... . . \",
-\".... ......................  . .\",
-\".... ...................... . . \",
-\".... ......................  . .\",
-\".... ...................... . . \",
-\".... ......................  . .\",
-\".... ...................... . . \",
-\".... ......................  . .\",
-\".... ...................... . . \",
-\".... ......................  . .\",
-\".... ...................... . . \",
-\".... ......................  . .\",
-\".... ...................... . . \",
-\".... ......................  . .\",
-\".... ...................... . . \",
-\".... ......................  . .\",
-\".... ...................... . . \",
-\".... ......................  . .\",
-\".... ...................... . . \",
-\"....                         . .\",
-\"... . . . . . . . . . . . .   . \",
-\".. . . . . . . . . . . . . .   .\",
-\". . . . . . . . . . . . . . .   \",
-\" . . . . . . . . . . . . . . .  \",
-};
-")
-
-(defconst sokoban-block-xpm "\
-/* XPM */
-static char * block_xpm[] = {
-\"32 32 3 1\",
-\"  c None\",
-\". c black\",
-\"X c yellow\",
-\".............................   \",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.   \",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX..  \",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX..  \",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. \",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. \",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".............................XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\" .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X.\",
-\" .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X.\",
-\"  .XXXXXXXXXXXXXXXXXXXXXXXXXXX..\",
-\"  .XXXXXXXXXXXXXXXXXXXXXXXXXXX..\",
-\"   .XXXXXXXXXXXXXXXXXXXXXXXXXXX.\",
-\"   .............................\",
-};
-")
-
-(defconst sokoban-block-on-target-xpm "\
-/* XPM */
-static char * block_on_target_xpm[] = {
-\"32 32 3 1\",
-\"  c None\",
-\". c black\",
-\"X c green\",
-\".............................   \",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.   \",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX..  \",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX..  \",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. \",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.X. \",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\".............................XX.\",
-\".XXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.\",
-\" .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X.\",
-\" .XXXXXXXXXXXXXXXXXXXXXXXXXXX.X.\",
-\"  .XXXXXXXXXXXXXXXXXXXXXXXXXXX..\",
-\"  .XXXXXXXXXXXXXXXXXXXXXXXXXXX..\",
-\"   .XXXXXXXXXXXXXXXXXXXXXXXXXXX.\",
-\"   .............................\",
-};
-")
-
-(defconst sokoban-player-xpm "\
-/* XPM */
-static char * player_xpm[] = {
-\"32 32 3 1\",
-\"  c None\",
-\"o c white\",
-\". c black\",
-\"                                \",
-\"                                \",
-\"                                \",
-\"            oooooooo            \",
-\"            o......o            \",
-\"           o.oooooo.o           \",
-\"           o.oooooo.o           \",
-\"          o.oooooooo.o          \",
-\"          o.o..oo..o.o          \",
-\"          o.oooooooo.o          \",
-\"          oo.o....o.oo          \",
-\"         oo..oo..oo..oo         \",
-\"         o....o..o....o         \",
-\"         o.o..o..o..o.o         \",
-\"         o.o...oo...o.o         \",
-\"        o.oo........oo.o        \",
-\"        o.oo........oo.o        \",
-\"       o.ooo........ooo.o       \",
-\"       o.ooo........ooo.o       \",
-\"       o.ooo........ooo.o       \",
-\"        o.oo........oo.o        \",
-\"        o.oo........oo.o        \",
-\"        o.o..........o.o        \",
-\"         o............o         \",
-\"          o..........o          \",
-\"           o........o           \",
-\"          o.o.oooo.o.o          \",
-\"         o.....oo.....o         \",
-\"        o......oo......o        \",
-\"       o.......oo.......o       \",
-\"      o..o..o..oo.oo..o..o      \",
-\"      oooooooooooooooooooo      \",
-};
-")
-
-(defconst sokoban-player-on-target-xpm "\
-/* XPM */
-static char * player_on_target_xpm[] = {
-\"32 32 4 1\",
-\"  c None\",
-\"o c white\",
-\". c black\",
-\"X c green\",
-\"                                \",
-\"                                \",
-\"                                \",
-\"            oooooooo            \",
-\"            o......o            \",
-\"           o.oooooo.o           \",
-\"          .o.oooooo.o.          \",
-\"          o.oooooooo.o          \",
-\"          o.o..oo..o.o          \",
-\"          o.oooooooo.o          \",
-\"      ..  oo.o....o.oo  ..      \",
-\"      .X.oo..oo..oo..oo.X.      \",
-\"      .XXo....o..o....oXX.      \",
-\"      .XXo.o..o..o..o.oXX.      \",
-\"      .XXo.o...oo...o.oXX.      \",
-\"      .Xo.oo........oo.oX.      \",
-\"      .Xo.oo........oo.oX.      \",
-\"      .o.ooo........ooo.o.      \",
-\"      .o.ooo........ooo.o.      \",
-\"      .o.ooo........ooo.o.      \",
-\"      .Xo.oo........oo.oX.      \",
-\"      ..o.oo........oo.o..      \",
-\"        o.o..........o.o        \",
-\"         o............o         \",
-\"          o..........o          \",
-\"          .o........o.          \",
-\"          o.o.oooo.o.o          \",
-\"         o.....oo.....o         \",
-\"        o......oo......o        \",
-\"       o.......oo.......o       \",
-\"      o..o..o..oo.oo..o..o      \",
-\"      oooooooooooooooooooo      \",
-};
-")
-
-(defconst sokoban-floor ?\&)
-;; note - space character in level file is also allowed to indicate floor
-(defconst sokoban-target ?\.)
-(defconst sokoban-wall ?\#)
-(defconst sokoban-block ?\$)
-(defconst sokoban-player ?\@)
-(defconst sokoban-block-on-target ?\*)
-(defconst sokoban-player-on-target ?\+)
-
-;; ;;;;;;;;;;;;; display options ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defvar sokoban-floor-options
-  `(((glyph
-      [xpm :data ,sokoban-floor-xpm])
-     (t ?\040))
-    ((color-x color-x)
-     (mono-x grid-x)
-     (color-tty color-tty))
-    (((glyph color-x) [0 0 0])
-     (color-tty "black"))))
-
-(defvar sokoban-target-options
-  `(((glyph
-      [xpm :data ,sokoban-target-xpm])
-     ((mono-x mono-tty emacs-tty) ?\.)
-     (t ?\040))
-    ((color-x color-x)
-     (mono-x grid-x)
-     (color-tty color-tty))
-    (((glyph color-x) [1 1 0.5])
-     (color-tty "yellow"))))
-
-(defvar sokoban-wall-options
-  `(((glyph
-      [xpm :data ,sokoban-wall-xpm])
-     (emacs-tty ?\X)
-     (t ?\040))
-    ((color-x color-x)
-     (mono-x mono-x)
-     (color-tty color-tty)
-     (mono-tty mono-tty))
-    (((glyph color-x) [0 0 1])
-     (color-tty "blue"))))
-
-(defvar sokoban-block-options
-  `(((glyph
-      [xpm :data ,sokoban-block-xpm])
-     ((mono-x mono-tty emacs-tty) ?\O)
-     (t ?\040))
-    ((color-x color-x)
-     (mono-x grid-x)
-     (color-tty color-tty))
-    (((glyph color-x) [1 0 0])
-     (color-tty "red"))))
-
-(defvar sokoban-block-on-target-options
-  `(((glyph
-      [xpm :data ,sokoban-block-on-target-xpm])
-     ((mono-x mono-tty emacs-tty) ?\O)
-     (t ?\040))
-    ((color-x color-x)
-     (mono-x grid-x)
-     (color-tty color-tty))
-    (((glyph color-x) [1 0 0])
-     (color-tty "red"))))
-
-(defvar sokoban-player-options
-  `(((glyph
-      [xpm :data ,sokoban-player-xpm])
-     (t ?\*))
-    ((color-x color-x)
-     (mono-x grid-x)
-     (color-tty color-tty))
-    (((glyph color-x) [0 1 0])
-     (color-tty "green"))))
-
-(defvar sokoban-player-on-target-options
-  `(((glyph
-      [xpm :data ,sokoban-player-on-target-xpm])
-     (t ?\*))
-    ((color-x color-x)
-     (mono-x grid-x)
-     (color-tty color-tty))
-    (((glyph color-x) [0 1 0])
-     (color-tty "green"))))
-
-;; ;;;;;;;;;;;;; variables ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defvar sokoban-level 0)
-(make-variable-buffer-local 'sokoban-level)
-(defvar sokoban-level-map nil)
-(make-variable-buffer-local 'sokoban-level-map)
-(defvar sokoban-targets 0)
-(make-variable-buffer-local 'sokoban-targets)
-(defvar sokoban-x 0)
-(make-variable-buffer-local 'sokoban-x)
-(defvar sokoban-y 0)
-(make-variable-buffer-local 'sokoban-y)
-(defvar sokoban-moves 0)
-(make-variable-buffer-local 'sokoban-moves)
-(defvar sokoban-pushes 0)
-(make-variable-buffer-local 'sokoban-pushes)
-(defvar sokoban-done 0)
-(make-variable-buffer-local 'sokoban-done)
-(defvar sokoban-mouse-x 0)
-(make-variable-buffer-local 'sokoban-mouse-x)
-(defvar sokoban-mouse-y 0)
-(make-variable-buffer-local 'sokoban-mouse-y)
-(defvar sokoban-undo-list nil)
-(make-variable-buffer-local 'sokoban-undo-list)
-
-;; ;;;;;;;;;;;;; keymaps ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defvar sokoban-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map "n"        'sokoban-start-game)
-    (define-key map "r"        'sokoban-restart-level)
-    (define-key map "g"        'sokoban-goto-level)
-    (define-key map "F"        'fit-frame-to-buffer)
-
-    (define-key map [left]     'sokoban-move-left)
-    (define-key map [right]    'sokoban-move-right)
-    (define-key map [up]       'sokoban-move-up)
-    (define-key map [down]     'sokoban-move-down)
-
-    (define-key map [down-mouse-2] 'sokoban-mouse-event-start)
-    (define-key map [mouse-2]      'sokoban-mouse-event-end)
-    ;; On some systems (OS X) middle mouse is difficult.
-    ;; FIXME: Use follow-link?
-    (define-key map [down-mouse-1] 'sokoban-mouse-event-start)
-    (define-key map [mouse-1]      'sokoban-mouse-event-end)
-
-    (define-key map [(control ?/)]     'sokoban-undo)
-    map))
-
-;; ;;;;;;;;;;;;;;;; level file parsing functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defconst sokoban-level-regexp "^;LEVEL [0-9]+$")
-
-(defconst sokoban-comment-regexp "^;")
-
-(defun sokoban-convert-xml-to-plain-text ()
-  (let ((n 0) (tree (xml-parse-region)))
-    (erase-buffer)
-    (dolist (SokobanLevels tree)
-      (dolist (LevelCollection (xml-get-children SokobanLevels 'LevelCollection))
-        (dolist (Level (xml-get-children LevelCollection 'Level))
-          (incf n)
-          (insert (format ";LEVEL %d\n" n))
-          (dolist (L (xml-get-children Level 'L))
-            (insert (car (xml-node-children L)))
-            (insert "\n"))))))
-  (goto-char (point-min)))
-
-(defun sokoban-init-level-data ()
-  (setq sokoban-level-data nil
-        sokoban-width 15 ; need at least 15 for score display
-        sokoban-height 1)
-  (with-temp-buffer
-    (insert-file-contents sokoban-level-file)
-    (goto-char (point-min))
-    (if (looking-at "<\\?xml version=")
-        (sokoban-convert-xml-to-plain-text))
-    (re-search-forward sokoban-level-regexp nil t)
-    (forward-char)
-    (let (r)
-      (while (not (eobp))
-        (while (looking-at sokoban-comment-regexp)
-         (forward-line))
-        (setq r 0)
-        (while (not (or (eobp)
-                       (looking-at sokoban-comment-regexp)))
-          (incf r)
-          (setq sokoban-height (max sokoban-height r)
-                sokoban-width (max sokoban-width (- (line-end-position) (line-beginning-position))))
-         (forward-line))))
-    (setq sokoban-buffer-width sokoban-width
-          sokoban-buffer-height (+ 4 sokoban-height)
-          sokoban-score-x 0
-          sokoban-score-y (1+ sokoban-height))
-
-    (goto-char (point-min))
-    (re-search-forward sokoban-level-regexp nil t)
-    (forward-char)
-    (while (not (eobp))
-      (while (looking-at sokoban-comment-regexp)
-        (forward-line))
-      (let ((data (make-vector sokoban-height nil))
-           (fmt (format "%%-%ds" sokoban-width)))
-        (dotimes (y sokoban-height)
-         (cond ((or (eobp)
-                    (looking-at sokoban-comment-regexp))
-                (aset data y (format fmt "")))
-               (t
-                (let ((start (point))
-                       (end (line-end-position)))
-                   (aset data
-                         y
-                         (format fmt (buffer-substring start end)))
-                   (goto-char (1+ end))))))
-        (push data sokoban-level-data)))
-    (kill-buffer (current-buffer))
-    (setq sokoban-level-data (nreverse sokoban-level-data))))
-
-;; ;;;;;;;;;;;;;;;; game functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defun sokoban-display-options ()
-  (let ((options (make-vector 256 nil)))
-    (dotimes (c 256)
-      (aset options c
-           (cond ((= c sokoban-floor)
-                  sokoban-floor-options)
-                  ((= c sokoban-target)
-                  sokoban-target-options)
-                  ((= c sokoban-wall)
-                  sokoban-wall-options)
-                  ((= c sokoban-block)
-                  sokoban-block-options)
-                  ((= c sokoban-block-on-target)
-                  sokoban-block-on-target-options)
-                  ((= c sokoban-player)
-                  sokoban-player-options)
-                  ((= c sokoban-player-on-target)
-                  sokoban-player-on-target-options)
-                  (t
-                  '(nil nil nil)))))
-    options))
-
-(defun sokoban-get-level-data ()
-  (setq sokoban-level-map (nth (1- sokoban-level) sokoban-level-data)
-       sokoban-targets 0)
-  (dotimes (y sokoban-height)
-    (dotimes (x sokoban-width)
-      (let ((c (aref (aref sokoban-level-map y) x)))
-       (cond
-        ((or (eq c sokoban-target)
-             (eq c sokoban-player-on-target))
-         (incf sokoban-targets))
-        ((eq c sokoban-block-on-target)
-         (incf sokoban-targets)
-         (incf sokoban-done))
-        ((= c ?\040) ;; treat space characters in level file as floor
-         (aset (aref sokoban-level-map y) x sokoban-floor)))))))
-
-(defun sokoban-init-buffer ()
-  (gamegrid-init-buffer sokoban-buffer-width
-                       sokoban-buffer-height
-                       ?\040)
-  (dotimes (y sokoban-height)
-    (dotimes (x sokoban-width)
-      (let ((c (aref (aref sokoban-level-map y) x)))
-       (if (or (eq c sokoban-player)
-               (eq c sokoban-player-on-target))
-           (setq sokoban-x x
-                 sokoban-y y))
-       (gamegrid-set-cell x y c)))))
-
-(defun sokoban-draw-score ()
-  (let ((y sokoban-score-y))
-    (dolist (string (list (format "Moves:  %05d" sokoban-moves)
-                         (format "Pushes: %05d" sokoban-pushes)
-                         (format "Done:   %d/%d"
-                                 sokoban-done
-                                 sokoban-targets)))
-      (let* ((len (length string)))
-        (dotimes (x len)
-         (gamegrid-set-cell (+ sokoban-score-x x)
-                            y (aref string x))))
-      (incf y)))
-  (setq mode-line-format
-       (format "Sokoban:   Level: %d/%d   Moves: %05d   Pushes: %05d   Done: %d/%d"
-               sokoban-level (length sokoban-level-data) sokoban-moves sokoban-pushes
-               sokoban-done sokoban-targets))
-  (force-mode-line-update))
-
-(defun sokoban-add-move (dx dy)
-  (push (list 'move dx dy) sokoban-undo-list)
-  (incf sokoban-moves)
-  (sokoban-draw-score))
-
-(defun sokoban-add-push (dx dy)
-  (push (list 'push dx dy) sokoban-undo-list)
-  (incf sokoban-moves)
-  (incf sokoban-pushes)
-  (sokoban-draw-score))
-
-(defun sokoban-targetp (x y)
-  (let ((c (aref (aref sokoban-level-map y) x)))
-    (or (eq c sokoban-target)
-       (eq c sokoban-block-on-target)
-       (eq c sokoban-player-on-target))))
-
-(defun sokoban-set-floor (x y)
-  (gamegrid-set-cell x y
-                     (if (sokoban-targetp x y)
-                         sokoban-target
-                       sokoban-floor)))
-
-(defun sokoban-set-player (x y)
-  (gamegrid-set-cell x y
-                     (if (sokoban-targetp x y)
-                         sokoban-player-on-target
-                       sokoban-player)))
-
-(defun sokoban-set-block (x y)
-  (gamegrid-set-cell x y
-                     (if (sokoban-targetp x y)
-                         sokoban-block-on-target
-                       sokoban-block)))
-
-(defun sokoban-undo ()
-  "Undo previous Sokoban change."
-  (interactive)
-  ;; FIXME: Use the normal undo (via `apply' undo entries).
-  (if (null sokoban-undo-list)
-      (message "Nothing to undo")
-    (let* ((entry (pop sokoban-undo-list))
-          (type (car entry))
-          (dx (nth 1 entry))
-          (dy (nth 2 entry)))
-      (cond ((eq type 'push)
-            (let* ((x (+ sokoban-x dx))
-                   (y (+ sokoban-y dy)))
-              (sokoban-set-floor x y)
-              (if (sokoban-targetp x y)
-                  (decf sokoban-done))
-              (sokoban-set-block sokoban-x sokoban-y)
-              (if (sokoban-targetp sokoban-x sokoban-y)
-                  (incf sokoban-done)))
-            (setq sokoban-x (- sokoban-x dx))
-            (setq sokoban-y (- sokoban-y dy))
-            (sokoban-set-player sokoban-x sokoban-y)
-            (decf sokoban-pushes)
-            (decf sokoban-moves))
-           ((eq type 'move)
-            (sokoban-set-floor sokoban-x sokoban-y)
-            (setq sokoban-x (- sokoban-x dx))
-            (setq sokoban-y (- sokoban-y dy))
-            (sokoban-set-player sokoban-x sokoban-y)
-            (decf sokoban-moves))
-           (t
-            (message "Invalid entry in sokoban-undo-list")))
-      (sokoban-draw-score))))
-
-(defun sokoban-move (dx dy)
-  (let* ((x (+ sokoban-x dx))
-        (y (+ sokoban-y dy))
-        (c (gamegrid-get-cell x y)))
-    (cond ((or (eq c sokoban-floor)
-              (eq c sokoban-target))
-           (sokoban-set-floor sokoban-x sokoban-y)
-          (setq sokoban-x x
-                sokoban-y y)
-           (sokoban-set-player sokoban-x sokoban-y)
-          (sokoban-add-move dx dy))
-         ((or (eq c sokoban-block)
-              (eq c sokoban-block-on-target))
-          (let* ((xx (+ x dx))
-                 (yy (+ y dy))
-                 (cc (gamegrid-get-cell xx yy)))
-            (cond ((or (eq cc sokoban-floor)
-                       (eq cc sokoban-target))
-                   (if (sokoban-targetp x y)
-                       (decf sokoban-done))
-                    (sokoban-set-block xx yy)
-                   (sokoban-set-player x y)
-                   (sokoban-set-floor sokoban-x sokoban-y)
-                   (setq sokoban-x x
-                         sokoban-y y)
-                   (if (sokoban-targetp xx yy)
-                       (incf sokoban-done))
-                   (sokoban-add-push dx dy)
-                   (cond ((= sokoban-done sokoban-targets)
-                           (let ((level sokoban-level))
-                             (with-temp-file sokoban-state-filename
-                               (print level (current-buffer))))
-                          (sit-for 3)
-                          (sokoban-next-level))))))))))
-
-(defun sokoban-event-x (event)
-  (let ((x (gamegrid-event-x event)))
-    ;; 32.0 is the pixel width of the xpm image
-    (floor x (/ 32.0 (frame-char-width)))))
-
-(defun sokoban-event-y (event)
-  (let ((y (gamegrid-event-y event)))
-    (floor y (/ 32.0 (frame-char-height)))))
-
-(defun sokoban-mouse-event-start (event)
-  "Record the beginning of a mouse click."
-  (interactive "e")
-  (setq sokoban-mouse-x (sokoban-event-x event))
-  (setq sokoban-mouse-y (sokoban-event-y event)))
-
-(defun sokoban-mouse-event-end (event)
-  "Move according to the clicked position."
-  (interactive "e")
-  (let* ((x (sokoban-event-x event))
-        (y (sokoban-event-y event))
-        (dx (- x sokoban-x))
-        (dy (- y sokoban-y)))
-    (cond
-     ;; Ensure that press and release are in the same square
-     ;; (which allows you to abort a move)
-     ((not (and (eq sokoban-mouse-x x) (eq sokoban-mouse-y y)))
-      nil)
-     ;; Check that the move isn't diagonal
-     ((not (or (eq dx 0) (eq dy 0)))
-      nil)
-     ((< dx 0) ;; Left
-      (while (< dx 0)
-       (sokoban-move -1 0)
-       (setq dx (1+ dx))))
-     ((> dx 0) ;; Right
-      (while (> dx 0)
-       (sokoban-move 1 0)
-       (setq dx (1- dx))))
-     ((> dy 0) ;; Up
-      (while (> dy 0)
-       (sokoban-move 0 1)
-       (setq dy (1- dy))))
-     ((< dy 0) ;; Down
-      (while (< dy 0)
-       (sokoban-move 0 -1)
-       (setq dy (1+ dy)))))))
-
-(defun sokoban-move-left ()
-  "Move one square left."
-  (interactive)
-  (sokoban-move -1 0))
-
-(defun sokoban-move-right ()
-  "Move one square right."
-  (interactive)
-  (sokoban-move 1 0))
-
-(defun sokoban-move-up ()
-  "Move one square up."
-  (interactive)
-  (sokoban-move 0 -1))
-
-(defun sokoban-move-down ()
-  "Move one square down."
-  (interactive)
-  (sokoban-move 0 1))
-
-(defun sokoban-restart-level ()
-  "Restart the current level."
-  (interactive)
-  (setq sokoban-moves 0
-       sokoban-pushes 0
-       sokoban-done 0
-       sokoban-undo-list nil)
-  (sokoban-get-level-data)
-  (sokoban-init-buffer)
-  (sokoban-draw-score))
-
-(defun sokoban-next-level ()
-  (sokoban-goto-level (1+ sokoban-level)))
-
-(defun sokoban-goto-level (level)
-  "Jump to a specified LEVEL."
-  (interactive "nLevel: ")
-  (when (or (< level 1)
-            (> level (length sokoban-level-data)))
-    (signal 'args-out-of-range
-            (list
-             (format "No such level number %d, should be 1..%d"
-                     level (length sokoban-level-data)))))
-  (setq sokoban-level level)
-  (sokoban-restart-level))
-
-(defun sokoban-start-game ()
-  "Start a new game of Sokoban."
-  (interactive)
-  (setq sokoban-level 0)
-  (sokoban-next-level))
-
-(put 'sokoban-mode 'mode-class 'special)
-
-(easy-menu-define sokoban-popup-menu nil "Popup menu for Sokoban mode."
-  '("Sokoban Commands"
-    ["Restart this level" sokoban-restart-level]
-    ["Start new game" sokoban-start-game]
-    ["Go to specific level" sokoban-goto-level]
-    ["Fit frame to buffer" fit-frame-to-buffer]))
-(define-key sokoban-mode-map [down-mouse-3] sokoban-popup-menu)
-
-(define-derived-mode sokoban-mode special-mode "Sokoban"
-  "A mode for playing Sokoban.
-
-sokoban-mode keybindings:
-   \\{sokoban-mode-map}"
-
-  (set (make-local-variable 'gamegrid-use-glyphs) sokoban-use-glyphs)
-  (set (make-local-variable 'gamegrid-use-color) sokoban-use-color)
-  (set (make-local-variable 'gamegrid-font) sokoban-font)
-
-  (gamegrid-init (sokoban-display-options))
-
-  (if (null sokoban-level-data)
-      (sokoban-init-level-data)))
-
-;;;###autoload
-(defun sokoban ()
-  "Sokoban.
-
-Push the blocks onto the target squares.
-
-sokoban-mode keybindings:
-   \\<sokoban-mode-map>
-\\[sokoban-start-game] Starts a new game of Sokoban
-\\[sokoban-restart-level]      Restarts the current level
-\\[sokoban-goto-level] Jumps to a specified level
-\\[fit-frame-to-buffer]        Fit frame to buffer
-\\[sokoban-move-left]  Move one square to the left
-\\[sokoban-move-right] Move one square to the right
-\\[sokoban-move-up]    Move one square up
-\\[sokoban-move-down]  Move one square down"
-  (interactive)
-
-  (switch-to-buffer sokoban-buffer-name)
-  (gamegrid-kill-timer)
-  (sokoban-mode)
-  (setq sokoban-level 0)
-  (if (file-exists-p sokoban-state-filename)
-    (setq sokoban-level
-          (with-temp-buffer
-            (insert-file-contents sokoban-state-filename)
-            (goto-char (point-min))
-            (read (current-buffer)))))
-  (sokoban-next-level))
-
-;;;###autoload
-(define-key-after                      ; install a menu entry
-  (lookup-key global-map [menu-bar tools games])
-  [sokoban]
-  '(menu-item "Sokoban" sokoban)
-  'snake)
-
-(provide 'sokoban)
-
-;;; sokoban.el ends here
diff --git a/elpa/sokoban-1.4.6/sokoban.levels b/elpa/sokoban-1.4.6/sokoban.levels
deleted file mode 100644 (file)
index 383146a..0000000
+++ /dev/null
@@ -1,1290 +0,0 @@
-;WALLS
-            12     f     f   ff      0   standard floor
-.           13     f     f   ff      4   target field
-#            0     0     0    0      0   walls
-
-;OBJECTS
-@            0       f       0    101   201    1     0 player
-$            1       f       0    100     0    2  1000 heavy box
-
-;MAXLEVEL 88
-;ATOP *$.
-;LEVEL 1
-    #####
-    #   #
-    #$  #
-  ###  $##
-  #  $ $ #
-### # ## #   ######
-#   # ## #####  ..#
-# $  $          ..#
-##### ### #@##  ..#
-    #     #########
-    #######
-;LEVEL 2
-############
-#..  #     ###
-#..  # $  $  #
-#..  #$####  #
-#..    @ ##  #
-#..  # #  $ ##
-###### ##$ $ #
-  # $  $ $ $ #
-  #    #     #
-  ############
-;LEVEL 3
-        ########
-        #     @#
-        # $#$ ##
-        # $  $#
-        ##$ $ #
-######### $ # ###
-#....  ## $  $  #
-##...    $  $   #
-#....  ##########
-########
-;LEVEL 4
-           ########
-           #  ....#
-############  ....#
-#    #  $ $   ....#
-# $$$#$  $ #  ....#
-#  $     $ #  ....#
-# $$ #$ $ $########
-#  $ #     #
-## #########
-#    #    ##
-#     $   ##
-#  $$#$$  @#
-#    #    ##
-###########
-;LEVEL 5
-        #####
-        #   #####
-        # #$##  #
-        #     $ #
-######### ###   #
-#....  ## $  $###
-#....    $ $$ ##
-#....  ##$  $ @#
-#########  $  ##
-        # $ $  #
-        ### ## #
-          #    #
-          ######
-;LEVEL 6
-######  ###
-#..  # ##@##
-#..  ###   #
-#..     $$ #
-#..  # # $ #
-#..### # $ #
-#### $ #$  #
-   #  $# $ #
-   # $  $  #
-   #  ##   #
-   #########
-;LEVEL 7
-       #####
- #######   ##
-## # @## $$ #
-#    $      #
-#  $  ###   #
-### #####$###
-# $  ### ..#
-# $ $ $ ...#
-#    ###...#
-# $$ # #...#
-#  ### #####
-####
-;LEVEL 8
-  ####
-  #  ###########
-  #    $   $ $ #
-  # $# $ #  $  #
-  #  $ $  #    #
-### $# #  #### #
-#@#$ $ $  ##   #
-#    $ #$#   # #
-#   $    $ $ $ #
-#####  #########
-  #      #
-  #      #
-  #......#
-  #......#
-  #......#
-  ########
-;LEVEL 9
-          #######
-          #  ...#
-      #####  ...#
-      #      . .#
-      #  ##  ...#
-      ## ##  ...#
-     ### ########
-     # $$$ ##
- #####  $ $ #####
-##   #$ $   #   #
-#@ $  $    $  $ #
-###### $$ $ #####
-     #      #
-     ########
-;LEVEL 10
- ###  #############
-##@####       #   #
-# $$   $$  $ $ ...#
-#  $$$#    $  #...#
-# $   # $$ $$ #...#
-###   #  $    #...#
-#     # $ $ $ #...#
-#    ###### ###...#
-## #  #  $ $  #...#
-#  ## # $$ $ $##..#
-# ..# #  $      #.#
-# ..# # $$$ $$$ #.#
-##### #       # #.#
-    # ######### #.#
-    #           #.#
-    ###############
-;LEVEL 11
-          ####
-     #### #  #
-   ### @###$ #
-  ##      $  #
- ##  $ $$## ##
- #  #$##     #
- # # $ $$ # ###
- #   $ #  # $ #####
-####    #  $$ #   #
-#### ## $         #
-#.    ###  ########
-#.. ..# ####
-#...#.#
-#.....#
-#######
-;LEVEL 12
-################
-#              #
-# # ######     #
-# #  $ $ $ $#  #
-# #   $@$   ## ##
-# #  $ $ $###...#
-# #   $ $  ##...#
-# ###$$$ $ ##...#
-#     # ## ##...#
-#####   ## ##...#
-    #####     ###
-        #     #
-        #######
-;LEVEL 13
-   #########
-  ##   ##  #####
-###     #  #    ###
-#  $ #$ #  #  ... #
-# # $#@$## # #.#. #
-#  # #$  #    . . #
-# $    $ # # #.#. #
-#   ##  ##$ $ . . #
-# $ #   #  #$#.#. #
-## $  $   $  $... #
- #$ ######    ##  #
- #  #    ##########
- ####
-;LEVEL 14
-       #######
- #######     #
- #     # $@$ #
- #$$ #   #########
- # ###......##   #
- #   $......## # #
- # ###......     #
-##   #### ### #$##
-#  #$   #  $  # #
-#  $ $$$  # $## #
-#   $ $ ###$$ # #
-#####     $   # #
-    ### ###   # #
-      #     #   #
-      ########  #
-             ####
-;LEVEL 15
-   ########
-   #   #  #
-   #  $   #
- ### #$   ####
- #  $  ##$   #
- #  # @ $ # $#
- #  #      $ ####
- ## ####$##     #
- # $#.....# #   #
- #  $..**. $# ###
-##  #.....#   #
-#   ### #######
-# $$  #  #
-#  #     #
-######   #
-     #####
-;LEVEL 16
-#####
-#   ##
-#    #  ####
-# $  ####  #
-#  $$ $   $#
-###@ #$    ##
- #  ##  $ $ ##
- # $  ## ## .#
- #  #$##$  #.#
- ###   $..##.#
-  #    #.*...#
-  # $$ #.....#
-  #  #########
-  #  #
-  ####
-;LEVEL 17
-   ##########
-   #..  #   #
-   #..      #
-   #..  #  ####
-  #######  #  ##
-  #            #
-  #  #  ##  #  #
-#### ##  #### ##
-#  $  ##### #  #
-# # $  $  # $  #
-# @$  $   #   ##
-#### ## #######
-   #    #
-   ######
-;LEVEL 18
-     ###########
-     #  .  #   #
-     # #.    @ #
- ##### ##..# ####
-##  # ..###     ###
-# $ #...   $ #  $ #
-#    .. ##  ## ## #
-####$##$# $ #   # #
-  ## #    #$ $$ # #
-  #  $ # #  # $## #
-  #               #
-  #  ###########  #
-  ####         ####
-;LEVEL 19
-  ######
-  #   @####
-##### $   #
-#   ##    ####
-# $ #  ##    #
-# $ #  ##### #
-## $  $    # #
-## $ $ ### # #
-## #  $  # # #
-## # #$#   # #
-## ###   # # ######
-#  $  #### # #....#
-#    $    $   ..#.#
-####$  $# $   ....#
-#       #  ## ....#
-###################
-;LEVEL 20
-    ##########
-#####        ####
-#     #   $  #@ #
-# #######$####  ###
-# #    ## #  #$ ..#
-# # $     #  #  #.#
-# # $  #     #$ ..#
-# #  ### ##     #.#
-# ###  #  #  #$ ..#
-# #    #  ####  #.#
-# #$   $  $  #$ ..#
-#    $ # $ $ #  #.#
-#### $###    #$ ..#
-   #    $$ ###....#
-   #      ## ######
-   ########
-;LEVEL 21
-#########
-#       #
-#       ####
-## #### #  #
-## #@##    #
-# $$$ $  $$#
-#  # ## $  #
-#  # ##  $ ####
-####  $$$ $#  #
- #   ##   ....#
- # #   # #.. .#
- #   # # ##...#
- ##### $  #...#
-     ##   #####
-      #####
-;LEVEL 22
-######     ####
-#    #######  #####
-#   $#  #  $  #   #
-#  $  $  $ # $ $  #
-##$ $   # @# $    #
-#  $ ########### ##
-# #   #.......# $#
-# ##  # ......#  #
-# #   $........$ #
-# # $ #.... ..#  #
-#  $ $####$#### $#
-# $   ### $   $  ##
-# $     $ $  $    #
-## ###### $ ##### #
-#         #       #
-###################
-;LEVEL 23
-    #######
-    #  #  ####
-##### $#$ #  ##
-#.. #  #  #   #
-#.. # $#$ #  $####
-#.  #     #$  #  #
-#..   $#  # $    #
-#..@#  #$ #$  #  #
-#.. # $#     $#  #
-#.. #  #$$#$  #  ##
-#.. # $#  #  $#$  #
-#.. #  #  #   #   #
-##. ####  #####   #
- ####  ####   #####
-;LEVEL 24
-###############
-#..........  .####
-#..........$$.#  #
-###########$ #   ##
-#      $  $     $ #
-## ####   #  $ #  #
-#      #   ##  # ##
-#  $#  # ##  ### ##
-# $ #$###    ### ##
-###  $ #  #  ### ##
-###    $ ## #  # ##
- # $  #  $  $ $   #
- #  $  $#$$$  #   #
- #  #  $      #####
- # @##  #  #  #
- ##############
-;LEVEL 25
-####
-#  ##############
-#  #   ..#......#
-#  # # ##### ...#
-##$#    ........#
-#   ##$######  ####
-# $ #     ######@ #
-##$ # $   ######  #
-#  $ #$$$##       #
-#      #    #$#$###
-# #### #$$$$$    #
-# #    $     #   #
-# #   ##        ###
-# ######$###### $ #
-#        #    #   #
-##########    #####
-;LEVEL 26
- #######
- #  #  #####
-##  #  #...###
-#  $#  #...  #
-# $ #$$ ...  #
-#  $#  #... .#
-#   # $########
-##$       $ $ #
-##  #  $$ #   #
- ######  ##$$@#
-      #      ##
-      ########
-;LEVEL 27
- #################
- #...   #    #   ##
-##.....  $## # #$ #
-#......#  $  #    #
-#......#  #  # #  #
-######### $  $ $  #
-  #     #$##$ ##$##
- ##   $    # $    #
- #  ## ### #  ##$ #
- # $ $$     $  $  #
- # $    $##$ ######
- #######  @ ##
-       ######
-;LEVEL 28
-         #####
-     #####   #
-    ## $  $  ####
-##### $  $ $ ##.#
-#       $$  ##..#
-#  ###### ###.. #
-## #  #    #... #
-# $   #    #... #
-#@ #$ ## ####...#
-####  $ $$  ##..#
-   ##  $ $  $...#
-    # $$  $ #  .#
-    #   $ $  ####
-    ######   #
-         #####
-;LEVEL 29
-#####
-#   ##
-# $  #########
-## # #       ######
-## #   $#$#@  #   #
-#  #      $ #   $ #
-#  ### ######### ##
-#  ## ..*..... # ##
-## ## *.*..*.* # ##
-# $########## ##$ #
-#  $   $  $    $  #
-#  #   #   #   #  #
-###################
-;LEVEL 30
-       ###########
-       #   #     #
-#####  #     $ $ #
-#   ##### $## # ##
-# $ ##   # ## $  #
-# $  @$$ # ##$$$ #
-## ###   # ##    #
-## #   ### #####$#
-## #     $  #....#
-#  ### ## $ #....##
-# $   $ #   #..$. #
-#  ## $ #  ##.... #
-#####   ######...##
-    #####    #####
-;LEVEL 31
-  ####
-  #  #########
- ##  ##  #   #
- #  $# $@$   ####
- #$  $  # $ $#  ##
-##  $## #$ $     #
-#  #  # #   $$$  #
-# $    $  $## ####
-# $ $ #$#  #  #
-##  ###  ###$ #
- #  #....     #
- ####......####
-   #....####
-   #...##
-   #...#
-   #####
-;LEVEL 32
-      ####
-  #####  #
- ##     $#
-## $  ## ###
-#@$ $ # $  #
-#### ##   $#
- #....#$ $ #
- #....#   $#
- #....  $$ ##
- #... # $   #
- ######$ $  #
-      #   ###
-      #$ ###
-      #  #
-      ####
-;LEVEL 33
-############
-##     ##  #
-##   $   $ #
-#### ## $$ #
-#   $ #    #
-# $$$ # ####
-#   # # $ ##
-#  #  #  $ #
-# $# $#    #
-#   ..# ####
-####.. $ #@#
-#.....# $# #
-##....#  $ #
-###..##    #
-############
-;LEVEL 34
- #########
- #....   ##
- #.#.#  $ ##
-##....# # @##
-# ....#  #  ##
-#     #$ ##$ #
-## ###  $    #
- #$  $ $ $#  #
- # #  $ $ ## #
- #  ###  ##  #
- #    ## ## ##
- #  $ #  $  #
- ###$ $   ###
-   #  #####
-   ####
-;LEVEL 35
-############ ######
-#   #    # ###....#
-#   $$#   @  .....#
-#   # ###   # ....#
-## ## ###  #  ....#
- # $ $     # # ####
- #  $ $##  #      #
-#### #  #### # ## #
-#  # #$   ## #    #
-# $  $  # ## #   ##
-# # $ $    # #   #
-#  $ ## ## # #####
-# $$     $$  #
-## ## ### $  #
- #    # #    #
- ###### ######
-;LEVEL 36
-            #####
-#####  ######   #
-#   ####  $ $ $ #
-# $   ## ## ##  ##
-#   $ $     $  $ #
-### $  ## ##     ##
-  # ##### #####$$ #
- ##$##### @##     #
- # $  ###$### $  ##
- # $  #   ###  ###
- # $$ $ #   $$ #
- #     #   ##  #
- #######.. .###
-    #.........#
-    #.........#
-    ###########
-;LEVEL 37
-###########
-#......   #########
-#......   #  ##   #
-#..### $    $     #
-#... $ $ #   ##   #
-#...#$#####    #  #
-###    #   #$  #$ #
-  #  $$ $ $  $##  #
-  #  $   #$#$ ##$ #
-  ### ## #    ##  #
-   #  $ $ ## ######
-   #    $  $  #
-   ##   # #   #
-    #####@#####
-        ###
-;LEVEL 38
-      ####
-####### @#
-#     $  #
-#   $## $#
-##$#...# #
- # $...  #
- # #. .# ##
- #   # #$ #
- #$  $    #
- #  #######
- ####
-;LEVEL 39
-             ######
- #############....#
-##   ##     ##....#
-#  $$##  $ @##....#
-#      $$ $#  ....#
-#  $ ## $$ # # ...#
-#  $ ## $  #  ....#
-## ##### ### ##.###
-##   $  $ ##   .  #
-# $###  # ##### ###
-#   $   #       #
-#  $ #$ $ $###  #
-# $$$# $   # ####
-#    #  $$ #
-######   ###
-     #####
-;LEVEL 40
-    ############
-    #          ##
-    #  # #$$ $  #
-    #$ #$#  ## @#
-   ## ## # $ # ##
-   #   $ #$  # #
-   #   # $   # #
-   ## $ $   ## #
-   #  #  ##  $ #
-   #    ## $$# #
-######$$   #   #
-#....#  ########
-#.#... ##
-#....   #
-#....   #
-#########
-;LEVEL 41
-           #####
-          ##   ##
-         ##     #
-        ##  $$  #
-       ## $$  $ #
-       # $    $ #
-####   #   $$ #####
-#  ######## ##    #
-#.            $$$@#
-#.# ####### ##   ##
-#.# #######. #$ $##
-#........... #    #
-##############  $ #
-             ##  ##
-              ####
-;LEVEL 42
-     ########
-  ####      ######
-  #    ## $ $   @#
-  # ## ##$#$ $ $##
-### ......#  $$ ##
-#   ......#  #   #
-# # ......#$  $  #
-# #$...... $$# $ #
-#   ### ###$  $ ##
-###  $  $  $  $ #
-  #  $  $  $  $ #
-  ######   ######
-       #####
-;LEVEL 43
-        #######
-    #####  #  ####
-    #   #   $    #
- #### #$$ ## ##  #
-##      # #  ## ###
-#  ### $#$  $  $  #
-#...    # ##  #   #
-#...#    @ # ### ##
-#...#  ###  $  $  #
-######## ##   #   #
-          #########
-;LEVEL 44
- #####
- #   #
- # # #######
- #      $@######
- # $ ##$ ###   #
- # #### $    $ #
- # ##### #  #$ ####
-##  #### ##$      #
-#  $#  $  # ## ## #
-#         # #...# #
-######  ###  ...  #
-     #### # #...# #
-          # ### # #
-          #       #
-          #########
-;LEVEL 45
-##### ####
-#...# #  ####
-#...###  $  #
-#....## $  $###
-##....##   $  #
-###... ## $ $ #
-# ##    #  $  #
-#  ## # ### ####
-# $ # #$  $    #
-#  $ @ $    $  #
-#   # $ $$ $ ###
-#  ######  ###
-# ##    ####
-###
-;LEVEL 46
-##########
-#        ####
-# ###### #  ##
-# # $ $ $  $ #
-#       #$   #
-###$  $$#  ###
-  #  ## # $##
-  ##$#   $ @#
-   #  $ $ ###
-   # #   $  #
-   # ##   # #
-  ##  ##### #
-  #         #
-  #.......###
-  #.......#
-  #########
-;LEVEL 47
-         ####
- #########  ##
-##  $      $ #####
-#   ## ##   ##...#
-# #$$ $ $$#$##...#
-# #   @   #   ...#
-#  $# ###$$   ...#
-# $  $$  $ ##....#
-###$       #######
-  #  #######
-  ####
-;LEVEL 48
-  #########
-  #*.*#*.*#
-  #.*.*.*.#
-  #*.*.*.*#
-  #.*.*.*.#
-  #*.*.*.*#
-  ###   ###
-    #   #
-###### ######
-#           #
-# $ $ $ $ $ #
-## $ $ $ $ ##
- #$ $ $ $ $#
- #   $@$   #
- #  #####  #
- ####   ####
-;LEVEL 49
-       ####
-       #  ##
-       #   ##
-       # $$ ##
-     ###$  $ ##
-  ####    $   #
-###  # #####  #
-#    # #....$ #
-# #   $ ....# #
-#  $ # #.*..# #
-###  #### ### #
-  #### @$  ##$##
-     ### $     #
-       #  ##   #
-       #########
-;LEVEL 50
-      ############
-     ##..    #   #
-    ##..* $    $ #
-   ##..*.# # # $##
-   #..*.# # # $  #
-####...#  #    # #
-#  ## #          #
-# @$ $ ###  #   ##
-# $   $   # #   #
-###$$   # # # # #
-  #   $   # # #####
-  # $# #####      #
-  #$   #   #    # #
-  #  ###   ##     #
-  #  #      #    ##
-  ####      ######
-;LEVEL 51
-#########
-#       #
-#  $   $#
-####    #
-   # $  ##
-####   $ #
-#.. $ ## ####
-#..  $##    #
-#..    $    #
-#.###$### #@#
-#.# #     ###
-### #######
-;LEVEL 52
-####################
-#  ##########     @#
-# $#    #     ######
-#      ####   #  ###
-#####         #  ###
-#   $         #  ###
-#  $####  #   #    #
-# # #  #..#$###  # #
-# # #$ #..#  $  $$ #
-#      #..#  #   # #
-#   #  #..#  #   # #
-####################
-;LEVEL 53
-####################
-#                ###
-# $#   $ ##  $    ##
-#    $###    # $$ ##
-#.###     $ $ ##  ##
-#...#  #  #    #$  #
-#..##$$#### $  #   #
-#...#      $ ##  ###
-#...$  ###  #    # #
-##..  $#  ##   ##@ #
-###.#              #
-####################
-;LEVEL 54
-####################
-#   #    #   #   #@#
-# $      $   $   # #
-## ###..## ###     #
-#   #....#$#  $### #
-# $ #....#  $  $ $ #
-#   #....# # # $ $ #
-#   ##..##   #$#   #
-##$##    ##  #  #$##
-#   $  $     #  #  #
-#   #    #   #     #
-####################
-;LEVEL 55
-####################
-#    @##      #   ##
-#    ##    $    $ ##
-#  ###....# # #  ###
-#   #....# # # $   #
-### #...#  #       #
-##  ##.#     $   $ #
-##  $ $ ###  # # ###
-## $       # # $   #
-#### $  $# # # # $ #
-####         # #  ##
-####################
-;LEVEL 56
-####################
-#  #  ##    #   @###
-##    $    # $###  #
-##$# $ ##$# $ $    #
-#   $#    $      ###
-# ##   $ ###  #....#
-# # $# # # # #....##
-#    $ $ #  #....###
-##$ ###  $ #....####
-#  # $        ######
-#      # #    ######
-####################
-;LEVEL 57
-####################
-#@     ###   #  #  #
-# # #  #  $  $     #
-#####     # $ $#$# #
-#.#..#    ##$ $    #
-#.....    $   #   ##
-#.....    ###$##$###
-#.#..#    $    #   #
-#####     #  #$  $ #
-#####  #  $    $ $ #
-#####  #  #  #  #  #
-####################
-;LEVEL 58
-####################
-##...   ## #    #  #
-#....         $ ## #
-#....# # #$###$    #
-#...#    #       # #
-##.#  #$ #     $## #
-#  #  # $ $ ###  $ #
-#     $  $ #  # ## #
-## # ## #$$# $#  # #
-#  #   $ $ #      ##
-#    #     #  #   @#
-####################
-;LEVEL 59
-####################
-#   #  #@# ##  #####
-# # #  $    $  #####
-# #    ###### $  ###
-#   #  #....#  $$  #
-##$##$##....#      #
-#      #....##$##$##
-#  $$  #....#      #
-# $  $  #  #  ###  #
-#####  $   $    $  #
-##### #    #  #   ##
-####################
-;LEVEL 60
-####################
-# #     #          #
-#       $  ## ### ##
-#####  ##   $  $   #
-##..##  # # $ # #  #
-#....  $     ##$# ##
-#....  $#####   #$##
-##..# #  #   #  $  #
-###.# #  $   $  # @#
-##  $  $ #   #  ####
-##       ###########
-####################
-;LEVEL 61
-####################
-#     ###..###     #
-# $$  ###..###  $@ #
-#  # ##......#  $  #
-#     #......#  $  #
-####  ###..######$ #
-#   $$$ #..#    #  #
-# $#   $  $  $$ #$ #
-#  #  ## $  ##  #  #
-# $    $ ## $    $ #
-#  #  ##    ##  #  #
-####################
-;LEVEL 62
-####################
-#    #  # #  #  #  #
-# @# # ## $   $   ##
-#### #    #  # $   #
-#    # ## #$ ## ## #
-#      $   $   $   #
-#..###$$## $##$ ## #
-#..#.#  # $   $ #  #
-#....# $$   ##$ ####
-#....#  #####      #
-#...###        ##  #
-####################
-;LEVEL 63
-####################
-#....#       #  #  #
-#....# # $  $      #
-#.... ##  $# # $#$ #
-#...#   $   $#  $  #
-#..####  # $   $$  #
-#      #### #### ###
-#        #   #     #
-# ##   #   $ # $ $ #
-# ##    $ ## $  $  #
-#     @#     #   # #
-####################
-;LEVEL 64
-####################
-#....###           #
-#....##### #  #$# ##
-#....###   #$  $   #
-#....###    $  #$$##
-##  #### $#  #$ $  #
-##  ####  $  $  #  #
-#@  ####$###$## $  #
-##        #  #  $  #
-##   ###  #  $  ####
-########  #  #     #
-####################
-;LEVEL 65
-####################
-#     #     @#...###
-#     #      ##...##
-# # # ##$## ## ....#
-#   $ #   $$$  ....#
-###$### $$  ### ##.#
-#     $  #    # ####
-#  $  #  ###  # #  #
-## #$##    $  $$   #
-#   $ ##   #  # #  #
-#     #    #  #    #
-####################
-;LEVEL 66
-####################
-#     #  #...#@    #
-# #       ....#    #
-#  $  #   #....#   #
-# ##$#### ##....#  #
-# $   $  #  #...#  #
-# $$ #   #   # $$  #
-###  $$$#   $$  $  #
-# $  #  #    # $#  #
-#   $#  #       $  #
-#  #    #    #  #  #
-####################
-;LEVEL 67
-####################
-#####@###.##...##  #
-#####$  ..#...#    #
-####    ......#  $ #
-###  $ #.....## # ##
-##  $$# #####  $ $ #
-## $# $    ##  $$  #
-##  #  #    # $  $ #
-##   $$ ### #$##   #
-## $#      $ $  $ ##
-###    #    #    ###
-####################
-;LEVEL 68
-####################
-#@     #   #       #
-## ### ##  #### # ##
-#    # #  $$       #
-#  # # # $ # $ ## ##
-#     $ #  #$$ #   #
-#  ###  #      ## ##
-#..#.# $ #  $ #    #
-#..#.#  $ # ## $$  #
-#....##   $$  $  # #
-#.....##        #  #
-####################
-;LEVEL 69
-####################
-#  #      #   #   ##
-# $# $ $ ##...$  $ #
-#  $  # ##....# $  #
-# ## $ ##....#   $ #
-# $    #....## $   #
-# $##  #...#       #
-#   $$$##$##  ### ##
-# # #  #   #  #    #
-# $ #  $  ##       #
-#    #    #@       #
-####################
-;LEVEL 70
-####################
-#  #  # #    #  #  #
-#   $      $ $     #
-## #  #$###$##  ## #
-#   $     $  #  $  #
-# ###$##$#   # $   #
-# #   $ $  ###### $#
-# $  $$ $  #@#.#...#
-# #     #  # #.#...#
-# ########## #.....#
-#            #.....#
-####################
-;LEVEL 71
-####################
-#  #     #  ##    ##
-# $#   $ #     ##  #
-# $  $  #..#     $ #
-# $ $  #....#   # ##
-# $#  #......### $ #
-#   #  #....#  #$  #
-# $  ####..#   #   #
-## $   ## # # $  $##
-### $    $#@$ $#   #
-####   #       #   #
-####################
-;LEVEL 72
-####################
-#      ....#    ####
-#      ....        #
-# # ##########     #
-# #$   #      ###..#
-#  $   #$$###   #..#
-# $ ### $   $   #..#
-# $ #   $ $ #  ##..#
-#  #  $$ # $ ##   ##
-#@## $#  $  $     ##
-##       ##   #  ###
-####################
-;LEVEL 73
-####################
-#        #   #@ #  #
-# $$  #$$# # #  ## #
-#  # $ $ #$$ #     #
-## #  #  # # #  #  #
-#   ##       #     #
-#   # $ #   #   #  #
-# $ #$ #   #  $ #..#
-##$ #  ####    #...#
-#  $          #....#
-#   #  #     #.....#
-####################
-;LEVEL 74
-####################
-#     #   #####    #
-## $  #   ####  $  #
-#### $$   #..#  #  #
-#  $  $  ##..#### ##
-# $   ###....   $$ #
-#  #$#   ....# # $ #
-# #  # $ ..###$#   #
-# #   $ #..#   ##  #
-#   $#  ####   # $##
-# #  #    @#      ##
-####################
-;LEVEL 75
-####################
-#   #   #    #   #@#
-#   $  $     # $ # #
-##$# $### #    $$# #
-#  #  #.###  #$ $  #
-#  #$#....#  # ### #
-# $  #.....##    # #
-##$  #.#....#$$ $  #
-#  ######..## #  # #
-#  $         $ ### #
-#   #   #        # #
-####################
-;LEVEL 76
-####################
-# # # #   #@##   # #
-#             $    #
-#  ##$# ##### $ # ##
-##    ##.....#  #  #
-##$##$#.....###$#$ #
-#   # ##.....#  # ##
-#  $    ##..##  #  #
-# $ #   $   $  $$$ #
-## $  $# #  #  $   #
-#   ##   #  #      #
-####################
-;LEVEL 77
-######  #####
-#    #  #   #
-# $  #### $ #
-# $      $  #
-#  ###@###$ #
-########## ###
-#..   ##     #
-#..   ##$    #
-#..   ## $   #
-#..   ## $   #
-#..     $ $  #
-###  #########
-  ####
-;LEVEL 78
-       ###########
-       #         #
-       #    $ $  #
-###### # $ ##### #
-#    ##### $  ##$#
-#       $ $      #
-#          ## ## #
-#    ##@##### ## #
-#    ####   # ## ##
-#....#      # $   #
-#....#      #     #
-######      #######
-;LEVEL 79
-#############
-#           #
-# ### $$    #
-#   # $  $  #
-#  $####$######
-# $ ##        #####
-#  $$ $        ...#
-### ## $$#     ...#
-  # ##   #     ...#
-  #      #     ...#
-  ###@#############
-    ###
-;LEVEL 80
-  #################
-###@##         ...#
-#    #         ...#
-# $  #         ...#
-# $$ #         ...#
-## $ ###$##########
- # ###  $ #
-##   $  $ #
-#  $ #  $ #
-# $  #    #
-#  $ #    #
-#    #    #
-###########
-;LEVEL 81
-              #####
-     ##########   #
-     #        #   #
-     #  $ $    $$ #
-     # ##### ## $ #
-     #$$   #$## $ #
-     # ### # ##$  #
-###### ### $ $    #
-#....        ##   #
-#....        ######
-#....        #
-###########@##
-          ###
-;LEVEL 82
-    ######
- ####    #
- #    ## #
- # $     #
-### #### ########
-#  $   $ ##  ...#
-#   $$ $$    ...#
-#    $  $##  ...#
-##@## ## ##  ...#
- ###  $  ########
- #   $$  #
- #    #  #
- #########
-;LEVEL 83
-####### #########
-#     # #   ##  #
-# ### # #   $   #
-# # $ ###   $   #
-#   $$      ##$ #
-#    ####   ##  #
-#@############ ##
-###..    #####$ #
-  #..    ####   #
-  #..       $$  #
-  #..    #### $ #
-  #..    #  #   #
-  ########  #####
-;LEVEL 84
-#######
-#     ##########
-#     #    #  ##
-# $   #   $ $  #
-#  $  #  $ ##  #
-# $$  ##$ $    #
-## #  ## #######
-## #  ##    ...#
-#  #$       ...#
-#   $$      ...#
-#     ##@#  ...#
-################
-;LEVEL 85
-############
-#      #   ##
-# $  $   #  ######
-####  #####      #
- #..  #     #### #
- #.####  ####    #
- #....    #  $ ####
- # ...#   # $$$#  ##
-###.#### ##  $@$   #
-#     ##### $ #    #
-# #.# $      $###$ #
-# #.########  #  $ #
-# #..        ##  $ #
-# # ####### $ # #  #
-#   #     #       ##
-#####     ##########
-;LEVEL 86
-;COMMENT Level 18, with one more box.
-;AUTHOR Michael Bischoff (mbiNOSPAMflawless.ts.rz.tu-bs.de)
-     ###########
-     #  .  #   #
-     # #.    @ #
- ##### ##..# ####
-##  #...###     ###
-# $ #...   $ #  $ #
-#    .. ##  ## ## #
-####$##$# $ #   # #
-  ## #    #$ $$ # #
-  #  $ #$#  # $## #
-  #               #
-  #  ###########  #
-  ####         ####
-;LEVEL 87
-;COMMENT ... and two more for level 22.
-;AUTHOR Michael Bischoff (mbiNOSPAMflawless.ts.rz.tu-bs.de)
-######     ####
-#    #######  #####
-#   $#  #  $  #   #
-#  $  $  $ # $ $  #
-##$ $   # @# $    #
-#  $ ########### ##
-# #   #.......# $#
-# ##  #.......#  #
-# #   *........$ #
-# # $ #.... ..#  #
-#  $ $####$#### $#
-# $ $ ### $   $  ##
-# $     $ $  $  $ #
-## ###### $ ##### #
-#         #       #
-###################
-;LEVEL 88
-;COMMENT One more for 35.
-;AUTHOR Michael Bischoff (mbiNOSPAMflawless.ts.rz.tu-bs.de)
-############ ######
-#   #    # ###....#
-#   $$#   @  .....#
-#   # ###   # ....#
-## ## ###  #  ....#
- # $ $     # #.####
- #  $ $##  #      #
-#### #  #### # ## #
-#  # #$   ## #    #
-# $  $  # ## #   ##
-# # $ $    # #   #
-#  $ ## ## # #####
-# $$     $$  #   #
-## ## ### $  $   #
- #    # #    #####
- ###### ######