counterattack immunity

This commit is contained in:
ntr 2019-12-13 20:08:31 +10:00
parent 59b8c90496
commit 8240c704a7
3 changed files with 38 additions and 28 deletions

View File

@ -50,6 +50,8 @@ pub enum Effect {
Siphon, Siphon,
Siphoned, // immunity Siphoned, // immunity
Countered,
// Regen, // Regen,
// Airborne, // Airborne,
// Boost // Boost
@ -119,6 +121,7 @@ impl Effect {
Effect::Siphoned => true, Effect::Siphoned => true,
Effect::Decayed => true, Effect::Decayed => true,
Effect::Triaged => true, Effect::Triaged => true,
Effect::Countered => true,
_ => false, _ => false,
} }
} }
@ -239,6 +242,7 @@ impl Effect {
Effect::Triaged => None, Effect::Triaged => None,
Effect::Decayed => None, Effect::Decayed => None,
Effect::Siphoned => None, Effect::Siphoned => None,
Effect::Countered => None,
Effect::Ko => None, Effect::Ko => None,
} }
} }

View File

@ -463,6 +463,29 @@ impl Game {
self.skill_phase_start(r_animation_ms) self.skill_phase_start(r_animation_ms)
} }
fn modify_cast(&self, cast: Cast) -> Vec<Cast> {
let target_player = self.players.iter()
.find(|t| t.constructs.iter().any(|c| c.id == cast.target))
.unwrap();
if let Some(t) = target_player.intercepting() {
return vec![Cast { target: t.id, ..cast }];
}
let casts = match cast.skill.aoe() {
true => self.players.iter()
.find(|t| t.constructs.iter().any(|c| c.id == cast.target))
.unwrap()
.constructs
.iter()
.map(|c| Cast { target: c.id, ..cast })
.collect(),
false => vec![cast],
};
return casts;
}
fn new_resolve(&mut self, cast: Cast) -> &mut Game { fn new_resolve(&mut self, cast: Cast) -> &mut Game {
self.events = vec![]; self.events = vec![];
self.resolve(cast); self.resolve(cast);
@ -502,29 +525,6 @@ impl Game {
self self
} }
fn modify_cast(&self, cast: Cast) -> Vec<Cast> {
let target_player = self.players.iter()
.find(|t| t.constructs.iter().any(|c| c.id == cast.target))
.unwrap();
if let Some(t) = target_player.intercepting() {
return vec![Cast { target: t.id, ..cast }];
}
let casts = match cast.skill.aoe() {
true => self.players.iter()
.find(|t| t.constructs.iter().any(|c| c.id == cast.target))
.unwrap()
.constructs
.iter()
.map(|c| Cast { target: c.id, ..cast })
.collect(),
false => vec![cast],
};
return casts;
}
fn execute(&mut self, cast: Cast) -> &mut Game { fn execute(&mut self, cast: Cast) -> &mut Game {
if self.construct(cast.target).is_ko() { if self.construct(cast.target).is_ko() {
self.add_resolution(&cast, &Event::TargetKo { construct: cast.target }); self.add_resolution(&cast, &Event::TargetKo { construct: cast.target });
@ -643,7 +643,7 @@ impl Game {
} }
fn cast(&mut self, cast: Cast) -> Event { fn cast(&mut self, cast: Cast) -> Event {
Event::Cast { construct: cast.source, player: cast.player, direction: self.direction(cast) } Event::Cast { construct: cast.source, player: cast.player, target: cast.target, skill: cast.skill, direction: self.direction(cast) }
} }
fn hit(&mut self, cast: Cast) -> Event { fn hit(&mut self, cast: Cast) -> Event {
@ -726,8 +726,8 @@ impl Game {
let cooldown = self.resolutions[last].iter() let cooldown = self.resolutions[last].iter()
.find_map(|r| match r.event { .find_map(|r| match r.event {
Event::Cast { construct: caster, player: _, direction: _ } => Event::Cast { construct: caster, player: _, direction: _, skill, target: _ } =>
match caster == construct.id && r.skill.base_cd().is_some() { match caster == construct.id && skill.base_cd().is_some() {
true => Some(r.skill), true => Some(r.skill),
false => None, false => None,
}, },
@ -887,7 +887,7 @@ impl Resolution {
#[derive(Debug,Clone,PartialEq,Serialize,Deserialize)] #[derive(Debug,Clone,PartialEq,Serialize,Deserialize)]
pub enum Event { pub enum Event {
Cast { construct: Uuid, player: Uuid, direction: Direction }, Cast { construct: Uuid, player: Uuid, target: Uuid, skill: Skill, direction: Direction },
Hit { construct: Uuid, player: Uuid, direction: Direction }, Hit { construct: Uuid, player: Uuid, direction: Direction },
HitAoe { construct: Vec<Uuid>, player: Uuid, direction: Direction }, HitAoe { construct: Vec<Uuid>, player: Uuid, direction: Direction },
@ -955,7 +955,7 @@ impl Event {
fn animation(&self) -> Animation { fn animation(&self) -> Animation {
match self { match self {
Event::Cast { construct: _, direction: _, player: _ } => Animation::Source, Event::Cast { construct: _, direction: _, player: _, target: _, skill: _ } => Animation::Source,
Event::Hit { construct: _, direction: _, player: _ } | Event::Hit { construct: _, direction: _, player: _ } |
Event::HitAoe { construct: _, direction: _, player: _ } => Animation::Target, Event::HitAoe { construct: _, direction: _, player: _ } => Animation::Target,

View File

@ -1414,6 +1414,12 @@ fn counter_attack(cast: Cast, game: &mut Game) {
amount: game.value(Value::Stat { construct: cast.source, stat: Stat::RedPower }).pct(cast.skill.multiplier()), amount: game.value(Value::Stat { construct: cast.source, stat: Stat::RedPower }).pct(cast.skill.multiplier()),
}, },
); );
game.action(cast,
Action::Effect {
construct: cast.target,
effect: ConstructEffect { effect: Effect::Countered, duration: 1, meta: None }, // immunity to additional hits
}
);
} }
fn decay(cast: Cast, game: &mut Game) { fn decay(cast: Cast, game: &mut Game) {