561 lines
38 KiB
HTML
561 lines
38 KiB
HTML
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<link rel="stylesheet" href="../coverage.css"/> <title> mw_engine/natural_rules.clj </title>
|
|
</head>
|
|
<body>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
001 (ns ^{:doc "A set of MicroWorld rules describing a simplified natural ecosystem.
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
002
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
003 Since the completion of the rule language this is more or less obsolete -
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
004 there are still a few things that you can do with rules written in Clojure
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
005 that you can't do in the rule language, but not many and I doubt they're
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
006 important. "
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
007 :author " Simon Brooke "}
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
008 mw-engine.natural-rules
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
009 (:require [mw-engine.utils :refer [get-int get-neighbours get-neighbours-with-state member?]]))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
010
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
011 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
012 ;;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
013 ;;;; mw-engine: the state/transition engine of MicroWorld.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
014 ;;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
015 ;;;; This program is free software; you can redistribute it and/or
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
016 ;;;; modify it under the terms of the GNU General Public License
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
017 ;;;; as published by the Free Software Foundation; either version 2
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
018 ;;;; of the License, or (at your option) any later version.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
019 ;;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
020 ;;;; This program is distributed in the hope that it will be useful,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
021 ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
022 ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
023 ;;;; GNU General Public License for more details.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
024 ;;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
025 ;;;; You should have received a copy of the GNU General Public License
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
026 ;;;; along with this program; if not, write to the Free Software
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
027 ;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
028 ;;;; USA.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
029 ;;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
030 ;;;; Copyright (C) 2014 Simon Brooke
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
031 ;;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
032 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
033
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
034 ;; treeline at arbitrary altitude.
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
035 (def treeline 150)
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
036
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
037 ;; waterline also at arbitrary altitude.
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
038 (def waterline 10)
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
039
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
040 ;; and finally snowline is also arbitrary.
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
041 (def snowline 200)
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
042
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
043 ;; Rare chance of lightning strikes
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
044 (def lightning-probability 500)
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
045
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
046 ;; rules describing vegetation
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
047 (def vegetation-rules
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
048 (list
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
049 ;; Randomly, birds plant tree seeds into grassland.
|
|
</span><br/>
|
|
<span class="partial" title="1 out of 23 forms covered">
|
|
050 (fn [cell _] (cond (and (= (:state cell) :grassland)(< (rand 10) 1))(merge cell {:state :heath})))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
051 ;; heath below the treeline grows gradually into forest, providing browsing pressure is not to high
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
052 (fn [cell _]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 11 forms covered">
|
|
053 (cond (and
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
054 (= (:state cell) :heath)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
055 ;; browsing limit really ought to vary with soil fertility, but...
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 11 forms covered">
|
|
056 (< (+ (get-int cell :deer)(get-int cell :sheep)) 6)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
057 (< (get-int cell :altitude) treeline))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
058 (merge cell {:state :scrub})))
|
|
</span><br/>
|
|
<span class="partial" title="1 out of 14 forms covered">
|
|
059 (fn [cell _] (cond (= (:state cell) :scrub) (merge cell {:state :forest})))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
060 ;; Forest on fertile land grows to climax
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
061 (fn [cell _]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
062 (cond
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
063 (and
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
064 (= (:state cell) :forest)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
065 (> (get-int cell :fertility) 10))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
066 (merge cell {:state :climax})))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
067 ;; Climax forest occasionally catches fire (e.g. lightning strikes)
|
|
</span><br/>
|
|
<span class="partial" title="1 out of 23 forms covered">
|
|
068 (fn [cell _] (cond (and (= (:state cell) :climax)(< (rand lightning-probability) 1)) (merge cell {:state :fire})))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
069 ;; Climax forest neighbouring fires is likely to catch fire
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
070 (fn [cell world]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
071 (cond
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 14 forms covered">
|
|
072 (and (= (:state cell) :climax)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
073 (< (rand 3) 1)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 14 forms covered">
|
|
074 (not (empty? (get-neighbours-with-state world (:x cell) (:y cell) 1 :fire))))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
075 (merge cell {:state :fire})))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
076 ;; After fire we get waste
|
|
</span><br/>
|
|
<span class="partial" title="1 out of 14 forms covered">
|
|
077 (fn [cell _] (cond (= (:state cell) :fire) (merge cell {:state :waste})))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
078 ;; And after waste we get pioneer species; if there's a woodland seed
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
079 ;; source, it's going to be heath, otherwise grassland.
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
080 (fn [cell world]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
081 (cond
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 10 forms covered">
|
|
082 (and (= (:state cell) :waste)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
083 (not
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
084 (empty?
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
085 (flatten
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
086 (list
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 11 forms covered">
|
|
087 (get-neighbours-with-state world (:x cell) (:y cell) 1 :scrub)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 11 forms covered">
|
|
088 (get-neighbours-with-state world (:x cell) (:y cell) 1 :forest)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 11 forms covered">
|
|
089 (get-neighbours-with-state world (:x cell) (:y cell) 1 :climax))))))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
090 (merge cell {:state :heath})))
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
091 (fn [cell _]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
092 (cond (= (:state cell) :waste)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
093 (merge cell {:state :grassland})))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
094 ;; Forest increases soil fertility
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
095 (fn [cell _]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
096 (cond (member? (:state cell) '(:forest :climax))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 11 forms covered">
|
|
097 (merge cell {:fertility (+ (get-int cell :fertility) 1)})))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
098
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
099
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
100 ;; rules describing herbivore behaviour
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
101 (def herbivore-rules
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
102 (list
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
103 ;; if there are too many deer for the fertility of the area to sustain,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
104 ;; some die or move on.
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
105 (fn [cell _]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 11 forms covered">
|
|
106 (cond (> (get-int cell :deer) (get-int cell :fertility))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
107 (merge cell {:deer (get-int cell :fertility)})))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
108 ;; deer arrive occasionally at the edge of the map.
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
109 (fn [cell world]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 23 forms covered">
|
|
110 (cond (and (< (count (get-neighbours world cell)) 8)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
111 (< (rand 50) 1)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
112 (> (get-int cell :fertility) 0)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
113 (= (get-int cell :deer) 0))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
114 (merge cell {:deer 2})))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
115 ;; deer gradually spread through the world by breeding or migrating.
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
116 (fn [cell world]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 15 forms covered">
|
|
117 (let [n (apply + (map #(get-int % :deer) (get-neighbours world cell)))]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 12 forms covered">
|
|
118 (cond (and
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
119 (> (get-int cell :fertility) 0)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
120 (= (get-int cell :deer) 0)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
121 (>= n 2))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
122 (merge cell {:deer (int (/ n 2))}))))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
123 ;; deer breed.
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
124 (fn [cell _]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
125 (cond
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
126 (>= (get-int cell :deer) 2)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 11 forms covered">
|
|
127 (merge cell {:deer (int (* (:deer cell) 2))})))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
128
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
129 ;; rules describing predator behaviour
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
130 (def predator-rules
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
131 (list
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
132 ;; wolves eat deer
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
133 (fn [cell _]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
134 (cond
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
135 (>= (get-int cell :wolves) 1)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 16 forms covered">
|
|
136 (merge cell {:deer (max 0 (- (get-int cell :deer) (get-int cell :wolves)))})))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
137 ;; ;; not more than eight wolves in a pack, for now (hack because wolves are not dying)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
138 ;; (fn [cell world]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
139 ;; (cond (> (get-int cell :wolves) 8) (merge cell {:wolves 8})))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
140 ;; if there are not enough deer to sustain the get-int of wolves,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
141 ;; some wolves die or move on. (doesn't seem to be working?)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
142 (fn [cell _]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 11 forms covered">
|
|
143 (cond (> (get-int cell :wolves) (get-int cell :deer))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
144 (merge cell {:wolves 0})))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
145 ;; wolves arrive occasionally at the edge of the map.
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
146 (fn [cell world]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 23 forms covered">
|
|
147 (cond (and (< (count (get-neighbours world cell)) 8)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
148 (< (rand 50) 1)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
149 (not (= (:state cell) :water))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
150 (= (get-int cell :wolves) 0))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
151 (merge cell {:wolves 2})))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
152 ;; wolves gradually spread through the world by breeding or migrating.
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
153 (fn [cell world]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 15 forms covered">
|
|
154 (let [n (apply + (map #(get-int % :wolves) (get-neighbours world cell)))]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 12 forms covered">
|
|
155 (cond (and
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
156 (not (= (:state cell) :water))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
157 (= (get-int cell :wolves) 0)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
158 (>= n 2))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
159 (merge cell {:wolves 2}))))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
160 ;; wolves breed.
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
161 (fn [cell _]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
162 (cond
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
163 (>= (get-int cell :wolves) 2)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 11 forms covered">
|
|
164 (merge cell {:wolves (int (* (:wolves cell) 2))})))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
165
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
166
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
167 ;; rules which initialise the world
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
168 (def init-rules
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
169 (list
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
170 ;; below the waterline, we have water.
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
171 (fn [cell _]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 23 forms covered">
|
|
172 (cond (and (= (:state cell) :new) (< (get-int cell :altitude) waterline)) (merge cell {:state :water})))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
173 ;; above the snowline, we have snow.
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
174 (fn [cell _]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 23 forms covered">
|
|
175 (cond (and (= (:state cell) :new) (> (get-int cell :altitude) snowline)) (merge cell {:state :snow})))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
176 ;; in between, we have a wasteland.
|
|
</span><br/>
|
|
<span class="partial" title="1 out of 14 forms covered">
|
|
177 (fn [cell _] (cond (= (:state cell) :new) (merge cell {:state :grassland})))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
178
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
179
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
180 (def natural-rules (flatten
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
181 (list
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
182 vegetation-rules
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
183 herbivore-rules
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
184 predator-rules)))
|
|
</span><br/>
|
|
</body>
|
|
</html>
|