|
3 | 3 | (require vraid/flow |
4 | 4 | vraid/sorted-tree |
5 | 5 | "../grid-base.rkt" |
6 | | - "../terrain.rkt" |
7 | | - "terrain-data.rkt") |
| 6 | + "../terrain.rkt") |
8 | 7 |
|
9 | 8 | (provide planet/rivers) |
10 | 9 |
|
11 | | -(: bad-river-end? (planet-terrain Integer -> Boolean)) |
12 | | -(define (bad-river-end? planet n) |
13 | | - (and (corner-land? planet n) |
14 | | - (not (corner-river-direction planet n)))) |
15 | | - |
16 | | -(: has-bad-ends? (planet-terrain -> Boolean)) |
17 | | -(define (has-bad-ends? planet) |
18 | | - (ormap (curry bad-river-end? planet) |
19 | | - (range (corner-count planet)))) |
20 | | - |
21 | | -(: lowest-nearby (planet-terrain Integer -> Float)) |
22 | | -(define (lowest-nearby planet n) |
23 | | - (foldl min |
24 | | - +inf.0 |
25 | | - (map (curry corner-elevation planet) |
26 | | - (grid-corner-corner-list planet n)))) |
27 | | - |
28 | | -(: highest-nearby (planet-terrain Integer -> Float)) |
29 | | -(define (highest-nearby planet n) |
30 | | - (foldl max |
31 | | - -inf.0 |
32 | | - (map (curry corner-elevation planet) |
33 | | - (grid-corner-corner-list planet n)))) |
34 | | - |
35 | | -(: elevate-ends! (planet-terrain -> Void)) |
36 | | -(define (elevate-ends! planet) |
37 | | - (for ([n (corner-count planet)]) |
38 | | - (when (bad-river-end? planet n) |
39 | | - ((corner-terrain-data-elevation-set! (planet-terrain-corner planet)) |
40 | | - n |
41 | | - (* 1.01 (highest-nearby planet n)))))) |
42 | | - |
43 | 10 | (define-type corner-node (Pair Integer Float)) |
44 | 11 |
|
45 | 12 | (: ref (All (A) ((Vectorof A) -> (Integer -> A)))) |
|
130 | 97 |
|
131 | 98 | (: planet/rivers (planet-terrain -> planet-terrain)) |
132 | 99 | (define (planet/rivers p) |
133 | | - (let* ([tiles (make-tile-terrain-data (tile-count p) |
134 | | - (curry tile-elevation p) |
135 | | - (curry tile-water-level p))] |
136 | | - [corners (make-corner-terrain-data (corner-count p) |
137 | | - (curry corner-elevation p) |
138 | | - (curry corner-river-direction p))] |
| 100 | + (let* ([tiles ((build-tile-terrain-data (tile-count p)) |
| 101 | + #:elevation (curry tile-elevation p) |
| 102 | + #:water-level (curry tile-water-level p))] |
| 103 | + [corners ((build-corner-terrain-data (corner-count p)) |
| 104 | + #:elevation (curry corner-elevation p) |
| 105 | + #:river-direction (curry corner-river-direction p))] |
139 | 106 | [p (planet-terrain/kw |
140 | 107 | #:planet-geometry p |
141 | 108 | #:sea-level (planet-sea-level p) |
|
145 | 112 | (set-directions/floodfill! p) |
146 | 113 | (struct-copy planet-terrain p |
147 | 114 | [rivers (river-trees p)]))) |
148 | | - |
149 | | -; direction is -1 if no neighbouring corner has lower elevation |
150 | | -(: lowest-corner-direction (planet-terrain Integer -> Fixnum)) |
151 | | -(define (lowest-corner-direction planet n) |
152 | | - (let* ([elevation (λ ([n : Integer]) |
153 | | - (corner-elevation planet n))] |
154 | | - [index/elevation (λ ([i : Fixnum]) |
155 | | - (cons i (elevation |
156 | | - (corner-corner planet n i))))] |
157 | | - [indices/elevation (map index/elevation |
158 | | - '(0 1 2))]) |
159 | | - (car (argmin (λ ([p : (Pair Fixnum Float)]) |
160 | | - (cdr p)) |
161 | | - (cons (cons -1 (elevation n)) |
162 | | - indices/elevation))))) |
0 commit comments