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,
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,

View File

@ -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,

View File

@ -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<f32> {
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
}
}

View File

@ -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 {

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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 {

View File

@ -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,
},
});
}
},

View File

@ -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 {

View File

@ -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 {

View File

@ -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!(