dnd_character/
abilities.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Default)]
4#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
5#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))]
6#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
7pub struct AbilityScore {
8    pub score: u8,
9    pub proficiency: bool,
10}
11
12impl AbilityScore {
13    pub fn new(score: u8, proficiency: bool) -> Self {
14        Self {
15            score,
16            proficiency,
17        }
18    }
19    /// Returns the modifier of the ability score
20    /// if you want to add the proficiency bonus, pass it as an argument otherwise pass 0
21    pub fn modifier(&self, proficiency_bonus: u8) -> i8 {
22        ((self.score as i8 - 10) as f32 / 2f32).floor() as i8 + if self.proficiency { proficiency_bonus as i8 } else { 0 }
23    }
24}
25
26pub const ABILITY_NAMES: [&str; 6] = ["strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma"];
27
28#[derive(Debug, Default)]
29#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
30#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))]
31#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
32pub struct Abilities {
33    pub strength: AbilityScore,
34    pub dexterity: AbilityScore,
35    pub constitution: AbilityScore,
36    pub intelligence: AbilityScore,
37    pub wisdom: AbilityScore,
38    pub charisma: AbilityScore,
39}