<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="3 out of 3 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="3 out of 3 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="3 out of 3 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="4 out of 4 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="4 out of 4 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="63 out of 63 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="2 out of 2 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="4 out of 4 forms covered"> 105 (nth weeks-of-season day-of-week) </span><br/> <span class="covered" title="4 out of 4 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="4 out of 4 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="4 out of 4 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="11 out of 11 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="4 out of 4 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="2 out of 2 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>