diff --git a/WORKLOG.md b/WORKLOG.md index ee4b4714..150a20d0 100644 --- a/WORKLOG.md +++ b/WORKLOG.md @@ -10,13 +10,6 @@ * clear active mtx after joining game -* Check results stack for whether a construct has ticked a dot already. Current issue E.g. - Construct 1 with slow speed applies siphon round 1 on Enemy Construct 1 - Construct 2 with fast speed applies siphon round 2 on Enemy Construct 2 - Siphon tick won't proc at all that turn - It assumes the dot has triggered already from existing dot from pre_resolve - Instead of checking a dot already exists instead search for a matching dot tick event in results - * mobile styles * mobile info page @@ -25,9 +18,6 @@ * can't reset password without knowing password =\ * Invert recharge - * serde serialize privatise - * chat - * Convert spec 'Plus' -> '+' when it appears as combo text in combiner and in info text ## SOON diff --git a/server/src/game.rs b/server/src/game.rs index af4746ed..0421ab65 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -377,9 +377,11 @@ impl Game { let mut sorted = self.stack.clone(); sorted.iter_mut() .for_each(|s| { - let caster = self.construct_by_id(s.source_construct_id).unwrap(); - let speed = caster.skill_speed(s.skill); - s.speed = speed; + if !s.skill.is_tick() { + let caster = self.construct_by_id(s.source_construct_id).unwrap(); + let speed = caster.skill_speed(s.skill); + s.speed = speed; + } }); sorted.sort_unstable_by_key(|s| s.speed); diff --git a/server/src/skill.rs b/server/src/skill.rs index 6431d39d..d4685c2a 100644 --- a/server/src/skill.rs +++ b/server/src/skill.rs @@ -384,7 +384,7 @@ impl Cast { source_player_id: source.account, target_construct_id: target.id, skill, - speed: 0, + speed: source.skill_speed(skill), } } @@ -1499,7 +1499,13 @@ fn heal(source: &mut Construct, target: &mut Construct, mut results: Resolutions } fn triage(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - let skip_tick = target.effects.iter().any(|e| e.effect == Effect::Triage); + let skip_tick = target.effects.iter().any(|e| { + match e.effect { + Effect::Triage => source.skill_speed(skill) <= e.tick.unwrap().speed, + _ => false, + } + }); + let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect()[0]; let tick_skill = match meta { Some(EffectMeta::Skill(s)) => s, @@ -1565,7 +1571,12 @@ fn decay(source: &mut Construct, target: &mut Construct, mut results: Resolution let wither = skill.effect()[0]; results.push(Resolution::new(source, target).event(target.add_effect(skill, wither))); - let skip_tick = target.effects.iter().any(|e| e.effect == Effect::Decay); + let skip_tick = target.effects.iter().any(|e| { + match e.effect { + Effect::Decay => source.skill_speed(skill) <= e.tick.unwrap().speed, + _ => false, + } + }); let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect()[1]; let tick_skill = match meta { Some(EffectMeta::Skill(s)) => s, @@ -1619,7 +1630,12 @@ fn electrocute(source: &mut Construct, target: &mut Construct, mut results: Reso _ => panic!("no electrocute tick skill"), }; - let skip_tick = target.effects.iter().any(|e| e.effect == Effect::Electrocute); + let skip_tick = target.effects.iter().any(|e| { + match e.effect { + Effect::Electrocute => source.skill_speed(skill) <= e.tick.unwrap().speed, + _ => false, + } + }); let electrocute = ConstructEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill)); results.push(Resolution::new(source, target) .event(target.add_effect(skill, electrocute)) @@ -1716,7 +1732,12 @@ fn recharge(source: &mut Construct, target: &mut Construct, mut results: Resolut fn siphon(source: &mut Construct, target: &mut Construct, mut results: Resolutions, skill: Skill) -> Resolutions { - let skip_tick = target.effects.iter().any(|e| e.effect == Effect::Siphon); + let skip_tick = target.effects.iter().any(|e| { + match e.effect { + Effect::Siphon => source.skill_speed(skill) <= e.tick.unwrap().speed, + _ => false, + } + }); let ConstructEffect { effect, duration, meta, tick: _ } = skill.effect()[0]; let tick_skill = match meta { Some(EffectMeta::Skill(s)) => s,