all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* bug#36867: 26.2; gamegrid-add-scrore miss lower-is-better flag
@ 2019-07-31  0:13 Rolf Ade
  2019-09-03 22:29 ` Federico Tedin
  0 siblings, 1 reply; 3+ messages in thread
From: Rolf Ade @ 2019-07-31  0:13 UTC (permalink / raw)
  To: 36867


The function gamegrid-add-scrore is handy for games developer; they get
a high-score management system with one call. That includes a threshold
for the number of entries in the high-score file.

A consequence of that is, that an entry has be removed from the list if
a new, better one must be inserted. In this situation,
gamegrid-add-scrore currently always removes the "lowest" result.

This is good and well for "more is better" games. But is wrong for
"faster is better" games. An example:
https://github.com/calancha/Minesweeper

This feature omission is on lisp level. The in the emacs sources
included tool update-game-score (which is used by gamegrid, if it is
available) support reverse opperation.





^ permalink raw reply	[flat|nested] 3+ messages in thread

* bug#36867: 26.2; gamegrid-add-scrore miss lower-is-better flag
  2019-07-31  0:13 bug#36867: 26.2; gamegrid-add-scrore miss lower-is-better flag Rolf Ade
@ 2019-09-03 22:29 ` Federico Tedin
  2019-09-14  8:23   ` Eli Zaretskii
  0 siblings, 1 reply; 3+ messages in thread
From: Federico Tedin @ 2019-09-03 22:29 UTC (permalink / raw)
  To: Rolf Ade; +Cc: 36867

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

Rolf Ade <rolf@pointsman.de> writes:

> The function gamegrid-add-scrore is handy for games developer; they get
> a high-score management system with one call. That includes a threshold
> for the number of entries in the high-score file.
>
> A consequence of that is, that an entry has be removed from the list if
> a new, better one must be inserted. In this situation,
> gamegrid-add-scrore currently always removes the "lowest" result.
>
> This is good and well for "more is better" games. But is wrong for
> "faster is better" games. An example:
> https://github.com/calancha/Minesweeper
>
> This feature omission is on lisp level. The in the emacs sources
> included tool update-game-score (which is used by gamegrid, if it is
> available) support reverse opperation.

I've added a new 'reverse' parameter to gamegrid-add-score that allows
switching between storing the scores normally, or in reverse order. As
Rolf mentioned, this feature was already implemented in
update-game-score. I'm attaching a patch with my changes.

- Fede


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: patch --]
[-- Type: text/x-diff, Size: 6550 bytes --]

From d866bf870ad8e9dc6147728f12cfc796d75dfbc0 Mon Sep 17 00:00:00 2001
From: Federico Tedin <federicotedin@gmail.com>
Date: Wed, 4 Sep 2019 00:18:11 +0200
Subject: [PATCH 1/1] Allow gamegrid-add-score to treat lower scores as better.

* lisp/play/gamegrid.el (gamegrid-add-score): Add 'reverse' parameter.
(gamegrid-add-score-with-update-game-score): Add 'reverse' parameter.
(gamegrid-add-score-with-update-game-score-1): Add 'reverse'
parameter. Pass on "-r" argument to update-game-score.
(gamegrid-add-score-insecure): Add 'reverse' parameter, reverse scores
when it's non-nil.
* etc/NEWS: Announce the change.
---
 etc/NEWS              |  3 +++
 lisp/play/gamegrid.el | 49 ++++++++++++++++++++++++-------------------
 2 files changed, 30 insertions(+), 22 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index d5130e9f3c..05b02e8653 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1370,6 +1370,9 @@ the Elisp manual for documentation of the new mode and its commands.
 dimensions, instead of always using 16 pixels.  As a result, Tetris,
 Snake and Pong are more playable on HiDPI displays.
 
+*** 'gamegrid-add-score' can now sort scores from lower to higher.
+This is useful for games where lower scores are better, like time-based games.
+
 ** Filecache
 
 ---
diff --git a/lisp/play/gamegrid.el b/lisp/play/gamegrid.el
index be09a73a1f..df9b135248 100644
--- a/lisp/play/gamegrid.el
+++ b/lisp/play/gamegrid.el
@@ -505,9 +505,12 @@ gamegrid-kill-timer
 
 ;; ;;;;;;;;;;;;;;; high score functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(defun gamegrid-add-score (file score)
+(defun gamegrid-add-score (file score &optional reverse)
   "Add the current score to the high score file.
 
+If REVERSE is non-nil, treat lower scores as better than higher
+scores. This is useful for games where lower scores are better.
+
 On POSIX systems there may be a shared game directory for all users in
 which the scorefiles are kept.  On such systems Emacs doesn't create
 the score file FILE in this directory, if it doesn't already exist.
@@ -525,9 +528,9 @@ gamegrid-add-score
 FILE is created there."
   (pcase system-type
     ((or 'ms-dos 'windows-nt)
-     (gamegrid-add-score-insecure file score))
+     (gamegrid-add-score-insecure file score reverse))
     (_
-     (gamegrid-add-score-with-update-game-score file score))))
+     (gamegrid-add-score-with-update-game-score file score reverse))))
 
 
 ;; On POSIX systems there are four cases to distinguish:
@@ -556,20 +559,21 @@ gamegrid-add-score
 
 (defvar gamegrid-shared-game-dir)
 
-(defun gamegrid-add-score-with-update-game-score (file score)
+(defun gamegrid-add-score-with-update-game-score (file score &optional reverse)
   (let* ((update-game-score-modes
 	  (file-modes (expand-file-name "update-game-score" exec-directory)))
 	 (gamegrid-shared-game-dir
 	  (not (zerop (logand #o6000 (or update-game-score-modes 0))))))
     (cond ((or (not update-game-score-modes) (file-name-absolute-p file))
 	   (gamegrid-add-score-insecure file score
-                                        gamegrid-user-score-file-directory))
+                                        gamegrid-user-score-file-directory
+                                        reverse))
 	  ((and gamegrid-shared-game-dir
 		(file-exists-p (expand-file-name file shared-game-score-directory)))
 	   ;; Use the setgid (or setuid) "update-game-score" program
 	   ;; to update a system-wide score file.
 	   (gamegrid-add-score-with-update-game-score-1 file
-	    (expand-file-name file shared-game-score-directory) score))
+	    (expand-file-name file shared-game-score-directory) score reverse))
 	  ;; Else: Add the score to a score file in the user's home
 	  ;; directory.
 	  (gamegrid-shared-game-dir
@@ -579,7 +583,8 @@ gamegrid-add-score-with-update-game-score
 		    (directory-file-name gamegrid-user-score-file-directory))
 	     (make-directory gamegrid-user-score-file-directory t))
 	   (gamegrid-add-score-insecure file score
-					gamegrid-user-score-file-directory))
+					gamegrid-user-score-file-directory
+                                        reverse))
 	  (t
 	   (unless (file-exists-p
 		    (directory-file-name gamegrid-user-score-file-directory))
@@ -588,9 +593,9 @@ gamegrid-add-score-with-update-game-score
 				      gamegrid-user-score-file-directory)))
 	     (unless (file-exists-p f)
 	       (write-region "" nil f nil 'silent nil 'excl))
-	     (gamegrid-add-score-with-update-game-score-1 file f score))))))
+	     (gamegrid-add-score-with-update-game-score-1 file f score reverse))))))
 
-(defun gamegrid-add-score-with-update-game-score-1 (file target score)
+(defun gamegrid-add-score-with-update-game-score-1 (file target score &optional reverse)
   (let ((default-directory "/")
 	(errbuf (generate-new-buffer " *update-game-score loss*"))
         (marker-string (concat
@@ -601,17 +606,16 @@ gamegrid-add-score-with-update-game-score-1
     (with-local-quit
       (apply
        'call-process
-       (append
-	(list
-	 (expand-file-name "update-game-score" exec-directory)
-	 nil errbuf nil
-	 "-m" (int-to-string gamegrid-score-file-length)
-	 "-d" (if gamegrid-shared-game-dir
-		  (expand-file-name shared-game-score-directory)
-		(file-name-directory target))
-	 file
-	 (int-to-string score)
-	 marker-string))))
+       `(,(expand-file-name "update-game-score" exec-directory)
+         nil ,errbuf nil
+         "-m" ,(int-to-string gamegrid-score-file-length)
+         "-d" ,(if gamegrid-shared-game-dir
+                   (expand-file-name shared-game-score-directory)
+                 (file-name-directory target))
+         ,@(if reverse '("-r"))
+         ,file
+         ,(int-to-string score)
+         ,marker-string)))
     (if (buffer-modified-p errbuf)
 	(progn
 	  (display-buffer errbuf)
@@ -632,7 +636,7 @@ gamegrid-add-score-with-update-game-score-1
 				marker-string) nil t)
         (beginning-of-line)))))
 
-(defun gamegrid-add-score-insecure (file score &optional directory)
+(defun gamegrid-add-score-insecure (file score &optional directory reverse)
   (save-excursion
     (setq file (expand-file-name file (or directory
 					  temporary-file-directory)))
@@ -645,7 +649,8 @@ gamegrid-add-score-insecure
 		    (user-full-name)
 		    user-mail-address))
     (sort-fields 1 (point-min) (point-max))
-    (reverse-region (point-min) (point-max))
+    (unless reverse
+      (reverse-region (point-min) (point-max)))
     (goto-char (point-min))
     (forward-line gamegrid-score-file-length)
     (delete-region (point) (point-max))
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* bug#36867: 26.2; gamegrid-add-scrore miss lower-is-better flag
  2019-09-03 22:29 ` Federico Tedin
@ 2019-09-14  8:23   ` Eli Zaretskii
  0 siblings, 0 replies; 3+ messages in thread
From: Eli Zaretskii @ 2019-09-14  8:23 UTC (permalink / raw)
  To: Federico Tedin; +Cc: rolf, 36867-done

> From: Federico Tedin <federicotedin@gmail.com>
> Date: Wed, 04 Sep 2019 00:29:22 +0200
> Cc: 36867@debbugs.gnu.org
> 
> Rolf Ade <rolf@pointsman.de> writes:
> 
> > The function gamegrid-add-scrore is handy for games developer; they get
> > a high-score management system with one call. That includes a threshold
> > for the number of entries in the high-score file.
> >
> > A consequence of that is, that an entry has be removed from the list if
> > a new, better one must be inserted. In this situation,
> > gamegrid-add-scrore currently always removes the "lowest" result.
> >
> > This is good and well for "more is better" games. But is wrong for
> > "faster is better" games. An example:
> > https://github.com/calancha/Minesweeper
> >
> > This feature omission is on lisp level. The in the emacs sources
> > included tool update-game-score (which is used by gamegrid, if it is
> > available) support reverse opperation.
> 
> I've added a new 'reverse' parameter to gamegrid-add-score that allows
> switching between storing the scores normally, or in reverse order. As
> Rolf mentioned, this feature was already implemented in
> update-game-score. I'm attaching a patch with my changes.

Thanks, pushed to the master branch.

In the future, please mark NEWS entries with "---" if they don't need
to be described in the manuals, and with "+++" if the patch includes
the changes for the manuals.  (I did this for you this time.)





^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-09-14  8:23 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-07-31  0:13 bug#36867: 26.2; gamegrid-add-scrore miss lower-is-better flag Rolf Ade
2019-09-03 22:29 ` Federico Tedin
2019-09-14  8:23   ` Eli Zaretskii

Code repositories for project(s) associated with this external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.