From af569b155ee8906f4f85dff28b65712382c91c31 Mon Sep 17 00:00:00 2001 From: ntr Date: Fri, 7 Jun 2019 17:41:46 +1000 Subject: [PATCH] purge disable --- server/src/skill.rs | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/server/src/skill.rs b/server/src/skill.rs index 88f30d83..0ab9f711 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -489,6 +489,7 @@ pub enum Effect { Impurity, Invert, Parry, + Purge, Reflect, Slow, Snare, @@ -573,6 +574,7 @@ impl Effect { Effect::Banish => true, Effect::Silence => skill.colours().contains(&Colour::Blue), Effect::Snare => skill.colours().contains(&Colour::Red), + Effect::Purge => skill.colours().contains(&Colour::Green), Effect::Ko => skill.ko_castable(), _ => false, } @@ -655,6 +657,7 @@ impl Effect { Effect::Amplify => EffectCategory::Buff, Effect::Silence => EffectCategory::Debuff, Effect::Wither => EffectCategory::Debuff, + Effect::Purge => EffectCategory::Debuff, Effect::Corrupt => EffectCategory::Buff, Effect::Corruption => EffectCategory::Debuff, @@ -1044,6 +1047,10 @@ impl Skill { Skill::RuinII => vec![ConstructEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}], Skill::RuinIII => vec![ConstructEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}], + Skill::PurgeI => vec![ConstructEffect {effect: Effect::Purge, duration: 1, meta: None, tick: None}], + Skill::PurgeII => vec![ConstructEffect {effect: Effect::Purge, duration: 2, meta: None, tick: None}], + Skill::PurgeIII => vec![ConstructEffect {effect: Effect::Purge, duration: 3, meta: None, tick: None}], + Skill::ScatterI => vec![ConstructEffect {effect: Effect::Scatter, duration: 2, meta: None, tick: None}], Skill::ScatterII => vec![ConstructEffect {effect: Effect::Scatter, duration: 3, meta: None, tick: None}], Skill::ScatterIII => vec![ConstructEffect {effect: Effect::Scatter, duration: 4, meta: None, tick: None}], @@ -1854,7 +1861,7 @@ fn silence(source: &mut Construct, target: &mut Construct, mut results: Resoluti return results; } -fn purge(source: &mut Construct, target: &mut Construct, mut results: Resolutions, _skill: Skill) -> Resolutions { +fn purge(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { while let Some(i) = target.effects .iter() .position(|ce| ce.effect.category() == EffectCategory::Buff) { @@ -1863,6 +1870,18 @@ fn purge(source: &mut Construct, target: &mut Construct, mut results: Resolution .event(Event::Removal { effect: ce.effect, construct_effects: target.effects.clone() })); } + let mut turns = 0; + for cs in target.skills.iter_mut() { + if Effect::Purge.disables_skill(cs.skill) { + turns += 1; + } + } + if turns > 0 { + let mut effect = skill.effect()[0]; + effect.duration = effect.duration * turns; + results.push(Resolution::new(source, target).event(target.add_effect(skill, effect))); + } + return results; } @@ -2185,4 +2204,19 @@ mod tests { assert!(y.skills.iter().any(|cs| cs.skill == Skill::Stun && cs.cd.unwrap() == stun_cd + 1)); } + #[test] + fn purge_test() { + let mut x = Construct::new() + .named(&"muji".to_string()); + + let mut y = Construct::new() + .named(&"pretaliation".to_string()) + .learn(Skill::HealI) + .learn(Skill::HealII); + + purge(&mut x, &mut y, vec![], Skill::PurgeI); + // 2 turns at lvl 1 + assert!(y.effects.iter().any(|e| e.effect == Effect::Purge && e.duration == 2)); + assert!(y.disabled(Skill::HealI).is_some()); + } }