summaryrefslogtreecommitdiff
path: root/src/game.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/game.rs')
-rw-r--r--src/game.rs63
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),