summaryrefslogtreecommitdiff
path: root/2019-worms/src/game/map.rs
diff options
context:
space:
mode:
Diffstat (limited to '2019-worms/src/game/map.rs')
-rw-r--r--2019-worms/src/game/map.rs49
1 files changed, 49 insertions, 0 deletions
diff --git a/2019-worms/src/game/map.rs b/2019-worms/src/game/map.rs
new file mode 100644
index 0000000..84ec99a
--- /dev/null
+++ b/2019-worms/src/game/map.rs
@@ -0,0 +1,49 @@
+use crate::constants::*;
+use crate::geometry::*;
+
+#[derive(Default, Debug, PartialEq, Eq, Clone, Copy)]
+pub struct Map {
+ pub cells: [u64; MAP_U64S],
+}
+
+impl Map {
+ fn internal_index(p: Point2d) -> Option<(usize, usize)> {
+ if p.y < 0 || p.y as usize >= MAP_SIZE {
+ None
+ } else {
+ let row_data = &MAP_ROW_SIZE[p.y as usize];
+ if p.x < row_data.x_offset as i8 || p.x as usize >= row_data.x_offset + row_data.len() {
+ None
+ } else {
+ let global_bit = row_data.start_bit + p.x as usize - row_data.x_offset;
+ let integer = global_bit / 64;
+ let bit = global_bit % 64;
+ Some((integer, bit))
+ }
+ }
+ }
+
+ pub fn at(&self, p: Point2d) -> Option<bool> {
+ Map::internal_index(p).map(|(integer, bit)| {
+ let mask = 1 << bit;
+ self.cells[integer] & mask != 0
+ })
+ }
+
+ pub fn set(&mut self, p: Point2d) {
+ if let Some((integer, bit)) = Map::internal_index(p) {
+ let mask = 1 << bit;
+ self.cells[integer] |= mask;
+ } else {
+ panic!("Tried to set an out of bounds bit, {:?}", p);
+ }
+ }
+ pub fn clear(&mut self, p: Point2d) {
+ if let Some((integer, bit)) = Map::internal_index(p) {
+ let mask = !(1 << bit);
+ self.cells[integer] &= mask;
+ } else {
+ panic!("Tried to set an out of bounds bit, {:?}", p);
+ }
+ }
+}