el_diablo/src/monster.rs

53 lines
1.4 KiB
Rust
Raw Normal View History

2023-11-27 21:24:43 +01:00
use std::cmp::max;
2023-11-27 19:21:10 +01:00
use crate::position::Position;
pub struct Monster {
life: usize,
position: Position,
}
impl Monster {
pub fn new(life: usize) -> Self {
Monster {
life,
position: Position::new(0, 0, 0),
}
}
pub fn get_life(&self) -> usize { self.life }
pub fn is_dead(&self) -> bool { self.life <= 0 }
pub fn decrease_life(&mut self, by: i16) {
self.life = max(0, self.life as i16 - by) as usize;
}
pub fn get_position(&mut self) -> &mut Position {
&mut self.position
}
2023-12-03 10:41:43 +01:00
pub fn get_immutable_position(&self) -> &Position {
&self.position
}
2023-11-27 19:21:10 +01:00
}
#[test]
fn monsters_can_move() {
let mut m = Monster::new(2);
assert_eq!(m.get_position(), &Position::new(0, 0, 0));
m.get_position().change(1, 2);
assert_eq!(m.get_position(), &Position::new(0, 1, 2));
m.get_position().change(2, 1);
assert_eq!(m.get_position(), &Position::new(0, 3, 3));
m.get_position().set(1, 2, 3);
m.get_position().change(2, 1);
assert_eq!(m.get_position(), &Position::new(1, 4, 4));
}
#[test]
fn monsters_can_die() {
let mut m = Monster::new(2);
assert_eq!(m.get_life(), 2);
assert_eq!(m.is_dead(), false);
m.decrease_life(1);
assert_eq!(m.get_life(), 1);
m.decrease_life(2);
assert_eq!(m.get_life(), 0);
assert_eq!(m.is_dead(), true);
}