diff --git a/assets/sfx/hit/hit_00.ogg b/assets/sfx/hit/hit_00.ogg new file mode 100644 index 0000000..21fd37a Binary files /dev/null and b/assets/sfx/hit/hit_00.ogg differ diff --git a/assets/sfx/hit/hit_01.ogg b/assets/sfx/hit/hit_01.ogg new file mode 100644 index 0000000..487c39b Binary files /dev/null and b/assets/sfx/hit/hit_01.ogg differ diff --git a/assets/sfx/hit/hit_02.ogg b/assets/sfx/hit/hit_02.ogg new file mode 100644 index 0000000..329f1fe Binary files /dev/null and b/assets/sfx/hit/hit_02.ogg differ diff --git a/src/cash.rs b/src/cash.rs index b7356b4..ac52750 100644 --- a/src/cash.rs +++ b/src/cash.rs @@ -1,5 +1,7 @@ use bevy::prelude::*; +use crate::sounds::PlaySound; + #[derive(Component, Reflect, Default)] #[reflect(Component)] #[require(Transform)] @@ -28,9 +30,8 @@ fn on_collect( _trigger: Trigger, mut commands: Commands, mut cash: ResMut, - asset_server: Res, ) { - commands.spawn(AudioPlayer::new(asset_server.load("sfx/effects/cash.ogg"))); + commands.trigger(PlaySound::CashCollect); cash.cash += 100; } diff --git a/src/gates.rs b/src/gates.rs index 3c15838..f90f1ee 100644 --- a/src/gates.rs +++ b/src/gates.rs @@ -1,42 +1,34 @@ -use crate::{cutscene::StartCutscene, keys::KeyCollected, movables::TriggerMovableEvent}; +use crate::{ + cutscene::StartCutscene, keys::KeyCollected, movables::TriggerMovableEvent, sounds::PlaySound, +}; use bevy::{prelude::*, utils::hashbrown::HashSet}; pub fn plugin(app: &mut App) { app.add_observer(on_key); } -fn on_key(trigger: Trigger, mut commands: Commands, asset_server: Res) { +fn on_key(trigger: Trigger, mut commands: Commands) { match trigger.event().0.as_str() { "fence_gate" => { commands.trigger(StartCutscene("fence_01".to_string())); - //TODO: put into a sound effects system - commands.spawn(( - AudioPlayer::new(asset_server.load("sfx/effects/gate.ogg")), - PlaybackSettings::DESPAWN, - )); - let entities: HashSet<_> = vec!["fence_01", "fence_02"] .into_iter() .map(|s| String::from(s)) .collect(); + commands.trigger(PlaySound::Gate); commands.trigger(TriggerMovableEvent(entities)); } "fence_shaft" => { commands.trigger(StartCutscene("cutscene_02".to_string())); - //TODO: put into a sound effects system - commands.spawn(( - AudioPlayer::new(asset_server.load("sfx/effects/gate.ogg")), - PlaybackSettings::DESPAWN, - )); - let entities: HashSet<_> = vec!["fence_shaft"] .into_iter() .map(|s| String::from(s)) .collect(); + commands.trigger(PlaySound::Gate); commands.trigger(TriggerMovableEvent(entities)); } _ => { diff --git a/src/keys.rs b/src/keys.rs index 5ecc9c5..06492c2 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -1,4 +1,6 @@ -use crate::{billboards::Billboard, player::Player, squish_animation::SquishAnimation}; +use crate::{ + billboards::Billboard, player::Player, sounds::PlaySound, squish_animation::SquishAnimation, +}; use avian3d::prelude::*; use bevy::prelude::*; use std::f32::consts::PI; @@ -46,7 +48,6 @@ fn collect_key( mut collision_event_reader: EventReader, query_player: Query<&Player>, query_collectable: Query<&Key>, - asset_server: Res, ) { for CollisionStarted(e1, e2) in collision_event_reader.read() { let collectable = if query_player.contains(*e1) && query_collectable.contains(*e2) { @@ -59,11 +60,7 @@ fn collect_key( let key = query_collectable.get(collectable).unwrap(); - commands.spawn(( - AudioPlayer::new(asset_server.load("sfx/effects/key_collect.ogg")), - PlaybackSettings::DESPAWN, - )); - + commands.trigger(PlaySound::KeyCollect); commands.trigger(KeyCollected(key.0.clone())); commands.entity(collectable).despawn_recursive(); } diff --git a/src/main.rs b/src/main.rs index 3e89bf6..23b2549 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,7 @@ mod npc; mod platforms; mod player; mod shooting; +mod sounds; mod squish_animation; mod tb_entities; @@ -89,6 +90,7 @@ fn main() { app.add_plugins(squish_animation::plugin); app.add_plugins(cutscene::plugin); app.add_plugins(controls::plugin); + app.add_plugins(sounds::plugin); app.insert_resource(AmbientLight { color: Color::WHITE, diff --git a/src/npc.rs b/src/npc.rs index 8ad48eb..82d2218 100644 --- a/src/npc.rs +++ b/src/npc.rs @@ -1,4 +1,4 @@ -use crate::{keys::KeySpawn, tb_entities::EnemySpawn}; +use crate::{keys::KeySpawn, sounds::PlaySound, tb_entities::EnemySpawn}; use bevy::prelude::*; #[derive(Event, Reflect)] @@ -30,6 +30,8 @@ fn on_hit( return; }; + commands.trigger(PlaySound::Hit); + hp.0 = hp.0.saturating_sub(*damage as i32); info!("npc hp changed: {} [{}]", hp.0, trigger.entity()); diff --git a/src/shooting.rs b/src/shooting.rs index d92f404..a2c2dea 100644 --- a/src/shooting.rs +++ b/src/shooting.rs @@ -1,6 +1,6 @@ use bevy::prelude::*; -use crate::{aim::AimState, npc::Hit}; +use crate::{aim::AimState, npc::Hit, sounds::PlaySound}; #[derive(Event, Reflect)] pub enum TriggerState { @@ -12,17 +12,9 @@ pub fn plugin(app: &mut App) { app.add_observer(on_trigger_state); } -fn on_trigger_state( - trigger: Trigger, - mut commands: Commands, - asset_server: Res, - aim: Res, -) { +fn on_trigger_state(trigger: Trigger, mut commands: Commands, aim: Res) { if matches!(trigger.event(), TriggerState::Active) { - commands.spawn(( - AudioPlayer::new(asset_server.load("sfx/abilities/gun.ogg")), - PlaybackSettings::DESPAWN, - )); + commands.trigger(PlaySound::Gun); if let Some(target) = aim.target { commands.entity(target).trigger(Hit { damage: 20 }); diff --git a/src/sounds.rs b/src/sounds.rs new file mode 100644 index 0000000..3e1841c --- /dev/null +++ b/src/sounds.rs @@ -0,0 +1,47 @@ +use bevy::prelude::*; + +#[derive(Event, Copy, Clone, Debug)] +pub enum PlaySound { + Hit, + KeyCollect, + Gun, + Gate, + CashCollect, +} + +pub fn plugin(app: &mut App) { + app.add_observer(spawn_sounds); +} + +fn spawn_sounds( + trigger: Trigger, + mut commands: Commands, + // sound_res: Res, + // settings: SettingsRead, + asset_server: Res, +) { + let event = trigger.event(); + + // if !settings.is_sound_on() { + // continue; + // } + + let source = match event { + PlaySound::Hit => { + let version = rand::random::() % 3; + asset_server.load(format!("sfx/hit/hit_0{version}.ogg")) + } + PlaySound::KeyCollect => asset_server.load("sfx/effects/key_collect.ogg"), + PlaySound::Gun => asset_server.load("sfx/abilities/gun.ogg"), + PlaySound::Gate => asset_server.load("sfx/effects/gate.ogg"), + PlaySound::CashCollect => asset_server.load("sfx/effects/cash.ogg"), + }; + + commands.spawn(( + AudioPlayer::new(source), + PlaybackSettings { + mode: bevy::audio::PlaybackMode::Despawn, + ..Default::default() + }, + )); +}