[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))))
- [nongnu] elpa/pacmacs 7a8db8e06c 228/472: Merge branch 'xbm-flip-bit-hack-133'. Close #133, (continued)
- [nongnu] elpa/pacmacs 7a8db8e06c 228/472: Merge branch 'xbm-flip-bit-hack-133'. Close #133, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs f65f288b18 239/472: Cache wall tiles (#131), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs edf7600fca 237/472: Add functions for drawing bars (#131), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 2a9ec76c28 263/472: Automate Big Pills sprites generating (#26), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs a1bf99c5f7 176/472: Add an animation, close #118., ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 29b87c4538 181/472: Refactor out unpaused play state predicate, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 93f964e11e 186/472: Merge branch 'compile-on-ci-123'. Close #123, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 3f7bf5c282 192/472: Fix board UTs, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 805d91d22b 194/472: Rename all the buffer stuff to board back (#105), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 1ab8264214 198/472: Remove dead vars for board size (#126), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 144a973d83 203/472: Merge branch 'slow-object-look-up-126'. Close #126,
ELPA Syncer <=
- [nongnu] elpa/pacmacs 6a4bf8c87f 214/472: Merge branch 'integration-test-recorder-115'. Close #115, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs b73dd8215c 220/472: Merge branch 'integration-test-replayer-122'. Close #122, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 1eadfb94fd 225/472: Refactor out pacmacs--wall-cells list (#81), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 843d428744 226/472: Refactor out pacmacs--big-pills list (#81), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 7eafd1bf11 017/472: Merge branch 'split-merged-modules-19'. Close #19, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs f88ea61b10 035/472: Merge branch 'ut-coverage-27'. Close #27, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 9acb9eefa4 286/472: Introduce a constructor for terrified ghosts (#153), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 25193bcdbf 289/472: Better running away algorithm (#153), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 8fd7660240 290/472: Terrify ghosts by eating big pill (#153), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs e4e4053c26 306/472: Ghost terrified time as constant (#159), ELPA Syncer, 2022/01/06