src/caves/entities/player.clj @ 0e7bdc5771b2

Add spreading for lichens.
author Steve Losh <steve@stevelosh.com>
date Thu, 12 Jul 2012 19:07:08 -0400
parents a208f6298145
children 716b6b7e09f1
(ns caves.entities.player
  (:use [caves.entities.core :only [Entity]]
        [caves.entities.aspects.mobile :only [Mobile move can-move?]]
        [caves.entities.aspects.digger :only [Digger dig can-dig?]]
        [caves.coords :only [destination-coords]]
        [caves.world :only [is-empty? get-tile-kind set-tile-floor]]))


(defrecord Player [id glyph color location])

(defn check-tile
  "Check that the tile at the destination passes the given predicate."
  [world dest pred]
  (pred (get-tile-kind world dest)))


(extend-type Player Entity
  (tick [this world]
    world))

(extend-type Player Mobile
  (move [this world dest]
    {:pre [(can-move? this world dest)]}
    (assoc-in world [:entities :player :location] dest))
  (can-move? [this world dest]
    (is-empty? world dest)))

(extend-type Player Digger
  (dig [this world dest]
    {:pre [(can-dig? this world dest)]}
    (set-tile-floor world dest))
  (can-dig? [this world dest]
    (check-tile world dest #{:wall})))



(defn make-player [location]
  (->Player :player "@" :white location))

(defn move-player [world dir]
  (let [player (get-in world [:entities :player])
        target (destination-coords (:location player) dir)]
    (cond
      (can-move? player world target) (move player world target)
      (can-dig? player world target) (dig player world target)
      :else world)))