Skip to content
Snippets Groups Projects
Commit cab33c3b authored by pumapaul's avatar pumapaul
Browse files

Add combat

parent 67daa9db
No related branches found
No related tags found
No related merge requests found
...@@ -106,11 +106,32 @@ impl GameState { ...@@ -106,11 +106,32 @@ impl GameState {
self.current_run.combat_log.player_action = Option::from(Move); self.current_run.combat_log.player_action = Option::from(Move);
}, },
Tile::Wall => return false, Tile::Wall => return false,
Tile::Enemy(id) => self.attack_enemy(id, target_position),
_ => () _ => ()
} }
true true
} }
fn attack_enemy(&mut self, enemy_id: usize, enemy_position: Point) {
let damage = self.current_run.player.attack_power + GameState::roll_dice(6);
match self.current_run.level.enemies.get_mut(enemy_id) {
Some(enemy) => {
if enemy.hp <= damage {
self.current_run.level.move_player_to(enemy_position);
self.current_run.combat_log.player_action = Option::from(PlayerAction::Attack(damage, 0));
} else {
enemy.hp -= damage;
self.current_run.combat_log.player_action = Option::from(PlayerAction::Attack(damage, enemy.hp));
}
}
None => ()
}
}
fn roll_dice(sides: usize) -> usize {
thread_rng().gen_range(1, sides)
}
fn calculate_target_position(current_position: Point, key: Key) -> Point { fn calculate_target_position(current_position: Point, key: Key) -> Point {
match key { match key {
Key::W | Key::Up => { Key::W | Key::Up => {
...@@ -147,10 +168,51 @@ impl GameState { ...@@ -147,10 +168,51 @@ impl GameState {
impl GameState { impl GameState {
fn run_enemy_turn(&mut self) { fn run_enemy_turn(&mut self) {
println!("turn count: {}", self.current_run.level.turn_count); let player_position = self.current_run.level.get_player_position();
for enemy in self.current_run.level.get_current_enemies() {
self.move_enemy(enemy.0, enemy.1); let mut total_damage = 0;
for (id, position) in self.current_run.level.get_current_enemies() {
if GameState::check_is_neighbor(player_position, position) {
total_damage += self.attack_player();
} else {
self.move_enemy(id, position);
}
} }
if total_damage > 0 {
self.current_run.combat_log.damage_taken = Option::from(total_damage)
} else {
self.current_run.combat_log.damage_taken = None
}
}
fn check_is_neighbor(a: Point, b: Point) -> bool {
return GameState::check_neighbor_uint(a.0, b.0) || GameState::check_neighbor_uint(a.1, b.1);
}
fn check_neighbor_uint(a: usize, b: usize) -> bool {
if a > b {
if a - b == 1 {
return true
}
} else if b > a {
if b - a == 1 {
return true
}
}
false
}
fn attack_player(&mut self) -> usize {
let damage = 1 + GameState::roll_dice(4);
if self.current_run.player.current_hp <= damage {
self.current_run.player.current_hp = 0
} else {
self.current_run.player.current_hp -= damage
}
damage
} }
fn move_enemy(&mut self, id: usize, position: Point) { fn move_enemy(&mut self, id: usize, position: Point) {
......
pub struct Enemy {} pub struct Enemy {
pub hp: usize
}
impl Enemy { impl Enemy {
pub fn new() -> Enemy { pub fn new() -> Enemy {
Enemy {} Enemy {
hp: 6
}
} }
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment