screeps_utils/
map.rs

1use screeps::local::RoomName;
2
3#[derive(Debug, PartialEq, Eq)]
4pub enum RoomType {
5    Normal,
6    Highway,
7    HighwayIntersection,
8    Keeper,
9    Center,
10}
11
12/// Gets the `RoomType` for a given room name, assuming the map in use follows
13/// the normal sector layout.
14pub fn room_type_for_name(room_name: RoomName) -> RoomType {
15    let x_coord = room_name.x_coord();
16    let x_mod = if x_coord < 0 {
17        (x_coord.abs() - 1) % 10
18    } else {
19        x_coord % 10
20    };
21
22    let y_coord = room_name.y_coord();
23    let y_mod = if y_coord < 0 {
24        (y_coord.abs() - 1) % 10
25    } else {
26        y_coord % 10
27    };
28
29    if x_mod == 0 && y_mod == 0 {
30        RoomType::HighwayIntersection
31    } else if x_mod == 0 || y_mod == 0 {
32        RoomType::Highway
33    } else if x_mod == 5 && y_mod == 5 {
34        RoomType::Center
35    } else if (4..=6).contains(&x_mod) && (4..=6).contains(&y_mod) {
36        RoomType::Keeper
37    } else {
38        RoomType::Normal
39    }
40}
41
42#[cfg(test)]
43mod test {
44    use super::*;
45
46    #[test]
47    fn room_types() {
48        assert_eq!(
49            room_type_for_name(RoomName::new("W0N0").unwrap()),
50            RoomType::HighwayIntersection
51        );
52        assert_eq!(
53            room_type_for_name(RoomName::new("E0S0").unwrap()),
54            RoomType::HighwayIntersection
55        );
56
57        assert_eq!(
58            room_type_for_name(RoomName::new("W0N1").unwrap()),
59            RoomType::Highway
60        );
61        assert_eq!(
62            room_type_for_name(RoomName::new("E0S1").unwrap()),
63            RoomType::Highway
64        );
65
66        assert_eq!(
67            room_type_for_name(RoomName::new("W1N1").unwrap()),
68            RoomType::Normal
69        );
70        assert_eq!(
71            room_type_for_name(RoomName::new("E1S1").unwrap()),
72            RoomType::Normal
73        );
74
75        assert_eq!(
76            room_type_for_name(RoomName::new("W3N3").unwrap()),
77            RoomType::Normal
78        );
79        assert_eq!(
80            room_type_for_name(RoomName::new("E3S3").unwrap()),
81            RoomType::Normal
82        );
83
84        assert_eq!(
85            room_type_for_name(RoomName::new("W4N4").unwrap()),
86            RoomType::Keeper
87        );
88        assert_eq!(
89            room_type_for_name(RoomName::new("E4S4").unwrap()),
90            RoomType::Keeper
91        );
92
93        assert_eq!(
94            room_type_for_name(RoomName::new("W5N5").unwrap()),
95            RoomType::Center
96        );
97        assert_eq!(
98            room_type_for_name(RoomName::new("E5S5").unwrap()),
99            RoomType::Center
100        );
101
102        assert_eq!(
103            room_type_for_name(RoomName::new("W6N6").unwrap()),
104            RoomType::Keeper
105        );
106        assert_eq!(
107            room_type_for_name(RoomName::new("E6S6").unwrap()),
108            RoomType::Keeper
109        );
110
111        assert_eq!(
112            room_type_for_name(RoomName::new("W7N7").unwrap()),
113            RoomType::Normal
114        );
115        assert_eq!(
116            room_type_for_name(RoomName::new("E7S7").unwrap()),
117            RoomType::Normal
118        );
119
120        assert_eq!(
121            room_type_for_name(RoomName::new("W9N9").unwrap()),
122            RoomType::Normal
123        );
124        assert_eq!(
125            room_type_for_name(RoomName::new("E9S9").unwrap()),
126            RoomType::Normal
127        );
128
129        assert_eq!(
130            room_type_for_name(RoomName::new("W10N10").unwrap()),
131            RoomType::HighwayIntersection
132        );
133        assert_eq!(
134            room_type_for_name(RoomName::new("E10S10").unwrap()),
135            RoomType::HighwayIntersection
136        );
137
138        assert_eq!(
139            room_type_for_name(RoomName::new("W11N10").unwrap()),
140            RoomType::Highway
141        );
142        assert_eq!(
143            room_type_for_name(RoomName::new("E11S10").unwrap()),
144            RoomType::Highway
145        );
146    }
147}