dnd_character/
abilities.rs1use 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 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}