rust/landgen/src/maze.rs
author alfadur
Sat, 22 Feb 2025 19:39:31 +0300
changeset 16091 5febd2bc5372
parent 16073 5d302b12d837
permissions -rw-r--r--
Add server reconnection tokens and anteroom local list of used nicks
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16032
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
     1
use crate::outline_template_based::outline::OutlinePoints;
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
     2
use crate::{LandGenerationParameters, LandGenerator};
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
     3
use integral_geometry::{Point, Polygon, Rect, Size};
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
     4
use land2d::Land2D;
16058
de01be16df95 Make slider below preview affect WFC generator by skewing tile probabilities
unC0Rr
parents: 16044
diff changeset
     5
use rand::Rng;
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
     6
use vec2d::Vec2D;
16032
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
     7
16035
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
     8
#[derive(Clone)]
16032
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
     9
pub struct MazeTemplate {
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
    10
    pub width: u32,
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
    11
    pub height: u32,
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
    12
    pub cell_size: u32,
16033
1860852892c0 Use rust implementation of maze generator in engine
unC0Rr
parents: 16032
diff changeset
    13
    pub inverted: bool,
1860852892c0 Use rust implementation of maze generator in engine
unC0Rr
parents: 16032
diff changeset
    14
    pub distortion_limiting_factor: u32,
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    15
    pub braidness: u32,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    16
}
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    17
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    18
struct Maze {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    19
    inverted: bool,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    20
    braidness: u32,
16035
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
    21
    off: Point,
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    22
    num_cells: Size,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    23
    num_edges: Size,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    24
    seen_cells: Size,
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
    25
    cell_size: u32,
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
    26
    seen_list: Vec2D<Option<usize>>,
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
    27
    walls: Vec<Vec2D<bool>>,
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
    28
    edge_list: Vec<Vec2D<bool>>,
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    29
    last_cell: Vec<Point>,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    30
    came_from: Vec<Vec<Point>>,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    31
    came_from_pos: Vec<i32>,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    32
}
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    33
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    34
fn in_line(p1: &Point, p2: &Point, p3: &Point) -> bool {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    35
    p1.x == p2.x && p2.x == p3.x || p1.y == p2.y && p2.y == p3.y
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    36
}
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    37
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    38
#[derive(Clone, Copy)]
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    39
struct Direction(Point);
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    40
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    41
impl Direction {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    42
    #[inline]
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    43
    pub fn new(direction: usize) -> Self {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    44
        match direction % 4 {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    45
            0 => Self(Point::new(0, -1)),
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    46
            1 => Self(Point::new(1, 0)),
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    47
            2 => Self(Point::new(0, 1)),
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    48
            3 => Self(Point::new(-1, 0)),
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    49
            _ => panic!("Impossible"),
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    50
        }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    51
    }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    52
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    53
    #[inline]
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    54
    pub fn rotate_right(self) -> Self {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    55
        Self(self.0.rotate90())
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    56
    }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    57
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    58
    #[inline]
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    59
    pub fn rotate_left(self) -> Self {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    60
        Self(self.0.rotate270())
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    61
    }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    62
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    63
    #[inline]
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    64
    pub fn to_edge(self) -> Self {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    65
        Self(Point::new(
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    66
            if self.0.x < 0 { 0 } else { self.0.x },
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    67
            if self.0.y < 0 { 0 } else { self.0.y },
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    68
        ))
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    69
    }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    70
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    71
    #[inline]
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    72
    pub fn orientation(&self) -> usize {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    73
        if self.0.x == 0 {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    74
            0
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    75
        } else {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    76
            1
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    77
        }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    78
    }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    79
}
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    80
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    81
impl Maze {
16058
de01be16df95 Make slider below preview affect WFC generator by skewing tile probabilities
unC0Rr
parents: 16044
diff changeset
    82
    pub fn new(
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    83
        size: &Size,
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
    84
        cell_size: u32,
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    85
        num_steps: usize,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    86
        inverted: bool,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    87
        braidness: u32,
16058
de01be16df95 Make slider below preview affect WFC generator by skewing tile probabilities
unC0Rr
parents: 16044
diff changeset
    88
        random_numbers: &mut impl Rng,
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    89
    ) -> Self {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    90
        let num_cells = Size::new(
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    91
            prev_odd(size.width / cell_size),
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    92
            prev_odd(size.height / cell_size),
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    93
        );
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    94
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    95
        let num_edges = Size::new(num_cells.width - 1, num_cells.height - 1);
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    96
        let seen_cells = Size::new(num_cells.width / 2, num_cells.height / 2);
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    97
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    98
        let mut last_cell = vec![Point::diag(0); num_steps];
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
    99
        let came_from_pos = vec![0; num_steps];
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   100
        let came_from = vec![vec![Point::diag(0); num_steps]; num_cells.area() as usize];
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   101
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   102
        let seen_list = Vec2D::new(&seen_cells, None);
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   103
        let walls = vec![Vec2D::new(&seen_cells, true); 2];
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   104
        let edge_list = vec![Vec2D::new(&num_cells, false); 2];
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   105
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   106
        for current_step in 0..num_steps {
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   107
            let x = random_numbers.random_range(0..seen_cells.width as i32 - 1) / num_steps as i32;
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   108
            last_cell[current_step] = Point::new(
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   109
                x + current_step as i32 * seen_cells.width as i32 / num_steps as i32,
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   110
                random_numbers.random_range(..seen_cells.height) as i32,
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   111
            );
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   112
        }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   113
16035
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   114
        let off_x = ((size.width - num_cells.width * cell_size) / 2) as i32;
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   115
        let off_y = ((size.height - num_cells.height * cell_size) / 2) as i32;
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   116
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   117
        Self {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   118
            inverted,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   119
            braidness,
16035
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   120
            off: Point::new(off_x, off_y),
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   121
            num_cells,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   122
            num_edges,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   123
            seen_cells,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   124
            cell_size,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   125
            seen_list,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   126
            walls,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   127
            edge_list,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   128
            last_cell,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   129
            came_from,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   130
            came_from_pos,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   131
        }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   132
    }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   133
16058
de01be16df95 Make slider below preview affect WFC generator by skewing tile probabilities
unC0Rr
parents: 16044
diff changeset
   134
    fn see_cell(
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   135
        &mut self,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   136
        current_step: usize,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   137
        start_dir: Direction,
16058
de01be16df95 Make slider below preview affect WFC generator by skewing tile probabilities
unC0Rr
parents: 16044
diff changeset
   138
        random_numbers: &mut impl Rng,
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   139
    ) -> bool {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   140
        let mut dir = start_dir;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   141
        loop {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   142
            let p = self.last_cell[current_step];
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   143
            self.seen_list[p.y as usize][p.x as usize] = Some(current_step);
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   144
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   145
            let next_dir_clockwise = random_numbers.random();
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   146
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   147
            for _ in 0..5 {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   148
                let sp = p + dir.0;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   149
                let when_seen = if sp.x < 0
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   150
                    || sp.x >= self.seen_cells.width as i32
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   151
                    || sp.y < 0
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   152
                    || sp.y >= self.seen_cells.height as i32
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   153
                {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   154
                    Some(current_step)
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   155
                } else {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   156
                    self.seen_list[sp.y as usize][sp.x as usize]
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   157
                };
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   158
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   159
                match when_seen {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   160
                    Some(a) if a == current_step => {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   161
                        // try another direction
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   162
                        if !self.inverted && random_numbers.random_range(..self.braidness) == 0 {
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   163
                            if dir.0.x == -1 && p.x > 0 {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   164
                                self.walls[dir.orientation()][p.y as usize][p.x as usize - 1] =
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   165
                                    false;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   166
                            }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   167
                            if dir.0.x == 1 && p.x < self.seen_cells.width as i32 - 1 {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   168
                                self.walls[dir.orientation()][p.y as usize][p.x as usize] = false;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   169
                            }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   170
                            if dir.0.y == -1 && p.y > 0 {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   171
                                self.walls[dir.orientation()][p.y as usize - 1][p.x as usize] =
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   172
                                    false;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   173
                            }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   174
                            if dir.0.y == 1 && p.y < self.seen_cells.height as i32 - 1 {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   175
                                self.walls[dir.orientation()][p.y as usize][p.x as usize] = false;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   176
                            }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   177
                        }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   178
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   179
                        if next_dir_clockwise {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   180
                            dir = dir.rotate_right();
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   181
                        } else {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   182
                            dir = dir.rotate_left();
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   183
                        }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   184
                    }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   185
                    None => {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   186
                        // cell was not seen yet, go there
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   187
                        let o_dir = dir.rotate_right().rotate_right();
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   188
                        let op = p - o_dir.to_edge().0;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   189
                        self.walls[o_dir.orientation()][op.y as usize][op.x as usize] = false;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   190
                        self.last_cell[current_step] = sp;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   191
                        self.came_from_pos[current_step] += 1;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   192
                        self.came_from[self.came_from_pos[current_step] as usize][current_step] = p;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   193
                        return false;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   194
                    }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   195
                    _ => {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   196
                        return true;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   197
                    }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   198
                }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   199
            }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   200
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   201
            self.last_cell[current_step] =
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   202
                self.came_from[self.came_from_pos[current_step] as usize][current_step];
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   203
            self.came_from_pos[current_step] -= 1;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   204
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   205
            if self.came_from_pos[current_step] < 0 {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   206
                return true;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   207
            }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   208
        }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   209
    }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   210
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   211
    fn add_vertex(&mut self, p: Point, polygon: &mut Vec<Point>) {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   212
        let [x, y] = [p.x, p.y].map(|i| {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   213
            if self.inverted || i & 1 == 0 {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   214
                self.cell_size
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   215
            } else {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   216
                self.cell_size * 2 / 3
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   217
            }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   218
        });
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   219
        let new_point = Point::new(
16035
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   220
            (p.x - 1) * self.cell_size as i32 + x as i32 + self.off.x,
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   221
            (p.y - 1) * self.cell_size as i32 + y as i32 + self.off.y,
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   222
        );
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   223
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   224
        let nv = polygon.len();
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   225
        if nv > 2 {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   226
            if in_line(&polygon[nv - 2], &polygon[nv - 1], &new_point) {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   227
                polygon.pop();
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   228
            }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   229
        }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   230
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   231
        polygon.push(new_point);
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   232
    }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   233
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   234
    fn add_edge(&mut self, p: Point, mut dir: Direction, polygon: &mut Vec<Point>) {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   235
        let mut next_p = Some(p);
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   236
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   237
        while let Some(p) = next_p {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   238
            next_p = None;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   239
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   240
            for _ in 0..4 {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   241
                let cdir = dir.to_edge();
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   242
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   243
                let np = p + cdir.0;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   244
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   245
                if np.x >= 0
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   246
                    && np.y >= 0
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   247
                    && np.x < self.num_cells.width as i32
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   248
                    && np.y < self.num_cells.height as i32
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   249
                    && self.edge_list[dir.orientation()][np.y as usize][np.x as usize]
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   250
                {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   251
                    self.edge_list[dir.orientation()][np.y as usize][np.x as usize] = false;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   252
                    self.add_vertex(p + dir.0 + Point::new(1, 1), polygon);
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   253
                    next_p = Some(p + dir.0);
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   254
                    break;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   255
                }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   256
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   257
                dir = dir.rotate_right();
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   258
            }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   259
        }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   260
    }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   261
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   262
    pub fn to_islands(mut self) -> (Vec<Polygon>, Vec<Point>) {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   263
        let mut islands: Vec<Polygon> = vec![];
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   264
        let mut polygon: Vec<Point> = vec![];
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   265
        let mut maze = Vec2D::new(&self.num_cells, false);
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   266
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   267
        for x in 0..self.seen_cells.width as usize {
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   268
            for y in 0..self.seen_cells.height as usize {
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   269
                if self.seen_list[y][x].is_some() {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   270
                    maze[y * 2 + 1][x * 2 + 1] = true;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   271
                }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   272
            }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   273
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   274
            for y in 0..self.seen_cells.height as usize - 1 {
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   275
                if !self.walls[0][y][x] {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   276
                    maze[y * 2 + 2][x * 2 + 1] = true;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   277
                }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   278
            }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   279
        }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   280
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   281
        for x in 0..self.seen_cells.width as usize - 1 {
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   282
            for y in 0..self.seen_cells.height as usize {
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   283
                if !self.walls[1][y][x] {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   284
                    maze[y * 2 + 1][x * 2 + 2] = true;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   285
                }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   286
            }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   287
        }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   288
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   289
        for x in 0..self.num_edges.width as usize {
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   290
            for y in 0..self.num_cells.height as usize {
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   291
                self.edge_list[0][y][x] = maze[y][x] != maze[y][x + 1];
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   292
            }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   293
        }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   294
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   295
        for x in 0..self.num_cells.width as usize {
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   296
            for y in 0..self.num_edges.height as usize {
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   297
                self.edge_list[1][y][x] = maze[y][x] != maze[y + 1][x];
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   298
            }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   299
        }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   300
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   301
        let mut fill_points = vec![];
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   302
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   303
        for x in 0..self.num_edges.width as usize {
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   304
            for y in 0..self.num_cells.height as usize {
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   305
                if self.edge_list[0][y][x] {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   306
                    self.edge_list[0][y][x] = false;
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   307
                    self.add_vertex(Point::new(x as i32 + 1, y as i32 + 1), &mut polygon);
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   308
                    self.add_vertex(Point::new(x as i32 + 1, y as i32), &mut polygon);
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   309
                    self.add_edge(
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   310
                        Point::new(x as i32, y as i32 - 1),
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   311
                        Direction::new(0),
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   312
                        &mut polygon,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   313
                    );
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   314
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   315
                    if polygon.len() > 4 {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   316
                        if in_line(polygon.last().unwrap(), &polygon[0], &polygon[1]) {
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   317
                            polygon.pop();
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   318
                        }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   319
16035
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   320
                        for p in &polygon {
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   321
                            println!("{} {}", p.x, p.y);
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   322
                        }
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   323
                        println!("\ne\n");
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   324
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   325
                        islands.push(Polygon::new(&polygon));
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   326
                    }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   327
                    polygon.clear();
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   328
                }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   329
            }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   330
        }
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   331
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   332
        for x in 0..self.num_cells.width as usize {
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   333
            for y in 0..self.num_cells.height as usize {
16035
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   334
                if maze[y][x] {
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   335
                    let half_cell = self.cell_size / 2;
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   336
                    let fill_point = Point::new(
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   337
                        (x as u32 * self.cell_size + half_cell) as i32 + self.off.x,
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   338
                        (y as u32 * self.cell_size + half_cell) as i32 + self.off.y,
16035
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   339
                    );
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   340
                    islands.push(Polygon::new(&[fill_point]));
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   341
                    fill_points.push(fill_point);
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   342
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   343
                    let mut points = vec![(x, y)];
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   344
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   345
                    while let Some((x, y)) = points.pop() {
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   346
                        if maze[y][x] {
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   347
                            maze[y][x] = false;
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   348
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   349
                            if x > 0 {
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   350
                                points.push((x - 1, y));
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   351
                            }
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   352
                            if x < self.num_cells.width as usize - 1 {
16035
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   353
                                points.push((x + 1, y));
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   354
                            }
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   355
                            if y > 0 {
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   356
                                points.push((x, y - 1));
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   357
                            }
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   358
                            if y < self.num_cells.height as usize - 1 {
16035
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   359
                                points.push((x, y + 1));
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   360
                            }
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   361
                        }
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   362
                    }
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   363
                }
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   364
            }
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   365
        }
0caa3dfb3ba2 Add templates for different maze styles
unC0Rr
parents: 16034
diff changeset
   366
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   367
        (islands, fill_points)
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   368
    }
16032
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   369
}
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   370
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   371
pub struct MazeLandGenerator {
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   372
    maze_template: MazeTemplate,
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   373
}
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   374
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   375
fn prev_odd(num: u32) -> u32 {
16032
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   376
    if num & 1 == 0 {
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   377
        num - 1
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   378
    } else {
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   379
        num
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   380
    }
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   381
}
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   382
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   383
impl MazeLandGenerator {
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   384
    pub fn new(maze_template: MazeTemplate) -> Self {
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   385
        Self { maze_template }
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   386
    }
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   387
16058
de01be16df95 Make slider below preview affect WFC generator by skewing tile probabilities
unC0Rr
parents: 16044
diff changeset
   388
    fn generate_outline(
16032
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   389
        &self,
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   390
        size: &Size,
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   391
        play_box: Rect,
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   392
        intersections_box: Rect,
16058
de01be16df95 Make slider below preview affect WFC generator by skewing tile probabilities
unC0Rr
parents: 16044
diff changeset
   393
        random_numbers: &mut impl Rng,
16032
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   394
    ) -> OutlinePoints {
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   395
        let num_steps = if self.maze_template.inverted { 3 } else { 1 };
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   396
        let mut step_done = vec![false; num_steps];
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   397
        let mut done = false;
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   398
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   399
        let mut maze = Maze::new(
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   400
            &size,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   401
            self.maze_template.cell_size,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   402
            num_steps,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   403
            self.maze_template.inverted,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   404
            self.maze_template.braidness,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   405
            random_numbers,
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   406
        );
16032
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   407
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   408
        while !done {
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   409
            done = true;
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   410
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   411
            for current_step in 0..num_steps {
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   412
                if !step_done[current_step] {
16073
5d302b12d837 - Update landgen to use the latest rand crate
unC0Rr
parents: 16058
diff changeset
   413
                    let dir = Direction::new(random_numbers.random_range(..4));
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   414
                    step_done[current_step] = maze.see_cell(current_step, dir, random_numbers);
16032
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   415
                    done = false;
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   416
                }
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   417
            }
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   418
        }
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   419
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   420
        let (islands, fill_points) = maze.to_islands();
16032
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   421
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   422
        OutlinePoints {
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   423
            islands,
16044
5c941f5deeec * Introduce concept of invizible walls to constrain outline map generation
unC0Rr
parents: 16035
diff changeset
   424
            walls: vec![],
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   425
            fill_points,
16032
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   426
            size: *size,
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   427
            play_box,
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   428
            intersections_box,
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   429
        }
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   430
    }
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   431
}
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   432
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   433
impl LandGenerator for MazeLandGenerator {
16058
de01be16df95 Make slider below preview affect WFC generator by skewing tile probabilities
unC0Rr
parents: 16044
diff changeset
   434
    fn generate_land<T: Copy + PartialEq + Default>(
16032
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   435
        &self,
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   436
        parameters: &LandGenerationParameters<T>,
16058
de01be16df95 Make slider below preview affect WFC generator by skewing tile probabilities
unC0Rr
parents: 16044
diff changeset
   437
        random_numbers: &mut impl Rng,
16032
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   438
    ) -> Land2D<T> {
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   439
        let do_invert = self.maze_template.inverted;
16032
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   440
        let (basic, zero) = if do_invert {
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   441
            (parameters.zero, parameters.basic)
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   442
        } else {
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   443
            (parameters.basic, parameters.zero)
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   444
        };
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   445
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   446
        let land_size = Size::new(self.maze_template.width, self.maze_template.height);
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   447
        let mut land = Land2D::new(&land_size, basic);
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   448
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   449
        let mut points = self.generate_outline(
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   450
            &land.size().size(),
16034
09beeec033ba Sanitize maze mapgen code a bit
unC0Rr
parents: 16033
diff changeset
   451
            land.play_box(), //??? Rect::at_origin(land_size).with_margin(land_size.to_square().width as i32 * -2),
16032
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   452
            land.play_box(),
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   453
            random_numbers,
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   454
        );
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   455
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   456
        if !parameters.skip_distort {
16044
5c941f5deeec * Introduce concept of invizible walls to constrain outline map generation
unC0Rr
parents: 16035
diff changeset
   457
            points.distort(
5c941f5deeec * Introduce concept of invizible walls to constrain outline map generation
unC0Rr
parents: 16035
diff changeset
   458
                parameters.distance_divisor,
5c941f5deeec * Introduce concept of invizible walls to constrain outline map generation
unC0Rr
parents: 16035
diff changeset
   459
                self.maze_template.distortion_limiting_factor,
5c941f5deeec * Introduce concept of invizible walls to constrain outline map generation
unC0Rr
parents: 16035
diff changeset
   460
                random_numbers,
5c941f5deeec * Introduce concept of invizible walls to constrain outline map generation
unC0Rr
parents: 16035
diff changeset
   461
            );
16032
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   462
        }
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   463
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   464
        if !parameters.skip_bezier {
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   465
            points.bezierize(5);
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   466
        }
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   467
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   468
        points.draw(&mut land, zero);
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   469
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   470
        for p in &points.fill_points {
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   471
            land.fill(*p, zero, zero)
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   472
        }
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   473
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   474
        land
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   475
    }
31cc1e450273 Add maze land generator ported from pascal engine
unC0Rr
parents:
diff changeset
   476
}