From 997da21001cbcbed54ba21a82c9d27b60b7a161c Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 13 Jul 2021 20:54:43 -0500 Subject: [PATCH] Particles for healing aura --- assets/voxygen/audio/sfx.ron | 2 +- assets/voxygen/shaders/particle-vert.glsl | 15 ++++++++------- voxygen/src/audio/sfx/mod.rs | 4 ++-- voxygen/src/render/pipelines/particle.rs | 2 +- voxygen/src/scene/particle.rs | 22 ++++++++++++++++++++++ 5 files changed, 34 insertions(+), 11 deletions(-) diff --git a/assets/voxygen/audio/sfx.ron b/assets/voxygen/audio/sfx.ron index bdec10a231..4717236d79 100644 --- a/assets/voxygen/audio/sfx.ron +++ b/assets/voxygen/audio/sfx.ron @@ -802,7 +802,7 @@ ], threshold: 0.2, ), - HealingBeam: ( + SceptreBeam: ( files: [ "voxygen.audio.sfx.abilities.sceptre_channeling", ], diff --git a/assets/voxygen/shaders/particle-vert.glsl b/assets/voxygen/shaders/particle-vert.glsl index 7a2396d69f..8f2a494079 100644 --- a/assets/voxygen/shaders/particle-vert.glsl +++ b/assets/voxygen/shaders/particle-vert.glsl @@ -52,7 +52,7 @@ const int LEAF = 10; const int FIREFLY = 11; const int BEE = 12; const int GROUND_SHOCKWAVE = 13; -const int HEALING_BEAM = 14; +const int ENERGY_HEALING = 14; const int ENERGY_NATURE = 15; const int FLAMETHROWER = 16; const int FIRE_SHOCKWAVE = 17; @@ -380,13 +380,14 @@ void main() { spin_in_axis(vec3(1,0,0),0) ); break; - case HEALING_BEAM: + case ENERGY_HEALING: f_reflect = 0.0; + float spiral_radius = start_end(1 - pow(abs(rand5), 5), 1) * length(inst_dir); attr = Attr( - spiral_motion(inst_dir, 0.3 * (floor(2 * rand0 + 0.5) - 0.5) * min(linear_scale(10), 1), lifetime / inst_lifespan, 10.0, inst_time), - vec3((1.7 - 0.7 * abs(floor(2 * rand0 - 0.5) + 0.5)) * (1.5 + 0.5 * sin(tick.x * 10 - lifetime * 4))), - vec4(vec3(0.4, 1.6 + 0.3 * sin(tick.x * 10 - lifetime * 3 + 4), 1.0 + 0.15 * sin(tick.x * 5 - lifetime * 5)), 1 /*0.3*/), - spin_in_axis(inst_dir, tick.z) + spiral_motion(vec3(0, 0, rand3 + 1), spiral_radius, lifetime, abs(rand0), rand1 * 2 * PI) + vec3(0, 0, rand2), + vec3(6 * abs(rand4) * (1 - slow_start(2)) * pow(spiral_radius / length(inst_dir), 0.5)), + vec4(vec3(0, 1.7, 0.7), 1), + spin_in_axis(vec3(rand6, rand7, rand8), rand9 * 3) ); break; case LIFESTEAL_BEAM: @@ -402,7 +403,7 @@ void main() { break; case ENERGY_NATURE: f_reflect = 0.0; - float spiral_radius = start_end(1 - pow(abs(rand5), 5), 1) * length(inst_dir); + spiral_radius = start_end(1 - pow(abs(rand5), 5), 1) * length(inst_dir); attr = Attr( spiral_motion(vec3(0, 0, rand3 + 1), spiral_radius, lifetime, abs(rand0), rand1 * 2 * PI) + vec3(0, 0, rand2), vec3(6 * abs(rand4) * (1 - slow_start(2)) * pow(spiral_radius / length(inst_dir), 0.5)), diff --git a/voxygen/src/audio/sfx/mod.rs b/voxygen/src/audio/sfx/mod.rs index 8def9b0156..db678a03f9 100644 --- a/voxygen/src/audio/sfx/mod.rs +++ b/voxygen/src/audio/sfx/mod.rs @@ -175,7 +175,7 @@ pub enum SfxEvent { Parry, Block, BreakBlock, - HealingBeam, + SceptreBeam, SkillPointGain, ArrowHit, ArrowMiss, @@ -481,7 +481,7 @@ impl SfxMgr { Outcome::Beam { pos, specifier } => match specifier { beam::FrontendSpecifier::LifestealBeam => { if thread_rng().gen_bool(0.5) { - let sfx_trigger_item = triggers.get_key_value(&SfxEvent::HealingBeam); + let sfx_trigger_item = triggers.get_key_value(&SfxEvent::SceptreBeam); audio.emit_sfx(sfx_trigger_item, *pos, None, false); }; }, diff --git a/voxygen/src/render/pipelines/particle.rs b/voxygen/src/render/pipelines/particle.rs index d064348eea..677eaad62f 100644 --- a/voxygen/src/render/pipelines/particle.rs +++ b/voxygen/src/render/pipelines/particle.rs @@ -64,7 +64,7 @@ pub enum ParticleMode { Firefly = 11, Bee = 12, GroundShockwave = 13, - HealingBeam = 14, + EnergyHealing = 14, EnergyNature = 15, FlameThrower = 16, FireShockwave = 17, diff --git a/voxygen/src/scene/particle.rs b/voxygen/src/scene/particle.rs index 603dac87cc..7386b78598 100644 --- a/voxygen/src/scene/particle.rs +++ b/voxygen/src/scene/particle.rs @@ -942,6 +942,28 @@ impl ParticleMgr { }, ); }, + aura::AuraKind::Buff { + kind: buff::BuffKind::Regeneration, + .. + } => { + let heartbeats = self.scheduler.heartbeats(Duration::from_millis(5)); + self.particles.resize_with( + self.particles.len() + + aura.radius.powi(2) as usize * usize::from(heartbeats) / 300, + || { + let rand_dist = aura.radius * (1.0 - rng.gen::().powi(100)); + let init_pos = Vec3::new(rand_dist, 0_f32, 0_f32); + let max_dur = Duration::from_secs(1); + Particle::new_directed( + aura.duration.map_or(max_dur, |dur| dur.min(max_dur)), + time, + ParticleMode::EnergyHealing, + pos.0, + pos.0 + init_pos, + ) + }, + ); + }, _ => {}, } }