wip, removing immunities
This commit is contained in:
parent
c91c94b656
commit
488dc21182
@ -1,4 +1,5 @@
|
||||
# FIXME
|
||||
|
||||
remove immunity
|
||||
aoe event
|
||||
cooldown checking -> go through round and find all casters
|
||||
@ -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<Event> {
|
||||
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<Event> {
|
||||
|
||||
@ -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<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 },
|
||||
// Effect { skill: Skill, effect: Effect, duration: u8, construct_effects: Vec<ConstructEffect> },
|
||||
}
|
||||
|
||||
#[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<Cast>) -> &mut Game {
|
||||
for mut construct in self.all_constructs() {
|
||||
// info!("progressing durations for {:}", construct.name);
|
||||
|
||||
@ -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> {
|
||||
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<Action> {
|
||||
},
|
||||
],
|
||||
|
||||
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<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) {
|
||||
// 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]
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user