From 7b233f222089c8bf258bf1fbe9af185ddf6a9e25 Mon Sep 17 00:00:00 2001 From: extrawurst Date: Fri, 19 Dec 2025 09:08:02 -0500 Subject: [PATCH] allow controlling volume for sound/music --- crates/hedz_reloaded/src/client/audio/mod.rs | 27 +++++++++++ .../hedz_reloaded/src/client/audio/music.rs | 45 +++++++++++++++++++ .../src/client/{ => audio}/sounds.rs | 17 ++++--- .../src/{client.rs => client/mod.rs} | 4 +- crates/hedz_reloaded/src/client/setup.rs | 34 +------------- 5 files changed, 86 insertions(+), 41 deletions(-) create mode 100644 crates/hedz_reloaded/src/client/audio/mod.rs create mode 100644 crates/hedz_reloaded/src/client/audio/music.rs rename crates/hedz_reloaded/src/client/{ => audio}/sounds.rs (86%) rename crates/hedz_reloaded/src/{client.rs => client/mod.rs} (99%) diff --git a/crates/hedz_reloaded/src/client/audio/mod.rs b/crates/hedz_reloaded/src/client/audio/mod.rs new file mode 100644 index 0000000..b723761 --- /dev/null +++ b/crates/hedz_reloaded/src/client/audio/mod.rs @@ -0,0 +1,27 @@ +mod music; +mod sounds; + +use bevy::prelude::*; + +#[derive(Resource, Reflect, Clone, Copy, Debug)] +#[reflect(Resource)] +pub struct SoundSettings { + pub sound_volume: f32, + pub music_volume: f32, +} + +impl Default for SoundSettings { + fn default() -> Self { + Self { + sound_volume: 0.8, + music_volume: 0.5, + } + } +} + +pub fn plugin(app: &mut App) { + app.init_resource::(); + + app.add_plugins(music::plugin); + app.add_plugins(sounds::plugin); +} diff --git a/crates/hedz_reloaded/src/client/audio/music.rs b/crates/hedz_reloaded/src/client/audio/music.rs new file mode 100644 index 0000000..f462830 --- /dev/null +++ b/crates/hedz_reloaded/src/client/audio/music.rs @@ -0,0 +1,45 @@ +use crate::{GameState, client::audio::SoundSettings, loading_assets::AudioAssets}; +use bevy::{ + audio::{PlaybackMode, Volume}, + prelude::*, +}; + +#[derive(Component)] +struct Music; + +pub fn plugin(app: &mut App) { + app.add_systems(OnEnter(GameState::Playing), music); + app.add_systems(Update, settings_changed); +} + +fn settings_changed(settings: Res, mut query: Query<&mut AudioSink, With>) { + if settings.is_changed() { + for mut sink in query.iter_mut() { + sink.set_volume(Volume::Linear(settings.music_volume)); + } + } +} + +fn music(mut commands: Commands, assets: Res, settings: Res) { + commands.spawn(( + Name::new("sfx-music"), + Music, + AudioPlayer::new(assets.music.clone()), + PlaybackSettings { + mode: PlaybackMode::Loop, + volume: Volume::Linear(settings.music_volume), + ..default() + }, + )); + + commands.spawn(( + Name::new("sfx-ambient"), + Music, + AudioPlayer::new(assets.ambient.clone()), + PlaybackSettings { + mode: PlaybackMode::Loop, + volume: Volume::Linear(settings.music_volume), + ..default() + }, + )); +} diff --git a/crates/hedz_reloaded/src/client/sounds.rs b/crates/hedz_reloaded/src/client/audio/sounds.rs similarity index 86% rename from crates/hedz_reloaded/src/client/sounds.rs rename to crates/hedz_reloaded/src/client/audio/sounds.rs index b4a1edb..3540f83 100644 --- a/crates/hedz_reloaded/src/client/sounds.rs +++ b/crates/hedz_reloaded/src/client/audio/sounds.rs @@ -1,5 +1,7 @@ -use crate::{global_observer, loading_assets::AudioAssets, protocol::PlaySound}; -use bevy::prelude::*; +use crate::{ + client::audio::SoundSettings, global_observer, loading_assets::AudioAssets, protocol::PlaySound, +}; +use bevy::{audio::Volume, prelude::*}; pub fn plugin(app: &mut App) { global_observer!(app, on_spawn_sounds); @@ -8,14 +10,14 @@ pub fn plugin(app: &mut App) { fn on_spawn_sounds( trigger: On, mut commands: Commands, - // settings: SettingsRead, assets: Res, + settings: Res, ) { - let event = trigger.event(); + if settings.sound_volume <= f32::EPSILON { + return; + } - // if !settings.is_sound_on() { - // continue; - // } + let event = trigger.event(); let source = match event { PlaySound::Hit => { @@ -60,6 +62,7 @@ fn on_spawn_sounds( AudioPlayer::new(source), PlaybackSettings { mode: bevy::audio::PlaybackMode::Despawn, + volume: Volume::Linear(settings.sound_volume), ..Default::default() }, )); diff --git a/crates/hedz_reloaded/src/client.rs b/crates/hedz_reloaded/src/client/mod.rs similarity index 99% rename from crates/hedz_reloaded/src/client.rs rename to crates/hedz_reloaded/src/client/mod.rs index b7af419..ad74005 100644 --- a/crates/hedz_reloaded/src/client.rs +++ b/crates/hedz_reloaded/src/client/mod.rs @@ -26,6 +26,7 @@ use std::{ time::SystemTime, }; +pub mod audio; pub mod backpack; pub mod control; pub mod debug; @@ -33,7 +34,6 @@ pub mod enemy; pub mod heal_effect; pub mod player; pub mod setup; -pub mod sounds; pub mod steam; pub mod ui; @@ -46,7 +46,7 @@ pub fn plugin(app: &mut App) { heal_effect::plugin, player::plugin, setup::plugin, - sounds::plugin, + audio::plugin, steam::plugin, ui::plugin, )); diff --git a/crates/hedz_reloaded/src/client/setup.rs b/crates/hedz_reloaded/src/client/setup.rs index 773db24..e0670d5 100644 --- a/crates/hedz_reloaded/src/client/setup.rs +++ b/crates/hedz_reloaded/src/client/setup.rs @@ -1,10 +1,5 @@ -use crate::{DebugVisuals, GameState, camera::MainCamera, loading_assets::AudioAssets}; -use bevy::{ - audio::{PlaybackMode, Volume}, - core_pipeline::tonemapping::Tonemapping, - prelude::*, - render::view::ColorGrading, -}; +use crate::{DebugVisuals, camera::MainCamera}; +use bevy::{core_pipeline::tonemapping::Tonemapping, prelude::*, render::view::ColorGrading}; use bevy_trenchbroom::TrenchBroomServer; pub fn plugin(app: &mut App) { @@ -21,36 +16,11 @@ pub fn plugin(app: &mut App) { ..Default::default() }); app.insert_resource(ClearColor(Color::BLACK)); - //TODO: let user control this - app.insert_resource(GlobalVolume::new(Volume::Linear(0.4))); app.add_systems(Startup, write_trenchbroom_config); - app.add_systems(OnEnter(GameState::Playing), music); app.add_systems(Update, (set_materials_unlit, set_tonemapping, set_shadows)); } -fn music(assets: Res, mut commands: Commands) { - commands.spawn(( - Name::new("sfx-music"), - AudioPlayer::new(assets.music.clone()), - PlaybackSettings { - mode: PlaybackMode::Loop, - volume: Volume::Linear(0.6), - ..default() - }, - )); - - commands.spawn(( - Name::new("sfx-ambient"), - AudioPlayer::new(assets.ambient.clone()), - PlaybackSettings { - mode: PlaybackMode::Loop, - volume: Volume::Linear(0.8), - ..default() - }, - )); -} - fn write_trenchbroom_config(server: Res, type_registry: Res) { if let Err(e) = server .config