diff --git a/server/src/construct.rs b/server/src/construct.rs index eb4ac6d8..01309d4e 100644 --- a/server/src/construct.rs +++ b/server/src/construct.rs @@ -891,7 +891,7 @@ mod tests { return; } - #[test] + #[test] fn construct_player_modifiers_test() { let mut construct = Construct::new() .named(&"player player".to_string()); @@ -899,6 +899,30 @@ mod tests { construct.spec_add(Spec::PowerRRI).unwrap(); construct.spec_add(Spec::PowerGGI).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 { red: 5, @@ -909,9 +933,35 @@ mod tests { construct.apply_modifiers(&player_colours); 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.blue_power.value == construct.blue_power.base + construct.blue_power.base.pct(80)); + 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(20)); + assert!(construct.green_life.value == construct.green_life.base + 150); 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; + } + } diff --git a/server/src/item.rs b/server/src/item.rs index e6530e3d..c40ed932 100644 --- a/server/src/item.rs +++ b/server/src/item.rs @@ -690,78 +690,78 @@ impl Item { Item::ParryIII => vec![Item::ParryII, Item::ParryII, Item::ParryII], // Add red recharge Item::PurifyI => vec![Item::Block, Item::Green, Item::Green], Item::PurifyII => vec![Item::PurifyI, Item::PurifyI, Item::PurifyI], - Item::PurifyIII => vec![Item::PurifyII, Item::PurifyII, Item::PurifyII], - Item::CorruptI => vec![Item::Block, Item::Blue, Item::Blue], - Item::CorruptII => vec![Item::CorruptI, Item::CorruptI, Item::CorruptI], - Item::CorruptIII => vec![Item::CorruptII, Item::CorruptII, Item::CorruptII], - Item::ClutchI => vec![Item::Block, Item::Red, Item::Green], - Item::ClutchII => vec![Item::ClutchI, Item::ClutchI, Item::ClutchI], - Item::ClutchIII => vec![Item::ClutchII, Item::ClutchII, Item::ClutchII], - Item::ReflectI => vec![Item::Block, Item::Green, Item::Blue], - Item::ReflectII => vec![Item::ReflectI, Item::ReflectI, Item::ReflectI], + Item::PurifyIII => vec![Item::PurifyII, Item::PurifyII, Item::PurifyII], + Item::CorruptI => vec![Item::Block, Item::Blue, Item::Blue], + Item::CorruptII => vec![Item::CorruptI, Item::CorruptI, Item::CorruptI], + Item::CorruptIII => vec![Item::CorruptII, Item::CorruptII, Item::CorruptII], + Item::ClutchI => vec![Item::Block, Item::Red, Item::Green], + Item::ClutchII => vec![Item::ClutchI, Item::ClutchI, Item::ClutchI], + Item::ClutchIII => vec![Item::ClutchII, Item::ClutchII, Item::ClutchII], + Item::ReflectI => vec![Item::Block, Item::Green, Item::Blue], + Item::ReflectII => vec![Item::ReflectI, Item::ReflectI, Item::ReflectI], Item::ReflectIII => vec![Item::ReflectII, Item::ReflectII, Item::ReflectII], - Item::RechargeI => vec![Item::Block, Item::Red, Item::Blue], - Item::RechargeII => vec![Item::RechargeI, Item::RechargeI, Item::RechargeI], - Item::RechargeIII => vec![Item::RechargeII, Item::RechargeII, Item::RechargeII], + Item::RechargeI => vec![Item::Block, Item::Red, Item::Blue], + Item::RechargeII => vec![Item::RechargeI, Item::RechargeI, Item::RechargeI], + Item::RechargeIII => vec![Item::RechargeII, Item::RechargeII, Item::RechargeII], - Item::StrangleI => vec![Item::Stun, Item::Red, Item::Red], - Item::StrangleII => vec![Item::StrangleI, Item::StrangleI, Item::StrangleI], - Item::StrangleIII => vec![Item::StrangleII, Item::StrangleII, Item::StrangleII], - Item::SleepI => vec![Item::Stun, Item::Green, Item::Green], - Item::SleepII => vec![Item::SleepI, Item::SleepI, Item::SleepI], + Item::StrangleI => vec![Item::Stun, Item::Red, Item::Red], + Item::StrangleII => vec![Item::StrangleI, Item::StrangleI, Item::StrangleI], + Item::StrangleIII => vec![Item::StrangleII, Item::StrangleII, Item::StrangleII], + Item::SleepI => vec![Item::Stun, Item::Green, Item::Green], + Item::SleepII => vec![Item::SleepI, Item::SleepI, Item::SleepI], Item::SleepIII => vec![Item::SleepII, Item::SleepII, Item::SleepII], - Item::RuinI => vec![Item::Stun, Item::Blue, Item::Blue], - Item::RuinII => vec![Item::RuinI, Item::RuinI, Item::RuinI], - Item::RuinIII => vec![Item::RuinII, Item::RuinII, Item::RuinII], - Item::ThrowI => vec![Item::Stun, Item::Red, Item::Green], - Item::ThrowII => vec![Item::ThrowI, Item::ThrowI, Item::ThrowI], - Item::ThrowIII => vec![Item::ThrowII, Item::ThrowII, Item::ThrowII], - Item::HexI => vec![Item::Stun, Item::Green, Item::Blue], - Item::HexII => vec![Item::HexI, Item::HexI, Item::HexI], - Item::HexIII => vec![Item::HexII, Item::HexII, Item::HexII], - Item::BanishI => vec![Item::Stun, Item::Red, Item::Blue], - Item::BanishII => vec![Item::BanishI, Item::BanishI, Item::BanishI], - Item::BanishIII => vec![Item::BanishII, Item::BanishII, Item::BanishII], + Item::RuinI => vec![Item::Stun, Item::Blue, Item::Blue], + Item::RuinII => vec![Item::RuinI, Item::RuinI, Item::RuinI], + Item::RuinIII => vec![Item::RuinII, Item::RuinII, Item::RuinII], + Item::ThrowI => vec![Item::Stun, Item::Red, Item::Green], + Item::ThrowII => vec![Item::ThrowI, Item::ThrowI, Item::ThrowI], + Item::ThrowIII => vec![Item::ThrowII, Item::ThrowII, Item::ThrowII], + Item::HexI => vec![Item::Stun, Item::Green, Item::Blue], + Item::HexII => vec![Item::HexI, Item::HexI, Item::HexI], + Item::HexIII => vec![Item::HexII, Item::HexII, Item::HexII], + Item::BanishI => vec![Item::Stun, Item::Red, Item::Blue], + Item::BanishII => vec![Item::BanishI, Item::BanishI, Item::BanishI], + 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::StrikeIII => vec![Item::StrikeII, Item::StrikeII, Item::StrikeII], - Item::HealI => vec![Item::Attack, Item::Green, Item::Green], - Item::HealII => vec![Item::HealI, Item::HealI, Item::HealI], - Item::HealIII => vec![Item::HealII, Item::HealII, Item::HealII], - Item::BlastI => vec![Item::Attack, Item::Blue, Item::Blue], - Item::BlastII => vec![Item::BlastI, Item::BlastI, Item::BlastI], - Item::BlastIII => vec![Item::BlastII, Item::BlastII, Item::BlastII], - Item::SlayI => vec![Item::Attack, Item::Red, Item::Green], - Item::SlayII => vec![Item::SlayI, Item::SlayI, Item::SlayI], - Item::SlayIII => vec![Item::SlayII, Item::SlayII, Item::SlayII], - Item::SiphonI => vec![Item::Attack, Item::Green, Item::Blue], - Item::SiphonII => vec![Item::SiphonI, Item::SiphonI, Item::SiphonI], - Item::SiphonIII => vec![Item::SiphonII, Item::SiphonII, Item::SiphonII], - Item::ChaosI => vec![Item::Attack, Item::Red, Item::Blue], - Item::ChaosII => vec![Item::ChaosI, Item::ChaosI, Item::ChaosI], - Item::ChaosIII => vec![Item::ChaosII, Item::ChaosII, Item::ChaosII], + Item::HealI => vec![Item::Attack, Item::Green, Item::Green], + Item::HealII => vec![Item::HealI, Item::HealI, Item::HealI], + Item::HealIII => vec![Item::HealII, Item::HealII, Item::HealII], + Item::BlastI => vec![Item::Attack, Item::Blue, Item::Blue], + Item::BlastII => vec![Item::BlastI, Item::BlastI, Item::BlastI], + Item::BlastIII => vec![Item::BlastII, Item::BlastII, Item::BlastII], + Item::SlayI => vec![Item::Attack, Item::Red, Item::Green], + Item::SlayII => vec![Item::SlayI, Item::SlayI, Item::SlayI], + Item::SlayIII => vec![Item::SlayII, Item::SlayII, Item::SlayII], + Item::SiphonI => vec![Item::Attack, Item::Green, Item::Blue], + Item::SiphonII => vec![Item::SiphonI, Item::SiphonI, Item::SiphonI], + Item::SiphonIII => vec![Item::SiphonII, Item::SiphonII, Item::SiphonII], + Item::ChaosI => vec![Item::Attack, Item::Red, Item::Blue], + Item::ChaosII => vec![Item::ChaosI, Item::ChaosI, Item::ChaosI], + Item::ChaosIII => vec![Item::ChaosII, Item::ChaosII, Item::ChaosII], - Item::PowerRRI => vec![Item::Power, Item::Red, Item::Red], - Item::PowerGGI => vec![Item::Power, Item::Green, Item::Green], - Item::PowerBBI => vec![Item::Power, Item::Blue, Item::Blue], - Item::PowerRGI => vec![Item::Power, Item::Red, Item::Green], - Item::PowerGBI => vec![Item::Power, Item::Green, Item::Blue], - Item::PowerRBI => vec![Item::Power, Item::Red, Item::Blue], + Item::PowerRRI => vec![Item::Power, Item::Red, Item::Red], + Item::PowerGGI => vec![Item::Power, Item::Green, Item::Green], + Item::PowerBBI => vec![Item::Power, Item::Blue, Item::Blue], + Item::PowerRGI => vec![Item::Power, Item::Red, Item::Green], + Item::PowerGBI => vec![Item::Power, Item::Green, Item::Blue], + Item::PowerRBI => vec![Item::Power, Item::Red, Item::Blue], - Item::LifeRRI => vec![Item::Life, Item::Red, Item::Red], - Item::LifeGGI => vec![Item::Life, Item::Green, Item::Green], - Item::LifeBBI => vec![Item::Life, Item::Blue, Item::Blue], - Item::LifeRGI => vec![Item::Life, Item::Red, Item::Green], - Item::LifeGBI => vec![Item::Life, Item::Green, Item::Blue], - Item::LifeRBI => vec![Item::Life, Item::Red, Item::Blue], + Item::LifeRRI => vec![Item::Life, Item::Red, Item::Red], + Item::LifeGGI => vec![Item::Life, Item::Green, Item::Green], + Item::LifeBBI => vec![Item::Life, Item::Blue, Item::Blue], + Item::LifeRGI => vec![Item::Life, Item::Red, Item::Green], + Item::LifeGBI => vec![Item::Life, Item::Green, Item::Blue], + Item::LifeRBI => vec![Item::Life, Item::Red, Item::Blue], - Item::SpeedRRI => vec![Item::Speed, Item::Red, Item::Red], - Item::SpeedGGI => vec![Item::Speed, Item::Green, Item::Green], - Item::SpeedBBI => vec![Item::Speed, Item::Blue, Item::Blue], - Item::SpeedRGI => vec![Item::Speed, Item::Red, Item::Green], - Item::SpeedGBI => vec![Item::Speed, Item::Green, Item::Blue], - Item::SpeedRBI => vec![Item::Speed, Item::Red, Item::Blue], + Item::SpeedRRI => vec![Item::Speed, Item::Red, Item::Red], + Item::SpeedGGI => vec![Item::Speed, Item::Green, Item::Green], + Item::SpeedBBI => vec![Item::Speed, Item::Blue, Item::Blue], + Item::SpeedRGI => vec![Item::Speed, Item::Red, Item::Green], + Item::SpeedGBI => vec![Item::Speed, Item::Green, Item::Blue], + Item::SpeedRBI => vec![Item::Speed, Item::Red, Item::Blue], _ => vec![*self], } @@ -786,6 +786,9 @@ impl From for Item { Skill::ChaosI => Item::ChaosI, Skill::ChaosII => Item::ChaosII, Skill::ChaosIII => Item::ChaosIII, + Skill::CorruptI => Item::CorruptI, + Skill::CorruptII => Item::CorruptII, + Skill::CorruptIII => Item::CorruptIII, Skill::ClutchI => Item::ClutchI, Skill::ClutchII => Item::ClutchII, Skill::ClutchIII => Item::ClutchIII, @@ -866,16 +869,34 @@ impl From for Item { Skill::TriageI => Item::TriageI, Skill::TriageII => Item::TriageII, Skill::TriageIII => Item::TriageIII, - Skill::CorruptI => Item::CorruptI, - Skill::CorruptII => Item::CorruptII, - Skill::CorruptIII => Item::CorruptIII, - Skill::Attack => Item::Attack, - Skill::Stun => Item::Stun, - Skill::Block => Item::Block, - Skill::ParryI => Item::ParryI, - Skill::SiphonI => Item::SiphonI, - _ => panic!("{:?} not implemented with item conversion", skill), + // Convert subskills into parent skills + Skill::CorruptionI => Item::CorruptI, + Skill::CorruptionII => Item::CorruptII, + Skill::CorruptionIII => Item::CorruptIII, + Skill::CorruptionTickI => Item::CorruptI, + Skill::CorruptionTickII => Item::CorruptII, + Skill::CorruptionTickIII => Item::CorruptII, + Skill::DecayTickI => Item::DecayI, + Skill::DecayTickII => Item::DecayII, + Skill::DecayTickIII => Item::DecayIII, + Skill::HatredI => Item::HostilityI, + Skill::HatredII => Item::HostilityII, + Skill::HatredIII => Item::HostilityIII, + Skill::HasteStrike => Item::HasteI, + Skill::ImpureBlast => Item::ImpurityI, + Skill::RiposteI => Item::ParryI, + Skill::RiposteII => Item::ParryII, + Skill::RiposteIII => Item::ParryIII, + Skill::SiphonTickI => Item::SiphonI, + Skill::SiphonTickII => Item::SiphonII, + Skill::SiphonTickIII => Item::SiphonIII, + Skill::StrangleTickI => Item::StrangleI, + Skill::StrangleTickII => Item::StrangleII, + Skill::StrangleTickIII => Item::StrangleIII, + Skill::TriageTickI => Item::TriageI, + Skill::TriageTickII => Item::TriageII, + Skill::TriageTickIII => Item::TriageIII, } } } diff --git a/server/src/skill.rs b/server/src/skill.rs index 7e43c932..657ffb3f 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -275,7 +275,7 @@ pub fn resolve(skill: Skill, source: &mut Construct, target: &mut Construct, mut // Not used - Skill::Injure => injure(source, target, resolutions, skill), + // Skill::Injure => injure(source, target, resolutions, skill), }; return resolutions; @@ -749,7 +749,7 @@ pub enum Skill { ImpurityI, ImpurityII, ImpurityIII, - Injure, + // Injure, InvertI, InvertII, @@ -1077,7 +1077,7 @@ impl Skill { Skill::TriageIII => vec![ConstructEffect {effect: Effect::Triage, duration: 4, meta: Some(EffectMeta::Skill(Skill::TriageTickIII)), tick: None}], //Unused - Skill::Injure => vec![ConstructEffect {effect: Effect::Injured, duration: 2, meta: None, tick: None }], + // Skill::Injure => vec![ConstructEffect {effect: Effect::Injured, duration: 2, meta: None, tick: None }], _ => { panic!("{:?} no skill effect", self); @@ -1204,7 +1204,7 @@ impl Skill { Skill::TauntI => Some(2), Skill::TauntII => Some(2), Skill::TauntIII => Some(2), - Skill::Injure => Some(2), + // Skill::Injure => Some(2), Skill::CorruptI =>Some(1), Skill::CorruptII =>Some(1), @@ -2004,7 +2004,7 @@ mod tests { }; } - #[test] +/* #[test] fn injure_test() { let mut x = Construct::new() .named(&"muji".to_string()); @@ -2016,7 +2016,7 @@ mod tests { assert!(y.immune(Skill::HealI).is_some()); // resolutions = heal(&mut y.clone(), &mut y, resolutions); } - +*/ #[test] fn invert_test() { let mut x = Construct::new() diff --git a/server/src/spec.rs b/server/src/spec.rs index 72575664..37c13b40 100644 --- a/server/src/spec.rs +++ b/server/src/spec.rs @@ -1,5 +1,6 @@ use construct::{Stat, Colours}; use util::{IntPct}; +use std::cmp; #[derive(Debug,Clone,Serialize,Deserialize)] pub struct SpecBonus { @@ -19,9 +20,21 @@ impl SpecBonus { #[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, @@ -31,8 +44,7 @@ pub enum Spec { SpeedRGI, SpeedGBI, SpeedRBI, - // Pure redLife has to come first as it applies the base amount - // that is multiplied + Life, LifeGGI, LifeRRI, @@ -82,217 +94,213 @@ impl Spec { pub fn values(&self) -> SpecValues { match *self { Spec::Power => SpecValues { - base: 5, + multi: 0, base: 20, bonuses: vec![] }, Spec::PowerRRI => SpecValues { - base: 10, + multi: 10, base: 40, bonuses: vec![ - SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 10 }, - SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 20 }, + 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::PowerGGI => SpecValues { - base: 10, + multi: 10, base: 40, bonuses: vec![ - SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 10 }, - SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 20 }, + 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::PowerBBI => SpecValues { - base: 10, + multi: 10, base: 40, bonuses: vec![ - SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 10 }, - SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 20 }, + 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::PowerRGI => SpecValues { - base: 5, + multi: 7, base: 25, bonuses: vec![ - SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 10 }, - SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 15 }, - SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 30 } + 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::PowerGBI => SpecValues { - base: 5, + multi: 7, base: 25, bonuses: vec![ - SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 10 }, - SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 15 }, - SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 30 } + 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::PowerRBI => SpecValues { - base: 5, + multi: 7, base: 25, bonuses: vec![ - SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 10 }, - SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 15 }, - SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 30 } + 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 { - base: 5, + multi: 0, base: 40, bonuses: vec![] }, Spec::SpeedRRI => SpecValues { - base: 10, + multi: 20, base: 80, bonuses: vec![ - SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 10 }, - SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 20 }, - SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 40 } + 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 { - base: 10, + multi: 20, base: 80, bonuses: vec![ - SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 10 }, - SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 20 }, - SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 40 } + 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 { - base: 10, + multi: 20, base: 80, bonuses: vec![ - SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 10 }, - SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 20 }, - SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 40 } + 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 { - base: 5, + multi: 15, base: 60, bonuses: vec![ - SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 10 }, - SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 15 }, - SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 30 } + 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 { - base: 5, + multi: 15, base: 60, bonuses: vec![ - SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 10 }, - SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 15 }, - SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 30 } + 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 { - base: 5, + multi: 15, base: 60, bonuses: vec![ - SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 10 }, - SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 15 }, - SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 30 } + 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::Life => SpecValues { - base: 5, + multi: 0, base: 150, bonuses: vec![]}, Spec::LifeRRI => SpecValues { - base: 10, + multi: 75, base: 300, bonuses: vec![ - SpecBonus { req: Colours { red: 5, green: 0, blue: 0 }, bonus: 10 }, - SpecBonus { req: Colours { red: 10, green: 0, blue: 0 }, bonus: 20 }, - SpecBonus { req: Colours { red: 20, green: 0, blue: 0 }, bonus: 40 } + 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::LifeGGI => SpecValues { - base: 10, + multi: 75, base: 300, bonuses: vec![ - SpecBonus { req: Colours { red: 0, green: 5, blue: 0 }, bonus: 10 }, - SpecBonus { req: Colours { red: 0, green: 10, blue: 0 }, bonus: 20 }, - SpecBonus { req: Colours { red: 0, green: 20, blue: 0 }, bonus: 40 } + 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::LifeBBI => SpecValues { - base: 10, + multi: 75, base: 300, bonuses: vec![ - SpecBonus { req: Colours { red: 0, green: 0, blue: 5 }, bonus: 10 }, - SpecBonus { req: Colours { red: 0, green: 0, blue: 10 }, bonus: 20 }, - SpecBonus { req: Colours { red: 0, green: 0, blue: 20 }, bonus: 40 } + 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::LifeRGI => SpecValues { - base: 5, + multi: 50, base: 200, bonuses: vec![ - SpecBonus { req: Colours { red: 2, green: 2, blue: 0 }, bonus: 10 }, - SpecBonus { req: Colours { red: 5, green: 5, blue: 0 }, bonus: 15 }, - SpecBonus { req: Colours { red: 10, green: 10, blue: 0 }, bonus: 30 } + 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::LifeGBI => SpecValues { - base: 5, + multi: 50, base: 200, bonuses: vec![ - SpecBonus { req: Colours { red: 0, green: 2, blue: 2 }, bonus: 10 }, - SpecBonus { req: Colours { red: 0, green: 5, blue: 5 }, bonus: 15 }, - SpecBonus { req: Colours { red: 0, green: 10, blue: 10 }, bonus: 30 } + 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::LifeRBI => SpecValues { - base: 5, + multi: 50, base: 200, bonuses: vec![ - SpecBonus { req: Colours { red: 2, green: 0, blue: 2 }, bonus: 10 }, - SpecBonus { req: Colours { red: 5, green: 0, blue: 5 }, bonus: 15 }, - SpecBonus { req: Colours { red: 10, green: 0, blue: 10 }, bonus: 30 } + 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 { - let construct_colour_total: u64 = (construct_colours.red + construct_colours.green + construct_colours.blue) as u64; match *self { - // Upgrades to Power Spec + // 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::Speed | Spec::SpeedRRI | Spec::SpeedGGI | Spec::SpeedBBI | Spec::SpeedRGI | Spec::SpeedGBI | Spec::SpeedRBI => modified + { - let spec_values = self.values(); - base.pct(spec_values.bonuses.iter() - .fold(spec_values.base, |acc, s| acc + s.get_bonus(player_colours))) + base.pct(cmp::min(self.values().calc_multi(construct_colours), + self.values().max_value(player_colours))) }, - - Spec::Life | + // Flat bonus + Spec::Life => modified + self.values().base, Spec::LifeRRI | Spec::LifeGGI | Spec::LifeBBI | Spec::LifeRGI | Spec::LifeGBI | Spec::LifeRBI => modified + { - let spec_values = self.values(); - construct_colour_total * (spec_values.bonuses.iter() - .fold(spec_values.base, |acc, s| acc + s.get_bonus(player_colours))) + cmp::min(self.values().calc_multi(construct_colours), + self.values().max_value(player_colours)) }, } }