From 88237d3e5e637b06c1368b6cd1e703a797fe64ce Mon Sep 17 00:00:00 2001 From: ntr Date: Wed, 11 Dec 2019 14:23:38 +1000 Subject: [PATCH] tick immunity effects --- core/fixme.md | 9 +- core/src/construct.rs | 28 ++- core/src/effect.rs | 15 +- core/src/game.rs | 39 +++-- core/src/skill.rs | 395 ++++++++++++++++++++++++------------------ 5 files changed, 282 insertions(+), 204 deletions(-) diff --git a/core/fixme.md b/core/fixme.md index 2aba1e61..82bbae82 100644 --- a/core/fixme.md +++ b/core/fixme.md @@ -1,25 +1,18 @@ # FIXME last round of animations skipped cause no skill phase to add new vec -ko constructs are still casting - check silence skill multiplier -check for ko in cast_modifier - tick skips for triage etc game ready not auto starting resolve phase -healing action remove immunity banish immunity aoe event cooldown events leak skills -hit event - reqs moving eventconstruct into specific events purify conditional healing -counter / absorb post resolve etc +absorb post resolve cooldown checking -> go through round and find all casters \ No newline at end of file diff --git a/core/src/construct.rs b/core/src/construct.rs index d3ba285a..b445cdf6 100644 --- a/core/src/construct.rs +++ b/core/src/construct.rs @@ -62,10 +62,9 @@ impl ConstructSkill { #[derive(Debug,Clone,Copy,PartialEq,Serialize,Deserialize)] pub enum EffectMeta { - Skill(Skill), - TickAmount(usize), + CastOnHit(Skill), // maybe needs source/target + CastTick { source: Uuid, target: Uuid, skill: Skill }, AddedDamage(usize), - LinkTarget(Uuid), Multiplier(usize), } @@ -74,17 +73,11 @@ pub struct ConstructEffect { pub effect: Effect, pub duration: u8, pub meta: Option, - pub tick: Option, } impl ConstructEffect { pub fn new(effect: Effect, duration: u8) -> ConstructEffect { - ConstructEffect { effect, duration, meta: None, tick: None } - } - - pub fn set_tick(mut self, tick: Cast) -> ConstructEffect { - self.tick = Some(tick); - self + ConstructEffect { effect, duration, meta: None } } pub fn set_meta(mut self, meta: EffectMeta) -> ConstructEffect { @@ -105,7 +98,8 @@ impl ConstructEffect { pub fn get_skill(&self) -> Option { match self.meta { - Some(EffectMeta::Skill(s)) => Some(s), + Some(EffectMeta::CastTick { source, target, skill }) => Some(skill), + Some(EffectMeta::CastOnHit(s)) => Some(s), _ => None, } @@ -731,7 +725,7 @@ impl Construct { let overhealing = modified_amount - healing; if healing != 0 { - events.push(Event::Healing { + events.push(Event::Healing { construct: self.id, amount: healing, overhealing, @@ -936,11 +930,11 @@ impl Construct { Event::Damage { construct: _, colour, amount: _, mitigation: _, display: _ } => { let mut casts = vec![]; if self.affected(Effect::Electric) && !cast.skill.is_tick() { - let ConstructEffect { effect: _, duration: _, meta, tick: _ } = + let ConstructEffect { effect: _, duration: _, meta } = self.effects.iter().find(|e| e.effect == Effect::Electric).unwrap(); let skill = match meta { - Some(EffectMeta::Skill(s)) => s, + Some(EffectMeta::CastOnHit(s)) => s, _ => panic!("no electrify skill"), }; @@ -948,7 +942,7 @@ impl Construct { } // if self.affected(Effect::Absorb) { - // let ConstructEffect { effect, duration: _, meta, tick: _ } = + // let ConstructEffect { effect, duration: _, meta } = // self.effects.iter().find(|e| e.effect == Effect::Absorb).unwrap(); @@ -961,11 +955,11 @@ impl Construct { // } if self.affected(Effect::Counter) && *colour == Colour::Red { - let ConstructEffect { effect: _, duration: _, meta, tick: _ } = + let ConstructEffect { effect: _, duration: _, meta } = self.effects.iter().find(|e| e.effect == Effect::Counter).unwrap(); let skill = match meta { - Some(EffectMeta::Skill(s)) => s, + Some(EffectMeta::CastOnHit(s)) => s, _ => panic!("no counter skill"), }; diff --git a/core/src/effect.rs b/core/src/effect.rs index c6b484f0..2edb6217 100644 --- a/core/src/effect.rs +++ b/core/src/effect.rs @@ -42,10 +42,15 @@ pub enum Effect { // effects over time Triage, - Decay, - Regen, - Siphon, + Triaged, // immunity + Decay, + Decayed, // immunity + + Siphon, + Siphoned, // immunity + + // Regen, // Airborne, // Boost // Bleed, @@ -193,10 +198,12 @@ impl Effect { // effects over time Effect::Triage => Some(Colour::Green), Effect::Decay => Some(Colour::Blue), - Effect::Regen => Some(Colour::Green), Effect::Siphon => Some(Colour::Blue), Effect::Pure => Some(Colour::Green), + Effect::Triaged => None, + Effect::Decayed => None, + Effect::Siphoned => None, Effect::Ko => None, } } diff --git a/core/src/game.rs b/core/src/game.rs index d0d66a71..19e1ce58 100644 --- a/core/src/game.rs +++ b/core/src/game.rs @@ -433,25 +433,21 @@ impl Game { |c| c.effects .iter() .cloned() - .filter_map(|e| e.tick) + .filter_map(|e| e.meta) + .filter_map(move |m| match m { + EffectMeta::CastTick { source, target, skill } => Some(Cast::new(source, c.account, target, skill)), + _ => None, + }) ).collect::>(); // add them to the stack self.stack.append(&mut ticks); - self.stack_sort_speed(); // temp vec of this round's resolving skills // because need to check cooldown use before pushing them into the complete list - let mut casters = vec![]; let mut r_animation_ms = 0; while let Some(cast) = self.stack.pop() { - // info!("{:} casts ", cast); - // if theres no resolution Resolutions, the skill didn't trigger (disable etc) - // if Resolutions.len() > 0 && cast.used_cooldown() { - // casters.push(cast); - // } - self.resolve(cast); // sort the stack again in case speeds have changed @@ -465,10 +461,9 @@ impl Game { res.set_delay(iter.peek()); r_animation_ms += res.delay; } - // info!("{:#?}", self.casts); // handle cooldowns and statuses - self.progress_durations(&casters); + // self.progress_durations(&casters); if self.finished() { return self.finish() @@ -1799,6 +1794,8 @@ mod tests { let last = game.resolutions.len() - 1; let resolutions = &game.resolutions[last]; + println!("{:?}", resolutions); + assert!(resolutions.iter().any(|r| match r.event { Event::Damage { construct, colour, amount, mitigation: _, display: _ } => construct == target && amount > 0 && colour == Colour::Blue, @@ -1811,4 +1808,24 @@ mod tests { _ => false, })); } + + #[test] + fn reflect_test() { + let mut game = create_2v2_test_game(); + let player_id = game.players[0].id; + let source = game.players[0].constructs[0].id; + let target = game.players[1].constructs[0].id; + + game.resolve(Cast::new(source, player_id, target, Skill::Reflect)); + game.resolve(Cast::new(source, player_id, target, Skill::Blast)); + + let last = game.resolutions.len() - 1; + let resolutions = &game.resolutions[last]; + + assert!(resolutions.iter().any(|r| match r.event { + Event::Damage { construct, colour, amount, mitigation: _, display: _ } => + construct == source && amount > 0 && colour == Colour::Blue, + _ => false, + })); + } } diff --git a/core/src/skill.rs b/core/src/skill.rs index a50ad547..390d1ff0 100644 --- a/core/src/skill.rs +++ b/core/src/skill.rs @@ -75,28 +75,28 @@ impl Cast { Skill::Block => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Block, duration: 1, meta: Some(EffectMeta::Multiplier(35)), tick: None }, + effect: ConstructEffect { effect: Effect::Block, duration: 1, meta: Some(EffectMeta::Multiplier(35)) }, }, ], Skill::Buff => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Buff, duration: 3, meta: Some(EffectMeta::Multiplier(130)), tick: None }, + effect: ConstructEffect { effect: Effect::Buff, duration: 3, meta: Some(EffectMeta::Multiplier(130)) }, }, ], Skill::Debuff => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Slow, duration: 3, meta: Some(EffectMeta::Multiplier(50)), tick: None }, + effect: ConstructEffect { effect: Effect::Slow, duration: 3, meta: Some(EffectMeta::Multiplier(50)) }, }, ], Skill::Stun => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Stun, duration: 2, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Stun, duration: 2, meta: None }, }, ], @@ -104,26 +104,26 @@ impl Cast { Skill::Amplify => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Amplify, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None }, + effect: ConstructEffect { effect: Effect::Amplify, duration: 2, meta: Some(EffectMeta::Multiplier(150)) }, }, ], Skill::AmplifyPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Amplify, duration: 3, meta: Some(EffectMeta::Multiplier(175)), tick: None }, + effect: ConstructEffect { effect: Effect::Amplify, duration: 3, meta: Some(EffectMeta::Multiplier(175)) }, }, ], Skill::AmplifyPlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Amplify, duration: 4, meta: Some(EffectMeta::Multiplier(200)), tick: None }, + effect: ConstructEffect { effect: Effect::Amplify, duration: 4, meta: Some(EffectMeta::Multiplier(200)) }, }, ], Skill::Absorb => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Absorb, duration: 1, meta: Some(EffectMeta::Skill(Skill::Absorption)), tick: None }, + effect: ConstructEffect { effect: Effect::Absorb, duration: 1, meta: Some(EffectMeta::CastOnHit(Skill::Absorption)) }, }, Action::Heal { construct: self.target, @@ -134,7 +134,7 @@ impl Cast { Skill::AbsorbPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Absorb, duration: 1, meta: Some(EffectMeta::Skill(Skill::AbsorptionPlus)), tick: None }, + effect: ConstructEffect { effect: Effect::Absorb, duration: 1, meta: Some(EffectMeta::CastOnHit(Skill::AbsorptionPlus)) }, }, Action::Heal { construct: self.target, @@ -145,7 +145,7 @@ impl Cast { Skill::AbsorbPlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Absorb, duration: 1, meta: Some(EffectMeta::Skill(Skill::AbsorptionPlusPlus)), tick: None }, + effect: ConstructEffect { effect: Effect::Absorb, duration: 1, meta: Some(EffectMeta::CastOnHit(Skill::AbsorptionPlusPlus)) }, }, Action::Heal { construct: self.target, @@ -160,7 +160,7 @@ impl Cast { }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Absorption, duration: 3, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Absorption, duration: 3, meta: None }, }, ], Skill::AbsorptionPlus => vec![ @@ -170,7 +170,7 @@ impl Cast { }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Absorption, duration: 4, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Absorption, duration: 4, meta: None }, }, ], Skill::AbsorptionPlusPlus => vec![ @@ -180,7 +180,7 @@ impl Cast { }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Absorption, duration: 5, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Absorption, duration: 5, meta: None }, }, ], @@ -223,7 +223,7 @@ impl Cast { }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Banish, duration: 2, meta: None, tick: None } + effect: ConstructEffect { effect: Effect::Banish, duration: 2, meta: None } } ], @@ -240,7 +240,7 @@ impl Cast { }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Stun, duration: 2, meta: None, tick: None } + effect: ConstructEffect { effect: Effect::Stun, duration: 2, meta: None } }, Action::IncreaseCooldowns { construct: self.target, @@ -261,50 +261,50 @@ impl Cast { Skill::Break => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Stun, duration: 1, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Stun, duration: 1, meta: None }, }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Vulnerable, duration: 3, meta: Some(EffectMeta::Multiplier(150)), tick: None, }, + effect: ConstructEffect { effect: Effect::Vulnerable, duration: 3, meta: Some(EffectMeta::Multiplier(150)), }, }, ], Skill::BreakPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Stun, duration: 1, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Stun, duration: 1, meta: None }, }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Vulnerable, duration: 4, meta: Some(EffectMeta::Multiplier(175)), tick: None, }, + effect: ConstructEffect { effect: Effect::Vulnerable, duration: 4, meta: Some(EffectMeta::Multiplier(175)), }, }, ], Skill::BreakPlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Stun, duration: 2, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Stun, duration: 2, meta: None }, }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Vulnerable, duration: 4, meta: Some(EffectMeta::Multiplier(200)), tick: None, }, + effect: ConstructEffect { effect: Effect::Vulnerable, duration: 4, meta: Some(EffectMeta::Multiplier(200)), }, }, ], Skill::Curse => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Curse, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None }, + effect: ConstructEffect { effect: Effect::Curse, duration: 2, meta: Some(EffectMeta::Multiplier(150)) }, }, ], Skill::CursePlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Curse, duration: 2, meta: Some(EffectMeta::Multiplier(175)), tick: None }, + effect: ConstructEffect { effect: Effect::Curse, duration: 2, meta: Some(EffectMeta::Multiplier(175)) }, }, ], Skill::CursePlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Curse, duration: 3, meta: Some(EffectMeta::Multiplier(200)), tick: None }, + effect: ConstructEffect { effect: Effect::Curse, duration: 3, meta: Some(EffectMeta::Multiplier(200)) }, }, ], @@ -332,19 +332,19 @@ impl Cast { Skill::Counter => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Counter, duration: 1, meta: Some(EffectMeta::Skill(Skill::CounterAttack)), tick: None }, + effect: ConstructEffect { effect: Effect::Counter, duration: 1, meta: Some(EffectMeta::CastOnHit(Skill::CounterAttack)) }, }, ], Skill::CounterPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Counter, duration: 1, meta: Some(EffectMeta::Skill(Skill::CounterAttackPlus)), tick: None }, + effect: ConstructEffect { effect: Effect::Counter, duration: 1, meta: Some(EffectMeta::CastOnHit(Skill::CounterAttackPlus)) }, }, ], Skill::CounterPlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Counter, duration: 1, meta: Some(EffectMeta::Skill(Skill::CounterAttackPlusPlus)), tick: None }, + effect: ConstructEffect { effect: Effect::Counter, duration: 1, meta: Some(EffectMeta::CastOnHit(Skill::CounterAttackPlusPlus)) }, }, ], Skill::CounterAttack | @@ -360,31 +360,49 @@ impl Cast { Skill::Decay => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Wither, duration: 3, meta: Some(EffectMeta::Multiplier(50)), tick: None }, + effect: ConstructEffect { effect: Effect::Wither, duration: 3, meta: Some(EffectMeta::Multiplier(50)) }, }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Decay, duration: 2, meta: Some(EffectMeta::Skill(Skill::DecayTick)), tick: None }, + effect: ConstructEffect { effect: Effect::Decay, duration: 2, meta: + Some(EffectMeta::CastTick { source: self.source, target: self.target, skill: Skill::DecayTick }) }, + }, + Action::Damage { + construct: self.target, + colour: Colour::Blue, + values: vec![Value::Stat { construct: self.source, stat: Stat::BluePower, mult: self.skill.multiplier() }], }, ], Skill::DecayPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Wither, duration: 3, meta: Some(EffectMeta::Multiplier(35)), tick: None }, + effect: ConstructEffect { effect: Effect::Wither, duration: 3, meta: Some(EffectMeta::Multiplier(35)) }, }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Decay, duration: 4, meta: Some(EffectMeta::Skill(Skill::DecayTickPlus)), tick: None }, + effect: ConstructEffect { effect: Effect::Decay, duration: 4, meta: + Some(EffectMeta::CastTick { source: self.source, target: self.target, skill: Skill::DecayTickPlus }) }, + }, + Action::Damage { + construct: self.target, + colour: Colour::Blue, + values: vec![Value::Stat { construct: self.source, stat: Stat::BluePower, mult: self.skill.multiplier() }], }, ], Skill::DecayPlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Wither, duration: 4, meta: Some(EffectMeta::Multiplier(20)), tick: None }, + effect: ConstructEffect { effect: Effect::Wither, duration: 4, meta: Some(EffectMeta::Multiplier(20)) }, }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Decay, duration: 4, meta: Some(EffectMeta::Skill(Skill::DecayTickPlusPlus)), tick: None }, + effect: ConstructEffect { effect: Effect::Decay, duration: 4, meta: + Some(EffectMeta::CastTick { source: self.source, target: self.target, skill: Skill::DecayTickPlusPlus }) }, + }, + Action::Damage { + construct: self.target, + colour: Colour::Blue, + values: vec![Value::Stat { construct: self.source, stat: Stat::BluePower, mult: self.skill.multiplier() }], }, ], Skill::DecayTick | @@ -395,24 +413,28 @@ impl Cast { colour: Colour::Blue, values: vec![Value::Stat { construct: self.source, stat: Stat::BluePower, mult: self.skill.multiplier() }], }, + Action::Effect { + construct: self.target, + effect: ConstructEffect { effect: Effect::Decayed, duration: 1, meta: None }, // immunity to additional ticks + }, ], Skill::Electrify=> vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Electric, duration: 1, meta: Some(EffectMeta::Skill(Skill::Electrocute)), tick: None }, + effect: ConstructEffect { effect: Effect::Electric, duration: 1, meta: Some(EffectMeta::CastOnHit(Skill::Electrocute)) }, }, ], Skill::ElectrifyPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Electric, duration: 1, meta: Some(EffectMeta::Skill(Skill::ElectrocutePlus)), tick: None }, + effect: ConstructEffect { effect: Effect::Electric, duration: 1, meta: Some(EffectMeta::CastOnHit(Skill::ElectrocutePlus)) }, }, ], Skill::ElectrifyPlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Electric, duration: 1, meta: Some(EffectMeta::Skill(Skill::ElectrocutePlusPlus)), tick: None }, + effect: ConstructEffect { effect: Effect::Electric, duration: 1, meta: Some(EffectMeta::CastOnHit(Skill::ElectrocutePlusPlus)) }, }, ], Skill::Electrocute => vec![ @@ -422,7 +444,8 @@ impl Cast { }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Electric, duration: 2, meta: Some(EffectMeta::Skill(Skill::ElectrocuteTick)), tick: None }, + effect: ConstructEffect { effect: Effect::Electric, duration: 2, meta: + Some(EffectMeta::CastTick { source: self.source, target: self.target, skill: Skill::ElectrocuteTick }) }, }, ], Skill::ElectrocutePlus => vec![ @@ -432,7 +455,8 @@ impl Cast { }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Electric, duration: 3, meta: Some(EffectMeta::Skill(Skill::ElectrocuteTickPlus)), tick: None }, + effect: ConstructEffect { effect: Effect::Electric, duration: 3, meta: + Some(EffectMeta::CastTick { source: self.source, target: self.target, skill: Skill::ElectrocuteTickPlus }) }, }, ], Skill::ElectrocutePlusPlus => vec![ @@ -442,7 +466,8 @@ impl Cast { }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Electric, duration: 4, meta: Some(EffectMeta::Skill(Skill::ElectrocuteTickPlusPlus)), tick: None }, + effect: ConstructEffect { effect: Effect::Electric, duration: 4, meta: + Some(EffectMeta::CastTick { source: self.source, target: self.target, skill: Skill::ElectrocuteTickPlusPlus }) }, }, ], Skill::ElectrocuteTick | @@ -468,38 +493,38 @@ impl Cast { Skill::Haste => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Haste, duration: 3, meta: Some(EffectMeta::Multiplier(150)), tick: None }, + effect: ConstructEffect { effect: Effect::Haste, duration: 3, meta: Some(EffectMeta::Multiplier(150)) }, }, ], Skill::HastePlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Haste, duration: 3, meta: Some(EffectMeta::Multiplier(175)), tick: None }, + effect: ConstructEffect { effect: Effect::Haste, duration: 3, meta: Some(EffectMeta::Multiplier(175)) }, }, ], Skill::HastePlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Haste, duration: 3, meta: Some(EffectMeta::Multiplier(225)), tick: None }, + effect: ConstructEffect { effect: Effect::Haste, duration: 3, meta: Some(EffectMeta::Multiplier(225)) }, }, ], Skill::Hybrid => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Hybrid, duration: 3, meta: Some(EffectMeta::Multiplier(150)), tick: None }, + effect: ConstructEffect { effect: Effect::Hybrid, duration: 3, meta: Some(EffectMeta::Multiplier(150)) }, }, ], Skill::HybridPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Hybrid, duration: 4, meta: Some(EffectMeta::Multiplier(175)), tick: None }, + effect: ConstructEffect { effect: Effect::Hybrid, duration: 4, meta: Some(EffectMeta::Multiplier(175)) }, }, ], Skill::HybridPlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Hybrid, duration: 5, meta: Some(EffectMeta::Multiplier(200)), tick: None }, + effect: ConstructEffect { effect: Effect::Hybrid, duration: 5, meta: Some(EffectMeta::Multiplier(200)) }, }, ], @@ -508,7 +533,7 @@ impl Cast { Skill::InterceptPlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Intercept, duration: 1, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Intercept, duration: 1, meta: None }, }, Action::Heal { construct: self.target, @@ -520,19 +545,19 @@ impl Cast { Skill::Invert => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Invert, duration: 2, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Invert, duration: 2, meta: None }, }, ], Skill::InvertPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Invert, duration: 3, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Invert, duration: 3, meta: None }, }, ], Skill::InvertPlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Invert, duration: 4, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Invert, duration: 4, meta: None }, }, ], @@ -541,7 +566,7 @@ impl Cast { Skill::LinkPlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Stun, duration: 1, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Stun, duration: 1, meta: None }, }, Action::Damage { construct: self.target, @@ -558,7 +583,7 @@ impl Cast { }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Purge, duration: 2, meta: None, tick: None } + effect: ConstructEffect { effect: Effect::Purge, duration: 2, meta: None } }, ], Skill::PurgePlus => vec![ @@ -567,7 +592,7 @@ impl Cast { }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Purge, duration: 3, meta: None, tick: None } + effect: ConstructEffect { effect: Effect::Purge, duration: 3, meta: None } }, ], Skill::PurgePlusPlus => vec![ @@ -576,7 +601,7 @@ impl Cast { }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Purge, duration: 4, meta: None, tick: None } + effect: ConstructEffect { effect: Effect::Purge, duration: 4, meta: None } }, ], @@ -594,7 +619,7 @@ impl Cast { }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Pure, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None } + effect: ConstructEffect { effect: Effect::Pure, duration: 2, meta: Some(EffectMeta::Multiplier(150)) } }, ], Skill::PurifyPlus => vec![ @@ -611,7 +636,7 @@ impl Cast { }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Pure, duration: 2, meta: Some(EffectMeta::Multiplier(175)), tick: None } + effect: ConstructEffect { effect: Effect::Pure, duration: 2, meta: Some(EffectMeta::Multiplier(175)) } }, ], Skill::PurifyPlusPlus => vec![ @@ -628,7 +653,7 @@ impl Cast { }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Pure, duration: 2, meta: Some(EffectMeta::Multiplier(200)), tick: None } + effect: ConstructEffect { effect: Effect::Pure, duration: 2, meta: Some(EffectMeta::Multiplier(200)) } }, ], @@ -652,7 +677,7 @@ impl Cast { Skill::ReflectPlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Reflect, duration: 1, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Reflect, duration: 1, meta: None }, }, Action::Heal { construct: self.target, @@ -666,7 +691,7 @@ impl Cast { Skill::RestrictPlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Restrict, duration: 2, meta: None, tick: None } + effect: ConstructEffect { effect: Effect::Restrict, duration: 2, meta: None } }, Action::Damage { construct: self.target, @@ -686,7 +711,7 @@ impl Cast { }, Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Stun, duration: 1, meta: None, tick: None } + effect: ConstructEffect { effect: Effect::Stun, duration: 1, meta: None } } ], @@ -694,19 +719,37 @@ impl Cast { Skill::Siphon => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Siphon, duration: 2, meta: Some(EffectMeta::Skill(Skill::SiphonTick)), tick: None }, + effect: ConstructEffect { effect: Effect::Siphon, duration: 2, meta: + Some(EffectMeta::CastTick { source: self.source, target: self.target, skill: Skill::SiphonTick }) }, + }, + Action::Damage { + construct: self.target, + colour: Colour::Blue, + values: vec![Value::Stat { construct: self.source, stat: Stat::BluePower, mult: self.skill.multiplier() }], }, ], Skill::SiphonPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Siphon, duration: 3, meta: Some(EffectMeta::Skill(Skill::SiphonTickPlus)), tick: None }, + effect: ConstructEffect { effect: Effect::Siphon, duration: 3, meta: + Some(EffectMeta::CastTick { source: self.source, target: self.target, skill: Skill::SiphonTickPlus }) }, + }, + Action::Damage { + construct: self.target, + colour: Colour::Blue, + values: vec![Value::Stat { construct: self.source, stat: Stat::BluePower, mult: self.skill.multiplier() }], }, ], Skill::SiphonPlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Siphon, duration: 4, meta: Some(EffectMeta::Skill(Skill::SiphonTickPlusPlus)), tick: None }, + effect: ConstructEffect { effect: Effect::Siphon, duration: 4, meta: + Some(EffectMeta::CastTick { source: self.source, target: self.target, skill: Skill::SiphonTickPlusPlus }) }, + }, + Action::Damage { + construct: self.target, + colour: Colour::Blue, + values: vec![Value::Stat { construct: self.source, stat: Stat::BluePower, mult: self.skill.multiplier() }], }, ], Skill::SiphonTick | @@ -718,10 +761,14 @@ impl Cast { values: vec![Value::Stat { construct: self.source, stat: Stat::BluePower, mult: self.skill.multiplier() }], }, Action::Heal { - construct: self.target, + construct: self.source, colour: Colour::Green, values: vec![Value::DamageReceived { construct: self.target, colour: Colour::Blue, mult: 100 }], }, + Action::Effect { + construct: self.target, + effect: ConstructEffect { effect: Effect::Siphoned, duration: 1, meta: None }, // immunity to additional ticks + }, ], Skill::Slay | @@ -742,7 +789,7 @@ impl Cast { Skill::Sleep => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Stun, duration: 2, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Stun, duration: 2, meta: None }, }, Action::Heal { construct: self.target, @@ -753,7 +800,7 @@ impl Cast { Skill::SleepPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Stun, duration: 2, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Stun, duration: 2, meta: None }, }, Action::Heal { construct: self.target, @@ -764,7 +811,7 @@ impl Cast { Skill::SleepPlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Stun, duration: 2, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Stun, duration: 2, meta: None }, }, Action::Heal { construct: self.target, @@ -778,7 +825,7 @@ impl Cast { Skill::SilencePlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Silence, duration: 2, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Silence, duration: 2, meta: None }, }, Action::Damage { construct: self.target, @@ -805,7 +852,7 @@ impl Cast { Skill::SustainPlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Sustain, duration: 1, meta: None, tick: None }, + effect: ConstructEffect { effect: Effect::Sustain, duration: 1, meta: None }, }, Action::Heal { construct: self.target, @@ -817,19 +864,37 @@ impl Cast { Skill::Triage => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Triage, duration: 2, meta: Some(EffectMeta::Skill(Skill::TriageTick)), tick: None }, + effect: ConstructEffect { effect: Effect::Triage, duration: 2, meta: + Some(EffectMeta::CastTick { source: self.source, target: self.target, skill: Skill::TriageTick }) }, + }, + Action::Heal { + construct: self.target, + colour: Colour::Green, + values: vec![Value::Stat { construct: self.source, stat: Stat::GreenPower, mult: self.skill.multiplier() }], }, ], Skill::TriagePlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Triage, duration: 3, meta: Some(EffectMeta::Skill(Skill::TriageTickPlus)), tick: None }, + effect: ConstructEffect { effect: Effect::Triage, duration: 3, meta: + Some(EffectMeta::CastTick { source: self.source, target: self.target, skill: Skill::TriageTickPlus }) }, + }, + Action::Heal { + construct: self.target, + colour: Colour::Green, + values: vec![Value::Stat { construct: self.source, stat: Stat::GreenPower, mult: self.skill.multiplier() }], }, ], Skill::TriagePlusPlus => vec![ Action::Effect { construct: self.target, - effect: ConstructEffect { effect: Effect::Triage, duration: 4, meta: Some(EffectMeta::Skill(Skill::TriageTickPlusPlus)), tick: None }, + effect: ConstructEffect { effect: Effect::Triage, duration: 4, meta: + Some(EffectMeta::CastTick { source: self.source, target: self.target, skill: Skill::TriageTickPlusPlus }) }, + }, + Action::Heal { + construct: self.target, + colour: Colour::Green, + values: vec![Value::Stat { construct: self.source, stat: Stat::GreenPower, mult: self.skill.multiplier() }], }, ], Skill::TriageTick | @@ -840,6 +905,10 @@ impl Cast { colour: Colour::Green, values: vec![Value::Stat { construct: self.source, stat: Stat::GreenPower, mult: self.skill.multiplier() }], }, + Action::Effect { + construct: self.target, + effect: ConstructEffect { effect: Effect::Triaged, duration: 1, meta: None }, + }, ], // _ => unimplemented!(), @@ -851,8 +920,6 @@ impl Cast { } } -fn end() {} - // pub fn dev_resolve(a_id: Uuid, b_id: Uuid, skill: Skill) { // let mut resolutions =vec![]; @@ -1219,167 +1286,167 @@ impl Skill { match self { // Modifiers Skill::Amplify => vec![ConstructEffect { effect: Effect::Amplify, duration: 2, - meta: Some(EffectMeta::Multiplier(150)), tick: None }], + meta: Some(EffectMeta::Multiplier(150)) }], Skill::AmplifyPlus => vec![ConstructEffect { effect: Effect::Amplify, duration: 3, - meta: Some(EffectMeta::Multiplier(175)), tick: None }], + meta: Some(EffectMeta::Multiplier(175)) }], Skill::AmplifyPlusPlus => vec![ConstructEffect { effect: Effect::Amplify, duration: 4, - meta: Some(EffectMeta::Multiplier(200)), tick: None }], + meta: Some(EffectMeta::Multiplier(200)) }], - Skill::Banish => vec![ConstructEffect { effect: Effect::Banish, duration: 2, meta: None, tick: None }], - Skill::BanishPlus => vec![ConstructEffect { effect: Effect::Banish, duration: 2, meta: None, tick: None }], - Skill::BanishPlusPlus => vec![ConstructEffect { effect: Effect::Banish, duration: 2, meta: None, tick: None }], + Skill::Banish => vec![ConstructEffect { effect: Effect::Banish, duration: 2, meta: None }], + Skill::BanishPlus => vec![ConstructEffect { effect: Effect::Banish, duration: 2, meta: None }], + Skill::BanishPlusPlus => vec![ConstructEffect { effect: Effect::Banish, duration: 2, meta: None }], Skill::Block => vec![ConstructEffect { effect: Effect::Block, duration: 1, - meta: Some(EffectMeta::Multiplier(35)), tick: None }], + meta: Some(EffectMeta::Multiplier(35)) }], Skill::Buff => vec![ConstructEffect { effect: Effect::Buff, duration: 3, - meta: Some(EffectMeta::Multiplier(130)), tick: None }], + meta: Some(EffectMeta::Multiplier(130)) }], Skill::Electrify => vec![ConstructEffect { effect: Effect::Electric, duration: 1, - meta: Some(EffectMeta::Skill(Skill::Electrocute)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::Electrocute)) }], Skill::ElectrifyPlus => vec![ConstructEffect { effect: Effect::Electric, duration: 1, - meta: Some(EffectMeta::Skill(Skill::ElectrocutePlus)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::ElectrocutePlus)) }], Skill::ElectrifyPlusPlus => vec![ConstructEffect { effect: Effect::Electric, duration: 1, - meta: Some(EffectMeta::Skill(Skill::ElectrocutePlusPlus)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::ElectrocutePlusPlus)) }], Skill::Electrocute => vec![ConstructEffect { effect: Effect::Electrocute, duration: 2, - meta: Some(EffectMeta::Skill(Skill::ElectrocuteTick)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::ElectrocuteTick)) }], Skill::ElectrocutePlus => vec![ConstructEffect { effect: Effect::Electrocute, duration: 3, - meta: Some(EffectMeta::Skill(Skill::ElectrocuteTickPlus)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::ElectrocuteTickPlus)) }], Skill::ElectrocutePlusPlus => vec![ConstructEffect { effect: Effect::Electrocute, duration: 4, - meta: Some(EffectMeta::Skill(Skill::ElectrocuteTickPlusPlus)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::ElectrocuteTickPlusPlus)) }], - Skill::Sustain => vec![ConstructEffect { effect: Effect::Sustain, duration: 1, meta: None, tick: None }], - Skill::SustainPlus => vec![ConstructEffect { effect: Effect::Sustain, duration: 1, meta: None, tick: None }], - Skill::SustainPlusPlus => vec![ConstructEffect { effect: Effect::Sustain, duration: 1, meta: None, tick: None }], + Skill::Sustain => vec![ConstructEffect { effect: Effect::Sustain, duration: 1, meta: None }], + Skill::SustainPlus => vec![ConstructEffect { effect: Effect::Sustain, duration: 1, meta: None }], + Skill::SustainPlusPlus => vec![ConstructEffect { effect: Effect::Sustain, duration: 1, meta: None }], Skill::Curse => vec![ConstructEffect { effect: Effect::Curse, duration: 2, - meta: Some(EffectMeta::Multiplier(150)), tick: None }], + meta: Some(EffectMeta::Multiplier(150)) }], Skill::CursePlus => vec![ConstructEffect { effect: Effect::Curse, duration: 2, - meta: Some(EffectMeta::Multiplier(175)), tick: None }], + meta: Some(EffectMeta::Multiplier(175)) }], Skill::CursePlusPlus => vec![ConstructEffect { effect: Effect::Curse, duration: 3, - meta: Some(EffectMeta::Multiplier(200)), tick: None }], + meta: Some(EffectMeta::Multiplier(200)) }], Skill::Debuff => vec![ConstructEffect { effect: Effect::Slow, duration: 3, - meta: Some(EffectMeta::Multiplier(50)), tick: None }], + meta: Some(EffectMeta::Multiplier(50)) }], Skill::Decay => vec![ConstructEffect { effect: Effect::Wither, duration: 3, - meta: Some(EffectMeta::Multiplier(50)), tick: None }, + meta: Some(EffectMeta::Multiplier(50)) }, ConstructEffect { effect: Effect::Decay, duration: 3, - meta: Some(EffectMeta::Skill(Skill::DecayTick)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::DecayTick)) }], Skill::DecayPlus => vec![ConstructEffect { effect: Effect::Wither, duration: 3, - meta: Some(EffectMeta::Multiplier(35)), tick: None }, + meta: Some(EffectMeta::Multiplier(35)) }, ConstructEffect { effect: Effect::Decay, duration: 3, - meta: Some(EffectMeta::Skill(Skill::DecayTickPlus)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::DecayTickPlus)) }], Skill::DecayPlusPlus => vec![ConstructEffect { effect: Effect::Wither, duration: 4, - meta: Some(EffectMeta::Multiplier(20)), tick: None }, + meta: Some(EffectMeta::Multiplier(20)) }, ConstructEffect { effect: Effect::Decay, duration: 4, - meta: Some(EffectMeta::Skill(Skill::DecayTickPlusPlus)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::DecayTickPlusPlus)) }], Skill::Haste => vec![ConstructEffect { effect: Effect::Haste, duration: 3, - meta: Some(EffectMeta::Multiplier(150)), tick: None }], + meta: Some(EffectMeta::Multiplier(150)) }], Skill::HastePlus => vec![ConstructEffect { effect: Effect::Haste, duration: 4, - meta: Some(EffectMeta::Multiplier(175)), tick: None }], + meta: Some(EffectMeta::Multiplier(175)) }], Skill::HastePlusPlus => vec![ConstructEffect { effect: Effect::Haste, duration: 5, - meta: Some(EffectMeta::Multiplier(225)), tick: None }], + meta: Some(EffectMeta::Multiplier(225)) }], Skill::Absorb => vec![ConstructEffect { effect: Effect::Absorb, duration: 1, - meta: Some(EffectMeta::Skill(Skill::Absorption)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::Absorption)) }], Skill::AbsorbPlus => vec![ConstructEffect { effect: Effect::Absorb, duration: 1, - meta: Some(EffectMeta::Skill(Skill::AbsorptionPlus)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::AbsorptionPlus)) }], Skill::AbsorbPlusPlus => vec![ConstructEffect { effect: Effect::Absorb, duration: 1, - meta: Some(EffectMeta::Skill(Skill::AbsorptionPlusPlus)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::AbsorptionPlusPlus)) }], - Skill::Absorption => vec![ConstructEffect { effect: Effect::Absorption, duration: 3, meta: None, tick: None }], - Skill::AbsorptionPlus => vec![ConstructEffect { effect: Effect::Absorption, duration: 4, meta: None, tick: None }], - Skill::AbsorptionPlusPlus => vec![ConstructEffect { effect: Effect::Absorption, duration: 5, meta: None, tick: None }], + Skill::Absorption => vec![ConstructEffect { effect: Effect::Absorption, duration: 3, meta: None }], + Skill::AbsorptionPlus => vec![ConstructEffect { effect: Effect::Absorption, duration: 4, meta: None }], + Skill::AbsorptionPlusPlus => vec![ConstructEffect { effect: Effect::Absorption, duration: 5, meta: None }], Skill::Hybrid => vec![ConstructEffect { effect: Effect::Hybrid, duration: 3, - meta: Some(EffectMeta::Multiplier(150)), tick: None }], + meta: Some(EffectMeta::Multiplier(150)) }], Skill::HybridPlus => vec![ConstructEffect { effect: Effect::Hybrid, duration: 4, - meta: Some(EffectMeta::Multiplier(175)), tick: None }], + meta: Some(EffectMeta::Multiplier(175)) }], Skill::HybridPlusPlus => vec![ConstructEffect { effect: Effect::Hybrid, duration: 5, - meta: Some(EffectMeta::Multiplier(200)), tick: None }], + meta: Some(EffectMeta::Multiplier(200)) }], - Skill::Invert => vec![ConstructEffect { effect: Effect::Invert, duration: 2, meta: None, tick: None }], - Skill::InvertPlus => vec![ConstructEffect { effect: Effect::Invert, duration: 3, meta: None, tick: None }], - Skill::InvertPlusPlus => vec![ConstructEffect { effect: Effect::Invert, duration: 4, meta: None, tick: None }], + Skill::Invert => vec![ConstructEffect { effect: Effect::Invert, duration: 2, meta: None }], + Skill::InvertPlus => vec![ConstructEffect { effect: Effect::Invert, duration: 3, meta: None }], + Skill::InvertPlusPlus => vec![ConstructEffect { effect: Effect::Invert, duration: 4, meta: None }], Skill::Counter => vec![ConstructEffect { effect: Effect::Counter, duration: 1, - meta: Some(EffectMeta::Skill(Skill::CounterAttack)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::CounterAttack)) }], Skill::CounterPlus => vec![ConstructEffect { effect: Effect::Counter, duration: 1, - meta: Some(EffectMeta::Skill(Skill::CounterAttackPlus)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::CounterAttackPlus)) }], Skill::CounterPlusPlus => vec![ConstructEffect { effect: Effect::Counter, duration: 1, - meta: Some(EffectMeta::Skill(Skill::CounterAttackPlusPlus)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::CounterAttackPlusPlus)) }], - Skill::Reflect => vec![ConstructEffect { effect: Effect::Reflect, duration: 1, meta: None, tick: None }], - Skill::ReflectPlus => vec![ConstructEffect { effect: Effect::Reflect, duration: 1, meta: None, tick: None }], - Skill::ReflectPlusPlus => vec![ConstructEffect { effect: Effect::Reflect, duration: 1, meta: None, tick: None }], + Skill::Reflect => vec![ConstructEffect { effect: Effect::Reflect, duration: 1, meta: None }], + Skill::ReflectPlus => vec![ConstructEffect { effect: Effect::Reflect, duration: 1, meta: None }], + Skill::ReflectPlusPlus => vec![ConstructEffect { effect: Effect::Reflect, duration: 1, meta: None }], - Skill::Break => vec![ConstructEffect { effect: Effect::Stun, duration: 1, meta: None, tick: None }, + Skill::Break => vec![ConstructEffect { effect: Effect::Stun, duration: 1, meta: None }, ConstructEffect { effect: Effect::Vulnerable, duration: 3, - meta: Some(EffectMeta::Multiplier(150)), tick: None }], - Skill::BreakPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 1, meta: None, tick: None }, + meta: Some(EffectMeta::Multiplier(150)) }], + Skill::BreakPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 1, meta: None }, ConstructEffect { effect: Effect::Vulnerable, duration: 4, - meta: Some(EffectMeta::Multiplier(175)), tick: None }], - Skill::BreakPlusPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 2, meta: None, tick: None }, + meta: Some(EffectMeta::Multiplier(175)) }], + Skill::BreakPlusPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 2, meta: None }, ConstructEffect { effect: Effect::Vulnerable, duration: 4, - meta: Some(EffectMeta::Multiplier(200)), tick: None }], + meta: Some(EffectMeta::Multiplier(200)) }], - Skill::Ruin => vec![ConstructEffect { effect: Effect::Stun, duration: 1, meta: None, tick: None }], - Skill::RuinPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 1, meta: None, tick: None }], - Skill::RuinPlusPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 1, meta: None, tick: None }], + Skill::Ruin => vec![ConstructEffect { effect: Effect::Stun, duration: 1, meta: None }], + Skill::RuinPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 1, meta: None }], + Skill::RuinPlusPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 1, meta: None }], - Skill::Purge => vec![ConstructEffect { effect: Effect::Purge, duration: 2, meta: None, tick: None }], - Skill::PurgePlus => vec![ConstructEffect { effect: Effect::Purge, duration: 3, meta: None, tick: None }], - Skill::PurgePlusPlus => vec![ConstructEffect { effect: Effect::Purge, duration: 4, meta: None, tick: None }], + Skill::Purge => vec![ConstructEffect { effect: Effect::Purge, duration: 2, meta: None }], + Skill::PurgePlus => vec![ConstructEffect { effect: Effect::Purge, duration: 3, meta: None }], + Skill::PurgePlusPlus => vec![ConstructEffect { effect: Effect::Purge, duration: 4, meta: None }], - Skill::Link => vec![ConstructEffect { effect: Effect::Stun, duration: 1, meta: None, tick: None }], - Skill::LinkPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 1, meta: None, tick: None }], - Skill::LinkPlusPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 1, meta: None, tick: None }], + Skill::Link => vec![ConstructEffect { effect: Effect::Stun, duration: 1, meta: None }], + Skill::LinkPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 1, meta: None }], + Skill::LinkPlusPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 1, meta: None }], - Skill::Silence => vec![ConstructEffect { effect: Effect::Silence, duration: 2, meta: None, tick: None }], - Skill::SilencePlus => vec![ConstructEffect { effect: Effect::Silence, duration: 2, meta: None, tick: None }], - Skill::SilencePlusPlus => vec![ConstructEffect { effect: Effect::Silence, duration: 2, meta: None, tick: None }], + Skill::Silence => vec![ConstructEffect { effect: Effect::Silence, duration: 2, meta: None }], + Skill::SilencePlus => vec![ConstructEffect { effect: Effect::Silence, duration: 2, meta: None }], + Skill::SilencePlusPlus => vec![ConstructEffect { effect: Effect::Silence, duration: 2, meta: None }], Skill::Siphon => vec![ConstructEffect { effect: Effect::Siphon, duration: 2, - meta: Some(EffectMeta::Skill(Skill::SiphonTick)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::SiphonTick)) }], Skill::SiphonPlus => vec![ConstructEffect { effect: Effect::Siphon, duration: 3, - meta: Some(EffectMeta::Skill(Skill::SiphonTickPlus)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::SiphonTickPlus)) }], Skill::SiphonPlusPlus => vec![ConstructEffect { effect: Effect::Siphon, duration: 4, - meta: Some(EffectMeta::Skill(Skill::SiphonTickPlusPlus)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::SiphonTickPlusPlus)) }], - Skill::Sleep => vec![ConstructEffect { effect: Effect::Stun, duration: 2, meta: None, tick: None }], - Skill::SleepPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 3, meta: None, tick: None }], - Skill::SleepPlusPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 4, meta: None, tick: None }], + Skill::Sleep => vec![ConstructEffect { effect: Effect::Stun, duration: 2, meta: None }], + Skill::SleepPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 3, meta: None }], + Skill::SleepPlusPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 4, meta: None }], - Skill::Restrict => vec![ConstructEffect { effect: Effect::Restrict, duration: 2, meta: None, tick: None }], - Skill::RestrictPlus => vec![ConstructEffect { effect: Effect::Restrict, duration: 2, meta: None, tick: None }], - Skill::RestrictPlusPlus => vec![ConstructEffect { effect: Effect::Restrict, duration: 2, meta: None, tick: None }], + Skill::Restrict => vec![ConstructEffect { effect: Effect::Restrict, duration: 2, meta: None }], + Skill::RestrictPlus => vec![ConstructEffect { effect: Effect::Restrict, duration: 2, meta: None }], + Skill::RestrictPlusPlus => vec![ConstructEffect { effect: Effect::Restrict, duration: 2, meta: None }], Skill::Bash => vec![ConstructEffect { effect: Effect::Stun, duration: 2, - meta: Some(EffectMeta::Skill(Skill::Bash)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::Bash)) }], Skill::BashPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 2, - meta: Some(EffectMeta::Skill(Skill::BashPlus)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::BashPlus)) }], Skill::BashPlusPlus => vec![ConstructEffect { effect: Effect::Stun, duration: 2, - meta: Some(EffectMeta::Skill(Skill::BashPlusPlus)), tick: None }], - Skill::Stun => vec![ConstructEffect { effect: Effect::Stun, duration: 2, meta: None, tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::BashPlusPlus)) }], + Skill::Stun => vec![ConstructEffect { effect: Effect::Stun, duration: 2, meta: None }], - Skill::Intercept => vec![ConstructEffect { effect: Effect::Intercept, duration: 1, meta: None, tick: None }], - Skill::InterceptPlus => vec![ConstructEffect { effect: Effect::Intercept, duration: 1, meta: None, tick: None }], - Skill::InterceptPlusPlus => vec![ConstructEffect { effect: Effect::Intercept, duration: 1, meta: None, tick: None }], + Skill::Intercept => vec![ConstructEffect { effect: Effect::Intercept, duration: 1, meta: None }], + Skill::InterceptPlus => vec![ConstructEffect { effect: Effect::Intercept, duration: 1, meta: None }], + Skill::InterceptPlusPlus => vec![ConstructEffect { effect: Effect::Intercept, duration: 1, meta: None }], Skill::Triage => vec![ConstructEffect { effect: Effect::Triage, duration: 2, - meta: Some(EffectMeta::Skill(Skill::TriageTick)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::TriageTick)) }], Skill::TriagePlus => vec![ConstructEffect { effect: Effect::Triage, duration: 3, - meta: Some(EffectMeta::Skill(Skill::TriageTickPlus)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::TriageTickPlus)) }], Skill::TriagePlusPlus => vec![ConstructEffect { effect: Effect::Triage, duration: 4, - meta: Some(EffectMeta::Skill(Skill::TriageTickPlusPlus)), tick: None }], + meta: Some(EffectMeta::CastOnHit(Skill::TriageTickPlusPlus)) }], Skill::Purify => vec![ConstructEffect { effect: Effect::Pure, duration: 2, - meta: Some(EffectMeta::Multiplier(150)), tick: None }], + meta: Some(EffectMeta::Multiplier(150)) }], Skill::PurifyPlus => vec![ConstructEffect { effect: Effect::Pure, duration: 2, - meta: Some(EffectMeta::Multiplier(175)), tick: None }], + meta: Some(EffectMeta::Multiplier(175)) }], Skill::PurifyPlusPlus => vec![ConstructEffect { effect: Effect::Pure, duration: 2, - meta: Some(EffectMeta::Multiplier(200)), tick: None }], + meta: Some(EffectMeta::Multiplier(200)) }], _ => { panic!("{:?} no skill effect", self); @@ -2184,7 +2251,7 @@ mod tests { // let ConstructEffect { effect: _, duration: _, meta, tick: _ } = target.effects.iter() // .find(|e| e.effect == Effect::Electric).unwrap().clone(); // match meta { - // Some(EffectMeta::Skill(s)) => { + // Some(EffectMeta::CastOnHit(s)) => { // // Gurad against reflect overflow // if !(source.affected(Effect::Reflect) && target.affected(Effect::Reflect)) { // // Check reflect don't bother if electrocute is procing on death @@ -2205,7 +2272,7 @@ mod tests { // let ConstructEffect { effect: _, duration: _, meta, tick: _ } = target.effects.iter() // .find(|e| e.effect == Effect::Absorb).unwrap().clone(); // match meta { - // Some(EffectMeta::Skill(s)) => { + // Some(EffectMeta::CastOnHit(s)) => { // absorption(&mut source, &mut target, resolutions, skill, amount + mitigation, s); // }, // _ => panic!("no absorb skill"), @@ -2216,7 +2283,7 @@ mod tests { // let ConstructEffect { effect: _, duration: _, meta, tick: _ } = target.effects.iter() // .find(|e| e.effect == Effect::Counter).unwrap().clone(); // match meta { - // Some(EffectMeta::Skill(s)) => { + // Some(EffectMeta::CastOnHit(s)) => { // counter_attack(&mut target, &mut source, resolutions, s); // }, // _ => panic!("no counter skill"),