diff --git a/client/src/animations.utils.jsx b/client/src/animations.utils.jsx index ad926a8f..21b38925 100644 --- a/client/src/animations.utils.jsx +++ b/client/src/animations.utils.jsx @@ -168,6 +168,9 @@ function getText(resolution) { if (type === 'Removal') { const { effect, construct_effects: effects } = event; + if (!effect) { + return { text: 'Effect Removal', css: '', effects }; + } return { text: `-${effect}`, css: '', effects }; } return false; diff --git a/server/src/skill.rs b/server/src/skill.rs index 33f7ea3c..6b621d5c 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -505,7 +505,7 @@ pub enum Event { AoeSkill { skill: Skill }, Skill { skill: Skill }, Effect { skill: Skill, effect: Effect, duration: u8, construct_effects: Vec }, - Removal { effect: Effect, construct_effects: Vec }, + Removal { effect: Option, construct_effects: Vec }, TargetKo { skill: Skill }, // skill not necessary but makes it neater as all events are arrays in js Ko (), @@ -1630,7 +1630,7 @@ fn electrocute(source: &mut Construct, target: &mut Construct, mut results: Reso Some(eff) => { let ce = source.effects.remove(eff); results.push(Resolution::new(source, source) - .event(Event::Removal { effect: ce.effect, construct_effects: source.effects.clone() }) + .event(Event::Removal { effect: Some(ce.effect), construct_effects: source.effects.clone() }) .stages(EventStages::PostOnly)); } None => () @@ -1701,7 +1701,7 @@ fn absorption(source: &mut Construct, target: &mut Construct, mut results: Resol let ce = target.effects.remove(absorb_index); results.push(Resolution::new(source, target) - .event(Event::Removal { effect: ce.effect, construct_effects: target.effects.clone() }) + .event(Event::Removal { effect: Some(ce.effect), construct_effects: target.effects.clone() }) .stages(EventStages::PostOnly)); return results;; } @@ -1816,58 +1816,31 @@ fn silence(source: &mut Construct, target: &mut Construct, mut results: Resoluti fn purge(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { results.push(Resolution::new(source, target).event(Event::Skill { skill }).stages(EventStages::StartEnd)); - while let Some(i) = target.effects - .iter() - .position(|ce| { - if let Some(c) = ce.effect.colour() { - c == Colour::Green - } else { - false - } - }) { - let ce = target.effects.remove(i); - results.push(Resolution::new(source, target) - .event(Event::Removal { effect: ce.effect, construct_effects: target.effects.clone() }) - .stages(EventStages::PostOnly)); - } + if target.effects.len() > 0 { + target.effects.clear(); + results.push(Resolution::new(source, target) + .event(Event::Removal { effect: None, construct_effects: target.effects.clone() }) + .stages(EventStages::PostOnly)); + } let effect = skill.effect()[0]; results.push(Resolution::new(source, target).event(target.add_effect(skill, effect)).stages(EventStages::PostOnly)); - /*let mut turns = 1; - for cs in target.skills.iter_mut() { - if Effect::Purge.disables_skill(cs.skill) { - turns += 1; - } - } - - if turns > 1 { - effect.duration = effect.duration * turns; - }*/ - return results; } fn purify(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { results.push(Resolution::new(source, target).event(Event::Skill { skill }).stages(EventStages::StartEnd)); - let amount = source.green_power().pct(skill.multiplier()); - while let Some(i) = target.effects - .iter() - .position(|ce| { - if let Some(c) = ce.effect.colour() { - [Colour::Red, Colour::Blue].contains(&c) - } else { - false - } - }) { - let ce = target.effects.remove(i); - results.push(Resolution::new(source, target) - .event(Event::Removal { effect: ce.effect, construct_effects: target.effects.clone() }) - .stages(EventStages::PostOnly)); - target.deal_green_damage(skill, amount) + if target.effects.len() > 0 { + let amount = source.green_power().pct(skill.multiplier().saturating_mul(target.effects.len() as u64)); + target.effects.clear(); + results.push(Resolution::new(source, target) + .event(Event::Removal { effect: None, construct_effects: target.effects.clone() }) + .stages(EventStages::PostOnly)); + target.deal_green_damage(skill, amount) .into_iter() .for_each(|e| results.push(Resolution::new(source, target).event(e).stages(EventStages::PostOnly))); - } + } return results; }