use crate::character_wizard_srd_data as srd;
use crate::Character;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SavingThrow {
pub proficient: bool,
pub modifier: i16,
}
#[derive(Debug, Clone, Copy)]
pub struct CharacterSheet<'a> {
character: &'a Character,
}
impl<'a> CharacterSheet<'a> {
pub(crate) const fn new(character: &'a Character) -> Self {
Self { character }
}
#[must_use]
pub fn hit_die(self) -> u8 {
srd::class_rule(&self.character.character_class).map_or(0, |rule| rule.hit_die)
}
#[must_use]
pub fn saving_throw(self, ability: &str) -> SavingThrow {
let proficient = srd::class_rule(&self.character.character_class)
.is_some_and(|rule| rule.saves.contains(&ability));
let modifier = self.character.abilities.modifier(ability)
+ if proficient {
i16::from(self.character.proficiency_bonus())
} else {
0
};
SavingThrow {
proficient,
modifier,
}
}
}