whittaker_map_generator/steppers/
direction.rs1use 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 dirs.push(MoveDirection { x: 0, y: -1 });
36 dirs.push(MoveDirection { x: 0, y: 1 });
38 dirs.push(MoveDirection { x: 1, y: 0 });
40 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 dirs.push(MoveDirection { x: -1, y: -1 });
50 dirs.push(MoveDirection { x: 1, y: -1 });
52 dirs.push(MoveDirection { x: 1, y: 1 });
54 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}