diff --git a/server/src/construct.rs b/server/src/construct.rs index 9c1bb1ee..14a0582b 100644 --- a/server/src/construct.rs +++ b/server/src/construct.rs @@ -549,11 +549,14 @@ impl Construct { } } - pub fn recharge(&mut self, skill: Skill, red_amount: u64, blue_amount: u64) -> (Event, EventStages) { + pub fn recharge(&mut self, skill: Skill, red_amount: u64, blue_amount: u64) -> Vec<(Event, EventStages)> { + let mut events = vec![]; + // Should red type immunity block recharge??? let mut stages = EventStages::PostOnly; if let Some(immunity) = self.immune(skill) { - return (Event::Immunity { skill, immunity }, stages); + events.push((Event::Immunity { skill, immunity }, stages)); + return events; } // Do we need inversion? @@ -571,7 +574,8 @@ impl Construct { stages = EventStages::NoStages; } - (Event::Recharge { red, blue, skill }, stages) + events.push((Event::Recharge { red, blue, skill }, stages)); + return events; } pub fn deal_green_damage(&mut self, skill: Skill, amount: u64) -> Vec { diff --git a/server/src/skill.rs b/server/src/skill.rs index 812055b4..395072e6 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -1408,10 +1408,12 @@ fn sleep(source: &mut Construct, target: &mut Construct, mut results: Resolution } fn sustain(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - let red_amount = source.red_power().pct(skill.multiplier()); results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); - let (e, stages) = target.recharge(skill, red_amount, 0); - results.push(Resolution::new(source, target).event(e).stages(stages)); + + let red_amount = source.red_power().pct(skill.multiplier()); + target.recharge(skill, red_amount, 0) + .into_iter() + .for_each(|(e, stages)| results.push(Resolution::new(source, target).event(e).stages(stages))); return results; } @@ -1421,8 +1423,9 @@ fn intercept(source: &mut Construct, target: &mut Construct, mut results: Resolu results.push(Resolution::new(source, target).event(target.add_effect(skill, intercept))); let red_amount = source.red_power().pct(skill.multiplier()); - let (e, stages) = target.recharge(skill, red_amount, 0); - results.push(Resolution::new(source, target).event(e).stages(stages)); + target.recharge(skill, red_amount, 0) + .into_iter() + .for_each(|(e, stages)| results.push(Resolution::new(source, target).event(e).stages(stages))); return results; } @@ -1684,8 +1687,9 @@ fn ruin(source: &mut Construct, target: &mut Construct, mut results: Resolutions fn absorb(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); let blue_amount = source.blue_power().pct(skill.multiplier()); - let (e, stages) = target.recharge(skill, 0, blue_amount); - results.push(Resolution::new(source, target).event(e).stages(stages)); + target.recharge(skill, 0, blue_amount) + .into_iter() + .for_each(|(e, stages)| results.push(Resolution::new(source, target).event(e).stages(stages))); return results;; } @@ -1724,8 +1728,10 @@ fn reflect(source: &mut Construct, target: &mut Construct, mut results: Resoluti results.push(Resolution::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); let blue_amount = source.blue_power().pct(skill.multiplier()); - let (e, stages) = target.recharge(skill, 0, blue_amount); - results.push(Resolution::new(source, target).event(e).stages(stages)); + target.recharge(skill, 0, blue_amount) + .into_iter() + .for_each(|(e, stages)| results.push(Resolution::new(source, target).event(e).stages(stages))); + return results;; } @@ -1733,8 +1739,10 @@ fn recharge(source: &mut Construct, target: &mut Construct, mut results: Resolut results.push(Resolution::new(source, target).event(Event::Skill { skill }).stages(EventStages::StartEnd)); let red_amount = source.red_power().pct(skill.multiplier()); let blue_amount = source.blue_power().pct(skill.multiplier()); - let (e, stages) = target.recharge(skill, red_amount, blue_amount); - results.push(Resolution::new(source, target).event(e).stages(stages)); + target.recharge(skill, red_amount, blue_amount) + .into_iter() + .for_each(|(e, stages)| results.push(Resolution::new(source, target).event(e).stages(stages))); + return results; }