From 419f3c62fd65e906a0836fa94865a41c98f9d4a4 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 28 Jan 2021 13:50:56 -0500 Subject: [PATCH] Attack effects can now have requirements. --- common/src/combat.rs | 78 ++++++++++++++++++++------------ common/src/states/basic_melee.rs | 12 +++-- common/src/states/combo_melee.rs | 12 +++-- 3 files changed, 67 insertions(+), 35 deletions(-) diff --git a/common/src/combat.rs b/common/src/combat.rs index 693f53146f..74c31945ab 100644 --- a/common/src/combat.rs +++ b/common/src/combat.rs @@ -137,35 +137,40 @@ impl Attack { .filter(|e| e.target.map_or(true, |t| t == target_group)) .filter(|e| !(matches!(e.target, Some(GroupTarget::OutOfGroup)) && target_dodging)) { - match effect.effect { - AttackEffect::Knockback(kb) => { - let impulse = kb.calculate_impulse(dir); - if !impulse.is_approx_zero() { - server_events.push(ServerEvent::Knockback { - entity: target_entity, - impulse, + if match &effect.requirement { + Some(CombatRequirement::AnyDamage) => accumulated_damage != 0.0, + None => true, + } { + match effect.effect { + AttackEffect::Knockback(kb) => { + let impulse = kb.calculate_impulse(dir); + if !impulse.is_approx_zero() { + server_events.push(ServerEvent::Knockback { + entity: target_entity, + impulse, + }); + } + }, + AttackEffect::EnergyReward(ec) => { + server_events.push(ServerEvent::EnergyChange { + entity: attacker_entity, + change: EnergyChange { + amount: ec as i32, + source: EnergySource::HitEnemy, + }, }); - } - }, - AttackEffect::EnergyReward(ec) => { - server_events.push(ServerEvent::EnergyChange { - entity: attacker_entity, - change: EnergyChange { - amount: ec as i32, - source: EnergySource::HitEnemy, - }, - }); - }, - AttackEffect::Buff(b) => { - if thread_rng().gen::() < b.chance { - server_events.push(ServerEvent::Buff { - entity: target_entity, - buff_change: BuffChange::Add( - b.to_buff(attacker_uid, accumulated_damage), - ), - }); - } - }, + }, + AttackEffect::Buff(b) => { + if thread_rng().gen::() < b.chance { + server_events.push(ServerEvent::Buff { + entity: target_entity, + buff_change: BuffChange::Add( + b.to_buff(attacker_uid, accumulated_damage), + ), + }); + } + }, + } } } server_events @@ -198,11 +203,21 @@ impl DamageComponent { pub struct EffectComponent { target: Option, effect: AttackEffect, + requirement: Option, } impl EffectComponent { pub fn new(target: Option, effect: AttackEffect) -> Self { - Self { target, effect } + Self { + target, + effect, + requirement: None, + } + } + + pub fn with_requirement(mut self, requirement: CombatRequirement) -> Self { + self.requirement = Some(requirement); + self } } @@ -215,6 +230,11 @@ pub enum AttackEffect { //Lifesteal(f32), } +#[derive(Debug, Serialize, Deserialize)] +pub enum CombatRequirement { + AnyDamage, +} + #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)] pub enum DamageSource { Buff(BuffKind), diff --git a/common/src/states/basic_melee.rs b/common/src/states/basic_melee.rs index 18d636823a..552f90fd16 100644 --- a/common/src/states/basic_melee.rs +++ b/common/src/states/basic_melee.rs @@ -1,5 +1,7 @@ use crate::{ - combat::{Attack, AttackEffect, CombatBuff, DamageComponent}, + combat::{ + Attack, AttackEffect, CombatBuff, CombatRequirement, DamageComponent, EffectComponent, + }, comp::{CharacterState, MeleeAttack, PoiseChange, PoiseSource, StateUpdate}, states::{ behavior::{CharacterBehavior, JoinData}, @@ -99,12 +101,16 @@ impl CharacterBehavior for Data { direction: KnockbackDir::Away, }); let energy = AttackEffect::EnergyReward(50); + let energy = EffectComponent::new(None, energy) + .with_requirement(CombatRequirement::AnyDamage); let buff = AttackEffect::Buff(CombatBuff::default_melee()); let damage = DamageComponent::new(damage, Some(GroupTarget::OutOfGroup)) .with_effect(knockback) - .with_effect(energy) .with_effect(buff); - let attack = Attack::default().with_damage(damage).with_crit(0.5, 1.3); + let attack = Attack::default() + .with_damage(damage) + .with_crit(0.5, 1.3) + .with_effect(energy); // Hit attempt data.updater.insert(data.entity, MeleeAttack { diff --git a/common/src/states/combo_melee.rs b/common/src/states/combo_melee.rs index 29265b0fd5..0027ee9621 100644 --- a/common/src/states/combo_melee.rs +++ b/common/src/states/combo_melee.rs @@ -1,5 +1,7 @@ use crate::{ - combat::{Attack, AttackEffect, CombatBuff, DamageComponent}, + combat::{ + Attack, AttackEffect, CombatBuff, CombatRequirement, DamageComponent, EffectComponent, + }, comp::{ CharacterState, EnergyChange, EnergySource, MeleeAttack, PoiseChange, PoiseSource, StateUpdate, @@ -196,12 +198,16 @@ impl CharacterBehavior for Data { + self.combo * self.static_data.energy_increase, ); let energy = AttackEffect::EnergyReward(energy); + let energy = EffectComponent::new(None, energy) + .with_requirement(CombatRequirement::AnyDamage); let buff = AttackEffect::Buff(CombatBuff::default_melee()); let damage = DamageComponent::new(damage, Some(GroupTarget::OutOfGroup)) .with_effect(knockback) - .with_effect(energy) .with_effect(buff); - let attack = Attack::default().with_damage(damage).with_crit(0.5, 1.3); + let attack = Attack::default() + .with_damage(damage) + .with_crit(0.5, 1.3) + .with_effect(energy); data.updater.insert(data.entity, MeleeAttack { attack,