Changed knockback from an enum to a struct.

This commit is contained in:
Sam 2021-01-25 17:46:43 -05:00
parent 3bfcf02e85
commit 78a2459e6d
12 changed files with 62 additions and 39 deletions

View File

@ -5,7 +5,7 @@ Shockwave(
recover_duration: 300, recover_duration: 300,
damage: 200, damage: 200,
poise_damage: 0, poise_damage: 0,
knockback: Away(25.0), knockback: ( strength: 25.0, direction: Away),
shockwave_angle: 360.0, shockwave_angle: 360.0,
shockwave_vertical_angle: 90.0, shockwave_vertical_angle: 90.0,
shockwave_speed: 20.0, shockwave_speed: 20.0,

View File

@ -5,7 +5,7 @@ Shockwave(
recover_duration: 800, recover_duration: 800,
damage: 500, damage: 500,
poise_damage: 0, poise_damage: 0,
knockback: TowardsUp(40.0), knockback: (strength: 40.0, direction: TowardsUp),
shockwave_angle: 90.0, shockwave_angle: 90.0,
shockwave_vertical_angle: 90.0, shockwave_vertical_angle: 90.0,
shockwave_speed: 50.0, shockwave_speed: 50.0,

View File

@ -181,34 +181,35 @@ impl Damage {
} }
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum Knockback { pub struct Knockback {
Away(f32), pub direction: KnockbackDir,
Towards(f32), pub strength: f32,
Up(f32), }
TowardsUp(f32),
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum KnockbackDir {
Away,
Towards,
Up,
TowardsUp,
} }
impl Knockback { impl Knockback {
pub fn calculate_impulse(self, dir: Dir) -> Vec3<f32> { pub fn calculate_impulse(self, dir: Dir) -> Vec3<f32> {
match self { match self.direction {
Knockback::Away(strength) => strength * *Dir::slerp(dir, Dir::new(Vec3::unit_z()), 0.5), KnockbackDir::Away => self.strength * *Dir::slerp(dir, Dir::new(Vec3::unit_z()), 0.5),
Knockback::Towards(strength) => { KnockbackDir::Towards => {
strength * *Dir::slerp(-dir, Dir::new(Vec3::unit_z()), 0.5) self.strength * *Dir::slerp(-dir, Dir::new(Vec3::unit_z()), 0.5)
}, },
Knockback::Up(strength) => strength * Vec3::unit_z(), KnockbackDir::Up => self.strength * Vec3::unit_z(),
Knockback::TowardsUp(strength) => { KnockbackDir::TowardsUp => {
strength * *Dir::slerp(-dir, Dir::new(Vec3::unit_z()), 0.85) self.strength * *Dir::slerp(-dir, Dir::new(Vec3::unit_z()), 0.85)
}, },
} }
} }
pub fn modify_strength(mut self, power: f32) -> Self { pub fn modify_strength(mut self, power: f32) -> Self {
use Knockback::*; self.strength *= power;
match self {
Away(ref mut f) | Towards(ref mut f) | Up(ref mut f) | TowardsUp(ref mut f) => {
*f *= power;
},
}
self self
} }
} }

View File

@ -2,7 +2,7 @@ use crate::{
comp::buff::{BuffCategory, BuffData, BuffKind}, comp::buff::{BuffCategory, BuffData, BuffKind},
effect::{self, BuffEffect}, effect::{self, BuffEffect},
uid::Uid, uid::Uid,
Damage, DamageSource, Explosion, GroupTarget, Knockback, RadiusEffect, Damage, DamageSource, Explosion, GroupTarget, Knockback, KnockbackDir, RadiusEffect,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use specs::Component; use specs::Component;
@ -89,7 +89,10 @@ impl ProjectileConstructor {
source: DamageSource::Projectile, source: DamageSource::Projectile,
value: damage, value: damage,
}), }),
Effect::Knockback(Knockback::Away(knockback)), Effect::Knockback(Knockback {
strength: knockback,
direction: KnockbackDir::Away,
}),
Effect::RewardEnergy(energy_regen), Effect::RewardEnergy(energy_regen),
Effect::Vanish, Effect::Vanish,
Effect::Buff { Effect::Buff {

View File

@ -55,7 +55,7 @@ pub mod util;
pub mod vol; pub mod vol;
pub mod volumes; 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 comp::inventory::loadout_builder::LoadoutBuilder;
pub use explosion::{Explosion, RadiusEffect}; pub use explosion::{Explosion, RadiusEffect};
pub use skillset_builder::SkillSetBuilder; pub use skillset_builder::SkillSetBuilder;

View File

@ -7,7 +7,7 @@ use crate::{
behavior::{CharacterBehavior, JoinData}, behavior::{CharacterBehavior, JoinData},
utils::*, utils::*,
}, },
Damage, DamageSource, GroupTarget, Knockback, Damage, DamageSource, GroupTarget, Knockback, KnockbackDir,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::time::Duration; use std::time::Duration;
@ -109,7 +109,10 @@ impl CharacterBehavior for Data {
max_angle: 180_f32.to_radians(), max_angle: 180_f32.to_radians(),
applied: false, applied: false,
hit_count: 0, 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 { } else if self.timer < self.static_data.swing_duration {
// Swings // Swings

View File

@ -7,7 +7,7 @@ use crate::{
behavior::{CharacterBehavior, JoinData}, behavior::{CharacterBehavior, JoinData},
utils::{StageSection, *}, utils::{StageSection, *},
}, },
Damage, DamageSource, GroupTarget, Knockback, Damage, DamageSource, GroupTarget, Knockback, KnockbackDir,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::time::Duration; use std::time::Duration;
@ -176,7 +176,10 @@ impl CharacterBehavior for Data {
max_angle: self.static_data.max_angle.to_radians(), max_angle: self.static_data.max_angle.to_radians(),
applied: false, applied: false,
hit_count: 0, hit_count: 0,
knockback: Knockback::Away(knockback), knockback: Knockback {
strength: knockback,
direction: KnockbackDir::Away,
},
}); });
} else if self.timer < self.static_data.swing_duration { } else if self.timer < self.static_data.swing_duration {
// Swings // Swings

View File

@ -10,7 +10,7 @@ use crate::{
behavior::{CharacterBehavior, JoinData}, behavior::{CharacterBehavior, JoinData},
utils::*, utils::*,
}, },
Damage, DamageSource, GroupTarget, Knockback, Damage, DamageSource, GroupTarget, Knockback, KnockbackDir,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::time::Duration; use std::time::Duration;
@ -114,7 +114,10 @@ impl CharacterBehavior for Data {
hit_solid: vec![projectile::Effect::Stick], hit_solid: vec![projectile::Effect::Stick],
hit_entity: vec![ hit_entity: vec![
projectile::Effect::Damage(Some(GroupTarget::OutOfGroup), damage), 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::Vanish,
projectile::Effect::Buff { projectile::Effect::Buff {
buff: BuffEffect { buff: BuffEffect {

View File

@ -7,7 +7,7 @@ use crate::{
behavior::{CharacterBehavior, JoinData}, behavior::{CharacterBehavior, JoinData},
utils::*, utils::*,
}, },
Damage, DamageSource, GroupTarget, Knockback, Damage, DamageSource, GroupTarget, Knockback, KnockbackDir,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::time::Duration; use std::time::Duration;
@ -197,9 +197,10 @@ impl CharacterBehavior for Data {
max_angle: self.static_data.stage_data[stage_index].angle.to_radians(), max_angle: self.static_data.stage_data[stage_index].angle.to_radians(),
applied: false, applied: false,
hit_count: 0, hit_count: 0,
knockback: Knockback::Away( knockback: Knockback {
self.static_data.stage_data[stage_index].knockback, strength: self.static_data.stage_data[stage_index].knockback,
), direction: KnockbackDir::Away,
},
}); });
} }
}, },

View File

@ -7,7 +7,7 @@ use crate::{
behavior::{CharacterBehavior, JoinData}, behavior::{CharacterBehavior, JoinData},
utils::*, utils::*,
}, },
Damage, DamageSource, GroupTarget, Knockback, Damage, DamageSource, GroupTarget, Knockback, KnockbackDir,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::time::Duration; use std::time::Duration;
@ -155,7 +155,10 @@ impl CharacterBehavior for Data {
max_angle: self.static_data.angle.to_radians(), max_angle: self.static_data.angle.to_radians(),
applied: false, applied: false,
hit_count: 0, hit_count: 0,
knockback: Knockback::Away(knockback), knockback: Knockback {
strength: knockback,
direction: KnockbackDir::Away,
},
}); });
} }
update.character = CharacterState::DashMelee(Data { update.character = CharacterState::DashMelee(Data {

View File

@ -4,7 +4,7 @@ use crate::{
behavior::{CharacterBehavior, JoinData}, behavior::{CharacterBehavior, JoinData},
utils::{StageSection, *}, utils::{StageSection, *},
}, },
Damage, DamageSource, GroupTarget, Knockback, Damage, DamageSource, GroupTarget, Knockback, KnockbackDir,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::time::Duration; use std::time::Duration;
@ -164,7 +164,10 @@ impl CharacterBehavior for Data {
max_angle: self.static_data.max_angle.to_radians(), max_angle: self.static_data.max_angle.to_radians(),
applied: false, applied: false,
hit_count: 0, 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 { update.character = CharacterState::LeapMelee(Data {

View File

@ -8,7 +8,7 @@ use crate::{
behavior::{CharacterBehavior, JoinData}, behavior::{CharacterBehavior, JoinData},
utils::*, utils::*,
}, },
Damage, DamageSource, GroupTarget, Knockback, Damage, DamageSource, GroupTarget, Knockback, KnockbackDir,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::time::Duration; use std::time::Duration;
@ -131,7 +131,10 @@ impl CharacterBehavior for Data {
max_angle: 180_f32.to_radians(), max_angle: 180_f32.to_radians(),
applied: false, applied: false,
hit_count: 0, 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 { } else if self.timer < self.static_data.swing_duration {
if matches!( if matches!(