bring in damage trigger casts

This commit is contained in:
ntr 2019-12-10 11:48:46 +10:00
parent 61870b69ac
commit 1c24ab02bc
2 changed files with 59 additions and 54 deletions

View File

@ -912,6 +912,53 @@ impl Construct {
return removals;
}
pub fn damage_trigger_casts(&mut self, cast: &Cast, event: &Event) -> Vec<Cast> {
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<Event> {
// if self.evasion.value == 0 {
// return None;

View File

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