Make Nature a trait
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2022-11-27 17:36:42 +01:00
parent efd1acdfa5
commit 996a35ffa4
7 changed files with 56 additions and 33 deletions

View File

@@ -1,11 +1,26 @@
use crate::static_data::Statistic;
use crate::{ValueIdentifiable, ValueIdentifier};
use std::fmt::Debug;
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.
pub trait Nature: ValueIdentifiable + Debug {
/// The stat that should receive the increased modifier.
fn increased_stat(&self) -> Statistic;
/// The stat that should receive the decreased modifier.
fn decreased_stat(&self) -> Statistic;
/// 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
fn get_stat_modifier(&self, stat: Statistic) -> f32;
}
/// 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 {
pub struct NatureImpl {
/// A unique identifier so we know what value this is.
identifier: ValueIdentifier,
/// The stat that should receive the increased modifier.
@@ -18,7 +33,7 @@ pub struct Nature {
decrease_modifier: f32,
}
impl Nature {
impl NatureImpl {
/// Instantiates a new statistic.
pub fn new(
increase_stat: Statistic,
@@ -34,20 +49,22 @@ impl Nature {
decrease_modifier,
})
}
}
impl Nature for NatureImpl {
/// The stat that should receive the increased modifier.
pub fn increased_stat(&self) -> Statistic {
fn increased_stat(&self) -> Statistic {
self.increase_stat
}
/// The stat that should receive the decreased modifier.
pub fn decreased_stat(&self) -> Statistic {
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 {
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 {
@@ -58,7 +75,7 @@ impl Nature {
}
}
impl ValueIdentifiable for Nature {
impl ValueIdentifiable for NatureImpl {
fn value_identifier(&self) -> ValueIdentifier {
self.identifier
}