use construct::{Stat, Colours}; use util::{IntPct}; #[derive(Debug,Clone,Serialize,Deserialize)] pub struct SpecBonus { pub req: Colours, pub bonus: u64, } impl SpecBonus { pub fn get_bonus(&self, c: &Colours) -> u64 { if c.red >= self.req.red && c.blue >= self.req.blue && c.green >= self.req.green { return self.bonus; } return 0; } } #[derive(Debug,Clone,Serialize,Deserialize)] pub struct SpecValues { pub base: u64, pub multi: u64, pub bonuses: Vec, } impl SpecValues { pub fn max_value (&self, c: &Colours) -> u64 { self.bonuses.iter().fold(self.base, |acc, s| acc + s.get_bonus(c)) } pub fn base (self) -> u64 { self.base } /* pub fn calc_multi (&self, c: &Colours) -> u64 { self.multi * (c.red + c.green + c.blue) as u64 } */ } #[derive(Debug,Copy,Clone,Serialize,Deserialize,PartialEq,PartialOrd,Ord,Eq)] pub enum Spec { Speed, SpeedRR, SpeedBB, SpeedGG, SpeedRG, SpeedGB, SpeedRB, SpeedRRPlus, SpeedBBPlus, SpeedGGPlus, SpeedRGPlus, SpeedGBPlus, SpeedRBPlus, SpeedRRPlusPlus, SpeedBBPlusPlus, SpeedGGPlusPlus, SpeedRGPlusPlus, SpeedGBPlusPlus, SpeedRBPlusPlus, Life, LifeGG, LifeRR, LifeBB, LifeRG, LifeGB, LifeRB, LifeGGPlus, LifeRRPlus, LifeBBPlus, LifeRGPlus, LifeGBPlus, LifeRBPlus, LifeGGPlusPlus, LifeRRPlusPlus, LifeBBPlusPlus, LifeRGPlusPlus, LifeGBPlusPlus, LifeRBPlusPlus, Power, PowerRR, PowerGG, PowerBB, PowerRG, PowerGB, PowerRB, PowerRRPlus, PowerGGPlus, PowerBBPlus, PowerRGPlus, PowerGBPlus, PowerRBPlus, PowerRRPlusPlus, PowerGGPlusPlus, PowerBBPlusPlus, PowerRGPlusPlus, PowerGBPlusPlus, PowerRBPlusPlus, } impl Spec { pub fn affects(&self) -> Vec { match *self { Spec::Power => vec![Stat::BluePower, Stat::RedPower, Stat::GreenPower], Spec::PowerRR => vec![Stat::RedPower], Spec::PowerGG => vec![Stat::GreenPower], Spec::PowerBB => vec![Stat::BluePower], Spec::PowerRG => vec![Stat::GreenPower, Stat::RedPower], Spec::PowerGB => vec![Stat::GreenPower, Stat::BluePower], Spec::PowerRB => vec![Stat::RedPower, Stat::BluePower], Spec::PowerRRPlus => vec![Stat::RedPower], Spec::PowerGGPlus => vec![Stat::GreenPower], Spec::PowerBBPlus => vec![Stat::BluePower], Spec::PowerRGPlus => vec![Stat::GreenPower, Stat::RedPower], Spec::PowerGBPlus => vec![Stat::GreenPower, Stat::BluePower], Spec::PowerRBPlus => vec![Stat::RedPower, Stat::BluePower], Spec::PowerRRPlusPlus => vec![Stat::RedPower], Spec::PowerGGPlusPlus => vec![Stat::GreenPower], Spec::PowerBBPlusPlus => vec![Stat::BluePower], Spec::PowerRGPlusPlus => vec![Stat::GreenPower, Stat::RedPower], Spec::PowerGBPlusPlus => vec![Stat::GreenPower, Stat::BluePower], Spec::PowerRBPlusPlus => vec![Stat::RedPower, Stat::BluePower], Spec::Speed => vec![Stat::Speed], Spec::SpeedRR => vec![Stat::Speed], Spec::SpeedBB => vec![Stat::Speed], Spec::SpeedGG => vec![Stat::Speed], Spec::SpeedRG => vec![Stat::Speed], Spec::SpeedGB => vec![Stat::Speed], Spec::SpeedRB => vec![Stat::Speed], Spec::SpeedRRPlus => vec![Stat::Speed], Spec::SpeedBBPlus => vec![Stat::Speed], Spec::SpeedGGPlus => vec![Stat::Speed], Spec::SpeedRGPlus => vec![Stat::Speed], Spec::SpeedGBPlus => vec![Stat::Speed], Spec::SpeedRBPlus => vec![Stat::Speed], Spec::SpeedRRPlusPlus => vec![Stat::Speed], Spec::SpeedBBPlusPlus => vec![Stat::Speed], Spec::SpeedGGPlusPlus => vec![Stat::Speed], Spec::SpeedRGPlusPlus => vec![Stat::Speed], Spec::SpeedGBPlusPlus => vec![Stat::Speed], Spec::SpeedRBPlusPlus => vec![Stat::Speed], Spec::Life => vec![Stat::GreenLife], Spec::LifeRR => vec![Stat::RedLife], Spec::LifeBB => vec![Stat::BlueLife], Spec::LifeGG => vec![Stat::GreenLife], Spec::LifeRG => vec![Stat::GreenLife, Stat::RedLife], Spec::LifeGB => vec![Stat::GreenLife, Stat::BlueLife], Spec::LifeRB => vec![Stat::BlueLife, Stat::RedLife], Spec::LifeRRPlus => vec![Stat::RedLife], Spec::LifeBBPlus => vec![Stat::BlueLife], Spec::LifeGGPlus => vec![Stat::GreenLife], Spec::LifeRGPlus => vec![Stat::GreenLife, Stat::RedLife], Spec::LifeGBPlus => vec![Stat::GreenLife, Stat::BlueLife], Spec::LifeRBPlus => vec![Stat::BlueLife, Stat::RedLife], Spec::LifeRRPlusPlus => vec![Stat::RedLife], Spec::LifeBBPlusPlus => vec![Stat::BlueLife], Spec::LifeGGPlusPlus => vec![Stat::GreenLife], Spec::LifeRGPlusPlus => vec![Stat::GreenLife, Stat::RedLife], Spec::LifeGBPlusPlus => vec![Stat::GreenLife, Stat::BlueLife], Spec::LifeRBPlusPlus => vec![Stat::BlueLife, Stat::RedLife], } } pub fn values(&self) -> SpecValues { match *self { Spec::Power => SpecValues { multi: 0, base: 10, bonuses: vec![] }, Spec::PowerRR=> SpecValues { multi: 10, base: 25, bonuses: vec![ SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 25 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 25 }, SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 25 } ], }, Spec::PowerGG=> SpecValues { multi: 10, base: 25, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 25 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 25 }, SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 25 } ], }, Spec::PowerBB=> SpecValues { multi: 10, base: 25, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 25 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 25 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 25 } ], }, Spec::PowerRG=> SpecValues { multi: 5, base: 15, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 15 }, SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 15 }, SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 15 } ], }, Spec::PowerGB=> SpecValues { multi: 5, base: 15, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 15 }, SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 15 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 15 } ], }, Spec::PowerRB=> SpecValues { multi: 5, base: 15, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 15 }, SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 15 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 15 } ], }, Spec::PowerRRPlus => SpecValues { multi: 10, base: 40, bonuses: vec![ SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 40 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 40 }, SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 40 } ], }, Spec::PowerGGPlus => SpecValues { multi: 10, base: 40, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 40 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 40 }, SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 40 } ], }, Spec::PowerBBPlus => SpecValues { multi: 10, base: 40, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 40 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 40 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 40 } ], }, Spec::PowerRGPlus => SpecValues { multi: 7, base: 25, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 25 }, SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 25 }, SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 25 } ], }, Spec::PowerGBPlus => SpecValues { multi: 7, base: 25, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 25 }, SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 25 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 25 } ], }, Spec::PowerRBPlus => SpecValues { multi: 7, base: 25, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 25 }, SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 25 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 25 } ], }, Spec::PowerRRPlusPlus => SpecValues { multi: 20, base: 60, bonuses: vec![ SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 60 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 60 }, SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 60 } ], }, Spec::PowerGGPlusPlus => SpecValues { multi: 20, base: 60, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 60 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 60 }, SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 60 } ], }, Spec::PowerBBPlusPlus => SpecValues { multi: 20, base: 60, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 60 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 60 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 60 } ], }, Spec::PowerRGPlusPlus => SpecValues { multi: 20, base: 40, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 40 }, SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 40 }, SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 40 } ], }, Spec::PowerGBPlusPlus => SpecValues { multi: 20, base: 40, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 25 }, SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 25 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 25 } ], }, Spec::PowerRBPlusPlus => SpecValues { multi: 20, base: 40, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 25 }, SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 25 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 25 } ], }, Spec::Speed => SpecValues { multi: 0, base: 40, bonuses: vec![] }, Spec::SpeedRR=> SpecValues { multi: 20, base: 80, bonuses: vec![ SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 80 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 80 }, SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 80 } ], }, Spec::SpeedGG=> SpecValues { multi: 20, base: 80, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 80 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 80 }, SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 80 } ], }, Spec::SpeedBB=> SpecValues { multi: 20, base: 80, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 80 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 80 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 80 } ], }, Spec::SpeedRG=> SpecValues { multi: 15, base: 60, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 60 }, SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 60 }, SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 60 } ], }, Spec::SpeedGB=> SpecValues { multi: 15, base: 60, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 60 }, SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 60 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 60 } ], }, Spec::SpeedRB=> SpecValues { multi: 15, base: 60, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 60 }, SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 60 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 60 } ], }, Spec::SpeedRRPlus => SpecValues { multi: 20, base: 120, bonuses: vec![ SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 120 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 120 }, SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 120 } ], }, Spec::SpeedGGPlus => SpecValues { multi: 20, base: 120, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 120 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 120 }, SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 120 } ], }, Spec::SpeedBBPlus => SpecValues { multi: 20, base: 120, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 120 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 120 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 120 } ], }, Spec::SpeedRGPlus => SpecValues { multi: 15, base: 80, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 80 }, SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 80 }, SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 80 } ], }, Spec::SpeedGBPlus => SpecValues { multi: 15, base: 80, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 80 }, SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 80 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 80 } ], }, Spec::SpeedRBPlus => SpecValues { multi: 15, base: 80, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 80 }, SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 80 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 80 } ], }, Spec::SpeedRRPlusPlus => SpecValues { multi: 20, base: 160, bonuses: vec![ SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 160 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 160 }, SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 160 } ], }, Spec::SpeedGGPlusPlus => SpecValues { multi: 20, base: 160, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 160 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 160 }, SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 160 } ], }, Spec::SpeedBBPlusPlus => SpecValues { multi: 20, base: 160, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 160 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 160 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 160 } ], }, Spec::SpeedRGPlusPlus => SpecValues { multi: 15, base: 120, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 120 }, SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 120 }, SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 120 } ], }, Spec::SpeedGBPlusPlus => SpecValues { multi: 15, base: 120, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 120 }, SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 120 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 120 } ], }, Spec::SpeedRBPlusPlus => SpecValues { multi: 15, base: 120, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 120 }, SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 120 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 120 } ], }, Spec::Life => SpecValues { multi: 0, base: 100, bonuses: vec![]}, Spec::LifeRR=> SpecValues { multi: 50, base: 200, bonuses: vec![ SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 100 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 100 }, SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 100 } ], }, Spec::LifeGG=> SpecValues { multi: 50, base: 200, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 100 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 100 }, SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 100 } ], }, Spec::LifeBB=> SpecValues { multi: 50, base: 200, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 100 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 100 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 100 } ], }, Spec::LifeRG=> SpecValues { multi: 40, base: 150, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 75 }, SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 75 }, SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 75 } ], }, Spec::LifeGB=> SpecValues { multi: 40, base: 150, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 75 }, SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 75 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 75 } ], }, Spec::LifeRB=> SpecValues { multi: 40, base: 150, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 75 }, SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 75 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 75 } ], }, Spec::LifeRRPlus => SpecValues { multi: 50, base: 300, bonuses: vec![ SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 150 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 150 }, SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 150 } ], }, Spec::LifeGGPlus => SpecValues { multi: 50, base: 300, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 150 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 150 }, SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 150 } ], }, Spec::LifeBBPlus => SpecValues { multi: 50, base: 300, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 150 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 150 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 150 } ], }, Spec::LifeRGPlus => SpecValues { multi: 40, base: 200, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 100 }, SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 100 }, SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 100 } ], }, Spec::LifeGBPlus => SpecValues { multi: 40, base: 200, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 100 }, SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 100 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 100 } ], }, Spec::LifeRBPlus => SpecValues { multi: 40, base: 200, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 100 }, SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 100 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 100 } ], }, Spec::LifeRRPlusPlus => SpecValues { multi: 40, base: 300, bonuses: vec![ SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 300 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 300 }, SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 300 } ], }, Spec::LifeGGPlusPlus => SpecValues { multi: 40, base: 300, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 300 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 300 }, SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 300 } ], }, Spec::LifeBBPlusPlus => SpecValues { multi: 40, base: 300, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 300 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 300 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 300 } ], }, Spec::LifeRGPlusPlus => SpecValues { multi: 40, base: 200, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 200 }, SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 200 }, SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 200 } ], }, Spec::LifeGBPlusPlus => SpecValues { multi: 40, base: 200, bonuses: vec![ SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 200 }, SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 200 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 200 } ], }, Spec::LifeRBPlusPlus => SpecValues { multi: 40, base: 200, bonuses: vec![ SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 200 }, SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 200 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 200 } ], }, } } pub fn apply(&self, modified: u64, base: u64, construct_colours: &Colours, player_colours: &Colours) -> u64 { match *self { // Percentage multipliers based on base value Spec::Power | Spec::Speed => modified + base.pct(self.values().base), Spec::PowerRR| Spec::PowerGG| Spec::PowerBB| Spec::PowerRG| Spec::PowerGB| Spec::PowerRB| Spec::PowerRRPlus | Spec::PowerGGPlus | Spec::PowerBBPlus | Spec::PowerRGPlus | Spec::PowerGBPlus | Spec::PowerRBPlus | Spec::PowerRRPlusPlus | Spec::PowerGGPlusPlus | Spec::PowerBBPlusPlus | Spec::PowerRGPlusPlus | Spec::PowerGBPlusPlus | Spec::PowerRBPlusPlus | Spec::SpeedRR| Spec::SpeedGG| Spec::SpeedBB| Spec::SpeedRG| Spec::SpeedGB| Spec::SpeedRB| Spec::SpeedRRPlus | Spec::SpeedGGPlus | Spec::SpeedBBPlus | Spec::SpeedRGPlus | Spec::SpeedGBPlus | Spec::SpeedRBPlus | Spec::SpeedRRPlusPlus | Spec::SpeedGGPlusPlus | Spec::SpeedBBPlusPlus | Spec::SpeedRGPlusPlus | Spec::SpeedGBPlusPlus | Spec::SpeedRBPlusPlus => modified + base.pct(self.values().max_value(player_colours)), // Flat bonus Spec::Life => modified + self.values().base, Spec::LifeRR| Spec::LifeGG| Spec::LifeBB| Spec::LifeRG| Spec::LifeGB| Spec::LifeRB| Spec::LifeRRPlus | Spec::LifeGGPlus | Spec::LifeBBPlus | Spec::LifeRGPlus | Spec::LifeGBPlus | Spec::LifeRBPlus | Spec::LifeRRPlusPlus | Spec::LifeGGPlusPlus | Spec::LifeBBPlusPlus | Spec::LifeRGPlusPlus | Spec::LifeGBPlusPlus | Spec::LifeRBPlusPlus => modified + self.values().max_value(player_colours), } } }