cleaning up ugly recharge code

This commit is contained in:
Mashy 2019-11-07 11:23:08 +10:00
parent 2792061186
commit 241467ec48
2 changed files with 16 additions and 63 deletions

View File

@ -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<Event> {

View File

@ -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: _ } => {