diff --git a/assets/common/abilities/ability_set_manifest.ron b/assets/common/abilities/ability_set_manifest.ron index 3619317c1d..075d0d17f1 100644 --- a/assets/common/abilities/ability_set_manifest.ron +++ b/assets/common/abilities/ability_set_manifest.ron @@ -202,13 +202,13 @@ Simple(Hammer(Retaliate), "common.abilities.hammer.retaliate"), Simple(Hammer(SpineCracker), "common.abilities.hammer.spine_cracker"), Simple(Hammer(Breach), "common.abilities.hammer.breach"), - // Contextualized( - // pseudo_id: "common.abilities.hammer.iron_tempest", - // abilities: [ - // ((dual_wielding_same_kind: true), (Hammer(IronTempest), "common.abilities.hammer.dual_iron_tempest")), - // ((), (Hammer(IronTempest), "common.abilities.hammer.iron_tempest")), - // ], - // ), + Contextualized( + pseudo_id: "common.abilities.hammer.iron_tempest", + abilities: [ + ((dual_wielding_same_kind: true), (Hammer(IronTempest), "common.abilities.hammer.dual_iron_tempest")), + ((), (Hammer(IronTempest), "common.abilities.hammer.iron_tempest")), + ], + ), // Contextualized( // pseudo_id: "common.abilities.hammer.upheaval", // abilities: [ diff --git a/assets/common/abilities/hammer/dual_iron_tempest.ron b/assets/common/abilities/hammer/dual_iron_tempest.ron new file mode 100644 index 0000000000..053153169d --- /dev/null +++ b/assets/common/abilities/hammer/dual_iron_tempest.ron @@ -0,0 +1,20 @@ +RapidMelee( + buildup_duration: 0.4, + swing_duration: 0.2, + recover_duration: 0.3, + melee_constructor: ( + kind: Bash( + damage: 10, + poise: 15, + knockback: 3, + energy_regen: 0, + ), + range: 4.0, + angle: 360.0, + simultaneous_hits: 2, + ), + energy_cost: 3, + max_strikes: Some(8), + move_modifier: 0.2, + ori_modifier: 1.0, +) diff --git a/assets/common/abilities/hammer/iron_tempest.ron b/assets/common/abilities/hammer/iron_tempest.ron new file mode 100644 index 0000000000..3aca3f1ef5 --- /dev/null +++ b/assets/common/abilities/hammer/iron_tempest.ron @@ -0,0 +1,19 @@ +RapidMelee( + buildup_duration: 0.4, + swing_duration: 0.15, + recover_duration: 0.3, + melee_constructor: ( + kind: Bash( + damage: 12, + poise: 15, + knockback: 3, + energy_regen: 0, + ), + range: 4.0, + angle: 360.0, + ), + energy_cost: 3, + max_strikes: Some(8), + move_modifier: 0.2, + ori_modifier: 1.0, +) diff --git a/assets/voxygen/element/skills/hammer/iron_tempest.png b/assets/voxygen/element/skills/hammer/iron_tempest.png new file mode 100644 index 0000000000..60c6e6967e --- /dev/null +++ b/assets/voxygen/element/skills/hammer/iron_tempest.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3dd859a588b0fb718e74b81564f1d2fbcabd162240843c166eecd2bca5ab714b +size 1108 diff --git a/assets/voxygen/i18n/en/hud/ability.ftl b/assets/voxygen/i18n/en/hud/ability.ftl index c590564fca..49a85c99e1 100644 --- a/assets/voxygen/i18n/en/hud/ability.ftl +++ b/assets/voxygen/i18n/en/hud/ability.ftl @@ -420,5 +420,11 @@ common-abilities-hammer-lung_pummel = Lung Pummel .desc = Swipe your hammer into your foe's side, winding them. common-abilities-hammer-helm_crusher = Helm Crusher - .dsc = + .desc = Bash your enemy's head with your hammer, concussing them. +common-abilities-hammer-iron_tempest = Iron Tempest + .desc = + Swing swiftly enough that your hammer becomes like a storm, scattering your enemies. +common-abilities-hammer-dual_iron_tempest = Iron Tempest + .desc = + Swing swiftly enough that your hammers becomes like a storm, scattering your enemies. diff --git a/voxygen/anim/src/character/rapidmelee.rs b/voxygen/anim/src/character/rapidmelee.rs index aea6f0961f..a409fe9d7e 100644 --- a/voxygen/anim/src/character/rapidmelee.rs +++ b/voxygen/anim/src/character/rapidmelee.rs @@ -1,6 +1,6 @@ use super::{ super::{vek::*, Animation}, - CharacterSkeleton, SkeletonAttr, + dual_wield_start, hammer_start, twist_back, twist_forward, CharacterSkeleton, SkeletonAttr, }; use common::states::utils::{AbilityInfo, StageSection}; use core::f32::consts::{PI, TAU}; @@ -22,7 +22,7 @@ impl Animation for RapidMeleeAnimation { #[cfg_attr(feature = "be-dyn-lib", export_name = "character_rapid_melee")] fn update_skeleton_inner( skeleton: &Self::Skeleton, - (ability_id, stage_section, (current_strike, _max_strikes), _ability_info): Self::Dependency< + (ability_id, stage_section, (current_strike, max_strikes), _ability_info): Self::Dependency< '_, >, anim_time: f32, @@ -377,6 +377,59 @@ impl Animation for RapidMeleeAnimation { next.control.orientation.rotate_x(move2 * -2.7); next.control.position += Vec3::new(move2 * 4.0, 0.0, move2 * -7.0); }, + Some("common.abilities.hammer.iron_tempest") => { + hammer_start(&mut next, s_a); + let (move1, move2, move3) = match stage_section { + Some(StageSection::Buildup) => (anim_time, 0.0, 0.0), + Some(StageSection::Action) => (1.0, anim_time, 0.0), + Some(StageSection::Recover) => (1.0, 1.0, anim_time), + _ => (0.0, 0.0, 0.0), + }; + let pullback = 1.0 - move3; + let move1 = move1 * pullback; + let move2_tot = current_strike as f32 + move2; + let move2 = move2_tot / max_strikes.map_or(1.0, |x| x as f32); + let move2 = move2 * pullback; + + twist_back(&mut next, move1, 2.0, 0.8, 0.3, 1.4); + next.control.orientation.rotate_x(move1 * 0.8); + next.control.position += Vec3::new(-15.0, 0.0, 6.0) * move1; + next.control.orientation.rotate_z(move1 * 1.2); + + next.torso.orientation.rotate_z(-TAU * move2_tot); + twist_forward(&mut next, move2, 3.0, 1.2, 0.5, 1.8); + next.control.orientation.rotate_z(move2 * -5.0); + next.control.position += Vec3::new(20.0, 0.0, 0.0) * move2; + }, + Some("common.abilities.hammer.dual_iron_tempest") => { + dual_wield_start(&mut next); + let (move1, move2, move3) = match stage_section { + Some(StageSection::Buildup) => (anim_time, 0.0, 0.0), + Some(StageSection::Action) => (1.0, anim_time, 0.0), + Some(StageSection::Recover) => (1.0, 1.0, anim_time), + _ => (0.0, 0.0, 0.0), + }; + let pullback = 1.0 - move3; + let move1 = move1 * pullback; + let move2_tot = current_strike as f32 + move2; + let move2 = move2_tot / max_strikes.map_or(1.0, |x| x as f32); + let move2 = move2 * pullback; + + twist_back(&mut next, move1, 2.0, 0.8, 0.3, 1.4); + next.control_l.orientation.rotate_y(move1 * -PI / 2.0); + next.control_r.orientation.rotate_y(move1 * -PI / 2.0); + next.control.orientation.rotate_z(move1 * 1.2); + next.control.position += Vec3::new(-10.0, 10.0, 6.0) * move1; + next.control_r.position += Vec3::new(0.0, -10.0, 0.0) * move1; + + next.torso.orientation.rotate_z(-TAU * move2_tot); + twist_forward(&mut next, move2, 3.0, 1.2, 0.5, 1.8); + next.control.orientation.rotate_z(move2 * -3.0); + next.control.position += Vec3::new(20.0, -10.0, 0.0) * move2; + next.control_r.position += Vec3::new(0.0, 10.0, 0.0) * move2; + next.control_l.position += Vec3::new(0.0, -10.0, 0.0) * move2; + // next.control.position += Vec3::new(20.0, 0.0, 0.0) * move2; + }, _ => {}, } diff --git a/voxygen/src/hud/img_ids.rs b/voxygen/src/hud/img_ids.rs index ba04c2e7d6..beee39f87d 100644 --- a/voxygen/src/hud/img_ids.rs +++ b/voxygen/src/hud/img_ids.rs @@ -328,6 +328,7 @@ image_ids! { hammer_pile_driver: "voxygen.element.skills.hammer.pile_driver", hammer_lung_pummel: "voxygen.element.skills.hammer.lung_pummel", hammer_helm_crusher: "voxygen.element.skills.hammer.helm_crusher", + hammer_iron_tempest: "voxygen.element.skills.hammer.iron_tempest", // Skilltree Icons health_plus_skill: "voxygen.element.skills.skilltree.health_plus", energy_plus_skill: "voxygen.element.skills.skilltree.energy_plus", diff --git a/voxygen/src/hud/util.rs b/voxygen/src/hud/util.rs index 42dbecf29c..a73fc6e801 100644 --- a/voxygen/src/hud/util.rs +++ b/voxygen/src/hud/util.rs @@ -646,6 +646,8 @@ pub fn ability_image(imgs: &img_ids::Imgs, ability_id: &str) -> image::Id { "common.abilities.hammer.pile_driver" => imgs.hammer_pile_driver, "common.abilities.hammer.lung_pummel" => imgs.hammer_lung_pummel, "common.abilities.hammer.helm_crusher" => imgs.hammer_helm_crusher, + "common.abilities.hammer.iron_tempest" => imgs.hammer_iron_tempest, + "common.abilities.hammer.dual_iron_tempest" => imgs.hammer_iron_tempest, // Bow "common.abilities.bow.charged" => imgs.bow_m1, "common.abilities.bow.repeater" => imgs.bow_m2,