diff --git a/server/src/skill.rs b/server/src/skill.rs index 175565f4..bca93410 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -52,9 +52,10 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio Skill::Empower => empower(source, target, resolutions), // increased phys damage Skill::Haste => haste(source, target, resolutions), // speed slow Skill::Heal => heal(source, target, resolutions), - Skill::Hex => hex(source, target, resolutions), // todo prevent casting + Skill::Hex => hex(source, target, resolutions), Skill::Hostility => hostility(source, target, resolutions), - Skill::Invert => invert(source, target, resolutions), // todo prevent casting + Skill::Invert => invert(source, target, resolutions), + Skill::Injure => injure(source, target, resolutions), Skill::Parry => parry(source, target, resolutions), Skill::Purge => purge(source, target, resolutions), // dispel all buffs Skill::Purify => purify(source, target, resolutions), // dispel all debuffs @@ -68,7 +69,7 @@ pub fn resolve(skill: Skill, source: &mut Cryp, target: &mut Cryp, mut resolutio Skill::SiphonTick => siphon_tick(source, target, resolutions), // hot Skill::Slay => unimplemented!(), Skill::Slow => slow(source, target, resolutions), // speed slow - Skill::Snare => snare(source, target, resolutions), // TODO prevent physical moves + Skill::Snare => snare(source, target, resolutions), Skill::Strangle => strangle(source, target, resolutions), Skill::StrangleTick => strangle_tick(source, target, resolutions), Skill::Strike => strike(source, target, resolutions), @@ -226,6 +227,7 @@ pub enum Effect { Blind, Snare, Clutch, + Injured, Reflect, @@ -289,6 +291,11 @@ impl Effect { Effect::Strangle => skill != Skill::StrangleTick, Effect::Strangling => true, Effect::Banish => true, + Effect::Injured => match skill.category() { + Category::Green => true, + Category::GreenTick => true, + _ => false, + }, _ => false, } } @@ -314,6 +321,7 @@ impl Effect { Effect::Ko => match skill.category() { Category::BlueTick => false, + Category::GreenTick => false, _ => true, }, _ => false, @@ -380,6 +388,7 @@ impl Effect { Effect::Clutch => Category::RedBuff, Effect::Taunt => Category::RedBuff, Effect::Empower => Category::RedBuff, + Effect::Injured => Category::RedDebuff, Effect::Strangle => Category::RedDebuff, Effect::Strangling => Category::RedBuff, @@ -428,6 +437,8 @@ impl Effect { Effect::Reflect => 1, + Effect::Injured => 2, + Effect::Strangle => 2, Effect::Strangling => 2, @@ -483,6 +494,7 @@ pub enum Category { BlueBuff, BlueTick, Green, + GreenTick, GreenDamage, GreenBuff, Ko, @@ -499,6 +511,7 @@ pub enum Skill { Parry, // avoid all damage Riposte, Snare, + Injure, Recharge, Reflect, @@ -607,6 +620,7 @@ impl Skill { Skill::StrangleTick => None, Skill::Clutch => Some(2), Skill::Taunt => Some(1), + Skill::Injure => Some(2), Skill::Corrupt => Some(1), Skill::CorruptionTick => None, @@ -628,39 +642,30 @@ impl Skill { match self { Skill::Attack => Category::Red, Skill::Strike => Category::Red, - + Skill::Injure => Category::Red, Skill::Strangle => Category::Red, Skill::StrangleTick => Category::Red, - - // ----------------- - // Nature - // ----------------- Skill::Block => Category::Red, // reduce damage Skill::Parry => Category::Red, // avoid all damage Skill::Riposte => Category::Red, // avoid all damage Skill::Snare => Category::Red, Skill::Clutch => Category::Red, - - - Skill::Stun => Category::Red, + Skill::Slay => Category::Red, + Skill::Taunt => Category::Red, - // ----------------- - // Technology - // ----------------- - - // ----------------- - // Preservation - // ----------------- - Skill::Heal => Category::Red, - Skill::Triage => Category::Blue, // hot - Skill::TriageTick => Category::BlueTick, // hot - Skill::Throw => Category::Red, // no damage stun, adds vulnerable - - // ----------------- - // Destruction - // ----------------- + Skill::Heal => Category::Green, + Skill::Triage => Category::Green, // hot + Skill::TriageTick => Category::GreenTick, // hot + Skill::Throw => Category::Green, + Skill::Empower => Category::Green, + Skill::Shield => Category::Green, + Skill::Purify => Category::Green, + Skill::Recharge => Category::Green, + Skill::Reflect => Category::Green, + Skill::Haste => Category::Green, Skill::Invert => Category::Green, + Skill::Blast => Category::Blue, Skill::Amplify => Category::Blue, Skill::Decay => Category::Blue, // dot @@ -668,35 +673,13 @@ impl Skill { Skill::Siphon => Category::Blue, Skill::SiphonTick => Category::BlueTick, // hot Skill::Curse => Category::Blue, - - // ----------------- - // Purity - // ----------------- - Skill::Empower => Category::Red, - Skill::Shield => Category::Blue, Skill::Silence => Category::Blue, - Skill::Purify => Category::Blue, Skill::Purge => Category::Blue, - - // ----------------- - // Chaos - // ----------------- Skill::Banish => Category::Blue, Skill::Hex => Category::Blue, - // Skill::Lag => 2, // - Skill::Haste => Category::Blue, Skill::Slow => Category::Blue, - - - // WRONG - Skill::Recharge => Category::Green, - Skill::Reflect => Category::Green, Skill::Ruin => Category::Blue, - Skill::Slay => Category::Red, - Skill::Taunt => Category::Red, - Skill::Hostility => Category::Blue, - Skill::Corrupt => Category::Blue, Skill::CorruptionTick => Category::Blue, @@ -804,6 +787,16 @@ fn strike(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions) -> Res return results; } +fn injure(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions) -> Resolutions { + let amount = source.red_damage(); + target.deal_red_damage(Skill::Injure, amount) + .into_iter() + .for_each(|e| results.push(Resolution::new(source, target).event(e))); + + let effect = CrypEffect::new(Effect::Injured); + results.push(Resolution::new(source, target).event(target.add_effect(Skill::Injure, effect))); + return results; +} fn stun(source: &mut Cryp, target: &mut Cryp, mut results: Resolutions) -> Resolutions { let effect = CrypEffect::new(Effect::Stun); @@ -1188,6 +1181,19 @@ mod tests { }; } + #[test] + fn injure_test() { + let mut x = Cryp::new() + .named(&"muji".to_string()); + + let mut y = Cryp::new() + .named(&"camel".to_string()); + + resolve(Skill::Injure, &mut x, &mut y, vec![]); + assert!(y.immune(Skill::Heal).is_some()); + // resolutions = heal(&mut y.clone(), &mut y, resolutions); + } + #[test] fn invert_test() { let mut x = Cryp::new()