src/caves/entities/player.clj @ 1a3a4f8d5d85
Refactor the world code into separate files.
This pulls out the world generation code into its own file. It was
getting a bit crowded in there.
author |
Steve Losh <steve@stevelosh.com> |
date |
Wed, 01 Aug 2012 21:13:37 -0400 |
parents |
f57db9d7ccff |
children |
(none) |
(ns caves.entities.player
(:use [caves.entities.core :only [Entity add-aspect]]
[caves.entities.aspects.receiver :only [Receiver]]
[caves.entities.aspects.mobile :only [Mobile move can-move?]]
[caves.entities.aspects.digger :only [Digger dig can-dig?]]
[caves.entities.aspects.attacker :only [Attacker attack]]
[caves.entities.aspects.destructible :only [Destructible]]
[caves.coords :only [destination-coords]]
[caves.world.core :only [get-entity-at]]))
(defrecord Player [id glyph color location hp max-hp attack name])
(extend-type Player Entity
(tick [this world]
world))
(add-aspect Player Mobile)
(add-aspect Player Digger)
(add-aspect Player Attacker)
(add-aspect Player Destructible)
(add-aspect Player Receiver)
(defn make-player [location]
(map->Player {:id :player
:name "player"
:glyph "@"
:color :white
:location location
:hp 40
:max-hp 40
:attack 10}))
(defn move-player [world dir]
(let [player (get-in world [:entities :player])
target (destination-coords (:location player) dir)
entity-at-target (get-entity-at world target)]
(cond
entity-at-target (attack player entity-at-target world)
(can-move? player target world) (move player target world)
(can-dig? player target world) (dig player target world)
:else world)))