From 488dc211824382f0206ce080cae451dc480be02f Mon Sep 17 00:00:00 2001 From: ntr Date: Wed, 4 Dec 2019 17:26:05 +1000 Subject: [PATCH] wip, removing immunities --- core/fixme.md | 1 + core/src/construct.rs | 17 ++-- core/src/game.rs | 23 ++++- core/src/skill.rs | 201 ++++++++++++++++++++++++++---------------- 4 files changed, 153 insertions(+), 89 deletions(-) diff --git a/core/fixme.md b/core/fixme.md index 3f8b070b..c79cbc99 100644 --- a/core/fixme.md +++ b/core/fixme.md @@ -1,4 +1,5 @@ # FIXME +remove immunity aoe event cooldown checking -> go through round and find all casters \ No newline at end of file diff --git a/core/src/construct.rs b/core/src/construct.rs index 6b7ecb26..475e70df 100644 --- a/core/src/construct.rs +++ b/core/src/construct.rs @@ -835,13 +835,15 @@ impl Construct { return events; } - pub fn add_effect(&mut self, skill: Skill, effect: ConstructEffect) -> Event { + pub fn add_effect(&mut self, skill: Skill, effect: ConstructEffect) -> Vec { if let Some(immunity) = self.immune(skill) { - return Event::new( - EventVariant::Immunity{ - skill, - immunity, - }, self); + return vec![ + Event::new( + EventVariant::Immunity{ + skill, + immunity, + }, self) + ]; } if let Some(p) = self.effects.iter().position(|ce| ce.effect == effect.effect) { @@ -864,7 +866,8 @@ impl Construct { skill, }, self ); - return result; + + return vec![result]; } // pub fn evade(&self, skill: Skill) -> Option { diff --git a/core/src/game.rs b/core/src/game.rs index 28a2ca8d..e5c43517 100644 --- a/core/src/game.rs +++ b/core/src/game.rs @@ -9,7 +9,7 @@ use chrono::Duration; use failure::Error; use failure::err_msg; -use construct::{Construct, Stat}; +use construct::{Construct, ConstructEffect, Stat}; use skill::{Skill, Cast, Event, resolve}; use effect::{Effect}; use player::{Player}; @@ -27,7 +27,7 @@ pub enum Phase { pub enum Value { Stat { construct: Uuid, stat: Stat, mult: usize }, Fixed { amount: usize }, - Cooldowns { construct: Uuid }, + Cooldowns { construct: Uuid, mult: usize }, // Skills { construct: Uuid, colour: Colour }, } @@ -40,9 +40,10 @@ pub enum Colour { #[derive(Debug,Clone,PartialEq,Serialize,Deserialize)] pub enum Action { - Damage { construct: Uuid, skill: Skill, values: Vec, colour: Colour }, + Damage { construct: Uuid, skill: Skill, values: Vec, colour: Colour }, + Effect { construct: Uuid, skill: Skill, effect: ConstructEffect }, + IncreaseCooldowns { construct: Uuid, skill: Skill, turns: usize }, // Recharge { skill: Skill, red: usize, blue: usize }, - // Effect { skill: Skill, effect: Effect, duration: u8, construct_effects: Vec }, } #[derive(Debug,Clone,Serialize,Deserialize)] @@ -498,6 +499,8 @@ impl Game { for action in actions { match action { Action::Damage { construct, skill, values, colour } => self.damage(construct, skill, values, colour), + Action::Effect { construct, skill, effect } => self.effect(construct, skill, effect), + Action::IncreaseCooldowns { construct, skill, turns } => self.increase_cooldowns(construct, skill, turns), }; } @@ -513,6 +516,18 @@ impl Game { self } + fn effect(&mut self, construct: Uuid, skill: Skill, effect: ConstructEffect) -> &mut Game { + let resolutions = self.construct_by_id(construct).unwrap().add_effect(skill, effect); + self.resolution_add(resolutions); + self + } + + fn increase_cooldowns(&mut self, construct: Uuid, skill: Skill, turns: usize) -> &mut Game { + let resolutions = self.construct_by_id(construct).unwrap().increase_cooldowns(turns); + self.resolution_add(resolutions); + self + } + fn progress_durations(&mut self, resolutions: &Vec) -> &mut Game { for mut construct in self.all_constructs() { // info!("progressing durations for {:}", construct.name); diff --git a/core/src/skill.rs b/core/src/skill.rs index d44ba780..375cb31b 100644 --- a/core/src/skill.rs +++ b/core/src/skill.rs @@ -488,87 +488,87 @@ impl Skill { Skill::Attack => 80, // Base Skill::Blast => 105, // BB - Skill::BlastPlus => 140, // BB - Skill::BlastPlusPlus => 200, // BB + Skill::BlastPlus => 125, // BB + Skill::BlastPlusPlus => 145, // BB Skill::Chaos => 40, // BR - Skill::ChaosPlus => 65, // BR - Skill::ChaosPlusPlus => 90, // BR + Skill::ChaosPlus => 50, // BR + Skill::ChaosPlusPlus => 65, // BR - Skill::Heal => 125, //GG - Skill::HealPlus => 185, //GG - Skill::HealPlusPlus => 270, //GG + Skill::Heal => 115, //GG + Skill::HealPlus => 135, //GG + Skill::HealPlusPlus => 160, //GG Skill::SiphonTick => 25, // GB - Skill::SiphonTickPlus => 30, - Skill::SiphonTickPlusPlus => 40, + Skill::SiphonTickPlus => 27, + Skill::SiphonTickPlusPlus => 30, - Skill::Slay => 45, // RG - Skill::SlayPlus => 65, - Skill::SlayPlusPlus => 100, + Skill::Slay => 40, // RG + Skill::SlayPlus => 50, + Skill::SlayPlusPlus => 65, Skill::Strike => 90, //RR - Skill::StrikePlus => 140, - Skill::StrikePlusPlus => 200, + Skill::StrikePlus => 110, + Skill::StrikePlusPlus => 140, // Block Base Skill::ElectrocuteTick => 80, - Skill::ElectrocuteTickPlus => 100, - Skill::ElectrocuteTickPlusPlus => 130, + Skill::ElectrocuteTickPlus => 90, + Skill::ElectrocuteTickPlusPlus => 100, - Skill::CounterAttack => 120, - Skill::CounterAttackPlus => 160, - Skill::CounterAttackPlusPlus => 230, + Skill::CounterAttack => 115, + Skill::CounterAttackPlus => 130, + Skill::CounterAttackPlusPlus => 160, Skill::Purify => 45, //Green dmg (heal) - Skill::PurifyPlus => 70, - Skill::PurifyPlusPlus => 105, + Skill::PurifyPlus => 60, + Skill::PurifyPlusPlus => 85, Skill::Reflect => 45, //Recharge blue life (heal) Skill::ReflectPlus => 70, Skill::ReflectPlusPlus => 100, Skill::Recharge => 70, //Recharge red and blue life (heal) - Skill::RechargePlus => 110, - Skill::RechargePlusPlus => 170, + Skill::RechargePlus => 90, + Skill::RechargePlusPlus => 110, - Skill::Sustain => 120, // Recharge red life (heal) - Skill::SustainPlus => 150, - Skill::SustainPlusPlus => 230, + Skill::Sustain => 110, // Recharge red life (heal) + Skill::SustainPlus => 130, + Skill::SustainPlusPlus => 150, // Stun Base - Skill::Sleep => 200, //Green dmg (heal) - Skill::SleepPlus => 290, - Skill::SleepPlusPlus => 400, + Skill::Sleep => 160, //Green dmg (heal) + Skill::SleepPlus => 200, + Skill::SleepPlusPlus => 240, - Skill::Banish => 40, //Green dmg (heal) - Skill::BanishPlus => 75, - Skill::BanishPlusPlus => 125, + Skill::Banish => 50, //Green dmg (heal) + Skill::BanishPlus => 65, + Skill::BanishPlusPlus => 80, Skill::Bash => 45, - Skill::BashPlus => 65, - Skill::BashPlusPlus => 100, + Skill::BashPlus => 55, + Skill::BashPlusPlus => 70, Skill::Link => 25, - Skill::LinkPlus => 40, - Skill::LinkPlusPlus => 70, + Skill::LinkPlus => 35, + Skill::LinkPlusPlus => 45, Skill::Ruin => 40, - Skill::RuinPlus => 70, - Skill::RuinPlusPlus => 100, + Skill::RuinPlus => 55, + Skill::RuinPlusPlus => 70, // Debuff Base Skill::DecayTick => 33, - Skill::DecayTickPlus => 45, - Skill::DecayTickPlusPlus => 70, + Skill::DecayTickPlus => 37, + Skill::DecayTickPlusPlus => 45, Skill::Silence => 55, // Deals more per blue skill on target - Skill::SilencePlus => 80, - Skill::SilencePlusPlus => 110, + Skill::SilencePlus => 65, + Skill::SilencePlusPlus => 80, Skill::Restrict => 40, // Deals more per red skill on target - Skill::RestrictPlus => 65, - Skill::RestrictPlusPlus => 100, + Skill::RestrictPlus => 55, + Skill::RestrictPlusPlus => 70, // Buff base Skill::HybridBlast => 50, @@ -576,16 +576,16 @@ impl Skill { Skill::HasteStrike => 60, Skill::Absorb=> 95, - Skill::AbsorbPlus => 120, - Skill::AbsorbPlusPlus => 155, + Skill::AbsorbPlus => 110, + Skill::AbsorbPlusPlus => 120, - Skill::Intercept => 80, - Skill::InterceptPlus => 110, - Skill::InterceptPlusPlus => 150, + Skill::Intercept => 85, + Skill::InterceptPlus => 100, + Skill::InterceptPlusPlus => 125, Skill::TriageTick => 75, - Skill::TriageTickPlus => 110, - Skill::TriageTickPlusPlus => 140, + Skill::TriageTickPlus => 90, + Skill::TriageTickPlusPlus => 110, _ => 100, } @@ -604,6 +604,7 @@ impl Skill { 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::Block => vec![ConstructEffect {effect: Effect::Block, duration: 1, meta: Some(EffectMeta::Multiplier(35)), tick: None}], Skill::Buff => vec![ConstructEffect {effect: Effect::Buff, duration: 3, @@ -629,9 +630,9 @@ impl Skill { Skill::Curse => vec![ConstructEffect {effect: Effect::Curse, duration: 2, meta: Some(EffectMeta::Multiplier(150)), tick: None}], Skill::CursePlus => vec![ConstructEffect {effect: Effect::Curse, duration: 2, - meta: Some(EffectMeta::Multiplier(200)), tick: None}], + meta: Some(EffectMeta::Multiplier(175)), tick: None}], Skill::CursePlusPlus => vec![ConstructEffect {effect: Effect::Curse, duration: 3, - meta: Some(EffectMeta::Multiplier(250)), tick: None}], + meta: Some(EffectMeta::Multiplier(200)), tick: None}], Skill::Debuff => vec![ConstructEffect {effect: Effect::Slow, duration: 3, meta: Some(EffectMeta::Multiplier(50)), tick: None }], @@ -664,15 +665,15 @@ impl Skill { meta: Some(EffectMeta::Skill(Skill::AbsorptionPlusPlus)), tick: None}], Skill::Absorption => vec![ConstructEffect {effect: Effect::Absorption, duration: 3, meta: None, tick: None}], - Skill::AbsorptionPlus => vec![ConstructEffect {effect: Effect::Absorption, duration: 5, meta: None, tick: None}], - Skill::AbsorptionPlusPlus => vec![ConstructEffect {effect: Effect::Absorption, duration: 7, 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::Hybrid => vec![ConstructEffect {effect: Effect::Hybrid, duration: 3, meta: Some(EffectMeta::Multiplier(150)), tick: None }], Skill::HybridPlus => vec![ConstructEffect {effect: Effect::Hybrid, duration: 4, meta: Some(EffectMeta::Multiplier(175)), tick: None }], Skill::HybridPlusPlus => vec![ConstructEffect {effect: Effect::Hybrid, duration: 5, - meta: Some(EffectMeta::Multiplier(225)), tick: None }], + meta: Some(EffectMeta::Multiplier(200)), tick: None }], 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}], @@ -694,10 +695,10 @@ impl Skill { meta: Some(EffectMeta::Multiplier(150)), tick: None}], Skill::BreakPlus => vec![ConstructEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}, ConstructEffect {effect: Effect::Vulnerable, duration: 4, - meta: Some(EffectMeta::Multiplier(200)), tick: None}], + meta: Some(EffectMeta::Multiplier(175)), tick: None}], Skill::BreakPlusPlus => vec![ConstructEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None}, ConstructEffect {effect: Effect::Vulnerable, duration: 4, - meta: Some(EffectMeta::Multiplier(250)), tick: None}], + meta: Some(EffectMeta::Multiplier(200)), tick: None}], 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}], @@ -1071,28 +1072,24 @@ pub fn cast_actions(cast: Cast) -> Vec { Action::Effect { construct: cast.target, skill: cast.skill, - 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)), tick: None }, }, ], Skill::AmplifyPlus => vec![ Action::Effect { construct: cast.target, skill: cast.skill, - 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)), tick: None }, }, ], Skill::AmplifyPlusPlus => vec![ Action::Effect { construct: cast.target, skill: cast.skill, - 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)), tick: None }, }, ], - // fn amplify(source: &mut Construct, target: &mut Construct, skill: Skill) { -// game.event(Event::new(source, target).event(target.add_effect(skill, skill.effect()[0]))); -// } - Skill::Attack => vec![ Action::Damage { construct: cast.target, @@ -1102,23 +1099,52 @@ pub fn cast_actions(cast: Cast) -> Vec { }, ], - Skill::Strike | - Skill::StrikePlus | - Skill::StrikePlusPlus => vec![ + + Skill::Banish => vec![ + Action::Effect { + construct: cast.target, + skill: cast.skill, + effect: ConstructEffect { effect: Effect::Banish, duration: 2, meta: None, tick: None } + } + ], + Skill::BanishPlus => vec![ + Action::Effect { + construct: cast.target, + skill: cast.skill, + effect: ConstructEffect { effect: Effect::Banish, duration: 2, meta: None, tick: None } + } + ], + Skill::BanishPlusPlus => vec![ + Action::Effect { + construct: cast.target, + skill: cast.skill, + effect: ConstructEffect { effect: Effect::Banish, duration: 2, meta: None, tick: None } + } + ], + + Skill::Bash => vec![ Action::Damage { construct: cast.target, skill: cast.skill, colour: Colour::Red, - values: vec![Value::Stat { construct: cast.source, stat: Stat::RedPower, mult: cast.skill.multiplier() }], + values: vec![ + Value::Stat { construct: cast.source, stat: Stat::RedPower, mult: cast.skill.multiplier() }, + Value::Cooldowns { construct: cast.source, mult: 45 }, + ], + }, + Action::Effect { + construct: cast.target, + skill: cast.skill, + effect: ConstructEffect {effect: Effect::Stun, duration: 2, meta: Some(EffectMeta::Skill(Skill::Bash)), tick: None } + }, + Action::IncreaseCooldowns { + construct: cast.target, + skill: cast.skill, + turns: 1, }, ], - _ => unimplemented!() - } - -} - -// fn bash(source: &mut Construct, target: &mut Construct, skill: Skill) { + // fn bash(source: &mut Construct, target: &mut Construct, skill: Skill) { // skill.effect().into_iter() // .for_each(|e| (game.event(Event::new(source, target).event(target.add_effect(skill, e))))); @@ -1147,6 +1173,21 @@ pub fn cast_actions(cast: Cast) -> Vec { // } + Skill::Strike | + Skill::StrikePlus | + Skill::StrikePlusPlus => vec![ + Action::Damage { + construct: cast.target, + skill: cast.skill, + colour: Colour::Red, + values: vec![Value::Stat { construct: cast.source, stat: Stat::RedPower, mult: cast.skill.multiplier() }], + }, + ], + + _ => unimplemented!() + } + +} // fn sleep(source: &mut Construct, target: &mut Construct, skill: Skill) { // skill.effect().into_iter() @@ -1595,9 +1636,13 @@ mod tests { fn attack_actions_test() { let cast = Cast::new(Uuid::new_v4(), Uuid::new_v4(), Uuid::new_v4(), Skill::Attack); let mut actions = cast_actions(cast); - let Action::Damage { construct, skill, values, colour } = actions.remove(0); - assert_eq!(skill, Skill::Attack); - assert_eq!(colour, Colour::Red); + match actions.remove(0) { + Action::Damage { construct: _, skill, values: _, colour } => { + assert_eq!(skill, Skill::Attack); + assert_eq!(colour, Colour::Red); + }, + _ => panic!("{:?}", actions), + }; } // #[test]