]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow gamegrid-add-score to treat lower scores as better.
authorFederico Tedin <federicotedin@gmail.com>
Tue, 3 Sep 2019 22:18:11 +0000 (00:18 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sat, 14 Sep 2019 08:20:32 +0000 (11:20 +0300)
* 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.  (Bug#36867)

* etc/NEWS: Announce the change.

etc/NEWS
lisp/play/gamegrid.el

index 1bde9c442b779711df6e64a41ec47152940c8d50..d3338bf57d4c35cc9040d33445ce364a18bf51da 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1375,6 +1375,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
 
 ---
index be09a73a1f17fc046e098eb6f9f01ab818df5176..df9b1352480940adc4b21dfc37470c7f2ea72e29 100644 (file)
@@ -505,9 +505,12 @@ format."
 
 ;; ;;;;;;;;;;;;;;; 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 @@ specified by the variable `temporary-file-directory'.  If necessary,
 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 @@ FILE is created there."
 
 (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 @@ FILE is created there."
                    (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 @@ FILE is created there."
                                      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 @@ FILE is created there."
     (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 @@ FILE is created there."
                                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 @@ FILE is created there."
                    (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))