use crate::static_data::Statistic; use crate::{ValueIdentifiable, ValueIdentifier}; use std::sync::Arc; /// A nature is an attribute on a Pokemon that modifies the effective base stats on a Pokemon. They /// can have an increased statistic and a decreased statistic, or be neutral. #[derive(Debug)] pub struct Nature { /// A unique identifier so we know what value this is. identifier: ValueIdentifier, /// The stat that should receive the increased modifier. increase_stat: Statistic, /// The stat that should receive the decreased modifier. decrease_stat: Statistic, /// The amount by which the increased stat is multiplied. increase_modifier: f32, /// The amount by which the decreased stat is multiplied. decrease_modifier: f32, } impl Nature { /// Instantiates a new statistic. pub fn new( increase_stat: Statistic, decrease_stat: Statistic, increase_modifier: f32, decrease_modifier: f32, ) -> Arc { Arc::new(Self { identifier: Default::default(), increase_stat, decrease_stat, increase_modifier, decrease_modifier, }) } /// The stat that should receive the increased modifier. pub fn increased_stat(&self) -> Statistic { self.increase_stat } /// The stat that should receive the decreased modifier. pub fn decreased_stat(&self) -> Statistic { self.decrease_stat } /// Calculates the modifier for a given stat. If it's the increased stat, returns the increased /// modifier, if it's the decreased stat, returns the decreased modifier. Otherwise returns 1.0 pub fn get_stat_modifier(&self, stat: Statistic) -> f32 { if stat == self.increase_stat && stat != self.decrease_stat { self.increase_modifier } else if stat == self.decrease_stat && stat != self.increase_stat { self.decrease_modifier } else { 1.0 } } } impl ValueIdentifiable for Nature { fn value_identifier(&self) -> ValueIdentifier { self.identifier } }