author | unC0Rr |
Tue, 28 Jan 2025 15:49:45 +0100 | |
changeset 16073 | 5d302b12d837 |
parent 16058 | de01be16df95 |
permissions | -rw-r--r-- |
15922
da6b67f13c12
Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
15921
diff
changeset
|
1 |
use super::{outline::OutlinePoints, outline_template::OutlineTemplate}; |
da6b67f13c12
Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
15921
diff
changeset
|
2 |
use crate::{LandGenerationParameters, LandGenerator}; |
14026 | 3 |
use land2d::Land2D; |
16058
de01be16df95
Make slider below preview affect WFC generator by skewing tile probabilities
unC0Rr
parents:
16044
diff
changeset
|
4 |
use rand::Rng; |
14066
649ccb9f8cfd
Commit broken code for divide_edges in hope for salvation
unc0rr
parents:
14054
diff
changeset
|
5 |
|
14054
3185fb34f3b5
update theme editor to use new land generator implementation
alfadur
parents:
14052
diff
changeset
|
6 |
pub struct TemplatedLandGenerator { |
14026 | 7 |
outline_template: OutlineTemplate, |
8 |
} |
|
9 |
||
10 |
impl TemplatedLandGenerator { |
|
14051
8a0d69c16cad
Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents:
14026
diff
changeset
|
11 |
pub fn new(outline_template: OutlineTemplate) -> Self { |
14026 | 12 |
Self { outline_template } |
13 |
} |
|
14 |
} |
|
15 |
||
16 |
impl LandGenerator for TemplatedLandGenerator { |
|
16058
de01be16df95
Make slider below preview affect WFC generator by skewing tile probabilities
unC0Rr
parents:
16044
diff
changeset
|
17 |
fn generate_land<T: Copy + PartialEq + Default>( |
14026 | 18 |
&self, |
14121 | 19 |
parameters: &LandGenerationParameters<T>, |
16058
de01be16df95
Make slider below preview affect WFC generator by skewing tile probabilities
unC0Rr
parents:
16044
diff
changeset
|
20 |
random_numbers: &mut impl Rng, |
14026 | 21 |
) -> Land2D<T> { |
16029 | 22 |
let do_invert = self.outline_template.is_negative |
16073 | 23 |
&& (!self.outline_template.can_invert || random_numbers.random()); |
16029 | 24 |
let (basic, zero) = if do_invert { |
25 |
(parameters.zero, parameters.basic) |
|
26 |
} else { |
|
27 |
(parameters.basic, parameters.zero) |
|
28 |
}; |
|
29 |
||
30 |
let mut land = Land2D::new(&self.outline_template.size, basic); |
|
14026 | 31 |
|
14100 | 32 |
let mut points = OutlinePoints::from_outline_template( |
33 |
&self.outline_template, |
|
34 |
land.play_box(), |
|
15828 | 35 |
land.size().size(), |
14100 | 36 |
random_numbers, |
37 |
); |
|
14051
8a0d69c16cad
Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents:
14026
diff
changeset
|
38 |
|
8a0d69c16cad
Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents:
14026
diff
changeset
|
39 |
// mirror |
16073 | 40 |
if self.outline_template.can_mirror && random_numbers.random() { |
16058
de01be16df95
Make slider below preview affect WFC generator by skewing tile probabilities
unC0Rr
parents:
16044
diff
changeset
|
41 |
points.mirror(); |
14026 | 42 |
} |
43 |
||
14051
8a0d69c16cad
Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents:
14026
diff
changeset
|
44 |
// flip |
16073 | 45 |
if self.outline_template.can_flip && random_numbers.random() { |
16058
de01be16df95
Make slider below preview affect WFC generator by skewing tile probabilities
unC0Rr
parents:
16044
diff
changeset
|
46 |
points.flip(); |
14051
8a0d69c16cad
Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents:
14026
diff
changeset
|
47 |
} |
8a0d69c16cad
Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents:
14026
diff
changeset
|
48 |
|
14121 | 49 |
if !parameters.skip_distort { |
16073 | 50 |
let distortion_limiting_factor = 100 + random_numbers.random_range(0..8) * 10; |
16035 | 51 |
|
16044
5c941f5deeec
* Introduce concept of invizible walls to constrain outline map generation
unC0Rr
parents:
16035
diff
changeset
|
52 |
points.distort( |
5c941f5deeec
* Introduce concept of invizible walls to constrain outline map generation
unC0Rr
parents:
16035
diff
changeset
|
53 |
parameters.distance_divisor, |
5c941f5deeec
* Introduce concept of invizible walls to constrain outline map generation
unC0Rr
parents:
16035
diff
changeset
|
54 |
distortion_limiting_factor, |
5c941f5deeec
* Introduce concept of invizible walls to constrain outline map generation
unC0Rr
parents:
16035
diff
changeset
|
55 |
random_numbers, |
5c941f5deeec
* Introduce concept of invizible walls to constrain outline map generation
unC0Rr
parents:
16035
diff
changeset
|
56 |
); |
14121 | 57 |
} |
58 |
||
59 |
if !parameters.skip_bezier { |
|
14140 | 60 |
points.bezierize(5); |
14121 | 61 |
} |
14051
8a0d69c16cad
Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents:
14026
diff
changeset
|
62 |
|
16029 | 63 |
points.draw(&mut land, zero); |
14051
8a0d69c16cad
Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents:
14026
diff
changeset
|
64 |
|
14066
649ccb9f8cfd
Commit broken code for divide_edges in hope for salvation
unc0rr
parents:
14054
diff
changeset
|
65 |
for p in &points.fill_points { |
16029 | 66 |
land.fill(*p, zero, zero) |
14051
8a0d69c16cad
Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents:
14026
diff
changeset
|
67 |
} |
8a0d69c16cad
Implement OutlinePoints for land generators, some ground work for template based landgen
unc0rr
parents:
14026
diff
changeset
|
68 |
|
16029 | 69 |
points.draw(&mut land, basic); |
14026 | 70 |
|
71 |
land |
|
72 |
} |
|
73 |
} |