mnml/server/src/spec.rs
2019-07-22 11:05:21 +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,
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<Stat> {
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(cmp::min(self.values().calc_multi(construct_colours),
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 + {
cmp::min(self.values().calc_multi(construct_colours),
self.values().max_value(player_colours))
},
}
}
}