From 3f5492b2bb67326be43cd7c5ba02ccf0ba1ae0e3 Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Tue, 19 Apr 2022 21:27:56 +0200 Subject: Refile for merging repos --- 2019-worms/src/game/map.rs | 49 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 2019-worms/src/game/map.rs (limited to '2019-worms/src/game/map.rs') 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 { + 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); + } + } +} -- cgit v1.2.3