441 lines
25 KiB
HTML
441 lines
25 KiB
HTML
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<link rel="stylesheet" href="../coverage.css"/> <title> the_great_game/time.clj </title>
|
|
</head>
|
|
<body>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
001 (ns the-great-game.time
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
002 (:require [clojure.string :as s]))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
003
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
004 (def game-start-time
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
005 "The start time of this run."
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
006 (System/currentTimeMillis))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
007
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
008 (def ^:const game-day-length
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
009 "The Java clock advances in milliseconds, which is fine.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
010 But we need game-days to be shorter than real world days.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
011 A Witcher 3 game day is 1 hour 36 minutes, or 96 minutes, which is
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
012 presumably researched. Round it up to 100 minutes for easier
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
013 calculation."
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
014 (* 100 ;; minutes per game day
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
015 60 ;; seconds per minute
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
016 1000)) ;; milliseconds per second
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
017
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
018 (defn now
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
019 "For now, we'll use Java timestamp for time; ultimately, we need a
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
020 concept of game-time which allows us to drive day/night cycle, seasons,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
021 et cetera, but what matters about time is that it is a value which
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
022 increases."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
023 []
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
024 (System/currentTimeMillis))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
025
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
026 (def ^:const canonical-ordering-of-houses
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
027 "The canonical ordering of religious houses."
|
|
</span><br/>
|
|
<span class="covered" title="10 out of 10 forms covered">
|
|
028 [:eye
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
029 :foot
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
030 :nose
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
031 :hand
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
032 :ear
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
033 :mouth
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
034 :stomach
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
035 :furrow
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
036 :plough])
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
037
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
038 (def ^:const days-of-week
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
039 "The eight-day week of the game world. This differs from the canonical
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
040 ordering of houses in that it omits the eye."
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
041 (rest canonical-ordering-of-houses))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
042
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
043 (def ^:const days-in-week
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
044 "This world has an eight day week."
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
045 (count days-of-week))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
046
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
047 (def ^:const seasons-of-year
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
048 "The ordering of seasons in the year is different from the canonical
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
049 ordering of the houses, for reasons of the agricultural cycle."
|
|
</span><br/>
|
|
<span class="covered" title="10 out of 10 forms covered">
|
|
050 [:foot
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
051 :nose
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
052 :hand
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
053 :ear
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
054 :mouth
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
055 :stomach
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
056 :plough
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
057 :furrow
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
058 :eye])
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
059
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
060 (def ^:const seasons-in-year
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
061 "Nine seasons in a year, one for each house (although the order is
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
062 different."
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
063 (count seasons-of-year))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
064
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
065 (def ^:const weeks-of-season
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
066 "To fit nine seasons of eight day weeks into 365 days, each must be of
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
067 five weeks."
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
068 [:first :second :third :fourth :fifth])
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
069
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
070 (def ^:const weeks-in-season
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
071 "To fit nine seasons of eight day weeks into 365 days, each must be of
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
072 five weeks."
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
073 (count weeks-of-season))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
074
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
075 (def ^:const days-in-season
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
076 (* weeks-in-season days-in-week))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
077
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
078 (defn game-time
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
079 "With no arguments, the current game time. If a Java `timestamp` value is
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
080 passed (as a `long`), the game time represented by that value."
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
081 ([] (game-time (now)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
082 ([timestamp]
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
083 (- timestamp game-start-time)))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
084
|
|
</span><br/>
|
|
<span class="covered" title="54 out of 54 forms covered">
|
|
085 (defmacro day-of-year
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
086 "The day of the year represented by this `game-time`, ignoring leap years."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
087 [game-time]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
088 `(mod (long (/ ~game-time game-day-length)) 365))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
089
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
090 (def waiting-day?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
091 "Does this `game-time` represent a waiting day?"
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
092 (memoize
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
093 ;; we're likely to call this several times in quick succession on the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
094 ;; same timestamp
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
095 (fn [game-time]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
096 (>=
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
097 (day-of-year game-time)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
098 (* seasons-in-year weeks-in-season days-in-week)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
099
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
100 (defn day
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
101 "Day of the eight-day week represented by this `game-time`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
102 [game-time]
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
103 (let [day-of-week (mod (day-of-year game-time) days-in-week)]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
104 (if (waiting-day? game-time)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
105 (nth weeks-of-season day-of-week)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
106 (nth days-of-week day-of-week))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
107
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
108 (defn week
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
109 "Week of season represented by this `game-time`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
110 [game-time]
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
111 (let [day-of-season (mod (day-of-year game-time) days-in-season)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
112 week (/ day-of-season days-in-week)]
|
|
</span><br/>
|
|
<span class="partial" title="4 out of 5 forms covered">
|
|
113 (if (waiting-day? game-time)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
114 :waiting
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
115 (nth weeks-of-season week))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
116
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
117 (defn season
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
118 [game-time]
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
119 (let [season (int (/ (day-of-year game-time) days-in-season))]
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
120 (if (waiting-day? game-time)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
121 :waiting
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
122 (nth seasons-of-year season))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
123
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
124 (defn date-string
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
125 "Return a correctly formatted date for this `game-time` in the calendar of
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
126 the Great Place."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
127 [game-time]
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
128 (s/join
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
129 " "
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
130 (if
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
131 (waiting-day? game-time)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
132 [(s/capitalize
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
133 (name
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
134 (nth
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
135 weeks-of-season
|
|
</span><br/>
|
|
<span class="covered" title="8 out of 8 forms covered">
|
|
136 (mod (day-of-year game-time) days-in-week))))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
137 "waiting day"]
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
138 [(s/capitalize (name (week game-time)))
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
139 (s/capitalize (name (day game-time)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
140 "of the"
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
141 (s/capitalize (name (season game-time)))])))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
142
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
143
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
144
|
|
</span><br/>
|
|
</body>
|
|
</html>
|