diff options
Diffstat (limited to 'src/game.rs')
-rw-r--r-- | src/game.rs | 63 |
1 files changed, 25 insertions, 38 deletions
diff --git a/src/game.rs b/src/game.rs index 32efef8..f2c0089 100644 --- a/src/game.rs +++ b/src/game.rs @@ -21,7 +21,7 @@ pub struct GameBoard { pub players: [Player; 2], pub powerups: ArrayVec<[Powerup; 2]>, pub map: Map, - pub occupied_cells: ArrayVec<[Point2d<i8>; 6]>, + pub occupied_cells: ArrayVec<[Point2d; 6]>, pub outcome: SimulationOutcome, } @@ -614,18 +614,17 @@ impl GameBoard { .collect() } - // TODO: These two dominate in terms of time taken. Optimize. fn pruned_valid_bomb_commands(&self, player_index: usize) -> Vec<Command> { self.selects_iter(player_index) .filter(|(_, worm)| worm.bombs > 0) .flat_map(|(select, worm)| { let mut result = Vec::with_capacity((BOMB_RANGE * 2 + 1).pow(2) as usize - 12); - let own_worm_positions: ArrayVec<[Point2d<i8>; 3]> = self.players[player_index] + let own_worm_positions: ArrayVec<[Point2d; 3]> = self.players[player_index] .worms .iter() .map(|w| w.position) .collect(); - let opponent_worm_positions: ArrayVec<[Point2d<i8>; 3]> = self.players + let opponent_worm_positions: ArrayVec<[Point2d; 3]> = self.players [GameBoard::opponent(player_index)] .worms .iter() @@ -639,22 +638,16 @@ impl GameBoard { && (worm.position - target).magnitude_squared() < (BOMB_RANGE + 1).pow(2) { - let own_affected_worms = BOMB_DAMAGES - .iter() - .map(|(damage_offset, _)| target + *damage_offset) - .filter(|explosion_position| { - own_worm_positions.contains(explosion_position) - }) - .count(); - let opponent_affected_worms = BOMB_DAMAGES - .iter() - .map(|(damage_offset, _)| target + *damage_offset) - .filter(|explosion_position| { - opponent_worm_positions.contains(explosion_position) - }) - .count(); - - if own_affected_worms == 0 && opponent_affected_worms > 0 { + let own_affected_worms = own_worm_positions.iter().any(|p| { + (target - *p).magnitude_squared() + <= BOMB_DAMAGE_RANGE * BOMB_DAMAGE_RANGE + }); + let opponent_affected_worms = opponent_worm_positions.iter().any(|p| { + (target - *p).magnitude_squared() + <= BOMB_DAMAGE_RANGE * BOMB_DAMAGE_RANGE + }); + + if !own_affected_worms && opponent_affected_worms { result.push(Command { worm: select, action: Action::Bomb(target), @@ -674,12 +667,12 @@ impl GameBoard { .filter(|(_, worm)| worm.snowballs > 0) .flat_map(|(select, worm)| { let mut result = Vec::with_capacity((SNOWBALL_RANGE * 2 + 1).pow(2) as usize - 12); - let own_worm_positions: ArrayVec<[Point2d<i8>; 3]> = self.players[player_index] + let own_worm_positions: ArrayVec<[Point2d; 3]> = self.players[player_index] .worms .iter() .map(|w| w.position) .collect(); - let opponent_worm_positions: ArrayVec<[Point2d<i8>; 3]> = self.players + let opponent_worm_positions: ArrayVec<[Point2d; 3]> = self.players [GameBoard::opponent(player_index)] .worms .iter() @@ -693,22 +686,16 @@ impl GameBoard { && (worm.position - target).magnitude_squared() < (SNOWBALL_RANGE + 1).pow(2) { - let own_affected_worms = SNOWBALL_FREEZES - .iter() - .map(|offset| target + *offset) - .filter(|explosion_position| { - own_worm_positions.contains(explosion_position) - }) - .count(); - let opponent_affected_worms = SNOWBALL_FREEZES - .iter() - .map(|offset| target + *offset) - .filter(|explosion_position| { - opponent_worm_positions.contains(explosion_position) - }) - .count(); - - if own_affected_worms == 0 && opponent_affected_worms > 0 { + let own_affected_worms = own_worm_positions.iter().any(|p| { + (target - *p).magnitude_squared() + <= SNOWBALL_FREEZE_RANGE * SNOWBALL_FREEZE_RANGE + }); + let opponent_affected_worms = opponent_worm_positions.iter().any(|p| { + (target - *p).magnitude_squared() + <= SNOWBALL_FREEZE_RANGE * SNOWBALL_FREEZE_RANGE + }); + + if !own_affected_worms && opponent_affected_worms { result.push(Command { worm: select, action: Action::Snowball(target), |