unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [ELPA] Patches for sokoban 1.4
@ 2017-05-27 10:58 Dieter Deyke
  0 siblings, 0 replies; only message in thread
From: Dieter Deyke @ 2017-05-27 10:58 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 721 bytes --]

Hi,

while I was playing sokoban from ELPA, I had the need for some local
patches:

1) fix off-by-1 error in sokoban-draw-score which caused on-screen score
   to be truncated

2) save sokoban-level when a level is completed, restore sokoban-level
   when a game is started

This allowed me to continue the game on the next day without me having
to remember what level I was on.

Eventually I finished all levels and looked on the net for new level
files. Having found some required:

3) allow for levels which are wider and higher, and for levels where the
   player character would already be on a target field at start

These 3 patches are attached to this mail. If they are useful, someone
could apply them to ELPA.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-fix-off-by-1-error-in-sokoban-draw-score-which-cause.patch --]
[-- Type: text/x-diff, Size: 1511 bytes --]

From 96ca5427cd2b950008a55bb5586702d40f5c078e Mon Sep 17 00:00:00 2001
From: Dieter Deyke <dieter.deyke@gmail.com>
Date: Thu, 25 May 2017 13:27:08 +0200
Subject: [PATCH] fix off-by-1 error in sokoban-draw-score which caused
 on-screen score to be truncated

---
 packages/sokoban/sokoban.el | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/packages/sokoban/sokoban.el b/packages/sokoban/sokoban.el
index 6e8bee25c..ae6f845cf 100644
--- a/packages/sokoban/sokoban.el
+++ b/packages/sokoban/sokoban.el
@@ -1,9 +1,9 @@
 ;;; sokoban.el --- Implementation of Sokoban for Emacs.
 
-;; Copyright (C) 1998, 2013 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 2013, 2017 Free Software Foundation, Inc.
 
 ;; Author: Glynn Clements <glynn.clements@xemacs.org>
-;; Version: 1.4
+;; Version: 1.4.1
 ;; Created: 1997-09-11
 ;; Keywords: games
 ;; Package-Type: multi
@@ -41,6 +41,8 @@
 ;; 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
+;; Modified: 2017-05-25, fix off-by-1 error in sokoban-draw-score which
+;;   caused on-screen score to be truncated
 
 ;; Tested with XEmacs 20.3/4/5 and Emacs 19.34
 
@@ -517,7 +519,7 @@ static char * player_xpm[] = {
 			 (format "Done:   %d/%d"
 				 sokoban-done
 				 sokoban-targets))))
-    (dotimes (y 2)
+    (dotimes (y 3)
       (let* ((string (aref strings y))
 	     (len (length string)))
 	(dotimes (x len)
-- 
2.11.0


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-save-sokoban-level-when-a-level-is-completed-restore.patch --]
[-- Type: text/x-diff, Size: 2308 bytes --]

From 4caa9c202fd67fdd3e31448dfd47973efafcaa66 Mon Sep 17 00:00:00 2001
From: Dieter Deyke <dieter.deyke@gmail.com>
Date: Sat, 27 May 2017 10:45:38 +0200
Subject: [PATCH] save sokoban-level when a level is completed, restore
 sokoban-level when game is started

---
 packages/sokoban/sokoban.el | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/packages/sokoban/sokoban.el b/packages/sokoban/sokoban.el
index ae6f845cf..3575d2818 100644
--- a/packages/sokoban/sokoban.el
+++ b/packages/sokoban/sokoban.el
@@ -3,7 +3,7 @@
 ;; Copyright (C) 1998, 2013, 2017 Free Software Foundation, Inc.
 
 ;; Author: Glynn Clements <glynn.clements@xemacs.org>
-;; Version: 1.4.1
+;; Version: 1.4.2
 ;; Created: 1997-09-11
 ;; Keywords: games
 ;; Package-Type: multi
@@ -43,6 +43,8 @@
 ;; Modified: 2003-06-14, update email address, remove URL
 ;; Modified: 2017-05-25, fix off-by-1 error in sokoban-draw-score which
 ;;   caused on-screen score to be truncated
+;; Modified: 2017-05-27, save sokoban-level when a level is completed,
+;;   restore sokoban-level when game is started
 
 ;; Tested with XEmacs 20.3/4/5 and Emacs 19.34
 
@@ -96,6 +98,8 @@
 
 (defvar sokoban-level-data nil)
 
+(defconst sokoban-state-filename (locate-user-emacs-file "sokoban-state"))
+
 ;; ;;;;;;;;;;;;; constants ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (defconst sokoban-floor-xpm "\
@@ -616,6 +620,9 @@ static char * player_xpm[] = {
 			(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))))))))))
 
@@ -774,7 +781,14 @@ sokoban-mode keybindings:
   (switch-to-buffer sokoban-buffer-name)
   (gamegrid-kill-timer)
   (sokoban-mode)
-  (sokoban-start-game))
+  (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
 (unless (featurep 'xemacs)
-- 
2.11.0


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #4: 0003-allow-for-player-to-start-on-a-target-allow-for-wide.patch --]
[-- Type: text/x-diff, Size: 3164 bytes --]

From ab2c9cfaed47c56ed213e1efbbde6fe9bae5a86e Mon Sep 17 00:00:00 2001
From: Dieter Deyke <dieter.deyke@gmail.com>
Date: Sat, 27 May 2017 12:43:34 +0200
Subject: [PATCH] allow for player to start on a target, allow for wider and
 higher levels

---
 packages/sokoban/sokoban.el | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/packages/sokoban/sokoban.el b/packages/sokoban/sokoban.el
index 3575d2818..d59de952c 100644
--- a/packages/sokoban/sokoban.el
+++ b/packages/sokoban/sokoban.el
@@ -3,7 +3,7 @@
 ;; Copyright (C) 1998, 2013, 2017 Free Software Foundation, Inc.
 
 ;; Author: Glynn Clements <glynn.clements@xemacs.org>
-;; Version: 1.4.2
+;; Version: 1.4.3
 ;; Created: 1997-09-11
 ;; Keywords: games
 ;; Package-Type: multi
@@ -45,6 +45,8 @@
 ;;   caused on-screen score to be truncated
 ;; Modified: 2017-05-27, save sokoban-level when a level is completed,
 ;;   restore sokoban-level when game is started
+;; Modified: 2017-05-27, allow for player to start on a target,
+;;   allow for wider and higher levels
 
 ;; Tested with XEmacs 20.3/4/5 and Emacs 19.34
 
@@ -87,14 +89,14 @@
               (and (file-exists-p file) file))
 	(expand-file-name "sokoban.levels" data-directory))))
 
-(defvar sokoban-width 20)
-(defvar sokoban-height 16)
+(defvar sokoban-width 27)
+(defvar sokoban-height 20)
 
-(defvar sokoban-buffer-width 20)
-(defvar sokoban-buffer-height 20)
+(defvar sokoban-buffer-width sokoban-width)
+(defvar sokoban-buffer-height (+ 4 sokoban-height))
 
 (defvar sokoban-score-x 0)
-(defvar sokoban-score-y 17)
+(defvar sokoban-score-y (+ 1 sokoban-height))
 
 (defvar sokoban-level-data nil)
 
@@ -309,13 +311,14 @@ static char * player_xpm[] = {
 };
 ")
 
-(defconst sokoban-floor ?\+)
+(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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
@@ -488,7 +491,8 @@ static char * player_xpm[] = {
     (dotimes (x sokoban-width)
       (let ((c (aref (aref sokoban-level-map y) x)))
 	(cond
-	 ((= c sokoban-target)
+	 ((or (= c sokoban-target)
+	      (= c sokoban-player-on-target))
 	  (incf sokoban-targets))
 	 ((= c sokoban-block-on-target)
 	  (incf sokoban-targets)
@@ -499,7 +503,8 @@ static char * player_xpm[] = {
 (defun sokoban-get-floor (x y)
   (let ((c (aref (aref sokoban-level-map y) x)))
     (if (or (= c sokoban-target)
-	    (= c sokoban-block-on-target))
+	    (= c sokoban-block-on-target)
+	    (= c sokoban-player-on-target))
 	sokoban-target
       sokoban-floor)))
 
@@ -513,6 +518,10 @@ static char * player_xpm[] = {
 	(if (= c sokoban-player)
 	    (setq sokoban-x x
 		  sokoban-y y))
+	(if (= c sokoban-player-on-target)
+	    (setq sokoban-x x
+                  sokoban-y y
+                  c sokoban-player))
 	(if (= c sokoban-block-on-target)
 	    (setq c sokoban-block))
 	(gamegrid-set-cell x y c)))))
-- 
2.11.0


[-- Attachment #5: Type: text/plain, Size: 118 bytes --]


-- 
Dieter Deyke
mailto:dieter.deyke@gmail.com
Get my Gnupg key:
gpg --keyserver keys.gnupg.net --recv-keys B116EA20

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2017-05-27 10:58 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-05-27 10:58 [ELPA] Patches for sokoban 1.4 Dieter Deyke

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).