diff --git a/client/src/utils.jsx b/client/src/utils.jsx index e6c52928..a5918fa7 100644 --- a/client/src/utils.jsx +++ b/client/src/utils.jsx @@ -218,6 +218,9 @@ function getCombatSequence(event) { if (['Immunity'].includes(event[0])) return ['START_SKILL', 'POST_SKILL']; if (['Healing'].includes(event[0]) && event[1].skill === 'Slay') return ['POST_SKILL']; + if (['Effect'].includes(event[0]) + && event[1].skill === 'Decay' && event[1].effect === 'Wither') return ['POST_SKILL']; + if (['Damage'].includes(event[0]) && event[1].skill === 'Chaos' && event[1].colour === 'RedDamage') return ['POST_SKILL']; diff --git a/server/src/skill.rs b/server/src/skill.rs index e04aa052..2e0418ff 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -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, @@ -645,9 +651,9 @@ impl Skill { Skill::Chaos => None, Skill::Amplify => Some(1), Skill::Invert => Some(2), - Skill::Decay => None, // dot + Skill::Decay => Some(1), // 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: _ } => { + results.push(Resolution::new(source, target).event(e)); + let heal = source.deal_green_damage(skill, amount); + for h in heal { + results.push(Resolution::new(source, source).event(h)); + }; + }, + _ => 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,12 +1155,12 @@ fn siphon_tick(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions, s match e { Event::Damage { amount, mitigation: _, colour: _, skill: _ } => { results.push(Resolution::new(source, target).event(e)); - let heal = source.deal_green_damage(Skill::Siphon, amount); + let heal = source.deal_green_damage(Skill::SiphonTick, amount); for h in heal { results.push(Resolution::new(source, source).event(h)); }; }, - _ => (), + _ => results.push(Resolution::new(source, target).event(e)), } } @@ -1370,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 { @@ -1380,14 +1395,14 @@ mod tests { let Resolution { source: _, target: _, event } = results.remove(0); match event { - Event::Damage { amount, skill: _, mitigation: _, colour: _} => assert_eq!(amount, 256), + 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"), diff --git a/server/src/vbox.rs b/server/src/vbox.rs index 1793a2e4..8c9946d0 100644 --- a/server/src/vbox.rs +++ b/server/src/vbox.rs @@ -359,7 +359,7 @@ fn get_combos() -> Vec { 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 { 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 },