[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/pacmacs 91c317819c 123/472: Implement basic death mechanic
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/pacmacs 91c317819c 123/472: Implement basic death mechanics (#69) |
Date: |
Thu, 6 Jan 2022 21:59:18 -0500 (EST) |
branch: elpa/pacmacs
commit 91c317819c44656b735d2e4cfc2d873111a22641
Author: rexim <reximkut@gmail.com>
Commit: rexim <reximkut@gmail.com>
Implement basic death mechanics (#69)
---
maps/map05.txt | 7 +++
pacmacs.el | 132 ++++++++++++++++++++++++++++++++++++++++-----------------
2 files changed, 99 insertions(+), 40 deletions(-)
diff --git a/maps/map05.txt b/maps/map05.txt
new file mode 100644
index 0000000000..a045f8d51e
--- /dev/null
+++ b/maps/map05.txt
@@ -0,0 +1,7 @@
+##########
+#o.......#
+#. #
+#. #
+#. #
+#. g#
+##########
diff --git a/pacmacs.el b/pacmacs.el
index 691946b85d..0bb23a78b6 100644
--- a/pacmacs.el
+++ b/pacmacs.el
@@ -70,6 +70,8 @@
(defvar pacmacs-board nil)
(defvar pacmacs-track-board nil)
+(defvar pacmacs-game-state 'play)
+
(define-derived-mode pacmacs-mode special-mode "pacmacs-mode"
(define-key pacmacs-mode-map (kbd "<up>") 'pacmacs-up)
(define-key pacmacs-mode-map (kbd "<down>") 'pacmacs-down)
@@ -83,7 +85,7 @@
(interactive)
(switch-to-buffer-other-window pacmacs-buffer-name)
(pacmacs-mode)
- (pacmacs-load-map "map02")
+ (pacmacs-load-map "map05")
(unless pacmacs-timer
(setq pacmacs-timer (run-at-time nil (* pacmacs-tick-duration-ms 0.001)
'pacmacs-tick))))
@@ -106,6 +108,8 @@
(defun pacmacs--make-ghost (row column)
(list :row row
:column column
+ :init-row row
+ :init-column column
:direction 'right
:current-animation (pacmacs-load-anim "Red-Ghost-Right")
:direction-animations (list 'left (pacmacs-load-anim "Red-Ghost-Left")
@@ -118,6 +122,8 @@
(defun pacmacs--make-player (row column)
(list :row row
:column column
+ :init-row row
+ :init-column column
:direction 'right
:current-animation (pacmacs-load-anim "Pacman-Chomping-Right")
:direction-animations (list 'left (pacmacs-load-anim
"Pacman-Chomping-Left")
@@ -127,6 +133,13 @@
:speed 0
:speed-counter 0))
+(defun pacmacs--reset-object-position (game-object)
+ (plist-bind ((init-row :init-row)
+ (init-column :init-column))
+ game-object
+ (plist-put game-object :row init-row)
+ (plist-put game-object :column init-column)))
+
(defun pacmacs--kill-buffer-and-its-window (buffer-or-name)
(let ((buffer-window (get-buffer-window buffer-or-name)))
(if (and buffer-window
@@ -145,6 +158,11 @@
row column
pacmacs-pills))
+(defun pacmacs--ghost-at-p (row column)
+ (pacmacs--object-at-p pacmacs-board
+ row column
+ pacmacs-ghosts))
+
(defun pacmacs-quit ()
(interactive)
(when (get-buffer pacmacs-buffer-name)
@@ -243,37 +261,56 @@
(interactive)
(with-current-buffer pacmacs-buffer-name
(let ((inhibit-read-only t))
- (pacmacs-anim-object-next-frame pacmacs-player-state
pacmacs-tick-duration-ms)
- (dolist (ghost pacmacs-ghosts)
- (pacmacs-anim-object-next-frame ghost pacmacs-tick-duration-ms))
- (dolist (pill pacmacs-pills)
- (pacmacs-anim-object-next-frame pill pacmacs-tick-duration-ms))
-
- (pacmacs-step-object pacmacs-player-state)
-
- (plist-bind ((row :row)
- (column :column))
- pacmacs-player-state
- (let ((pill (pacmacs--pill-at-p row column)))
- (when pill
- (setq pacmacs-score (+ pacmacs-score 10))
- (setq pacmacs-pills
- (remove-if #'(lambda (pill)
- (plist-bind ((p-row :row)
- (p-column :column))
- pill
- (and (= row p-row)
- (= column p-column))))
- pacmacs-pills)))))
-
- (pacmacs--recalc-track-board)
- (dolist (ghost pacmacs-ghosts)
- (pacmacs--track-object ghost)
- (pacmacs-step-object ghost))
-
+
+ (cond
+ ((equal pacmacs-game-state 'play)
+ (pacmacs-play-state-logic))
+ ((equal pacmacs-game-state 'death)
+ (pacmacs-death-state-logic)))
+
(erase-buffer)
(pacmacs-render-state))))
+(defun pacmacs-play-state-logic ()
+ (pacmacs-anim-object-next-frame pacmacs-player-state
pacmacs-tick-duration-ms)
+ (dolist (ghost pacmacs-ghosts)
+ (pacmacs-anim-object-next-frame ghost pacmacs-tick-duration-ms))
+ (dolist (pill pacmacs-pills)
+ (pacmacs-anim-object-next-frame pill pacmacs-tick-duration-ms))
+
+ (pacmacs-step-object pacmacs-player-state)
+ (pacmacs--recalc-track-board)
+ (dolist (ghost pacmacs-ghosts)
+ (pacmacs--track-object ghost)
+ (pacmacs-step-object ghost))
+
+ (plist-bind ((row :row)
+ (column :column))
+ pacmacs-player-state
+ (-when-let (pill (pacmacs--pill-at-p row column))
+ (setq pacmacs-score (+ pacmacs-score 10))
+ (setq pacmacs-pills
+ (remove-if #'(lambda (pill)
+ (plist-bind ((p-row :row)
+ (p-column :column))
+ pill
+ (and (= row p-row)
+ (= column p-column))))
+ pacmacs-pills)))
+
+ (-when-let (ghost (pacmacs--ghost-at-p row column))
+ (pacmacs--switch-to-death-state))))
+
+
+(defun pacmacs-death-state-logic ()
+ (pacmacs-anim-object-next-frame pacmacs-player-state
+ pacmacs-tick-duration-ms)
+ (when (= 0 (plist-get
+ (plist-get pacmacs-player-state
+ :current-animation)
+ :current-frame))
+ (pacmacs--switch-to-play-state)))
+
(defun pacmacs-render-object (anim-object)
(let* ((anim (plist-get anim-object :current-animation))
(sprite-sheet (plist-get anim :sprite-sheet))
@@ -286,6 +323,18 @@
anim-object
(pacmacs--cell-set pacmacs-board row column anim-object)))
+(defun pacmacs--switch-to-death-state ()
+ (setq pacmacs-game-state 'death)
+ (plist-put pacmacs-player-state :current-animation
+ (pacmacs-load-anim "Pacman-Death")))
+
+(defun pacmacs--switch-to-play-state ()
+ (setq pacmacs-game-state 'play)
+ (pacmacs--reset-object-position pacmacs-player-state)
+ (dolist (ghost pacmacs-ghosts)
+ (pacmacs--reset-object-position ghost))
+ (pacmacs--switch-direction pacmacs-player-state 'right))
+
(defun pacmacs-render-track-board ()
(plist-bind ((width :width)
(height :height))
@@ -314,13 +363,13 @@
(pacmacs--fill-board pacmacs-board (pacmacs--make-empty-cell))
- (pacmacs--put-object pacmacs-player-state)
-
(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))
@@ -336,19 +385,23 @@
(defun pacmacs-up ()
(interactive)
- (pacmacs--switch-direction pacmacs-player-state 'up))
+ (when (equal pacmacs-game-state 'play)
+ (pacmacs--switch-direction pacmacs-player-state 'up)))
(defun pacmacs-down ()
(interactive)
- (pacmacs--switch-direction pacmacs-player-state 'down))
+ (when (equal pacmacs-game-state 'play)
+ (pacmacs--switch-direction pacmacs-player-state 'down)))
(defun pacmacs-left ()
(interactive)
- (pacmacs--switch-direction pacmacs-player-state 'left))
+ (when (equal pacmacs-game-state 'play)
+ (pacmacs--switch-direction pacmacs-player-state 'left)))
(defun pacmacs-right ()
(interactive)
- (pacmacs--switch-direction pacmacs-player-state 'right))
+ (when (equal pacmacs-game-state 'play)
+ (pacmacs--switch-direction pacmacs-player-state 'right)))
(defun pacmacs--file-content (filename)
(with-temp-buffer
@@ -381,13 +434,12 @@
(add-to-list 'pacmacs-pills (pacmacs--make-pill row
column)))
((char-equal x ?o)
- (if (not pacmacs-player-state)
- (setq pacmacs-player-state (pacmacs--make-player
row column))
- (plist-put pacmacs-player-state :row row)
- (plist-put pacmacs-player-state :column 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--switch-to-play-state)))
(provide 'pacmacs)
- [nongnu] elpa/pacmacs 9614f394e7 106/472: Merge branch 'board-functions-uts-75'. Close #75, (continued)
- [nongnu] elpa/pacmacs 9614f394e7 106/472: Merge branch 'board-functions-uts-75'. Close #75, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 1e29c2f943 101/472: UTs for pacmacs--cell-tracked-p (#75), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 0839611f42 108/472: Refactor out pacmacs--make-board function (#74), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 8aa9d50dda 102/472: Remove pacmacs--within-of-map-p (#75), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 7714743aa8 103/472: UTs for pacmacs--track-point (#75), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 2c0bcf993f 107/472: Use two-argumented `<=`. Close #76, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs e5bd77740d 119/472: Fix NPEs (#74), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 286eb99ae0 130/472: Implement prepare phase. Close #80, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs d14cdd38e3 135/472: Fix last eaten pill visibility. Close #96, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 9cb186f10a 137/472: Refactor pacmacs-inversed-direction-table out. Close #103, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 91c317819c 123/472: Implement basic death mechanics (#69),
ELPA Syncer <=
- [nongnu] elpa/pacmacs be91d566cb 139/472: Implement Game Over state. Close #94, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs b8cd22229d 142/472: Introduce pacmacs--anim-object-list-next-frame, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 91e432111b 145/472: Implement basic score table mechnism (#92), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 7058b61e47 146/472: Implement adding entries to score table (#92), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs e032089ab4 151/472: Render score table on Game Over screen (#92), ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs a7b0530f65 152/472: Merge branch 'score-table-92'. Close #92, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 1b2ca64cd1 157/472: Merge branch 'resource-packaging-95'. Close #95, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 48ecc5cee9 159/472: Don't fail if the score file doesn't exist, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 10b8a997dd 037/472: More precise instructions in README, ELPA Syncer, 2022/01/06
- [nongnu] elpa/pacmacs 7e04991d4e 030/472: Add UT for pacman-compare-aseprite-frames function (#22), ELPA Syncer, 2022/01/06