From b93a9c643485c720a0711ddaf90872b7c6f006c8 Mon Sep 17 00:00:00 2001 From: Justin Worthe Date: Mon, 20 May 2019 14:49:07 +0200 Subject: Extracted functionality for clearing out dead worms --- src/game.rs | 29 +--------- src/game/player.rs | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/game.rs b/src/game.rs index 1d9d33b..5ddbdfd 100644 --- a/src/game.rs +++ b/src/game.rs @@ -111,18 +111,7 @@ impl GameBoard { // Remove dead worms and update active worm for player in &mut self.players { - for worm_index in (0..player.worms.len()).rev() { - if player.worms[worm_index].health <= 0 { - player.worms.remove(worm_index); - if player.active_worm >= worm_index { - if player.active_worm > 0 { - player.active_worm -= 1; - } else { - player.active_worm = player.worms.len()-1; - } - } - } - } + player.clear_dead_worms(); // Update the active worm if player.worms.len() > 0 { player.active_worm = (player.active_worm + 1).checked_rem(player.worms.len()).unwrap_or(0); @@ -224,21 +213,7 @@ impl GameBoard { } for player in &mut self.players { - // Remove dead worms - for worm_index in (0..player.worms.len()).rev() { - if player.worms[worm_index].health <= 0 { - player.worms.remove(worm_index); - if player.active_worm >= worm_index { - player.active_worm = if player.active_worm > 0 { - player.active_worm - 1 - } else if player.worms.len() > 0 { - player.worms.len() - 1 - } else { - 0 - }; - } - } - } + player.clear_dead_worms(); // Update the active worm if player.worms.len() > 0 { player.active_worm = (player.active_worm + 1).checked_rem(player.worms.len()).unwrap_or(0); diff --git a/src/game/player.rs b/src/game/player.rs index acfc494..3a9d36c 100644 --- a/src/game/player.rs +++ b/src/game/player.rs @@ -44,6 +44,161 @@ impl Player { .sum() } + pub fn clear_dead_worms(&mut self) { + for worm_index in (0..self.worms.len()).rev() { + if self.worms[worm_index].health <= 0 { + self.worms.remove(worm_index); + if self.active_worm >= worm_index { + self.active_worm = if self.active_worm > 0 { + self.active_worm - 1 + } else if self.worms.len() > 0 { + self.worms.len() - 1 + } else { + 0 + }; + } + } + } + } // TODO: Cycle to next worm } +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn clear_dead_worms_after_active_worm() { + let mut worms = ArrayVec::new(); + worms.push(Worm { + id: 1, + health: 50, + position: Point2d::new(0, 0), + weapon_damage: 5, + weapon_range: 5 + }); + worms.push(Worm { + id: 2, + health: 10, + position: Point2d::new(0, 0), + weapon_damage: 5, + weapon_range: 5 + }); + worms.push(Worm { + id: 3, + health: -2, + position: Point2d::new(0, 0), + weapon_damage: 5, + weapon_range: 5 + }); + let mut player = Player { + active_worm: 1, + worms: worms + }; + + player.clear_dead_worms(); + + assert_eq!(2, player.worms.len()); + assert_eq!(1, player.active_worm); + + assert_eq!(1, player.worms[0].id); + assert_eq!(2, player.worms[1].id); + } + + #[test] + fn clear_dead_worms_before_active_worm() { + let mut worms = ArrayVec::new(); + worms.push(Worm { + id: 1, + health: 0, + position: Point2d::new(0, 0), + weapon_damage: 5, + weapon_range: 5 + }); + worms.push(Worm { + id: 2, + health: 10, + position: Point2d::new(0, 0), + weapon_damage: 5, + weapon_range: 5 + }); + worms.push(Worm { + id: 3, + health: 2, + position: Point2d::new(0, 0), + weapon_damage: 5, + weapon_range: 5 + }); + let mut player = Player { + active_worm: 1, + worms: worms + }; + + player.clear_dead_worms(); + + assert_eq!(2, player.worms.len()); + assert_eq!(0, player.active_worm); + + assert_eq!(2, player.worms[0].id); + assert_eq!(3, player.worms[1].id); + } + + #[test] + fn clear_dead_worms_before_active_worm_wrapping() { + let mut worms = ArrayVec::new(); + worms.push(Worm { + id: 1, + health: 0, + position: Point2d::new(0, 0), + weapon_damage: 5, + weapon_range: 5 + }); + worms.push(Worm { + id: 2, + health: 10, + position: Point2d::new(0, 0), + weapon_damage: 5, + weapon_range: 5 + }); + worms.push(Worm { + id: 3, + health: 2, + position: Point2d::new(0, 0), + weapon_damage: 5, + weapon_range: 5 + }); + let mut player = Player { + active_worm: 0, + worms: worms + }; + + player.clear_dead_worms(); + + assert_eq!(2, player.worms.len()); + assert_eq!(1, player.active_worm); + + assert_eq!(2, player.worms[0].id); + assert_eq!(3, player.worms[1].id); + } + + #[test] + fn clear_last_dead_worm() { + let mut worms = ArrayVec::new(); + worms.push(Worm { + id: 1, + health: -10, + position: Point2d::new(0, 0), + weapon_damage: 5, + weapon_range: 5 + }); + let mut player = Player { + active_worm: 0, + worms: worms + }; + + player.clear_dead_worms(); + + assert_eq!(0, player.worms.len()); + // active worm is undefined in this case, but clearing the worms must not panic. + } +} -- cgit v1.2.3