rework spec calculation system

This commit is contained in:
Mashy 2019-05-29 13:15:56 +10:00
parent fc07bffb93
commit ab5a38f86f
3 changed files with 206 additions and 151 deletions

View File

@ -891,7 +891,7 @@ mod tests {
return; return;
} }
#[test] #[test]
fn construct_player_modifiers_test() { fn construct_player_modifiers_test() {
let mut construct = Construct::new() let mut construct = Construct::new()
.named(&"player player".to_string()); .named(&"player player".to_string());
@ -899,6 +899,30 @@ mod tests {
construct.spec_add(Spec::PowerRRI).unwrap(); construct.spec_add(Spec::PowerRRI).unwrap();
construct.spec_add(Spec::PowerGGI).unwrap(); construct.spec_add(Spec::PowerGGI).unwrap();
construct.spec_add(Spec::PowerBBI).unwrap(); construct.spec_add(Spec::PowerBBI).unwrap();
construct.learn_mut(Skill::StrikeIII); // 18 reds (24 total)
let player_colours = Colours {
red: 5,
green: 15,
blue: 25,
};
construct.apply_modifiers(&player_colours);
assert!(construct.red_power.value == construct.red_power.base + construct.red_power.base.pct(80));
assert!(construct.green_power.value == construct.green_power.base + construct.green_power.base.pct(120));
assert!(construct.blue_power.value == construct.blue_power.base + construct.blue_power.base.pct(160));
return;
}
#[test]
fn construct_player_modifiers_base_test() {
let mut construct = Construct::new()
.named(&"player player".to_string());
construct.spec_add(Spec::Power).unwrap();
construct.spec_add(Spec::Life).unwrap();
let player_colours = Colours { let player_colours = Colours {
red: 5, red: 5,
@ -909,9 +933,35 @@ mod tests {
construct.apply_modifiers(&player_colours); construct.apply_modifiers(&player_colours);
assert!(construct.red_power.value == construct.red_power.base + construct.red_power.base.pct(20)); assert!(construct.red_power.value == construct.red_power.base + construct.red_power.base.pct(20));
assert!(construct.green_power.value == construct.green_power.base + construct.green_power.base.pct(40)); assert!(construct.green_power.value == construct.green_power.base + construct.green_power.base.pct(20));
assert!(construct.blue_power.value == construct.blue_power.base + construct.blue_power.base.pct(80)); assert!(construct.blue_power.value == construct.blue_power.base + construct.blue_power.base.pct(20));
assert!(construct.green_life.value == construct.green_life.base + 150);
return; return;
} }
#[test]
fn construct_player_modifiers_spec_bonus_test() {
let mut construct = Construct::new()
.named(&"player player".to_string());
construct.spec_add(Spec::PowerRRI).unwrap();
construct.spec_add(Spec::PowerGGI).unwrap();
construct.spec_add(Spec::PowerBBI).unwrap();
let player_colours = Colours {
red: 5,
green: 0,
blue: 0,
};
construct.apply_modifiers(&player_colours);
assert!(construct.red_power.value == construct.red_power.base + construct.red_power.base.pct(60));
assert!(construct.green_power.value == construct.green_power.base + construct.green_power.base.pct(40));
assert!(construct.blue_power.value == construct.blue_power.base + construct.blue_power.base.pct(40));
return;
}
} }

View File

@ -697,78 +697,78 @@ impl Item {
Item::ParryIII => vec![Item::ParryII, Item::ParryII, Item::ParryII], // Add red recharge Item::ParryIII => vec![Item::ParryII, Item::ParryII, Item::ParryII], // Add red recharge
Item::PurifyI => vec![Item::Block, Item::Green, Item::Green], Item::PurifyI => vec![Item::Block, Item::Green, Item::Green],
Item::PurifyII => vec![Item::PurifyI, Item::PurifyI, Item::PurifyI], Item::PurifyII => vec![Item::PurifyI, Item::PurifyI, Item::PurifyI],
Item::PurifyIII => vec![Item::PurifyII, Item::PurifyII, Item::PurifyII], Item::PurifyIII => vec![Item::PurifyII, Item::PurifyII, Item::PurifyII],
Item::CorruptI => vec![Item::Block, Item::Blue, Item::Blue], Item::CorruptI => vec![Item::Block, Item::Blue, Item::Blue],
Item::CorruptII => vec![Item::CorruptI, Item::CorruptI, Item::CorruptI], Item::CorruptII => vec![Item::CorruptI, Item::CorruptI, Item::CorruptI],
Item::CorruptIII => vec![Item::CorruptII, Item::CorruptII, Item::CorruptII], Item::CorruptIII => vec![Item::CorruptII, Item::CorruptII, Item::CorruptII],
Item::ClutchI => vec![Item::Block, Item::Red, Item::Green], Item::ClutchI => vec![Item::Block, Item::Red, Item::Green],
Item::ClutchII => vec![Item::ClutchI, Item::ClutchI, Item::ClutchI], Item::ClutchII => vec![Item::ClutchI, Item::ClutchI, Item::ClutchI],
Item::ClutchIII => vec![Item::ClutchII, Item::ClutchII, Item::ClutchII], Item::ClutchIII => vec![Item::ClutchII, Item::ClutchII, Item::ClutchII],
Item::ReflectI => vec![Item::Block, Item::Green, Item::Blue], Item::ReflectI => vec![Item::Block, Item::Green, Item::Blue],
Item::ReflectII => vec![Item::ReflectI, Item::ReflectI, Item::ReflectI], Item::ReflectII => vec![Item::ReflectI, Item::ReflectI, Item::ReflectI],
Item::ReflectIII => vec![Item::ReflectII, Item::ReflectII, Item::ReflectII], Item::ReflectIII => vec![Item::ReflectII, Item::ReflectII, Item::ReflectII],
Item::RechargeI => vec![Item::Block, Item::Red, Item::Blue], Item::RechargeI => vec![Item::Block, Item::Red, Item::Blue],
Item::RechargeII => vec![Item::RechargeI, Item::RechargeI, Item::RechargeI], Item::RechargeII => vec![Item::RechargeI, Item::RechargeI, Item::RechargeI],
Item::RechargeIII => vec![Item::RechargeII, Item::RechargeII, Item::RechargeII], Item::RechargeIII => vec![Item::RechargeII, Item::RechargeII, Item::RechargeII],
Item::StrangleI => vec![Item::Stun, Item::Red, Item::Red], Item::StrangleI => vec![Item::Stun, Item::Red, Item::Red],
Item::StrangleII => vec![Item::StrangleI, Item::StrangleI, Item::StrangleI], Item::StrangleII => vec![Item::StrangleI, Item::StrangleI, Item::StrangleI],
Item::StrangleIII => vec![Item::StrangleII, Item::StrangleII, Item::StrangleII], Item::StrangleIII => vec![Item::StrangleII, Item::StrangleII, Item::StrangleII],
Item::SleepI => vec![Item::Stun, Item::Green, Item::Green], Item::SleepI => vec![Item::Stun, Item::Green, Item::Green],
Item::SleepII => vec![Item::SleepI, Item::SleepI, Item::SleepI], Item::SleepII => vec![Item::SleepI, Item::SleepI, Item::SleepI],
Item::SleepIII => vec![Item::SleepII, Item::SleepII, Item::SleepII], Item::SleepIII => vec![Item::SleepII, Item::SleepII, Item::SleepII],
Item::RuinI => vec![Item::Stun, Item::Blue, Item::Blue], Item::RuinI => vec![Item::Stun, Item::Blue, Item::Blue],
Item::RuinII => vec![Item::RuinI, Item::RuinI, Item::RuinI], Item::RuinII => vec![Item::RuinI, Item::RuinI, Item::RuinI],
Item::RuinIII => vec![Item::RuinII, Item::RuinII, Item::RuinII], Item::RuinIII => vec![Item::RuinII, Item::RuinII, Item::RuinII],
Item::ThrowI => vec![Item::Stun, Item::Red, Item::Green], Item::ThrowI => vec![Item::Stun, Item::Red, Item::Green],
Item::ThrowII => vec![Item::ThrowI, Item::ThrowI, Item::ThrowI], Item::ThrowII => vec![Item::ThrowI, Item::ThrowI, Item::ThrowI],
Item::ThrowIII => vec![Item::ThrowII, Item::ThrowII, Item::ThrowII], Item::ThrowIII => vec![Item::ThrowII, Item::ThrowII, Item::ThrowII],
Item::HexI => vec![Item::Stun, Item::Green, Item::Blue], Item::HexI => vec![Item::Stun, Item::Green, Item::Blue],
Item::HexII => vec![Item::HexI, Item::HexI, Item::HexI], Item::HexII => vec![Item::HexI, Item::HexI, Item::HexI],
Item::HexIII => vec![Item::HexII, Item::HexII, Item::HexII], Item::HexIII => vec![Item::HexII, Item::HexII, Item::HexII],
Item::BanishI => vec![Item::Stun, Item::Red, Item::Blue], Item::BanishI => vec![Item::Stun, Item::Red, Item::Blue],
Item::BanishII => vec![Item::BanishI, Item::BanishI, Item::BanishI], Item::BanishII => vec![Item::BanishI, Item::BanishI, Item::BanishI],
Item::BanishIII => vec![Item::BanishII, Item::BanishII, Item::BanishII], Item::BanishIII => vec![Item::BanishII, Item::BanishII, Item::BanishII],
Item::StrikeI => vec![Item::Attack, Item::Red, Item::Red], Item::StrikeI => vec![Item::Attack, Item::Red, Item::Red],
Item::StrikeII => vec![Item::StrikeI, Item::StrikeI, Item::StrikeI], Item::StrikeII => vec![Item::StrikeI, Item::StrikeI, Item::StrikeI],
Item::StrikeIII => vec![Item::StrikeII, Item::StrikeII, Item::StrikeII], Item::StrikeIII => vec![Item::StrikeII, Item::StrikeII, Item::StrikeII],
Item::HealI => vec![Item::Attack, Item::Green, Item::Green], Item::HealI => vec![Item::Attack, Item::Green, Item::Green],
Item::HealII => vec![Item::HealI, Item::HealI, Item::HealI], Item::HealII => vec![Item::HealI, Item::HealI, Item::HealI],
Item::HealIII => vec![Item::HealII, Item::HealII, Item::HealII], Item::HealIII => vec![Item::HealII, Item::HealII, Item::HealII],
Item::BlastI => vec![Item::Attack, Item::Blue, Item::Blue], Item::BlastI => vec![Item::Attack, Item::Blue, Item::Blue],
Item::BlastII => vec![Item::BlastI, Item::BlastI, Item::BlastI], Item::BlastII => vec![Item::BlastI, Item::BlastI, Item::BlastI],
Item::BlastIII => vec![Item::BlastII, Item::BlastII, Item::BlastII], Item::BlastIII => vec![Item::BlastII, Item::BlastII, Item::BlastII],
Item::SlayI => vec![Item::Attack, Item::Red, Item::Green], Item::SlayI => vec![Item::Attack, Item::Red, Item::Green],
Item::SlayII => vec![Item::SlayI, Item::SlayI, Item::SlayI], Item::SlayII => vec![Item::SlayI, Item::SlayI, Item::SlayI],
Item::SlayIII => vec![Item::SlayII, Item::SlayII, Item::SlayII], Item::SlayIII => vec![Item::SlayII, Item::SlayII, Item::SlayII],
Item::SiphonI => vec![Item::Attack, Item::Green, Item::Blue], Item::SiphonI => vec![Item::Attack, Item::Green, Item::Blue],
Item::SiphonII => vec![Item::SiphonI, Item::SiphonI, Item::SiphonI], Item::SiphonII => vec![Item::SiphonI, Item::SiphonI, Item::SiphonI],
Item::SiphonIII => vec![Item::SiphonII, Item::SiphonII, Item::SiphonII], Item::SiphonIII => vec![Item::SiphonII, Item::SiphonII, Item::SiphonII],
Item::ChaosI => vec![Item::Attack, Item::Red, Item::Blue], Item::ChaosI => vec![Item::Attack, Item::Red, Item::Blue],
Item::ChaosII => vec![Item::ChaosI, Item::ChaosI, Item::ChaosI], Item::ChaosII => vec![Item::ChaosI, Item::ChaosI, Item::ChaosI],
Item::ChaosIII => vec![Item::ChaosII, Item::ChaosII, Item::ChaosII], Item::ChaosIII => vec![Item::ChaosII, Item::ChaosII, Item::ChaosII],
Item::PowerRRI => vec![Item::Power, Item::Red, Item::Red], Item::PowerRRI => vec![Item::Power, Item::Red, Item::Red],
Item::PowerGGI => vec![Item::Power, Item::Green, Item::Green], Item::PowerGGI => vec![Item::Power, Item::Green, Item::Green],
Item::PowerBBI => vec![Item::Power, Item::Blue, Item::Blue], Item::PowerBBI => vec![Item::Power, Item::Blue, Item::Blue],
Item::PowerRGI => vec![Item::Power, Item::Red, Item::Green], Item::PowerRGI => vec![Item::Power, Item::Red, Item::Green],
Item::PowerGBI => vec![Item::Power, Item::Green, Item::Blue], Item::PowerGBI => vec![Item::Power, Item::Green, Item::Blue],
Item::PowerRBI => vec![Item::Power, Item::Red, Item::Blue], Item::PowerRBI => vec![Item::Power, Item::Red, Item::Blue],
Item::LifeRRI => vec![Item::Life, Item::Red, Item::Red], Item::LifeRRI => vec![Item::Life, Item::Red, Item::Red],
Item::LifeGGI => vec![Item::Life, Item::Green, Item::Green], Item::LifeGGI => vec![Item::Life, Item::Green, Item::Green],
Item::LifeBBI => vec![Item::Life, Item::Blue, Item::Blue], Item::LifeBBI => vec![Item::Life, Item::Blue, Item::Blue],
Item::LifeRGI => vec![Item::Life, Item::Red, Item::Green], Item::LifeRGI => vec![Item::Life, Item::Red, Item::Green],
Item::LifeGBI => vec![Item::Life, Item::Green, Item::Blue], Item::LifeGBI => vec![Item::Life, Item::Green, Item::Blue],
Item::LifeRBI => vec![Item::Life, Item::Red, Item::Blue], Item::LifeRBI => vec![Item::Life, Item::Red, Item::Blue],
Item::SpeedRRI => vec![Item::Speed, Item::Red, Item::Red], Item::SpeedRRI => vec![Item::Speed, Item::Red, Item::Red],
Item::SpeedGGI => vec![Item::Speed, Item::Green, Item::Green], Item::SpeedGGI => vec![Item::Speed, Item::Green, Item::Green],
Item::SpeedBBI => vec![Item::Speed, Item::Blue, Item::Blue], Item::SpeedBBI => vec![Item::Speed, Item::Blue, Item::Blue],
Item::SpeedRGI => vec![Item::Speed, Item::Red, Item::Green], Item::SpeedRGI => vec![Item::Speed, Item::Red, Item::Green],
Item::SpeedGBI => vec![Item::Speed, Item::Green, Item::Blue], Item::SpeedGBI => vec![Item::Speed, Item::Green, Item::Blue],
Item::SpeedRBI => vec![Item::Speed, Item::Red, Item::Blue], Item::SpeedRBI => vec![Item::Speed, Item::Red, Item::Blue],
_ => vec![*self], _ => vec![*self],
} }
@ -793,6 +793,9 @@ impl From<Skill> for Item {
Skill::ChaosI => Item::ChaosI, Skill::ChaosI => Item::ChaosI,
Skill::ChaosII => Item::ChaosII, Skill::ChaosII => Item::ChaosII,
Skill::ChaosIII => Item::ChaosIII, Skill::ChaosIII => Item::ChaosIII,
Skill::CorruptI => Item::CorruptI,
Skill::CorruptII => Item::CorruptII,
Skill::CorruptIII => Item::CorruptIII,
Skill::ClutchI => Item::ClutchI, Skill::ClutchI => Item::ClutchI,
Skill::ClutchII => Item::ClutchII, Skill::ClutchII => Item::ClutchII,
Skill::ClutchIII => Item::ClutchIII, Skill::ClutchIII => Item::ClutchIII,
@ -873,9 +876,6 @@ impl From<Skill> for Item {
Skill::TriageI => Item::TriageI, Skill::TriageI => Item::TriageI,
Skill::TriageII => Item::TriageII, Skill::TriageII => Item::TriageII,
Skill::TriageIII => Item::TriageIII, Skill::TriageIII => Item::TriageIII,
Skill::CorruptI => Item::CorruptI,
Skill::CorruptII => Item::CorruptII,
Skill::CorruptIII => Item::CorruptIII,
// Convert subskills into parent skills // Convert subskills into parent skills
Skill::CorruptionI => Item::CorruptI, Skill::CorruptionI => Item::CorruptI,
@ -891,7 +891,6 @@ impl From<Skill> for Item {
Skill::HatredII => Item::HostilityII, Skill::HatredII => Item::HostilityII,
Skill::HatredIII => Item::HostilityIII, Skill::HatredIII => Item::HostilityIII,
Skill::HasteStrike => Item::HasteI, Skill::HasteStrike => Item::HasteI,
Skill::ImpureBlast => Item::ImpurityI, Skill::ImpureBlast => Item::ImpurityI,
Skill::RiposteI => Item::ParryI, Skill::RiposteI => Item::ParryI,
Skill::RiposteII => Item::ParryII, Skill::RiposteII => Item::ParryII,

View File

@ -1,5 +1,6 @@
use construct::{Stat, Colours}; use construct::{Stat, Colours};
use util::{IntPct}; use util::{IntPct};
use std::cmp;
#[derive(Debug,Clone,Serialize,Deserialize)] #[derive(Debug,Clone,Serialize,Deserialize)]
pub struct SpecBonus { pub struct SpecBonus {
@ -19,13 +20,18 @@ impl SpecBonus {
#[derive(Debug,Clone,Serialize,Deserialize)] #[derive(Debug,Clone,Serialize,Deserialize)]
pub struct SpecValues { pub struct SpecValues {
pub base: u64, pub base: u64,
pub multi: u64,
pub bonuses: Vec<SpecBonus>, pub bonuses: Vec<SpecBonus>,
} }
impl SpecValues { impl SpecValues {
pub fn calc_value (&self, c: &Colours) -> u64 { pub fn max_value (&self, c: &Colours) -> u64 {
self.bonuses.iter().fold(self.base, |acc, s| acc + s.get_bonus(c)) 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
}
} }
@ -88,213 +94,213 @@ impl Spec {
pub fn values(&self) -> SpecValues { pub fn values(&self) -> SpecValues {
match *self { match *self {
Spec::Power => SpecValues { Spec::Power => SpecValues {
base: 5, multi: 0, base: 20,
bonuses: vec![] bonuses: vec![]
}, },
Spec::PowerRRI => SpecValues { Spec::PowerRRI => SpecValues {
base: 10, multi: 10, base: 40,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 10 }, SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 40 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 20 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 40 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 40 } SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 40 }
], ],
}, },
Spec::PowerGGI => SpecValues { Spec::PowerGGI => SpecValues {
base: 10, multi: 10, base: 40,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 10 }, SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 40 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 20 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 40 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 40 } SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 40 }
], ],
}, },
Spec::PowerBBI => SpecValues { Spec::PowerBBI => SpecValues {
base: 10, multi: 10, base: 40,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 10 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 40 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 20 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 40 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 40 } SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 40 }
], ],
}, },
Spec::PowerRGI => SpecValues { Spec::PowerRGI => SpecValues {
base: 5, multi: 7, base: 25,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 10 }, SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 25 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 15 }, SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 25 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 30 } SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 25 }
], ],
}, },
Spec::PowerGBI => SpecValues { Spec::PowerGBI => SpecValues {
base: 5, multi: 7, base: 25,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 10 }, SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 25 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 15 }, SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 25 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 30 } SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 25 }
], ],
}, },
Spec::PowerRBI => SpecValues { Spec::PowerRBI => SpecValues {
base: 5, multi: 7, base: 25,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 10 }, SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 25 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 15 }, SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 25 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 30 } SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 25 }
], ],
}, },
Spec::Speed => SpecValues { Spec::Speed => SpecValues {
base: 5, multi: 0, base: 40,
bonuses: vec![] bonuses: vec![]
}, },
Spec::SpeedRRI => SpecValues { Spec::SpeedRRI => SpecValues {
base: 10, multi: 20, base: 80,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 10 }, SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 80 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 20 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 80 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 40 } SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 80 }
], ],
}, },
Spec::SpeedGGI => SpecValues { Spec::SpeedGGI => SpecValues {
base: 10, multi: 20, base: 80,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 10 }, SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 80 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 20 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 80 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 40 } SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 80 }
], ],
}, },
Spec::SpeedBBI => SpecValues { Spec::SpeedBBI => SpecValues {
base: 10, multi: 20, base: 80,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 10 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 80 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 20 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 80 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 40 } SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 80 }
], ],
}, },
Spec::SpeedRGI => SpecValues { Spec::SpeedRGI => SpecValues {
base: 5, multi: 15, base: 60,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 10 }, SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 60 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 15 }, SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 60 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 30 } SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 60 }
], ],
}, },
Spec::SpeedGBI => SpecValues { Spec::SpeedGBI => SpecValues {
base: 5, multi: 15, base: 60,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 10 }, SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 60 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 15 }, SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 60 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 30 } SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 60 }
], ],
}, },
Spec::SpeedRBI => SpecValues { Spec::SpeedRBI => SpecValues {
base: 5, multi: 15, base: 60,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 10 }, SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 60 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 15 }, SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 60 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 30 } SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 60 }
], ],
}, },
Spec::Life => SpecValues { Spec::Life => SpecValues {
base: 5, multi: 0, base: 150,
bonuses: vec![]}, bonuses: vec![]},
Spec::LifeRRI => SpecValues { Spec::LifeRRI => SpecValues {
base: 10, multi: 75, base: 300,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 10 }, SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 300 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 20 }, SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 300 },
SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 40 } SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 300 }
], ],
}, },
Spec::LifeGGI => SpecValues { Spec::LifeGGI => SpecValues {
base: 10, multi: 75, base: 300,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 10 }, SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 300 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 20 }, SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 300 },
SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 40 } SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 300 }
], ],
}, },
Spec::LifeBBI => SpecValues { Spec::LifeBBI => SpecValues {
base: 10, multi: 75, base: 300,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 10 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 300 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 20 }, SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 300 },
SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 40 } SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 300 }
], ],
}, },
Spec::LifeRGI => SpecValues { Spec::LifeRGI => SpecValues {
base: 5, multi: 50, base: 200,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 10 }, SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 200 },
SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 15 }, SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 200 },
SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 30 } SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 200 }
], ],
}, },
Spec::LifeGBI => SpecValues { Spec::LifeGBI => SpecValues {
base: 5, multi: 50, base: 200,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 10 }, SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 200 },
SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 15 }, SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 200 },
SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 30 } SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 200 }
], ],
}, },
Spec::LifeRBI => SpecValues { Spec::LifeRBI => SpecValues {
base: 5, multi: 50, base: 200,
bonuses: vec![ bonuses: vec![
SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 10 }, SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 200 },
SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 15 }, SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 200 },
SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 30 } 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 { pub fn apply(&self, modified: u64, base: u64, construct_colours: &Colours, player_colours: &Colours) -> u64 {
let construct_colour_total: u64 = (construct_colours.red + construct_colours.green + construct_colours.blue) as u64;
match *self { match *self {
// Upgrades to Power Spec // Percentage multipliers based on base value
Spec::Power | Spec::Power |
Spec::Speed => modified + base.pct(self.values().base),
Spec::PowerRRI | Spec::PowerRRI |
Spec::PowerGGI | Spec::PowerGGI |
Spec::PowerBBI | Spec::PowerBBI |
Spec::PowerRGI | Spec::PowerRGI |
Spec::PowerGBI | Spec::PowerGBI |
Spec::PowerRBI | Spec::PowerRBI |
Spec::Speed |
Spec::SpeedRRI | Spec::SpeedRRI |
Spec::SpeedGGI | Spec::SpeedGGI |
Spec::SpeedBBI | Spec::SpeedBBI |
Spec::SpeedRGI | Spec::SpeedRGI |
Spec::SpeedGBI | Spec::SpeedGBI |
Spec::SpeedRBI => modified + { Spec::SpeedRBI => modified + {
base.pct(self.values().calc_value(player_colours)) base.pct(cmp::min(self.values().calc_multi(construct_colours),
self.values().max_value(player_colours)))
}, },
// Flat bonus
Spec::Life | Spec::Life => modified + self.values().base,
Spec::LifeRRI | Spec::LifeRRI |
Spec::LifeGGI | Spec::LifeGGI |
Spec::LifeBBI | Spec::LifeBBI |
Spec::LifeRGI | Spec::LifeRGI |
Spec::LifeGBI | Spec::LifeGBI |
Spec::LifeRBI => modified + { Spec::LifeRBI => modified + {
construct_colour_total * self.values().calc_value(player_colours) cmp::min(self.values().calc_multi(construct_colours),
self.values().max_value(player_colours))
}, },
} }
} }