tick immunity effects

This commit is contained in:
ntr 2019-12-11 14:23:38 +10:00
parent 79f5e7e1be
commit 88237d3e5e
5 changed files with 282 additions and 204 deletions

View File

@ -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

View File

@ -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<EffectMeta>,
pub tick: Option<Cast>,
}
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<Skill> {
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"),
};

View File

@ -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,
}
}

View File

@ -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::<Vec<Cast>>();
// 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,
}));
}
}

View File

@ -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"),