diff --git a/server/src/construct.rs b/server/src/construct.rs index 663dd27e..5473a563 100644 --- a/server/src/construct.rs +++ b/server/src/construct.rs @@ -72,7 +72,7 @@ pub enum EffectMeta { Multiplier(u64), } -#[derive(Debug,Clone,PartialEq,Serialize,Deserialize)] +#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)] pub struct ConstructEffect { pub effect: Effect, pub duration: u8, @@ -104,6 +104,13 @@ impl ConstructEffect { Some(EffectMeta::Multiplier(s)) => s, _ => 0 } + } + + pub fn get_skill(&self) -> Option { + match self.meta { + Some(EffectMeta::Skill(s)) => Some(s), + _ => None, + } } } diff --git a/server/src/item.rs b/server/src/item.rs index 5e241d4e..450a29dc 100644 --- a/server/src/item.rs +++ b/server/src/item.rs @@ -408,15 +408,15 @@ impl Item { Item::Attack => format!("Deal RedDamage based on {:?}% RedPower", self.into_skill().unwrap().multiplier()), Item::Block => format!("Reduce incoming RedDamage by {:?}%", - 100 - self.into_skill().unwrap().effect().first().unwrap().get_multiplier()), + 100 - self.into_skill().unwrap().effect()[0].get_multiplier()), Item::Stun => format!("Stun target construct for {:?}T", - self.into_skill().unwrap().effect().first().unwrap().get_duration()), + self.into_skill().unwrap().effect()[0].get_duration()), Item::Buff => format!("Increase target construct RedPower and speed by {:?}%", - self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100), + self.into_skill().unwrap().effect()[0].get_multiplier() - 100), Item::Debuff => format!("Slow target construct speed by {:?}%", - 100 - self.into_skill().unwrap().effect().first().unwrap().get_multiplier()), + 100 - self.into_skill().unwrap().effect()[0].get_multiplier()), // specs // Base Item::Power => format!("Base ITEM for increased Power. Power determines the damage caused by your SKILLS."), @@ -457,14 +457,14 @@ impl Item { Item::AmplifyI | Item::AmplifyII | Item::AmplifyIII => format!("Increase red and blue power by {:?}%. Lasts {:?}T", - self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100, - self.into_skill().unwrap().effect().first().unwrap().get_duration()), + self.into_skill().unwrap().effect()[0].get_multiplier() - 100, + self.into_skill().unwrap().effect()[0].get_duration()), Item::BanishI | Item::BanishII | Item::BanishIII => format!("Banish target for {:?}T. Banished constructs are immune to all skills and effects.", - self.into_skill().unwrap().effect().first().unwrap().get_duration()), + self.into_skill().unwrap().effect()[0].get_duration()), Item::BlastI | Item::BlastII | @@ -478,48 +478,51 @@ impl Item { Item::ClutchI | Item::ClutchII | - Item::ClutchIII => format!("Construct cannot be KO'd while active. Additionally provides immunity to disables."), + Item::ClutchIII => format!("Construct cannot be KO'd while active. Additionally provides immunity to disables. \ + Lasts {:?}T", + self.into_skill().unwrap().effect()[0].get_duration()), Item::CorruptI | Item::CorruptII | Item::CorruptIII => format!( - "Self targetting defensive for {:?}T. Applies corrupt to attackers dealing BlueDamage {:?}% \ + "Self targetting defensive for {:?}T. Applies Corruption to attackers dealing BlueDamage {:?}% \ BluePower per turn for {:?}T.", - self.into_skill().unwrap().effect().first().unwrap().get_duration(), - Skill::CorruptI.multiplier(), // TO BE FIXT - self.into_skill().unwrap().effect().last().unwrap().get_duration()), + self.into_skill().unwrap().effect()[0].get_duration(), + self.into_skill().unwrap().effect()[0].get_skill().unwrap().effect()[0].get_skill().unwrap().multiplier(), + self.into_skill().unwrap().effect()[0].get_skill().unwrap().effect()[0].get_duration()), Item::CurseI | Item::CurseII | Item::CurseIII => format!( "Increases red and blue damage taken by {:?}%. Lasts {:?}T", - self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100, - self.into_skill().unwrap().effect().first().unwrap().get_duration()), + self.into_skill().unwrap().effect()[0].get_multiplier() - 100, + self.into_skill().unwrap().effect()[0].get_duration()), Item::DecayI | Item::DecayII | Item::DecayIII => format!( - "Reduces healing taken by {:?}% and deals blue damage {:?}% blue power each turn. Lasts {:?}T", - 100 - self.into_skill().unwrap().effect().first().unwrap().get_multiplier(), - self.into_skill().unwrap().multiplier(), - self.into_skill().unwrap().effect().first().unwrap().get_duration()), + "Reduces healing taken by {:?}% for {:?}T. Deals blue damage {:?}% blue power each turn for {:?}T", + 100 - self.into_skill().unwrap().effect()[0].get_multiplier(), + self.into_skill().unwrap().effect()[0].get_duration(), + self.into_skill().unwrap().effect()[1].get_skill().unwrap().multiplier(), + self.into_skill().unwrap().effect()[1].get_duration()), Item::HostilityI | Item::HostilityII | Item::HostilityIII => format!( "Gain Hostility for {:?}T. {} Hatred lasts {:?}T", - self.into_skill().unwrap().effect().first().unwrap().get_duration(), + self.into_skill().unwrap().effect()[0].get_duration(), "When attacked by Hostility you gain Hatred which increased red and blue power based on Damage taken.", - self.into_skill().unwrap().effect().last().unwrap().get_duration()), + self.into_skill().unwrap().effect()[0].get_skill().unwrap().effect()[0].get_duration()), Item::HasteI | Item::HasteII | Item::HasteIII => format!( "Haste increases Speed by {:?}%, Red based Attack skills will strike again dealing {:?}{}. Lasts {:?}T", - self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100, + self.into_skill().unwrap().effect()[0].get_multiplier() - 100, Skill::HasteStrike.multiplier(), "% Speed as RedDamage", - self.into_skill().unwrap().effect().first().unwrap().get_duration()), + self.into_skill().unwrap().effect()[0].get_duration()), Item::HealI | Item::HealII | @@ -529,16 +532,16 @@ impl Item { Item::HexII | Item::HexIII => format!("Blue based skill that applies Hex for {:?}T. \ Hexed targets cannot cast any skills.", - self.into_skill().unwrap().effect().first().unwrap().get_duration()), + self.into_skill().unwrap().effect()[0].get_duration()), Item::ImpurityI | Item::ImpurityII | Item::ImpurityIII => format!( "Impurity increases Green Power by {:?}%, Blue based Attack skills will blast again dealing {:?}{}. Lasts {:?}T", - self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100, + self.into_skill().unwrap().effect()[0].get_multiplier() - 100, Skill::ImpureBlast.multiplier(), "% GreenPower as BluePower", - self.into_skill().unwrap().effect().first().unwrap().get_duration()), + self.into_skill().unwrap().effect()[0].get_duration()), Item::InvertI | Item::InvertII | @@ -551,9 +554,9 @@ impl Item { Item::ParryIII => format!("{} {:?}% red power and blocks red skills for {:?}T. {} {:?}% red power.", "Self targetting skill. Recharges RedLife for", self.into_skill().unwrap().multiplier(), - self.into_skill().unwrap().effect().first().unwrap().get_duration(), + self.into_skill().unwrap().effect()[0].get_duration(), "If a red skill is parried the construct will riposte the source dealing red damage", - Skill::RiposteI.multiplier()), + self.into_skill().unwrap().effect()[0].get_skill().unwrap().multiplier()), Item::PurgeI | Item::PurgeII | @@ -569,7 +572,7 @@ impl Item { Item::ReflectII | Item::ReflectIII => format!( "Reflect incoming skills to source. Lasts {:?}T", - self.into_skill().unwrap().effect().first().unwrap().get_duration()), + self.into_skill().unwrap().effect()[0].get_duration()), Item::RechargeI | Item::RechargeII | @@ -581,7 +584,7 @@ impl Item { Item::RuinII | Item::RuinIII => format!( "Team wide Stun for {:?}T. Stunned constructs are unable to cast skills.", - self.into_skill().unwrap().effect().first().unwrap().get_duration()), + self.into_skill().unwrap().effect()[0].get_duration()), Item::ScatterI | Item::ScatterII | @@ -593,7 +596,7 @@ impl Item { Item::SilenceII | Item::SilenceIII => format!( "Block the target from using blue skills for {:?}T and deals blue damage {:?}% blue power. {}", - self.into_skill().unwrap().effect().first().unwrap().get_duration(), + self.into_skill().unwrap().effect()[0].get_duration(), self.into_skill().unwrap().multiplier(), "Deals 45% more Damage per blue skill on target"), @@ -607,14 +610,14 @@ impl Item { Item::SleepII | Item::SleepIII => format!( "Stun for {:?}T and heal for {:?}% GreenPower.", - self.into_skill().unwrap().effect().first().unwrap().get_duration(), + self.into_skill().unwrap().effect()[0].get_duration(), self.into_skill().unwrap().multiplier()), Item::SnareI | Item::SnareII | Item::SnareIII => format!( "Block the target from using red skills for {:?}T and deals RedDamage {:?}% RedPower. {}", - self.into_skill().unwrap().effect().first().unwrap().get_duration(), + self.into_skill().unwrap().effect()[0].get_duration(), self.into_skill().unwrap().multiplier(), "Deals 35% more Damage per red skill on target"), @@ -623,8 +626,8 @@ impl Item { Item::StrangleIII => format!( "Strangle the target disabling skills from both the caster and the target. While strangling deal RedDamage each turn {:?}% RedPower. Lasts {:?}T.", - self.into_skill().unwrap().multiplier(), - self.into_skill().unwrap().effect().first().unwrap().get_duration()), + self.into_skill().unwrap().effect()[0].get_skill().unwrap().multiplier(), + self.into_skill().unwrap().effect()[0].get_duration()), Item::StrikeI | Item::StrikeII | @@ -636,33 +639,30 @@ impl Item { Item::SiphonII | Item::SiphonIII => format!( "Deals BlueDamage {:?}% BluePower each turn and heals caster based on Damage dealt. Lasts {:?}T", - self.into_skill().unwrap().multiplier(), - self.into_skill().unwrap().effect().first().unwrap().get_duration()), + self.into_skill().unwrap().effect()[0].get_skill().unwrap().multiplier(), + self.into_skill().unwrap().effect()[0].get_duration()), Item::TauntI | Item::TauntII | Item::TauntIII => format!("Taunt redirects skills against the team to target, lasts {:?}T.\ Recharges RedLife for {:?} RedPower.", - self.into_skill().unwrap().effect().first().unwrap().get_duration(), + self.into_skill().unwrap().effect()[0].get_duration(), self.into_skill().unwrap().multiplier()), Item::ThrowI | Item::ThrowII | Item::ThrowIII => format!( "Stun the target for {:?}T and applies Vulnerable increasing RedDamage taken by {:?}% for {:?}T", - - self.into_skill().unwrap().effect().first().unwrap().get_duration(), - self.into_skill().unwrap().effect().last().unwrap().get_multiplier() - 100, - self.into_skill().unwrap().effect().last().unwrap().get_duration()), + self.into_skill().unwrap().effect()[0].get_duration(), + self.into_skill().unwrap().effect()[1].get_multiplier() - 100, + self.into_skill().unwrap().effect()[1].get_duration()), Item::TriageI | Item::TriageII | Item::TriageIII => format!( "Heals target for {:?}% GreenPower each turn. Lasts {:?}T", - self.into_skill().unwrap().multiplier(), - self.into_skill().unwrap().effect().first().unwrap().get_duration()), - - _ => format!("..."), + self.into_skill().unwrap().effect()[0].get_skill().unwrap().multiplier(), + self.into_skill().unwrap().effect()[0].get_duration()), } } diff --git a/server/src/skill.rs b/server/src/skill.rs index 9de2c51b..e2c4d6a4 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -1506,7 +1506,7 @@ fn throw(source: &mut Construct, target: &mut Construct, mut results: Resolution } fn strangle(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect().first().unwrap().clone(); + let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect()[0]; let tick_skill = match meta { Some(EffectMeta::Skill(s)) => s, _ => panic!("no strangle tick skill"), @@ -1659,29 +1659,26 @@ fn blast(source: &mut Construct, target: &mut Construct, mut results: Resolution } fn amplify(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - skill.effect().into_iter() - .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); + results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); return results;; } fn haste(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - skill.effect().into_iter() - .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); + results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); return results;; } fn debuff(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - skill.effect().into_iter() - .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); + results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); return results;; } fn decay(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - let wither = skill.effect().first().unwrap().clone(); + let wither = skill.effect()[0]; results.push(Resolution::new(source, target).event(target.add_effect(skill, wither))); - let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect().last().unwrap().clone(); + let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect()[1]; let tick_skill = match meta { Some(EffectMeta::Skill(s)) => s, _ => panic!("no decay tick skill"), @@ -1703,14 +1700,14 @@ fn decay_tick(source: &mut Construct, target: &mut Construct, mut results: Resol // corrupt is the buff effect // when attacked it runs corruption and applies a debuff fn corrupt(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - let corrupt = skill.effect().first().unwrap().clone(); + let corrupt = skill.effect()[0]; results.push(Resolution::new(source, target).event(target.add_effect(skill, corrupt))); return results;; } fn corruption(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect().first().unwrap().clone(); + let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect()[0]; let tick_skill = match meta { Some(EffectMeta::Skill(s)) => s, _ => panic!("no corruption tick skill"), @@ -1729,53 +1726,44 @@ fn corruption_tick(source: &mut Construct, target: &mut Construct, mut results: } fn ruin(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - skill.effect().into_iter() - .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); + results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); return results;; } fn hex(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - skill.effect().into_iter() - .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); + results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); return results;; } fn hostility(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - let hostility = skill.effect().first().unwrap().clone(); - results.push(Resolution::new(source, target).event(target.add_effect(skill, hostility))); + results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); return results;; } fn hatred(source: &mut Construct, target: &mut Construct, mut results: Resolutions, reflect_skill: Skill, amount: u64, skill: Skill) -> Resolutions { - let hatred = skill.effect().first().unwrap().clone() - .set_meta(EffectMeta::AddedDamage(amount)); - + let hatred = skill.effect()[0].set_meta(EffectMeta::AddedDamage(amount)); results.push(Resolution::new(source, target).event(target.add_effect(reflect_skill, hatred))); return results;; } fn curse(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - skill.effect().into_iter() - .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); + results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); return results;; } fn impurity(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - skill.effect().into_iter() - .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); + results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); return results;; } fn invert(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - skill.effect().into_iter() - .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); + results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); return results;; } fn reflect(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - skill.effect().into_iter() - .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); + results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); let blue_amount = source.blue_power().pct(skill.multiplier()); results.push(Resolution::new(source, target).event(target.recharge(skill, 0, blue_amount))); @@ -1792,7 +1780,7 @@ fn recharge(source: &mut Construct, target: &mut Construct, mut results: Resolut } fn siphon(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect().first().unwrap().clone(); + let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect()[0]; let tick_skill = match meta { Some(EffectMeta::Skill(s)) => s, _ => panic!("no siphon tick skill"), @@ -1827,10 +1815,8 @@ fn scatter(source: &mut Construct, target: &mut Construct, mut results: Resoluti let blue_amount = source.blue_power().pct(skill.multiplier()); results.push(Resolution::new(source, target).event(target.recharge(skill, 0, blue_amount))); - skill.effect().into_iter().for_each(|e| { - let scatter = e.clone().set_meta(EffectMeta::ScatterTarget(target.id)); - results.push(Resolution::new(source, target).event(source.add_effect(skill, scatter))); - }); + let scatter = skill.effect()[0].set_meta(EffectMeta::ScatterTarget(target.id)); + results.push(Resolution::new(source, target).event(source.add_effect(skill, scatter))); return results; } @@ -1862,8 +1848,7 @@ fn scatter_hit(source: &Construct, target: &Construct, mut results: Resolutions, } fn silence(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - skill.effect().into_iter() - .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); + results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); let s_multi = target.skills .iter() @@ -1908,8 +1893,7 @@ fn purify(source: &mut Construct, target: &mut Construct, mut results: Resolutio } fn banish(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - skill.effect().into_iter() - .for_each(|e| (results.push(Resolution::new(source, target).event(target.add_effect(skill, e))))); + results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); return results; }