35acf92fe597

MOAR
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Wed, 11 Jul 2012 12:43:30 -0400
parents 9770861b040f
children 87a202e98676
branches/tags (none)
files project.clj src/caves/coords.clj src/caves/entities/aspects/digger.clj src/caves/entities/aspects/mobile.clj src/caves/entities/player.clj src/caves/world.clj

Changes

--- a/project.clj	Wed Jul 11 00:52:51 2012 -0400
+++ b/project.clj	Wed Jul 11 12:43:30 2012 -0400
@@ -4,4 +4,7 @@
   :license {:name "MIT/X11"}
   :dependencies [[org.clojure/clojure "1.4.0"]
                  [clojure-lanterna "0.9.0"]]
-  :main caves.core)
+
+  ; :main caves.core
+
+  )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/caves/coords.clj	Wed Jul 11 12:43:30 2012 -0400
@@ -0,0 +1,25 @@
+(ns caves.coords)
+
+
+(defn offset-coords
+  "Offset the starting coordinate by the given amount, returning the result coordinate."
+  [[x y] [dx dy]]
+  [(+ x dx) (+ y dy)])
+
+(defn dir-to-offset
+  "Convert a direction to the offset for moving 1 in that direction."
+  [dir]
+  (case dir
+    :w  [-1 0]
+    :e  [1 0]
+    :n  [0 -1]
+    :s  [0 1]
+    :nw [-1 -1]
+    :ne [1 -1]
+    :sw [-1 1]
+    :se [1 1]))
+
+(defn destination-coords
+  "Take an origin's coords and a direction and return the destination's coords."
+  [origin dir]
+  (offset-coords origin (dir-to-offset dir)))
--- a/src/caves/entities/aspects/digger.clj	Wed Jul 11 00:52:51 2012 -0400
+++ b/src/caves/entities/aspects/digger.clj	Wed Jul 11 12:43:30 2012 -0400
@@ -1,7 +1,8 @@
 (ns caves.entities.aspects.digger)
 
+
 (defprotocol Digger
-  (dig [this world dx dy]
+  (dig [this world target]
        "Dig a location.")
-  (can-dig? [this world dx dy]
+  (can-dig? [this world target]
             "Return whether the entity can dig the new location."))
--- a/src/caves/entities/aspects/mobile.clj	Wed Jul 11 00:52:51 2012 -0400
+++ b/src/caves/entities/aspects/mobile.clj	Wed Jul 11 12:43:30 2012 -0400
@@ -2,8 +2,8 @@
 
 
 (defprotocol Mobile
-  (move [this world dx dy]
+  (move [this world dest]
         "Move this entity to a new location.")
-  (can-move? [this world dx dy]
+  (can-move? [this world dest]
              "Return whether the entity can move to the new location."))
 
--- a/src/caves/entities/player.clj	Wed Jul 11 00:52:51 2012 -0400
+++ b/src/caves/entities/player.clj	Wed Jul 11 12:43:30 2012 -0400
@@ -2,32 +2,16 @@
   (: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 [find-empty-tile get-tile-kind set-tile-floor]]))
 
 
 (defrecord Player [id loc])
 
-(defn offset-coords [[x y] dx dy]
-  [(+ x dx) (+ y dy)])
-
 (defn check-tile
-  "Take a player and an offset, and check that the tile at the destination
-  passes the given predicate."
-  [player world dx dy pred]
-  (let [[x y] (offset-coords (:loc player) dx dy)
-        dest-tile (get-tile-kind world x y)]
-    (pred dest-tile)))
-
-(defn dir-to-offset [dir]
-  (case dir
-    :w  [-1 0]
-    :e  [1 0]
-    :n  [0 -1]
-    :s  [0 1]
-    :nw [-1 -1]
-    :ne [1 -1]
-    :sw [-1 1]
-    :se [1 1]))
+  "Check that the tile at the destination passes the given predicate."
+  [world dest pred]
+  (pred (get-tile-kind world dest)))
 
 
 (extend-type Player Entity
@@ -35,30 +19,27 @@
     world))
 
 (extend-type Player Mobile
-  (move [this world dx dy]
-    (if (can-move? this world dx dy)
-      (update-in world [:player :loc] offset-coords dx dy)
-      world))
-  (can-move? [this world dx dy]
-    (check-tile this world dx dy #{:floor})))
+  (move [this world dest]
+    {:pre [(can-move? this world dest)]}
+    (assoc-in world [:player :loc] dest))
+  (can-move? [this world dest]
+    (check-tile world dest #{:floor})))
 
 (extend-type Player Digger
-  (dig [this world dx dy]
-    (if (can-dig? this world dx dy)
-      (let [[tx ty] (offset-coords (:loc this) dx dy)]
-        (set-tile-floor world tx ty))
-      world))
-  (can-dig? [this world dx dy]
-    (check-tile this world dx dy #{:wall})))
+  (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 [world]
   (->Player :player (find-empty-tile world)))
 
-(defn move-player [world direction]
+(defn move-player [world dir]
   (let [player (:player world)
-        [dx dy] (dir-to-offset direction)]
+        target (destination-coords (:loc player) dir)]
     (cond
-      (can-move? player world dx dy) (move player world dx dy)
-      (can-dig? player world dx dy) (dig player world dx dy)
+      (can-move? player world target) (move player world target)
+      (can-dig? player world target) (dig player world target)
       :else world)))
--- a/src/caves/world.clj	Wed Jul 11 00:52:51 2012 -0400
+++ b/src/caves/world.clj	Wed Jul 11 12:43:30 2012 -0400
@@ -13,11 +13,14 @@
    :wall  (->Tile :wall  "#" :white)
    :bound (->Tile :bound "X" :black)})
 
-(defn get-tile [tiles x y]
+
+; Convenience functions -------------------------------------------------------
+(defn get-tile-from-tiles [tiles [x y]]
   (get-in tiles [y x] (:bound tiles)))
 
-(defn set-tile-floor [world x y]
-  (assoc-in world [:tiles y x] (:floor tiles)))
+(defn random-coordinate []
+  (let [[cols rows] world-size]
+    [(rand-int cols) (rand-int rows)]))
 
 
 ; Debugging -------------------------------------------------------------------
@@ -53,8 +56,7 @@
     [(+ x dx) (+ y dy)]))
 
 (defn get-block [tiles x y]
-  (map (fn [[x y]]
-         (get-tile tiles x y))
+  (map (partial get-tile-from-tiles tiles)
        (block-coords x y)))
 
 (defn get-smoothed-row [tiles y]
@@ -78,18 +80,23 @@
 
 
 ; Querying a world ------------------------------------------------------------
-(defn random-coordinate []
-  (let [[cols rows] world-size]
-    [(rand-int cols) (rand-int rows)]))
+(defn get-tile [world coord]
+  (get-tile-from-tiles (:tiles world) coord))
+
+(defn get-tile-kind [world coord]
+  (:kind (get-tile world coord)))
+
+(defn set-tile [world [x y] tile]
+  (assoc-in world [:tiles y x] tile))
+
+(defn set-tile-floor [world coord]
+  (set-tile world coord (:floor tiles)))
+
 
 (defn find-empty-tile [world]
-  (loop [[x y] (random-coordinate)]
-    (let [{:keys [kind]} (get-tile (:tiles world) x y)]
+  (loop [coord (random-coordinate)]
+    (let [{:keys [kind]} (get-tile world coord)]
       (if (#{:floor} kind)
-        [x y]
+        coord
         (recur (random-coordinate))))))
 
-
-(defn get-tile-kind [world x y]
-  (:kind (get-tile (:tiles world) x y)))
-