diff --git a/pacmacs-render.el b/pacmacs-render.el index 3606baa..cf2783e 100644 --- a/pacmacs-render.el +++ b/pacmacs-render.el @@ -45,6 +45,14 @@ nil nil nil nil) '(0 0 40 40))) +(defun pacmacs--replace-empty-cell (start end) + (add-text-properties start end + `(display ((slice . (0 0 40 40)) + ,(pacmacs--create-wall-tile + 40 40 + nil nil nil nil + nil nil nil nil))))) + (defun pacmacs--render-life-icon () (when (not pacmacs--life-icon) (setq pacmacs--life-icon @@ -52,17 +60,39 @@ (plist-put pacmacs--life-icon :current-frame 2)) (pacmacs--render-anim pacmacs--life-icon)) +(defun pacmacs--replace-life-icon (start end) + (when (not pacmacs--life-icon) + (setq pacmacs--life-icon + (pacmacs-load-anim "Pacman-Chomping-Right")) + (plist-put pacmacs--life-icon :current-frame 2)) + (pacmacs--replace-anim start end pacmacs--life-icon)) + (defun pacmacs--render-anim (anim) (let* ((sprite-sheet (plist-get anim :sprite-sheet)) (current-frame (plist-get (pacmacs-anim-get-frame anim) :frame))) (pacmacs-insert-image sprite-sheet current-frame))) +(defun pacmacs--render-image (start end image) + (add-text-properties start end `(display ,image))) + +(defun pacmacs--replace-anim (start end anim) + (let* ((sprite-sheet (plist-get anim :sprite-sheet)) + (current-frame (plist-get (pacmacs-anim-get-frame anim) :frame))) + (pacmacs--render-image start end + `((slice . ,current-frame) + ,sprite-sheet)))) + (defun pacmacs--render-object (anim-object) (if anim-object (let* ((anim (plist-get anim-object :current-animation))) (pacmacs--render-anim anim)) (pacmacs--render-empty-cell))) +(defun pacmacs--replace-object (anim-object start end) + (plist-bind ((anim :current-animation)) + anim-object + (pacmacs--replace-anim start end anim))) + (defun pacmacs--render-track-board (track-board) (plist-bind ((width :width) (height :height)) @@ -83,6 +113,9 @@ (insert "v"))))) (insert "\n")))) +(defun pacmacs--render-score (start end score) + (put-text-property start end 'display (format "Score: %d" score))) + (provide 'pacmacs-render) ;;; pacmacs-render.el ends here diff --git a/pacmacs.el b/pacmacs.el index ffd3103..3743633 100644 --- a/pacmacs.el +++ b/pacmacs.el @@ -444,34 +444,62 @@ (dolist (wall pacmacs--wall-cells) (pacmacs--put-object wall))) -(defun pacmacs--render-state () +(defun pacmacs--prerender-game-board () (with-current-buffer pacmacs-buffer-name (let ((inhibit-read-only t)) (erase-buffer) - - (insert (format "Score: %d\n\n" pacmacs-score)) - - (when pacmacs-debug-output - (pacmacs--render-track-board pacmacs--track-board)) - + (insert " \n") (plist-bind ((width :width) (height :height)) pacmacs--object-board (dotimes (row height) + (ignore row) (dotimes (column width) - (let ((anim-object (car (pacmacs--cell-wrapped-get pacmacs--object-board - row column)))) - (pacmacs--render-object anim-object))) + (ignore column) + (insert " ")) (insert "\n"))) - (insert "\n") - (dotimes (i pacmacs-lives) - (ignore i) - (pacmacs--render-life-icon)) - - (when (equal pacmacs-game-state 'game-over) - (-> (pacmacs--read-score-table) - (pacmacs--sort-score-table) - (pacmacs--render-score-table))) + (insert " \n")))) + +(defun pacmacs--render-state () + (with-current-buffer pacmacs-buffer-name + (let ((inhibit-read-only t)) + (pacmacs--render-score 1 2 pacmacs-score) + + (plist-bind ((width :width) + (height :height)) + pacmacs--object-board + (let ((tile-pos 3)) + (dotimes (row height) + (dotimes (column width) + (let ((anim-object (car (pacmacs--cell-wrapped-get pacmacs--object-board + row column)))) + (if anim-object + (pacmacs--replace-object anim-object tile-pos (1+ tile-pos)) + (pacmacs--replace-empty-cell tile-pos (1+ tile-pos)))) + (cl-incf tile-pos)) + (cl-incf tile-pos)))) + + (plist-bind ((width :width) + (height :height)) + pacmacs--object-board + (let ((lives-counter-place (+ 3 (* (1+ width) height)))) + (delete-region lives-counter-place (point-max)) + (goto-char lives-counter-place) + (dotimes (i pacmacs-lives) + (ignore i) + (pacmacs--render-life-icon)))) + + ;; (when pacmacs-debug-output + ;; (pacmacs--render-track-board pacmacs--track-board)) + + ;; (dotimes (i pacmacs-lives) + ;; (ignore i) + ;; (pacmacs--render-life-icon)) + + ;; (when (equal pacmacs-game-state 'game-over) + ;; (-> (pacmacs--read-score-table) + ;; (pacmacs--sort-score-table) + ;; (pacmacs--render-score-table))) (goto-char 0)))) (defun pacmacs--unpaused-play-state-p () @@ -559,7 +587,9 @@ wall (plist-put wall :current-animation (pacmacs-make-anim (list (pacmacs-make-frame '(0 0 40 40) 100)) - (pacmacs--wall-tile-at row column))))))) + (pacmacs--wall-tile-at row column))))) + + (pacmacs--prerender-game-board))) (provide 'pacmacs)