diff options
author | Justin Worthe <justin@worthe-it.co.za> | 2018-05-15 23:15:36 +0200 |
---|---|---|
committer | Justin Worthe <justin@worthe-it.co.za> | 2018-05-15 23:15:36 +0200 |
commit | 27499d0f466e0405dba10f8f5b98533beead1c9e (patch) | |
tree | 92db37910306050863ca648541ba4fa46f2d4f93 /src | |
parent | 4c0eed0ed7e7cc0fcec60624c0a0251a9e525fb1 (diff) |
Additional code and bug fixes to help end to end tests
Diffstat (limited to 'src')
-rw-r--r-- | src/engine/geometry.rs | 14 | ||||
-rw-r--r-- | src/engine/mod.rs | 31 | ||||
-rw-r--r-- | src/json.rs | 4 |
3 files changed, 38 insertions, 11 deletions
diff --git a/src/engine/geometry.rs b/src/engine/geometry.rs index a946bf9..23e0433 100644 --- a/src/engine/geometry.rs +++ b/src/engine/geometry.rs @@ -25,3 +25,17 @@ impl Point { } } } + +use std::cmp::Ord; +use std::cmp::Ordering; + +impl PartialOrd for Point { + fn partial_cmp(&self, other: &Point) -> Option<Ordering> { + Some(self.cmp(other)) + } +} +impl Ord for Point { + fn cmp(&self, other: &Point) -> Ordering { + self.x.cmp(&other.x).then(self.y.cmp(&other.y)) + } +} diff --git a/src/engine/mod.rs b/src/engine/mod.rs index f8a456f..6bc200c 100644 --- a/src/engine/mod.rs +++ b/src/engine/mod.rs @@ -9,7 +9,7 @@ use self::settings::{GameSettings, BuildingSettings}; use std::ops::Fn; use std::cmp; -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq)] pub struct GameState { pub status: GameStatus, pub player: Player, @@ -30,13 +30,13 @@ pub enum GameStatus { Draw } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq)] pub struct Player { pub energy: u16, pub health: u16 } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq)] pub struct Building { pub pos: Point, pub health: u16, @@ -48,7 +48,7 @@ pub struct Building { pub energy_generated_per_turn: u16 } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq)] pub struct Missile { pub pos: Point, pub damage: u16, @@ -76,6 +76,19 @@ impl GameState { } } + /** + * Sorts the various arrays. Generally not necessary, but useful + * for tests that check equality between states. + */ + pub fn sort(&mut self) { + self.player_buildings.sort_by_key(|b| b.pos); + self.unoccupied_player_cells.sort(); + self.opponent_buildings.sort_by_key(|b| b.pos); + self.unoccupied_opponent_cells.sort(); + self.player_missiles.sort_by_key(|b| b.pos); + self.opponent_missiles.sort_by_key(|b| b.pos); + } + pub fn simulate(&self, settings: &GameSettings, player_command: Command, opponent_command: Command) -> GameState { let mut state = self.clone(); state.simulate_mut(settings, player_command, opponent_command); @@ -87,9 +100,6 @@ impl GameState { return; } - GameState::perform_command(&mut self.player_buildings, &mut self.player, &mut self.unoccupied_player_cells, settings, player_command, &settings.size); - GameState::perform_command(&mut self.opponent_buildings, &mut self.opponent, &mut self.unoccupied_opponent_cells, settings, opponent_command, &settings.size); - GameState::update_construction(&mut self.player_buildings); GameState::update_construction(&mut self.opponent_buildings); @@ -106,6 +116,9 @@ impl GameState { GameState::add_energy(&mut self.player, settings, &self.player_buildings); GameState::add_energy(&mut self.opponent, settings, &self.opponent_buildings); + GameState::perform_command(&mut self.player_buildings, &mut self.player, &mut self.unoccupied_player_cells, settings, player_command, &settings.size); + GameState::perform_command(&mut self.opponent_buildings, &mut self.opponent, &mut self.unoccupied_opponent_cells, settings, opponent_command, &settings.size); + GameState::update_status(self); } @@ -161,7 +174,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*/) { //TODO surely this health>0 belongs? Not what the real game engine is doing unfortunately + for hit in opponent_buildings.iter_mut().filter(|b| b.is_constructed() && b.pos == point) { let damage = cmp::min(missile.damage, hit.health); hit.health -= damage; missile.speed = 0; @@ -187,7 +200,7 @@ impl GameState { fn add_energy(player: &mut Player, settings: &GameSettings, buildings: &Vec<Building>) { player.energy += settings.energy_income; - player.energy += buildings.iter().map(|b| b.energy_generated_per_turn).sum::<u16>(); + player.energy += buildings.iter().filter(|b| b.is_constructed()).map(|b| b.energy_generated_per_turn).sum::<u16>(); } fn update_status(state: &mut GameState) { diff --git a/src/json.rs b/src/json.rs index 4253a19..239a351 100644 --- a/src/json.rs +++ b/src/json.rs @@ -140,7 +140,7 @@ impl State { fn opponent(&self) -> &Player { self.players.iter() - .filter(|p| p.player_type != 'B') + .filter(|p| p.player_type == 'B') .next() .expect("Opponent character did not appear in state.json") } @@ -173,7 +173,7 @@ impl BuildingBlueprint { engine::settings::BuildingSettings { price: self.price, health: self.health, - construction_time: self.construction_time, + construction_time: self.construction_time-2, weapon_damage: self.weapon_damage, weapon_speed: self.weapon_speed, weapon_cooldown_period: self.weapon_cooldown_period, |