From 88c3e97bc1cb2f0290f344dabb93daba6d467b28 Mon Sep 17 00:00:00 2001 From: Mashy Date: Mon, 27 May 2019 14:21:01 +1000 Subject: [PATCH] parry and other T2/T3 --- server/src/cryp.rs | 2 +- server/src/game.rs | 8 +- server/src/item.rs | 248 ++++++++++++++++++++++++----------------- server/src/skill.rs | 265 ++++++++++++++++++++++++++++++-------------- 4 files changed, 335 insertions(+), 188 deletions(-) diff --git a/server/src/cryp.rs b/server/src/cryp.rs index d0fd652f..d5aec520 100644 --- a/server/src/cryp.rs +++ b/server/src/cryp.rs @@ -62,7 +62,7 @@ impl CrypSkill { #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)] pub enum EffectMeta { - SkillTick(Skill), + Skill(Skill), TickAmount(u64), AddedDamage(u64), ScatterTarget(Uuid), diff --git a/server/src/game.rs b/server/src/game.rs index 56657c02..c57fceb5 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -1166,7 +1166,7 @@ mod tests { // should not be stunned because of parry assert!(game.player_by_id(x_player.id).unwrap().cryps[0].is_stunned() == false); // riposte - assert_eq!(game.player_by_id(y_player.id).unwrap().cryps[0].green_life(), (1024 - x_cryp.red_damage().pct(Skill::Riposte.multiplier()))); + assert_eq!(game.player_by_id(y_player.id).unwrap().cryps[0].green_life(), (1024 - x_cryp.red_damage().pct(Skill::RiposteI.multiplier()))); } #[test] @@ -1437,8 +1437,8 @@ mod tests { game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns(); } - game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::Siphon); - while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::Siphon).is_some() { + game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::SiphonI); + while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::SiphonI).is_some() { game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns(); } @@ -1476,7 +1476,7 @@ mod tests { } }; - game.add_skill(y_player.id, x_cryp.id, Some(y_cryp.id), Skill::Siphon).unwrap(); + game.add_skill(y_player.id, x_cryp.id, Some(y_cryp.id), Skill::SiphonI).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); game = game.resolve_phase_start(); diff --git a/server/src/item.rs b/server/src/item.rs index 77e79266..43fc6fae 100644 --- a/server/src/item.rs +++ b/server/src/item.rs @@ -49,7 +49,9 @@ pub enum Item { AmplifyI, AmplifyII, AmplifyIII, - Banish, + BanishI, + BanishII, + BanishIII, BlastI, BlastII, BlastIII, @@ -78,7 +80,9 @@ pub enum Item { InvertI, InvertII, InvertIII, - Parry, + ParryI, + ParryII, + ParryIII, PurgeI, PurgeII, PurgeIII, @@ -109,11 +113,15 @@ pub enum Item { SnareI, SnareII, SnareIII, - Strangle, + StrangleI, + StrangleII, + StrangleIII, StrikeI, StrikeII, StrikeIII, - Siphon, + SiphonI, + SiphonII, + SiphonIII, TauntI, TauntII, TauntIII, @@ -230,7 +238,9 @@ impl Item { Item::AmplifyI => Some(Skill::AmplifyI), Item::AmplifyII => Some(Skill::AmplifyII), Item::AmplifyIII => Some(Skill::AmplifyIII), - Item::Banish => Some(Skill::Banish), + Item::BanishI => Some(Skill::BanishI), + Item::BanishII => Some(Skill::BanishII), + Item::BanishIII => Some(Skill::BanishIII), Item::BlastI => Some(Skill::BlastI), Item::BlastII => Some(Skill::BlastII), Item::BlastIII => Some(Skill::BlastIII), @@ -258,7 +268,9 @@ impl Item { Item::InvertI => Some(Skill::InvertI), Item::InvertII => Some(Skill::InvertII), Item::InvertIII => Some(Skill::InvertIII), - Item::Parry => Some(Skill::Parry), + Item::ParryI => Some(Skill::ParryI), + Item::ParryII => Some(Skill::ParryII), + Item::ParryIII => Some(Skill::ParryIII), Item::PurgeI => Some(Skill::PurgeI), Item::PurgeII => Some(Skill::PurgeII), Item::PurgeIII => Some(Skill::PurgeIII), @@ -286,11 +298,15 @@ impl Item { Item::SleepI => Some(Skill::SleepI), Item::SleepII => Some(Skill::SleepII), Item::SleepIII => Some(Skill::SleepIII), - Item::Siphon => Some(Skill::Siphon), + Item::SiphonI => Some(Skill::SiphonI), + Item::SiphonII => Some(Skill::SiphonII), + Item::SiphonIII => Some(Skill::SiphonIII), Item::SnareI => Some(Skill::SnareI), Item::SnareII => Some(Skill::SnareII), Item::SnareIII => Some(Skill::SnareIII), - Item::Strangle => Some(Skill::Strangle), + Item::StrangleI => Some(Skill::StrangleI), + Item::StrangleII => Some(Skill::StrangleII), + Item::StrangleIII => Some(Skill::StrangleIII), Item::Stun => Some(Skill::Stun), Item::StrikeI => Some(Skill::StrikeI), Item::StrikeII => Some(Skill::StrikeII), @@ -413,7 +429,9 @@ impl Item { self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100, self.into_skill().unwrap().effect().first().unwrap().get_duration()), - Item::Banish => format!("Banish target for {:?}T. + Item::BanishI | + Item::BanishII | + Item::BanishIII => format!("Banish target for {:?}T. Banished cryps are immune to all skills and effects.", self.into_skill().unwrap().effect().first().unwrap().get_duration()), @@ -491,12 +509,14 @@ impl Item { "Reverse healing into damage and damage into healing. Any excess red or blue damage is converted into shield recharge."), - Item::Parry => format!("{} {:?}% red power and blocks red skills for {:?}T. {} {:?}% red power.", + Item::ParryI | + Item::ParryII | + 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(), "If a red skill is parried the cryp will riposte the source dealing red damage", - Skill::Riposte.multiplier()), + Skill::RiposteI.multiplier()), Item::PurgeI | Item::PurgeII | @@ -560,7 +580,9 @@ impl Item { self.into_skill().unwrap().multiplier(), "Deals 35% more damage per red skill on target"), - Item::Strangle => format!( + Item::StrangleI | + Item::StrangleII | + Item::StrangleIII => format!( "Strangle the target disabling skills from both the caster and the target. While strangling deal red damage each turn {:?}% red power. Lasts {:?}T.", self.into_skill().unwrap().multiplier(), @@ -572,7 +594,9 @@ impl Item { "Hits at maximum speed dealing red damage {:?}% red power", self.into_skill().unwrap().multiplier()), - Item::Siphon => format!( + Item::SiphonI | + Item::SiphonII | + Item::SiphonIII => format!( "Deals blue damage {:?}% blue power 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()), @@ -607,87 +631,95 @@ impl Item { fn combo(&self) -> Vec { match self { - Item::TauntI => vec![Item::Buff, Item::Red, Item::Red], - Item::TauntII => vec![Item::TauntI, Item::TauntI, Item::TauntI], - Item::TauntIII => vec![Item::TauntII, Item::TauntII, Item::TauntII], - Item::TriageI => vec![Item::Buff, Item::Green, Item::Green], - Item::TriageII => vec![Item::TriageI, Item::TriageI, Item::TriageI], - Item::TriageIII => vec![Item::TriageII, Item::TriageII, Item::TriageII], - Item::ScatterI => vec![Item::Buff, Item::Blue, Item::Blue], - Item::ScatterII => vec![Item::ScatterI, Item::ScatterI, Item::ScatterI], - Item::ScatterIII => vec![Item::ScatterIII, Item::ScatterIII, Item::ScatterIII], - Item::Haste => vec![Item::Buff, Item::Red, Item::Green], - Item::Impurity => vec![Item::Buff, Item::Green, Item::Blue], - Item::AmplifyI => vec![Item::Buff, Item::Red, Item::Blue], - Item::AmplifyII => vec![Item::AmplifyI, Item::AmplifyI, Item::AmplifyI], - Item::AmplifyIII => vec![Item::AmplifyII, Item::AmplifyII, Item::AmplifyII], + Item::TauntI => vec![Item::Buff, Item::Red, Item::Red], + Item::TauntII => vec![Item::TauntI, Item::TauntI, Item::TauntI], + Item::TauntIII => vec![Item::TauntII, Item::TauntII, Item::TauntII], + Item::TriageI => vec![Item::Buff, Item::Green, Item::Green], + Item::TriageII => vec![Item::TriageI, Item::TriageI, Item::TriageI], + Item::TriageIII => vec![Item::TriageII, Item::TriageII, Item::TriageII], + Item::ScatterI => vec![Item::Buff, Item::Blue, Item::Blue], + Item::ScatterII => vec![Item::ScatterI, Item::ScatterI, Item::ScatterI], + Item::ScatterIII => vec![Item::ScatterIII, Item::ScatterIII, Item::ScatterIII], + Item::Haste => vec![Item::Buff, Item::Red, Item::Green], + Item::Impurity => vec![Item::Buff, Item::Green, Item::Blue], + Item::AmplifyI => vec![Item::Buff, Item::Red, Item::Blue], + Item::AmplifyII => vec![Item::AmplifyI, Item::AmplifyI, Item::AmplifyI], + Item::AmplifyIII => vec![Item::AmplifyII, Item::AmplifyII, Item::AmplifyII], - Item::SnareI => vec![Item::Debuff, Item::Red, Item::Red], - Item::SnareII => vec![Item::SnareI, Item::SnareI, Item::SnareI], - Item::SnareIII => vec![Item::SnareII, Item::SnareII, Item::SnareII], - Item::PurgeI => vec![Item::Debuff, Item::Green, Item::Green], // Needs flavour - Item::PurgeII => vec![Item::PurgeI, Item::PurgeI, Item::PurgeI], // Needs flavour - Item::PurgeIII => vec![Item::PurgeII, Item::PurgeII, Item::PurgeII], // Needs flavour - Item::SilenceI => vec![Item::Debuff, Item::Blue, Item::Blue], - Item::SilenceII => vec![Item::SilenceI, Item::SilenceI, Item::SilenceI], - Item::SilenceIII => vec![Item::SilenceII, Item::SilenceII, Item::SilenceII], - Item::CurseI => vec![Item::Debuff, Item::Red, Item::Green], - Item::CurseII => vec![Item::CurseI, Item::CurseI, Item::CurseI], - Item::CurseIII => vec![Item::CurseII, Item::CurseII, Item::CurseII], - Item::DecayI => vec![Item::Debuff, Item::Green, Item::Blue], - Item::DecayII => vec![Item::DecayI, Item::DecayI, Item::DecayI], - Item::DecayIII => vec![Item::DecayII, Item::DecayII, Item::DecayII], - Item::InvertI => vec![Item::Debuff, Item::Red, Item::Blue], - Item::InvertII => vec![Item::InvertI, Item::InvertI, Item::InvertI], - Item::InvertIII => vec![Item::InvertII, Item::InvertII, Item::InvertII], + Item::SnareI => vec![Item::Debuff, Item::Red, Item::Red], + Item::SnareII => vec![Item::SnareI, Item::SnareI, Item::SnareI], + Item::SnareIII => vec![Item::SnareII, Item::SnareII, Item::SnareII], + Item::PurgeI => vec![Item::Debuff, Item::Green, Item::Green], // Needs flavour + Item::PurgeII => vec![Item::PurgeI, Item::PurgeI, Item::PurgeI], // Needs flavour + Item::PurgeIII => vec![Item::PurgeII, Item::PurgeII, Item::PurgeII], // Needs flavour + Item::SilenceI => vec![Item::Debuff, Item::Blue, Item::Blue], + Item::SilenceII => vec![Item::SilenceI, Item::SilenceI, Item::SilenceI], + Item::SilenceIII => vec![Item::SilenceII, Item::SilenceII, Item::SilenceII], + Item::CurseI => vec![Item::Debuff, Item::Red, Item::Green], + Item::CurseII => vec![Item::CurseI, Item::CurseI, Item::CurseI], + Item::CurseIII => vec![Item::CurseII, Item::CurseII, Item::CurseII], + Item::DecayI => vec![Item::Debuff, Item::Green, Item::Blue], + Item::DecayII => vec![Item::DecayI, Item::DecayI, Item::DecayI], + Item::DecayIII => vec![Item::DecayII, Item::DecayII, Item::DecayII], + Item::InvertI => vec![Item::Debuff, Item::Red, Item::Blue], + Item::InvertII => vec![Item::InvertI, Item::InvertI, Item::InvertI], + Item::InvertIII => vec![Item::InvertII, Item::InvertII, Item::InvertII], - Item::Parry => vec![Item::Block, Item::Red, Item::Red], // 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::Corrupt => vec![Item::Block, Item::Blue, Item::Blue], - 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::ParryI => vec![Item::Block, Item::Red, Item::Red], + Item::ParryII => vec![Item::ParryI, Item::ParryI, Item::ParryI], + 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::Corrupt => vec![Item::Block, Item::Blue, Item::Blue], + 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::Strangle => vec![Item::Stun, Item::Red, Item::Red], - 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::Banish => vec![Item::Stun, Item::Red, Item::Blue], + 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::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::Siphon => vec![Item::Attack, Item::Green, Item::Blue], - 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::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::RedDamageI => vec![Item::Damage, Item::Red, Item::Red], Item::GreenDamageI => vec![Item::Damage, Item::Green, Item::Green], @@ -722,7 +754,9 @@ impl From for Item { Skill::AmplifyII => Item::AmplifyII, Skill::AmplifyIII => Item::AmplifyIII, Skill::Attack => Item::Attack, - Skill::Banish => Item::Banish, + Skill::BanishI => Item::BanishI, + Skill::BanishII => Item::BanishII, + Skill::BanishIII => Item::BanishIII, Skill::BlastI => Item::BlastI, Skill::BlastII => Item::BlastII, Skill::BlastIII => Item::BlastIII, @@ -753,7 +787,9 @@ impl From for Item { Skill::InvertI => Item::InvertI, Skill::InvertII => Item::InvertII, Skill::InvertIII => Item::InvertIII, - Skill::Parry => Item::Parry, + Skill::ParryI => Item::ParryI, + Skill::ParryII => Item::ParryII, + Skill::ParryIII => Item::ParryIII, Skill::PurgeI => Item::PurgeI, Skill::PurgeII => Item::PurgeII, Skill::PurgeIII => Item::PurgeIII, @@ -775,7 +811,9 @@ impl From for Item { Skill::SilenceI => Item::SilenceI, Skill::SilenceII => Item::SilenceII, Skill::SilenceIII => Item::SilenceIII, - Skill::Siphon => Item::Siphon, + Skill::SiphonI => Item::SiphonI, + Skill::SiphonII => Item::SiphonII, + Skill::SiphonIII => Item::SiphonIII, Skill::SlayI => Item::SlayI, Skill::SlayII => Item::SlayII, Skill::SlayIII => Item::SlayIII, @@ -785,7 +823,9 @@ impl From for Item { Skill::SnareI => Item::SnareI, Skill::SnareII => Item::SnareII, Skill::SnareIII => Item::SnareIII, - Skill::Strangle => Item::Strangle, + Skill::StrangleI => Item::StrangleI, + Skill::StrangleII => Item::StrangleII, + Skill::StrangleIII => Item::StrangleIII, Skill::StrikeI => Item::StrikeI, Skill::StrikeII => Item::StrikeII, Skill::StrikeIII => Item::StrikeIII, @@ -802,8 +842,6 @@ impl From for Item { Skill::Corrupt => Item::Corrupt, Skill::CorruptionTick => Item::Corrupt, - Skill::SiphonTick => Item::Siphon, - Skill::StrangleTick => Item::Strangle, Skill::TestTouch => Item::TestTouch, Skill::TestStun => Item::TestStun, @@ -894,7 +932,9 @@ pub fn get_combos() -> Vec { Combo { components: Item::InvertII.combo(), item: Item::InvertII }, Combo { components: Item::InvertIII.combo(), item: Item::InvertIII }, - Combo { components: Item::Parry.combo(), item: Item::Parry }, // Add red recharge + Combo { components: Item::ParryI.combo(), item: Item::ParryI }, + Combo { components: Item::ParryII.combo(), item: Item::ParryII }, + Combo { components: Item::ParryIII.combo(), item: Item::ParryIII }, Combo { components: Item::PurifyI.combo(), item: Item::PurifyI }, Combo { components: Item::PurifyII.combo(), item: Item::PurifyII }, Combo { components: Item::PurifyIII.combo(), item: Item::PurifyIII }, @@ -911,10 +951,12 @@ pub fn get_combos() -> Vec { Combo { components: Item::RechargeII.combo(), item: Item::RechargeII }, Combo { components: Item::RechargeIII.combo(), item: Item::RechargeIII }, - Combo { components: Item::Strangle.combo(), item: Item::Strangle }, + Combo { components: Item::StrangleI.combo(), item: Item::StrangleI }, + Combo { components: Item::StrangleII.combo(), item: Item::StrangleII }, + Combo { components: Item::StrangleIII.combo(), item: Item::StrangleIII }, Combo { components: Item::SleepI.combo(), item: Item::SleepI }, - Combo { components: Item::SleepII.combo(), item: Item::SleepII }, - Combo { components: Item::SleepIII.combo(), item: Item::SleepIII }, + Combo { components: Item::SleepII.combo(), item: Item::SleepII }, + Combo { components: Item::SleepIII.combo(), item: Item::SleepIII }, Combo { components: Item::RuinI.combo(), item: Item::RuinI }, Combo { components: Item::RuinII.combo(), item: Item::RuinII }, Combo { components: Item::RuinIII.combo(), item: Item::RuinIII }, @@ -926,7 +968,9 @@ pub fn get_combos() -> Vec { Combo { components: Item::HexI.combo(), item: Item::HexI }, Combo { components: Item::HexII.combo(), item: Item::HexII }, Combo { components: Item::HexIII.combo(), item: Item::HexIII }, - Combo { components: Item::Banish.combo(), item: Item::Banish }, + Combo { components: Item::BanishI.combo(), item: Item::BanishI }, + Combo { components: Item::BanishII.combo(), item: Item::BanishII }, + Combo { components: Item::BanishIII.combo(), item: Item::BanishIII }, Combo { components: Item::StrikeI.combo(), item: Item::StrikeI }, Combo { components: Item::StrikeII.combo(), item: Item::StrikeII }, @@ -941,7 +985,9 @@ pub fn get_combos() -> Vec { Combo { components: Item::SlayI.combo(), item: Item::SlayI }, Combo { components: Item::SlayII.combo(), item: Item::SlayII }, Combo { components: Item::SlayIII.combo(), item: Item::SlayIII }, - Combo { components: Item::Siphon.combo(), item: Item::Siphon }, + Combo { components: Item::SiphonI.combo(), item: Item::SiphonI }, + Combo { components: Item::SiphonII.combo(), item: Item::SiphonII }, + Combo { components: Item::SiphonIII.combo(), item: Item::SiphonIII }, Combo { components: Item::ChaosI.combo(), item: Item::ChaosI }, Combo { components: Item::ChaosII.combo(), item: Item::ChaosII }, Combo { components: Item::ChaosIII.combo(), item: Item::ChaosIII }, diff --git a/server/src/skill.rs b/server/src/skill.rs index c62bd88f..5f7246db 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -91,7 +91,7 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio match skill { Skill::BlastI | Skill::ChaosI | - Skill::Siphon => { + Skill::SiphonI => { let amount = source.green_damage().pct(Skill::ImpureBlast.multiplier()); target.deal_blue_damage(Skill::ImpureBlast, amount) .into_iter() @@ -116,7 +116,9 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio Skill::AmplifyII | Skill::AmplifyIII => amplify(source, target, resolutions, skill), - Skill::Banish => banish(source, target, resolutions, skill), // TODO prevent all actions + Skill::BanishI | + Skill::BanishII | + Skill::BanishIII => banish(source, target, resolutions, skill), // TODO prevent all actions Skill::BlastI | Skill::BlastII | @@ -161,7 +163,9 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio Skill::InvertII | Skill::InvertIII => invert(source, target, resolutions, skill), - Skill::Parry => parry(source, target, resolutions, skill), + Skill::ParryI | + Skill::ParryII | + Skill::ParryIII => parry(source, target, resolutions, skill), Skill::PurgeI | Skill::PurgeII | @@ -191,8 +195,12 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio Skill::SilenceII | Skill::SilenceIII => silence(source, target, resolutions, skill), // target cannot cast spells - Skill::Siphon => siphon(source, target, resolutions, skill), - Skill::SiphonTick => siphon_tick(source, target, resolutions, skill), // hot + Skill::SiphonI | + Skill::SiphonII | + Skill::SiphonIII => siphon(source, target, resolutions, skill), // dot + Skill::SiphonTickI | + Skill::SiphonTickII | + Skill::SiphonTickIII => siphon_tick(source, target, resolutions, skill), // dot Skill::SlayI | Skill::SlayII | @@ -206,8 +214,12 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio Skill::SnareII | Skill::SnareIII => snare(source, target, resolutions, skill), - Skill::Strangle => strangle(source, target, resolutions, skill), - Skill::StrangleTick => strangle_tick(source, target, resolutions, skill), + Skill::StrangleI | + Skill::StrangleII | + Skill::StrangleIII => strangle(source, target, resolutions, skill), + Skill::StrangleTickI | + Skill::StrangleTickII | + Skill::StrangleTickIII => strangle_tick(source, target, resolutions, skill), Skill::StrikeI | Skill::StrikeII | @@ -239,7 +251,9 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio //Triggered Skill::HasteStrike => panic!("should only trigger from haste"), Skill::ImpureBlast => panic!("should only trigger from impurity"), - Skill::Riposte => panic!("should only trigger from parry"), + Skill::RiposteI | + Skill::RiposteII | + Skill::RiposteIII => panic!("should only trigger from parry"), // Not used @@ -252,8 +266,8 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio Skill::TestTouch => touch(source, target, resolutions, skill), Skill::TestStun => stun(source, target, resolutions, Skill::Stun), Skill::TestBlock => block(source, target, resolutions, Skill::Block), - Skill::TestParry => parry(source, target, resolutions, Skill::Parry), - Skill::TestSiphon => siphon(source, target, resolutions, Skill::Siphon), + Skill::TestParry => parry(source, target, resolutions, Skill::ParryI), + Skill::TestSiphon => siphon(source, target, resolutions, Skill::SiphonI), }; return resolutions; @@ -283,8 +297,15 @@ fn post_resolve(_skill: Skill, game: &mut Game, mut resolutions: Resolutions) -> Event::Immunity { skill: _, immunity } => match immunity.contains(&Effect::Parry) { true => { - resolutions = riposte(&mut target, &mut source, resolutions, Skill::Riposte); - } + let im_targ = target.clone(); + let CrypEffect { effect: _, duration: _, meta, tick: _ } = im_targ.effects.iter() + .find(|e| e.effect == Effect::Parry).unwrap(); + let &riposte_skill = match meta { + Some(EffectMeta::Skill(s)) => s, + _ => panic!("no parry skill"), + }; + resolutions = riposte(&mut target, &mut source, resolutions, riposte_skill); + }, false => (), }, _ => (), @@ -472,18 +493,20 @@ impl Effect { Effect::Clutch => [ Skill::Stun, Skill::HexI, - Skill::HexII, - Skill::HexIII, + Skill::HexII, + Skill::HexIII, Skill::SilenceI, - Skill::SilenceII, - Skill::SilenceIII, + Skill::SilenceII, + Skill::SilenceIII, Skill::RuinI, - Skill::RuinII, - Skill::RuinIII, - Skill::Strangle, + Skill::RuinII, + Skill::RuinIII, + Skill::StrangleI, + Skill::StrangleII, + Skill::StrangleIII, Skill::SnareI, - Skill::SnareII, - Skill::SnareIII + Skill::SnareII, + Skill::SnareIII ].contains(&skill), Effect::Injured => skill.colours().contains(&Colour::Green), _ => false, @@ -500,7 +523,12 @@ impl Effect { Effect::Hex => true, Effect::Banish => true, Effect::Strangle => true, - Effect::Strangling => skill != Skill::StrangleTick, + Effect::Strangling => match skill { + Skill::StrangleTickI | + Skill::StrangleTickII | + Skill::StrangleTickIII => false, + _ => true, + }, Effect::Silence => skill.colours().contains(&Colour::Blue), Effect::Snare => skill.colours().contains(&Colour::Red), Effect::Ko => skill.ko_castable(), @@ -635,7 +663,9 @@ pub enum Skill { AmplifyII, AmplifyIII, - Banish, + BanishI, + BanishII, + BanishIII, BlastI, BlastII, @@ -683,8 +713,9 @@ pub enum Skill { InvertII, InvertIII, - Parry, // avoid all damage - + ParryI, // avoid all damage + ParryII, + ParryIII, PurgeI, PurgeII, PurgeIII, @@ -701,7 +732,9 @@ pub enum Skill { ReflectII, ReflectIII, - Riposte, + RiposteI, + RiposteII, + RiposteIII, RuinI, RuinII, @@ -715,8 +748,12 @@ pub enum Skill { SilenceII, SilenceIII, - Siphon, - SiphonTick, + SiphonI, + SiphonII, + SiphonIII, + SiphonTickI, + SiphonTickII, + SiphonTickIII, SlayI, SlayII, @@ -730,8 +767,12 @@ pub enum Skill { SnareII, SnareIII, - Strangle, - StrangleTick, + StrangleI, + StrangleII, + StrangleIII, + StrangleTickI, + StrangleTickII, + StrangleTickIII, StrikeI, StrikeII, @@ -780,7 +821,9 @@ impl Skill { Skill::HealI => 130, //GG Skill::HealII => 160, //GG Skill::HealIII => 200, //GG - Skill::SiphonTick => 40, // GB + Skill::SiphonTickI => 40, // GB + Skill::SiphonTickII => 70, + Skill::SiphonTickIII => 110, Skill::SlayI => 70, // RG Skill::SlayII => 90, @@ -792,8 +835,12 @@ impl Skill { // Block Base Skill::CorruptionTick => 80, - Skill::Parry => 110, - Skill::Riposte => 70, + Skill::ParryI => 110, + Skill::ParryII => 145, + Skill::ParryIII => 200, + Skill::RiposteI => 70, + Skill::RiposteII => 95, + Skill::RiposteIII => 120, Skill::PurifyI => 45, //Green dmg (heal) Skill::PurifyII => 70, @@ -811,7 +858,9 @@ impl Skill { Skill::SleepI => 240, //Green dmg (heal) Skill::SleepII => 300, Skill::SleepIII => 400, - Skill::StrangleTick => 65, + Skill::StrangleTickI => 65, + Skill::StrangleTickII => 95, + Skill::StrangleTickIII => 140, // Debuff Base Skill::DecayTickI => 25, @@ -851,7 +900,9 @@ impl Skill { Skill::AmplifyIII => vec![CrypEffect {effect: Effect::Amplify, duration: 4, meta: Some(EffectMeta::Multiplier(200)), tick: None}], - Skill::Banish => vec![CrypEffect {effect: Effect::Banish, duration: 1,meta: None, tick: None}], + Skill::BanishI => vec![CrypEffect {effect: Effect::Banish, duration: 1,meta: None, tick: None}], + Skill::BanishII => vec![CrypEffect {effect: Effect::Banish, duration: 2,meta: None, tick: None}], + Skill::BanishIII => vec![CrypEffect {effect: Effect::Banish, duration: 3,meta: None, tick: None}], Skill::Block => vec![CrypEffect {effect: Effect::Block, duration: 1, meta: Some(EffectMeta::Multiplier(50)), tick: None}], Skill::Buff => vec![CrypEffect {effect: Effect::Buff, duration: 2, @@ -876,13 +927,13 @@ impl Skill { Skill::DecayI => vec![CrypEffect {effect: Effect::Wither, duration: 3, meta: Some(EffectMeta::Multiplier(50)), tick: None }, CrypEffect {effect: Effect::Decay, duration: 3, - meta: Some(EffectMeta::SkillTick(Skill::DecayTickI)), tick: None}], + meta: Some(EffectMeta::Skill(Skill::DecayTickI)), tick: None}], Skill::DecayII => vec![CrypEffect {effect: Effect::Wither, duration: 3, meta: Some(EffectMeta::Multiplier(35)), tick: None }, CrypEffect {effect: Effect::Decay, duration: 3, - meta: Some(EffectMeta::SkillTick(Skill::DecayTickII)), tick: None}], + meta: Some(EffectMeta::Skill(Skill::DecayTickII)), tick: None}], Skill::DecayIII => vec![CrypEffect {effect: Effect::Wither, duration: 4, meta: Some(EffectMeta::Multiplier(20)), tick: None }, CrypEffect {effect: Effect::Decay, duration: 4, - meta: Some(EffectMeta::SkillTick(Skill::DecayTickIII)), tick: None}], + meta: Some(EffectMeta::Skill(Skill::DecayTickIII)), tick: None}], Skill::Haste => vec![CrypEffect {effect: Effect::Haste, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None }], @@ -900,8 +951,13 @@ impl Skill { Skill::InvertII => vec![CrypEffect {effect: Effect::Invert, duration: 3, meta: None, tick: None}], Skill::InvertIII => vec![CrypEffect {effect: Effect::Invert, duration: 4, meta: None, tick: None}], - Skill::Parry => vec![CrypEffect {effect: Effect::Parry, duration: 2, meta: None, tick: None }], - + Skill::ParryI => vec![CrypEffect {effect: Effect::Parry, duration: 2, + meta: Some(EffectMeta::Skill(Skill::RiposteI)), tick: None}], + Skill::ParryII => vec![CrypEffect {effect: Effect::Parry, duration: 2, + meta: Some(EffectMeta::Skill(Skill::RiposteII)), tick: None}], + Skill::ParryIII => vec![CrypEffect {effect: Effect::Parry, duration: 2, + meta: Some(EffectMeta::Skill(Skill::RiposteIII)), tick: None}], + Skill::ReflectI => vec![CrypEffect {effect: Effect::Reflect, duration: 1, meta: None, tick: None }], Skill::ReflectII => vec![CrypEffect {effect: Effect::Reflect, duration: 2, meta: None, tick: None }], Skill::ReflectIII => vec![CrypEffect {effect: Effect::Reflect, duration: 3, meta: None, tick: None }], @@ -925,7 +981,12 @@ impl Skill { Skill::SilenceII => vec![CrypEffect {effect: Effect::Silence, duration: 3, meta: None, tick: None}], Skill::SilenceIII => vec![CrypEffect {effect: Effect::Silence, duration: 4, meta: None, tick: None}], - Skill::Siphon => vec![CrypEffect {effect: Effect::Siphon, duration: 2, meta: None, tick: None}], + Skill::SiphonI => vec![CrypEffect {effect: Effect::Siphon, duration: 2, + meta: Some(EffectMeta::Skill(Skill::SiphonTickI)), tick: None}], + Skill::SiphonII => vec![CrypEffect {effect: Effect::Siphon, duration: 3, + meta: Some(EffectMeta::Skill(Skill::SiphonTickII)), tick: None}], + Skill::SiphonIII => vec![CrypEffect {effect: Effect::Siphon, duration: 4, + meta: Some(EffectMeta::Skill(Skill::SiphonTickIII)), tick: None}], Skill::SleepI => vec![CrypEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}], Skill::SleepII => vec![CrypEffect {effect: Effect::Stun, duration: 3, meta: None, tick: None}], @@ -935,7 +996,12 @@ impl Skill { Skill::SnareII => vec![CrypEffect {effect: Effect::Snare, duration: 3, meta: None, tick: None}], Skill::SnareIII => vec![CrypEffect {effect: Effect::Snare, duration: 4, meta: None, tick: None}], - Skill::Strangle => vec![CrypEffect {effect: Effect::Strangle, duration: 2, meta: None, tick: None}], + Skill::StrangleI => vec![CrypEffect {effect: Effect::Strangle, duration: 2, + meta: Some(EffectMeta::Skill(Skill::StrangleTickI)), tick: None}], + Skill::StrangleII => vec![CrypEffect {effect: Effect::Strangle, duration: 2, + meta: Some(EffectMeta::Skill(Skill::StrangleTickII)), tick: None}], + Skill::StrangleIII => vec![CrypEffect {effect: Effect::Strangle, duration: 2, + meta: Some(EffectMeta::Skill(Skill::StrangleTickIII)), tick: None}], Skill::Stun => vec![CrypEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}], Skill::TauntI => vec![CrypEffect {effect: Effect::Taunt, duration: 2, meta: None, tick: None}], @@ -943,11 +1009,11 @@ impl Skill { Skill::TauntIII => vec![CrypEffect {effect: Effect::Taunt, duration: 4, meta: None, tick: None}], Skill::TriageI => vec![CrypEffect {effect: Effect::Triage, duration: 2, - meta: Some(EffectMeta::SkillTick(Skill::TriageTickI)), tick: None}], + meta: Some(EffectMeta::Skill(Skill::TriageTickI)), tick: None}], Skill::TriageII => vec![CrypEffect {effect: Effect::Triage, duration: 3, - meta: Some(EffectMeta::SkillTick(Skill::TriageTickII)), tick: None}], + meta: Some(EffectMeta::Skill(Skill::TriageTickII)), tick: None}], Skill::TriageIII => vec![CrypEffect {effect: Effect::Triage, duration: 4, - meta: Some(EffectMeta::SkillTick(Skill::TriageTickIII)), tick: None}], + meta: Some(EffectMeta::Skill(Skill::TriageTickIII)), tick: None}], //Unused Skill::Injure => vec![CrypEffect {effect: Effect::Injured, duration: 2, meta: None, tick: None }], @@ -968,7 +1034,9 @@ impl Skill { Skill::StrikeII => None, Skill::StrikeIII => None, Skill::Block => None, // reduce damage - Skill::Parry => Some(2), // avoid all damage + Skill::ParryI | + Skill::ParryII | + Skill::ParryIII => Some(2), // avoid all damage Skill::SnareI => Some(2), Skill::SnareII => Some(2), @@ -1006,7 +1074,9 @@ impl Skill { Skill::DecayI => Some(1), // dot Skill::DecayII => Some(1), Skill::DecayIII => Some(1), - Skill::Siphon => None, + Skill::SiphonI | + Skill::SiphonII | + Skill::SiphonIII => None, Skill::CurseI => Some(1), Skill::CurseII => Some(1), @@ -1028,7 +1098,9 @@ impl Skill { Skill::PurgeII => None, Skill::PurgeIII => None, - Skill::Banish => Some(1), + Skill::BanishI => Some(1), + Skill::BanishII => Some(1), + Skill::BanishIII => Some(1), Skill::HexI => Some(1), Skill::HexII => Some(2), @@ -1055,7 +1127,9 @@ impl Skill { Skill::SleepII => Some(3), Skill::SleepIII => Some(3), - Skill::Strangle => Some(2), + Skill::StrangleI => Some(2), + Skill::StrangleII => Some(2), + Skill::StrangleIII => Some(2), Skill::ClutchI => Some(1), Skill::ClutchII => Some(2), @@ -1076,14 +1150,20 @@ impl Skill { // Trigger Skill::ImpureBlast | Skill::HasteStrike | - Skill::Riposte | // parry + Skill::RiposteI | + Skill::RiposteII | + Skill::RiposteIII | // parry // Ticks Skill::CorruptionTick | Skill::DecayTickI | Skill::DecayTickII | Skill::DecayTickIII | - Skill::SiphonTick | - Skill::StrangleTick | + Skill::SiphonTickI | + Skill::SiphonTickII | + Skill::SiphonTickIII | + Skill::StrangleTickI | + Skill::StrangleTickII | + Skill::StrangleTickIII | Skill::TriageTickI | Skill::TriageTickII | Skill::TriageTickIII => None, @@ -1107,7 +1187,9 @@ impl Skill { Skill::DecayTickI | Skill::DecayTickII | Skill::DecayTickIII | - Skill::SiphonTick | + Skill::SiphonTickI | + Skill::SiphonTickII | + Skill::SiphonTickIII | Skill::TriageTickI | Skill::TriageTickII | @@ -1122,8 +1204,12 @@ impl Skill { Skill::DecayTickI | Skill::DecayTickII | Skill::DecayTickIII | - Skill::SiphonTick | - Skill::StrangleTick | + Skill::SiphonTickI | + Skill::SiphonTickII | + Skill::SiphonTickIII | + Skill::StrangleTickI | + Skill::StrangleTickII | + Skill::StrangleTickIII | Skill::TriageTickI | Skill::TriageTickII | @@ -1148,7 +1234,9 @@ impl Skill { Skill::StrikeII => Skill::StrikeI.speed(), Skill::StrikeIII => Skill::StrikeI.speed(), - Skill::SiphonTick => Skill::Siphon.speed(), + Skill::SiphonTickI | + Skill::SiphonTickII | + Skill::SiphonTickIII => Skill::SiphonI.speed(), Skill::DecayTickI | Skill::DecayTickII | Skill::DecayTickIII => Skill::DecayI.speed(), @@ -1157,7 +1245,9 @@ impl Skill { Skill::TriageTickII | Skill::TriageTickIII => Skill::TriageI.speed(), - Skill::StrangleTick => Skill::Strangle.speed(), + Skill::StrangleTickI | + Skill::StrangleTickII | + Skill::StrangleTickIII => Skill::StrangleI.speed(), Skill::CorruptionTick => Skill::Corrupt.speed(), _ => Item::from(*self).speed(), @@ -1180,7 +1270,9 @@ impl Skill { Skill::ClutchI | Skill::ClutchII | Skill::ClutchIII | - Skill::Parry | + Skill::ParryI | + Skill::ParryII | + Skill::ParryIII | Skill::TestBlock | Skill::TestParry => true, @@ -1208,7 +1300,9 @@ impl Skill { Skill::InvertI | Skill::InvertII | Skill::InvertIII | - Skill::Parry | + Skill::ParryI | + Skill::ParryII | + Skill::ParryIII | Skill::PurifyI | Skill::PurifyII | Skill::PurifyIII | @@ -1225,7 +1319,9 @@ impl Skill { Skill::TriageII | Skill::TriageIII => true, - Skill::Banish => rng.gen_bool(0.5), + Skill::BanishI | + Skill::BanishII | + Skill::BanishIII => rng.gen_bool(0.5), _ => false, } @@ -1337,17 +1433,19 @@ fn throw(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: } fn strangle(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { + let CrypEffect { effect, duration, meta, tick: _ } = skill.effect().first().unwrap().clone(); + let tick_skill = match meta { + Some(EffectMeta::Skill(s)) => s, + _ => panic!("no strangle tick skill"), + }; + let strangle = CrypEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill)); + results.push(Resolution::new(source, target).event(target.add_effect(skill, strangle))); - skill.effect().into_iter().for_each(|e| { - let CrypEffect { effect: _, duration, meta: _, tick: _ } = e; - let strangle = e.clone().set_tick(Cast::new_tick(source, target, Skill::StrangleTick)); - results.push(Resolution::new(source, target).event(target.add_effect(skill, strangle))); + let attacker_strangle = CrypEffect::new(Effect::Strangling, duration); + results.push(Resolution::new(source, source).event(source.add_effect(skill, attacker_strangle))); - let attacker_strangle = CrypEffect::new(Effect::Strangling, duration); - results.push(Resolution::new(source, source).event(source.add_effect(skill, attacker_strangle))); - - }); - return strangle_tick(source, target, results, Skill::StrangleTick); + + return strangle_tick(source, target, results, tick_skill); } fn strangle_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { @@ -1450,7 +1548,7 @@ fn heal(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: S fn triage(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { let CrypEffect { effect, duration, meta, tick: _ } = skill.effect().first().unwrap().clone(); let tick_skill = match meta { - Some(EffectMeta::SkillTick(s)) => s, + Some(EffectMeta::Skill(s)) => s, _ => panic!("no triage tick skill"), }; let triage = CrypEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill)); @@ -1515,7 +1613,7 @@ fn decay(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: let CrypEffect { effect, duration, meta, tick: _ } = skill.effect().last().unwrap().clone(); let tick_skill = match meta { - Some(EffectMeta::SkillTick(s)) => s, + Some(EffectMeta::Skill(s)) => s, _ => panic!("no decay tick skill"), }; let decay = CrypEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill)); @@ -1620,23 +1718,26 @@ fn recharge(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skil } fn siphon(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { - skill.effect().into_iter().for_each(|e| { - let siphon = e.clone().set_tick(Cast::new_tick(source, target, Skill::SiphonTick)); - results.push(Resolution::new(source, target).event(target.add_effect(skill, siphon))); - }); + let CrypEffect { effect, duration, meta, tick: _ } = skill.effect().first().unwrap().clone(); + let tick_skill = match meta { + Some(EffectMeta::Skill(s)) => s, + _ => panic!("no siphon tick skill"), + }; + let siphon = CrypEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill)); + results.push(Resolution::new(source, target).event(target.add_effect(skill, siphon))); - return siphon_tick(source, target, results, Skill::SiphonTick); + return siphon_tick(source, target, results, tick_skill); } fn siphon_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { let amount = source.blue_damage().pct(skill.multiplier()); - let siphon_events = target.deal_blue_damage(Skill::SiphonTick, amount); + let siphon_events = target.deal_blue_damage(skill, amount); for e in siphon_events { match e { Event::Damage { amount, mitigation: _, colour: _, skill: _ } => { results.push(Resolution::new(source, target).event(e)); - let heal = source.deal_green_damage(Skill::SiphonTick, amount); + let heal = source.deal_green_damage(skill, amount); for h in heal { results.push(Resolution::new(source, source).event(h)); }; @@ -1919,10 +2020,10 @@ mod tests { x.green_life.reduce(512); - let mut results = resolve(Skill::Siphon, &mut x, &mut y, vec![]); + let mut results = resolve(Skill::SiphonI, &mut x, &mut y, vec![]); assert!(y.affected(Effect::Siphon)); - assert!(x.green_life() == (512 + 256.pct(Skill::SiphonTick.multiplier()))); + assert!(x.green_life() == (512 + 256.pct(Skill::SiphonTickI.multiplier()))); let Resolution { source: _, target: _, event } = results.remove(0); match event { @@ -1932,14 +2033,14 @@ mod tests { let Resolution { source: _, target: _, event } = results.remove(0); match event { - Event::Damage { amount, skill: _, mitigation: _, colour: _} => assert_eq!(amount, 256.pct(Skill::SiphonTick.multiplier())), + Event::Damage { amount, skill: _, mitigation: _, colour: _} => assert_eq!(amount, 256.pct(Skill::SiphonTickI.multiplier())), _ => panic!("not damage siphon"), }; let Resolution { source: _, target, event } = results.remove(0); match event { Event::Healing { amount, skill: _, overhealing: _ } => { - assert_eq!(amount, 256.pct(Skill::SiphonTick.multiplier())); + assert_eq!(amount, 256.pct(Skill::SiphonTickI.multiplier())); assert_eq!(target.id, x.id); }, _ => panic!("not healing"),