emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/pacmacs 144a973d83 203/472: Merge branch 'slow-object-look


From: ELPA Syncer
Subject: [nongnu] elpa/pacmacs 144a973d83 203/472: Merge branch 'slow-object-look-up-126'. Close #126
Date: Thu, 6 Jan 2022 21:59:24 -0500 (EST)

branch: elpa/pacmacs
commit 144a973d83a10df6329d793f29a7d55995f59109
Merge: b03ee65528 cede2ffb48
Author: rexim <reximkut@gmail.com>
Commit: rexim <reximkut@gmail.com>

    Merge branch 'slow-object-look-up-126'. Close #126
---
 pacmacs-board.el     |  27 +++++---
 pacmacs.el           | 191 ++++++++++++++++++++++++++-------------------------
 test/pacmacs-test.el |   6 +-
 3 files changed, 121 insertions(+), 103 deletions(-)

diff --git a/pacmacs-board.el b/pacmacs-board.el
index f00c47b2d0..18e8814bb1 100644
--- a/pacmacs-board.el
+++ b/pacmacs-board.el
@@ -32,6 +32,8 @@
 
 ;;; Code:
 
+(require 'dash)
+(require 'dash-functional)
 (require 'pacmacs-utils)
 
 (defun pacmacs--make-board (width height)
@@ -63,14 +65,23 @@
   (plist-bind ((width :width)
                (height :height))
       board
-    (member (cons (mod row height)
-                  (mod column width))
-            (mapcar #'(lambda (object)
-                        (plist-bind ((row :row)
-                                     (column :column))
-                            object
-                          (cons row column)))
-                    objects))))
+    (let ((wrapped-row (mod row height))
+          (wrapped-column (mod column width)))
+      (-find (-lambda (object)
+               (plist-bind ((object-row :row)
+                            (object-column :column))
+                   object
+                 (and (= object-row wrapped-row)
+                      (= object-column wrapped-column))))
+             objects))))
+
+(defun pacmacs--object-type-at-p (board row column type)
+  (let ((cell (pacmacs--cell-wrapped-get board row column)))
+    (-find (-lambda (game-object)
+             (plist-bind ((object-type :type))
+                 game-object
+               (equal object-type type)))
+           cell)))
 
 (defun pacmacs--step-point (board row column direction)
   (plist-bind ((width :width)
diff --git a/pacmacs.el b/pacmacs.el
index 312f7f5aa1..2dee7a0ee2 100644
--- a/pacmacs.el
+++ b/pacmacs.el
@@ -53,17 +53,14 @@
 
 (defvar pacmacs-timer nil)
 
-(defvar pacmacs-board-width 10)
-(defvar pacmacs-board-height 10)
 (defvar pacmacs-score 0)
 
-(defvar pacmacs-player-state nil)
-
+(defvar pacmacs--player-state nil)
 (defvar pacmacs--ghosts nil)
-(defvar pacmacs-wall-cells nil)
-(defvar pacmacs-pills nil)
+(defvar pacmacs--wall-cells nil)
+(defvar pacmacs--pills nil)
 
-(defvar pacmacs--render-board nil)
+(defvar pacmacs--object-board nil)
 (defvar pacmacs--track-board nil)
 
 (defvar pacmacs-play-pause nil)
@@ -112,7 +109,7 @@
     (setq pacmacs-timer nil)))
 
 (defun pacmacs--load-current-level ()
-  (pacmacs-load-map (aref pacmacs-levels
+  (pacmacs--load-map (aref pacmacs-levels
                           pacmacs-current-level)))
 
 (defun pacmacs--load-next-level ()
@@ -125,12 +122,14 @@
   (list :current-animation (pacmacs-make-anim (list (pacmacs-make-frame '(0 0 
40 40) 100))
                                               (pacmacs-create-color-block 40 
40 "red"))
         :row row
-        :column column))
+        :column column
+        :type 'wall))
 
 (defun pacmacs--make-pill (row column)
   (list :current-animation (pacmacs-load-anim "Pill")
         :row row
-        :column column))
+        :column column
+        :type 'pill))
 
 (defun pacmacs--make-ghost (row column)
   (list :row row
@@ -146,7 +145,8 @@
                                     'up    (pacmacs-load-anim "Red-Ghost-Up")
                                     'down  (pacmacs-load-anim 
"Red-Ghost-Down"))
         :speed 1
-        :speed-counter 0))
+        :speed-counter 0
+        :type 'ghost))
 
 (defun pacmacs--make-player (row column)
   (list :row row
@@ -162,21 +162,26 @@
                                     'up    (pacmacs-load-anim 
"Pacman-Chomping-Up")
                                     'down  (pacmacs-load-anim 
"Pacman-Chomping-Down"))
         :speed 0
-        :speed-counter 0))
+        :speed-counter 0
+        :type 'player))
 
 (defun pacmacs--reset-object-position (game-object)
   (plist-bind ((init-row :init-row)
                (init-column :init-column))
       game-object
+    (pacmacs--remove-object game-object)
     (plist-put game-object :row init-row)
-    (plist-put game-object :column init-column)))
+    (plist-put game-object :column init-column)
+    (pacmacs--put-object game-object)))
 
 (defun pacmacs--step-back-object (game-object)
   (plist-bind ((prev-row :prev-row)
                (prev-column :prev-column))
       game-object
+    (pacmacs--remove-object game-object)
     (plist-put game-object :row prev-row)
-    (plist-put game-object :column prev-column)))
+    (plist-put game-object :column prev-column)
+    (pacmacs--put-object game-object)))
 
 (defun pacmacs--kill-buffer-and-its-window (buffer-or-name)
   (let ((buffer-window (get-buffer-window buffer-or-name)))
@@ -187,24 +192,16 @@
       (kill-buffer buffer-or-name))))
 
 (defun pacmacs--wall-at-p (row column)
-  (pacmacs--object-at-p pacmacs--render-board
-                        row column
-                        pacmacs-wall-cells))
+  (pacmacs--object-type-at-p pacmacs--object-board
+                             row column 'wall))
 
 (defun pacmacs--pill-at-p (row column)
-  (pacmacs--object-at-p pacmacs--render-board
-                        row column
-                        pacmacs-pills))
+  (pacmacs--object-type-at-p pacmacs--object-board
+                             row column 'pill))
 
 (defun pacmacs--ghost-at-p (row column)
-  (pacmacs--object-at-p pacmacs--render-board
-                        row column
-                        pacmacs--ghosts))
-
-(defun pacmacs-quit ()
-  (interactive)
-  (when (get-buffer pacmacs-buffer-name)
-    (pacmacs--kill-buffer-and-its-window pacmacs-buffer-name)))
+  (pacmacs--object-type-at-p pacmacs--object-board
+                             row column 'ghost))
 
 (defun pacmacs--cell-tracked-p (row column)
   (pacmacs--cell-wrapped-get pacmacs--track-board row column))
@@ -225,13 +222,15 @@
     (plist-put game-object :prev-row row)
     (plist-put game-object :prev-column column)
     (if (zerop speed-counter)
-        (let* ((new-point (pacmacs--step-point pacmacs--render-board row 
column direction))
+        (let* ((new-point (pacmacs--step-point pacmacs--object-board row 
column direction))
                (new-row (car new-point))
                (new-column (cdr new-point)))
           (plist-put game-object :speed-counter speed)
           (when (not (pacmacs--wall-at-p new-row new-column))
+            (pacmacs--remove-object game-object)
             (plist-put game-object :row new-row)
-            (plist-put game-object :column new-column)))
+            (plist-put game-object :column new-column)
+            (pacmacs--put-object game-object)))
       (plist-put game-object :speed-counter (1- speed-counter)))))
 
 (defun pacmacs--possible-ways (row column)
@@ -264,7 +263,7 @@
   (pacmacs--fill-board pacmacs--track-board nil)
   (plist-bind ((player-row :row)
                (player-column :column))
-      pacmacs-player-state
+      pacmacs--player-state
     (let ((wave (list (cons player-row player-column))))
       (while (not (null wave))
         (let ((next-wave nil))
@@ -302,7 +301,7 @@
                                (pacmacs--load-next-level)
                                (pacmacs--switch-to-prepare-state)))))
 
-  (pacmacs-render-state))
+  (pacmacs--render-state))
 
 (defun pacmacs--step-ghosts ()
   (dolist (ghost pacmacs--ghosts)
@@ -312,36 +311,30 @@
 (defun pacmacs--detect-pill-collision ()
   (plist-bind ((row :row)
                (column :column))
-      pacmacs-player-state
+      pacmacs--player-state
     (-when-let (pill (pacmacs--pill-at-p row column))
       (setq pacmacs-score (+ pacmacs-score 10))
-      (setq pacmacs-pills
-            (cl-remove-if #'(lambda (pill)
-                              (plist-bind ((p-row :row)
-                                           (p-column :column))
-                                  pill
-                                (and (= row p-row)
-                                     (= column p-column))))
-                          pacmacs-pills)))))
+      (setq pacmacs--pills (-remove (-partial #'eql pill) pacmacs--pills))
+      (pacmacs--remove-object pill))))
 
 (defun pacmacs--ghost-collision-p ()
   (plist-bind ((row :row)
                (column :column))
-      pacmacs-player-state
+      pacmacs--player-state
     (pacmacs--ghost-at-p row column)))
 
 (defun pacmacs-play-state-logic ()
   (when (not pacmacs-play-pause)
-    (pacmacs--anim-object-next-frame pacmacs-player-state 
pacmacs-tick-duration-ms)
+    (pacmacs--anim-object-next-frame pacmacs--player-state 
pacmacs-tick-duration-ms)
     (pacmacs--anim-object-list-next-frame pacmacs--ghosts 
pacmacs-tick-duration-ms)
-    (pacmacs--anim-object-list-next-frame pacmacs-pills 
pacmacs-tick-duration-ms)
+    (pacmacs--anim-object-list-next-frame pacmacs--pills 
pacmacs-tick-duration-ms)
 
     (pacmacs--recalc-track-board)
-    (if pacmacs-pills
+    (if pacmacs--pills
         (progn
-          (pacmacs--step-object pacmacs-player-state)
+          (pacmacs--step-object pacmacs--player-state)
           (if (pacmacs--ghost-collision-p)
-              (progn (pacmacs--step-back-object pacmacs-player-state)
+              (progn (pacmacs--step-back-object pacmacs--player-state)
                      (pacmacs--switch-to-death-state))
             (pacmacs--detect-pill-collision)
             (pacmacs--step-ghosts)
@@ -352,13 +345,13 @@
       (pacmacs--switch-to-level-beaten-state))))
 
 (defun pacmacs-death-state-logic ()
-  (pacmacs--anim-object-next-frame pacmacs-player-state
+  (pacmacs--anim-object-next-frame pacmacs--player-state
                                    pacmacs-tick-duration-ms)
   (pacmacs--anim-object-list-next-frame pacmacs--ghosts
                                         pacmacs-tick-duration-ms)
   
   (when (= 0 (plist-get
-              (plist-get pacmacs-player-state
+              (plist-get pacmacs--player-state
                          :current-animation)
               :current-frame))
     (if (<= pacmacs-lives 0)
@@ -371,17 +364,31 @@
     (cl-decf pacmacs-waiting-counter
              pacmacs-tick-duration-ms)))
 
-(defun pacmacs--put-object (anim-object)
-  (when anim-object
+(defun pacmacs--put-object (game-object)
+  (when game-object
     (plist-bind ((row :row)
                  (column :column))
-        anim-object
-      (pacmacs--cell-wrapped-set pacmacs--render-board row column 
anim-object))))
+        game-object
+      (let ((cell (pacmacs--cell-wrapped-get pacmacs--object-board
+                                             row column)))
+        (pacmacs--cell-wrapped-set pacmacs--object-board row column
+                                   (cons game-object cell))))))
+
+(defun pacmacs--remove-object (game-object)
+  (when game-object
+    (plist-bind ((row :row)
+                 (column :column))
+        game-object
+      (let ((cell (pacmacs--cell-wrapped-get pacmacs--object-board
+                                             row column)))
+        (pacmacs--cell-wrapped-set pacmacs--object-board
+                                   row column
+                                   (-remove (-partial #'eql game-object) 
cell))))))
 
 (defun pacmacs--switch-to-death-state ()
   (setq pacmacs-game-state 'death)
   (cl-decf pacmacs-lives)
-  (plist-put pacmacs-player-state :current-animation
+  (plist-put pacmacs--player-state :current-animation
              (pacmacs-load-anim "Pacman-Death"))
   (dolist (ghost pacmacs--ghosts)
     (plist-put ghost :current-animation
@@ -389,16 +396,16 @@
 
 (defun pacmacs--switch-to-game-over-state ()
   (setq pacmacs-game-state 'game-over)
-  (pacmacs-load-map "game-over")
+  (pacmacs--load-map "game-over")
   (pacmacs--register-new-score pacmacs-score))
 
 (defun pacmacs--switch-to-play-state ()
   (setq pacmacs-game-state 'play)
   (setq pacmacs-play-pause nil)
-  (pacmacs--reset-object-position pacmacs-player-state)
+  (pacmacs--reset-object-position pacmacs--player-state)
   (dolist (ghost pacmacs--ghosts)
     (pacmacs--reset-object-position ghost))
-  (pacmacs--switch-direction pacmacs-player-state 'right))
+  (pacmacs--switch-direction pacmacs--player-state 'right))
 
 (defun pacmacs--switch-to-prepare-state ()
   (setq pacmacs-game-state 'prepare)
@@ -408,7 +415,21 @@
   (setq pacmacs-game-state 'level-beaten)
   (setq pacmacs-waiting-counter 1000))
 
-(defun pacmacs-render-state ()
+(defun pacmacs--fill-object-board ()
+  (pacmacs--fill-board pacmacs--object-board nil)
+
+  (dolist (pill pacmacs--pills)
+    (pacmacs--put-object pill))
+
+  (dolist (ghost pacmacs--ghosts)
+    (pacmacs--put-object ghost))
+
+  (pacmacs--put-object pacmacs--player-state)
+  
+  (dolist (wall pacmacs--wall-cells)
+    (pacmacs--put-object wall)))
+
+(defun pacmacs--render-state ()
   (with-current-buffer pacmacs-buffer-name
     (let ((inhibit-read-only t))
       (erase-buffer)
@@ -418,25 +439,13 @@
       (when pacmacs-debug-output
         (pacmacs--render-track-board pacmacs--track-board))
 
-      (pacmacs--fill-board pacmacs--render-board nil)
-
-      (dolist (pill pacmacs-pills)
-        (pacmacs--put-object pill))
-
-      (dolist (ghost pacmacs--ghosts)
-        (pacmacs--put-object ghost))
-
-      (pacmacs--put-object pacmacs-player-state)
-      
-      (dolist (wall pacmacs-wall-cells)
-        (pacmacs--put-object wall))
-      
       (plist-bind ((width :width)
                    (height :height))
-          pacmacs--render-board
+          pacmacs--object-board
         (dotimes (row height)
           (dotimes (column width)
-            (let ((anim-object (pacmacs--cell-wrapped-get 
pacmacs--render-board row column)))
+            (let ((anim-object (car (pacmacs--cell-wrapped-get 
pacmacs--object-board
+                                                               row column))))
               (pacmacs--render-object anim-object)))
           (insert "\n")))
       (insert "\n")
@@ -457,22 +466,22 @@
 (defun pacmacs-up ()
   (interactive)
   (when (pacmacs--unpaused-play-state-p)
-    (pacmacs--switch-direction pacmacs-player-state 'up)))
+    (pacmacs--switch-direction pacmacs--player-state 'up)))
 
 (defun pacmacs-down ()
   (interactive)
   (when (pacmacs--unpaused-play-state-p)
-    (pacmacs--switch-direction pacmacs-player-state 'down)))
+    (pacmacs--switch-direction pacmacs--player-state 'down)))
 
 (defun pacmacs-left ()
   (interactive)
   (when (pacmacs--unpaused-play-state-p)
-    (pacmacs--switch-direction pacmacs-player-state 'left)))
+    (pacmacs--switch-direction pacmacs--player-state 'left)))
 
 (defun pacmacs-right ()
   (interactive)
   (when (pacmacs--unpaused-play-state-p)
-    (pacmacs--switch-direction pacmacs-player-state 'right)))
+    (pacmacs--switch-direction pacmacs--player-state 'right)))
 
 (defun pacmacs-pause ()
   (interactive)
@@ -486,7 +495,7 @@
        (-sort #'string-lessp)
        (apply #'vector)))
 
-(defun pacmacs-load-map (map-name)
+(defun pacmacs--load-map (map-name)
   (let* ((lines (split-string (->> map-name
                                    (format "./maps/%s.txt")
                                    (pacmacs--find-resource-file)
@@ -494,33 +503,31 @@
                               "\n" t))
          (board-width (apply 'max (mapcar #'length lines)))
          (board-height (length lines)))
-    (setq pacmacs-board-width board-width)
-    (setq pacmacs-board-height board-height)
-
-    (setq pacmacs--render-board (pacmacs--make-board pacmacs-board-width
-                                                     pacmacs-board-height))
-    (setq pacmacs--track-board (pacmacs--make-board pacmacs-board-width
-                                                    pacmacs-board-height))
+    (setq pacmacs--object-board (pacmacs--make-board board-width
+                                                     board-height))
+    (setq pacmacs--track-board (pacmacs--make-board board-width
+                                                    board-height))
 
-    (setq pacmacs-wall-cells nil)
-    (setq pacmacs-pills nil)
+    (setq pacmacs--wall-cells nil)
+    (setq pacmacs--pills nil)
     (setq pacmacs--ghosts nil)
-    (setq pacmacs-player-state nil)
+    (setq pacmacs--player-state nil)
 
     (cl-loop
      for line being the element of lines using (index row)
      do (cl-loop for x being the element of line using (index column)
                  do (cond ((char-equal x ?#)
-                           (add-to-list 'pacmacs-wall-cells 
(pacmacs--make-wall-cell row column)))
+                           (add-to-list 'pacmacs--wall-cells 
(pacmacs--make-wall-cell row column)))
 
                           ((char-equal x ?.)
-                           (add-to-list 'pacmacs-pills (pacmacs--make-pill row 
column)))
+                           (add-to-list 'pacmacs--pills (pacmacs--make-pill 
row column)))
 
                           ((char-equal x ?o)
-                           (setq pacmacs-player-state (pacmacs--make-player 
row column)))
+                           (setq pacmacs--player-state (pacmacs--make-player 
row column)))
 
                           ((char-equal x ?g)
-                           (add-to-list 'pacmacs--ghosts (pacmacs--make-ghost 
row column))))))))
+                           (add-to-list 'pacmacs--ghosts (pacmacs--make-ghost 
row column))))))
+    (pacmacs--fill-object-board)))
 
 (provide 'pacmacs)
 
diff --git a/test/pacmacs-test.el b/test/pacmacs-test.el
index 745abeec26..b60732262c 100644
--- a/test/pacmacs-test.el
+++ b/test/pacmacs-test.el
@@ -33,7 +33,7 @@
      (pacmacs--track-object game-object))))
 
 (ert-deftest pacmacs--put-object-test ()
-  (let ((pacmacs--render-board (list :width 2
+  (let ((pacmacs--object-board (list :width 2
                                       :height 2
                                       :data [[nil nil]
                                              [nil nil]]))
@@ -41,6 +41,6 @@
     (pacmacs--put-object anim-object)
     (should (equal (list :width 2
                          :height 2
-                         :data [[nil (:row 0 :column 1)]
+                         :data [[nil ((:row 0 :column 1))]
                                 [nil nil]])
-                   pacmacs--render-board))))
+                   pacmacs--object-board))))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]