invert recharge, fix recharge border

This commit is contained in:
Mashy 2019-11-07 12:25:13 +10:00
parent e01de8273e
commit 558e3be124
5 changed files with 94 additions and 38 deletions

View File

@ -8,8 +8,6 @@
* mobile info page * mobile info page
* Invert recharge
## SOON ## SOON
* supporter gold name in instance (anyone whos put any money into game) * supporter gold name in instance (anyone whos put any money into game)

View File

@ -8,33 +8,33 @@ module.exports = {
Slay: () => 'red-green-border', Slay: () => 'red-green-border',
Siphon: () => 'blue-green-border', Siphon: () => 'blue-green-border',
// Stun // Stun
Link: () => 'blue-green-border',
Bash: () => 'red-border', Bash: () => 'red-border',
Sleep: () => 'green-border',
Ruin: () => 'blue-border', Ruin: () => 'blue-border',
Break: () => 'red-green-border', Sleep: () => 'green-border',
Banish: () => 'red-blue-border', Banish: () => 'red-blue-border',
Break: () => 'red-green-border',
Link: () => 'blue-green-border',
// Block // Block
Counter: () => 'red-border', Counter: () => 'red-border',
Purify: () => 'green-border',
Electrify: () => 'blue-border', Electrify: () => 'blue-border',
Purify: () => 'green-border',
Recharge: () => 'red-blue-border',
Sustain: () => 'red-green-border', Sustain: () => 'red-green-border',
Reflect: () => 'blue-green-border', Reflect: () => 'blue-green-border',
Recharge: () => 'blue-red-border',
// Buff // Buff
Intercept: () => 'red-border', Intercept: () => 'red-border',
Triage: () => 'green-border',
Haste: () => 'red-green-border',
Absorb: () => 'blue-border', Absorb: () => 'blue-border',
Hybrid: () => 'blue-green-border', Triage: () => 'green-border',
Amplify: () => 'red-blue-border', Amplify: () => 'red-blue-border',
Haste: () => 'red-green-border',
Hybrid: () => 'blue-green-border',
// Debuff // Debuff
Restrict: () => 'red-border', Restrict: () => 'red-border',
Purge: () => 'green-border',
Silence: () => 'blue-border', Silence: () => 'blue-border',
Purge: () => 'green-border',
Curse: () => 'red-blue-border',
Invert: () => 'red-green-border', Invert: () => 'red-green-border',
Decay: () => 'blue-green-border', Decay: () => 'blue-green-border',
Curse: () => 'red-blue-border',
// // Lifes Upgrades // // Lifes Upgrades
// LifeGG: () => 'green-border', // LifeGG: () => 'green-border',

View File

@ -7,7 +7,7 @@ use postgres::transaction::Transaction;
use failure::Error; use failure::Error;
use failure::err_msg; use failure::err_msg;
use skill::{Skill, Cast, Immunity, Disable, Event, EventStages}; use skill::{Skill, Cast, Immunity, Disable, Event};
use effect::{Cooldown, Effect, Colour}; use effect::{Cooldown, Effect, Colour};
use spec::{Spec}; use spec::{Spec};
use item::{Item}; use item::{Item};
@ -549,32 +549,93 @@ impl Construct {
} }
} }
pub fn recharge(&mut self, skill: Skill, red_amount: u64, blue_amount: u64) -> Vec<(Event, EventStages)> { pub fn recharge(&mut self, skill: Skill, red_amount: u64, blue_amount: u64) -> Vec<Event> {
let mut events = vec![]; let mut events = vec![];
// Should red type immunity block recharge??? // Should red type immunity block recharge???
let mut stages = EventStages::PostOnly;
if let Some(immunity) = self.immune(skill) { if let Some(immunity) = self.immune(skill) {
events.push((Event::Immunity { skill, immunity }, stages)); events.push(Event::Immunity { skill, immunity });
return events; return events;
} }
// Do we need inversion? match self.affected(Effect::Invert) {
let current_red_life = self.red_life(); false => {
self.red_life.increase(red_amount); // Do we need inversion?
let new_red_life = self.red_life.value; let current_red_life = self.red_life();
let red = new_red_life - current_red_life; self.red_life.increase(red_amount);
let new_red_life = self.red_life.value;
let red = new_red_life - current_red_life;
let current_blue_life = self.blue_life(); let current_blue_life = self.blue_life();
self.blue_life.increase(blue_amount); self.blue_life.increase(blue_amount);
let new_blue_life = self.blue_life.value; let new_blue_life = self.blue_life.value;
let blue = new_blue_life - current_blue_life; let blue = new_blue_life - current_blue_life;
if red == 0 && blue == 0 { if red != 0 || blue != 0 {
stages = EventStages::NoStages; events.push(Event::Recharge { red, blue, skill });
}
},
true => {
// Recharge takes a red and blue amount so check for them
if red_amount != 0 {
let red_mods = self.effects.iter()
.filter(|e| e.effect.modifications().contains(&Stat::RedDamageTaken))
.map(|e| (e.effect, e.meta))
.collect::<Vec<(Effect, Option<EffectMeta>)>>();
let red_modified_power = red_mods.iter()
.fold(red_amount, |acc, fx| fx.0.apply(acc, fx.1));
let red_remainder = red_modified_power.saturating_sub(self.red_life.value);
let red_mitigation = red_modified_power.saturating_sub(red_remainder);
// reduce red_life by mitigation amount
self.red_life.reduce(red_remainder);
// deal remainder to green_life
let red_current_green_life = self.green_life();
self.reduce_green_life(red_remainder);
let red_amount = red_current_green_life - self.green_life();
events.push(Event::Damage {
skill,
amount: red_amount,
mitigation: red_mitigation,
colour: Colour::Red
});
}
if blue_amount != 0 {
let blue_mods = self.effects.iter()
.filter(|e| e.effect.modifications().contains(&Stat::BlueDamageTaken))
.map(|e| (e.effect, e.meta))
.collect::<Vec<(Effect, Option<EffectMeta>)>>();
let blue_modified_power = blue_mods.iter()
.fold(blue_amount, |acc, fx| fx.0.apply(acc, fx.1));
let blue_remainder = blue_modified_power.saturating_sub(self.blue_life.value);
let blue_mitigation = blue_modified_power.saturating_sub(blue_remainder);
// reduce blue_life by mitigation amount
self.blue_life.reduce(blue_remainder);
// deal remainder to green_life
let blue_current_green_life = self.green_life();
self.reduce_green_life(blue_remainder);
let blue_amount = blue_current_green_life - self.green_life();
events.push(Event::Damage {
skill,
amount: blue_amount,
mitigation: blue_mitigation,
colour: Colour::Blue
});
}
}
} }
events.push((Event::Recharge { red, blue, skill }, stages));
return events; return events;
} }

View File

@ -1429,7 +1429,7 @@ mod tests {
game = game.resolve_phase_start(); game = game.resolve_phase_start();
assert!(game.resolved.len() == 5); assert!(game.resolved.len() == 4);
while let Some(r) = game.resolved.pop() { while let Some(r) = game.resolved.pop() {
let Resolution { source , target, event: _, stages: _ } = r; let Resolution { source , target, event: _, stages: _ } = r;
if [i_construct.id, j_construct.id].contains(&source.id) { if [i_construct.id, j_construct.id].contains(&source.id) {

View File

@ -433,8 +433,6 @@ pub enum EventStages {
EndOnly, // Skip Anim Skip EndOnly, // Skip Anim Skip
#[serde(rename = "POST_SKILL")] #[serde(rename = "POST_SKILL")]
PostOnly, // Skip Skip Anim PostOnly, // Skip Skip Anim
#[serde(rename = "")]
NoStages, // Skip Skip Skip
} }
#[derive(Debug,Clone,PartialEq,Serialize,Deserialize)] #[derive(Debug,Clone,PartialEq,Serialize,Deserialize)]
@ -490,7 +488,6 @@ impl Resolution {
EventStages::EndPost => target_duration + post_skill, // Skip Anim Anim EventStages::EndPost => target_duration + post_skill, // Skip Anim Anim
EventStages::EndOnly => target_duration, // Skip Anim Skip EventStages::EndOnly => target_duration, // Skip Anim Skip
EventStages::PostOnly => post_skill, // Skip Skip Anim EventStages::PostOnly => post_skill, // Skip Skip Anim
EventStages::NoStages => 0, // Skip Skip Skip
} }
} }
} }
@ -1413,7 +1410,7 @@ fn sustain(source: &mut Construct, target: &mut Construct, mut results: Resoluti
let red_amount = source.red_power().pct(skill.multiplier()); let red_amount = source.red_power().pct(skill.multiplier());
target.recharge(skill, red_amount, 0) target.recharge(skill, red_amount, 0)
.into_iter() .into_iter()
.for_each(|(e, stages)| results.push(Resolution::new(source, target).event(e).stages(stages))); .for_each(|e| results.push(Resolution::new(source, target).event(e).stages(EventStages::PostOnly)));
return results; return results;
} }
@ -1425,7 +1422,7 @@ fn intercept(source: &mut Construct, target: &mut Construct, mut results: Resolu
let red_amount = source.red_power().pct(skill.multiplier()); let red_amount = source.red_power().pct(skill.multiplier());
target.recharge(skill, red_amount, 0) target.recharge(skill, red_amount, 0)
.into_iter() .into_iter()
.for_each(|(e, stages)| results.push(Resolution::new(source, target).event(e).stages(stages))); .for_each(|e| results.push(Resolution::new(source, target).event(e).stages(EventStages::PostOnly)));
return results; return results;
} }
@ -1689,7 +1686,7 @@ fn absorb(source: &mut Construct, target: &mut Construct, mut results: Resolutio
let blue_amount = source.blue_power().pct(skill.multiplier()); let blue_amount = source.blue_power().pct(skill.multiplier());
target.recharge(skill, 0, blue_amount) target.recharge(skill, 0, blue_amount)
.into_iter() .into_iter()
.for_each(|(e, stages)| results.push(Resolution::new(source, target).event(e).stages(stages))); .for_each(|e| results.push(Resolution::new(source, target).event(e).stages(EventStages::PostOnly)));
return results;; return results;;
} }
@ -1730,7 +1727,7 @@ fn reflect(source: &mut Construct, target: &mut Construct, mut results: Resoluti
let blue_amount = source.blue_power().pct(skill.multiplier()); let blue_amount = source.blue_power().pct(skill.multiplier());
target.recharge(skill, 0, blue_amount) target.recharge(skill, 0, blue_amount)
.into_iter() .into_iter()
.for_each(|(e, stages)| results.push(Resolution::new(source, target).event(e).stages(stages))); .for_each(|e| results.push(Resolution::new(source, target).event(e).stages(EventStages::PostOnly)));
return results;; return results;;
} }
@ -1741,7 +1738,7 @@ fn recharge(source: &mut Construct, target: &mut Construct, mut results: Resolut
let blue_amount = source.blue_power().pct(skill.multiplier()); let blue_amount = source.blue_power().pct(skill.multiplier());
target.recharge(skill, red_amount, blue_amount) target.recharge(skill, red_amount, blue_amount)
.into_iter() .into_iter()
.for_each(|(e, stages)| results.push(Resolution::new(source, target).event(e).stages(stages))); .for_each(|e| results.push(Resolution::new(source, target).event(e).stages(EventStages::PostOnly)));
return results; return results;
} }