mnml/server/src/spec.rs
2019-06-10 16:36:19 +10:00

744 lines
30 KiB
Rust

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<SpecBonus>,
}
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<Stat> {
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))
},
}
}
}