From 69692da9deec4c2a3967475a7ea912dfba4bafb3 Mon Sep 17 00:00:00 2001 From: ntr Date: Mon, 9 Dec 2019 15:14:09 +1000 Subject: [PATCH] more skills --- core/src/game.rs | 4 + core/src/skill.rs | 217 +++++++++++++++++++++++++++++++--------------- 2 files changed, 149 insertions(+), 72 deletions(-) diff --git a/core/src/game.rs b/core/src/game.rs index 0483edb3..cdef9edf 100644 --- a/core/src/game.rs +++ b/core/src/game.rs @@ -508,6 +508,9 @@ impl Game { Value::Cooldowns { construct, mult } => unimplemented!(), + Value::Effects { construct, mult } => + self.construct_by_id(*construct).unwrap().effects.len().pct(*mult), + Value::ColourSkills { construct, colour, mult } => unimplemented!(), Value::DamageTaken { construct, colour, mult } => @@ -887,6 +890,7 @@ pub enum Value { Fixed { value: usize }, Cooldowns { construct: Uuid, mult: usize }, ColourSkills { construct: Uuid, colour: Colour, mult: usize }, + Effects { construct: Uuid, mult: usize }, DamageTaken { construct: Uuid, colour: Colour, mult: usize }, // Skills { construct: Uuid, colour: Colour }, } diff --git a/core/src/skill.rs b/core/src/skill.rs index e4e12d18..56859273 100644 --- a/core/src/skill.rs +++ b/core/src/skill.rs @@ -288,6 +288,25 @@ impl Cast { }, ], + Skill::Curse => vec![ + Action::Effect { + construct: self.target, + effect: ConstructEffect { effect: Effect::Curse, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None }, + }, + ], + Skill::CursePlus => vec![ + Action::Effect { + construct: self.target, + effect: ConstructEffect { effect: Effect::Curse, duration: 2, meta: Some(EffectMeta::Multiplier(175)), tick: None }, + }, + ], + Skill::CursePlusPlus => vec![ + Action::Effect { + construct: self.target, + effect: ConstructEffect { effect: Effect::Curse, duration: 3, meta: Some(EffectMeta::Multiplier(200)), tick: None }, + }, + ], + Skill::Chaos | Skill::ChaosPlus | Skill::ChaosPlusPlus => vec![ @@ -367,6 +386,15 @@ impl Cast { effect: ConstructEffect { effect: Effect::Decay, duration: 4, meta: Some(EffectMeta::Skill(Skill::DecayTickPlusPlus)), tick: None }, }, ], + Skill::DecayTick | + Skill::DecayTickPlus | + Skill::DecayTickPlusPlus => vec![ + Action::Damage { + construct: self.target, + colour: Colour::Blue, + values: vec![Value::Stat { construct: self.source, stat: Stat::BluePower, mult: self.skill.multiplier() }], + }, + ], Skill::Electrify=> vec![ Action::Effect { @@ -455,6 +483,25 @@ impl Cast { }, ], + Skill::Hybrid => vec![ + Action::Effect { + construct: self.target, + effect: ConstructEffect { effect: Effect::Hybrid, duration: 3, meta: Some(EffectMeta::Multiplier(150)), tick: None }, + }, + ], + Skill::HybridPlus => vec![ + Action::Effect { + construct: self.target, + effect: ConstructEffect { effect: Effect::Hybrid, duration: 4, meta: Some(EffectMeta::Multiplier(175)), tick: None }, + }, + ], + Skill::HybridPlusPlus => vec![ + Action::Effect { + construct: self.target, + effect: ConstructEffect { effect: Effect::Hybrid, duration: 5, meta: Some(EffectMeta::Multiplier(200)), tick: None }, + }, + ], + Skill::Intercept | Skill::InterceptPlus | Skill::InterceptPlusPlus => vec![ @@ -469,6 +516,70 @@ impl Cast { }, ], + Skill::Invert => vec![ + Action::Effect { + construct: self.target, + effect: ConstructEffect { effect: Effect::Invert, duration: 2, meta: None, tick: None }, + }, + ], + Skill::InvertPlus => vec![ + Action::Effect { + construct: self.target, + effect: ConstructEffect { effect: Effect::Invert, duration: 3, meta: None, tick: None }, + }, + ], + Skill::InvertPlusPlus => vec![ + Action::Effect { + construct: self.target, + effect: ConstructEffect { effect: Effect::Invert, duration: 4, meta: None, tick: None }, + }, + ], + + Skill::Link | + Skill::LinkPlus | + Skill::LinkPlusPlus => vec![ + Action::Effect { + construct: self.target, + effect: ConstructEffect { effect: Effect::Stun, duration: 1, meta: None, tick: None }, + }, + Action::Damage { + construct: self.target, + colour: Colour::Blue, + values: vec![ + Value::Effects { construct: self.target, mult: self.skill.multiplier() }, + ], + }, + ], + + Skill::Recharge | + Skill::RechargePlus | + Skill::RechargePlusPlus => vec![ + Action::Heal { + construct: self.target, + colour: Colour::Red, + values: vec![Value::Stat { construct: self.source, stat: Stat::RedPower, mult: self.skill.multiplier() }], + }, + Action::Heal { + construct: self.target, + colour: Colour::Blue, + values: vec![Value::Stat { construct: self.source, stat: Stat::BluePower, mult: self.skill.multiplier() }], + }, + ], + + Skill::Reflect | + Skill::ReflectPlus | + Skill::ReflectPlusPlus => vec![ + Action::Effect { + construct: self.target, + effect: ConstructEffect { effect: Effect::Reflect, duration: 1, meta: None, tick: None }, + }, + Action::Heal { + construct: self.target, + values: vec![Value::Stat { construct: self.source, stat: Stat::BluePower, mult: self.skill.multiplier() }], + colour: Colour::Blue, + }, + ], + Skill::Restrict | Skill::RestrictPlus | Skill::RestrictPlusPlus => vec![ @@ -498,6 +609,40 @@ 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 }, + }, + ], + Skill::SiphonPlus => vec![ + Action::Effect { + construct: self.target, + effect: ConstructEffect { effect: Effect::Siphon, duration: 3, meta: Some(EffectMeta::Skill(Skill::SiphonTickPlus)), tick: None }, + }, + ], + Skill::SiphonPlusPlus => vec![ + Action::Effect { + construct: self.target, + effect: ConstructEffect { effect: Effect::Siphon, duration: 4, meta: Some(EffectMeta::Skill(Skill::SiphonTickPlusPlus)), tick: None }, + }, + ], + Skill::SiphonTick | + Skill::SiphonTickPlus | + Skill::SiphonTickPlusPlus => vec![ + Action::Damage { + construct: self.target, + colour: Colour::Blue, + values: vec![Value::Stat { construct: self.source, stat: Stat::BluePower, mult: self.skill.multiplier() }], + }, + Action::Heal { + construct: self.target, + colour: Colour::Green, + values: vec![Value::DamageTaken { construct: self.target, colour: Colour::Blue, mult: 100 }], + }, + ], + Skill::Slay | Skill::SlayPlus | Skill::SlayPlusPlus => vec![ @@ -610,78 +755,6 @@ impl Cast { fn end() {} -// fn curse(source: &mut Construct, target: &mut Construct, skill: Skill) { -// game.event(Event::new(source, target).event(target.effect_remove(skill, skill.effect()[0]))); -// } - -// fn hybrid(source: &mut Construct, target: &mut Construct, skill: Skill) { -// game.event(Event::new(source, target).event(target.effect_remove(skill, skill.effect()[0]))); -// } - -// fn invert(source: &mut Construct, target: &mut Construct, skill: Skill) { -// game.event(Event::new(source, target).event(target.effect_remove(skill, skill.effect()[0]))); -// } - -// fn reflect(source: &mut Construct, target: &mut Construct, skill: Skill) { -// game.event(Event::new(source, target).event(target.effect_remove(skill, skill.effect()[0]))); - -// let blue_amount = source.blue_power().pct(skill.multiplier()); -// target.recharge(skill, 0, blue_amount) -// .into_iter() -// .for_each(|e| game.event(Event::new(source, target).event(e).stages(EventStages::PostOnly))); - -// } - -// fn recharge(source: &mut Construct, target: &mut Construct, skill: Skill) { -// game.event(Event::new(source, target).event(Event::Skill { skill }).stages(EventStages::StartEnd)); -// let red_amount = source.red_power().pct(skill.multiplier()); -// let blue_amount = source.blue_power().pct(skill.multiplier()); -// target.recharge(skill, red_amount, blue_amount) -// .into_iter() -// .for_each(|e| game.event(Event::new(source, target).event(e).stages(EventStages::PostOnly))); - -// } - -// fn siphon(source: &mut Construct, target: &mut Construct, skill: Skill) { - -// 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, -// _ => panic!("no siphon tick skill"), -// }; -// let siphon = ConstructEffect::new(effect, duration).set_tick(Cast::new_tick(source, target, tick_skill)); -// game.event(Event::new(source, target).event(target.effect_remove(skill, siphon))); - -// match skip_tick { -// false => return siphon_tick(source, target, resolutions, tick_skill) -// } -// } - -// fn siphon_tick(source: &mut Construct, target: &mut Construct, skill: Skill) { -// let amount = source.blue_power().pct(skill.multiplier()) + source.green_power().pct(skill.multiplier()); -// let siphon_events = target.deal_blue_damage(skill, amount); - -// for e in siphon_events { -// match e { -// Event::Damage { amount, mitigation: _, colour: _, skill: _ } => { -// game.event(Event::new(source, target).event(e).stages(EventStages::EndPost)); -// let heal = source.deal_green_damage(skill, amount); -// for h in heal { -// game.event(Event::new(source, source).event(h).stages(EventStages::PostOnly)); -// }; -// }, -// _ => game.event(Event::new(source, target).event(e).stages(EventStages::EndPost)), -// } -// } - -// } - // fn link(source: &mut Construct, target: &mut Construct, skill: Skill) { // game.event(Event::new(source, target).event(target.effect_remove(skill, skill.effect()[0])));