use crate::{character::Character, dice::successes}; #[derive(Debug,PartialEq, Eq, Clone, Copy)] pub enum EncounterType { Physical, Mental, } impl Character { pub fn attacks(&mut self, opponent: &mut Character) { let (margin, _succ, _fail, _succ_dice, fail_dice) = successes( self.dice_pool().max(0) as usize, (opponent.ac() - self.weapon_proficiency() as i64).clamp(1, 12), ); let damage = self.compute_damage(margin);//(margin + self.weapon_proficiency()).max(0) * self.weapon.damage_dice; opponent.hp = opponent.hp - damage as i64; self.adjust_dice_pool((-fail_dice).min(0), EncounterType::Physical); // println!( // "{} attacks {} getting a margin of {} (s: {}, f: {}) and dealing {} damage.", // self.name, opponent.name, margin, succ, fail, damage // ) } } pub fn make_them_fight(character1: &mut Character, character2: &mut Character) -> Option { character1.init_encounter(EncounterType::Physical); character2.init_encounter(EncounterType::Physical); let mut turn = 0; loop { turn += 1; character1.attacks(character2); if character2.hp <= 0 { break; } character2.attacks(character1); if character1.hp <= 0 { break; } if turn > 15 { return None } } Some(turn) }