wip, removing immunities

This commit is contained in:
ntr 2019-12-04 17:26:05 +10:00
parent c91c94b656
commit 488dc21182
4 changed files with 153 additions and 89 deletions

View File

@ -1,4 +1,5 @@
# FIXME # FIXME
remove immunity
aoe event aoe event
cooldown checking -> go through round and find all casters cooldown checking -> go through round and find all casters

View File

@ -835,13 +835,15 @@ impl Construct {
return events; return events;
} }
pub fn add_effect(&mut self, skill: Skill, effect: ConstructEffect) -> Event { pub fn add_effect(&mut self, skill: Skill, effect: ConstructEffect) -> Vec<Event> {
if let Some(immunity) = self.immune(skill) { if let Some(immunity) = self.immune(skill) {
return Event::new( return vec![
EventVariant::Immunity{ Event::new(
skill, EventVariant::Immunity{
immunity, skill,
}, self); immunity,
}, self)
];
} }
if let Some(p) = self.effects.iter().position(|ce| ce.effect == effect.effect) { if let Some(p) = self.effects.iter().position(|ce| ce.effect == effect.effect) {
@ -864,7 +866,8 @@ impl Construct {
skill, skill,
}, self }, self
); );
return result;
return vec![result];
} }
// pub fn evade(&self, skill: Skill) -> Option<Event> { // pub fn evade(&self, skill: Skill) -> Option<Event> {

View File

@ -9,7 +9,7 @@ use chrono::Duration;
use failure::Error; use failure::Error;
use failure::err_msg; use failure::err_msg;
use construct::{Construct, Stat}; use construct::{Construct, ConstructEffect, Stat};
use skill::{Skill, Cast, Event, resolve}; use skill::{Skill, Cast, Event, resolve};
use effect::{Effect}; use effect::{Effect};
use player::{Player}; use player::{Player};
@ -27,7 +27,7 @@ pub enum Phase {
pub enum Value { pub enum Value {
Stat { construct: Uuid, stat: Stat, mult: usize }, Stat { construct: Uuid, stat: Stat, mult: usize },
Fixed { amount: usize }, Fixed { amount: usize },
Cooldowns { construct: Uuid }, Cooldowns { construct: Uuid, mult: usize },
// Skills { construct: Uuid, colour: Colour }, // Skills { construct: Uuid, colour: Colour },
} }
@ -40,9 +40,10 @@ pub enum Colour {
#[derive(Debug,Clone,PartialEq,Serialize,Deserialize)] #[derive(Debug,Clone,PartialEq,Serialize,Deserialize)]
pub enum Action { pub enum Action {
Damage { construct: Uuid, skill: Skill, values: Vec<Value>, colour: Colour }, Damage { construct: Uuid, skill: Skill, values: Vec<Value>, colour: Colour },
Effect { construct: Uuid, skill: Skill, effect: ConstructEffect },
IncreaseCooldowns { construct: Uuid, skill: Skill, turns: usize },
// Recharge { skill: Skill, red: usize, blue: usize }, // Recharge { skill: Skill, red: usize, blue: usize },
// Effect { skill: Skill, effect: Effect, duration: u8, construct_effects: Vec<ConstructEffect> },
} }
#[derive(Debug,Clone,Serialize,Deserialize)] #[derive(Debug,Clone,Serialize,Deserialize)]
@ -498,6 +499,8 @@ impl Game {
for action in actions { for action in actions {
match action { match action {
Action::Damage { construct, skill, values, colour } => self.damage(construct, skill, values, colour), 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 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<Cast>) -> &mut Game { fn progress_durations(&mut self, resolutions: &Vec<Cast>) -> &mut Game {
for mut construct in self.all_constructs() { for mut construct in self.all_constructs() {
// info!("progressing durations for {:}", construct.name); // info!("progressing durations for {:}", construct.name);

View File

@ -488,87 +488,87 @@ impl Skill {
Skill::Attack => 80, // Base Skill::Attack => 80, // Base
Skill::Blast => 105, // BB Skill::Blast => 105, // BB
Skill::BlastPlus => 140, // BB Skill::BlastPlus => 125, // BB
Skill::BlastPlusPlus => 200, // BB Skill::BlastPlusPlus => 145, // BB
Skill::Chaos => 40, // BR Skill::Chaos => 40, // BR
Skill::ChaosPlus => 65, // BR Skill::ChaosPlus => 50, // BR
Skill::ChaosPlusPlus => 90, // BR Skill::ChaosPlusPlus => 65, // BR
Skill::Heal => 125, //GG Skill::Heal => 115, //GG
Skill::HealPlus => 185, //GG Skill::HealPlus => 135, //GG
Skill::HealPlusPlus => 270, //GG Skill::HealPlusPlus => 160, //GG
Skill::SiphonTick => 25, // GB Skill::SiphonTick => 25, // GB
Skill::SiphonTickPlus => 30, Skill::SiphonTickPlus => 27,
Skill::SiphonTickPlusPlus => 40, Skill::SiphonTickPlusPlus => 30,
Skill::Slay => 45, // RG Skill::Slay => 40, // RG
Skill::SlayPlus => 65, Skill::SlayPlus => 50,
Skill::SlayPlusPlus => 100, Skill::SlayPlusPlus => 65,
Skill::Strike => 90, //RR Skill::Strike => 90, //RR
Skill::StrikePlus => 140, Skill::StrikePlus => 110,
Skill::StrikePlusPlus => 200, Skill::StrikePlusPlus => 140,
// Block Base // Block Base
Skill::ElectrocuteTick => 80, Skill::ElectrocuteTick => 80,
Skill::ElectrocuteTickPlus => 100, Skill::ElectrocuteTickPlus => 90,
Skill::ElectrocuteTickPlusPlus => 130, Skill::ElectrocuteTickPlusPlus => 100,
Skill::CounterAttack => 120, Skill::CounterAttack => 115,
Skill::CounterAttackPlus => 160, Skill::CounterAttackPlus => 130,
Skill::CounterAttackPlusPlus => 230, Skill::CounterAttackPlusPlus => 160,
Skill::Purify => 45, //Green dmg (heal) Skill::Purify => 45, //Green dmg (heal)
Skill::PurifyPlus => 70, Skill::PurifyPlus => 60,
Skill::PurifyPlusPlus => 105, Skill::PurifyPlusPlus => 85,
Skill::Reflect => 45, //Recharge blue life (heal) Skill::Reflect => 45, //Recharge blue life (heal)
Skill::ReflectPlus => 70, Skill::ReflectPlus => 70,
Skill::ReflectPlusPlus => 100, Skill::ReflectPlusPlus => 100,
Skill::Recharge => 70, //Recharge red and blue life (heal) Skill::Recharge => 70, //Recharge red and blue life (heal)
Skill::RechargePlus => 110, Skill::RechargePlus => 90,
Skill::RechargePlusPlus => 170, Skill::RechargePlusPlus => 110,
Skill::Sustain => 120, // Recharge red life (heal) Skill::Sustain => 110, // Recharge red life (heal)
Skill::SustainPlus => 150, Skill::SustainPlus => 130,
Skill::SustainPlusPlus => 230, Skill::SustainPlusPlus => 150,
// Stun Base // Stun Base
Skill::Sleep => 200, //Green dmg (heal) Skill::Sleep => 160, //Green dmg (heal)
Skill::SleepPlus => 290, Skill::SleepPlus => 200,
Skill::SleepPlusPlus => 400, Skill::SleepPlusPlus => 240,
Skill::Banish => 40, //Green dmg (heal) Skill::Banish => 50, //Green dmg (heal)
Skill::BanishPlus => 75, Skill::BanishPlus => 65,
Skill::BanishPlusPlus => 125, Skill::BanishPlusPlus => 80,
Skill::Bash => 45, Skill::Bash => 45,
Skill::BashPlus => 65, Skill::BashPlus => 55,
Skill::BashPlusPlus => 100, Skill::BashPlusPlus => 70,
Skill::Link => 25, Skill::Link => 25,
Skill::LinkPlus => 40, Skill::LinkPlus => 35,
Skill::LinkPlusPlus => 70, Skill::LinkPlusPlus => 45,
Skill::Ruin => 40, Skill::Ruin => 40,
Skill::RuinPlus => 70, Skill::RuinPlus => 55,
Skill::RuinPlusPlus => 100, Skill::RuinPlusPlus => 70,
// Debuff Base // Debuff Base
Skill::DecayTick => 33, Skill::DecayTick => 33,
Skill::DecayTickPlus => 45, Skill::DecayTickPlus => 37,
Skill::DecayTickPlusPlus => 70, Skill::DecayTickPlusPlus => 45,
Skill::Silence => 55, // Deals more per blue skill on target Skill::Silence => 55, // Deals more per blue skill on target
Skill::SilencePlus => 80, Skill::SilencePlus => 65,
Skill::SilencePlusPlus => 110, Skill::SilencePlusPlus => 80,
Skill::Restrict => 40, // Deals more per red skill on target Skill::Restrict => 40, // Deals more per red skill on target
Skill::RestrictPlus => 65, Skill::RestrictPlus => 55,
Skill::RestrictPlusPlus => 100, Skill::RestrictPlusPlus => 70,
// Buff base // Buff base
Skill::HybridBlast => 50, Skill::HybridBlast => 50,
@ -576,16 +576,16 @@ impl Skill {
Skill::HasteStrike => 60, Skill::HasteStrike => 60,
Skill::Absorb=> 95, Skill::Absorb=> 95,
Skill::AbsorbPlus => 120, Skill::AbsorbPlus => 110,
Skill::AbsorbPlusPlus => 155, Skill::AbsorbPlusPlus => 120,
Skill::Intercept => 80, Skill::Intercept => 85,
Skill::InterceptPlus => 110, Skill::InterceptPlus => 100,
Skill::InterceptPlusPlus => 150, Skill::InterceptPlusPlus => 125,
Skill::TriageTick => 75, Skill::TriageTick => 75,
Skill::TriageTickPlus => 110, Skill::TriageTickPlus => 90,
Skill::TriageTickPlusPlus => 140, Skill::TriageTickPlusPlus => 110,
_ => 100, _ => 100,
} }
@ -604,6 +604,7 @@ impl Skill {
Skill::Banish => vec![ConstructEffect {effect: Effect::Banish, duration: 2, meta: None, tick: None}], 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::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::BanishPlusPlus => vec![ConstructEffect {effect: Effect::Banish, duration: 2, meta: None, tick: None}],
Skill::Block => vec![ConstructEffect {effect: Effect::Block, duration: 1, Skill::Block => vec![ConstructEffect {effect: Effect::Block, duration: 1,
meta: Some(EffectMeta::Multiplier(35)), tick: None}], meta: Some(EffectMeta::Multiplier(35)), tick: None}],
Skill::Buff => vec![ConstructEffect {effect: Effect::Buff, duration: 3, Skill::Buff => vec![ConstructEffect {effect: Effect::Buff, duration: 3,
@ -629,9 +630,9 @@ impl Skill {
Skill::Curse => vec![ConstructEffect {effect: Effect::Curse, duration: 2, Skill::Curse => vec![ConstructEffect {effect: Effect::Curse, duration: 2,
meta: Some(EffectMeta::Multiplier(150)), tick: None}], meta: Some(EffectMeta::Multiplier(150)), tick: None}],
Skill::CursePlus => vec![ConstructEffect {effect: Effect::Curse, duration: 2, 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, 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, Skill::Debuff => vec![ConstructEffect {effect: Effect::Slow, duration: 3,
meta: Some(EffectMeta::Multiplier(50)), tick: None }], meta: Some(EffectMeta::Multiplier(50)), tick: None }],
@ -664,15 +665,15 @@ impl Skill {
meta: Some(EffectMeta::Skill(Skill::AbsorptionPlusPlus)), tick: None}], meta: Some(EffectMeta::Skill(Skill::AbsorptionPlusPlus)), tick: None}],
Skill::Absorption => vec![ConstructEffect {effect: Effect::Absorption, duration: 3, meta: None, 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::AbsorptionPlus => vec![ConstructEffect {effect: Effect::Absorption, duration: 4, meta: None, tick: None}],
Skill::AbsorptionPlusPlus => vec![ConstructEffect {effect: Effect::Absorption, duration: 7, 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, Skill::Hybrid => vec![ConstructEffect {effect: Effect::Hybrid, duration: 3,
meta: Some(EffectMeta::Multiplier(150)), tick: None }], meta: Some(EffectMeta::Multiplier(150)), tick: None }],
Skill::HybridPlus => vec![ConstructEffect {effect: Effect::Hybrid, duration: 4, Skill::HybridPlus => vec![ConstructEffect {effect: Effect::Hybrid, duration: 4,
meta: Some(EffectMeta::Multiplier(175)), tick: None }], meta: Some(EffectMeta::Multiplier(175)), tick: None }],
Skill::HybridPlusPlus => vec![ConstructEffect {effect: Effect::Hybrid, duration: 5, 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::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}], 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}], meta: Some(EffectMeta::Multiplier(150)), tick: None}],
Skill::BreakPlus => vec![ConstructEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None}, Skill::BreakPlus => vec![ConstructEffect {effect: Effect::Stun, duration: 1, meta: None, tick: None},
ConstructEffect {effect: Effect::Vulnerable, duration: 4, 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}, Skill::BreakPlusPlus => vec![ConstructEffect {effect: Effect::Stun, duration: 2, meta: None, tick: None},
ConstructEffect {effect: Effect::Vulnerable, duration: 4, 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::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}], 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> {
Action::Effect { Action::Effect {
construct: cast.target, construct: cast.target,
skill: cast.skill, 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![ Skill::AmplifyPlus => vec![
Action::Effect { Action::Effect {
construct: cast.target, construct: cast.target,
skill: cast.skill, 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![ Skill::AmplifyPlusPlus => vec![
Action::Effect { Action::Effect {
construct: cast.target, construct: cast.target,
skill: cast.skill, 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![ Skill::Attack => vec![
Action::Damage { Action::Damage {
construct: cast.target, construct: cast.target,
@ -1102,23 +1099,52 @@ pub fn cast_actions(cast: Cast) -> Vec<Action> {
}, },
], ],
Skill::Strike |
Skill::StrikePlus | Skill::Banish => vec![
Skill::StrikePlusPlus => 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 { Action::Damage {
construct: cast.target, construct: cast.target,
skill: cast.skill, skill: cast.skill,
colour: Colour::Red, 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() // skill.effect().into_iter()
// .for_each(|e| (game.event(Event::new(source, target).event(target.add_effect(skill, e))))); // .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<Action> {
// } // }
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) { // fn sleep(source: &mut Construct, target: &mut Construct, skill: Skill) {
// skill.effect().into_iter() // skill.effect().into_iter()
@ -1595,9 +1636,13 @@ mod tests {
fn attack_actions_test() { fn attack_actions_test() {
let cast = Cast::new(Uuid::new_v4(), Uuid::new_v4(), Uuid::new_v4(), Skill::Attack); let cast = Cast::new(Uuid::new_v4(), Uuid::new_v4(), Uuid::new_v4(), Skill::Attack);
let mut actions = cast_actions(cast); let mut actions = cast_actions(cast);
let Action::Damage { construct, skill, values, colour } = actions.remove(0); match actions.remove(0) {
assert_eq!(skill, Skill::Attack); Action::Damage { construct: _, skill, values: _, colour } => {
assert_eq!(colour, Colour::Red); assert_eq!(skill, Skill::Attack);
assert_eq!(colour, Colour::Red);
},
_ => panic!("{:?}", actions),
};
} }
// #[test] // #[test]