diff --git a/server/src/cryp.rs b/server/src/cryp.rs index ad883414..d0fd652f 100644 --- a/server/src/cryp.rs +++ b/server/src/cryp.rs @@ -62,6 +62,7 @@ impl CrypSkill { #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)] pub enum EffectMeta { + SkillTick(Skill), TickAmount(u64), AddedDamage(u64), ScatterTarget(Uuid), diff --git a/server/src/game.rs b/server/src/game.rs index 6d6a5116..56657c02 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -1432,8 +1432,8 @@ mod tests { // make the purify cryp super fast so it beats out decay game.cryp_by_id(y_cryp.id).unwrap().speed.force(10000000); - game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::Decay); - while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::Decay).is_some() { + game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::DecayI); + while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::DecayI).is_some() { game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns(); } @@ -1448,7 +1448,7 @@ mod tests { } // apply buff - game.add_skill(x_player.id, x_cryp.id, Some(y_cryp.id), Skill::Decay).unwrap(); + game.add_skill(x_player.id, x_cryp.id, Some(y_cryp.id), Skill::DecayI).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); game = game.resolve_phase_start(); @@ -1456,7 +1456,7 @@ mod tests { let Resolution { source: _, target: _, event } = game.resolved.pop().unwrap(); match event { - Event::Damage { amount: _, skill, mitigation: _, colour: _ } => assert_eq!(skill, Skill::DecayTick), + Event::Damage { amount: _, skill, mitigation: _, colour: _ } => assert_eq!(skill, Skill::DecayTickI), _ => panic!("not decay"), }; diff --git a/server/src/item.rs b/server/src/item.rs index 735741b4..77e79266 100644 --- a/server/src/item.rs +++ b/server/src/item.rs @@ -47,78 +47,82 @@ pub enum Item { RBSpeedI, AmplifyI, - AmplifyII, - AmplifyIII, + AmplifyII, + AmplifyIII, Banish, BlastI, - BlastII, - BlastIII, + BlastII, + BlastIII, ChaosI, - ChaosII, - ChaosIII, + ChaosII, + ChaosIII, ClutchI, - ClutchII, - ClutchIII, + ClutchII, + ClutchIII, Corrupt, CurseI, - CurseII, - CurseIII, - Decay, + CurseII, + CurseIII, + DecayI, + DecayII, + DecayIII, Hostility, Haste, HealI, - HealII, - HealIII, + HealII, + HealIII, HexI, - HexII, - HexIII, + HexII, + HexIII, Impurity, InvertI, - InvertII, - InvertIII, + InvertII, + InvertIII, Parry, PurgeI, - PurgeII, - PurgeIII, + PurgeII, + PurgeIII, PurifyI, - PurifyII, - PurifyIII, + PurifyII, + PurifyIII, ReflectI, - ReflectII, - ReflectIII, + ReflectII, + ReflectIII, RechargeI, - RechargeII, - RechargeIII, + RechargeII, + RechargeIII, RuinI, - RuinII, - RuinIII, + RuinII, + RuinIII, ScatterI, - ScatterII, - ScatterIII, + ScatterII, + ScatterIII, SilenceI, - SilenceII, - SilenceIII, + SilenceII, + SilenceIII, SlayI, - SlayII, - SlayIII, + SlayII, + SlayIII, SleepI, - SleepII, - SleepIII, + SleepII, + SleepIII, SnareI, - SnareII, - SnareIII, + SnareII, + SnareIII, Strangle, StrikeI, StrikeII, StrikeIII, Siphon, TauntI, - TauntII, - TauntIII, + TauntII, + TauntIII, ThrowI, - ThrowII, - ThrowIII, - Triage, + ThrowII, + ThrowIII, + TriageI, + TriageII, + TriageIII, TestTouch, @@ -222,84 +226,88 @@ impl Item { pub fn into_skill(&self) -> Option { match self { - Item::Attack => Some(Skill::Attack), + Item::Attack => Some(Skill::Attack), Item::AmplifyI => Some(Skill::AmplifyI), - Item::AmplifyII => Some(Skill::AmplifyII), - Item::AmplifyIII => Some(Skill::AmplifyIII), - Item::Banish => Some(Skill::Banish), + Item::AmplifyII => Some(Skill::AmplifyII), + Item::AmplifyIII => Some(Skill::AmplifyIII), + Item::Banish => Some(Skill::Banish), Item::BlastI => Some(Skill::BlastI), - Item::BlastII => Some(Skill::BlastII), - Item::BlastIII => Some(Skill::BlastIII), - Item::Block => Some(Skill::Block), - Item::Buff => Some(Skill::Buff), + Item::BlastII => Some(Skill::BlastII), + Item::BlastIII => Some(Skill::BlastIII), + Item::Block => Some(Skill::Block), + Item::Buff => Some(Skill::Buff), Item::ChaosI => Some(Skill::ChaosI), - Item::ChaosII => Some(Skill::ChaosII), - Item::ChaosIII => Some(Skill::ChaosIII), + Item::ChaosII => Some(Skill::ChaosII), + Item::ChaosIII => Some(Skill::ChaosIII), Item::CurseI => Some(Skill::CurseI), - Item::CurseII => Some(Skill::CurseII), - Item::CurseIII => Some(Skill::CurseIII), - Item::Debuff => Some(Skill::Debuff), - Item::Decay => Some(Skill::Decay), - Item::Haste => Some(Skill::Haste), + Item::CurseII => Some(Skill::CurseII), + Item::CurseIII => Some(Skill::CurseIII), + Item::Debuff => Some(Skill::Debuff), + Item::DecayI => Some(Skill::DecayI), + Item::DecayII => Some(Skill::DecayII), + Item::DecayIII => Some(Skill::DecayIII), + Item::Haste => Some(Skill::Haste), Item::HealI => Some(Skill::HealI), - Item::HealII => Some(Skill::HealII), - Item::HealIII => Some(Skill::HealIII), + Item::HealII => Some(Skill::HealII), + Item::HealIII => Some(Skill::HealIII), Item::HexI => Some(Skill::HexI), - Item::HexII => Some(Skill::HexII), - Item::HexIII => Some(Skill::HexIII), - Item::Hostility => Some(Skill::Hostility), - Item::Impurity => Some(Skill::Impurity), - Item::InvertI => Some(Skill::InvertI), - Item::InvertII => Some(Skill::InvertII), - Item::InvertIII => Some(Skill::InvertIII), - Item::Parry => Some(Skill::Parry), - Item::PurgeI => Some(Skill::PurgeI), - Item::PurgeII => Some(Skill::PurgeII), - Item::PurgeIII => Some(Skill::PurgeIII), + Item::HexII => Some(Skill::HexII), + Item::HexIII => Some(Skill::HexIII), + Item::Hostility => Some(Skill::Hostility), + Item::Impurity => Some(Skill::Impurity), + Item::InvertI => Some(Skill::InvertI), + Item::InvertII => Some(Skill::InvertII), + Item::InvertIII => Some(Skill::InvertIII), + Item::Parry => Some(Skill::Parry), + Item::PurgeI => Some(Skill::PurgeI), + Item::PurgeII => Some(Skill::PurgeII), + Item::PurgeIII => Some(Skill::PurgeIII), Item::PurifyI => Some(Skill::PurifyI), - Item::PurifyII => Some(Skill::PurifyII), - Item::PurifyIII => Some(Skill::PurifyIII), - Item::RechargeI => Some(Skill::RechargeI), - Item::RechargeII => Some(Skill::RechargeII), - Item::RechargeIII => Some(Skill::RechargeIII), - Item::ReflectI => Some(Skill::ReflectI), - Item::ReflectII => Some(Skill::ReflectII), - Item::ReflectIII => Some(Skill::ReflectIII), - Item::RuinI => Some(Skill::RuinI), - Item::RuinII => Some(Skill::RuinII), - Item::RuinIII => Some(Skill::RuinIII), - Item::ScatterI => Some(Skill::ScatterI), - Item::ScatterII => Some(Skill::ScatterII), - Item::ScatterIII => Some(Skill::ScatterIII), - Item::SilenceI => Some(Skill::SilenceI), - Item::SilenceII => Some(Skill::SilenceII), - Item::SilenceIII => Some(Skill::SilenceIII), + Item::PurifyII => Some(Skill::PurifyII), + Item::PurifyIII => Some(Skill::PurifyIII), + Item::RechargeI => Some(Skill::RechargeI), + Item::RechargeII => Some(Skill::RechargeII), + Item::RechargeIII => Some(Skill::RechargeIII), + Item::ReflectI => Some(Skill::ReflectI), + Item::ReflectII => Some(Skill::ReflectII), + Item::ReflectIII => Some(Skill::ReflectIII), + Item::RuinI => Some(Skill::RuinI), + Item::RuinII => Some(Skill::RuinII), + Item::RuinIII => Some(Skill::RuinIII), + Item::ScatterI => Some(Skill::ScatterI), + Item::ScatterII => Some(Skill::ScatterII), + Item::ScatterIII => Some(Skill::ScatterIII), + Item::SilenceI => Some(Skill::SilenceI), + Item::SilenceII => Some(Skill::SilenceII), + Item::SilenceIII => Some(Skill::SilenceIII), Item::SlayI => Some(Skill::SlayI), - Item::SlayII => Some(Skill::SlayII), - Item::SlayIII => Some(Skill::SlayIII), + Item::SlayII => Some(Skill::SlayII), + Item::SlayIII => Some(Skill::SlayIII), Item::SleepI => Some(Skill::SleepI), - Item::SleepII => Some(Skill::SleepII), - Item::SleepIII => Some(Skill::SleepIII), - Item::Siphon => Some(Skill::Siphon), + Item::SleepII => Some(Skill::SleepII), + Item::SleepIII => Some(Skill::SleepIII), + Item::Siphon => Some(Skill::Siphon), Item::SnareI => Some(Skill::SnareI), - Item::SnareII => Some(Skill::SnareII), - Item::SnareIII => Some(Skill::SnareIII), - Item::Strangle => Some(Skill::Strangle), - Item::Stun => Some(Skill::Stun), - Item::StrikeI => Some(Skill::StrikeI), - Item::StrikeII => Some(Skill::StrikeII), - Item::StrikeIII => Some(Skill::StrikeIII), - Item::ClutchI => Some(Skill::ClutchI), - Item::ClutchII => Some(Skill::ClutchII), - Item::ClutchIII => Some(Skill::ClutchIII), + Item::SnareII => Some(Skill::SnareII), + Item::SnareIII => Some(Skill::SnareIII), + Item::Strangle => Some(Skill::Strangle), + Item::Stun => Some(Skill::Stun), + Item::StrikeI => Some(Skill::StrikeI), + Item::StrikeII => Some(Skill::StrikeII), + Item::StrikeIII => Some(Skill::StrikeIII), + Item::ClutchI => Some(Skill::ClutchI), + Item::ClutchII => Some(Skill::ClutchII), + Item::ClutchIII => Some(Skill::ClutchIII), Item::TauntI => Some(Skill::TauntI), - Item::TauntII => Some(Skill::TauntII), - Item::TauntIII => Some(Skill::TauntIII), + Item::TauntII => Some(Skill::TauntII), + Item::TauntIII => Some(Skill::TauntIII), Item::ThrowI => Some(Skill::ThrowI), - Item::ThrowII => Some(Skill::ThrowII), - Item::ThrowIII => Some(Skill::ThrowIII), - Item::Corrupt => Some(Skill::Corrupt), - Item::Triage => Some(Skill::Triage), + Item::ThrowII => Some(Skill::ThrowII), + Item::ThrowIII => Some(Skill::ThrowIII), + Item::Corrupt => Some(Skill::Corrupt), + Item::TriageI => Some(Skill::TriageI), + Item::TriageII => Some(Skill::TriageII), + Item::TriageIII => Some(Skill::TriageIII), _ => None, } } @@ -438,7 +446,9 @@ impl Item { self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100, self.into_skill().unwrap().effect().first().unwrap().get_duration()), - Item::Decay => format!( + 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(), @@ -582,7 +592,9 @@ impl Item { self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100, self.into_skill().unwrap().effect().last().unwrap().get_duration()), - Item::Triage => format!( + Item::TriageI | + Item::TriageII | + Item::TriageIII => format!( "Heals target for {:?}% green power each turn. Lasts {:?}T", self.into_skill().unwrap().multiplier(), self.into_skill().unwrap().effect().first().unwrap().get_duration()), @@ -596,82 +608,86 @@ 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::Triage => vec![Item::Buff, Item::Green, Item::Green], + 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::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::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::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::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::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::Decay => vec![Item::Debuff, Item::Green, Item::Blue], + 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::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::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::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::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::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::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::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::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::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::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::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::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::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::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::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], @@ -703,89 +719,91 @@ impl From for Item { fn from(skill: Skill) -> Item { match skill { Skill::AmplifyI => Item::AmplifyI, - Skill::AmplifyII => Item::AmplifyII, - Skill::AmplifyIII => Item::AmplifyIII, + Skill::AmplifyII => Item::AmplifyII, + Skill::AmplifyIII => Item::AmplifyIII, Skill::Attack => Item::Attack, Skill::Banish => Item::Banish, Skill::BlastI => Item::BlastI, - Skill::BlastII => Item::BlastII, - Skill::BlastIII => Item::BlastIII, + Skill::BlastII => Item::BlastII, + Skill::BlastIII => Item::BlastIII, Skill::Block => Item::Block, Skill::Buff => Item::Buff, Skill::ChaosI => Item::ChaosI, - Skill::ChaosII => Item::ChaosII, - Skill::ChaosIII => Item::ChaosIII, + Skill::ChaosII => Item::ChaosII, + Skill::ChaosIII => Item::ChaosIII, Skill::ClutchI => Item::ClutchI, - Skill::ClutchII => Item::ClutchII, - Skill::ClutchIII => Item::ClutchIII, + Skill::ClutchII => Item::ClutchII, + Skill::ClutchIII => Item::ClutchIII, Skill::CurseI => Item::CurseI, - Skill::CurseII => Item::CurseII, - Skill::CurseIII => Item::CurseIII, - Skill::Decay => Item::Decay, + Skill::CurseII => Item::CurseII, + Skill::CurseIII => Item::CurseIII, + Skill::DecayI => Item::DecayI, + Skill::DecayII => Item::DecayII, + Skill::DecayIII => Item::DecayIII, Skill::Debuff => Item::Debuff, Skill::Haste => Item::Haste, Skill::Hostility => Item::Hostility, Skill::HealI => Item::HealI, - Skill::HealII => Item::HealII, - Skill::HealIII => Item::HealIII, + Skill::HealII => Item::HealII, + Skill::HealIII => Item::HealIII, Skill::HexI => Item::HexI, - Skill::HexII => Item::HexII, - Skill::HexIII => Item::HexIII, + Skill::HexII => Item::HexII, + Skill::HexIII => Item::HexIII, Skill::Impurity => Item::Impurity, Skill::InvertI => Item::InvertI, - Skill::InvertII => Item::InvertII, - Skill::InvertIII => Item::InvertIII, + Skill::InvertII => Item::InvertII, + Skill::InvertIII => Item::InvertIII, Skill::Parry => Item::Parry, Skill::PurgeI => Item::PurgeI, - Skill::PurgeII => Item::PurgeII, - Skill::PurgeIII => Item::PurgeIII, + Skill::PurgeII => Item::PurgeII, + Skill::PurgeIII => Item::PurgeIII, Skill::PurifyI => Item::PurifyI, - Skill::PurifyII => Item::PurifyII, - Skill::PurifyIII => Item::PurifyIII, + Skill::PurifyII => Item::PurifyII, + Skill::PurifyIII => Item::PurifyIII, Skill::RechargeI => Item::RechargeI, - Skill::RechargeII => Item::RechargeII, - Skill::RechargeIII => Item::RechargeIII, + Skill::RechargeII => Item::RechargeII, + Skill::RechargeIII => Item::RechargeIII, Skill::ReflectI => Item::ReflectI, - Skill::ReflectII => Item::ReflectII, - Skill::ReflectIII => Item::ReflectIII, + Skill::ReflectII => Item::ReflectII, + Skill::ReflectIII => Item::ReflectIII, Skill::RuinI => Item::RuinI, - Skill::RuinII => Item::RuinII, - Skill::RuinIII => Item::RuinIII, + Skill::RuinII => Item::RuinII, + Skill::RuinIII => Item::RuinIII, Skill::ScatterI => Item::ScatterI, - Skill::ScatterII => Item::ScatterII, - Skill::ScatterIII => Item::ScatterIII, + Skill::ScatterII => Item::ScatterII, + Skill::ScatterIII => Item::ScatterIII, Skill::SilenceI => Item::SilenceI, - Skill::SilenceII => Item::SilenceII, - Skill::SilenceIII => Item::SilenceIII, + Skill::SilenceII => Item::SilenceII, + Skill::SilenceIII => Item::SilenceIII, Skill::Siphon => Item::Siphon, Skill::SlayI => Item::SlayI, - Skill::SlayII => Item::SlayII, - Skill::SlayIII => Item::SlayIII, + Skill::SlayII => Item::SlayII, + Skill::SlayIII => Item::SlayIII, Skill::SleepI => Item::SleepI, - Skill::SleepII => Item::SleepII, - Skill::SleepIII => Item::SleepIII, + Skill::SleepII => Item::SleepII, + Skill::SleepIII => Item::SleepIII, Skill::SnareI => Item::SnareI, - Skill::SnareII => Item::SnareII, - Skill::SnareIII => Item::SnareIII, + Skill::SnareII => Item::SnareII, + Skill::SnareIII => Item::SnareIII, Skill::Strangle => Item::Strangle, Skill::StrikeI => Item::StrikeI, - Skill::StrikeII => Item::StrikeII, - Skill::StrikeIII => Item::StrikeIII, + Skill::StrikeII => Item::StrikeII, + Skill::StrikeIII => Item::StrikeIII, Skill::Stun => Item::Stun, Skill::TauntI => Item::TauntI, - Skill::TauntII => Item::TauntII, - Skill::TauntIII => Item::TauntIII, + Skill::TauntII => Item::TauntII, + Skill::TauntIII => Item::TauntIII, Skill::ThrowI => Item::ThrowI, - Skill::ThrowII => Item::ThrowII, - Skill::ThrowIII => Item::ThrowIII, - Skill::Triage => Item::Triage, + Skill::ThrowII => Item::ThrowII, + Skill::ThrowIII => Item::ThrowIII, + Skill::TriageI => Item::TriageI, + Skill::TriageII => Item::TriageII, + Skill::TriageIII => Item::TriageIII, Skill::Corrupt => Item::Corrupt, Skill::CorruptionTick => Item::Corrupt, - Skill::DecayTick => Item::Decay, Skill::SiphonTick => Item::Siphon, Skill::StrangleTick => Item::Strangle, - Skill::TriageTick => Item::Triage, Skill::TestTouch => Item::TestTouch, Skill::TestStun => Item::TestStun, @@ -838,70 +856,76 @@ pub struct Combo { pub fn get_combos() -> Vec { let mut combinations = vec![ Combo { components: Item::TauntI.combo(), item: Item::TauntI }, - Combo { components: Item::TauntII.combo(), item: Item::TauntII }, - Combo { components: Item::TauntIII.combo(), item: Item::TauntIII }, - Combo { components: Item::Triage.combo(), item: Item::Triage }, + Combo { components: Item::TauntII.combo(), item: Item::TauntII }, + Combo { components: Item::TauntIII.combo(), item: Item::TauntIII }, + + Combo { components: Item::TriageI.combo(), item: Item::TriageI }, + Combo { components: Item::TriageII.combo(), item: Item::TriageII }, + Combo { components: Item::TriageIII.combo(), item: Item::TriageIII }, + Combo { components: Item::ScatterI.combo(), item: Item::ScatterI }, - Combo { components: Item::ScatterII.combo(), item: Item::ScatterII }, - Combo { components: Item::ScatterIII.combo(), item: Item::ScatterIII }, + Combo { components: Item::ScatterII.combo(), item: Item::ScatterII }, + Combo { components: Item::ScatterIII.combo(), item: Item::ScatterIII }, Combo { components: Item::Haste.combo(), item: Item::Haste }, Combo { components: Item::Impurity.combo(), item: Item::Impurity }, Combo { components: Item::AmplifyI.combo(), item: Item::AmplifyI }, - Combo { components: Item::AmplifyII.combo(), item: Item::AmplifyII }, - Combo { components: Item::AmplifyIII.combo(), item: Item::AmplifyIII }, - - Combo { components: Item::SnareI.combo(), item: Item::SnareI }, - Combo { components: Item::SnareII.combo(), item: Item::SnareII }, - Combo { components: Item::SnareIII.combo(), item: Item::SnareIII }, - Combo { components: Item::PurgeI.combo(), item: Item::PurgeI }, // Needs flavour - Combo { components: Item::PurgeII.combo(), item: Item::PurgeII }, - Combo { components: Item::PurgeIII.combo(), item: Item::PurgeIII }, + Combo { components: Item::AmplifyII.combo(), item: Item::AmplifyII }, + Combo { components: Item::AmplifyIII.combo(), item: Item::AmplifyIII }, + + Combo { components: Item::SnareI.combo(), item: Item::SnareI }, + Combo { components: Item::SnareII.combo(), item: Item::SnareII }, + Combo { components: Item::SnareIII.combo(), item: Item::SnareIII }, + Combo { components: Item::PurgeI.combo(), item: Item::PurgeI }, // Needs flavour + Combo { components: Item::PurgeII.combo(), item: Item::PurgeII }, + Combo { components: Item::PurgeIII.combo(), item: Item::PurgeIII }, + + Combo { components: Item::SilenceI.combo(), item: Item::SilenceI }, + Combo { components: Item::SilenceII.combo(), item: Item::SilenceII }, + Combo { components: Item::SilenceIII.combo(), item: Item::SilenceIII }, - Combo { components: Item::SilenceI.combo(), item: Item::SilenceI }, - Combo { components: Item::SilenceII.combo(), item: Item::SilenceII }, - Combo { components: Item::SilenceIII.combo(), item: Item::SilenceIII }, - Combo { components: Item::CurseI.combo(), item: Item::CurseI }, - Combo { components: Item::CurseII.combo(), item: Item::CurseII }, - Combo { components: Item::CurseIII.combo(), item: Item::CurseIII }, - Combo { components: Item::Decay.combo(), item: Item::Decay }, + Combo { components: Item::CurseII.combo(), item: Item::CurseII }, + Combo { components: Item::CurseIII.combo(), item: Item::CurseIII }, + Combo { components: Item::DecayI.combo(), item: Item::DecayI }, + Combo { components: Item::DecayII.combo(), item: Item::DecayII }, + Combo { components: Item::DecayIII.combo(), item: Item::DecayIII }, Combo { components: Item::InvertI.combo(), item: Item::InvertI }, - Combo { components: Item::InvertII.combo(), item: Item::InvertII }, - Combo { components: Item::InvertIII.combo(), item: Item::InvertIII }, + 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::PurifyI.combo(), item: Item::PurifyI }, - Combo { components: Item::PurifyII.combo(), item: Item::PurifyII }, - Combo { components: Item::PurifyIII.combo(), item: Item::PurifyIII }, - Combo { components: Item::Corrupt.combo(), item: Item::Corrupt }, - Combo { components: Item::ClutchI.combo(), item: Item::ClutchI }, - Combo { components: Item::ClutchII.combo(), item: Item::ClutchII }, - Combo { components: Item::ClutchIII.combo(), item: Item::ClutchIII }, - Combo { components: Item::ReflectI.combo(), item: Item::ReflectI }, - Combo { components: Item::ReflectII.combo(), item: Item::ReflectII }, - Combo { components: Item::ReflectIII.combo(), item: Item::ReflectIII }, + Combo { components: Item::Parry.combo(), item: Item::Parry }, // Add red recharge + Combo { components: Item::PurifyI.combo(), item: Item::PurifyI }, + Combo { components: Item::PurifyII.combo(), item: Item::PurifyII }, + Combo { components: Item::PurifyIII.combo(), item: Item::PurifyIII }, + Combo { components: Item::Corrupt.combo(), item: Item::Corrupt }, + Combo { components: Item::ClutchI.combo(), item: Item::ClutchI }, + Combo { components: Item::ClutchII.combo(), item: Item::ClutchII }, + Combo { components: Item::ClutchIII.combo(), item: Item::ClutchIII }, + Combo { components: Item::ReflectI.combo(), item: Item::ReflectI }, + Combo { components: Item::ReflectII.combo(), item: Item::ReflectII }, + Combo { components: Item::ReflectIII.combo(), item: Item::ReflectIII }, - Combo { components: Item::RechargeI.combo(), item: Item::RechargeI }, - Combo { components: Item::RechargeII.combo(), item: Item::RechargeII }, - Combo { components: Item::RechargeIII.combo(), item: Item::RechargeIII }, + Combo { components: Item::RechargeI.combo(), item: Item::RechargeI }, + 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::SleepI.combo(), item: Item::SleepI }, - 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 }, + Combo { components: Item::Strangle.combo(), item: Item::Strangle }, + 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::RuinI.combo(), item: Item::RuinI }, + Combo { components: Item::RuinII.combo(), item: Item::RuinII }, + Combo { components: Item::RuinIII.combo(), item: Item::RuinIII }, Combo { components: Item::ThrowI.combo(), item: Item::ThrowI }, - Combo { components: Item::ThrowII.combo(), item: Item::ThrowII }, - Combo { components: Item::ThrowIII.combo(), item: Item::ThrowIII }, + Combo { components: Item::ThrowII.combo(), item: Item::ThrowII }, + Combo { components: Item::ThrowIII.combo(), item: Item::ThrowIII }, 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::HexII.combo(), item: Item::HexII }, + Combo { components: Item::HexIII.combo(), item: Item::HexIII }, Combo { components: Item::Banish.combo(), item: Item::Banish }, Combo { components: Item::StrikeI.combo(), item: Item::StrikeI }, @@ -909,18 +933,18 @@ pub fn get_combos() -> Vec { Combo { components: Item::StrikeIII.combo(), item: Item::StrikeIII }, Combo { components: Item::HealI.combo(), item: Item::HealI }, - Combo { components: Item::HealII.combo(), item: Item::HealII }, - Combo { components: Item::HealIII.combo(), item: Item::HealIII }, + Combo { components: Item::HealII.combo(), item: Item::HealII }, + Combo { components: Item::HealIII.combo(), item: Item::HealIII }, Combo { components: Item::BlastI.combo(), item: Item::BlastI }, - Combo { components: Item::BlastII.combo(), item: Item::BlastII }, - Combo { components: Item::BlastIII.combo(), item: Item::BlastIII }, + Combo { components: Item::BlastII.combo(), item: Item::BlastII }, + Combo { components: Item::BlastIII.combo(), item: Item::BlastIII }, 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::SlayII.combo(), item: Item::SlayII }, + Combo { components: Item::SlayIII.combo(), item: Item::SlayIII }, Combo { components: Item::Siphon.combo(), item: Item::Siphon }, Combo { components: Item::ChaosI.combo(), item: Item::ChaosI }, - Combo { components: Item::ChaosII.combo(), item: Item::ChaosII }, - Combo { components: Item::ChaosIII.combo(), item: Item::ChaosIII }, + Combo { components: Item::ChaosII.combo(), item: Item::ChaosII }, + Combo { components: Item::ChaosIII.combo(), item: Item::ChaosIII }, Combo { components: Item::RedDamageI.combo(), item: Item::RedDamageI }, Combo { components: Item::GreenDamageI.combo(), item: Item::GreenDamageI }, diff --git a/server/src/skill.rs b/server/src/skill.rs index 43a280fc..c62bd88f 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -137,8 +137,12 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio Skill::CurseII | Skill::CurseIII => curse(source, target, resolutions, skill), - Skill::Decay => decay(source, target, resolutions, skill), // dot - Skill::DecayTick => decay_tick(source, target, resolutions, skill), // dot + Skill::DecayI | + Skill::DecayII | + Skill::DecayIII => decay(source, target, resolutions, skill), // dot + Skill::DecayTickI | + Skill::DecayTickII | + Skill::DecayTickIII => decay_tick(source, target, resolutions, skill), // dot Skill::Haste => haste(source, target, resolutions, skill), // speed slow @@ -216,9 +220,14 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio Skill::ThrowI | Skill::ThrowII | Skill::ThrowIII => throw(source, target, resolutions, skill), // no damage stun, adds vulnerable + + Skill::TriageI | + Skill::TriageII | + Skill::TriageIII => triage(source, target, resolutions, skill), // hot - Skill::Triage => triage(source, target, resolutions, skill), // hot - Skill::TriageTick => triage_tick(source, target, resolutions, skill), // hot + Skill::TriageTickI | + Skill::TriageTickII | + Skill::TriageTickIII => triage_tick(source, target, resolutions, skill), // hot // Base Skills Skill::Attack => attack(source, target, resolutions, skill), @@ -226,7 +235,7 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio Skill::Buff => buff(source, target, resolutions, skill), Skill::Debuff => debuff(source, target, resolutions, skill), // speed slow Skill::Stun => stun(source, target, resolutions, skill), - + //Triggered Skill::HasteStrike => panic!("should only trigger from haste"), Skill::ImpureBlast => panic!("should only trigger from impurity"), @@ -623,87 +632,126 @@ pub enum Skill { // Nightmare, // Sleep, AmplifyI, - AmplifyII, - AmplifyIII, + AmplifyII, + AmplifyIII, + Banish, + BlastI, - BlastII, - BlastIII, + BlastII, + BlastIII, + ChaosI, - ChaosII, - ChaosIII, + ChaosII, + ChaosIII, + ClutchI, - ClutchII, - ClutchIII, + ClutchII, + ClutchIII, + Corrupt, CorruptionTick, + CurseI, - CurseII, - CurseIII, - Decay, // dot - DecayTick, // dot + CurseII, + CurseIII, + + DecayI, // dot + DecayII, + DecayIII, + DecayTickI, // dot + DecayTickII, + DecayTickIII, + Haste, HasteStrike, + HealI, - HealII, - HealIII, + HealII, + HealIII, + HexI, - HexII, - HexIII, + HexII, + HexIII, + Hostility, ImpureBlast, Impurity, Injure, + InvertI, - InvertII, - InvertIII, + InvertII, + InvertIII, + Parry, // avoid all damage + PurgeI, - PurgeII, - PurgeIII, + PurgeII, + PurgeIII, + PurifyI, - PurifyII, - PurifyIII, + PurifyII, + PurifyIII, + RechargeI, - RechargeII, - RechargeIII, + RechargeII, + RechargeIII, + ReflectI, - ReflectII, - ReflectIII, + ReflectII, + ReflectIII, + Riposte, + RuinI, - RuinII, - RuinIII, + RuinII, + RuinIII, + ScatterI, - ScatterII, - ScatterIII, + ScatterII, + ScatterIII, + SilenceI, - SilenceII, - SilenceIII, + SilenceII, + SilenceIII, + Siphon, SiphonTick, + SlayI, - SlayII, - SlayIII, + SlayII, + SlayIII, + SleepI, - SleepII, - SleepIII, + SleepII, + SleepIII, + SnareI, - SnareII, - SnareIII, + SnareII, + SnareIII, + Strangle, StrangleTick, + StrikeI, - StrikeII, - StrikeIII, + StrikeII, + StrikeIII, + TauntI, - TauntII, - TauntIII, + TauntII, + TauntIII, + ThrowI, // no damage stun, adds vulnerable - ThrowII, - ThrowIII, - Triage, // hot - TriageTick, + ThrowII, + ThrowIII, + + TriageI, // hot + TriageII, + TriageIII, + + TriageTickI, + TriageTickII, + TriageTickIII, // used by tests, no cd, 100% multiplier TestAttack, @@ -722,61 +770,72 @@ impl Skill { Skill::Attack => 80, // Base Skill::BlastI => 110, // BB - Skill::BlastII => 130, // BB - Skill::BlastIII => 150, // BB + Skill::BlastII => 130, // BB + Skill::BlastIII => 150, // BB + Skill::ChaosI => 40, // BR - Skill::ChaosII => 50, // BR - Skill::ChaosIII => 60, // BR + Skill::ChaosII => 50, // BR + Skill::ChaosIII => 60, // BR + Skill::HealI => 130, //GG - Skill::HealII => 160, //GG - Skill::HealIII => 200, //GG + Skill::HealII => 160, //GG + Skill::HealIII => 200, //GG Skill::SiphonTick => 40, // GB + Skill::SlayI => 70, // RG - Skill::SlayII => 90, - Skill::SlayIII => 120, + Skill::SlayII => 90, + Skill::SlayIII => 120, + Skill::StrikeI => 90, //RR - Skill::StrikeII => 110, - Skill::StrikeIII => 140, + Skill::StrikeII => 110, + Skill::StrikeIII => 140, // Block Base Skill::CorruptionTick => 80, Skill::Parry => 110, - Skill::Riposte => 70, + Skill::Riposte => 70, + Skill::PurifyI => 45, //Green dmg (heal) - Skill::PurifyII => 70, - Skill::PurifyIII => 105, + Skill::PurifyII => 70, + Skill::PurifyIII => 105, + Skill::ReflectI => 45, //restore blue life (heal) - Skill::ReflectII => 70, - Skill::ReflectIII => 100, + Skill::ReflectII => 70, + Skill::ReflectIII => 100, + Skill::RechargeI => 85, //restore red and blue life (heal) - Skill::RechargeII => 130, - Skill::RechargeIII => 200, + Skill::RechargeII => 130, + Skill::RechargeIII => 200, // Stun Base Skill::SleepI => 240, //Green dmg (heal) - Skill::SleepII => 300, - Skill::SleepIII => 400, + Skill::SleepII => 300, + Skill::SleepIII => 400, Skill::StrangleTick => 65, // Debuff Base - Skill::DecayTick => 25, + Skill::DecayTickI => 25, + Skill::DecayTickII => 45, + Skill::DecayTickIII => 70, Skill::SilenceI => 55, // Deals more per blue skill on target - Skill::SilenceII => 80, // Deals more per blue skill on target - Skill::SilenceIII => 110, // Deals more per blue skill on target + Skill::SilenceII => 80, + Skill::SilenceIII => 110, Skill::SnareI => 40, // Deals more per red skill on target - Skill::SnareII => 65, - Skill::SnareIII => 100, + Skill::SnareII => 65, + Skill::SnareIII => 100, // Buff base Skill::ImpureBlast => 25, Skill::HasteStrike => 30, Skill::ScatterI => 140, - Skill::ScatterII => 200, - Skill::ScatterIII => 300, + Skill::ScatterII => 200, + Skill::ScatterIII => 300, Skill::TauntI => 80, - Skill::TauntII => 110, - Skill::TauntIII => 150, - Skill::TriageTick => 75, + Skill::TauntII => 110, + Skill::TauntIII => 150, + Skill::TriageTickI => 75, + Skill::TriageTickII => 110, + Skill::TriageTickIII => 140, _ => 100, } @@ -785,73 +844,110 @@ impl Skill { pub fn effect(&self) -> Vec { match self { // Modifiers - Skill::AmplifyI => vec![CrypEffect {effect: Effect::Amplify, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None}], - Skill::AmplifyII => vec![CrypEffect {effect: Effect::Amplify, duration: 3, meta: Some(EffectMeta::Multiplier(175)), tick: None}], - 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::Block => vec![CrypEffect {effect: Effect::Block, duration: 1, meta: Some(EffectMeta::Multiplier(50)), tick: None}], - Skill::Buff => vec![CrypEffect {effect: Effect::Buff, duration: 2, meta: Some(EffectMeta::Multiplier(125)), tick: None }], - - Skill::Corrupt => vec![CrypEffect {effect: Effect::Corrupt, duration: 2, meta: None, tick: None}, + Skill::AmplifyI => vec![CrypEffect {effect: Effect::Amplify, duration: 2, + meta: Some(EffectMeta::Multiplier(150)), tick: None}], + Skill::AmplifyII => vec![CrypEffect {effect: Effect::Amplify, duration: 3, + meta: Some(EffectMeta::Multiplier(175)), tick: None}], + 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::Block => vec![CrypEffect {effect: Effect::Block, duration: 1, + meta: Some(EffectMeta::Multiplier(50)), tick: None}], + Skill::Buff => vec![CrypEffect {effect: Effect::Buff, duration: 2, + meta: Some(EffectMeta::Multiplier(125)), tick: None }], + + Skill::Corrupt => vec![CrypEffect {effect: Effect::Corrupt, duration: 2, meta: None, tick: None}, CrypEffect {effect: Effect::Corruption, duration: 3, meta: None, tick: None}], - Skill::ClutchI => vec![CrypEffect {effect: Effect::Clutch, duration: 1, meta: None, tick: None }], - Skill::ClutchII => vec![CrypEffect {effect: Effect::Clutch, duration: 2, meta: None, tick: None }], - Skill::ClutchIII => vec![CrypEffect {effect: Effect::Clutch, duration: 3, meta: None, tick: None }], - Skill::CurseI => vec![CrypEffect {effect: Effect::Curse, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None}], - Skill::CurseII => vec![CrypEffect {effect: Effect::Curse, duration: 2, meta: Some(EffectMeta::Multiplier(200)), tick: None}], - Skill::CurseIII => vec![CrypEffect {effect: Effect::Curse, duration: 3, meta: Some(EffectMeta::Multiplier(250)), tick: None}], - Skill::Debuff => vec![CrypEffect {effect: Effect::Slow, duration: 3, meta: Some(EffectMeta::Multiplier(50)), tick: None }], - - Skill::Decay => vec![CrypEffect {effect: Effect::Wither, duration: 3, meta: Some(EffectMeta::Multiplier(50)), tick: None }, - CrypEffect {effect: Effect::Decay, duration: 3, meta: None, tick: None }], - Skill::Haste => vec![CrypEffect {effect: Effect::Haste, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None }], - Skill::HexI => vec![CrypEffect {effect: Effect::Hex, duration: 2, meta: None, tick: None}], - Skill::HexII => vec![CrypEffect {effect: Effect::Hex, duration: 3, meta: None, tick: None}], - Skill::HexIII => vec![CrypEffect {effect: Effect::Hex, duration: 4, meta: None, tick: None}], - Skill::Hostility => vec![CrypEffect {effect: Effect::Hostility, duration: 2, meta: None, tick: None}, - CrypEffect {effect: Effect::Hatred, duration: 5, meta: None, tick: None}], - Skill::Impurity => vec![CrypEffect {effect: Effect::Impurity, duration: 3, meta: Some(EffectMeta::Multiplier(150)), tick: None }], - Skill::InvertI => vec![CrypEffect {effect: Effect::Invert, duration: 2, meta: None, tick: None}], - 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::ClutchI => vec![CrypEffect {effect: Effect::Clutch, duration: 1, meta: None, tick: None }], + Skill::ClutchII => vec![CrypEffect {effect: Effect::Clutch, duration: 2, meta: None, tick: None }], + Skill::ClutchIII => vec![CrypEffect {effect: Effect::Clutch, duration: 3, meta: None, tick: None }], - Skill::Parry => vec![CrypEffect {effect: Effect::Parry, duration: 2, meta: None, 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 }], - - Skill::ThrowI => vec![CrypEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}, - CrypEffect {effect: Effect::Vulnerable, duration: 3, meta: Some(EffectMeta::Multiplier(150)), tick: None}], - Skill::ThrowII => vec![CrypEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}, - CrypEffect {effect: Effect::Vulnerable, duration: 4, meta: Some(EffectMeta::Multiplier(200)), tick: None}], - Skill::ThrowIII => vec![CrypEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}, - CrypEffect {effect: Effect::Vulnerable, duration: 4, meta: Some(EffectMeta::Multiplier(250)), tick: None}], + Skill::CurseI => vec![CrypEffect {effect: Effect::Curse, duration: 2, + meta: Some(EffectMeta::Multiplier(150)), tick: None}], + Skill::CurseII => vec![CrypEffect {effect: Effect::Curse, duration: 2, + meta: Some(EffectMeta::Multiplier(200)), tick: None}], + Skill::CurseIII => vec![CrypEffect {effect: Effect::Curse, duration: 3, + meta: Some(EffectMeta::Multiplier(250)), tick: None}], - Skill::RuinI => vec![CrypEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}], - Skill::RuinII => vec![CrypEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}], - Skill::RuinIII => vec![CrypEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}], - Skill::ScatterI => vec![CrypEffect {effect: Effect::Scatter, duration: 2, meta: None, tick: None}], - Skill::ScatterII => vec![CrypEffect {effect: Effect::Scatter, duration: 3, meta: None, tick: None}], - Skill::ScatterIII => vec![CrypEffect {effect: Effect::Scatter, duration: 4, meta: None, tick: None}], - Skill::SilenceI => vec![CrypEffect {effect: Effect::Silence, duration: 2, meta: None, tick: None}], - Skill::SilenceII => vec![CrypEffect {effect: Effect::Silence, duration: 2, meta: None, tick: None}], - Skill::SilenceIII => vec![CrypEffect {effect: Effect::Silence, duration: 3, meta: None, tick: None}], - Skill::Siphon => vec![CrypEffect {effect: Effect::Siphon, duration: 2, meta: None, 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}], - Skill::SleepIII => vec![CrypEffect {effect: Effect::Stun, duration: 4, meta: None, tick: None}], + Skill::Debuff => vec![CrypEffect {effect: Effect::Slow, duration: 3, + meta: Some(EffectMeta::Multiplier(50)), tick: None }], - Skill::SnareI => vec![CrypEffect {effect: Effect::Snare, duration: 2, meta: None, tick: None}], - 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::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}], + 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}], + 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}], + + Skill::Haste => vec![CrypEffect {effect: Effect::Haste, duration: 2, + meta: Some(EffectMeta::Multiplier(150)), tick: None }], + Skill::HexI => vec![CrypEffect {effect: Effect::Hex, duration: 2, meta: None, tick: None}], + Skill::HexII => vec![CrypEffect {effect: Effect::Hex, duration: 3, meta: None, tick: None}], + Skill::HexIII => vec![CrypEffect {effect: Effect::Hex, duration: 4, meta: None, tick: None}], - Skill::Strangle => vec![CrypEffect {effect: Effect::Strangle, duration: 2, meta: None, 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}], - Skill::TauntII => vec![CrypEffect {effect: Effect::Taunt, duration: 3, meta: None, tick: None}], - Skill::TauntIII => vec![CrypEffect {effect: Effect::Taunt, duration: 4, meta: None, tick: None}], - Skill::Triage => vec![CrypEffect {effect: Effect::Triage, duration: 2, meta: None, tick: None}], + Skill::Hostility => vec![CrypEffect {effect: Effect::Hostility, duration: 2, meta: None, tick: None}, + CrypEffect {effect: Effect::Hatred, duration: 5, meta: None, tick: None}], + + Skill::Impurity => vec![CrypEffect {effect: Effect::Impurity, duration: 3, + meta: Some(EffectMeta::Multiplier(150)), tick: None }], + + Skill::InvertI => vec![CrypEffect {effect: Effect::Invert, duration: 2, meta: None, tick: None}], + 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::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 }], + + Skill::ThrowI => vec![CrypEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}, + CrypEffect {effect: Effect::Vulnerable, duration: 3, meta: Some(EffectMeta::Multiplier(150)), tick: None}], + Skill::ThrowII => vec![CrypEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}, + CrypEffect {effect: Effect::Vulnerable, duration: 4, meta: Some(EffectMeta::Multiplier(200)), tick: None}], + Skill::ThrowIII => vec![CrypEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}, + CrypEffect {effect: Effect::Vulnerable, duration: 4, meta: Some(EffectMeta::Multiplier(250)), tick: None}], + + Skill::RuinI => vec![CrypEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}], + Skill::RuinII => vec![CrypEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}], + Skill::RuinIII => vec![CrypEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}], + + Skill::ScatterI => vec![CrypEffect {effect: Effect::Scatter, duration: 2, meta: None, tick: None}], + Skill::ScatterII => vec![CrypEffect {effect: Effect::Scatter, duration: 3, meta: None, tick: None}], + Skill::ScatterIII => vec![CrypEffect {effect: Effect::Scatter, duration: 4, meta: None, tick: None}], + + Skill::SilenceI => vec![CrypEffect {effect: Effect::Silence, duration: 2, meta: None, tick: None}], + 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::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}], + Skill::SleepIII => vec![CrypEffect {effect: Effect::Stun, duration: 4, meta: None, tick: None}], + + Skill::SnareI => vec![CrypEffect {effect: Effect::Snare, duration: 2, meta: None, tick: None}], + 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::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}], + Skill::TauntII => vec![CrypEffect {effect: Effect::Taunt, duration: 3, meta: None, tick: None}], + 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}], + Skill::TriageII => vec![CrypEffect {effect: Effect::Triage, duration: 3, + meta: Some(EffectMeta::SkillTick(Skill::TriageTickII)), tick: None}], + Skill::TriageIII => vec![CrypEffect {effect: Effect::Triage, duration: 4, + meta: Some(EffectMeta::SkillTick(Skill::TriageTickIII)), tick: None}], //Unused Skill::Injure => vec![CrypEffect {effect: Effect::Injured, duration: 2, meta: None, tick: None }], @@ -867,95 +963,131 @@ impl Skill { Skill::Attack => None, Skill::Debuff => Some(1), Skill::Buff => None, + Skill::StrikeI => None, Skill::StrikeII => None, Skill::StrikeIII => None, Skill::Block => None, // reduce damage Skill::Parry => Some(2), // avoid all damage - Skill::Riposte => None, // used on parry + Skill::SnareI => Some(2), - Skill::SnareII => Some(2), - Skill::SnareIII => Some(2), + Skill::SnareII => Some(2), + Skill::SnareIII => Some(2), Skill::Stun => Some(2), + Skill::HealI => None, - Skill::HealII => None, - Skill::HealIII => None, - Skill::Triage => None, // hot - Skill::TriageTick => None, + Skill::HealII => None, + Skill::HealIII => None, + + Skill::TriageI => None, // hot + Skill::TriageII => None, // hot + Skill::TriageIII => None, // hot + Skill::ThrowI => Some(1), // no damage stun, adds vulnerable - Skill::ThrowII => Some(1), - Skill::ThrowIII => Some(1), + Skill::ThrowII => Some(1), + Skill::ThrowIII => Some(1), + Skill::BlastI => None, - Skill::BlastII => None, - Skill::BlastIII => None, + Skill::BlastII => None, + Skill::BlastIII => None, + Skill::ChaosI => None, - Skill::ChaosII => None, - Skill::ChaosIII => None, + Skill::ChaosII => None, + Skill::ChaosIII => None, + Skill::AmplifyI => Some(1), - Skill::AmplifyII => Some(1), - Skill::AmplifyIII => Some(1), + Skill::AmplifyII => Some(1), + Skill::AmplifyIII => Some(1), Skill::Impurity => Some(3), - Skill::ImpureBlast => None, + Skill::InvertI => Some(2), - Skill::InvertII => Some(2), - Skill::InvertIII => Some(2), - Skill::Decay => Some(1), // dot - Skill::DecayTick => None, + Skill::InvertII => Some(2), + Skill::InvertIII => Some(2), + Skill::DecayI => Some(1), // dot + Skill::DecayII => Some(1), + Skill::DecayIII => Some(1), Skill::Siphon => None, - Skill::SiphonTick => None, + Skill::CurseI => Some(1), - Skill::CurseII => Some(1), - Skill::CurseIII => Some(1), + Skill::CurseII => Some(1), + Skill::CurseIII => Some(1), + Skill::ScatterI => Some(2), - Skill::ScatterII => Some(2), - Skill::ScatterIII => Some(2), + Skill::ScatterII => Some(2), + Skill::ScatterIII => Some(2), + Skill::SilenceI => Some(3), - Skill::SilenceII => Some(2), - Skill::SilenceIII => Some(2), + Skill::SilenceII => Some(2), + Skill::SilenceIII => Some(2), + Skill::PurifyI => None, - Skill::PurifyII => None, - Skill::PurifyIII => None, + Skill::PurifyII => None, + Skill::PurifyIII => None, + Skill::PurgeI => None, - Skill::PurgeII => None, - Skill::PurgeIII => None, + Skill::PurgeII => None, + Skill::PurgeIII => None, + Skill::Banish => Some(1), + Skill::HexI => Some(1), Skill::HexII => Some(2), Skill::HexIII => Some(2), Skill::Haste => Some(2), - Skill::HasteStrike => None, // Used in haste Skill::ReflectI => Some(2), - Skill::ReflectII => Some(2), - Skill::ReflectIII => Some(2), + Skill::ReflectII => Some(2), + Skill::ReflectIII => Some(2), + Skill::RechargeI => Some(2), - Skill::RechargeII => Some(2), - Skill::RechargeIII => Some(2), + Skill::RechargeII => Some(2), + Skill::RechargeIII => Some(2), + Skill::RuinI => Some(3), - Skill::RuinII => Some(2), - Skill::RuinIII => Some(2), + Skill::RuinII => Some(2), + Skill::RuinIII => Some(2), + Skill::SlayI => None, - Skill::SlayII => None, - Skill::SlayIII => None, + Skill::SlayII => None, + Skill::SlayIII => None, + Skill::SleepI => Some(3), - Skill::SleepII => Some(3), - Skill::SleepIII => Some(3), + Skill::SleepII => Some(3), + Skill::SleepIII => Some(3), Skill::Strangle => Some(2), - Skill::StrangleTick => None, + Skill::ClutchI => Some(1), - Skill::ClutchII => Some(2), - Skill::ClutchIII => Some(3), + Skill::ClutchII => Some(2), + Skill::ClutchIII => Some(3), + Skill::TauntI => Some(2), - Skill::TauntII => Some(2), - Skill::TauntIII => Some(2), + Skill::TauntII => Some(2), + Skill::TauntIII => Some(2), Skill::Injure => Some(2), Skill::Corrupt => Some(1), - Skill::CorruptionTick => None, Skill::Hostility => Some(1), + //----------- + // Never cast directly + //--------- + // Trigger + Skill::ImpureBlast | + Skill::HasteStrike | + Skill::Riposte | // parry + // Ticks + Skill::CorruptionTick | + Skill::DecayTickI | + Skill::DecayTickII | + Skill::DecayTickIII | + Skill::SiphonTick | + Skill::StrangleTick | + Skill::TriageTickI | + Skill::TriageTickII | + Skill::TriageTickIII => None, + // Triggers // ----------------- // Test // ----------------- @@ -971,21 +1103,32 @@ impl Skill { pub fn ko_castable(&self) -> bool { match self { - Skill::TriageTick => true, - Skill::DecayTick => true, - Skill::SiphonTick => true, - Skill::CorruptionTick => true, + Skill::CorruptionTick | + Skill::DecayTickI | + Skill::DecayTickII | + Skill::DecayTickIII | + Skill::SiphonTick | + + Skill::TriageTickI | + Skill::TriageTickII | + Skill::TriageTickIII => true, _ => false, } } pub fn is_tick(&self) -> bool { match self { - Skill::CorruptionTick => true, - Skill::DecayTick => true, - Skill::SiphonTick => true, - Skill::StrangleTick => true, - Skill::TriageTick => true, + Skill::CorruptionTick | + Skill::DecayTickI | + Skill::DecayTickII | + Skill::DecayTickIII | + Skill::SiphonTick | + Skill::StrangleTick | + + Skill::TriageTickI | + Skill::TriageTickII | + Skill::TriageTickIII => true, + _ => false, } } @@ -1006,8 +1149,14 @@ impl Skill { Skill::StrikeIII => Skill::StrikeI.speed(), Skill::SiphonTick => Skill::Siphon.speed(), - Skill::DecayTick => Skill::Decay.speed(), - Skill::TriageTick => Skill::Triage.speed(), + Skill::DecayTickI | + Skill::DecayTickII | + Skill::DecayTickIII => Skill::DecayI.speed(), + + Skill::TriageTickI | + Skill::TriageTickII | + Skill::TriageTickIII => Skill::TriageI.speed(), + Skill::StrangleTick => Skill::Strangle.speed(), Skill::CorruptionTick => Skill::Corrupt.speed(), @@ -1027,11 +1176,11 @@ impl Skill { pub fn self_targeting(&self) -> bool { match self { Skill::Block | - Skill::Parry | - Skill::ClutchI | - Skill::ClutchII | - Skill::ClutchIII | Skill::Corrupt | + Skill::ClutchI | + Skill::ClutchII | + Skill::ClutchIII | + Skill::Parry | Skill::TestBlock | Skill::TestParry => true, @@ -1043,36 +1192,38 @@ impl Skill { let mut rng = thread_rng(); match self { - Skill::HealI | - Skill::HealII | - Skill::HealIII | - Skill::Triage | - Skill::PurifyI | - Skill::PurifyII | - Skill::PurifyIII | - Skill::Parry | - Skill::ClutchI | - Skill::ClutchII | - Skill::ClutchIII | - Skill::ScatterI | - Skill::ScatterII | - Skill::ScatterIII | - Skill::RechargeI | - Skill::RechargeII | - Skill::RechargeIII | - Skill::ReflectI | - Skill::ReflectII | - Skill::ReflectIII | - Skill::Haste | - Skill::InvertI | - Skill::InvertII | - Skill::InvertIII | Skill::AmplifyI | Skill::AmplifyII | Skill::AmplifyIII | - Skill::Hostility | + Skill::Block | + Skill::ClutchI | + Skill::ClutchII | + Skill::ClutchIII | Skill::Corrupt | - Skill::Block => true, + Skill::Haste | + Skill::HealI | + Skill::HealII | + Skill::HealIII | + Skill::Hostility | + Skill::InvertI | + Skill::InvertII | + Skill::InvertIII | + Skill::Parry | + Skill::PurifyI | + Skill::PurifyII | + Skill::PurifyIII | + Skill::RechargeI | + Skill::RechargeII | + Skill::RechargeIII | + Skill::ReflectI | + Skill::ReflectII | + Skill::ReflectIII | + Skill::ScatterI | + Skill::ScatterII | + Skill::ScatterIII | + Skill::TriageI | + Skill::TriageII | + Skill::TriageIII => true, Skill::Banish => rng.gen_bool(0.5), @@ -1297,17 +1448,20 @@ 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 { - skill.effect().into_iter().for_each(|e| { - let triage = e.clone().set_tick(Cast::new_tick(source, target, Skill::TriageTick)); - results.push(Resolution::new(source, target).event(target.add_effect(skill, triage))); - }); + let CrypEffect { effect, duration, meta, tick: _ } = skill.effect().first().unwrap().clone(); + let tick_skill = match meta { + Some(EffectMeta::SkillTick(s)) => s, + _ => panic!("no triage tick skill"), + }; + let triage = CrypEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill)); + results.push(Resolution::new(source, target).event(target.add_effect(skill, triage))); - return triage_tick(source, target, results, Skill::TriageTick); + return triage_tick(source, target, results, tick_skill); } fn triage_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { let amount = source.green_damage().pct(skill.multiplier()); - target.deal_green_damage(Skill::TriageTick, amount) + target.deal_green_damage(skill, amount) .into_iter() .for_each(|e| results.push(Resolution::new(source, target).event(e))); return results; @@ -1355,18 +1509,19 @@ fn debuff(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: } fn decay(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { - - skill.effect().into_iter().for_each(|e| { - let CrypEffect { effect, duration: _, meta: _, tick: _ } = e; - let apply_effect = match effect { - Effect::Wither => e.clone(), - Effect::Decay => e.clone().set_tick(Cast::new_tick(source, target, Skill::DecayTick)), - _ => panic!("wrong decay effects"), - }; - results.push(Resolution::new(source, target).event(target.add_effect(skill, apply_effect))); - }); - return decay_tick(source, target, results, Skill::DecayTick); + let wither = skill.effect().first().unwrap().clone(); + results.push(Resolution::new(source, target).event(target.add_effect(skill, wither))); + + let CrypEffect { effect, duration, meta, tick: _ } = skill.effect().last().unwrap().clone(); + let tick_skill = match meta { + Some(EffectMeta::SkillTick(s)) => s, + _ => panic!("no decay tick skill"), + }; + let decay = CrypEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill)); + results.push(Resolution::new(source, target).event(target.add_effect(skill, decay))); + + return decay_tick(source, target, results, tick_skill); } fn decay_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions { @@ -1610,7 +1765,7 @@ mod tests { let mut y = Cryp::new() .named(&"camel".to_string()); - decay(&mut x, &mut y, vec![], Skill::Decay); + decay(&mut x, &mut y, vec![], Skill::DecayI); assert!(y.effects.iter().any(|e| e.effect == Effect::Decay)); @@ -1809,7 +1964,7 @@ mod tests { y.deal_red_damage(Skill::Attack, 5); let prev_hp = y.green_life(); - triage(&mut x, &mut y, vec![], Skill::Triage); + triage(&mut x, &mut y, vec![], Skill::TriageI); assert!(y.effects.iter().any(|e| e.effect == Effect::Triage)); assert!(y.green_life() > prev_hp); @@ -1869,7 +2024,7 @@ mod tests { let mut x = Cryp::new() .named(&"muji".to_string()); - decay(&mut x.clone(), &mut x, vec![], Skill::Decay); + decay(&mut x.clone(), &mut x, vec![], Skill::DecayI); assert!(x.effects.iter().any(|e| e.effect == Effect::Decay)); purify(&mut x.clone(), &mut x, vec![], Skill::PurifyI);