whittaker_map_generator/steppers/
direction.rs

1use rand::Rng;
2use rand_pcg::Pcg64;
3
4use super::move_direction::MoveDirection;
5
6#[derive(Copy, Clone, Debug)]
7pub enum Direction {
8    North,
9    South,
10    East,
11    West,
12    NorthWest,
13    NorthEast,
14    SouthWest,
15    SouthEast,
16}
17
18impl Direction {
19    pub fn get_move_direction(&self) -> MoveDirection {
20        match self {
21            Direction::North => MoveDirection { x: 0, y: -1 },
22            Direction::NorthWest => MoveDirection { x: -1, y: -1 },
23            Direction::NorthEast => MoveDirection { x: 1, y: -1 },
24            Direction::South => MoveDirection { x: 0, y: 1 },
25            Direction::SouthEast => MoveDirection { x: 1, y: 1 },
26            Direction::SouthWest => MoveDirection { x: -1, y: 1 },
27            Direction::East => MoveDirection { x: 1, y: 0 },
28            Direction::West => MoveDirection { x: -1, y: 0 },
29        }
30    }
31
32    pub fn get_standard_directions() -> Vec<MoveDirection> {
33        let mut dirs: Vec<MoveDirection> = Vec::with_capacity(4);
34        // North
35        dirs.push(MoveDirection { x: 0, y: -1 });
36        // South
37        dirs.push(MoveDirection { x: 0, y: 1 });
38        // East
39        dirs.push(MoveDirection { x: 1, y: 0 });
40        // West
41        dirs.push(MoveDirection { x: -1, y: 0 });
42
43        dirs
44    }
45
46    pub fn get_extended_directions() -> Vec<MoveDirection> {
47        let mut dirs: Vec<MoveDirection> = Vec::from(Direction::get_standard_directions());
48        // NorthWest
49        dirs.push(MoveDirection { x: -1, y: -1 });
50        // NorthEast
51        dirs.push(MoveDirection { x: 1, y: -1 });
52        // SouthEast
53        dirs.push(MoveDirection { x: 1, y: 1 });
54        // SouthWest
55        dirs.push(MoveDirection { x: -1, y: 1 });
56
57        dirs
58    }
59}
60
61pub fn pick_random_direction(rng: &mut Pcg64, exlude_directions: Vec<MoveDirection>) -> MoveDirection {
62    let mut dirs = Direction::get_standard_directions();
63    dirs = dirs.into_iter().filter(|a| !exlude_directions.contains(a)).collect();
64    dirs[rng.gen_range(0..dirs.len())]
65}