Created data structure for bitwise game engine
authorJustin Worthe <justin@worthe-it.co.za>
Sat, 30 Jun 2018 20:45:05 +0000 (22:45 +0200)
committerJustin Worthe <justin@worthe-it.co.za>
Sat, 30 Jun 2018 20:45:05 +0000 (22:45 +0200)
src/engine/bitwise_engine.rs [new file with mode: 0644]
src/engine/mod.rs

diff --git a/src/engine/bitwise_engine.rs b/src/engine/bitwise_engine.rs
new file mode 100644 (file)
index 0000000..79d5120
--- /dev/null
@@ -0,0 +1,73 @@
+use engine::command::{Command, BuildingType};
+use engine::geometry::Point;
+use engine::settings::{GameSettings};
+use engine::{GameStatus, Player, GameState};
+
+const MAP_WIDTH: usize = 16;
+const MAP_HEIGHT: usize = 8;
+
+const MISSILE_COOLDOWN: usize = 3;
+
+const DEFENCE_HEALTH: usize = 4; // '20' health is 4 hits
+
+const MAX_TESLAS: usize = 2;
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub struct BitwiseGameState {
+    status: GameStatus,
+    player: Player,
+    opponent: Player,
+    player_buildings: PlayerBuildings,
+    opponent_buildings: PlayerBuildings,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+struct PlayerBuildings {
+    unconstructed: Vec<UnconstructedBuilding>,
+    energy_towers: [u8; MAP_HEIGHT],
+    missile_towers: [[u8; MAP_HEIGHT]; MISSILE_COOLDOWN],
+    defence_towers: [[u8; MAP_HEIGHT]; DEFENCE_HEALTH],
+    tesla_towers: [u8; MAP_HEIGHT],
+    
+    missiles: [[u16; MAP_HEIGHT]; MAP_WIDTH/4],
+    tesla_cooldowns: [TeslaCooldown; MAX_TESLAS],
+
+    unoccupied: Vec<Point>
+}
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub struct UnconstructedBuilding {
+    pub pos: Point,
+    pub construction_time_left: u8,
+    pub building_type: BuildingType
+}
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub struct TeslaCooldown {
+    pub active: bool,
+    pub pos: Point,
+    pub cooldown: u8
+}
+
+
+impl GameState for BitwiseGameState {
+    fn simulate(&mut self, _settings: &GameSettings, _player_command: Command, _opponent_command: Command) -> GameStatus {
+        //TODO
+        self.status
+    }
+
+
+    fn player(&self) -> &Player { &self.player }
+    fn opponent(&self) -> &Player { &self.opponent }
+    fn player_has_max_teslas(&self) -> bool { self.player_buildings.count_teslas() >= MAX_TESLAS }
+    fn opponent_has_max_teslas(&self) -> bool { self.opponent_buildings.count_teslas() >= MAX_TESLAS }
+    fn unoccupied_player_cells(&self) -> &Vec<Point> { &self.player_buildings.unoccupied }
+    fn unoccupied_opponent_cells(&self) -> &Vec<Point> { &self.opponent_buildings.unoccupied }
+}
+
+impl PlayerBuildings {
+    pub fn count_teslas(&self) -> usize {
+        //TODO
+        2
+    }
+}
index 2910b75..6e7c5c9 100644 (file)
@@ -2,7 +2,7 @@ pub mod command;
 pub mod geometry;
 pub mod settings;
 pub mod expressive_engine;
-
+pub mod bitwise_engine;
 
 use self::command::{Command};
 use self::geometry::Point;
@@ -27,7 +27,7 @@ pub enum GameStatus {
     Draw
 }
 
-#[derive(Debug, Clone, PartialEq)]
+#[derive(Debug, Clone, PartialEq, Eq)]
 pub struct Player {
     pub energy: u16,
     pub health: u8,