use construct::{Stat, Colours}; use util::{IntPct}; use std::cmp; #[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 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, SpeedRRI, SpeedBBI, SpeedGGI, SpeedRGI, SpeedGBI, SpeedRBI, SpeedRRII, SpeedBBII, SpeedGGII, SpeedRGII, SpeedGBII, SpeedRBII, SpeedRRIII, SpeedBBIII, SpeedGGIII, SpeedRGIII, SpeedGBIII, SpeedRBIII, Life, LifeGGI, LifeRRI, LifeBBI, LifeRGI, LifeGBI, LifeRBI, LifeGGII, LifeRRII, LifeBBII, LifeRGII, LifeGBII, LifeRBII, LifeGGIII, LifeRRIII, LifeBBIII, LifeRGIII, LifeGBIII, LifeRBIII, Power, PowerRRI, PowerGGI, PowerBBI, PowerRGI, PowerGBI, PowerRBI, PowerRRII, PowerGGII, PowerBBII, PowerRGII, PowerGBII, PowerRBII, PowerRRIII, PowerGGIII, PowerBBIII, PowerRGIII, PowerGBIII, PowerRBIII, } impl Spec { pub fn affects(&self) -> Vec { match *self { Spec::Power => vec![Stat::BluePower, Stat::RedPower, Stat::GreenPower], Spec::PowerRRI => vec![Stat::RedPower], Spec::PowerGGI => vec![Stat::GreenPower], Spec::PowerBBI => vec![Stat::BluePower], Spec::PowerRGI => vec![Stat::GreenPower, Stat::RedPower], Spec::PowerGBI => vec![Stat::GreenPower, Stat::BluePower], Spec::PowerRBI => vec![Stat::RedPower, Stat::BluePower], Spec::PowerRRII => vec![Stat::RedPower], Spec::PowerGGII => vec![Stat::GreenPower], Spec::PowerBBII => vec![Stat::BluePower], Spec::PowerRGII => vec![Stat::GreenPower, Stat::RedPower], Spec::PowerGBII => vec![Stat::GreenPower, Stat::BluePower], Spec::PowerRBII => vec![Stat::RedPower, Stat::BluePower], Spec::PowerRRIII => vec![Stat::RedPower], Spec::PowerGGIII => vec![Stat::GreenPower], Spec::PowerBBIII => vec![Stat::BluePower], Spec::PowerRGIII => vec![Stat::GreenPower, Stat::RedPower], Spec::PowerGBIII => vec![Stat::GreenPower, Stat::BluePower], Spec::PowerRBIII => vec![Stat::RedPower, Stat::BluePower], Spec::Speed => vec![Stat::Speed], Spec::SpeedRRI => vec![Stat::Speed], Spec::SpeedBBI => vec![Stat::Speed], Spec::SpeedGGI => vec![Stat::Speed], Spec::SpeedRGI => vec![Stat::Speed], Spec::SpeedGBI => vec![Stat::Speed], Spec::SpeedRBI => vec![Stat::Speed], Spec::SpeedRRII => vec![Stat::Speed], Spec::SpeedBBII => vec![Stat::Speed], Spec::SpeedGGII => vec![Stat::Speed], Spec::SpeedRGII => vec![Stat::Speed], Spec::SpeedGBII => vec![Stat::Speed], Spec::SpeedRBII => vec![Stat::Speed], Spec::SpeedRRIII => vec![Stat::Speed], Spec::SpeedBBIII => vec![Stat::Speed], Spec::SpeedGGIII => vec![Stat::Speed], Spec::SpeedRGIII => vec![Stat::Speed], Spec::SpeedGBIII => vec![Stat::Speed], Spec::SpeedRBIII => vec![Stat::Speed], Spec::Life => vec![Stat::GreenLife], Spec::LifeRRI => vec![Stat::RedLife], Spec::LifeBBI => vec![Stat::BlueLife], Spec::LifeGGI => vec![Stat::GreenLife], Spec::LifeRGI => vec![Stat::GreenLife, Stat::RedLife], Spec::LifeGBI => vec![Stat::GreenLife, Stat::BlueLife], Spec::LifeRBI => vec![Stat::BlueLife, Stat::RedLife], Spec::LifeRRII => vec![Stat::RedLife], Spec::LifeBBII => vec![Stat::BlueLife], Spec::LifeGGII => vec![Stat::GreenLife], Spec::LifeRGII => vec![Stat::GreenLife, Stat::RedLife], Spec::LifeGBII => vec![Stat::GreenLife, Stat::BlueLife], Spec::LifeRBII => vec![Stat::BlueLife, Stat::RedLife], Spec::LifeRRIII => vec![Stat::RedLife], Spec::LifeBBIII => vec![Stat::BlueLife], Spec::LifeGGIII => vec![Stat::GreenLife], Spec::LifeRGIII => vec![Stat::GreenLife, Stat::RedLife], Spec::LifeGBIII => vec![Stat::GreenLife, Stat::BlueLife], Spec::LifeRBIII => vec![Stat::BlueLife, Stat::RedLife], } } pub fn values(&self) -> SpecValues { match *self { Spec::Power => SpecValues { multi: 0, base: 10, bonuses: vec![] }, Spec::PowerRRI => 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::PowerGGI => 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::PowerBBI => 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::PowerRGI => 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::PowerGBI => 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::PowerRBI => 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::PowerRRII => 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::PowerGGII => 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::PowerBBII => 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::PowerRGII => 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::PowerGBII => 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::PowerRBII => 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::PowerRRIII => 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::PowerGGIII => 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::PowerBBIII => 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::PowerRGIII => 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::PowerGBIII => 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::PowerRBIII => 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::SpeedRRI => 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::SpeedGGI => 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::SpeedBBI => 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::SpeedRGI => 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::SpeedGBI => 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::SpeedRBI => 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::SpeedRRII => 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::SpeedGGII => 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::SpeedBBII => 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::SpeedRGII => 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::SpeedGBII => 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::SpeedRBII => 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::SpeedRRIII => 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::SpeedGGIII => 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::SpeedBBIII => 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::SpeedRGIII => 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::SpeedGBIII => 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::SpeedRBIII => 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::LifeRRI => 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::LifeGGI => 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::LifeBBI => 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::LifeRGI => 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::LifeGBI => 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::LifeRBI => 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::LifeRRII => 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::LifeGGII => 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::LifeBBII => 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::LifeRGII => 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::LifeGBII => 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::LifeRBII => 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::LifeRRIII => 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::LifeGGIII => 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::LifeBBIII => 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::LifeRGIII => 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::LifeGBIII => 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::LifeRBIII => 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::PowerRRI | Spec::PowerGGI | Spec::PowerBBI | Spec::PowerRGI | Spec::PowerGBI | Spec::PowerRBI | Spec::PowerRRII | Spec::PowerGGII | Spec::PowerBBII | Spec::PowerRGII | Spec::PowerGBII | Spec::PowerRBII | Spec::PowerRRIII | Spec::PowerGGIII | Spec::PowerBBIII | Spec::PowerRGIII | Spec::PowerGBIII | Spec::PowerRBIII | Spec::SpeedRRI | Spec::SpeedGGI | Spec::SpeedBBI | Spec::SpeedRGI | Spec::SpeedGBI | Spec::SpeedRBI | Spec::SpeedRRII | Spec::SpeedGGII | Spec::SpeedBBII | Spec::SpeedRGII | Spec::SpeedGBII | Spec::SpeedRBII | Spec::SpeedRRIII | Spec::SpeedGGIII | Spec::SpeedBBIII | Spec::SpeedRGIII | Spec::SpeedGBIII | Spec::SpeedRBIII => modified + { base.pct(cmp::min(self.values().calc_multi(construct_colours), self.values().max_value(player_colours))) }, // Flat bonus Spec::Life => modified + self.values().base, Spec::LifeRRI | Spec::LifeGGI | Spec::LifeBBI | Spec::LifeRGI | Spec::LifeGBI | Spec::LifeRBI | Spec::LifeRRII | Spec::LifeGGII | Spec::LifeBBII | Spec::LifeRGII | Spec::LifeGBII | Spec::LifeRBII | Spec::LifeRRIII | Spec::LifeGGIII | Spec::LifeBBIII | Spec::LifeRGIII | Spec::LifeGBIII | Spec::LifeRBIII => modified + { cmp::min(self.values().calc_multi(construct_colours), self.values().max_value(player_colours)) }, } } }