skullball/rust/src/player/effects.rs

97 lines
2.1 KiB
Rust

use std::collections::HashMap;
use godot::{
classes::{AudioStream, AudioStreamPlayer3D, GpuParticles3D},
prelude::*,
};
#[derive(Debug, Clone, Copy, GodotConvert, Export, Var, Default, PartialEq, PartialOrd, Eq)]
#[godot(via = GString)]
pub enum FootstepKind {
#[default]
Normal,
Sand,
Bone,
Grass,
Gravel,
Metal,
Grate,
Tile,
Water,
Wood,
}
#[derive(GodotClass)]
#[class(base=Node3D, init)]
pub struct PlayerEffects {
#[export]
splorch: Option<Gd<GpuParticles3D>>,
#[export]
hit_sound: Option<Gd<AudioStreamPlayer3D>>,
#[export]
walk_sound: Option<Gd<AudioStreamPlayer3D>>,
#[export]
footstep_kind: FootstepKind,
#[export]
footstep_sounds: Dictionary<FootstepKind, Option<Gd<AudioStream>>>,
#[export]
walk_sfx_cd: f64,
walk_sfx_cd_remaining: f64,
base: Base<Node3D>,
}
#[godot_api]
impl INode3D for PlayerEffects {
fn process(&mut self, delta: f64) {
self.walk_sfx_cd_remaining -= delta;
}
}
impl PlayerEffects {
pub fn death(&mut self) {
if let Some(splorch) = &mut self.splorch {
splorch.set_emitting(true);
}
if let Some(sfx) = &mut self.hit_sound {
sfx.play();
}
}
pub fn hit(&mut self) {
if let Some(sfx) = &mut self.hit_sound {
sfx.play();
}
}
pub fn walk(&mut self) {
if self.walk_sfx_cd_remaining > 0. {
return;
}
if let Some(walk) = &mut self.walk_sound {
walk.play();
}
self.walk_sfx_cd_remaining = self.walk_sfx_cd;
}
pub fn jump(&mut self) {
if let Some(walk) = &mut self.walk_sound {
walk.play();
}
self.walk_sfx_cd_remaining = 0.;
}
pub fn change_walk_kind(&mut self, kind: FootstepKind) {
if self.footstep_kind == kind {
return;
}
self.footstep_kind = kind;
if let Some(Some(sound)) = self.footstep_sounds.get(kind)
&& let Some(sfx) = &mut self.walk_sound
{
sfx.set_stream(&sound);
}
}
}