src/aspects/coordinates.lisp @ 9aad3f5f030b

Add a win condition
author Steve Losh <steve@stevelosh.com>
date Sun, 08 Jan 2017 13:19:27 +0000
parents dd9a7ef86a21
children (none)
(in-package :ap.entities)

(defparameter *world-contents*
  (make-array (list ap::*map-size*
                    ap::*map-size*)
    :initial-element nil))

(define-aspect coords x y)

(defun within-bounds-p (x y)
  (and (in-range-p 0 x ap::*map-size*)
       (in-range-p 0 y ap::*map-size*)))

(defun coords-insert-entity (e)
  (push e (aref *world-contents* (coords/x e) (coords/y e))))

(defun coords-remove-entity (e)
  (deletef (aref *world-contents* (coords/x e) (coords/y e)) e))

(defun coords-move-entity (e new-x new-y)
  (when (within-bounds-p new-x new-y)
    (coords-remove-entity e)
    (setf (coords/x e) new-x
          (coords/y e) new-y)
    (coords-insert-entity e)))

(defun coords-lookup (x y)
  (when (within-bounds-p x y)
    (aref *world-contents* x y)))

(defun coords-nearby (entity &optional (radius 1))
  (remove entity
          (iterate (with x = (coords/x entity))
                   (with y = (coords/y entity))
                   (for (dx dy) :within-radius radius)
                   (appending (coords-lookup (+ x dx)
                                             (+ y dy))))))

(defmethod entity-created :after ((entity coords))
  (coords-insert-entity entity))

(defmethod entity-destroyed :after ((entity coords))
  (coords-remove-entity entity))