Skip to main content

asterion_core/
direction.rs

1use strum_macros::{Display, EnumIter};
2
3#[derive(Debug, Copy, Clone, Display, PartialEq, Eq, Hash, EnumIter)]
4pub enum Direction {
5    North,
6    East,
7    South,
8    West,
9    NorthEast,
10    SouthEast,
11    SouthWest,
12    NorthWest,
13}
14
15impl Direction {
16    pub fn opposite(&self) -> Self {
17        match self {
18            Self::North => Self::South,
19            Self::East => Self::West,
20            Self::South => Self::North,
21            Self::West => Self::East,
22            Self::NorthEast => Self::SouthWest,
23            Self::SouthWest => Self::NorthEast,
24            Self::SouthEast => Self::NorthWest,
25            Self::NorthWest => Self::SouthEast,
26        }
27    }
28
29    pub fn as_offset(&self) -> (isize, isize) {
30        match self {
31            Self::North => (0, -1),
32            Self::East => (1, 0),
33            Self::South => (0, 1),
34            Self::West => (-1, 0),
35            Self::NorthEast => (1, -1),
36            Self::SouthEast => (1, 1),
37            Self::SouthWest => (-1, 1),
38            Self::NorthWest => (-1, -1),
39        }
40    }
41
42    pub fn rotate_clockwise(&self) -> Self {
43        match self {
44            Self::North => Self::NorthEast,
45            Self::East => Self::SouthEast,
46            Self::South => Self::SouthWest,
47            Self::West => Self::NorthWest,
48            Self::NorthEast => Self::East,
49            Self::SouthEast => Self::South,
50            Self::SouthWest => Self::West,
51            Self::NorthWest => Self::North,
52        }
53    }
54
55    pub fn rotate_counter_clockwise(&self) -> Self {
56        match self {
57            Self::North => Self::NorthWest,
58            Self::East => Self::NorthEast,
59            Self::South => Self::SouthEast,
60            Self::West => Self::SouthWest,
61            Self::NorthEast => Self::North,
62            Self::SouthEast => Self::East,
63            Self::SouthWest => Self::South,
64            Self::NorthWest => Self::West,
65        }
66    }
67}