From e762eda31ffa8e722737eba2583154ec038a068f Mon Sep 17 00:00:00 2001 From: Justin Worthe Date: Mon, 14 May 2018 22:18:52 +0200 Subject: Changed invalid move checking to be a debug assertion --- src/engine/mod.rs | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) (limited to 'src/engine') diff --git a/src/engine/mod.rs b/src/engine/mod.rs index 446d3bf..090d9af 100644 --- a/src/engine/mod.rs +++ b/src/engine/mod.rs @@ -25,8 +25,7 @@ pub enum GameStatus { Continue, PlayerWon, OpponentWon, - Draw, - InvalidMove + Draw } #[derive(Debug, Clone)] @@ -66,13 +65,8 @@ impl GameState { return; } - let player_valid = GameState::perform_command(&mut self.player_buildings, &mut self.player, settings, player_command, &settings.size); - let opponent_valid = GameState::perform_command(&mut self.opponent_buildings, &mut self.opponent, settings, opponent_command, &settings.size); - - if !player_valid || !opponent_valid { - self.status = GameStatus::InvalidMove; - return; - } + GameState::perform_command(&mut self.player_buildings, &mut self.player, settings, player_command, &settings.size); + GameState::perform_command(&mut self.opponent_buildings, &mut self.opponent, settings, opponent_command, &settings.size); GameState::update_construction(&mut self.player_buildings); GameState::update_construction(&mut self.opponent_buildings); @@ -91,22 +85,20 @@ impl GameState { GameState::update_status(self); } - fn perform_command(buildings: &mut Vec, player: &mut Player, settings: &GameSettings, command: Command, size: &Point) -> bool { + fn perform_command(buildings: &mut Vec, player: &mut Player, settings: &GameSettings, command: Command, size: &Point) { match command { - Command::Nothing => { true }, + Command::Nothing => { }, Command::Build(p, b) => { let blueprint = settings.building_settings(b); - - let occupied = buildings.iter().any(|b| b.pos == p); - let in_range = p.x < size.x && p.y < size.y; - let has_energy = player.energy >= blueprint.price; - - let valid = !occupied && in_range && has_energy; - if valid { - player.energy -= blueprint.price; - buildings.push(Building::new(p, blueprint)); - } - valid + + // This is used internally. I should not be making + // invalid moves! + debug_assert!(!buildings.iter().any(|b| b.pos == p)); + debug_assert!(p.x < size.x && p.y < size.y); + debug_assert!(player.energy >= blueprint.price); + + player.energy -= blueprint.price; + buildings.push(Building::new(p, blueprint)); }, } } @@ -144,7 +136,7 @@ impl GameState { }, Some(point) => { missile.pos = point; - for hit in opponent_buildings.iter_mut().filter(|b| b.is_constructed() && b.pos == point && b.health > 0) { + for hit in opponent_buildings.iter_mut().filter(|b| b.is_constructed() && b.pos == point/* && b.health > 0*/) { //TODO surely this health>0 belongs? Not what the real game engine is doing unfortunately let damage = cmp::min(missile.damage, hit.health); hit.health -= damage; missile.speed = 0; -- cgit v1.2.3