From 4ac0146b3945d8cf93f182d67c55be9d2951b435 Mon Sep 17 00:00:00 2001 From: Mashy Date: Fri, 24 May 2019 15:06:29 +1000 Subject: [PATCH 01/10] wip --- server/src/cryp.rs | 2 +- server/src/game.rs | 4 +- server/src/item.rs | 255 ++++++++++++++++++++++++++++---------------- server/src/skill.rs | 192 +++++++++++++++++++++------------ server/src/vbox.rs | 6 +- 5 files changed, 293 insertions(+), 166 deletions(-) diff --git a/server/src/cryp.rs b/server/src/cryp.rs index b7efba0e..ad883414 100644 --- a/server/src/cryp.rs +++ b/server/src/cryp.rs @@ -870,7 +870,7 @@ mod tests { let mut cryp = Cryp::new() .named(&"redboi".to_string()); - cryp.learn_mut(Skill::Strike); + cryp.learn_mut(Skill::StrikeI); cryp.spec_add(Spec::GreenLifeI).unwrap(); cryp.spec_add(Spec::RedDamageI).unwrap(); cryp.spec_add(Spec::RedDamageI).unwrap(); diff --git a/server/src/game.rs b/server/src/game.rs index 5eaefbc5..f4ae1dc7 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -936,7 +936,7 @@ mod tests { .learn(Skill::TestBlock) .learn(Skill::TestParry) .learn(Skill::TestSiphon) - .learn(Skill::Amplify) + .learn(Skill::AmplifyI) .learn(Skill::Stun) .learn(Skill::Block); @@ -948,7 +948,7 @@ mod tests { .learn(Skill::TestBlock) .learn(Skill::TestParry) .learn(Skill::TestSiphon) - .learn(Skill::Amplify) + .learn(Skill::AmplifyI) .learn(Skill::Stun) .learn(Skill::Block); diff --git a/server/src/item.rs b/server/src/item.rs index f72f8dbd..5e5ffb81 100644 --- a/server/src/item.rs +++ b/server/src/item.rs @@ -46,17 +46,29 @@ pub enum Item { GBSpeedI, RBSpeedI, - Amplify, + AmplifyI, + AmplifyII, + AmplifyIII, Banish, - Blast, - Chaos, - Clutch, + BlastI, + BlastII, + BlastIII, + ChaosI, + ChaosII, + ChaosIII, + ClutchI, + ClutchII, + ClutchIII, Corrupt, - Curse, + CurseI, + CurseII, + CurseIII, Decay, Hostility, Haste, - Heal, + HealI, + HealII, + HealIII, Hex, Impurity, Invert, @@ -72,7 +84,7 @@ pub enum Item { Sleep, Snare, Strangle, - Strike, + StrikeI, StrikeII, StrikeIII, Siphon, @@ -183,17 +195,27 @@ impl Item { pub fn into_skill(&self) -> Option { match self { Item::Attack => Some(Skill::Attack), - Item::Amplify => Some(Skill::Amplify), + Item::AmplifyI => Some(Skill::AmplifyI), + Item::AmplifyII => Some(Skill::AmplifyII), + Item::AmplifyIII => Some(Skill::AmplifyIII), Item::Banish => Some(Skill::Banish), - Item::Blast => Some(Skill::Blast), + 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::Chaos => Some(Skill::Chaos), - Item::Curse => Some(Skill::Curse), + Item::ChaosI => Some(Skill::ChaosI), + 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::Heal => Some(Skill::Heal), + Item::HealI => Some(Skill::HealI), + Item::HealII => Some(Skill::HealII), + Item::HealIII => Some(Skill::HealIII), Item::Hex => Some(Skill::Hex), Item::Hostility => Some(Skill::Hostility), Item::Impurity => Some(Skill::Impurity), @@ -212,10 +234,12 @@ impl Item { Item::Snare => Some(Skill::Snare), Item::Strangle => Some(Skill::Strangle), Item::Stun => Some(Skill::Stun), - Item::Strike => Some(Skill::Strike), + Item::StrikeI => Some(Skill::StrikeI), Item::StrikeII => Some(Skill::StrikeII), Item::StrikeIII => Some(Skill::StrikeIII), - Item::Clutch => Some(Skill::Clutch), + Item::ClutchI => Some(Skill::ClutchI), + Item::ClutchII => Some(Skill::ClutchII), + Item::ClutchIII => Some(Skill::ClutchIII), Item::Taunt => Some(Skill::Taunt), Item::Throw => Some(Skill::Throw), Item::Corrupt => Some(Skill::Corrupt), @@ -319,7 +343,9 @@ impl Item { Item::RBSpeedI => format!("Increases CRYP SPEED and provides COLOUR BONUSES"), // Skills <- need to move effect mulltipliers into skills - Item::Amplify => format!("Increase red and blue power by {:?}%. Lasts {:?}T", + Item::AmplifyI | + Item::AmplifyII | + Item::AmplifyIII => format!("Increase red and blue power by {:?}%. Lasts {:?}T", self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100, self.into_skill().unwrap().effect().first().unwrap().get_duration()), @@ -327,13 +353,19 @@ impl Item { Banished cryps are immune to all skills and effects.", self.into_skill().unwrap().effect().first().unwrap().get_duration()), - Item::Blast => format!("Deals blue damage {:?}% blue power.", self.into_skill().unwrap().multiplier()), + Item::BlastI | + Item::BlastII | + Item::BlastIII => format!("Deals blue damage {:?}% blue power.", self.into_skill().unwrap().multiplier()), - Item::Chaos => format!( + Item::ChaosI | + Item::ChaosII | + Item::ChaosIII => format!( "Hits twice for red and blue damage. Damage is random 0 to 30% + {:?}% red and blue power.", self.into_skill().unwrap().multiplier()), - Item::Clutch => format!("Cryp cannot be KO'd while active. + Item::ClutchI | + Item::ClutchII | + Item::ClutchIII => format!("Cryp cannot be KO'd while active. Additionally provides immunity to disables."), Item::Corrupt => format!( @@ -343,7 +375,9 @@ impl Item { self.into_skill().unwrap().effect().last().unwrap().get_duration()), - Item::Curse => format!( + Item::CurseI | + Item::CurseII | + Item::CurseIII => format!( "Increases red and blue damage taken by {:?}%. Lasts {:?}T", self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100, self.into_skill().unwrap().effect().first().unwrap().get_duration()), @@ -367,7 +401,9 @@ impl Item { "% Speed as Red Damage", self.into_skill().unwrap().effect().first().unwrap().get_duration()), - Item::Heal => format!("Heals for {:?}% green power.", self.into_skill().unwrap().multiplier()), + Item::HealI | + Item::HealII | + Item::HealIII => format!("Heals for {:?}% green power.", self.into_skill().unwrap().multiplier()), Item::Hex => format!("Blue based skill that applies Hex for {:?}T. \ Hexed targets cannot cast any skills.", @@ -440,12 +476,8 @@ impl Item { self.into_skill().unwrap().multiplier(), self.into_skill().unwrap().effect().first().unwrap().get_duration()), - Item::Strike => format!( - "Hits at maximum speed dealing red damage {:?}% red power", - self.into_skill().unwrap().multiplier()), - Item::StrikeII => format!( - "Hits at maximum speed dealing red damage {:?}% red power", - self.into_skill().unwrap().multiplier()), + Item::StrikeI | + Item::StrikeII | Item::StrikeIII => format!( "Hits at maximum speed dealing red damage {:?}% red power", self.into_skill().unwrap().multiplier()), @@ -481,22 +513,28 @@ impl Item { match self { Item::Taunt => vec![Item::Buff, Item::Red, Item::Red], Item::Triage => vec![Item::Buff, Item::Green, Item::Green], - Item::Scatter => vec![Item::Buff, Item::Blue, Item::Blue], //To be impl + Item::Scatter => vec![Item::Buff, Item::Blue, Item::Blue], Item::Haste => vec![Item::Buff, Item::Red, Item::Green], Item::Impurity => vec![Item::Buff, Item::Green, Item::Blue], - Item::Amplify => vec![Item::Buff, Item::Red, Item::Blue], // Some flavour + 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::Snare => vec![Item::Debuff, Item::Red, Item::Red], Item::Purge => vec![Item::Debuff, Item::Green, Item::Green], // Needs flavour Item::Silence => vec![Item::Debuff, Item::Blue, Item::Blue], - Item::Curse => vec![Item::Debuff, Item::Red, Item::Green], // To be reworked + 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::Invert => vec![Item::Debuff, Item::Red, Item::Blue], Item::Parry => vec![Item::Block, Item::Red, Item::Red], // Add red recharge Item::Purify => vec![Item::Block, Item::Green, Item::Green], Item::Corrupt => vec![Item::Block, Item::Blue, Item::Blue], - Item::Clutch => vec![Item::Block, Item::Red, Item::Green], + Item::ClutchI => vec![Item::Block, Item::Red, Item::Green], + Item::ClutchII => vec![Item::ClutchI, Item::ClutchI, Item::ClutchI], + Item::ClutchIII => vec![Item::ClutchII, Item::ClutchII, Item::ClutchII], Item::Reflect => vec![Item::Block, Item::Green, Item::Blue], Item::Recharge => vec![Item::Block, Item::Red, Item::Blue], @@ -507,15 +545,20 @@ impl Item { Item::Hex => vec![Item::Stun, Item::Green, Item::Blue], Item::Banish => vec![Item::Stun, Item::Red, Item::Blue], - Item::Strike => vec![Item::Attack, Item::Red, Item::Red], - Item::StrikeII => vec![Item::Strike, Item::Strike, Item::Strike], - Item::StrikeIII => vec![Item::StrikeII, Item::StrikeII, Item::StrikeII], - - Item::Heal => vec![Item::Attack, Item::Green, Item::Green], - Item::Blast => vec![Item::Attack, Item::Blue, 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::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::Slay => vec![Item::Attack, Item::Red, Item::Green], Item::Siphon => vec![Item::Attack, Item::Green, Item::Blue], - Item::Chaos => vec![Item::Attack, Item::Red, Item::Blue], + Item::ChaosI => vec![Item::Attack, Item::Red, Item::Blue], + Item::ChaosII => vec![Item::ChaosI, Item::ChaosI, Item::ChaosI], + Item::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], @@ -546,20 +589,32 @@ impl Item { impl From for Item { fn from(skill: Skill) -> Item { match skill { - Skill::Amplify => Item::Amplify, + Skill::AmplifyI => Item::AmplifyI, + Skill::AmplifyII => Item::AmplifyII, + Skill::AmplifyIII => Item::AmplifyIII, Skill::Attack => Item::Attack, Skill::Banish => Item::Banish, - Skill::Blast => Item::Blast, + Skill::BlastI => Item::BlastI, + Skill::BlastII => Item::BlastII, + Skill::BlastIII => Item::BlastIII, Skill::Block => Item::Block, Skill::Buff => Item::Buff, - Skill::Chaos => Item::Chaos, - Skill::Curse => Item::Curse, - Skill::Clutch => Item::Clutch, + Skill::ChaosI => Item::ChaosI, + Skill::ChaosII => Item::ChaosII, + Skill::ChaosIII => Item::ChaosIII, + Skill::ClutchI => Item::ClutchI, + 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::Debuff => Item::Debuff, Skill::Haste => Item::Haste, Skill::Hostility => Item::Hostility, - Skill::Heal => Item::Heal, + Skill::HealI => Item::HealI, + Skill::HealII => Item::HealII, + Skill::HealIII => Item::HealIII, Skill::Hex => Item::Hex, Skill::Impurity => Item::Impurity, Skill::Invert => Item::Invert, @@ -576,7 +631,7 @@ impl From for Item { Skill::Sleep => Item::Sleep, Skill::Snare => Item::Snare, Skill::Strangle => Item::Strangle, - Skill::Strike => Item::Strike, + Skill::StrikeI => Item::StrikeI, Skill::StrikeII => Item::StrikeII, Skill::StrikeIII => Item::StrikeIII, Skill::Stun => Item::Stun, @@ -641,64 +696,76 @@ pub struct Combo { pub fn get_combos() -> Vec { let mut combinations = vec![ - Combo { components: Item::Taunt.combo(), item: Item::Taunt }, - Combo { components: Item::Triage.combo(), item: Item::Triage }, - Combo { components: Item::Scatter.combo(), item: Item::Scatter }, //To be impl - Combo { components: Item::Haste.combo(), item: Item::Haste }, - Combo { components: Item::Impurity.combo(), item: Item::Impurity }, - Combo { components: Item::Amplify.combo(), item: Item::Amplify }, // Some flavour + Combo { components: Item::Taunt.combo(), item: Item::Taunt }, + Combo { components: Item::Triage.combo(), item: Item::Triage }, + Combo { components: Item::Scatter.combo(), item: Item::Scatter }, + 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::Snare.combo(), item: Item::Snare }, + Combo { components: Item::Purge.combo(), item: Item::Purge }, // Needs flavour + Combo { components: Item::Silence.combo(), item: Item::Silence }, + 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::Invert.combo(), item: Item::Invert }, - Combo { components: Item::Snare.combo(), item: Item::Snare }, - Combo { components: Item::Purge.combo(), item: Item::Purge }, // Needs flavour - Combo { components: Item::Silence.combo(), item: Item::Silence }, - Combo { components: Item::Curse.combo(), item: Item::Curse }, // To be reworked - Combo { components: Item::Decay.combo(), item: Item::Decay }, - Combo { components: Item::Invert.combo(), item: Item::Invert }, + Combo { components: Item::Parry.combo(), item: Item::Parry }, // Add red recharge + Combo { components: Item::Purify.combo(), item: Item::Purify }, + 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::Reflect.combo(), item: Item::Reflect }, + Combo { components: Item::Recharge.combo(), item: Item::Recharge }, - Combo { components: Item::Parry.combo(), item: Item::Parry }, // Add red recharge - Combo { components: Item::Purify.combo(), item: Item::Purify }, - Combo { components: Item::Corrupt.combo(), item: Item::Corrupt }, - Combo { components: Item::Clutch.combo(), item: Item::Clutch }, - Combo { components: Item::Reflect.combo(), item: Item::Reflect }, - Combo { components: Item::Recharge.combo(), item: Item::Recharge }, + Combo { components: Item::Strangle.combo(), item: Item::Strangle }, + Combo { components: Item::Sleep.combo(), item: Item::Sleep }, + Combo { components: Item::Ruin.combo(), item: Item::Ruin }, + Combo { components: Item::Throw.combo(), item: Item::Throw }, + Combo { components: Item::Hex.combo(), item: Item::Hex }, + Combo { components: Item::Banish.combo(), item: Item::Banish }, - Combo { components: Item::Strangle.combo(), item: Item::Strangle }, - Combo { components: Item::Sleep.combo(), item: Item::Sleep }, - Combo { components: Item::Ruin.combo(), item: Item::Ruin }, - Combo { components: Item::Throw.combo(), item: Item::Throw }, - Combo { components: Item::Hex.combo(), item: Item::Hex }, - Combo { components: Item::Banish.combo(), item: Item::Banish }, + Combo { components: Item::StrikeI.combo(), item: Item::StrikeI }, + Combo { components: Item::StrikeII.combo(), item: Item::StrikeII }, + Combo { components: Item::StrikeIII.combo(), item: Item::StrikeIII }, - Combo { components: Item::Strike.combo(), item: Item::Strike }, - Combo { components: Item::StrikeII.combo(), item: Item::StrikeII }, - 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::BlastI.combo(), item: Item::BlastI }, + Combo { components: Item::BlastII.combo(), item: Item::BlastII }, + Combo { components: Item::BlastIII.combo(), item: Item::BlastIII }, + Combo { components: Item::Slay.combo(), item: Item::Slay }, + 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::Heal.combo(), item: Item::Heal }, - Combo { components: Item::Blast.combo(), item: Item::Blast }, - Combo { components: Item::Slay.combo(), item: Item::Slay }, - Combo { components: Item::Siphon.combo(), item: Item::Siphon }, - Combo { components: Item::Chaos.combo(), item: Item::Chaos }, - - Combo { components: Item::RedDamageI.combo(), item: Item::RedDamageI }, - Combo { components: Item::GreenDamageI.combo(), item: Item::GreenDamageI }, + Combo { components: Item::RedDamageI.combo(), item: Item::RedDamageI }, + Combo { components: Item::GreenDamageI.combo(), item: Item::GreenDamageI }, Combo { components: Item::BlueDamageI.combo(), item: Item::BlueDamageI }, - Combo { components: Item::GRDI.combo(), item: Item::GRDI }, - Combo { components: Item::GBDI.combo(), item: Item::GBDI }, - Combo { components: Item::RBDI.combo(), item: Item::RBDI }, + Combo { components: Item::GRDI.combo(), item: Item::GRDI }, + Combo { components: Item::GBDI.combo(), item: Item::GBDI }, + Combo { components: Item::RBDI.combo(), item: Item::RBDI }, - Combo { components: Item::RedLifeI.combo(), item: Item::RedLifeI }, - Combo { components: Item::GreenLifeI.combo(), item: Item::GreenLifeI }, - Combo { components: Item::BlueLifeI.combo(), item: Item::BlueLifeI }, - Combo { components: Item::GRLI.combo(), item: Item::GRLI }, - Combo { components: Item::GBLI.combo(), item: Item::GBLI }, - Combo { components: Item::RBLI.combo(), item: Item::RBLI }, + Combo { components: Item::RedLifeI.combo(), item: Item::RedLifeI }, + Combo { components: Item::GreenLifeI.combo(), item: Item::GreenLifeI }, + Combo { components: Item::BlueLifeI.combo(), item: Item::BlueLifeI }, + Combo { components: Item::GRLI.combo(), item: Item::GRLI }, + Combo { components: Item::GBLI.combo(), item: Item::GBLI }, + Combo { components: Item::RBLI.combo(), item: Item::RBLI }, - Combo { components: Item::RedSpeedI.combo(), item: Item::RedSpeedI }, + Combo { components: Item::RedSpeedI.combo(), item: Item::RedSpeedI }, Combo { components: Item::GreenSpeedI.combo(), item: Item::GreenSpeedI }, - Combo { components: Item::BlueSpeedI.combo(), item: Item::BlueSpeedI }, - Combo { components: Item::GRSpeedI.combo(), item: Item::GRSpeedI }, - Combo { components: Item::GBSpeedI.combo(), item: Item::GBSpeedI }, - Combo { components: Item::RBSpeedI.combo(), item: Item::RBSpeedI }, + Combo { components: Item::BlueSpeedI.combo(), item: Item::BlueSpeedI }, + Combo { components: Item::GRSpeedI.combo(), item: Item::GRSpeedI }, + Combo { components: Item::GBSpeedI.combo(), item: Item::GBSpeedI }, + Combo { components: Item::RBSpeedI.combo(), item: Item::RBSpeedI }, ]; @@ -759,7 +826,7 @@ mod tests { #[test] fn item_components_test() { - assert_eq!(Item::Strike.components(), vec![Item::Red, Item::Red, Item::Attack]); + assert_eq!(Item::StrikeI.components(), vec![Item::Red, Item::Red, Item::Attack]); assert_eq!(Item::StrikeII.components(), vec![ Item::Red, Item::Red, Item::Attack, Item::Red, Item::Red, Item::Attack, diff --git a/server/src/skill.rs b/server/src/skill.rs index 6d917f89..256d38e8 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -76,8 +76,8 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio match skill { Skill::Attack | Skill::Slay | - Skill::Chaos | - Skill::Strike => { + Skill::ChaosI | + Skill::StrikeI => { let amount = source.speed().pct(Skill::HasteStrike.multiplier()); target.deal_red_damage(Skill::HasteStrike, amount) .into_iter() @@ -89,8 +89,8 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio if source.affected(Effect::Impurity) { match skill { - Skill::Blast | - Skill::Chaos | + Skill::BlastI | + Skill::ChaosI | Skill::Siphon => { let amount = source.green_damage().pct(Skill::ImpureBlast.multiplier()); target.deal_blue_damage(Skill::ImpureBlast, amount) @@ -112,24 +112,38 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio // } resolutions = match skill { - Skill::Amplify => amplify(source, target, resolutions, skill), // increase magic damage + Skill::AmplifyI => amplify(source, target, resolutions, skill), + Skill::AmplifyII => amplify(source, target, resolutions, skill), + Skill::AmplifyIII => amplify(source, target, resolutions, skill), Skill::Attack => attack(source, target, resolutions, skill), Skill::Banish => banish(source, target, resolutions, skill), // TODO prevent all actions - Skill::Blast => blast(source, target, resolutions, skill), + Skill::BlastI => blast(source, target, resolutions, skill), + Skill::BlastII => blast(source, target, resolutions, skill), + Skill::BlastIII => blast(source, target, resolutions, skill), Skill::Block => block(source, target, resolutions, skill), Skill::Buff => buff(source, target, resolutions, skill), - Skill::Chaos => chaos(source, target, resolutions, skill), - Skill::Clutch => clutch(source, target, resolutions, skill), + Skill::ChaosI => chaos(source, target, resolutions, skill), + Skill::ChaosII => chaos(source, target, resolutions, skill), + Skill::ChaosIII => chaos(source, target, resolutions, skill), + Skill::ClutchI => clutch(source, target, resolutions, skill), + Skill::ClutchII => clutch(source, target, resolutions, skill), + Skill::ClutchIII => clutch(source, target, resolutions, skill), Skill::Corrupt => corrupt(source, target, resolutions, skill), Skill::CorruptionTick => corruption_tick(source, target, resolutions, skill), - Skill::Curse => curse(source, target, resolutions, skill), + Skill::CurseI => curse(source, target, resolutions, skill), + Skill::CurseII => curse(source, target, resolutions, skill), + Skill::CurseIII => curse(source, target, resolutions, skill), Skill::Debuff => debuff(source, target, resolutions, skill), // speed slow Skill::Decay => decay(source, target, resolutions, skill), // dot Skill::DecayTick => decay_tick(source, target, resolutions, skill), // dot Skill::Haste => haste(source, target, resolutions, skill), // speed slow Skill::HasteStrike => panic!("haste strike should not be caste"), - Skill::Heal => heal(source, target, resolutions, skill), - Skill::Hex => hex(source, target, resolutions, skill), + Skill::HealI => heal(source, target, resolutions, skill), + Skill::HealII => heal(source, target, resolutions, skill), + Skill::HealIII => heal(source, target, resolutions, skill), + Skill::HexI => hex(source, target, resolutions, skill), + Skill::HexII => hex(source, target, resolutions, skill), + Skill::HexIII => hex(source, target, resolutions, skill), Skill::Hostility => hostility(source, target, resolutions, skill), Skill::Impurity => impurity(source, target, resolutions, skill), Skill::ImpureBlast => panic!("impure blast should not be caste"), @@ -151,11 +165,9 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio Skill::Snare => snare(source, target, resolutions, skill), Skill::Strangle => strangle(source, target, resolutions, skill), Skill::StrangleTick => strangle_tick(source, target, resolutions, skill), - - Skill::Strike => strike(source, target, resolutions, skill), - Skill::StrikeII => strike(source, target, resolutions, skill), - Skill::StrikeIII => strike(source, target, resolutions, skill), - + Skill::StrikeI => strike(source, target, resolutions, skill), + Skill::StrikeII => strike(source, target, resolutions, skill), + Skill::StrikeIII => strike(source, target, resolutions, skill), Skill::Stun => stun(source, target, resolutions, skill), Skill::Taunt => taunt(source, target, resolutions, skill), Skill::Throw => throw(source, target, resolutions, skill), // no damage stun, adds vulnerable @@ -390,7 +402,9 @@ impl Effect { Effect::Banish => true, Effect::Clutch => [ Skill::Stun, - Skill::Hex, + Skill::HexI, + Skill::HexII, + Skill::HexIII, Skill::Silence, Skill::Ruin, Skill::Strangle, @@ -544,19 +558,31 @@ pub enum Skill { // Evade, // actively evade // Nightmare, // Sleep, - Amplify, + AmplifyI, + AmplifyII, + AmplifyIII, Banish, - Blast, - Chaos, - Clutch, + BlastI, + BlastII, + BlastIII, + ChaosI, + ChaosII, + ChaosIII, + ClutchI, + ClutchII, + ClutchIII, Corrupt, CorruptionTick, - Curse, + CurseI, + CurseII, + CurseIII, Decay, // dot DecayTick, // dot Haste, HasteStrike, - Heal, + HealI, + HealII, + HealIII, Hex, Hostility, ImpureBlast, @@ -579,7 +605,7 @@ pub enum Skill { Snare, Strangle, StrangleTick, - Strike, + StrikeI, StrikeII, StrikeIII, Taunt, @@ -603,39 +629,44 @@ impl Skill { // Attack Base Skill::Attack => 80, // Base - Skill::Blast => 110, // BB - Skill::Chaos => 40, // BR - Skill::Heal => 130, //GG + Skill::BlastI => 110, // BB + Skill::BlastII => 130, // BB + Skill::BlastIII => 150, // BB + Skill::ChaosI => 40, // BR + Skill::ChaosII => 50, // BR + Skill::ChaosIII => 60, // BR + Skill::HealI => 130, //GG + Skill::HealII => 160, //GG + Skill::HealIII => 200, //GG Skill::SiphonTick => 40, // GB Skill::Slay => 70, // RG - Skill::Strike => 90, //RR + Skill::StrikeI => 90, //RR Skill::StrikeII => 110, Skill::StrikeIII => 130, // Block Base Skill::CorruptionTick => 80, - Skill::Purify => 45, //Green dmg (heal) - Skill::Recharge => 85, //restore red and blue life (heal) - Skill::Reflect => 45, //restore blue life (heal) - Skill::Parry => 110, - Skill::Riposte => 70, + Skill::Riposte => 70, + Skill::Purify => 45, //Green dmg (heal) + Skill::Reflect => 45, //restore blue life (heal) + Skill::Recharge => 85, //restore red and blue life (heal) // Stun Base Skill::Sleep => 240, //Green dmg (heal) Skill::StrangleTick => 65, // Debuff Base + Skill::DecayTick => 25, Skill::Silence => 55, // Deals more per blue skill on target Skill::Snare => 40, // Deals more per red skill on target - Skill::DecayTick => 25, // Buff base Skill::ImpureBlast => 25, Skill::HasteStrike => 30, + Skill::Scatter => 140, Skill::Taunt => 80, Skill::TriageTick => 75, - Skill::Scatter => 140, _ => 100, } @@ -644,7 +675,9 @@ impl Skill { pub fn effect(&self) -> Vec { match self { // Modifiers - Skill::Amplify => vec![CrypEffect {effect: Effect::Amplify, duration: 2, meta: Some(EffectMeta::Multiplier(150)), 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 }], @@ -652,13 +685,19 @@ impl Skill { Skill::Corrupt => vec![CrypEffect {effect: Effect::Corrupt, duration: 2, meta: None, tick: None}, CrypEffect {effect: Effect::Corruption, duration: 3, meta: None, tick: None}], - Skill::Clutch => vec![CrypEffect {effect: Effect::Clutch, duration: 1, meta: None, tick: None }], - Skill::Curse => vec![CrypEffect {effect: Effect::Curse, duration: 2, meta: Some(EffectMeta::Multiplier(150)), 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::Hex => vec![CrypEffect {effect: Effect::Hex, duration: 2, meta: None, 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 }], @@ -696,7 +735,7 @@ impl Skill { Skill::Attack => None, Skill::Debuff => Some(1), Skill::Buff => None, - Skill::Strike => None, + Skill::StrikeI => None, Skill::StrikeII => None, Skill::StrikeIII => None, Skill::Block => None, // reduce damage @@ -704,13 +743,21 @@ impl Skill { Skill::Riposte => None, // used on parry Skill::Snare => Some(2), Skill::Stun => Some(2), - Skill::Heal => None, + Skill::HealI => None, + Skill::HealII => None, + Skill::HealIII => None, Skill::Triage => None, // hot Skill::TriageTick => None, Skill::Throw => Some(1), // no damage stun, adds vulnerable - Skill::Blast => None, - Skill::Chaos => None, - Skill::Amplify => Some(1), + Skill::BlastI => None, + Skill::BlastII => None, + Skill::BlastIII => None, + Skill::ChaosI => None, + Skill::ChaosII => None, + Skill::ChaosIII => None, + Skill::AmplifyI => Some(1), + Skill::AmplifyII => Some(1), + Skill::AmplifyIII => Some(1), Skill::Impurity => Some(3), Skill::ImpureBlast => None, Skill::Invert => Some(2), @@ -718,13 +765,16 @@ impl Skill { Skill::DecayTick => None, Skill::Siphon => None, Skill::SiphonTick => None, - Skill::Curse => Some(1), + Skill::CurseI => Some(1), + Skill::CurseII => Some(1), + Skill::CurseIII => Some(1), Skill::Scatter => Some(2), Skill::Silence => Some(2), Skill::Purify => None, Skill::Purge => None, Skill::Banish => Some(1), - Skill::Hex => Some(1), + Skill::HexI => Some(1), + Skill::HexII => Some(1), Skill::Haste => Some(2), Skill::HasteStrike => None, // Used in haste @@ -736,7 +786,9 @@ impl Skill { Skill::Strangle => Some(2), Skill::StrangleTick => None, - Skill::Clutch => Some(2), + Skill::ClutchI => Some(1), + Skill::ClutchII => Some(2), + Skill::ClutchIII => Some(3), Skill::Taunt => Some(2), Skill::Injure => Some(2), @@ -790,9 +842,9 @@ impl Skill { Skill::TestParry => 10, Skill::TestSiphon => 10, - Skill::Strike => u8::max_value(), - Skill::StrikeII => Skill::Strike.speed(), - Skill::StrikeIII => Skill::Strike.speed(), + Skill::StrikeI => u8::max_value(), + Skill::StrikeII => Skill::StrikeI.speed(), + Skill::StrikeIII => Skill::StrikeI.speed(), Skill::SiphonTick => Skill::Siphon.speed(), Skill::DecayTick => Skill::Decay.speed(), @@ -813,13 +865,15 @@ impl Skill { pub fn self_targeting(&self) -> bool { match self { - Skill::Block => true, - Skill::Parry => true, - Skill::Clutch => true, - Skill::Corrupt => true, - - Skill::TestBlock => true, + Skill::Block | + Skill::Parry | + Skill::ClutchI | + Skill::ClutchII | + Skill::ClutchIII | + Skill::Corrupt | + Skill::TestBlock | Skill::TestParry => true, + _ => false, } } @@ -828,17 +882,23 @@ impl Skill { let mut rng = thread_rng(); match self { - Skill::Heal | + Skill::HealI | + Skill::HealII | + Skill::HealIII | Skill::Triage | Skill::Purify | Skill::Parry | - Skill::Clutch | + Skill::ClutchI | + Skill::ClutchII | + Skill::ClutchIII | Skill::Scatter | Skill::Recharge | Skill::Reflect | Skill::Haste | Skill::Invert | - Skill::Amplify | + Skill::AmplifyI | + Skill::AmplifyII | + Skill::AmplifyIII | Skill::Hostility | Skill::Corrupt | Skill::Block => true, @@ -1360,15 +1420,15 @@ mod tests { fn heal_test() { let mut x = Cryp::new() .named(&"muji".to_string()) - .learn(Skill::Heal); + .learn(Skill::HealI); let mut y = Cryp::new() .named(&"camel".to_string()) - .learn(Skill::Heal); + .learn(Skill::HealI); x.deal_red_damage(Skill::Attack, 5); - heal(&mut y, &mut x, vec![], Skill::Heal); + heal(&mut y, &mut x, vec![], Skill::HealI); } #[test] @@ -1422,7 +1482,7 @@ mod tests { x.red_damage.force(10000000000000); // multiplication of int max will cause overflow - clutch(&mut y.clone(), &mut y, vec![], Skill::Clutch); + clutch(&mut y.clone(), &mut y, vec![], Skill::ClutchI); assert!(y.affected(Effect::Clutch)); let mut results = hex(&mut x, &mut y, vec![], Skill::Hex); @@ -1451,7 +1511,7 @@ mod tests { .named(&"camel".to_string()); resolve(Skill::Injure, &mut x, &mut y, vec![]); - assert!(y.immune(Skill::Heal).is_some()); + assert!(y.immune(Skill::HealI).is_some()); // resolutions = heal(&mut y.clone(), &mut y, resolutions); } @@ -1596,7 +1656,7 @@ mod tests { y.blue_life.force(50); y.deal_red_damage(Skill::Attack, 5); - y.deal_blue_damage(Skill::Blast, 5); + y.deal_blue_damage(Skill::BlastI, 5); let mut results = recharge(&mut x, &mut y, vec![], Skill::Recharge); @@ -1628,7 +1688,7 @@ mod tests { x.blue_damage.force(50); - amplify(&mut x.clone(), &mut x, vec![], Skill::Amplify); + amplify(&mut x.clone(), &mut x, vec![], Skill::AmplifyI); assert!(x.effects.iter().any(|e| e.effect == Effect::Amplify)); assert_eq!(x.blue_damage(), 75); } diff --git a/server/src/vbox.rs b/server/src/vbox.rs index b3e61de6..3446ef9b 100644 --- a/server/src/vbox.rs +++ b/server/src/vbox.rs @@ -200,7 +200,7 @@ mod tests { let mut vbox = Vbox::new(); vbox.bound = vec![Item::Attack, Item::Green, Item::Green]; vbox.combine(vec![1,2,0]).unwrap(); - assert_eq!(vbox.bound[0], Item::Heal); + assert_eq!(vbox.bound[0], Item::HealI); } #[test] @@ -218,14 +218,14 @@ mod tests { #[test] fn reclaim_test() { let mut vbox = Vbox::new(); - vbox.bound = vec![Item::Strike]; + vbox.bound = vec![Item::StrikeI]; vbox.reclaim(0).unwrap(); assert_eq!(vbox.bits, 22); } #[test] fn colours_count_test() { - let strike = Item::Strike; + let strike = Item::StrikeI; let mut count = Colours::new(); strike.colours(&mut count); From 2da21ca5bc5dbcdfb19ab1d5f7b4a01ec63a6d83 Mon Sep 17 00:00:00 2001 From: Mashy Date: Fri, 24 May 2019 16:49:34 +1000 Subject: [PATCH 02/10] wip add hex --- server/src/item.rs | 24 ++++++++++++++++++------ server/src/skill.rs | 9 ++++++--- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/server/src/item.rs b/server/src/item.rs index 5e5ffb81..138b4b2d 100644 --- a/server/src/item.rs +++ b/server/src/item.rs @@ -69,7 +69,9 @@ pub enum Item { HealI, HealII, HealIII, - Hex, + HexI, + HexII, + HexIII, Impurity, Invert, Parry, @@ -216,7 +218,9 @@ impl Item { Item::HealI => Some(Skill::HealI), Item::HealII => Some(Skill::HealII), Item::HealIII => Some(Skill::HealIII), - Item::Hex => Some(Skill::Hex), + 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::Invert => Some(Skill::Invert), @@ -405,7 +409,9 @@ impl Item { Item::HealII | Item::HealIII => format!("Heals for {:?}% green power.", self.into_skill().unwrap().multiplier()), - Item::Hex => format!("Blue based skill that applies Hex for {:?}T. \ + Item::HexI | + Item::HexII | + Item::HexIII => format!("Blue based skill that applies Hex for {:?}T. \ Hexed targets cannot cast any skills.", self.into_skill().unwrap().effect().first().unwrap().get_duration()), @@ -542,7 +548,9 @@ impl Item { Item::Sleep => vec![Item::Stun, Item::Green, Item::Green], Item::Ruin => vec![Item::Stun, Item::Blue, Item::Blue], Item::Throw => vec![Item::Stun, Item::Red, Item::Green], - Item::Hex => vec![Item::Stun, Item::Green, Item::Blue], + Item::HexI => vec![Item::Stun, Item::Green, Item::Blue], + Item::HexII => vec![Item::HexI, Item::HexI, Item::HexI], + Item::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], @@ -615,7 +623,9 @@ impl From for Item { Skill::HealI => Item::HealI, Skill::HealII => Item::HealII, Skill::HealIII => Item::HealIII, - Skill::Hex => Item::Hex, + Skill::HexI => Item::HexI, + Skill::HexII => Item::HexII, + Skill::HexIII => Item::HexIII, Skill::Impurity => Item::Impurity, Skill::Invert => Item::Invert, Skill::Parry => Item::Parry, @@ -727,7 +737,9 @@ pub fn get_combos() -> Vec { Combo { components: Item::Sleep.combo(), item: Item::Sleep }, Combo { components: Item::Ruin.combo(), item: Item::Ruin }, Combo { components: Item::Throw.combo(), item: Item::Throw }, - Combo { components: Item::Hex.combo(), item: Item::Hex }, + 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::StrikeI.combo(), item: Item::StrikeI }, diff --git a/server/src/skill.rs b/server/src/skill.rs index 256d38e8..7c62819d 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -583,7 +583,9 @@ pub enum Skill { HealI, HealII, HealIII, - Hex, + HexI, + HexII, + HexIII, Hostility, ImpureBlast, Impurity, @@ -774,7 +776,8 @@ impl Skill { Skill::Purge => None, Skill::Banish => Some(1), Skill::HexI => Some(1), - Skill::HexII => Some(1), + Skill::HexII => Some(2), + Skill::HexIII => Some(2), Skill::Haste => Some(2), Skill::HasteStrike => None, // Used in haste @@ -1485,7 +1488,7 @@ mod tests { clutch(&mut y.clone(), &mut y, vec![], Skill::ClutchI); assert!(y.affected(Effect::Clutch)); - let mut results = hex(&mut x, &mut y, vec![], Skill::Hex); + let mut results = hex(&mut x, &mut y, vec![], Skill::HexI); let Resolution { source: _, target: _, event } = results.remove(0); match event { Event::Immunity { skill: _, immunity } => assert!(immunity.contains(&Effect::Clutch)), From 6bbf8d0e342dccc82692ff41d18b18aa1b3ea8ec Mon Sep 17 00:00:00 2001 From: Mashy Date: Sat, 25 May 2019 18:53:10 +1000 Subject: [PATCH 03/10] more tier 2/3 wip --- server/src/game.rs | 20 +-- server/src/item.rs | 216 +++++++++++++++++++++-------- server/src/skill.rs | 328 +++++++++++++++++++++++++++++--------------- 3 files changed, 386 insertions(+), 178 deletions(-) diff --git a/server/src/game.rs b/server/src/game.rs index f4ae1dc7..d58333a2 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -1211,14 +1211,14 @@ mod tests { let x_cryp = x_player.cryps[0].clone(); let y_cryp = y_player.cryps[0].clone(); - game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::Scatter); + game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::ScatterI); - while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::Scatter).is_some() { + while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::ScatterI).is_some() { game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns(); } // apply buff - game.add_skill(x_player.id, x_cryp.id, Some(y_cryp.id), Skill::Scatter).unwrap(); + game.add_skill(x_player.id, x_cryp.id, Some(y_cryp.id), Skill::ScatterI).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); game = game.resolve_phase_start(); @@ -1296,15 +1296,15 @@ mod tests { let x_cryp = x_player.cryps[0].clone(); let y_cryp = x_player.cryps[1].clone(); - game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::Ruin); + game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::RuinI); - while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::Ruin).is_some() { + while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::RuinI).is_some() { game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns(); } game.add_skill(i_player.id, i_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); game.add_skill(i_player.id, j_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); - game.add_skill(x_player.id, x_cryp.id, Some(i_cryp.id), Skill::Ruin).unwrap(); + game.add_skill(x_player.id, x_cryp.id, Some(i_cryp.id), Skill::RuinI).unwrap(); game.add_skill(x_player.id, y_cryp.id, Some(i_cryp.id), Skill::TestTouch).unwrap(); game.player_ready(i_player.id).unwrap(); @@ -1442,8 +1442,8 @@ mod tests { game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns(); } - game.cryp_by_id(y_cryp.id).unwrap().learn_mut(Skill::Purify); - while game.cryp_by_id(y_cryp.id).unwrap().skill_on_cd(Skill::Purify).is_some() { + game.cryp_by_id(y_cryp.id).unwrap().learn_mut(Skill::PurifyI); + while game.cryp_by_id(y_cryp.id).unwrap().skill_on_cd(Skill::PurifyI).is_some() { game.cryp_by_id(y_cryp.id).unwrap().reduce_cooldowns(); } @@ -1463,7 +1463,7 @@ mod tests { game.resolved.clear(); // remove - game.add_skill(y_player.id, y_cryp.id, Some(y_cryp.id), Skill::Purify).unwrap(); + game.add_skill(y_player.id, y_cryp.id, Some(y_cryp.id), Skill::PurifyI).unwrap(); game.player_ready(x_player.id).unwrap(); game.player_ready(y_player.id).unwrap(); game = game.resolve_phase_start(); @@ -1483,7 +1483,7 @@ mod tests { game.resolved.clear(); - game.add_skill(y_player.id, y_cryp.id, Some(y_cryp.id), Skill::Purify).unwrap(); + game.add_skill(y_player.id, y_cryp.id, Some(y_cryp.id), Skill::PurifyI).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 138b4b2d..74e2a85d 100644 --- a/server/src/item.rs +++ b/server/src/item.rs @@ -1,4 +1,4 @@ -use skill::{Skill, Effect, Colour}; +use skill::{Skill, Colour}; use spec::{Spec}; use cryp::{Colours}; @@ -73,15 +73,31 @@ pub enum Item { HexII, HexIII, Impurity, - Invert, + InvertI, + InvertII, + InvertIII, Parry, - Purge, - Purify, - Reflect, - Recharge, - Ruin, - Scatter, - Silence, + PurgeI, + PurgeII, + PurgeIII, + PurifyI, + PurifyII, + PurifyIII, + ReflectI, + ReflectII, + ReflectIII, + RechargeI, + RechargeII, + RechargeIII, + RuinI, + RuinII, + RuinIII, + ScatterI, + ScatterII, + ScatterIII, + SilenceI, + SilenceII, + SilenceIII, Slay, Sleep, Snare, @@ -223,15 +239,31 @@ impl Item { Item::HexIII => Some(Skill::HexIII), Item::Hostility => Some(Skill::Hostility), Item::Impurity => Some(Skill::Impurity), - Item::Invert => Some(Skill::Invert), + Item::InvertI => Some(Skill::InvertI), + Item::InvertII => Some(Skill::InvertII), + Item::InvertIII => Some(Skill::InvertIII), Item::Parry => Some(Skill::Parry), - Item::Purge => Some(Skill::Purge), - Item::Purify => Some(Skill::Purify), - Item::Recharge => Some(Skill::Recharge), - Item::Reflect => Some(Skill::Reflect), - Item::Ruin => Some(Skill::Ruin), - Item::Scatter => Some(Skill::Scatter), - Item::Silence => Some(Skill::Silence), + 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::Slay => Some(Skill::Slay), Item::Sleep => Some(Skill::Sleep), Item::Siphon => Some(Skill::Siphon), @@ -423,7 +455,9 @@ impl Item { "% Green Power as Blue Damage", self.into_skill().unwrap().effect().first().unwrap().get_duration()), - Item::Invert => format!( + Item::InvertI | + Item::InvertII | + Item::InvertIII => format!( "Reverse healing into damage and damage into healing. Any excess red or blue damage is converted into shield recharge."), @@ -434,28 +468,42 @@ impl Item { "If a red skill is parried the cryp will riposte the source dealing red damage", Skill::Riposte.multiplier()), - Item::Purge => format!("Remove buffs from target cryp"), + Item::PurgeI | + Item::PurgeII | + Item::PurgeIII => format!("Remove buffs from target cryp"), - Item::Purify => format!( + Item::PurifyI | + Item::PurifyII | + Item::PurifyIII => format!( "Remove debuffs and heals for {:?}% green power per debuff removed.", self.into_skill().unwrap().multiplier()), - Item::Reflect => format!( + Item::ReflectI | + Item::ReflectII | + Item::ReflectIII => format!( "Reflect incoming skills to source. Lasts {:?}T", self.into_skill().unwrap().effect().first().unwrap().get_duration()), - Item::Recharge => format!( + Item::RechargeI | + Item::RechargeII | + Item::RechargeIII => format!( "Recharge red and blue shield based on {:?} red and blue power", self.into_skill().unwrap().multiplier()), - Item::Ruin => format!( + Item::RuinI | + Item::RuinII | + Item::RuinIII => format!( "Team wide Stun for {:?}T. Stunned cryps are unable to cast skills.", self.into_skill().unwrap().effect().first().unwrap().get_duration()), - Item::Scatter => format!( + Item::ScatterI | + Item::ScatterII | + Item::ScatterIII => format!( "Caster links with target. Linked cryps split incoming damage evenly. Recharges target blue shield {:?}% of blue power", self.into_skill().unwrap().multiplier()), - Item::Silence => format!( + Item::SilenceI | + Item::SilenceII | + Item::SilenceIII => format!( "Block the target from using blue skills for {:?}T and deals blue damage {:?}% blue power. {}", self.into_skill().unwrap().effect().first().unwrap().get_duration(), self.into_skill().unwrap().multiplier(), @@ -519,7 +567,9 @@ impl Item { match self { Item::Taunt => vec![Item::Buff, Item::Red, Item::Red], Item::Triage => vec![Item::Buff, Item::Green, Item::Green], - Item::Scatter => vec![Item::Buff, Item::Blue, Item::Blue], + 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], @@ -527,26 +577,41 @@ impl Item { Item::AmplifyIII => vec![Item::AmplifyII, Item::AmplifyII, Item::AmplifyII], Item::Snare => vec![Item::Debuff, Item::Red, Item::Red], - Item::Purge => vec![Item::Debuff, Item::Green, Item::Green], // Needs flavour - Item::Silence => vec![Item::Debuff, Item::Blue, Item::Blue], + 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::Decay => vec![Item::Debuff, Item::Green, Item::Blue], - Item::Invert => vec![Item::Debuff, Item::Red, Item::Blue], + 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::Purify => vec![Item::Block, Item::Green, Item::Green], + Item::PurifyI => vec![Item::Block, Item::Green, Item::Green], + Item::PurifyII => vec![Item::PurifyI, Item::PurifyI, Item::PurifyI], + Item::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::Reflect => vec![Item::Block, Item::Green, Item::Blue], - Item::Recharge => vec![Item::Block, Item::Red, Item::Blue], + 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::Sleep => vec![Item::Stun, Item::Green, Item::Green], - Item::Ruin => vec![Item::Stun, Item::Blue, Item::Blue], + Item::RuinI => vec![Item::Stun, Item::Blue, Item::Blue], + Item::RuinII => vec![Item::RuinI, Item::RuinI, Item::RuinI], + Item::RuinIII => vec![Item::RuinII, Item::RuinII, Item::RuinII], Item::Throw => vec![Item::Stun, Item::Red, Item::Green], Item::HexI => vec![Item::Stun, Item::Green, Item::Blue], Item::HexII => vec![Item::HexI, Item::HexI, Item::HexI], @@ -627,15 +692,31 @@ impl From for Item { Skill::HexII => Item::HexII, Skill::HexIII => Item::HexIII, Skill::Impurity => Item::Impurity, - Skill::Invert => Item::Invert, + Skill::InvertI => Item::InvertI, + Skill::InvertII => Item::InvertII, + Skill::InvertIII => Item::InvertIII, Skill::Parry => Item::Parry, - Skill::Purge => Item::Purge, - Skill::Purify => Item::Purify, - Skill::Recharge => Item::Recharge, - Skill::Reflect => Item::Reflect, - Skill::Ruin => Item::Ruin, - Skill::Scatter => Item::Scatter, - Skill::Silence => Item::Silence, + Skill::PurgeI => Item::PurgeI, + Skill::PurgeII => Item::PurgeII, + Skill::PurgeIII => Item::PurgeIII, + Skill::PurifyI => Item::PurifyI, + Skill::PurifyII => Item::PurifyII, + Skill::PurifyIII => Item::PurifyIII, + Skill::RechargeI => Item::RechargeI, + Skill::RechargeII => Item::RechargeII, + Skill::RechargeIII => Item::RechargeIII, + Skill::ReflectI => Item::ReflectI, + Skill::ReflectII => Item::ReflectII, + Skill::ReflectIII => Item::ReflectIII, + Skill::RuinI => Item::RuinI, + Skill::RuinII => Item::RuinII, + Skill::RuinIII => Item::RuinIII, + Skill::ScatterI => Item::ScatterI, + Skill::ScatterII => Item::ScatterII, + Skill::ScatterIII => Item::ScatterIII, + Skill::SilenceI => Item::SilenceI, + Skill::SilenceII => Item::SilenceII, + Skill::SilenceIII => Item::SilenceIII, Skill::Siphon => Item::Siphon, Skill::Slay => Item::Slay, Skill::Sleep => Item::Sleep, @@ -708,7 +789,9 @@ pub fn get_combos() -> Vec { let mut combinations = vec![ Combo { components: Item::Taunt.combo(), item: Item::Taunt }, Combo { components: Item::Triage.combo(), item: Item::Triage }, - Combo { components: Item::Scatter.combo(), item: Item::Scatter }, + 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::Haste.combo(), item: Item::Haste }, Combo { components: Item::Impurity.combo(), item: Item::Impurity }, Combo { components: Item::AmplifyI.combo(), item: Item::AmplifyI }, @@ -716,26 +799,47 @@ pub fn get_combos() -> Vec { Combo { components: Item::AmplifyIII.combo(), item: Item::AmplifyIII }, Combo { components: Item::Snare.combo(), item: Item::Snare }, - Combo { components: Item::Purge.combo(), item: Item::Purge }, // Needs flavour - Combo { components: Item::Silence.combo(), item: Item::Silence }, + 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::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::Invert.combo(), item: Item::Invert }, + 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::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::Strangle.combo(), item: Item::Strangle }, + Combo { components: Item::Sleep.combo(), item: Item::Sleep }, + 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::Parry.combo(), item: Item::Parry }, // Add red recharge - Combo { components: Item::Purify.combo(), item: Item::Purify }, - 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::Reflect.combo(), item: Item::Reflect }, - Combo { components: Item::Recharge.combo(), item: Item::Recharge }, - Combo { components: Item::Strangle.combo(), item: Item::Strangle }, - Combo { components: Item::Sleep.combo(), item: Item::Sleep }, - Combo { components: Item::Ruin.combo(), item: Item::Ruin }, Combo { components: Item::Throw.combo(), item: Item::Throw }, Combo { components: Item::HexI.combo(), item: Item::HexI }, Combo { components: Item::HexII.combo(), item: Item::HexII }, diff --git a/server/src/skill.rs b/server/src/skill.rs index 7c62819d..b5cee54e 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -112,52 +112,87 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio // } resolutions = match skill { - Skill::AmplifyI => amplify(source, target, resolutions, skill), - Skill::AmplifyII => amplify(source, target, resolutions, skill), - Skill::AmplifyIII => amplify(source, target, resolutions, skill), + Skill::AmplifyI | + Skill::AmplifyII | + Skill::AmplifyIII => amplify(source, target, resolutions, skill), + Skill::Attack => attack(source, target, resolutions, skill), Skill::Banish => banish(source, target, resolutions, skill), // TODO prevent all actions - Skill::BlastI => blast(source, target, resolutions, skill), - Skill::BlastII => blast(source, target, resolutions, skill), - Skill::BlastIII => blast(source, target, resolutions, skill), + + Skill::BlastI | + Skill::BlastII | + Skill::BlastIII => blast(source, target, resolutions, skill), + Skill::Block => block(source, target, resolutions, skill), Skill::Buff => buff(source, target, resolutions, skill), - Skill::ChaosI => chaos(source, target, resolutions, skill), - Skill::ChaosII => chaos(source, target, resolutions, skill), - Skill::ChaosIII => chaos(source, target, resolutions, skill), - Skill::ClutchI => clutch(source, target, resolutions, skill), - Skill::ClutchII => clutch(source, target, resolutions, skill), - Skill::ClutchIII => clutch(source, target, resolutions, skill), + + Skill::ChaosI | + Skill::ChaosII | + Skill::ChaosIII => chaos(source, target, resolutions, skill), + + Skill::ClutchI | + Skill::ClutchII | + Skill::ClutchIII => clutch(source, target, resolutions, skill), + Skill::Corrupt => corrupt(source, target, resolutions, skill), + Skill::CorruptionTick => corruption_tick(source, target, resolutions, skill), - Skill::CurseI => curse(source, target, resolutions, skill), - Skill::CurseII => curse(source, target, resolutions, skill), - Skill::CurseIII => curse(source, target, resolutions, skill), + + Skill::CurseI | + Skill::CurseII | + Skill::CurseIII => curse(source, target, resolutions, skill), + Skill::Debuff => debuff(source, target, resolutions, skill), // speed slow Skill::Decay => decay(source, target, resolutions, skill), // dot Skill::DecayTick => decay_tick(source, target, resolutions, skill), // dot Skill::Haste => haste(source, target, resolutions, skill), // speed slow - Skill::HasteStrike => panic!("haste strike should not be caste"), - Skill::HealI => heal(source, target, resolutions, skill), - Skill::HealII => heal(source, target, resolutions, skill), + + Skill::HealI | + Skill::HealII | Skill::HealIII => heal(source, target, resolutions, skill), - Skill::HexI => hex(source, target, resolutions, skill), - Skill::HexII => hex(source, target, resolutions, skill), - Skill::HexIII => hex(source, target, resolutions, skill), + + Skill::HexI | + Skill::HexII | + Skill::HexIII => hex(source, target, resolutions, skill), + Skill::Hostility => hostility(source, target, resolutions, skill), Skill::Impurity => impurity(source, target, resolutions, skill), - Skill::ImpureBlast => panic!("impure blast should not be caste"), - Skill::Invert => invert(source, target, resolutions, skill), - Skill::Injure => injure(source, target, resolutions, skill), + + Skill::InvertI | + Skill::InvertII | + Skill::InvertIII => invert(source, target, resolutions, skill), Skill::Parry => parry(source, target, resolutions, skill), - Skill::Purge => purge(source, target, resolutions, skill), // dispel all buffs - Skill::Purify => purify(source, target, resolutions, skill), // dispel all debuffs - Skill::Recharge => recharge(source, target, resolutions, skill), // target is immune to magic damage and fx - Skill::Reflect => reflect(source, target, resolutions, skill), - Skill::Riposte => panic!("riposte should not be caste"), - Skill::Ruin => ruin(source, target, resolutions, skill), - Skill::Scatter => scatter(source, target, resolutions, skill), // target is immune to magic damage and fx - Skill::Silence => silence(source, target, resolutions, skill), // target cannot cast spells + + Skill::PurgeI | + Skill::PurgeII | + Skill::PurgeIII => purge(source, target, resolutions, skill), // dispel all buffs + + Skill::PurifyI | + Skill::PurifyII | + Skill::PurifyIII => purify(source, target, resolutions, skill), + + Skill::RechargeI | + Skill::RechargeII | + Skill::RechargeIII => recharge(source, target, resolutions, skill), + + Skill::ReflectI | + Skill::ReflectII | + Skill::ReflectIII => reflect(source, target, resolutions, skill), + + Skill::RuinI | + Skill::RuinII | + Skill::RuinIII => ruin(source, target, resolutions, skill), + + Skill::ScatterI | + Skill::ScatterII | + Skill::ScatterIII => scatter(source, target, resolutions, skill), // target is immune to magic damage and fx + + Skill::SilenceI | + Skill::SilenceII | + Skill::SilenceIII => silence(source, target, resolutions, skill), // target cannot cast spells + + // Recharge -> Silence + Skill::Siphon => siphon(source, target, resolutions, skill), Skill::SiphonTick => siphon_tick(source, target, resolutions, skill), // hot Skill::Slay => slay(source, target, resolutions, skill), // hybrid dmg self heal @@ -174,6 +209,13 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio Skill::Triage => triage(source, target, resolutions, skill), // hot Skill::TriageTick => triage_tick(source, target, resolutions, skill), // hot + Skill::HasteStrike => panic!("should only trigger from haste"), + Skill::ImpureBlast => panic!("should only trigger from impurity"), + Skill::Riposte => panic!("should only trigger from parry"), + + + // Not used + Skill::Injure => injure(source, target, resolutions, skill), // ----------------- // Test // ----------------- @@ -345,7 +387,6 @@ pub enum Effect { Invert, Parry, Reflect, - Ruin, Slow, Snare, Strangle, @@ -405,8 +446,10 @@ impl Effect { Skill::HexI, Skill::HexII, Skill::HexIII, - Skill::Silence, - Skill::Ruin, + Skill::SilenceI, + Skill::RuinI, + Skill::RuinII, + Skill::RuinIII, Skill::Strangle, Skill::Snare ].contains(&skill), @@ -423,7 +466,6 @@ impl Effect { match self { Effect::Stun => true, Effect::Hex => true, - Effect::Ruin => true, Effect::Banish => true, Effect::Strangle => true, Effect::Strangling => skill != Skill::StrangleTick, @@ -502,7 +544,6 @@ impl Effect { // magic Effect::Hex => EffectCategory::Debuff, - Effect::Ruin => EffectCategory::Debuff, Effect::Curse => EffectCategory::Debuff, Effect::Banish => EffectCategory::Debuff, // todo randomise // Effect::Banish => rng.gen_bool(0.5), @@ -590,16 +631,32 @@ pub enum Skill { ImpureBlast, Impurity, Injure, - Invert, + InvertI, + InvertII, + InvertIII, Parry, // avoid all damage - Purge, - Purify, - Recharge, - Reflect, + PurgeI, + PurgeII, + PurgeIII, + PurifyI, + PurifyII, + PurifyIII, + RechargeI, + RechargeII, + RechargeIII, + ReflectI, + ReflectII, + ReflectIII, Riposte, - Ruin, - Scatter, - Silence, + RuinI, + RuinII, + RuinIII, + ScatterI, + ScatterII, + ScatterIII, + SilenceI, + SilenceII, + SilenceIII, Siphon, SiphonTick, Slay, @@ -650,9 +707,15 @@ impl Skill { Skill::CorruptionTick => 80, Skill::Parry => 110, Skill::Riposte => 70, - Skill::Purify => 45, //Green dmg (heal) - Skill::Reflect => 45, //restore blue life (heal) - Skill::Recharge => 85, //restore red and blue life (heal) + Skill::PurifyI => 45, //Green dmg (heal) + Skill::PurifyII => 70, + Skill::PurifyIII => 105, + Skill::ReflectI => 45, //restore blue life (heal) + Skill::ReflectII => 70, + Skill::ReflectIII => 100, + Skill::RechargeI => 85, //restore red and blue life (heal) + Skill::RechargeII => 130, + Skill::RechargeIII => 200, // Stun Base Skill::Sleep => 240, //Green dmg (heal) @@ -660,13 +723,17 @@ impl Skill { // Debuff Base Skill::DecayTick => 25, - Skill::Silence => 55, // Deals more per blue skill on target + 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::Snare => 40, // Deals more per red skill on target // Buff base Skill::ImpureBlast => 25, Skill::HasteStrike => 30, - Skill::Scatter => 140, + Skill::ScatterI => 140, + Skill::ScatterII => 200, + Skill::ScatterIII => 300, Skill::Taunt => 80, Skill::TriageTick => 75, @@ -677,51 +744,60 @@ 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::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::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::Invert => vec![CrypEffect {effect: Effect::Invert, duration: 2, 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::Parry => vec![CrypEffect {effect: Effect::Parry, duration: 2, meta: None, tick: None }], - Skill::Reflect => vec![CrypEffect {effect: Effect::Reflect, duration: 1, meta: None, tick: None }], - Skill::Throw => 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::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::Throw => 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::Ruin => vec![CrypEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}], - - - Skill::Scatter => vec![CrypEffect {effect: Effect::Scatter, duration: 2, meta: None, tick: None}], - Skill::Silence => vec![CrypEffect {effect: Effect::Silence, duration: 2, meta: None, tick: None}], - Skill::Siphon => vec![CrypEffect {effect: Effect::Siphon, duration: 2, meta: None, tick: None}], - Skill::Sleep => vec![CrypEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}], - Skill::Snare => vec![CrypEffect {effect: Effect::Snare, duration: 2, 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::Taunt => vec![CrypEffect {effect: Effect::Taunt, duration: 2, meta: None, tick: None}], - Skill::Triage => vec![CrypEffect {effect: Effect::Triage, duration: 2, meta: None, 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::Sleep => vec![CrypEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}], + Skill::Snare => vec![CrypEffect {effect: Effect::Snare, duration: 2, 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::Taunt => vec![CrypEffect {effect: Effect::Taunt, duration: 2, meta: None, tick: None}], + Skill::Triage => vec![CrypEffect {effect: Effect::Triage, duration: 2, meta: None, tick: None}], //Unused Skill::Injure => vec![CrypEffect {effect: Effect::Injured, duration: 2, meta: None, tick: None }], @@ -762,7 +838,9 @@ impl Skill { Skill::AmplifyIII => Some(1), Skill::Impurity => Some(3), Skill::ImpureBlast => None, - Skill::Invert => Some(2), + Skill::InvertI => Some(2), + Skill::InvertII => Some(2), + Skill::InvertIII => Some(2), Skill::Decay => Some(1), // dot Skill::DecayTick => None, Skill::Siphon => None, @@ -770,10 +848,18 @@ impl Skill { Skill::CurseI => Some(1), Skill::CurseII => Some(1), Skill::CurseIII => Some(1), - Skill::Scatter => Some(2), - Skill::Silence => Some(2), - Skill::Purify => None, - Skill::Purge => None, + Skill::ScatterI => Some(2), + Skill::ScatterII => Some(2), + Skill::ScatterIII => Some(2), + Skill::SilenceI => Some(3), + Skill::SilenceII => Some(2), + Skill::SilenceIII => Some(2), + Skill::PurifyI => None, + Skill::PurifyII => None, + Skill::PurifyIII => None, + Skill::PurgeI => None, + Skill::PurgeII => None, + Skill::PurgeIII => None, Skill::Banish => Some(1), Skill::HexI => Some(1), Skill::HexII => Some(2), @@ -781,9 +867,15 @@ impl Skill { Skill::Haste => Some(2), Skill::HasteStrike => None, // Used in haste - Skill::Reflect => Some(2), - Skill::Recharge => Some(2), - Skill::Ruin => Some(3), + Skill::ReflectI => Some(2), + Skill::ReflectII => Some(2), + Skill::ReflectIII => Some(2), + Skill::RechargeI => Some(2), + Skill::RechargeII => Some(2), + Skill::RechargeIII => Some(2), + Skill::RuinI => Some(3), + Skill::RuinII => Some(2), + Skill::RuinIII => Some(2), Skill::Slay => None, Skill::Sleep => Some(3), @@ -861,7 +953,9 @@ impl Skill { pub fn aoe(&self) -> bool { match self { - Skill::Ruin => true, + Skill::RuinI | + Skill::RuinII | + Skill::RuinIII => true, _ => false, } } @@ -889,16 +983,26 @@ impl Skill { Skill::HealII | Skill::HealIII | Skill::Triage | - Skill::Purify | + Skill::PurifyI | + Skill::PurifyII | + Skill::PurifyIII | Skill::Parry | Skill::ClutchI | Skill::ClutchII | Skill::ClutchIII | - Skill::Scatter | - Skill::Recharge | - Skill::Reflect | + Skill::ScatterI | + Skill::ScatterII | + Skill::ScatterIII | + Skill::RechargeI | + Skill::RechargeII | + Skill::RechargeIII | + Skill::ReflectI | + Skill::ReflectII | + Skill::ReflectIII | Skill::Haste | - Skill::Invert | + Skill::InvertI | + Skill::InvertII | + Skill::InvertIII | Skill::AmplifyI | Skill::AmplifyII | Skill::AmplifyIII | @@ -1351,7 +1455,7 @@ fn scatter_hit(source: &Cryp, target: &Cryp, mut results: Resolutions, game: &mu Colour::Green => scatter_target.deal_green_damage(skill, amount), }; - results.push(Resolution::new(target, scatter_target).event(Event::Skill { skill: Skill::Scatter })); + results.push(Resolution::new(target, scatter_target).event(Event::Skill { skill: Skill::ScatterI })); res.into_iter().for_each(|e| results.push(Resolution::new(&source, &scatter_target).event(e))); } else { panic!("not a scatter target {:?}", scatter); @@ -1530,7 +1634,7 @@ mod tests { y.red_life.force(64); y.red_life.reduce(64); x.red_damage.force(256 + 64); - invert(&mut y.clone(), &mut y, vec![], Skill::Invert); + invert(&mut y.clone(), &mut y, vec![], Skill::InvertI); assert!(y.affected(Effect::Invert)); // heal should deal green damage @@ -1565,7 +1669,7 @@ mod tests { let mut y = Cryp::new() .named(&"camel".to_string()); - reflect(&mut y.clone(), &mut y, vec![], Skill::Reflect); + reflect(&mut y.clone(), &mut y, vec![], Skill::ReflectI); assert!(y.affected(Effect::Reflect)); let mut results = vec![]; @@ -1661,7 +1765,7 @@ mod tests { y.deal_red_damage(Skill::Attack, 5); y.deal_blue_damage(Skill::BlastI, 5); - let mut results = recharge(&mut x, &mut y, vec![], Skill::Recharge); + let mut results = recharge(&mut x, &mut y, vec![], Skill::RechargeI); let Resolution { source: _, target: _, event } = results.remove(0); match event { @@ -1679,9 +1783,9 @@ mod tests { let mut x = Cryp::new() .named(&"muji".to_string()); - silence(&mut x.clone(), &mut x, vec![], Skill::Silence); + silence(&mut x.clone(), &mut x, vec![], Skill::SilenceI); assert!(x.effects.iter().any(|e| e.effect == Effect::Silence)); - assert!(x.disabled(Skill::Silence).is_some()); + assert!(x.disabled(Skill::SilenceI).is_some()); } #[test] @@ -1704,7 +1808,7 @@ mod tests { decay(&mut x.clone(), &mut x, vec![], Skill::Decay); assert!(x.effects.iter().any(|e| e.effect == Effect::Decay)); - purify(&mut x.clone(), &mut x, vec![], Skill::Purify); + purify(&mut x.clone(), &mut x, vec![], Skill::PurifyI); assert!(!x.effects.iter().any(|e| e.effect == Effect::Decay)); } } From b0eb9a8a5112931014d47a18eb3fd1d70fdc7e64 Mon Sep 17 00:00:00 2001 From: Mashy Date: Mon, 27 May 2019 10:41:36 +1000 Subject: [PATCH 04/10] more wip --- server/src/game.rs | 6 +- server/src/item.rs | 134 +++++++++++++++++++++--------- server/src/skill.rs | 198 +++++++++++++++++++++++++++++--------------- 3 files changed, 231 insertions(+), 107 deletions(-) diff --git a/server/src/game.rs b/server/src/game.rs index d58333a2..6d6a5116 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -1346,15 +1346,15 @@ mod tests { let x_cryp = x_player.cryps[0].clone(); let y_cryp = x_player.cryps[1].clone(); - game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::Taunt); + game.cryp_by_id(x_cryp.id).unwrap().learn_mut(Skill::TauntI); - while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::Taunt).is_some() { + while game.cryp_by_id(x_cryp.id).unwrap().skill_on_cd(Skill::TauntI).is_some() { game.cryp_by_id(x_cryp.id).unwrap().reduce_cooldowns(); } game.add_skill(i_player.id, i_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); game.add_skill(i_player.id, j_cryp.id, Some(x_cryp.id), Skill::TestTouch).unwrap(); - game.add_skill(x_player.id, x_cryp.id, Some(i_cryp.id), Skill::Taunt).unwrap(); + game.add_skill(x_player.id, x_cryp.id, Some(i_cryp.id), Skill::TauntI).unwrap(); game.add_skill(x_player.id, y_cryp.id, Some(i_cryp.id), Skill::TestTouch).unwrap(); game.player_ready(i_player.id).unwrap(); diff --git a/server/src/item.rs b/server/src/item.rs index 74e2a85d..735741b4 100644 --- a/server/src/item.rs +++ b/server/src/item.rs @@ -98,16 +98,26 @@ pub enum Item { SilenceI, SilenceII, SilenceIII, - Slay, - Sleep, - Snare, + SlayI, + SlayII, + SlayIII, + SleepI, + SleepII, + SleepIII, + SnareI, + SnareII, + SnareIII, Strangle, StrikeI, StrikeII, StrikeIII, Siphon, - Taunt, - Throw, + TauntI, + TauntII, + TauntIII, + ThrowI, + ThrowII, + ThrowIII, Triage, @@ -264,10 +274,16 @@ impl Item { Item::SilenceI => Some(Skill::SilenceI), Item::SilenceII => Some(Skill::SilenceII), Item::SilenceIII => Some(Skill::SilenceIII), - Item::Slay => Some(Skill::Slay), - Item::Sleep => Some(Skill::Sleep), + Item::SlayI => Some(Skill::SlayI), + 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::Snare => Some(Skill::Snare), + 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), @@ -276,8 +292,12 @@ impl Item { Item::ClutchI => Some(Skill::ClutchI), Item::ClutchII => Some(Skill::ClutchII), Item::ClutchIII => Some(Skill::ClutchIII), - Item::Taunt => Some(Skill::Taunt), - Item::Throw => Some(Skill::Throw), + Item::TauntI => Some(Skill::TauntI), + 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), _ => None, @@ -509,16 +529,22 @@ impl Item { self.into_skill().unwrap().multiplier(), "Deals 45% more damage per blue skill on target"), - Item::Slay => format!( + Item::SlayI | + Item::SlayII | + Item::SlayIII => format!( "Deals red damage {:?}% red power and provides self healing based on damage dealt.", self.into_skill().unwrap().multiplier()), - Item::Sleep => format!( + Item::SleepI | + Item::SleepII | + Item::SleepIII => format!( "Stun for {:?}T and heal for {:?}% green power.", self.into_skill().unwrap().effect().first().unwrap().get_duration(), self.into_skill().unwrap().multiplier()), - Item::Snare => format!( + Item::SnareI | + Item::SnareII | + Item::SnareIII => format!( "Block the target from using red skills for {:?}T and deals red damage {:?}% red power. {}", self.into_skill().unwrap().effect().first().unwrap().get_duration(), self.into_skill().unwrap().multiplier(), @@ -541,12 +567,16 @@ impl Item { self.into_skill().unwrap().multiplier(), self.into_skill().unwrap().effect().first().unwrap().get_duration()), - Item::Taunt => format!("{} {:?}T. Recharges RedLife for {:?} red power.", + Item::TauntI | + Item::TauntII | + Item::TauntIII => format!("{} {:?}T. Recharges RedLife for {:?} red power.", "Taunt redirects skills against the team to target, lasts", self.into_skill().unwrap().effect().first().unwrap().get_duration(), self.into_skill().unwrap().multiplier()), - Item::Throw => format!( + Item::ThrowI | + Item::ThrowII | + Item::ThrowIII => format!( "Stun the target for {:?}T and applies Vulnerable increasing red damage taken by {:?}% for {:?}T", self.into_skill().unwrap().effect().first().unwrap().get_duration(), self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100, @@ -565,7 +595,9 @@ impl Item { fn combo(&self) -> Vec { match self { - Item::Taunt => vec![Item::Buff, Item::Red, Item::Red], + 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::ScatterI => vec![Item::Buff, Item::Blue, Item::Blue], Item::ScatterII => vec![Item::ScatterI, Item::ScatterI, Item::ScatterI], @@ -576,7 +608,9 @@ impl Item { Item::AmplifyII => vec![Item::AmplifyI, Item::AmplifyI, Item::AmplifyI], Item::AmplifyIII => vec![Item::AmplifyII, Item::AmplifyII, Item::AmplifyII], - Item::Snare => vec![Item::Debuff, Item::Red, Item::Red], + 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 @@ -608,11 +642,15 @@ impl Item { Item::Strangle => vec![Item::Stun, Item::Red, Item::Red], - Item::Sleep => vec![Item::Stun, Item::Green, Item::Green], + Item::SleepI => vec![Item::Stun, Item::Green, Item::Green], + Item::SleepII => vec![Item::SleepI, Item::SleepI, Item::SleepI], + Item::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::Throw => vec![Item::Stun, Item::Red, Item::Green], + Item::ThrowI => vec![Item::Stun, Item::Red, Item::Green], + Item::ThrowII => vec![Item::ThrowI, Item::ThrowI, Item::ThrowI], + Item::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], @@ -627,7 +665,9 @@ impl Item { 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::Slay => vec![Item::Attack, Item::Red, Item::Green], + Item::SlayI => vec![Item::Attack, Item::Red, Item::Green], + Item::SlayII => vec![Item::SlayI, Item::SlayI, Item::SlayI], + Item::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], @@ -718,16 +758,26 @@ impl From for Item { Skill::SilenceII => Item::SilenceII, Skill::SilenceIII => Item::SilenceIII, Skill::Siphon => Item::Siphon, - Skill::Slay => Item::Slay, - Skill::Sleep => Item::Sleep, - Skill::Snare => Item::Snare, + Skill::SlayI => Item::SlayI, + Skill::SlayII => Item::SlayII, + Skill::SlayIII => Item::SlayIII, + Skill::SleepI => Item::SleepI, + Skill::SleepII => Item::SleepII, + Skill::SleepIII => Item::SleepIII, + Skill::SnareI => Item::SnareI, + 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::Taunt => Item::Taunt, - Skill::Throw => Item::Throw, + Skill::TauntI => Item::TauntI, + 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::Corrupt => Item::Corrupt, @@ -787,21 +837,25 @@ pub struct Combo { pub fn get_combos() -> Vec { let mut combinations = vec![ - Combo { components: Item::Taunt.combo(), item: Item::Taunt }, + 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::ScatterI.combo(), item: Item::ScatterI }, - Combo { components: Item::ScatterII.combo(), item: Item::ScatterII }, - Combo { components: Item::ScatterIII.combo(), item: Item::ScatterIII }, + 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::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::Snare.combo(), item: Item::Snare }, + 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::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 }, @@ -834,13 +888,17 @@ pub fn get_combos() -> Vec { Combo { components: Item::RechargeIII.combo(), item: Item::RechargeIII }, Combo { components: Item::Strangle.combo(), item: Item::Strangle }, - Combo { components: Item::Sleep.combo(), item: Item::Sleep }, + 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::Throw.combo(), item: Item::Throw }, + 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::HexI.combo(), item: Item::HexI }, Combo { components: Item::HexII.combo(), item: Item::HexII }, Combo { components: Item::HexIII.combo(), item: Item::HexIII }, @@ -856,7 +914,9 @@ pub fn get_combos() -> Vec { 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::Slay.combo(), item: Item::Slay }, + 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::ChaosI.combo(), item: Item::ChaosI }, Combo { components: Item::ChaosII.combo(), item: Item::ChaosII }, diff --git a/server/src/skill.rs b/server/src/skill.rs index b5cee54e..43a280fc 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -75,7 +75,7 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio if source.affected(Effect::Haste) { match skill { Skill::Attack | - Skill::Slay | + Skill::SlayI | Skill::ChaosI | Skill::StrikeI => { let amount = source.speed().pct(Skill::HasteStrike.multiplier()); @@ -115,17 +115,13 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio Skill::AmplifyI | Skill::AmplifyII | Skill::AmplifyIII => amplify(source, target, resolutions, skill), - - Skill::Attack => attack(source, target, resolutions, skill), + Skill::Banish => banish(source, target, resolutions, skill), // TODO prevent all actions - + Skill::BlastI | Skill::BlastII | Skill::BlastIII => blast(source, target, resolutions, skill), - - Skill::Block => block(source, target, resolutions, skill), - Skill::Buff => buff(source, target, resolutions, skill), - + Skill::ChaosI | Skill::ChaosII | Skill::ChaosIII => chaos(source, target, resolutions, skill), @@ -133,44 +129,44 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio Skill::ClutchI | Skill::ClutchII | Skill::ClutchIII => clutch(source, target, resolutions, skill), - + Skill::Corrupt => corrupt(source, target, resolutions, skill), - Skill::CorruptionTick => corruption_tick(source, target, resolutions, skill), - + Skill::CurseI | Skill::CurseII | Skill::CurseIII => curse(source, target, resolutions, skill), - - Skill::Debuff => debuff(source, target, resolutions, skill), // speed slow + Skill::Decay => decay(source, target, resolutions, skill), // dot Skill::DecayTick => decay_tick(source, target, resolutions, skill), // dot + Skill::Haste => haste(source, target, resolutions, skill), // speed slow - + Skill::HealI | - Skill::HealII | - Skill::HealIII => heal(source, target, resolutions, skill), - + Skill::HealII | + Skill::HealIII => heal(source, target, resolutions, skill), + Skill::HexI | Skill::HexII | Skill::HexIII => hex(source, target, resolutions, skill), - + Skill::Hostility => hostility(source, target, resolutions, skill), Skill::Impurity => impurity(source, target, resolutions, skill), - + Skill::InvertI | Skill::InvertII | Skill::InvertIII => invert(source, target, resolutions, skill), - Skill::Parry => parry(source, target, resolutions, skill), + Skill::Parry => parry(source, target, resolutions, skill), + Skill::PurgeI | Skill::PurgeII | Skill::PurgeIII => purge(source, target, resolutions, skill), // dispel all buffs - + Skill::PurifyI | Skill::PurifyII | Skill::PurifyIII => purify(source, target, resolutions, skill), - + Skill::RechargeI | Skill::RechargeII | Skill::RechargeIII => recharge(source, target, resolutions, skill), @@ -190,25 +186,48 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio Skill::SilenceI | Skill::SilenceII | Skill::SilenceIII => silence(source, target, resolutions, skill), // target cannot cast spells - - // Recharge -> Silence Skill::Siphon => siphon(source, target, resolutions, skill), Skill::SiphonTick => siphon_tick(source, target, resolutions, skill), // hot - Skill::Slay => slay(source, target, resolutions, skill), // hybrid dmg self heal - Skill::Sleep => sleep(source, target, resolutions, skill), // speed slow - Skill::Snare => snare(source, target, resolutions, skill), + + Skill::SlayI | + Skill::SlayII | + Skill::SlayIII => slay(source, target, resolutions, skill), // hybrid dmg self heal + + Skill::SleepI | + Skill::SleepII | + Skill::SleepIII => sleep(source, target, resolutions, skill), // heal stun + + Skill::SnareI | + 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::StrikeI => strike(source, target, resolutions, skill), - Skill::StrikeII => strike(source, target, resolutions, skill), - Skill::StrikeIII => strike(source, target, resolutions, skill), - Skill::Stun => stun(source, target, resolutions, skill), - Skill::Taunt => taunt(source, target, resolutions, skill), - Skill::Throw => throw(source, target, resolutions, skill), // no damage stun, adds vulnerable + + Skill::StrikeI | + Skill::StrikeII | + Skill::StrikeIII => strike(source, target, resolutions, skill), + + Skill::TauntI | + Skill::TauntII | + Skill::TauntIII => taunt(source, target, resolutions, skill), + + Skill::ThrowI | + Skill::ThrowII | + Skill::ThrowIII => throw(source, target, resolutions, skill), // no damage stun, adds vulnerable + Skill::Triage => triage(source, target, resolutions, skill), // hot Skill::TriageTick => triage_tick(source, target, resolutions, skill), // hot + // Base Skills + Skill::Attack => attack(source, target, resolutions, skill), + Skill::Block => block(source, target, resolutions, skill), + 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"), Skill::Riposte => panic!("should only trigger from parry"), @@ -447,11 +466,15 @@ impl Effect { Skill::HexII, Skill::HexIII, Skill::SilenceI, + Skill::SilenceII, + Skill::SilenceIII, Skill::RuinI, Skill::RuinII, Skill::RuinIII, Skill::Strangle, - Skill::Snare + Skill::SnareI, + Skill::SnareII, + Skill::SnareIII ].contains(&skill), Effect::Injured => skill.colours().contains(&Colour::Green), _ => false, @@ -632,8 +655,8 @@ pub enum Skill { Impurity, Injure, InvertI, - InvertII, - InvertIII, + InvertII, + InvertIII, Parry, // avoid all damage PurgeI, PurgeII, @@ -659,16 +682,26 @@ pub enum Skill { SilenceIII, Siphon, SiphonTick, - Slay, - Sleep, - Snare, + SlayI, + SlayII, + SlayIII, + SleepI, + SleepII, + SleepIII, + SnareI, + SnareII, + SnareIII, Strangle, StrangleTick, StrikeI, - StrikeII, - StrikeIII, - Taunt, - Throw, // no damage stun, adds vulnerable + StrikeII, + StrikeIII, + TauntI, + TauntII, + TauntIII, + ThrowI, // no damage stun, adds vulnerable + ThrowII, + ThrowIII, Triage, // hot TriageTick, @@ -698,10 +731,12 @@ impl Skill { Skill::HealII => 160, //GG Skill::HealIII => 200, //GG Skill::SiphonTick => 40, // GB - Skill::Slay => 70, // RG + Skill::SlayI => 70, // RG + Skill::SlayII => 90, + Skill::SlayIII => 120, Skill::StrikeI => 90, //RR Skill::StrikeII => 110, - Skill::StrikeIII => 130, + Skill::StrikeIII => 140, // Block Base Skill::CorruptionTick => 80, @@ -718,7 +753,9 @@ impl Skill { Skill::RechargeIII => 200, // Stun Base - Skill::Sleep => 240, //Green dmg (heal) + Skill::SleepI => 240, //Green dmg (heal) + Skill::SleepII => 300, + Skill::SleepIII => 400, Skill::StrangleTick => 65, // Debuff Base @@ -726,7 +763,9 @@ impl Skill { 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::Snare => 40, // Deals more per red skill on target + Skill::SnareI => 40, // Deals more per red skill on target + Skill::SnareII => 65, + Skill::SnareIII => 100, // Buff base Skill::ImpureBlast => 25, @@ -734,7 +773,9 @@ impl Skill { Skill::ScatterI => 140, Skill::ScatterII => 200, Skill::ScatterIII => 300, - Skill::Taunt => 80, + Skill::TauntI => 80, + Skill::TauntII => 110, + Skill::TauntIII => 150, Skill::TriageTick => 75, _ => 100, @@ -777,27 +818,40 @@ impl Skill { 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::Throw => vec![CrypEffect {effect: Effect::Stun, 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::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::Sleep => vec![CrypEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}], - Skill::Snare => vec![CrypEffect {effect: Effect::Snare, duration: 2, 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::Taunt => vec![CrypEffect {effect: Effect::Taunt, duration: 2, meta: None, tick: None}], - Skill::Triage => vec![CrypEffect {effect: Effect::Triage, 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::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::Triage => vec![CrypEffect {effect: Effect::Triage, duration: 2, meta: None, tick: None}], //Unused Skill::Injure => vec![CrypEffect {effect: Effect::Injured, duration: 2, meta: None, tick: None }], @@ -819,14 +873,18 @@ impl Skill { Skill::Block => None, // reduce damage Skill::Parry => Some(2), // avoid all damage Skill::Riposte => None, // used on parry - Skill::Snare => Some(2), + Skill::SnareI => 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::Throw => Some(1), // no damage stun, adds vulnerable + Skill::ThrowI => Some(1), // no damage stun, adds vulnerable + Skill::ThrowII => Some(1), + Skill::ThrowIII => Some(1), Skill::BlastI => None, Skill::BlastII => None, Skill::BlastIII => None, @@ -876,15 +934,21 @@ impl Skill { Skill::RuinI => Some(3), Skill::RuinII => Some(2), Skill::RuinIII => Some(2), - Skill::Slay => None, - Skill::Sleep => Some(3), + Skill::SlayI => None, + Skill::SlayII => None, + Skill::SlayIII => None, + Skill::SleepI => 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::Taunt => Some(2), + Skill::TauntI => Some(2), + Skill::TauntII => Some(2), + Skill::TauntIII => Some(2), Skill::Injure => Some(2), Skill::Corrupt => Some(1), From 9aa6346be6c2528f684d648fe4abdb3b6fd655f3 Mon Sep 17 00:00:00 2001 From: Mashy Date: Mon, 27 May 2019 12:11:14 +1000 Subject: [PATCH 05/10] tick tiers and formatting --- server/src/cryp.rs | 1 + server/src/game.rs | 8 +- server/src/item.rs | 536 +++++++++++++++++++----------------- server/src/skill.rs | 655 +++++++++++++++++++++++++++----------------- 4 files changed, 690 insertions(+), 510 deletions(-) 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); From 88c3e97bc1cb2f0290f344dabb93daba6d467b28 Mon Sep 17 00:00:00 2001 From: Mashy Date: Mon, 27 May 2019 14:21:01 +1000 Subject: [PATCH 06/10] 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"), From 0971c3a2e21a1d1cbf658aedf2ff7e2be65acf00 Mon Sep 17 00:00:00 2001 From: Mashy Date: Mon, 27 May 2019 16:03:59 +1000 Subject: [PATCH 07/10] corruption t2/t3, chaos is now 0-30% MORE --- server/src/game.rs | 6 +-- server/src/item.rs | 40 +++++++++------ server/src/skill.rs | 122 ++++++++++++++++++++++++++++++++------------ 3 files changed, 116 insertions(+), 52 deletions(-) diff --git a/server/src/game.rs b/server/src/game.rs index 74a0a99a..aa871e64 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -1179,14 +1179,14 @@ mod tests { let x_construct = x_player.constructs[0].clone(); let y_construct = y_player.constructs[0].clone(); - game.construct_by_id(x_construct.id).unwrap().learn_mut(Skill::Corrupt); + game.construct_by_id(x_construct.id).unwrap().learn_mut(Skill::CorruptI); - while game.construct_by_id(x_construct.id).unwrap().skill_on_cd(Skill::Corrupt).is_some() { + while game.construct_by_id(x_construct.id).unwrap().skill_on_cd(Skill::CorruptI).is_some() { game.construct_by_id(x_construct.id).unwrap().reduce_cooldowns(); } // apply buff - game.add_skill(x_player.id, x_construct.id, None, Skill::Corrupt).unwrap(); + game.add_skill(x_player.id, x_construct.id, None, Skill::CorruptI).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 07b48bc1..f2f84154 100644 --- a/server/src/item.rs +++ b/server/src/item.rs @@ -61,7 +61,9 @@ pub enum Item { ClutchI, ClutchII, ClutchIII, - Corrupt, + CorruptI, + CorruptII, + CorruptIII, CurseI, CurseII, CurseIII, @@ -320,7 +322,9 @@ impl Item { Item::ThrowI => Some(Skill::ThrowI), Item::ThrowII => Some(Skill::ThrowII), Item::ThrowIII => Some(Skill::ThrowIII), - Item::Corrupt => Some(Skill::Corrupt), + Item::CorruptI => Some(Skill::CorruptI), + Item::CorruptII => Some(Skill::CorruptII), + Item::CorruptIII => Some(Skill::CorruptIII), Item::TriageI => Some(Skill::TriageI), Item::TriageII => Some(Skill::TriageII), Item::TriageIII => Some(Skill::TriageIII), @@ -442,18 +446,20 @@ impl Item { Item::ChaosI | Item::ChaosII | Item::ChaosIII => format!( - "Hits twice for red and blue damage. Damage is random 0 to 30% + {:?}% red and blue power.", + "Hits twice for red and blue damage. Damage {:?}% red and blue power. Randomly deals 0 to 30% more damage", self.into_skill().unwrap().multiplier()), Item::ClutchI | Item::ClutchII | Item::ClutchIII => format!("Construct cannot be KO'd while active. Additionally provides immunity to disables."), - Item::Corrupt => format!( + Item::CorruptI | + Item::CorruptII | + Item::CorruptIII => format!( "Self targetting defensive for {:?}T. Applies corrupt to attackers dealing BlueDamage {:?}% \ BluePower per turn for {:?}T.", self.into_skill().unwrap().effect().first().unwrap().get_duration(), - Skill::Corrupt.multiplier(), + Skill::CorruptI.multiplier(), // TO BE FIXT self.into_skill().unwrap().effect().last().unwrap().get_duration()), Item::CurseI | @@ -535,7 +541,7 @@ impl Item { Item::RechargeI | Item::RechargeII | Item::RechargeIII => format!( - "Recharge red and blue shield based on {:?} red and blue power", + "Recharge Red and Blue Life based on {:?} RedPower and BluePower", self.into_skill().unwrap().multiplier()), Item::RuinI | @@ -558,12 +564,6 @@ impl Item { self.into_skill().unwrap().multiplier(), "Deals 45% more Damage per blue skill on target"), - Item::RechargeI | - Item::RechargeII | - Item::RechargeIII => format!( - "Recharge Red and Blue Life based on {:?} RedPower and BluePower", - self.into_skill().unwrap().multiplier()), - Item::SlayI | Item::SlayII | Item::SlayIII => format!( @@ -675,7 +675,9 @@ impl Item { 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::CorruptI => vec![Item::Block, Item::Blue, Item::Blue], + Item::CorruptII => vec![Item::CorruptI, Item::CorruptI, Item::CorruptI], + Item::CorruptIII => vec![Item::CorruptII, Item::CorruptII, Item::CorruptII], Item::ClutchI => vec![Item::Block, Item::Red, Item::Green], Item::ClutchII => vec![Item::ClutchI, Item::ClutchI, Item::ClutchI], Item::ClutchIII => vec![Item::ClutchII, Item::ClutchII, Item::ClutchII], @@ -843,9 +845,9 @@ impl From for Item { Skill::TriageI => Item::TriageI, Skill::TriageII => Item::TriageII, Skill::TriageIII => Item::TriageIII, - Skill::Corrupt => Item::Corrupt, - - Skill::CorruptionTick => Item::Corrupt, + Skill::CorruptI => Item::CorruptI, + Skill::CorruptII => Item::CorruptII, + Skill::CorruptIII => Item::CorruptIII, Skill::TestTouch => Item::TestTouch, Skill::TestStun => Item::TestStun, @@ -910,6 +912,8 @@ pub fn get_combos() -> Vec { Combo { components: Item::ScatterIII.combo(), item: Item::ScatterIII }, Combo { components: Item::Haste.combo(), item: Item::Haste }, + Combo { components: Item::Hostility.combo(), item: Item::Hostility }, + Combo { components: Item::Impurity.combo(), item: Item::Impurity }, Combo { components: Item::AmplifyI.combo(), item: Item::AmplifyI }, @@ -945,7 +949,9 @@ pub fn get_combos() -> Vec { 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::CorruptI.combo(), item: Item::CorruptI }, + Combo { components: Item::CorruptII.combo(), item: Item::CorruptII }, + Combo { components: Item::CorruptIII.combo(), item: Item::CorruptIII }, Combo { components: Item::ClutchI.combo(), item: Item::ClutchI }, Combo { components: Item::ClutchII.combo(), item: Item::ClutchII }, diff --git a/server/src/skill.rs b/server/src/skill.rs index 8eab9791..2542893f 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -21,7 +21,8 @@ pub fn pre_resolve(cast: &Cast, game: &mut Game, mut resolutions: Resolutions) - let targets = game.get_targets(cast.skill, &source, cast.target_construct_id); if skill.aoe() { // Send an aoe skill event for anims - resolutions.push(Resolution::new(&source, &game.construct_by_id(cast.target_construct_id).unwrap().clone()).event(Event::AoeSkill { skill })); + resolutions.push(Resolution::new(&source, + &game.construct_by_id(cast.target_construct_id).unwrap().clone()).event(Event::AoeSkill { skill })); } for target_id in targets { @@ -132,8 +133,12 @@ pub fn resolve(skill: Skill, source: &mut Construct, target: &mut Construct, mut Skill::ClutchII | Skill::ClutchIII => clutch(source, target, resolutions, skill), - Skill::Corrupt => corrupt(source, target, resolutions, skill), - Skill::CorruptionTick => corruption_tick(source, target, resolutions, skill), + Skill::CorruptI | + Skill::CorruptII | + Skill::CorruptIII => corrupt(source, target, resolutions, skill), + Skill::CorruptionTickI | + Skill::CorruptionTickII | + Skill::CorruptionTickIII => corruption_tick(source, target, resolutions, skill), Skill::CurseI | Skill::CurseII | @@ -249,6 +254,9 @@ pub fn resolve(skill: Skill, source: &mut Construct, target: &mut Construct, mut Skill::Stun => stun(source, target, resolutions, skill), //Triggered + Skill::CorruptionI | + Skill::CorruptionII | + Skill::CorruptionIII => panic!("should only trigget from corrupt hit"), Skill::HasteStrike => panic!("should only trigger from haste"), Skill::ImpureBlast => panic!("should only trigger from impurity"), Skill::RiposteI | @@ -281,7 +289,14 @@ fn post_resolve(_skill: Skill, game: &mut Game, mut resolutions: Resolutions) -> match event { Event::Damage { amount, skill, mitigation: _, colour: _ } => { if target.affected(Effect::Corrupt) { - resolutions = corruption(&mut target, &mut source, resolutions, Skill::Corrupt); + let ConstructEffect { effect: _, duration: _, meta, tick: _ } = target.effects.iter() + .find(|e| e.effect == Effect::Corrupt).unwrap().clone(); + match meta { + Some(EffectMeta::Skill(s)) => { + resolutions = corruption(&mut target, &mut source, resolutions, s); + }, + _ => panic!("no corrupt skill"), + }; } if target.affected(Effect::Hostility) { @@ -297,14 +312,15 @@ fn post_resolve(_skill: Skill, game: &mut Game, mut resolutions: Resolutions) -> Event::Immunity { skill: _, immunity } => match immunity.contains(&Effect::Parry) { true => { - let im_targ = target.clone(); - let ConstructEffect { 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, + let ConstructEffect { effect: _, duration: _, meta, tick: _ } = target.effects.iter() + .find(|e| e.effect == Effect::Parry).unwrap().clone(); + match meta { + Some(EffectMeta::Skill(s)) => { + resolutions = riposte(&mut target, &mut source, resolutions, s); + }, _ => panic!("no parry skill"), }; - resolutions = riposte(&mut target, &mut source, resolutions, riposte_skill); + }, false => (), }, @@ -679,8 +695,15 @@ pub enum Skill { ClutchII, ClutchIII, - Corrupt, - CorruptionTick, + CorruptI, + CorruptII, + CorruptIII, + CorruptionI, + CorruptionII, + CorruptionIII, + CorruptionTickI, + CorruptionTickII, + CorruptionTickIII, CurseI, CurseII, @@ -834,7 +857,10 @@ impl Skill { Skill::StrikeIII => 140, // Block Base - Skill::CorruptionTick => 80, + Skill::CorruptionTickI => 80, + Skill::CorruptionTickII => 100, + Skill::CorruptionTickIII => 130, + Skill::ParryI => 110, Skill::ParryII => 145, Skill::ParryIII => 200, @@ -908,8 +934,18 @@ impl Skill { Skill::Buff => vec![ConstructEffect {effect: Effect::Buff, duration: 2, meta: Some(EffectMeta::Multiplier(125)), tick: None }], - Skill::Corrupt => vec![ConstructEffect {effect: Effect::Corrupt, duration: 2, meta: None, tick: None}, - ConstructEffect {effect: Effect::Corruption, duration: 3, meta: None, tick: None}], + Skill::CorruptI => vec![ConstructEffect {effect: Effect::Corrupt, duration: 2, + meta: Some(EffectMeta::Skill(Skill::CorruptionI)), tick: None}], + Skill::CorruptII => vec![ConstructEffect {effect: Effect::Corrupt, duration: 3, + meta: Some(EffectMeta::Skill(Skill::CorruptionII)), tick: None}], + Skill::CorruptIII => vec![ConstructEffect {effect: Effect::Corrupt, duration: 4, + meta: Some(EffectMeta::Skill(Skill::CorruptionIII)), tick: None}], + Skill::CorruptionI => vec![ConstructEffect {effect: Effect::Corruption, duration: 3, + meta: Some(EffectMeta::Skill(Skill::CorruptionTickI)), tick: None}], + Skill::CorruptionII => vec![ConstructEffect {effect: Effect::Corruption, duration: 4, + meta: Some(EffectMeta::Skill(Skill::CorruptionTickII)), tick: None}], + Skill::CorruptionIII => vec![ConstructEffect {effect: Effect::Corruption, duration: 5, + meta: Some(EffectMeta::Skill(Skill::CorruptionTickIII)), tick: None}], Skill::ClutchI => vec![ConstructEffect {effect: Effect::Clutch, duration: 1, meta: None, tick: None }], Skill::ClutchII => vec![ConstructEffect {effect: Effect::Clutch, duration: 2, meta: None, tick: None }], @@ -963,11 +999,11 @@ impl Skill { Skill::ReflectIII => vec![ConstructEffect {effect: Effect::Reflect, duration: 3, meta: None, tick: None }], Skill::ThrowI => vec![ConstructEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}, - ConstructEffect {effect: Effect::Vulnerable, duration: 3, meta: Some(EffectMeta::Multiplier(150)), tick: None}], + ConstructEffect {effect: Effect::Vulnerable, duration: 3, meta: Some(EffectMeta::Multiplier(150)), tick: None}], Skill::ThrowII => vec![ConstructEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}, - ConstructEffect {effect: Effect::Vulnerable, duration: 4, meta: Some(EffectMeta::Multiplier(200)), tick: None}], + ConstructEffect {effect: Effect::Vulnerable, duration: 4, meta: Some(EffectMeta::Multiplier(200)), tick: None}], Skill::ThrowIII => vec![ConstructEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}, - ConstructEffect {effect: Effect::Vulnerable, duration: 4, meta: Some(EffectMeta::Multiplier(250)), tick: None}], + ConstructEffect {effect: Effect::Vulnerable, duration: 4, meta: Some(EffectMeta::Multiplier(250)), tick: None}], Skill::RuinI => vec![ConstructEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}], Skill::RuinII => vec![ConstructEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}], @@ -1139,7 +1175,10 @@ impl Skill { Skill::TauntIII => Some(2), Skill::Injure => Some(2), - Skill::Corrupt => Some(1), + Skill::CorruptI =>Some(1), + Skill::CorruptII =>Some(1), + Skill::CorruptIII =>Some(1), + Skill::Hostility => Some(1), @@ -1152,8 +1191,13 @@ impl Skill { Skill::RiposteI | Skill::RiposteII | Skill::RiposteIII | // parry + Skill::CorruptionI | + Skill::CorruptionII | + Skill::CorruptionIII | // Ticks - Skill::CorruptionTick | + Skill::CorruptionTickI | + Skill::CorruptionTickII | + Skill::CorruptionTickIII | Skill::DecayTickI | Skill::DecayTickII | Skill::DecayTickIII | @@ -1182,7 +1226,9 @@ impl Skill { pub fn ko_castable(&self) -> bool { match self { - Skill::CorruptionTick | + Skill::CorruptionTickI | + Skill::CorruptionTickII | + Skill::CorruptionTickIII | Skill::DecayTickI | Skill::DecayTickII | Skill::DecayTickIII | @@ -1199,7 +1245,9 @@ impl Skill { pub fn is_tick(&self) -> bool { match self { - Skill::CorruptionTick | + Skill::CorruptionTickI | + Skill::CorruptionTickII | + Skill::CorruptionTickIII | Skill::DecayTickI | Skill::DecayTickII | Skill::DecayTickIII | @@ -1247,7 +1295,9 @@ impl Skill { Skill::StrangleTickI | Skill::StrangleTickII | Skill::StrangleTickIII => Skill::StrangleI.speed(), - Skill::CorruptionTick => Skill::Corrupt.speed(), + Skill::CorruptionTickI | + Skill::CorruptionTickII | + Skill::CorruptionTickIII => Skill::CorruptI.speed(), _ => Item::from(*self).speed(), } @@ -1265,7 +1315,9 @@ impl Skill { pub fn self_targeting(&self) -> bool { match self { Skill::Block | - Skill::Corrupt | + Skill::CorruptI | + Skill::CorruptII | + Skill::CorruptIII | Skill::ClutchI | Skill::ClutchII | Skill::ClutchIII | @@ -1290,7 +1342,9 @@ impl Skill { Skill::ClutchI | Skill::ClutchII | Skill::ClutchIII | - Skill::Corrupt | + Skill::CorruptI | + Skill::CorruptII | + Skill::CorruptIII | Skill::Haste | Skill::HealI | Skill::HealII | @@ -1563,13 +1617,13 @@ fn triage_tick(source: &mut Construct, target: &mut Construct, mut results: Reso fn chaos(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { let mut rng = thread_rng(); - let b_rng: u64 = rng.gen_range(0, 30); - let amount = source.blue_power().pct(skill.multiplier() + b_rng); + let b_rng: u64 = rng.gen_range(100, 130); + let amount = source.blue_power().pct(skill.multiplier()).pct(b_rng); target.deal_blue_damage(skill, amount) .into_iter() .for_each(|e| results.push(Resolution::new(source, target).event(e))); - let r_rng: u64 = rng.gen_range(0, 30); - let amount = source.red_power().pct(skill.multiplier() + r_rng); + let r_rng: u64 = rng.gen_range(100, 130); + let amount = source.red_power().pct(skill.multiplier()).pct(r_rng); target.deal_red_damage(skill, amount) .into_iter() .for_each(|e| results.push(Resolution::new(source, target).event(e))); @@ -1635,11 +1689,15 @@ fn corrupt(source: &mut Construct, target: &mut Construct, mut results: Resoluti } fn corruption(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - let corruption = skill.effect().last().unwrap().clone() - .set_tick(Cast::new_tick(source, target, Skill::CorruptionTick)); + let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect().first().unwrap().clone(); + let tick_skill = match meta { + Some(EffectMeta::Skill(s)) => s, + _ => panic!("no corruption tick skill"), + }; + let corruption = ConstructEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill)); results.push(Resolution::new(source, target).event(target.add_effect(skill, corruption))); - return corruption_tick(source, target, results, Skill::CorruptionTick); + return corruption_tick(source, target, results, tick_skill); } fn corruption_tick(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { From 7d0b66ca3d054d8ecbd29ad2db902b8e14859279 Mon Sep 17 00:00:00 2001 From: Mashy Date: Mon, 27 May 2019 16:58:09 +1000 Subject: [PATCH 08/10] hostility --- server/src/item.rs | 24 +++++++++++++------ server/src/skill.rs | 58 +++++++++++++++++++++++++++++++++++---------- 2 files changed, 62 insertions(+), 20 deletions(-) diff --git a/server/src/item.rs b/server/src/item.rs index f2f84154..45018a76 100644 --- a/server/src/item.rs +++ b/server/src/item.rs @@ -70,7 +70,9 @@ pub enum Item { DecayI, DecayII, DecayIII, - Hostility, + HostilityI, + HostilityII, + HostilityIII, Haste, HealI, HealII, @@ -265,7 +267,9 @@ impl Item { Item::HexI => Some(Skill::HexI), Item::HexII => Some(Skill::HexII), Item::HexIII => Some(Skill::HexIII), - Item::Hostility => Some(Skill::Hostility), + Item::HostilityI => Some(Skill::HostilityI), + Item::HostilityII => Some(Skill::HostilityII), + Item::HostilityIII=> Some(Skill::HostilityIII), Item::Impurity => Some(Skill::Impurity), Item::InvertI => Some(Skill::InvertI), Item::InvertII => Some(Skill::InvertII), @@ -477,7 +481,9 @@ impl Item { self.into_skill().unwrap().multiplier(), self.into_skill().unwrap().effect().first().unwrap().get_duration()), - Item::Hostility => format!( + Item::HostilityI | + Item::HostilityII | + Item::HostilityIII => format!( "Gain Hostility for {:?}T. {} Hatred lasts {:?}T", self.into_skill().unwrap().effect().first().unwrap().get_duration(), "When attacked by Hostility you gain Hatred which increased red and blue power based on Damage taken.", @@ -644,8 +650,10 @@ impl Item { 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], @@ -688,7 +696,6 @@ impl Item { Item::RechargeII => vec![Item::RechargeI, Item::RechargeI, Item::RechargeI], Item::RechargeIII => vec![Item::RechargeII, Item::RechargeII, Item::RechargeII], - Item::StrangleI => vec![Item::Stun, Item::Red, Item::Red], Item::StrangleII => vec![Item::StrangleI, Item::StrangleI, Item::StrangleI], Item::StrangleIII => vec![Item::StrangleII, Item::StrangleII, Item::StrangleII], @@ -782,7 +789,9 @@ impl From for Item { Skill::DecayIII => Item::DecayIII, Skill::Debuff => Item::Debuff, Skill::Haste => Item::Haste, - Skill::Hostility => Item::Hostility, + Skill::HostilityI => Item::HostilityI, + Skill::HostilityII => Item::HostilityII, + Skill::HostilityIII => Item::HostilityIII, Skill::HealI => Item::HealI, Skill::HealII => Item::HealII, Skill::HealIII => Item::HealIII, @@ -912,8 +921,9 @@ pub fn get_combos() -> Vec { Combo { components: Item::ScatterIII.combo(), item: Item::ScatterIII }, Combo { components: Item::Haste.combo(), item: Item::Haste }, - Combo { components: Item::Hostility.combo(), item: Item::Hostility }, - + Combo { components: Item::HostilityI.combo(), item: Item::HostilityI }, + Combo { components: Item::HostilityII.combo(), item: Item::HostilityII }, + Combo { components: Item::HostilityIII.combo(), item: Item::HostilityIII }, Combo { components: Item::Impurity.combo(), item: Item::Impurity }, Combo { components: Item::AmplifyI.combo(), item: Item::AmplifyI }, diff --git a/server/src/skill.rs b/server/src/skill.rs index 2542893f..627abadc 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -161,7 +161,9 @@ pub fn resolve(skill: Skill, source: &mut Construct, target: &mut Construct, mut Skill::HexII | Skill::HexIII => hex(source, target, resolutions, skill), - Skill::Hostility => hostility(source, target, resolutions, skill), + Skill::HostilityI | + Skill::HostilityII | + Skill::HostilityIII => hostility(source, target, resolutions, skill), Skill::Impurity => impurity(source, target, resolutions, skill), Skill::InvertI | @@ -256,8 +258,11 @@ pub fn resolve(skill: Skill, source: &mut Construct, target: &mut Construct, mut //Triggered Skill::CorruptionI | Skill::CorruptionII | - Skill::CorruptionIII => panic!("should only trigget from corrupt hit"), + Skill::CorruptionIII => panic!("should only trigger from corrupt hit"), Skill::HasteStrike => panic!("should only trigger from haste"), + Skill::HatredI | + Skill::HatredII | + Skill::HatredIII => panic!("should only trigger from hatred"), Skill::ImpureBlast => panic!("should only trigger from impurity"), Skill::RiposteI | Skill::RiposteII | @@ -300,7 +305,14 @@ fn post_resolve(_skill: Skill, game: &mut Game, mut resolutions: Resolutions) -> } if target.affected(Effect::Hostility) { - resolutions = hatred(&mut source, &mut target, resolutions, skill, amount, Skill::Hostility); + let ConstructEffect { effect: _, duration: _, meta, tick: _ } = target.effects.iter() + .find(|e| e.effect == Effect::Hostility).unwrap().clone(); + match meta { + Some(EffectMeta::Skill(s)) => { + resolutions = hatred(&mut target, &mut source, resolutions, skill, amount, s); + }, + _ => panic!("no hatred skill"), + }; } // beware that scatter doesn't cause any damage @@ -727,7 +739,12 @@ pub enum Skill { HexII, HexIII, - Hostility, + HatredI, + HatredII, + HatredIII, + HostilityI, + HostilityII, + HostilityIII, ImpureBlast, Impurity, Injure, @@ -977,8 +994,16 @@ impl Skill { Skill::HexII => vec![ConstructEffect {effect: Effect::Hex, duration: 3, meta: None, tick: None}], Skill::HexIII => vec![ConstructEffect {effect: Effect::Hex, duration: 4, meta: None, tick: None}], - Skill::Hostility => vec![ConstructEffect {effect: Effect::Hostility, duration: 2, meta: None, tick: None}, - ConstructEffect {effect: Effect::Hatred, duration: 5, meta: None, tick: None}], + Skill::HostilityI => vec![ConstructEffect {effect: Effect::Hostility, duration: 2, + meta: Some(EffectMeta::Skill(Skill::HatredI)), tick: None}], + Skill::HostilityII => vec![ConstructEffect {effect: Effect::Hostility, duration: 3, + meta: Some(EffectMeta::Skill(Skill::HatredII)), tick: None}], + Skill::HostilityIII => vec![ConstructEffect {effect: Effect::Hostility, duration: 4, + meta: Some(EffectMeta::Skill(Skill::HatredIII)), tick: None}], + + Skill::HatredI => vec![ConstructEffect {effect: Effect::Hatred, duration: 5, meta: None, tick: None}], + Skill::HatredII => vec![ConstructEffect {effect: Effect::Hatred, duration: 7, meta: None, tick: None}], + Skill::HatredIII => vec![ConstructEffect {effect: Effect::Hatred, duration: 9, meta: None, tick: None}], Skill::Impurity => vec![ConstructEffect {effect: Effect::Impurity, duration: 3, meta: Some(EffectMeta::Multiplier(150)), tick: None }], @@ -991,7 +1016,7 @@ impl Skill { meta: Some(EffectMeta::Skill(Skill::RiposteI)), tick: None}], Skill::ParryII => vec![ConstructEffect {effect: Effect::Parry, duration: 2, meta: Some(EffectMeta::Skill(Skill::RiposteII)), tick: None}], - Skill::ParryIII => vec![ConstructEffect {effect: Effect::Parry, duration: 2, + Skill::ParryIII => vec![ConstructEffect {effect: Effect::Parry, duration: 2, meta: Some(EffectMeta::Skill(Skill::RiposteIII)), tick: None}], Skill::ReflectI => vec![ConstructEffect {effect: Effect::Reflect, duration: 1, meta: None, tick: None }], @@ -1017,11 +1042,11 @@ impl Skill { Skill::SilenceII => vec![ConstructEffect {effect: Effect::Silence, duration: 3, meta: None, tick: None}], Skill::SilenceIII => vec![ConstructEffect {effect: Effect::Silence, duration: 4, meta: None, tick: None}], - Skill::SiphonI => vec![ConstructEffect {effect: Effect::Siphon, duration: 2, + Skill::SiphonI => vec![ConstructEffect {effect: Effect::Siphon, duration: 2, meta: Some(EffectMeta::Skill(Skill::SiphonTickI)), tick: None}], - Skill::SiphonII => vec![ConstructEffect {effect: Effect::Siphon, duration: 3, + Skill::SiphonII => vec![ConstructEffect {effect: Effect::Siphon, duration: 3, meta: Some(EffectMeta::Skill(Skill::SiphonTickII)), tick: None}], - Skill::SiphonIII => vec![ConstructEffect {effect: Effect::Siphon, duration: 4, + Skill::SiphonIII => vec![ConstructEffect {effect: Effect::Siphon, duration: 4, meta: Some(EffectMeta::Skill(Skill::SiphonTickIII)), tick: None}], Skill::SleepI => vec![ConstructEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}], @@ -1180,7 +1205,9 @@ impl Skill { Skill::CorruptIII =>Some(1), - Skill::Hostility => Some(1), + Skill::HostilityI | + Skill::HostilityII | + Skill::HostilityIII => Some(1), //----------- // Never cast directly @@ -1194,6 +1221,9 @@ impl Skill { Skill::CorruptionI | Skill::CorruptionII | Skill::CorruptionIII | + Skill::HatredI | + Skill::HatredII | + Skill::HatredIII | // Ticks Skill::CorruptionTickI | Skill::CorruptionTickII | @@ -1349,7 +1379,9 @@ impl Skill { Skill::HealI | Skill::HealII | Skill::HealIII | - Skill::Hostility | + Skill::HostilityI | + Skill::HostilityII | + Skill::HostilityIII | Skill::InvertI | Skill::InvertII | Skill::InvertIII | @@ -1728,7 +1760,7 @@ fn hostility(source: &mut Construct, target: &mut Construct, mut results: Resolu } fn hatred(source: &mut Construct, target: &mut Construct, mut results: Resolutions, reflect_skill: Skill, amount: u64, skill: Skill) -> Resolutions { - let hatred = skill.effect().last().unwrap().clone() + let hatred = skill.effect().first().unwrap().clone() .set_meta(EffectMeta::AddedDamage(amount)); results.push(Resolution::new(source, target).event(target.add_effect(reflect_skill, hatred))); From d2f2c2bb671c99289564af28ea10803835249536 Mon Sep 17 00:00:00 2001 From: Mashy Date: Mon, 27 May 2019 18:28:49 +1000 Subject: [PATCH 09/10] added impurity / haste, all t2/t3s in --- server/src/item.rs | 51 ++++++++++++++++++++++++++++++++------------- server/src/skill.rs | 47 +++++++++++++++++++++++++++++++---------- 2 files changed, 73 insertions(+), 25 deletions(-) diff --git a/server/src/item.rs b/server/src/item.rs index 45018a76..66db8759 100644 --- a/server/src/item.rs +++ b/server/src/item.rs @@ -73,14 +73,18 @@ pub enum Item { HostilityI, HostilityII, HostilityIII, - Haste, + HasteI, + HasteII, + HasteIII, HealI, HealII, HealIII, HexI, HexII, HexIII, - Impurity, + ImpurityI, + ImpurityII, + ImpurityIII, InvertI, InvertII, InvertIII, @@ -259,8 +263,10 @@ impl Item { 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::DecayIII => Some(Skill::DecayIII), + Item::HasteI => Some(Skill::HasteI), + Item::HasteII => Some(Skill::HasteII), + Item::HasteIII => Some(Skill::HasteIII), Item::HealI => Some(Skill::HealI), Item::HealII => Some(Skill::HealII), Item::HealIII => Some(Skill::HealIII), @@ -270,7 +276,9 @@ impl Item { Item::HostilityI => Some(Skill::HostilityI), Item::HostilityII => Some(Skill::HostilityII), Item::HostilityIII=> Some(Skill::HostilityIII), - Item::Impurity => Some(Skill::Impurity), + Item::ImpurityI => Some(Skill::ImpurityI), + Item::ImpurityII => Some(Skill::ImpurityII), + Item::ImpurityIII => Some(Skill::ImpurityIII), Item::InvertI => Some(Skill::InvertI), Item::InvertII => Some(Skill::InvertII), Item::InvertIII => Some(Skill::InvertIII), @@ -489,7 +497,9 @@ impl Item { "When attacked by Hostility you gain Hatred which increased red and blue power based on Damage taken.", self.into_skill().unwrap().effect().last().unwrap().get_duration()), - Item::Haste => format!( + Item::HasteI | + Item::HasteII | + Item::HasteIII => format!( "Haste increases Speed by {:?}%, Red based Attack skills will strike again dealing {:?}{}. Lasts {:?}T", self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100, Skill::HasteStrike.multiplier(), @@ -506,7 +516,9 @@ impl Item { Hexed targets cannot cast any skills.", self.into_skill().unwrap().effect().first().unwrap().get_duration()), - Item::Impurity => format!( + Item::ImpurityI | + Item::ImpurityII | + Item::ImpurityIII => format!( "Impurity increases Green Power by {:?}%, Blue based Attack skills will blast again dealing {:?}{}. Lasts {:?}T", self.into_skill().unwrap().effect().first().unwrap().get_multiplier() - 100, Skill::ImpureBlast.multiplier(), @@ -651,9 +663,12 @@ impl Item { 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::HasteI => vec![Item::Buff, Item::Red, Item::Green], + Item::HasteII => vec![Item::HasteI, Item::HasteI, Item::HasteI], + Item::HasteIII => vec![Item::HasteII, Item::HasteII, Item::HasteII], + Item::ImpurityI => vec![Item::Buff, Item::Green, Item::Blue], + Item::ImpurityII => vec![Item::ImpurityI, Item::ImpurityI, Item::ImpurityI], + Item::ImpurityIII => vec![Item::ImpurityII, Item::ImpurityII, Item::ImpurityII], 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], @@ -788,7 +803,9 @@ impl From for Item { Skill::DecayII => Item::DecayII, Skill::DecayIII => Item::DecayIII, Skill::Debuff => Item::Debuff, - Skill::Haste => Item::Haste, + Skill::HasteI => Item::HasteI, + Skill::HasteII => Item::HasteII, + Skill::HasteIII => Item::HasteIII, Skill::HostilityI => Item::HostilityI, Skill::HostilityII => Item::HostilityII, Skill::HostilityIII => Item::HostilityIII, @@ -798,7 +815,9 @@ impl From for Item { Skill::HexI => Item::HexI, Skill::HexII => Item::HexII, Skill::HexIII => Item::HexIII, - Skill::Impurity => Item::Impurity, + Skill::ImpurityI => Item::ImpurityI, + Skill::ImpurityII => Item::ImpurityII, + Skill::ImpurityIII => Item::ImpurityIII, Skill::InvertI => Item::InvertI, Skill::InvertII => Item::InvertII, Skill::InvertIII => Item::InvertIII, @@ -920,11 +939,15 @@ pub fn get_combos() -> Vec { 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::HasteI.combo(), item: Item::HasteI }, + Combo { components: Item::HasteII.combo(), item: Item::HasteII }, + Combo { components: Item::HasteIII.combo(), item: Item::HasteIII }, Combo { components: Item::HostilityI.combo(), item: Item::HostilityI }, Combo { components: Item::HostilityII.combo(), item: Item::HostilityII }, Combo { components: Item::HostilityIII.combo(), item: Item::HostilityIII }, - Combo { components: Item::Impurity.combo(), item: Item::Impurity }, + Combo { components: Item::ImpurityI.combo(), item: Item::ImpurityI }, + Combo { components: Item::ImpurityII.combo(), item: Item::ImpurityII }, + Combo { components: Item::ImpurityIII.combo(), item: Item::ImpurityIII }, Combo { components: Item::AmplifyI.combo(), item: Item::AmplifyI }, Combo { components: Item::AmplifyII.combo(), item: Item::AmplifyII }, diff --git a/server/src/skill.rs b/server/src/skill.rs index 627abadc..5fb3cf6b 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -151,7 +151,9 @@ pub fn resolve(skill: Skill, source: &mut Construct, target: &mut Construct, mut Skill::DecayTickII | Skill::DecayTickIII => decay_tick(source, target, resolutions, skill), // dot - Skill::Haste => haste(source, target, resolutions, skill), // speed slow + Skill::HasteI | + Skill::HasteII | + Skill::HasteIII => haste(source, target, resolutions, skill), // speed slow Skill::HealI | Skill::HealII | @@ -164,7 +166,10 @@ pub fn resolve(skill: Skill, source: &mut Construct, target: &mut Construct, mut Skill::HostilityI | Skill::HostilityII | Skill::HostilityIII => hostility(source, target, resolutions, skill), - Skill::Impurity => impurity(source, target, resolutions, skill), + + Skill::ImpurityI | + Skill::ImpurityII | + Skill::ImpurityIII => impurity(source, target, resolutions, skill), Skill::InvertI | Skill::InvertII | @@ -728,7 +733,9 @@ pub enum Skill { DecayTickII, DecayTickIII, - Haste, + HasteI, + HasteII, + HasteIII, HasteStrike, HealI, @@ -746,7 +753,10 @@ pub enum Skill { HostilityII, HostilityIII, ImpureBlast, - Impurity, + + ImpurityI, + ImpurityII, + ImpurityIII, Injure, InvertI, @@ -988,8 +998,12 @@ impl Skill { ConstructEffect {effect: Effect::Decay, duration: 4, meta: Some(EffectMeta::Skill(Skill::DecayTickIII)), tick: None}], - Skill::Haste => vec![ConstructEffect {effect: Effect::Haste, duration: 2, - meta: Some(EffectMeta::Multiplier(150)), tick: None }], + Skill::HasteI => vec![ConstructEffect {effect: Effect::Haste, duration: 2, + meta: Some(EffectMeta::Multiplier(150)), tick: None }], + Skill::HasteII => vec![ConstructEffect {effect: Effect::Haste, duration: 3, + meta: Some(EffectMeta::Multiplier(175)), tick: None }], + Skill::HasteIII => vec![ConstructEffect {effect: Effect::Haste, duration: 4, + meta: Some(EffectMeta::Multiplier(225)), tick: None }], Skill::HexI => vec![ConstructEffect {effect: Effect::Hex, duration: 2, meta: None, tick: None}], Skill::HexII => vec![ConstructEffect {effect: Effect::Hex, duration: 3, meta: None, tick: None}], Skill::HexIII => vec![ConstructEffect {effect: Effect::Hex, duration: 4, meta: None, tick: None}], @@ -1005,9 +1019,13 @@ impl Skill { Skill::HatredII => vec![ConstructEffect {effect: Effect::Hatred, duration: 7, meta: None, tick: None}], Skill::HatredIII => vec![ConstructEffect {effect: Effect::Hatred, duration: 9, meta: None, tick: None}], - Skill::Impurity => vec![ConstructEffect {effect: Effect::Impurity, duration: 3, + Skill::ImpurityI => vec![ConstructEffect {effect: Effect::Impurity, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None }], - + Skill::ImpurityII => vec![ConstructEffect {effect: Effect::Impurity, duration: 3, + meta: Some(EffectMeta::Multiplier(175)), tick: None }], + Skill::ImpurityIII => vec![ConstructEffect {effect: Effect::Impurity, duration: 4, + meta: Some(EffectMeta::Multiplier(225)), tick: None }], + Skill::InvertI => vec![ConstructEffect {effect: Effect::Invert, duration: 2, meta: None, tick: None}], Skill::InvertII => vec![ConstructEffect {effect: Effect::Invert, duration: 3, meta: None, tick: None}], Skill::InvertIII => vec![ConstructEffect {effect: Effect::Invert, duration: 4, meta: None, tick: None}], @@ -1126,7 +1144,9 @@ impl Skill { Skill::AmplifyI => Some(1), Skill::AmplifyII => Some(1), Skill::AmplifyIII => Some(1), - Skill::Impurity => Some(3), + Skill::ImpurityI | + Skill::ImpurityII | + Skill::ImpurityIII => Some(3), Skill::InvertI => Some(2), Skill::InvertII => Some(2), @@ -1165,7 +1185,10 @@ impl Skill { Skill::HexI => Some(1), Skill::HexII => Some(2), Skill::HexIII => Some(2), - Skill::Haste => Some(2), + + Skill::HasteI => Some(2), + Skill::HasteII => Some(2), + Skill::HasteIII => Some(2), Skill::ReflectI => Some(2), Skill::ReflectII => Some(2), @@ -1375,7 +1398,9 @@ impl Skill { Skill::CorruptI | Skill::CorruptII | Skill::CorruptIII | - Skill::Haste | + Skill::HasteI | + Skill::HasteII | + Skill::HasteIII | Skill::HealI | Skill::HealII | Skill::HealIII | From 6d20644bcc7ca4ca0524580c2ebd7f23cb43fa28 Mon Sep 17 00:00:00 2001 From: Mashy Date: Tue, 28 May 2019 12:25:09 +1000 Subject: [PATCH 10/10] catch all multiplier meta cases --- server/src/construct.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/src/construct.rs b/server/src/construct.rs index 7465b037..6d917ea7 100644 --- a/server/src/construct.rs +++ b/server/src/construct.rs @@ -97,7 +97,11 @@ impl ConstructEffect { } pub fn get_multiplier(&self) -> u64 { - self.effect.apply(100, self.meta) + match self.meta { + Some(EffectMeta::Multiplier(s)) => s, + _ => 0 + } + } }