From 241467ec480bb1f07989cfde9429debdfb823086 Mon Sep 17 00:00:00 2001 From: Mashy Date: Thu, 7 Nov 2019 11:23:08 +1000 Subject: [PATCH] cleaning up ugly recharge code --- server/src/construct.rs | 16 ++++++----- server/src/skill.rs | 63 +++++------------------------------------ 2 files changed, 16 insertions(+), 63 deletions(-) diff --git a/server/src/construct.rs b/server/src/construct.rs index 55a971f1..9c1bb1ee 100644 --- a/server/src/construct.rs +++ b/server/src/construct.rs @@ -7,7 +7,7 @@ use postgres::transaction::Transaction; use failure::Error; use failure::err_msg; -use skill::{Skill, Cast, Immunity, Disable, Event}; +use skill::{Skill, Cast, Immunity, Disable, Event, EventStages}; use effect::{Cooldown, Effect, Colour}; use spec::{Spec}; use item::{Item}; @@ -549,13 +549,11 @@ impl Construct { } } - pub fn recharge(&mut self, skill: Skill, red_amount: u64, blue_amount: u64) -> Event { + pub fn recharge(&mut self, skill: Skill, red_amount: u64, blue_amount: u64) -> (Event, EventStages) { // Should red type immunity block recharge??? + let mut stages = EventStages::PostOnly; if let Some(immunity) = self.immune(skill) { - return Event::Immunity { - skill, - immunity, - }; + return (Event::Immunity { skill, immunity }, stages); } // Do we need inversion? @@ -569,7 +567,11 @@ impl Construct { let new_blue_life = self.blue_life.value; let blue = new_blue_life - current_blue_life; - Event::Recharge { red, blue, skill } + if red == 0 && blue == 0 { + stages = EventStages::NoStages; + } + + (Event::Recharge { red, blue, skill }, stages) } 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 361bbbfa..812055b4 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -1410,18 +1410,7 @@ 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 = target.recharge(skill, red_amount, 0); - let stages = match e { - Event::Recharge { red, blue, skill: _ } => { - if red > 0 || blue > 0 { EventStages::PostOnly } - else { EventStages::NoStages } - } - _ => { - warn!("no recharge event found {:?}", e); - EventStages::NoStages - } - }; - + let (e, stages) = target.recharge(skill, red_amount, 0); results.push(Resolution::new(source, target).event(e).stages(stages)); return results; @@ -1432,17 +1421,7 @@ 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 = target.recharge(skill, red_amount, 0); - let stages = match e { - Event::Recharge { red, blue, skill: _ } => { - if red > 0 || blue > 0 { EventStages::PostOnly } - else { EventStages::NoStages } - } - _ => { - warn!("no recharge event found {:?}", e); - EventStages::NoStages - } - }; + let (e, stages) = target.recharge(skill, red_amount, 0); results.push(Resolution::new(source, target).event(e).stages(stages)); return results; @@ -1705,17 +1684,7 @@ 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 = target.recharge(skill, 0, blue_amount); - let stages = match e { - Event::Recharge { red, blue, skill: _ } => { - if red > 0 || blue > 0 { EventStages::PostOnly } - else { EventStages::NoStages } - } - _ => { - warn!("no recharge event found {:?}", e); - EventStages::NoStages - } - }; + let (e, stages) = target.recharge(skill, 0, blue_amount); results.push(Resolution::new(source, target).event(e).stages(stages)); return results;; } @@ -1755,35 +1724,16 @@ 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 = target.recharge(skill, 0, blue_amount); - let stages = match e { - Event::Recharge { red, blue, skill: _ } => { - if red > 0 || blue > 0 { EventStages::PostOnly } - else { EventStages::NoStages } - } - _ => { - warn!("no recharge event found {:?}", e); - EventStages::NoStages - } - }; + let (e, stages) = target.recharge(skill, 0, blue_amount); results.push(Resolution::new(source, target).event(e).stages(stages)); return results;; } fn recharge(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 red_amount = source.red_power().pct(skill.multiplier()); let blue_amount = source.blue_power().pct(skill.multiplier()); - let e = target.recharge(skill, red_amount, blue_amount); - let stages = match e { - Event::Recharge { red, blue, skill: _ } => { - if red > 0 || blue > 0 { EventStages::AllStages } - else { EventStages::StartEnd } - } - _ => { - warn!("no recharge event found {:?}", e); - EventStages::NoStages - } - }; + let (e, stages) = target.recharge(skill, red_amount, blue_amount); results.push(Resolution::new(source, target).event(e).stages(stages)); return results; } @@ -2195,6 +2145,7 @@ mod tests { let mut results = recharge(&mut x, &mut y, vec![], Skill::Recharge); + results.remove(0); let Resolution { source: _, target: _, event, stages: _ } = results.remove(0); match event { Event::Recharge { red, blue, skill: _ } => {