001 (ns the-great-game.world.location
002 "Functions dealing with location in the world."
003 (:require [clojure.math.numeric-tower :refer [expt sqrt]]))
004
005 ;; A 'location' value is a list comprising at most the x/y coordinate location
006 ;; and the ids of the settlement and region (possibly hierarchically) that contain
007 ;; the location. If the x/y is not local to the home of the receiving agent, they
008 ;; won't remember it and won't pass it on; if any of the ids are not interesting
009 ;; So location information will degrade progressively as the item is passed along.
010
011 ;; It is assumed that the `:home` of a character is a location in this sense.
012
013 (defn get-coords
014 "Return the coordinates in the game world of `location`, which may be
015 1. A coordinate pair in the format {:x 5 :y 32};
016 2. A location, as discussed above;
017 3. Any other gameworld object, having a `:location` property whose value
018 is one of the above."
019 [location]
020 (cond
021 (empty? location) nil
022 (map? location)
023 (cond
024 (and (number? (:x location)) (number? (:y location)))
025 location
026 (:location location)
027 (:location location))
028 :else
029 (get-coords (first (remove keyword? location)))))
030
031 (defn distance-between
032 [location-1 location-2]
033 (let [c1 (get-coords location-1)
034 c2 (get-coords location-2)]
035 (when
036 (and c1 c2)
037 (sqrt (+ (expt (- (:x c1) (:x c2)) 2) (expt (- (:y c1) (:y c2)) 2))))))