use crate::defines::LevelInt; pub trait GrowthRate { fn calculate_level(&self, experience: u32) -> LevelInt; fn calculate_experience(&self, level: LevelInt) -> u32; } pub struct LookupGrowthRate { experience: Vec, } impl LookupGrowthRate { pub fn new(experience: Vec) -> LookupGrowthRate { LookupGrowthRate { experience } } } impl GrowthRate for LookupGrowthRate { fn calculate_level(&self, experience: u32) -> LevelInt { for (i, v) in self.experience.iter().enumerate() { if *v > experience { return i as LevelInt; } } self.experience.len() as LevelInt } fn calculate_experience(&self, level: LevelInt) -> u32 { if level >= self.experience.len() as LevelInt { *self.experience.last().unwrap() } else { self.experience[(level - 1) as usize] } } }