use super::{StatDef, StatFormat};
pub const HEALTH_MAX: &str = "enshwick:health_max";
pub const STAMINA_MAX: &str = "enshwick:stamina_max";
pub const MANA_MAX: &str = "enshwick:mana_max";
pub const DAMAGE: &str = "enshwick:damage";
pub const DAMAGE_CUT: &str = "enshwick:damage_cut";
pub const DAMAGE_PIERCE: &str = "enshwick:damage_pierce";
pub const DAMAGE_BLUNT: &str = "enshwick:damage_blunt";
pub const DAMAGE_FIRE: &str = "enshwick:damage_fire";
pub const DAMAGE_ICE: &str = "enshwick:damage_ice";
pub const DAMAGE_SHROUD: &str = "enshwick:damage_shroud";
pub const DAMAGE_LIGHTNING: &str = "enshwick:damage_lightning";
pub const DAMAGE_POISON: &str = "enshwick:damage_poison";
pub const RESISTANCE: &str = "enshwick:resistance";
pub const RESISTANCE_CUT: &str = "enshwick:resistance_cut";
pub const RESISTANCE_PIERCE: &str = "enshwick:resistance_pierce";
pub const RESISTANCE_BLUNT: &str = "enshwick:resistance_blunt";
pub const RESISTANCE_FIRE: &str = "enshwick:resistance_fire";
pub const RESISTANCE_ICE: &str = "enshwick:resistance_ice";
pub const RESISTANCE_SHROUD: &str = "enshwick:resistance_shroud";
pub const RESISTANCE_LIGHTNING: &str = "enshwick:resistance_lightning";
pub const RESISTANCE_POISON: &str = "enshwick:resistance_poison";
const MAX_FACTOR: f32 = 100.0;
const MAX_POINTS: f32 = 100_000.0;
const fn factor(text: &'static str) -> Def {
Def {
text,
multiplicative: true,
points: false,
min: 0.0,
max: MAX_FACTOR,
}
}
const fn resistance(text: &'static str) -> Def {
Def {
text,
multiplicative: false,
points: false,
min: -1.0,
max: 1.0,
}
}
const fn points(text: &'static str) -> Def {
Def {
text,
multiplicative: false,
points: true,
min: -MAX_POINTS,
max: MAX_POINTS,
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct Def {
text: &'static str,
multiplicative: bool,
points: bool,
min: f32,
max: f32,
}
impl Def {
#[must_use]
pub fn to_def(self) -> StatDef {
let def = if self.multiplicative {
StatDef::multiplicative(self.text)
} else {
StatDef::additive(self.text)
};
let format = if self.points {
StatFormat::Signed
} else {
StatFormat::Percent
};
def.range(self.min, self.max).format(format)
}
}
pub const ALL: [(&str, Def); 21] = [
(HEALTH_MAX, points("enshwick.stat.health_max")),
(STAMINA_MAX, points("enshwick.stat.stamina_max")),
(MANA_MAX, points("enshwick.stat.mana_max")),
(DAMAGE, factor("enshwick.stat.damage")),
(DAMAGE_CUT, factor("enshwick.stat.damage_cut")),
(DAMAGE_PIERCE, factor("enshwick.stat.damage_pierce")),
(DAMAGE_BLUNT, factor("enshwick.stat.damage_blunt")),
(DAMAGE_FIRE, factor("enshwick.stat.damage_fire")),
(DAMAGE_ICE, factor("enshwick.stat.damage_ice")),
(DAMAGE_SHROUD, factor("enshwick.stat.damage_shroud")),
(DAMAGE_LIGHTNING, factor("enshwick.stat.damage_lightning")),
(DAMAGE_POISON, factor("enshwick.stat.damage_poison")),
(RESISTANCE, resistance("enshwick.stat.resistance")),
(RESISTANCE_CUT, resistance("enshwick.stat.resistance_cut")),
(
RESISTANCE_PIERCE,
resistance("enshwick.stat.resistance_pierce"),
),
(
RESISTANCE_BLUNT,
resistance("enshwick.stat.resistance_blunt"),
),
(RESISTANCE_FIRE, resistance("enshwick.stat.resistance_fire")),
(RESISTANCE_ICE, resistance("enshwick.stat.resistance_ice")),
(
RESISTANCE_SHROUD,
resistance("enshwick.stat.resistance_shroud"),
),
(
RESISTANCE_LIGHTNING,
resistance("enshwick.stat.resistance_lightning"),
),
(
RESISTANCE_POISON,
resistance("enshwick.stat.resistance_poison"),
),
];
pub const BY_DAMAGE_TYPE: [Option<(&str, &str)>; crate::damage::DamageTypeNew::ALL.len()] = [
Some((DAMAGE_CUT, RESISTANCE_CUT)),
Some((DAMAGE_PIERCE, RESISTANCE_PIERCE)),
Some((DAMAGE_BLUNT, RESISTANCE_BLUNT)),
Some((DAMAGE_FIRE, RESISTANCE_FIRE)),
Some((DAMAGE_ICE, RESISTANCE_ICE)),
Some((DAMAGE_SHROUD, RESISTANCE_SHROUD)),
Some((DAMAGE_LIGHTNING, RESISTANCE_LIGHTNING)),
None,
Some((DAMAGE_POISON, RESISTANCE_POISON)),
None,
None,
None,
None,
];