electrocute dot immunity

This commit is contained in:
Mashy 2020-01-06 17:35:22 +10:00
parent 133a4929aa
commit 4f9385e352
3 changed files with 73 additions and 26 deletions

View File

@ -32,6 +32,7 @@ pub enum Effect {
// electrocute the dmg debuff // electrocute the dmg debuff
Electric, Electric,
Electrocute, Electrocute,
Electrocuted,
// absorbtion is the buff // absorbtion is the buff
// absorb is the increased damage // absorb is the increased damage
@ -75,28 +76,32 @@ impl Effect {
match self { match self {
Effect::Banish => true, Effect::Banish => true,
// these provide immunity for the ticks
// the base skills will still resolve
// but they have early return checks
// to ensure the effect is reapplied but damage is not
Effect::Siphoned => [
Skill::SiphonTick,
].contains(&skill),
Effect::Decayed => [
Skill::DecayTick,
].contains(&skill),
Effect::Triaged => [
Skill::TriageTick,
].contains(&skill),
Effect::Countered => [ Effect::Countered => [
Skill::CounterAttack, Skill::CounterAttack,
Skill::CounterAttackPlus, Skill::CounterAttackPlus,
Skill::CounterAttackPlusPlus, Skill::CounterAttackPlusPlus,
].contains(&skill), ].contains(&skill),
// these provide immunity for the ticks
// the base skills will still resolve
// but they have early return checks
// to ensure the effect is reapplied but damage is not
Effect::Decayed => [
Skill::DecayTick,
].contains(&skill),
Effect::Electrocuted => [
Skill::ElectrocuteTick,
].contains(&skill),
Effect::Siphoned => [
Skill::SiphonTick,
].contains(&skill),
Effect::Triaged => [
Skill::TriageTick,
].contains(&skill),
_ => false, _ => false,
} }
} }
@ -106,10 +111,11 @@ impl Effect {
// and not included in counts // and not included in counts
pub fn hidden(&self) -> bool { pub fn hidden(&self) -> bool {
match self { match self {
Effect::Siphoned => true,
Effect::Decayed => true,
Effect::Triaged => true,
Effect::Countered => true, Effect::Countered => true,
Effect::Decayed => true,
Effect::Electrocuted => true,
Effect::Siphoned => true,
Effect::Triaged => true,
_ => false, _ => false,
} }
} }

View File

@ -2260,6 +2260,31 @@ mod tests {
construct == source && amount > 0 && colour == Colour::Blue, construct == source && amount > 0 && colour == Colour::Blue,
_ => false, _ => false,
})); }));
game.resolve(Cast::new(source, player_id, target, Skill::Electrify));
game.resolve(Cast::new(source, player_id, target, Skill::Blast));
let last = game.resolutions.len() - 1;
let resolutions = &game.resolutions[last];
let electrocute_dmg_events = resolutions.iter().filter(|r| match r.event {
Event::Damage { construct: _, colour: _, amount: _, mitigation: _, display: _ } => match r.skill {
Skill::Electrocute => true,
_ => false
},
_ => false,
}).count();
let effect_events = resolutions.iter().filter(|r| match r.event {
Event::Effect { construct, effect, duration: _, display: _ } =>
construct == source && effect == Effect::Electrocute,
_ => false,
}).count();
assert!(effect_events == 2);
assert!(electrocute_dmg_events == 1); // second electrocute application deals no damage
} }
#[test] #[test]

View File

@ -1689,6 +1689,8 @@ fn electrocute(cast: Cast, game: &mut Game, values: Electrocute) {
Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::ElectrocuteTick, speed: cast.speed, amount }) }, Some(EffectMeta::CastTick { source: cast.source, target: cast.target, skill: Skill::ElectrocuteTick, speed: cast.speed, amount }) },
}, },
); );
if !game.affected(cast.target, Effect::Electrocuted) {
game.action(cast, game.action(cast,
Action::Damage { Action::Damage {
construct: cast.target, construct: cast.target,
@ -1696,6 +1698,13 @@ fn electrocute(cast: Cast, game: &mut Game, values: Electrocute) {
amount, amount,
}, },
); );
game.action(cast,
Action::Effect {
construct: cast.target,
effect: ConstructEffect { effect: Effect::Electrocuted, duration: 1, meta: None }, // immunity to additional ticks
},
);
}
game.action(cast, game.action(cast,
Action::Remove { Action::Remove {
@ -1713,6 +1722,13 @@ fn electrocute_tick(cast: Cast, game: &mut Game) {
amount: game.value(Value::TickDamage { construct: cast.target, effect: Effect::Electrocute }), amount: game.value(Value::TickDamage { construct: cast.target, effect: Effect::Electrocute }),
}, },
); );
game.action(cast,
Action::Effect {
construct: cast.target,
effect: ConstructEffect { effect: Effect::Electrocuted, duration: 1, meta: None }, // immunity to additional ticks
},
);
} }
#[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)] #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)]