Merge branch 'tweak-leap_melee' into 'master'

Ensure leap melee swing animation and hit are sync

See merge request veloren/veloren!1451
This commit is contained in:
Samuel Keiffer 2020-10-24 20:15:19 +00:00
commit 39feb6baa1

View File

@ -53,63 +53,68 @@ impl CharacterBehavior for Data {
handle_jump(data, &mut update); handle_jump(data, &mut update);
match self.stage_section { match self.stage_section {
// Delay before leaping into the air
StageSection::Buildup => { StageSection::Buildup => {
// Wait for `buildup_duration` to expire
if self.timer < self.static_data.buildup_duration { if self.timer < self.static_data.buildup_duration {
// Buildup
update.character = CharacterState::LeapMelee(Data { update.character = CharacterState::LeapMelee(Data {
static_data: self.static_data,
timer: self timer: self
.timer .timer
.checked_add(Duration::from_secs_f32(data.dt.0)) .checked_add(Duration::from_secs_f32(data.dt.0))
.unwrap_or_default(), .unwrap_or_default(),
stage_section: self.stage_section, ..*self
exhausted: self.exhausted,
}); });
} else { } else {
// Transitions to leap portion of state // Transitions to leap portion of state after buildup delay
update.character = CharacterState::LeapMelee(Data { update.character = CharacterState::LeapMelee(Data {
static_data: self.static_data,
timer: Duration::default(), timer: Duration::default(),
stage_section: StageSection::Movement, stage_section: StageSection::Movement,
exhausted: self.exhausted, ..*self
}); });
} }
}, },
StageSection::Movement => { StageSection::Movement => {
// Jumping if self.timer < self.static_data.movement_duration {
// Apply jumping force while in Movement portion of state
update.vel.0 = Vec3::new( update.vel.0 = Vec3::new(
data.inputs.look_dir.x, data.inputs.look_dir.x,
data.inputs.look_dir.y, data.inputs.look_dir.y,
self.static_data.vertical_leap_strength, self.static_data.vertical_leap_strength,
) * 2.0 ) * 2.0
// Multiply decreasing amount linearly over time of
// movement duration
* (1.0 * (1.0
- self.timer.as_secs_f32() - self.timer.as_secs_f32()
/ self.static_data.movement_duration.as_secs_f32()) / self.static_data.movement_duration.as_secs_f32())
// Apply inputted movement directions at 0.25 strength
+ (update.vel.0 * Vec3::new(2.0, 2.0, 0.0) + (update.vel.0 * Vec3::new(2.0, 2.0, 0.0)
+ 0.25 * data.inputs.move_dir.try_normalized().unwrap_or_default()) + 0.25 * data.inputs.move_dir.try_normalized().unwrap_or_default())
.try_normalized() .try_normalized()
.unwrap_or_default() .unwrap_or_default()
// Multiply by forward leap strength
* self.static_data.forward_leap_strength * self.static_data.forward_leap_strength
// Control forward movement based on look direction.
// This allows players to stop moving forward when they
// look downward at target
* (1.0 - data.inputs.look_dir.z.abs()); * (1.0 - data.inputs.look_dir.z.abs());
if self.timer < self.static_data.movement_duration { // Increment duration
// Movement duration // If we were to set a timeout for state, this would be
// outside if block and have else check for > movement
// duration * some multiplier
update.character = CharacterState::LeapMelee(Data { update.character = CharacterState::LeapMelee(Data {
static_data: self.static_data,
timer: self timer: self
.timer .timer
.checked_add(Duration::from_secs_f32(data.dt.0)) .checked_add(Duration::from_secs_f32(data.dt.0))
.unwrap_or_default(), .unwrap_or_default(),
stage_section: self.stage_section, ..*self
exhausted: self.exhausted,
}); });
} else { } else if data.physics.on_ground {
// Transitions to swing portion of state // Transitions to swing portion of state upon hitting ground
update.character = CharacterState::LeapMelee(Data { update.character = CharacterState::LeapMelee(Data {
static_data: self.static_data,
timer: Duration::default(), timer: Duration::default(),
stage_section: StageSection::Swing, stage_section: StageSection::Swing,
exhausted: self.exhausted, ..*self
}); });
} }
}, },
@ -117,38 +122,24 @@ impl CharacterBehavior for Data {
if self.timer < self.static_data.swing_duration { if self.timer < self.static_data.swing_duration {
// Swings weapons // Swings weapons
update.character = CharacterState::LeapMelee(Data { update.character = CharacterState::LeapMelee(Data {
static_data: self.static_data,
timer: self timer: self
.timer .timer
.checked_add(Duration::from_secs_f32(data.dt.0)) .checked_add(Duration::from_secs_f32(data.dt.0))
.unwrap_or_default(), .unwrap_or_default(),
stage_section: self.stage_section, ..*self
exhausted: self.exhausted,
}); });
} else { } else {
// Transitions to recover portion // Transitions to recover portion
update.character = CharacterState::LeapMelee(Data { update.character = CharacterState::LeapMelee(Data {
static_data: self.static_data,
timer: Duration::default(), timer: Duration::default(),
stage_section: StageSection::Recover, stage_section: StageSection::Recover,
exhausted: self.exhausted, ..*self
}); });
} }
}, },
StageSection::Recover => { StageSection::Recover => {
if !data.physics.on_ground { if !self.exhausted {
// Falls // Hit attempt, when animation plays
update.character = CharacterState::LeapMelee(Data {
static_data: self.static_data,
timer: self
.timer
.checked_add(Duration::from_secs_f32(data.dt.0))
.unwrap_or_default(),
stage_section: self.stage_section,
exhausted: self.exhausted,
});
} else if !self.exhausted {
// Hit attempt
data.updater.insert(data.entity, Attacking { data.updater.insert(data.entity, Attacking {
base_damage: self.static_data.base_damage, base_damage: self.static_data.base_damage,
base_heal: 0, base_heal: 0,
@ -160,24 +151,21 @@ impl CharacterBehavior for Data {
}); });
update.character = CharacterState::LeapMelee(Data { update.character = CharacterState::LeapMelee(Data {
static_data: self.static_data,
timer: self timer: self
.timer .timer
.checked_add(Duration::from_secs_f32(data.dt.0)) .checked_add(Duration::from_secs_f32(data.dt.0))
.unwrap_or_default(), .unwrap_or_default(),
stage_section: self.stage_section,
exhausted: true, exhausted: true,
..*self
}); });
} else if self.timer < self.static_data.recover_duration { } else if self.timer < self.static_data.recover_duration {
// Recovers // Complete recovery delay before finishing state
update.character = CharacterState::LeapMelee(Data { update.character = CharacterState::LeapMelee(Data {
static_data: self.static_data,
timer: self timer: self
.timer .timer
.checked_add(Duration::from_secs_f32(data.dt.0)) .checked_add(Duration::from_secs_f32(data.dt.0))
.unwrap_or_default(), .unwrap_or_default(),
stage_section: self.stage_section, ..*self
exhausted: self.exhausted,
}); });
} else { } else {
// Done // Done