From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Federico Tedin Newsgroups: gmane.emacs.bugs Subject: bug#36867: 26.2; gamegrid-add-scrore miss lower-is-better flag Date: Wed, 04 Sep 2019 00:29:22 +0200 Message-ID: <8736hdf1z1.fsf@gmail.com> References: <87a7cvukm9.fsf@pointsman.de> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="119322"; mail-complaints-to="usenet@blaine.gmane.org" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.2 (gnu/linux) Cc: 36867@debbugs.gnu.org To: Rolf Ade Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Wed Sep 04 00:30:16 2019 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1i5HJX-000UtY-Db for geb-bug-gnu-emacs@m.gmane.org; Wed, 04 Sep 2019 00:30:16 +0200 Original-Received: from localhost ([::1]:52172 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5HJV-0003YQ-TK for geb-bug-gnu-emacs@m.gmane.org; Tue, 03 Sep 2019 18:30:13 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:41852) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5HJM-0003Y3-D9 for bug-gnu-emacs@gnu.org; Tue, 03 Sep 2019 18:30:06 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i5HJK-0005Dw-IZ for bug-gnu-emacs@gnu.org; Tue, 03 Sep 2019 18:30:04 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:51834) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1i5HJK-0005Dk-CV for bug-gnu-emacs@gnu.org; Tue, 03 Sep 2019 18:30:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1i5HJK-00041l-15 for bug-gnu-emacs@gnu.org; Tue, 03 Sep 2019 18:30:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Federico Tedin Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 03 Sep 2019 22:30:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 36867 X-GNU-PR-Package: emacs Original-Received: via spool by 36867-submit@debbugs.gnu.org id=B36867.156754977415428 (code B ref 36867); Tue, 03 Sep 2019 22:30:01 +0000 Original-Received: (at 36867) by debbugs.gnu.org; 3 Sep 2019 22:29:34 +0000 Original-Received: from localhost ([127.0.0.1]:60655 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1i5HIr-00040m-Jy for submit@debbugs.gnu.org; Tue, 03 Sep 2019 18:29:34 -0400 Original-Received: from mail-wr1-f41.google.com ([209.85.221.41]:42664) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1i5HIp-00040W-6L for 36867@debbugs.gnu.org; Tue, 03 Sep 2019 18:29:31 -0400 Original-Received: by mail-wr1-f41.google.com with SMTP id b16so19085456wrq.9 for <36867@debbugs.gnu.org>; Tue, 03 Sep 2019 15:29:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=C5jg+YvG4prQqSM3UKw6VAYgYSQPSx888wr3UHTANeA=; b=PCmOzCVJ7q+Jv0McaS4D1tG/a4yQuR6BgpYRg4iXk8ntYkfvMM61N7qrxRVONOiUiL i5iocw2Ai03PlQUY54DG7A7cD9+ECUtxAKjvhJhDar6fIR7atJNPsjQ84/Ki6Nz0YiBv KolxBRI8FdaQxPVXpsVBKZxqX9oadH2BAYB/9nAv+9yG+UFScCB3BNHrZk5AwEcsFCa1 n0amGH9t0j4Sxap0oxTb9PJmyeSA07M7ctELNu8Uj0ijdbW8S4kAt78gSsLaFoQRp8RB wNQty7q9OQWtPCHg4hog83QC12Ru+KF5dVUYDEu/plSFswL8gVPbHEIX4ZMHPIRLC4oa WHZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=C5jg+YvG4prQqSM3UKw6VAYgYSQPSx888wr3UHTANeA=; b=CwiViVHHuO7oQH2KsTMJwi0ZeD9WMvR9FMznM0cYxSugPizlGnZ+5MRG7wE1AIphdt pqp6GV1vHCkNwIUIzAEKOfVnwLinf8MSu1Y4uW3zQAzLJ58tLcp23AkmC/dyTFkDi/hS gjmsm1mRw6iOxKVIvq3Y+CTiQ9gCLtclSDcGQRtYO5n/onU/0otI5YwemsmwQpRzAio7 Tnb4J4vi4rWukSfEHAWe7dHiv/cPnSY/8NFMVerMWD7ykKx/tHSZ09UKFCVlar0tZ/Sa myIKOBxSM9aNrhav9ab+UvzXvElwVcU/WrAlPssD1gMJQpltdUYmGQCb+zwYptIs8+1j N1gQ== X-Gm-Message-State: APjAAAUa1TTmqGchF2DRUaWhY+fYGuXZYnSvu13fntCSCJo3SmzPnDeA 4XvJtd6ce/Q8zELNCrmxYnQZiotj X-Google-Smtp-Source: APXvYqxaXCwaYP2T7AbwN62hX63oecSWhsZAk8ULbDfgUW/wQdyfajc6OGX8Rbc7OqnjxJ0HTA+fZg== X-Received: by 2002:adf:e3ce:: with SMTP id k14mr42709975wrm.303.1567549764648; Tue, 03 Sep 2019 15:29:24 -0700 (PDT) Original-Received: from lead (dslb-188-103-110-026.188.103.pools.vodafone-ip.de. [188.103.110.26]) by smtp.gmail.com with ESMTPSA id s1sm65995059wrg.80.2019.09.03.15.29.23 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 03 Sep 2019 15:29:23 -0700 (PDT) In-Reply-To: <87a7cvukm9.fsf@pointsman.de> (Rolf Ade's message of "Wed, 31 Jul 2019 02:13:18 +0200") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.51.188.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:166181 Archived-At: --=-=-= Content-Type: text/plain Rolf Ade 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 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=gamegrid.patch Content-Description: patch >From d866bf870ad8e9dc6147728f12cfc796d75dfbc0 Mon Sep 17 00:00:00 2001 From: Federico Tedin 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 --=-=-=--