From: Andreas Gerler Date: Tue, 13 Nov 2018 13:43:32 +0000 (+0100) Subject: update sokoban. X-Git-Url: http://git.bundesbrandschatzamt.de/?a=commitdiff_plain;h=7486e05e65eb20a47c41006ce1aba9b1a96feb3b;p=emacsconfig.git update sokoban. Signed-off-by: Andreas Gerler --- diff --git a/elpa/sokoban-1.23/sokoban-autoloads.el b/elpa/sokoban-1.23/sokoban-autoloads.el new file mode 100644 index 00000000..fc3746d0 --- /dev/null +++ b/elpa/sokoban-1.23/sokoban-autoloads.el @@ -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)))) + + +;;;### (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-"))) + +;;;*** + +;; 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 index 00000000..ccf61839 --- /dev/null +++ b/elpa/sokoban-1.23/sokoban-pkg.el @@ -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 index 00000000..a0fa9c82 --- /dev/null +++ b/elpa/sokoban-1.23/sokoban.el @@ -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 +;; 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 index 43de58eb..00000000 --- a/elpa/sokoban-1.4.6/ChangeLog +++ /dev/null @@ -1,98 +0,0 @@ -2017-09-08 Dieter Deyke - - * 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 - - * 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 - - * sokoban.el: Force sokoban-width to be at least 15 to accommodate score - display - -2017-07-17 Dieter Deyke - - * 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 - - * packages/sokoban/sokoban.el: Change player and block color if on - target - -2017-07-08 Dieter Deyke - - Allow for player to start on a target, allow for wider and higher levels - -2017-07-08 Dieter Deyke - - Save sokoban-level when a level is completed, restore sokoban-level when - game is started - -2017-07-04 Stefan Monnier - - * sokoban/sokoban.el (sokoban-draw-score): Fix off-by-one error - - Reported by Dieter Deyke . - -2014-01-24 Stefan Monnier - - * packages/sokoban/sokoban.el: Fix version. - * packages/sokoban/sokoban-pkg.el: Remove. - -2013-08-22 Stefan Monnier - - Only keep the strictly necessary *-pkg.el files - -2013-03-28 Syohei YOSHIDA - - * sokoban.el (sokoban-init-level-data): Compatibility fix. - -2013-03-03 Stefan Monnier - - * 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 - - 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 index f825eef6..00000000 --- a/elpa/sokoban-1.4.6/sokoban-autoloads.el +++ /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)))) - - -;;;### (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-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-"))) - -;;;*** - -;;;### (autoloads nil nil ("sokoban-pkg.el") (0 0 0 0)) - -;;;*** - -;; 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 index 91e0ac70..00000000 --- a/elpa/sokoban-1.4.6/sokoban-pkg.el +++ /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 index 46984509..00000000 --- a/elpa/sokoban-1.4.6/sokoban.el +++ /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 -;; Maintainer: Dieter Deyke -;; 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 -;; 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 - -;; 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-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 index 383146aa..00000000 --- a/elpa/sokoban-1.4.6/sokoban.levels +++ /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 (mbi@flawless.ts.rz.tu-bs.de) - ########### - # . # # - # #. @ # - ##### ##..# #### -## #...### ### -# $ #... $ # $ # -# .. ## ## ## # -####$##$# $ # # # - ## # #$ $$ # # - # $ #$# # $## # - # # - # ########### # - #### #### -;LEVEL 87 -;COMMENT ... and two more for level 22. -;AUTHOR Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de) -###### #### -# ####### ##### -# $# # $ # # -# $ $ $ # $ $ # -##$ $ # @# $ # -# $ ########### ## -# # #.......# $# -# ## #.......# # -# # *........$ # -# # $ #.... ..# # -# $ $####$#### $# -# $ $ ### $ $ ## -# $ $ $ $ $ # -## ###### $ ##### # -# # # -################### -;LEVEL 88 -;COMMENT One more for 35. -;AUTHOR Michael Bischoff (mbi@flawless.ts.rz.tu-bs.de) -############ ###### -# # # ###....# -# $$# @ .....# -# # ### # ....# -## ## ### # ....# - # $ $ # #.#### - # $ $## # # -#### # #### # ## # -# # #$ ## # # -# $ $ # ## # ## -# # $ $ # # # -# $ ## ## # ##### -# $$ $$ # # -## ## ### $ $ # - # # # ##### - ###### ######