Seismic shock

This commit is contained in:
Sam 2024-03-29 15:05:30 -04:00
parent caac8025c6
commit 171125e73e
10 changed files with 88 additions and 3 deletions

View File

@ -217,7 +217,7 @@
],
),
Simple(Hammer(Thunderclap), "common.abilities.hammer.thunderclap"),
// Simple(Hammer(SeismicShock), "common.abilities.hammer.seismic_shock"),
Simple(Hammer(SeismicShock), "common.abilities.hammer.seismic_shock"),
Contextualized(
pseudo_id: "common.abilities.hammer.heavy_whorl",
abilities: [

View File

@ -0,0 +1,22 @@
Shockwave(
energy_cost: 0,
buildup_duration: 0.6,
swing_duration: 0.2,
recover_duration: 0.6,
damage: 60,
poise_damage: 80,
knockback: (strength: 25.0, direction: Up),
shockwave_angle: 360.0,
shockwave_vertical_angle: 45.0,
shockwave_speed: 8.0,
shockwave_duration: 2.5,
dodgeable: Jump,
move_efficiency: 0.0,
damage_kind: Crushing,
specifier: Ground,
ori_rate: 0.0,
timing: PostAction,
emit_outcome: false,
minimum_combo: 20,
combo_consumption: Cost,
)

View File

@ -14,4 +14,5 @@ FinisherMelee(
angle: 15.0,
),
minimum_combo: 20,
combo_consumption: Cost,
)

BIN
assets/voxygen/element/skills/hammer/seismic_shock.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -443,3 +443,6 @@ common-abilities-hammer-tenacity = Tenacity
common-abilities-hammer-thunderclap = Thunderclap
.desc =
Unleash a devastating, adrenaline-fueled overhead strike against your foe.
common-abilities-hammer-seismic_shock = Seismic Shock
.desc =
After buildup up enough momentum in your hammer, strike the ground with enough force that it erupts outward, throwing your foes into the air.

View File

@ -943,6 +943,10 @@ pub enum CharacterAbility {
timing: shockwave::Timing,
emit_outcome: bool,
#[serde(default)]
minimum_combo: u32,
#[serde(default)]
combo_consumption: ComboConsumption,
#[serde(default)]
meta: AbilityMeta,
},
BasicBeam {
@ -1174,7 +1178,6 @@ impl CharacterAbility {
| CharacterAbility::BasicRanged { energy_cost, .. }
| CharacterAbility::ChargedRanged { energy_cost, .. }
| CharacterAbility::ChargedMelee { energy_cost, .. }
| CharacterAbility::Shockwave { energy_cost, .. }
| CharacterAbility::BasicBlock { energy_cost, .. }
| CharacterAbility::RiposteMelee { energy_cost, .. }
| CharacterAbility::ComboMelee2 {
@ -1217,6 +1220,11 @@ impl CharacterAbility {
energy_cost,
combo_cost: minimum_combo,
..
}
| CharacterAbility::Shockwave {
energy_cost,
minimum_combo,
..
} => {
data.combo.map_or(false, |c| c.counter() >= *minimum_combo)
&& update.energy.try_change_by(-*energy_cost).is_ok()
@ -1569,6 +1577,8 @@ impl CharacterAbility {
ref mut damage_effect,
timing: _,
emit_outcome: _,
minimum_combo: _,
combo_consumption: _,
meta: _,
} => {
*buildup_duration /= stats.speed;
@ -1892,6 +1902,10 @@ impl CharacterAbility {
}
| SelfBuff {
combo_cost: combo, ..
}
| Shockwave {
minimum_combo: combo,
..
} => *combo,
BasicMelee { .. }
| BasicRanged { .. }
@ -1902,7 +1916,6 @@ impl CharacterAbility {
| LeapShockwave { .. }
| ChargedMelee { .. }
| ChargedRanged { .. }
| Shockwave { .. }
| BasicBlock { .. }
| ComboMelee2 { .. }
| DiveMelee { .. }
@ -2645,6 +2658,8 @@ impl From<(&CharacterAbility, AbilityInfo, &JoinData<'_>)> for CharacterState {
damage_effect,
timing,
emit_outcome,
minimum_combo,
combo_consumption,
meta: _,
} => CharacterState::Shockwave(shockwave::Data {
static_data: shockwave::StaticData {
@ -2667,6 +2682,9 @@ impl From<(&CharacterAbility, AbilityInfo, &JoinData<'_>)> for CharacterState {
ori_rate: *ori_rate,
timing: *timing,
emit_outcome: *emit_outcome,
minimum_combo: *minimum_combo,
combo_on_use: data.combo.map_or(0, |c| c.counter()),
combo_consumption: *combo_consumption,
},
timer: Duration::default(),
stage_section: StageSection::Buildup,

View File

@ -59,6 +59,9 @@ pub struct StaticData {
pub ori_rate: f32,
/// Timing of shockwave
pub timing: Timing,
pub minimum_combo: u32,
pub combo_on_use: u32,
pub combo_consumption: ComboConsumption,
}
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
@ -194,6 +197,12 @@ impl CharacterBehavior for Data {
impl Data {
fn attack(&self, data: &JoinData, output_events: &mut OutputEvents) {
self.static_data.combo_consumption.consume(
data,
output_events,
self.static_data.minimum_combo,
);
let poise = AttackEffect::new(
Some(GroupTarget::OutOfGroup),
CombatEffect::Poise(self.static_data.poise_damage),

View File

@ -159,6 +159,33 @@ impl Animation for ShockwaveAnimation {
next.torso.orientation.rotate_x(move2 * -0.6);
next.control.orientation.rotate_x(move2 * 0.6);
},
Some("common.abilities.hammer.seismic_shock") => {
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 = move2 * pullback;
next.control.orientation.rotate_x(move1 * 2.5);
next.control.position += Vec3::new(0.0, 0.0, 28.0) * move1;
next.head.orientation.rotate_x(move1 * 0.3);
next.chest.orientation.rotate_x(move1 * 0.3);
next.belt.orientation.rotate_x(move1 * -0.2);
next.shorts.orientation.rotate_x(move1 * -0.3);
next.control.orientation.rotate_z(move2 * 2.0);
next.control.orientation.rotate_x(move2 * -4.0);
next.control.position += Vec3::new(-6.0, 0.0, -30.0) * move2;
next.head.orientation.rotate_x(move2 * -0.9);
next.chest.orientation.rotate_x(move2 * -0.5);
next.belt.orientation.rotate_x(move2 * 0.2);
next.shorts.orientation.rotate_x(move2 * 0.4);
},
_ => {},
}

View File

@ -333,6 +333,7 @@ image_ids! {
hammer_rampart: "voxygen.element.skills.hammer.rampart",
hammer_tenacity: "voxygen.element.skills.hammer.tenacity",
hammer_thunderclap: "voxygen.element.skills.hammer.thunderclap",
hammer_seismic_shock: "voxygen.element.skills.hammer.seismic_shock",
// Skilltree Icons
health_plus_skill: "voxygen.element.skills.skilltree.health_plus",
energy_plus_skill: "voxygen.element.skills.skilltree.energy_plus",

View File

@ -659,6 +659,7 @@ pub fn ability_image(imgs: &img_ids::Imgs, ability_id: &str) -> image::Id {
"common.abilities.hammer.rampart" => imgs.hammer_rampart,
"common.abilities.hammer.tenacity" => imgs.hammer_tenacity,
"common.abilities.hammer.thunderclap" => imgs.hammer_thunderclap,
"common.abilities.hammer.seismic_shock" => imgs.hammer_seismic_shock,
// Bow
"common.abilities.bow.charged" => imgs.bow_m1,
"common.abilities.bow.repeater" => imgs.bow_m2,