diff --git a/core/src/construct.rs b/core/src/construct.rs index d26a64b0..82b8f2e3 100644 --- a/core/src/construct.rs +++ b/core/src/construct.rs @@ -912,6 +912,53 @@ impl Construct { return removals; } + pub fn damage_trigger_casts(&mut self, cast: &Cast, event: &Event) -> Vec { + match event { + 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: _ } = + self.effects.iter().find(|e| e.effect == Effect::Electric).unwrap(); + + let skill = match meta { + Some(EffectMeta::Skill(s)) => s, + _ => panic!("no electrify skill"), + }; + + casts.push(Cast::new(self.id, self.account, cast.source, *skill)); + } + + // if self.affected(Effect::Absorb) { + // let ConstructEffect { effect, duration: _, meta, tick: _ } = + // self.effects.iter().find(|e| e.effect == Effect::Absorb).unwrap(); + + + // let skill = match meta { + // Some(EffectMeta::Skill(s)) => s, + // _ => panic!("no absorption skill"), + // }; + + // casts.push(Cast::new(self.id, self.account, self.id, *skill)); + // } + + if self.affected(Effect::Counter) && *colour == Colour::Red { + let ConstructEffect { effect: _, duration: _, meta, tick: _ } = + self.effects.iter().find(|e| e.effect == Effect::Counter).unwrap(); + + let skill = match meta { + Some(EffectMeta::Skill(s)) => s, + _ => panic!("no counter skill"), + }; + + casts.push(Cast::new(self.id, self.account, cast.source, *skill)); + } + + casts + } + _ => vec![], + } + } + // pub fn evade(&self, skill: Skill) -> Option { // if self.evasion.value == 0 { // return None; diff --git a/core/src/game.rs b/core/src/game.rs index 2f224a32..fb3606d8 100644 --- a/core/src/game.rs +++ b/core/src/game.rs @@ -546,58 +546,16 @@ impl Game { } fn event_reactions(&mut self, cast: &Cast, event: &Event) -> &mut Game { - match event { - Event::Damage { construct, colour, amount, mitigation, display: _ } => { - if self.construct_by_id(*construct).unwrap().affected(Effect::Electric) && !cast.skill.is_tick() { - let ConstructEffect { effect: _, duration: _, meta, tick: _ } = - self.construct_by_id(*construct).unwrap().effects.iter().find(|e| e.effect == Effect::Electric).unwrap().clone(); - - let skill = match meta { - Some(EffectMeta::Skill(s)) => s, - _ => panic!("no electrify skill"), - }; - - let source = construct; - let player = self.construct_by_id(*construct).unwrap().account; - let target = cast.source; - - self.resolve(Cast::new(*source, player, target, skill)); - } - - // if self.construct_by_id(*construct).unwrap().affected(Effect::Absorb) { - // let ConstructEffect { effect: _, duration: _, meta, tick: _ } = - // self.construct_by_id(*construct).unwrap().effects.iter().find(|e| e.effect == Effect::Absorb).unwrap().clone(); - - // let skill = match meta { - // Some(EffectMeta::Skill(s)) => s, - // _ => panic!("no absorption skill"), - // }; - - // let source = construct; - // let player = self.construct_by_id(*construct).unwrap().account; - // let target = cast.source; - - // self.resolve(Cast::new(*source, player, target, skill)); - // } - - if self.construct_by_id(*construct).unwrap().affected(Effect::Electric) && *colour == Colour::Red { - let ConstructEffect { effect: _, duration: _, meta, tick: _ } = - self.construct_by_id(*construct).unwrap().effects.iter().find(|e| e.effect == Effect::Counter).unwrap().clone(); - - let skill = match meta { - Some(EffectMeta::Skill(s)) => s, - _ => panic!("no counter skill"), - }; - - let source = construct; - let player = self.construct_by_id(*construct).unwrap().account; - let target = cast.source; - - self.resolve(Cast::new(*source, player, target, skill)); - } - }, - _ => (), + let casts = match event { + Event::Damage { construct, colour, amount, mitigation, display: _ } => + self.construct_by_id(*construct).unwrap().damage_trigger_casts(cast, event), + _ => vec![], }; + + for cast in casts { + self.resolve(cast); + } + self } @@ -616,9 +574,9 @@ impl Game { self.construct_by_id(*construct).unwrap().effects.len().pct(*mult), Value::ColourSkills { construct, colour, mult } => unimplemented!(), - self.construct_by_id(*construct).unwrap().skills.iter() - .filter(|ce| ce.) - .count(), + // self.construct_by_id(*construct).unwrap().skills.iter() + // .filter(|ce| ce.) + // .count(), Value::DamageTaken { construct, colour, mult } => events.iter().fold(0, |dmg, e| match e {