diff options
Diffstat (limited to 'src/game.rs')
-rw-r--r-- | src/game.rs | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/src/game.rs b/src/game.rs index be2dcce..b6a051f 100644 --- a/src/game.rs +++ b/src/game.rs @@ -10,6 +10,7 @@ pub struct GameBoard { pub players: [Player; 2], pub powerups: ArrayVec<[Powerup; 2]>, pub map: Map, + pub outcome: SimulationOutcome } #[derive(Debug, PartialEq, Eq, Clone)] @@ -85,7 +86,8 @@ impl GameBoard { powerups: json.map.iter().flatten().filter_map(|c| { c.powerup.clone().map(|p| Powerup::Health(Point2d::new(c.x, c.y), p.value)) }).collect(), - map + map, + outcome: SimulationOutcome::Continue } } @@ -201,12 +203,41 @@ impl GameBoard { player.active_worm = (player.active_worm + 1) % player.worms.len(); } - match (self.players[0].worms.len(), self.players[1].worms.len()) { + self.outcome = match (self.players[0].worms.len(), self.players[1].worms.len()) { (0, 0) => SimulationOutcome::Draw, (_, 0) => SimulationOutcome::PlayerWon(0), (0, _) => SimulationOutcome::PlayerWon(1), _ => SimulationOutcome::Continue + }; + + self.outcome + } + + pub fn find_target(&self, center: Point2d<i8>, dir: Direction, weapon_range: u8) -> Option<&Worm> { + let diff = dir.as_vec(); + + let range = if dir.is_diagonal() { + ((weapon_range as f32 + 1.) / 2f32.sqrt()).floor() as i8 + } else { + weapon_range as i8 + }; + + let mut target_worm: Option<&Worm> = None; + for distance in 1..=range { + let target = center + diff * distance; + match self.map.at(target) { + Some(false) => { + target_worm = self.players.iter() + .flat_map(|p| p.worms.iter()) + .find(|w| w.position == target); + if target_worm.is_some() { + break; + } + }, + _ => break + } } + target_worm } } |