reduced healing from decay, changed siphon

This commit is contained in:
Mashy 2019-05-02 11:54:32 +10:00
parent 39ace02d92
commit 5f6994a01a
2 changed files with 37 additions and 22 deletions

View File

@ -252,6 +252,7 @@ pub enum Effect {
Mesmerise,
Amplify,
Silence,
Wither, // Reduce green dmg (healing) taken
// corrupt is the buff that applies
// corruption the dmg debuff
@ -346,6 +347,8 @@ impl Effect {
Effect::Amplify => vec![Stat::BlueDamage],
Effect::Curse => vec![Stat::BlueDamageTaken],
Effect::Wither => vec![Stat::GreenDamageTaken],
Effect::Haste => vec![Stat::Speed],
Effect::Slow => vec![Stat::Speed],
@ -365,6 +368,8 @@ impl Effect {
Effect::Haste => value << 1,
Effect::Slow => value >> 1,
Effect::Wither => value >> 1,
Effect::Hatred => value + match meta {
Some(EffectMeta::AddedDamage(d)) => d,
_ => panic!("hatred meta not damage"),
@ -412,6 +417,7 @@ impl Effect {
Effect::Mesmerise => Category::Debuff,
Effect::Amplify => Category::Buff,
Effect::Silence => Category::Debuff,
Effect::Wither => Category::Debuff,
Effect::Corrupt => Category::Buff,
Effect::Corruption => Category::Debuff,
@ -555,9 +561,9 @@ impl Skill {
// Others
Skill::CorruptionTick => 80,
Skill::DecayTick => 60,
Skill::DecayTick => 25,
Skill::Riposte => 100,
Skill::SiphonTick => 100, // 1.0 to pass tests
Skill::SiphonTick => 30,
Skill::StrangleTick => 30,
Skill::TriageTick => 65,
_ => 100,
@ -647,7 +653,7 @@ impl Skill {
Skill::Invert => Some(2),
Skill::Decay => None, // dot
Skill::DecayTick => None,
Skill::Siphon => Some(1),
Skill::Siphon => None,
Skill::SiphonTick => None,
Skill::Curse => Some(1),
Skill::Empower => Some(1),
@ -958,13 +964,20 @@ fn empower(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill
fn slay(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions {
let amount = source.red_damage().pct(skill.multiplier());
target.deal_red_damage(skill, amount)
.into_iter()
.for_each(|e| results.push(Resolution::new(source, target).event(e)));
let slay_events = target.deal_red_damage(skill, amount);
source.deal_green_damage(skill, amount)
.into_iter()
.for_each(|e| results.push(Resolution::new(source, source).event(e)));
for e in slay_events {
match e {
Event::Damage { amount, mitigation: _, colour: _, skill: _ } => {
let heal = source.deal_green_damage(skill, amount);
results.push(Resolution::new(source, target).event(e));
for e in heal {
results.push(Resolution::new(source, source).event(e));
};
},
_ => results.push(Resolution::new(source, target).event(e)),
}
}
return results;
}
@ -1035,10 +1048,12 @@ fn slow(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: S
}
fn decay(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, skill: Skill) -> Resolutions {
let wither = CrypEffect::new(Effect::Wither, skill.duration());
let decay = CrypEffect::new(Effect::Decay, skill.duration())
.set_tick(Cast::new_tick(source, target, Skill::DecayTick));
results.push(Resolution::new(source, target).event(target.add_effect(skill, decay)));
results.push(Resolution::new(source, target).event(target.add_effect(skill, wither)));
return decay_tick(source, target, results, Skill::DecayTick);
}
@ -1140,14 +1155,13 @@ fn siphon_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, s
match e {
Event::Damage { amount, mitigation: _, colour: _, skill: _ } => {
let heal = source.deal_green_damage(Skill::Siphon, amount);
results.push(Resolution::new(source, target).event(e));
for e in heal {
results.push(Resolution::new(source, source).event(e));
};
},
_ => (),
_ => results.push(Resolution::new(source, target).event(e)),
}
results.push(Resolution::new(source, target).event(e));
}
return results;
@ -1371,7 +1385,7 @@ mod tests {
let mut results = resolve(Skill::Siphon, &mut x, &mut y, vec![]);
assert!(y.affected(Effect::Siphon));
assert!(x.green_life() == 768);
assert!(x.green_life() == (512 + 256.pct(Skill::SiphonTick.multiplier())));
let Resolution { source: _, target: _, event } = results.remove(0);
match event {
@ -1379,20 +1393,21 @@ mod tests {
_ => panic!("not siphon"),
};
let Resolution { source: _, target: _, event } = results.remove(0);
match event {
Event::Damage { amount, skill: _, mitigation: _, colour: _} => assert_eq!(amount, 256.pct(Skill::SiphonTick.multiplier())),
_ => panic!("not damage siphon"),
};
let Resolution { source: _, target, event } = results.remove(0);
match event {
Event::Healing { amount, skill: _, overhealing: _ } => {
assert_eq!(amount, 256);
assert_eq!(amount, 256.pct(Skill::SiphonTick.multiplier()));
assert_eq!(target.id, x.id);
},
_ => panic!("not healing"),
};
let Resolution { source: _, target: _, event } = results.remove(0);
match event {
Event::Damage { amount, skill: _, mitigation: _, colour: _} => assert_eq!(amount, 256),
_ => panic!("not damage siphon"),
};
}

View File

@ -359,7 +359,7 @@ fn get_combos() -> Vec<Combo> {
Combo { units: vec![Var::Debuff, Var::Green, Var::Green], var: Var::Purge },
Combo { units: vec![Var::Debuff, Var::Blue, Var::Blue], var: Var::Silence },
Combo { units: vec![Var::Debuff, Var::Red, Var::Green], var: Var::Slow },
Combo { units: vec![Var::Debuff, Var::Green, Var::Blue], var: Var::Siphon },
Combo { units: vec![Var::Debuff, Var::Green, Var::Blue], var: Var::Decay },
Combo { units: vec![Var::Debuff, Var::Red, Var::Blue], var: Var::Invert },
Combo { units: vec![Var::Block, Var::Red, Var::Red], var: Var::Parry },
@ -383,7 +383,7 @@ fn get_combos() -> Vec<Combo> {
Combo { units: vec![Var::Attack, Var::Green, Var::Green], var: Var::Heal },
Combo { units: vec![Var::Attack, Var::Blue, Var::Blue], var: Var::Blast },
Combo { units: vec![Var::Attack, Var::Red, Var::Green], var: Var::Slay },
Combo { units: vec![Var::Attack, Var::Green, Var::Blue], var: Var::Decay },
Combo { units: vec![Var::Attack, Var::Green, Var::Blue], var: Var::Siphon },
Combo { units: vec![Var::Attack, Var::Red, Var::Blue], var: Var::Chaos },
Combo { units: vec![Var::Damage, Var::Red, Var::Red], var: Var::RedDamageI },