[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/sokoban 90b9c6b 16/17: * sokoban/sokoban.el: Add save/l
From: |
Stefan Monnier |
Subject: |
[elpa] externals/sokoban 90b9c6b 16/17: * sokoban/sokoban.el: Add save/load capability |
Date: |
Tue, 1 Dec 2020 17:17:31 -0500 (EST) |
branch: externals/sokoban
commit 90b9c6b9d893f541cf5b3911ab1357553178dbae
Author: Dieter Deyke <dieter.deyke@gmail.com>
Commit: Dieter Deyke <dieter.deyke@gmail.com>
* sokoban/sokoban.el: Add save/load capability
---
sokoban.el | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 52 insertions(+), 2 deletions(-)
diff --git a/sokoban.el b/sokoban.el
index 57aab47..128d59a 100644
--- a/sokoban.el
+++ b/sokoban.el
@@ -4,7 +4,7 @@
;; Author: Glynn Clements <glynn.clements@xemacs.org>
;; Maintainer: Dieter Deyke <dieter.deyke@gmail.com>
-;; Version: 1.4.7
+;; Version: 1.4.8
;; Comment: While we set lexical-binding, it currently doesn't make use
;; of closures, which is why it can still work in Emacs-23.1.
;; Package-Requires: ((emacs "23.1") (cl-lib "0.5"))
@@ -509,6 +509,8 @@ static char * player_on_target_xpm[] = {
(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 "s" 'sokoban-save)
+ (define-key map "l" 'sokoban-load)
(define-key map [left] 'sokoban-move-left)
(define-key map [right] 'sokoban-move-right)
@@ -868,12 +870,58 @@ static char * player_on_target_xpm[] = {
(setq sokoban-level 0)
(sokoban-next-level))
+(defvar sokoban-grid-state)
+
+(defconst sokoban-state-variables '(
+ sokoban-level
+ sokoban-level-map
+ sokoban-targets
+ sokoban-x
+ sokoban-y
+ sokoban-moves
+ sokoban-pushes
+ sokoban-done
+ sokoban-undo-list
+ sokoban-grid-state
+ ))
+(defun sokoban-save (filename)
+ "Save current Sokoban state."
+ (interactive "FSave file: ")
+ (let ((buf (current-buffer)))
+ (setq sokoban-grid-state nil)
+ (dotimes (y sokoban-height)
+ (dotimes (x sokoban-width)
+ (push (gamegrid-get-cell x y) sokoban-grid-state)))
+ (setq sokoban-grid-state (reverse sokoban-grid-state))
+ (with-temp-file filename
+ (dolist (var sokoban-state-variables)
+ (print
+ (with-current-buffer buf (eval var))
+ (current-buffer))))))
+
+(defun sokoban-load (filename)
+ "Restore saved Sokoban state."
+ (interactive "fLoad file: ")
+ (let ((buf (current-buffer)))
+ (with-temp-buffer
+ (insert-file-contents filename)
+ (goto-char (point-min))
+ (dolist (var sokoban-state-variables)
+ (let ((value (read (current-buffer))))
+ (with-current-buffer buf (set var value))))))
+ (dotimes (y sokoban-height)
+ (dotimes (x sokoban-width)
+ (gamegrid-set-cell x y (pop sokoban-grid-state))))
+ (sokoban-draw-score))
+
(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]))
+ ["Fit frame to buffer" fit-frame-to-buffer]
+ ["Save current state" sokoban-save]
+ ["Restore saved state" sokoban-load]))
(define-key sokoban-mode-map [down-mouse-3] sokoban-popup-menu)
(define-derived-mode sokoban-mode special-mode "Sokoban"
@@ -903,6 +951,8 @@ sokoban-mode keybindings:
\\[sokoban-restart-level] Restarts the current level
\\[sokoban-goto-level] Jumps to a specified level
\\[fit-frame-to-buffer] Fit frame to buffer
+\\[sokoban-save] Save current state
+\\[sokoban-load] Restore saved state
\\[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
- [elpa] branch externals/sokoban created (now e217508), Stefan Monnier, 2020/12/01
- [elpa] externals/sokoban f52e1bf 03/17: * sokoban.el (sokoban-init-level-data): Compatibility fix., Stefan Monnier, 2020/12/01
- [elpa] externals/sokoban 1754aaa 02/17: * sokoban.el: Style tweaks., Stefan Monnier, 2020/12/01
- [elpa] externals/sokoban c5ed120 04/17: Only keep the strictly necessary *-pkg.el files, Stefan Monnier, 2020/12/01
- [elpa] externals/sokoban d9f58b0 11/17: * sokoban.el: Force sokoban-width to be at least 15 to accommodate score display, Stefan Monnier, 2020/12/01
- [elpa] externals/sokoban e217508 17/17: * .gitignore: New file, Stefan Monnier, 2020/12/01
- [elpa] externals/sokoban 90b9c6b 16/17: * sokoban/sokoban.el: Add save/load capability,
Stefan Monnier <=
- [elpa] externals/sokoban e54bbfa 07/17: Save sokoban-level when a level is completed, restore sokoban-level when game is started, Stefan Monnier, 2020/12/01
- [elpa] externals/sokoban 1c53ebe 14/17: * sokoban.el: Switch to lexical-binding, Stefan Monnier, 2020/12/01
- [elpa] externals/sokoban 926ab8d 09/17: * packages/sokoban/sokoban.el: Change player and block color if on target, Stefan Monnier, 2020/12/01
- [elpa] externals/sokoban 44f9b39 12/17: * sokoban.el: Add support for level data in xml format, Stefan Monnier, 2020/12/01
- [elpa] externals/sokoban b51c816 15/17: * sokoban/sokoban.el: Use cl-lib, Stefan Monnier, 2020/12/01
- [elpa] externals/sokoban ae777cf 05/17: * packages/sokoban/sokoban.el: Fix version., Stefan Monnier, 2020/12/01
- [elpa] externals/sokoban 5c609d7 10/17: * sokoban.el: Determine sokoban-width and sokoban-height dynamically, Stefan Monnier, 2020/12/01
- [elpa] externals/sokoban f882802 01/17: Add sokoban game for emacs, Stefan Monnier, 2020/12/01
- [elpa] externals/sokoban e920b6a 08/17: Allow for player to start on a target, allow for wider and higher levels, Stefan Monnier, 2020/12/01
- [elpa] externals/sokoban 4a93859 13/17: * sokoban.el: Require at least emacs version 23.1 because of load-user-emacs-file, Stefan Monnier, 2020/12/01