From 8b06d844f7191570f9342df0543d1d497811b28f Mon Sep 17 00:00:00 2001 From: Snowram Date: Thu, 21 Jan 2021 01:23:10 +0100 Subject: [PATCH] Golem spinmelee anim --- .../abilities/unique/stonegolemfist/spin.ron | 2 +- voxygen/anim/src/golem/mod.rs | 3 +- voxygen/anim/src/golem/spinmelee.rs | 85 +++++++++++++++++++ voxygen/src/scene/figure/mod.rs | 25 ++++++ 4 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 voxygen/anim/src/golem/spinmelee.rs diff --git a/assets/common/abilities/unique/stonegolemfist/spin.ron b/assets/common/abilities/unique/stonegolemfist/spin.ron index b55747e0f8..5b2b2234e6 100644 --- a/assets/common/abilities/unique/stonegolemfist/spin.ron +++ b/assets/common/abilities/unique/stonegolemfist/spin.ron @@ -1,6 +1,6 @@ SpinMelee( buildup_duration: 100, - swing_duration: 400, + swing_duration: 300, recover_duration: 100, base_damage: 500, knockback: 0.0, diff --git a/voxygen/anim/src/golem/mod.rs b/voxygen/anim/src/golem/mod.rs index 5b9a8fb9b6..a3bcf69f60 100644 --- a/voxygen/anim/src/golem/mod.rs +++ b/voxygen/anim/src/golem/mod.rs @@ -3,11 +3,12 @@ pub mod idle; pub mod jump; pub mod run; pub mod shockwave; +pub mod spinmelee; // Reexports pub use self::{ alpha::AlphaAnimation, idle::IdleAnimation, jump::JumpAnimation, run::RunAnimation, - shockwave::ShockwaveAnimation, + shockwave::ShockwaveAnimation, spinmelee::SpinMeleeAnimation, }; use super::{make_bone, vek::*, FigureBoneData, Skeleton}; diff --git a/voxygen/anim/src/golem/spinmelee.rs b/voxygen/anim/src/golem/spinmelee.rs new file mode 100644 index 0000000000..0d8cd2f505 --- /dev/null +++ b/voxygen/anim/src/golem/spinmelee.rs @@ -0,0 +1,85 @@ +use super::{ + super::{vek::*, Animation}, + GolemSkeleton, SkeletonAttr, +}; +use common::{comp::item::ToolKind, states::utils::StageSection}; +use std::f32::consts::PI; + +pub struct SpinMeleeAnimation; + +impl Animation for SpinMeleeAnimation { + type Dependency = Option; + type Skeleton = GolemSkeleton; + + #[cfg(feature = "use-dyn-lib")] + const UPDATE_FN: &'static [u8] = b"golem_spinmelee\0"; + + #[cfg_attr(feature = "be-dyn-lib", export_name = "golem_spinmelee")] + #[allow(clippy::approx_constant)] // TODO: Pending review in #587 + fn update_skeleton_inner( + skeleton: &Self::Skeleton, + stage_section: Self::Dependency, + anim_time: f64, + rate: &mut f32, + s_a: &SkeletonAttr, + ) -> Self::Skeleton { + *rate = 1.0; + let (movement1, movement2, movement3) = match stage_section { + Some(StageSection::Buildup) => ((anim_time as f32).powf(0.25), 0.0, 0.0), + Some(StageSection::Swing) => (1.0, anim_time as f32, 0.0), + Some(StageSection::Recover) => (1.0, 1.0, (anim_time as f32).powf(4.0)), + _ => (0.0, 0.0, 0.0), + }; + let mut next = (*skeleton).clone(); + + next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1) * 1.02; + next.head.orientation = + Quaternion::rotation_z(movement2 * -2.0 * PI) * Quaternion::rotation_x(-0.2); + + next.upper_torso.position = Vec3::new(0.0, s_a.upper_torso.0, s_a.upper_torso.1) / 8.0; + next.upper_torso.orientation = Quaternion::rotation_z(movement2 * 2.0 * PI); + + next.lower_torso.position = + Vec3::new(0.0, s_a.lower_torso.0, s_a.lower_torso.1 + movement1 * 5.0); + next.lower_torso.orientation = Quaternion::rotation_z(movement2 * -2.0 * PI); + + next.shoulder_l.position = Vec3::new(-s_a.shoulder.0, s_a.shoulder.1, s_a.shoulder.2); + next.shoulder_l.orientation = Quaternion::rotation_y(movement1 * 0.0) + * Quaternion::rotation_x(movement1 * 1.2 * (1.0 - movement3)); + + next.shoulder_r.position = Vec3::new(s_a.shoulder.0, s_a.shoulder.1, s_a.shoulder.2); + next.shoulder_r.orientation = Quaternion::rotation_y(movement1 * 0.0) + * Quaternion::rotation_x(movement1 * -1.2 * (1.0 - movement3)); + + next.hand_l.position = Vec3::new(-s_a.hand.0, s_a.hand.1, s_a.hand.2); + next.hand_l.orientation = Quaternion::rotation_x(movement1 * -0.2 * (1.0 - movement3)); + + next.hand_r.position = Vec3::new(s_a.hand.0, s_a.hand.1, s_a.hand.2 + movement1 * 5.0); + next.hand_r.orientation = Quaternion::rotation_x(movement1 * 0.2 * (1.0 - movement3)); + + next.leg_l.position = Vec3::new( + -s_a.leg.0 + movement1 * 3.0, + s_a.leg.1, + s_a.leg.2 + movement1 * 5.0, + ) * 1.02; + next.leg_l.orientation = Quaternion::rotation_x(0.0); + + next.leg_r.position = Vec3::new( + s_a.leg.0 - movement1 * 3.0, + s_a.leg.1, + s_a.leg.2 + movement1 * 5.0, + ) * 1.02; + next.leg_r.orientation = Quaternion::rotation_x(0.0); + + next.foot_l.position = Vec3::new(-s_a.foot.0, s_a.foot.1, s_a.foot.2 + movement1 * 5.0); + next.foot_l.orientation = Quaternion::rotation_x(0.0); + + next.foot_r.position = Vec3::new(s_a.foot.0, s_a.foot.1, s_a.foot.2 + movement1 * 5.0); + next.foot_r.orientation = Quaternion::rotation_x(0.0); + + next.torso.position = Vec3::new(0.0, 0.0, 0.0); + next.torso.orientation = Quaternion::rotation_z(0.0); + + next + } +} diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index d12c8e1be2..792f28d2e2 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -3128,6 +3128,31 @@ impl FigureMgr { skeleton_attr, ) }, + CharacterState::SpinMelee(s) => { + let stage_progress = { + let stage_time = s.timer.as_secs_f64(); + match s.stage_section { + StageSection::Buildup => { + stage_time / s.static_data.buildup_duration.as_secs_f64() + }, + StageSection::Swing => { + stage_time / s.static_data.swing_duration.as_secs_f64() + }, + StageSection::Recover => { + stage_time / s.static_data.recover_duration.as_secs_f64() + }, + _ => 0.0, + } + }; + + anim::golem::SpinMeleeAnimation::update_skeleton( + &target_base, + Some(s.stage_section), + stage_progress, + &mut state_animation_rate, + skeleton_attr, + ) + }, // TODO! _ => target_base, };