summaryrefslogtreecommitdiff
path: root/src/game/player.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/player.rs')
-rw-r--r--src/game/player.rs85
1 files changed, 53 insertions, 32 deletions
diff --git a/src/game/player.rs b/src/game/player.rs
index 38d78d0..be9d515 100644
--- a/src/game/player.rs
+++ b/src/game/player.rs
@@ -1,5 +1,5 @@
-use arrayvec::ArrayVec;
use crate::geometry::*;
+use arrayvec::ArrayVec;
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct Player {
@@ -16,26 +16,22 @@ pub struct Worm {
pub position: Point2d<i8>,
pub weapon_damage: i32,
pub weapon_range: u8,
- pub bombs: u8
+ pub bombs: u8,
+ pub snowballs: u8,
+ pub rounds_until_unfrozen: u8,
}
impl Player {
pub fn find_worm_position(&self, id: i32) -> Option<usize> {
- self.worms
- .iter()
- .position(|w| w.id == id)
+ self.worms.iter().position(|w| w.id == id)
}
-
+
pub fn find_worm(&self, id: i32) -> Option<&Worm> {
- self.worms
- .iter()
- .find(|w| w.id == id)
+ self.worms.iter().find(|w| w.id == id)
}
pub fn find_worm_mut(&mut self, id: i32) -> Option<&mut Worm> {
- self.worms
- .iter_mut()
- .find(|w| w.id == id)
+ self.worms.iter_mut().find(|w| w.id == id)
}
pub fn active_worm(&self) -> Option<&Worm> {
@@ -47,10 +43,7 @@ impl Player {
}
pub fn health(&self) -> i32 {
- self.worms
- .iter()
- .map(|w| w.health)
- .sum()
+ self.worms.iter().map(|w| w.health).sum()
}
pub fn clear_dead_worms(&mut self) {
@@ -61,7 +54,7 @@ impl Player {
self.active_worm = if self.active_worm > 0 {
self.active_worm - 1
} else if self.worms.len() > 0 {
- self.worms.len() - 1
+ self.worms.len() - 1
} else {
0
};
@@ -71,7 +64,9 @@ impl Player {
}
pub fn next_active_worm(&mut self) {
- self.active_worm = (self.active_worm + 1).checked_rem(self.worms.len()).unwrap_or(0);
+ self.active_worm = (self.active_worm + 1)
+ .checked_rem(self.worms.len())
+ .unwrap_or(0);
}
fn health_score(&self) -> i32 {
@@ -81,12 +76,18 @@ impl Player {
pub fn score(&self) -> i32 {
self.moves_score + self.health_score()
}
+
+ pub fn active_worm_is_frozen(&self) -> bool {
+ self.active_worm()
+ .map(|worm| worm.rounds_until_unfrozen > 0)
+ .unwrap_or(false)
+ }
}
#[cfg(test)]
mod test {
use super::*;
-
+
#[test]
fn clear_dead_worms_after_active_worm() {
let mut worms = ArrayVec::new();
@@ -96,7 +97,9 @@ mod test {
position: Point2d::new(0, 0),
weapon_damage: 5,
weapon_range: 5,
- bombs: 0
+ rounds_until_unfrozen: 0,
+ bombs: 0,
+ snowballs: 0,
});
worms.push(Worm {
id: 2,
@@ -104,7 +107,9 @@ mod test {
position: Point2d::new(0, 0),
weapon_damage: 5,
weapon_range: 5,
- bombs: 0
+ rounds_until_unfrozen: 0,
+ bombs: 0,
+ snowballs: 0,
});
worms.push(Worm {
id: 3,
@@ -112,13 +117,15 @@ mod test {
position: Point2d::new(0, 0),
weapon_damage: 5,
weapon_range: 5,
- bombs: 0
+ rounds_until_unfrozen: 0,
+ bombs: 0,
+ snowballs: 0,
});
let mut player = Player {
active_worm: 1,
moves_score: 0,
select_moves: 0,
- worms
+ worms,
};
player.clear_dead_worms();
@@ -139,7 +146,9 @@ mod test {
position: Point2d::new(0, 0),
weapon_damage: 5,
weapon_range: 5,
- bombs: 0
+ rounds_until_unfrozen: 0,
+ bombs: 0,
+ snowballs: 0,
});
worms.push(Worm {
id: 2,
@@ -147,7 +156,9 @@ mod test {
position: Point2d::new(0, 0),
weapon_damage: 5,
weapon_range: 5,
- bombs: 0
+ rounds_until_unfrozen: 0,
+ bombs: 0,
+ snowballs: 0,
});
worms.push(Worm {
id: 3,
@@ -155,7 +166,9 @@ mod test {
position: Point2d::new(0, 0),
weapon_damage: 5,
weapon_range: 5,
- bombs: 0
+ rounds_until_unfrozen: 0,
+ bombs: 0,
+ snowballs: 0,
});
let mut player = Player {
active_worm: 1,
@@ -182,7 +195,9 @@ mod test {
position: Point2d::new(0, 0),
weapon_damage: 5,
weapon_range: 5,
- bombs: 0
+ rounds_until_unfrozen: 0,
+ bombs: 0,
+ snowballs: 0,
});
worms.push(Worm {
id: 2,
@@ -190,7 +205,9 @@ mod test {
position: Point2d::new(0, 0),
weapon_damage: 5,
weapon_range: 5,
- bombs: 0
+ rounds_until_unfrozen: 0,
+ bombs: 0,
+ snowballs: 0,
});
worms.push(Worm {
id: 3,
@@ -198,13 +215,15 @@ mod test {
position: Point2d::new(0, 0),
weapon_damage: 5,
weapon_range: 5,
- bombs: 0
+ rounds_until_unfrozen: 0,
+ bombs: 0,
+ snowballs: 0,
});
let mut player = Player {
active_worm: 0,
moves_score: 0,
worms,
- select_moves: 0
+ select_moves: 0,
};
player.clear_dead_worms();
@@ -225,13 +244,15 @@ mod test {
position: Point2d::new(0, 0),
weapon_damage: 5,
weapon_range: 5,
- bombs: 0
+ rounds_until_unfrozen: 0,
+ bombs: 0,
+ snowballs: 0,
});
let mut player = Player {
active_worm: 0,
moves_score: 0,
worms,
- select_moves: 0
+ select_moves: 0,
};
player.clear_dead_worms();