From 78a2459e6de5ab389840531a912ac35af389c11f Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 25 Jan 2021 17:46:43 -0500 Subject: [PATCH] Changed knockback from an enum to a struct. --- .../common/abilities/staff/fireshockwave.ron | 2 +- .../unique/stonegolemfist/shockwave.ron | 2 +- common/src/combat.rs | 37 ++++++++++--------- common/src/comp/projectile.rs | 7 +++- common/src/lib.rs | 2 +- common/src/states/basic_melee.rs | 7 +++- common/src/states/charged_melee.rs | 7 +++- common/src/states/charged_ranged.rs | 7 +++- common/src/states/combo_melee.rs | 9 +++-- common/src/states/dash_melee.rs | 7 +++- common/src/states/leap_melee.rs | 7 +++- common/src/states/spin_melee.rs | 7 +++- 12 files changed, 62 insertions(+), 39 deletions(-) diff --git a/assets/common/abilities/staff/fireshockwave.ron b/assets/common/abilities/staff/fireshockwave.ron index 1a3c2c48bc..76631a94e6 100644 --- a/assets/common/abilities/staff/fireshockwave.ron +++ b/assets/common/abilities/staff/fireshockwave.ron @@ -5,7 +5,7 @@ Shockwave( recover_duration: 300, damage: 200, poise_damage: 0, - knockback: Away(25.0), + knockback: ( strength: 25.0, direction: Away), shockwave_angle: 360.0, shockwave_vertical_angle: 90.0, shockwave_speed: 20.0, diff --git a/assets/common/abilities/unique/stonegolemfist/shockwave.ron b/assets/common/abilities/unique/stonegolemfist/shockwave.ron index 7945e5d9c3..791274dee7 100644 --- a/assets/common/abilities/unique/stonegolemfist/shockwave.ron +++ b/assets/common/abilities/unique/stonegolemfist/shockwave.ron @@ -5,7 +5,7 @@ Shockwave( recover_duration: 800, damage: 500, poise_damage: 0, - knockback: TowardsUp(40.0), + knockback: (strength: 40.0, direction: TowardsUp), shockwave_angle: 90.0, shockwave_vertical_angle: 90.0, shockwave_speed: 50.0, diff --git a/common/src/combat.rs b/common/src/combat.rs index eb905c135f..ef9ca78189 100644 --- a/common/src/combat.rs +++ b/common/src/combat.rs @@ -181,34 +181,35 @@ impl Damage { } #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] -pub enum Knockback { - Away(f32), - Towards(f32), - Up(f32), - TowardsUp(f32), +pub struct Knockback { + pub direction: KnockbackDir, + pub strength: f32, +} + +#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +pub enum KnockbackDir { + Away, + Towards, + Up, + TowardsUp, } impl Knockback { pub fn calculate_impulse(self, dir: Dir) -> Vec3 { - match self { - Knockback::Away(strength) => strength * *Dir::slerp(dir, Dir::new(Vec3::unit_z()), 0.5), - Knockback::Towards(strength) => { - strength * *Dir::slerp(-dir, Dir::new(Vec3::unit_z()), 0.5) + match self.direction { + KnockbackDir::Away => self.strength * *Dir::slerp(dir, Dir::new(Vec3::unit_z()), 0.5), + KnockbackDir::Towards => { + self.strength * *Dir::slerp(-dir, Dir::new(Vec3::unit_z()), 0.5) }, - Knockback::Up(strength) => strength * Vec3::unit_z(), - Knockback::TowardsUp(strength) => { - strength * *Dir::slerp(-dir, Dir::new(Vec3::unit_z()), 0.85) + KnockbackDir::Up => self.strength * Vec3::unit_z(), + KnockbackDir::TowardsUp => { + self.strength * *Dir::slerp(-dir, Dir::new(Vec3::unit_z()), 0.85) }, } } pub fn modify_strength(mut self, power: f32) -> Self { - use Knockback::*; - match self { - Away(ref mut f) | Towards(ref mut f) | Up(ref mut f) | TowardsUp(ref mut f) => { - *f *= power; - }, - } + self.strength *= power; self } } diff --git a/common/src/comp/projectile.rs b/common/src/comp/projectile.rs index 60c9a2b463..a49320ffb8 100644 --- a/common/src/comp/projectile.rs +++ b/common/src/comp/projectile.rs @@ -2,7 +2,7 @@ use crate::{ comp::buff::{BuffCategory, BuffData, BuffKind}, effect::{self, BuffEffect}, uid::Uid, - Damage, DamageSource, Explosion, GroupTarget, Knockback, RadiusEffect, + Damage, DamageSource, Explosion, GroupTarget, Knockback, KnockbackDir, RadiusEffect, }; use serde::{Deserialize, Serialize}; use specs::Component; @@ -89,7 +89,10 @@ impl ProjectileConstructor { source: DamageSource::Projectile, value: damage, }), - Effect::Knockback(Knockback::Away(knockback)), + Effect::Knockback(Knockback { + strength: knockback, + direction: KnockbackDir::Away, + }), Effect::RewardEnergy(energy_regen), Effect::Vanish, Effect::Buff { diff --git a/common/src/lib.rs b/common/src/lib.rs index 83e93fbccf..b9114ff0c1 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -55,7 +55,7 @@ pub mod util; pub mod vol; pub mod volumes; -pub use combat::{Damage, DamageSource, GroupTarget, Knockback}; +pub use combat::{Damage, DamageSource, GroupTarget, Knockback, KnockbackDir}; pub use comp::inventory::loadout_builder::LoadoutBuilder; pub use explosion::{Explosion, RadiusEffect}; pub use skillset_builder::SkillSetBuilder; diff --git a/common/src/states/basic_melee.rs b/common/src/states/basic_melee.rs index 42cb659afa..1f53363f08 100644 --- a/common/src/states/basic_melee.rs +++ b/common/src/states/basic_melee.rs @@ -7,7 +7,7 @@ use crate::{ behavior::{CharacterBehavior, JoinData}, utils::*, }, - Damage, DamageSource, GroupTarget, Knockback, + Damage, DamageSource, GroupTarget, Knockback, KnockbackDir, }; use serde::{Deserialize, Serialize}; use std::time::Duration; @@ -109,7 +109,10 @@ impl CharacterBehavior for Data { max_angle: 180_f32.to_radians(), applied: false, hit_count: 0, - knockback: Knockback::Away(self.static_data.knockback), + knockback: Knockback { + strength: self.static_data.knockback, + direction: KnockbackDir::Away, + }, }); } else if self.timer < self.static_data.swing_duration { // Swings diff --git a/common/src/states/charged_melee.rs b/common/src/states/charged_melee.rs index 23648ea051..a353deb64a 100644 --- a/common/src/states/charged_melee.rs +++ b/common/src/states/charged_melee.rs @@ -7,7 +7,7 @@ use crate::{ behavior::{CharacterBehavior, JoinData}, utils::{StageSection, *}, }, - Damage, DamageSource, GroupTarget, Knockback, + Damage, DamageSource, GroupTarget, Knockback, KnockbackDir, }; use serde::{Deserialize, Serialize}; use std::time::Duration; @@ -176,7 +176,10 @@ impl CharacterBehavior for Data { max_angle: self.static_data.max_angle.to_radians(), applied: false, hit_count: 0, - knockback: Knockback::Away(knockback), + knockback: Knockback { + strength: knockback, + direction: KnockbackDir::Away, + }, }); } else if self.timer < self.static_data.swing_duration { // Swings diff --git a/common/src/states/charged_ranged.rs b/common/src/states/charged_ranged.rs index 90c0ec468b..db86dad67d 100644 --- a/common/src/states/charged_ranged.rs +++ b/common/src/states/charged_ranged.rs @@ -10,7 +10,7 @@ use crate::{ behavior::{CharacterBehavior, JoinData}, utils::*, }, - Damage, DamageSource, GroupTarget, Knockback, + Damage, DamageSource, GroupTarget, Knockback, KnockbackDir, }; use serde::{Deserialize, Serialize}; use std::time::Duration; @@ -114,7 +114,10 @@ impl CharacterBehavior for Data { hit_solid: vec![projectile::Effect::Stick], hit_entity: vec![ projectile::Effect::Damage(Some(GroupTarget::OutOfGroup), damage), - projectile::Effect::Knockback(Knockback::Away(knockback)), + projectile::Effect::Knockback(Knockback { + strength: knockback, + direction: KnockbackDir::Away, + }), projectile::Effect::Vanish, projectile::Effect::Buff { buff: BuffEffect { diff --git a/common/src/states/combo_melee.rs b/common/src/states/combo_melee.rs index da4f080fcf..5ef656b8bf 100644 --- a/common/src/states/combo_melee.rs +++ b/common/src/states/combo_melee.rs @@ -7,7 +7,7 @@ use crate::{ behavior::{CharacterBehavior, JoinData}, utils::*, }, - Damage, DamageSource, GroupTarget, Knockback, + Damage, DamageSource, GroupTarget, Knockback, KnockbackDir, }; use serde::{Deserialize, Serialize}; use std::time::Duration; @@ -197,9 +197,10 @@ impl CharacterBehavior for Data { max_angle: self.static_data.stage_data[stage_index].angle.to_radians(), applied: false, hit_count: 0, - knockback: Knockback::Away( - self.static_data.stage_data[stage_index].knockback, - ), + knockback: Knockback { + strength: self.static_data.stage_data[stage_index].knockback, + direction: KnockbackDir::Away, + }, }); } }, diff --git a/common/src/states/dash_melee.rs b/common/src/states/dash_melee.rs index 46fa3c1011..df1955963e 100644 --- a/common/src/states/dash_melee.rs +++ b/common/src/states/dash_melee.rs @@ -7,7 +7,7 @@ use crate::{ behavior::{CharacterBehavior, JoinData}, utils::*, }, - Damage, DamageSource, GroupTarget, Knockback, + Damage, DamageSource, GroupTarget, Knockback, KnockbackDir, }; use serde::{Deserialize, Serialize}; use std::time::Duration; @@ -155,7 +155,10 @@ impl CharacterBehavior for Data { max_angle: self.static_data.angle.to_radians(), applied: false, hit_count: 0, - knockback: Knockback::Away(knockback), + knockback: Knockback { + strength: knockback, + direction: KnockbackDir::Away, + }, }); } update.character = CharacterState::DashMelee(Data { diff --git a/common/src/states/leap_melee.rs b/common/src/states/leap_melee.rs index 6afabfb583..76f36c63a9 100644 --- a/common/src/states/leap_melee.rs +++ b/common/src/states/leap_melee.rs @@ -4,7 +4,7 @@ use crate::{ behavior::{CharacterBehavior, JoinData}, utils::{StageSection, *}, }, - Damage, DamageSource, GroupTarget, Knockback, + Damage, DamageSource, GroupTarget, Knockback, KnockbackDir, }; use serde::{Deserialize, Serialize}; use std::time::Duration; @@ -164,7 +164,10 @@ impl CharacterBehavior for Data { max_angle: self.static_data.max_angle.to_radians(), applied: false, hit_count: 0, - knockback: Knockback::Away(self.static_data.knockback), + knockback: Knockback { + strength: self.static_data.knockback, + direction: KnockbackDir::Away, + }, }); update.character = CharacterState::LeapMelee(Data { diff --git a/common/src/states/spin_melee.rs b/common/src/states/spin_melee.rs index 12072b3484..3a1305156c 100644 --- a/common/src/states/spin_melee.rs +++ b/common/src/states/spin_melee.rs @@ -8,7 +8,7 @@ use crate::{ behavior::{CharacterBehavior, JoinData}, utils::*, }, - Damage, DamageSource, GroupTarget, Knockback, + Damage, DamageSource, GroupTarget, Knockback, KnockbackDir, }; use serde::{Deserialize, Serialize}; use std::time::Duration; @@ -131,7 +131,10 @@ impl CharacterBehavior for Data { max_angle: 180_f32.to_radians(), applied: false, hit_count: 0, - knockback: Knockback::Away(self.static_data.knockback), + knockback: Knockback { + strength: self.static_data.knockback, + direction: KnockbackDir::Away, + }, }); } else if self.timer < self.static_data.swing_duration { if matches!(