diff --git a/godot/default_bus_layout.tres b/godot/default_bus_layout.tres new file mode 100644 index 0000000..323d449 --- /dev/null +++ b/godot/default_bus_layout.tres @@ -0,0 +1,21 @@ +[gd_resource type="AudioBusLayout" format=3 uid="uid://d3ju4ldpavkl4"] + +[resource] +bus/1/name = &"SFX" +bus/1/solo = false +bus/1/mute = false +bus/1/bypass_fx = false +bus/1/volume_db = -0.13049698 +bus/1/send = &"Master" +bus/2/name = &"Music" +bus/2/solo = false +bus/2/mute = false +bus/2/bypass_fx = false +bus/2/volume_db = 0.0 +bus/2/send = &"Master" +bus/3/name = &"Announcer" +bus/3/solo = false +bus/3/mute = false +bus/3/bypass_fx = false +bus/3/volume_db = 0.0 +bus/3/send = &"Master" diff --git a/godot/scenes/misc/announcer.tscn b/godot/scenes/misc/announcer.tscn index 3b61663..f1b3403 100644 --- a/godot/scenes/misc/announcer.tscn +++ b/godot/scenes/misc/announcer.tscn @@ -13,3 +13,4 @@ triple_kill = ExtResource("3_6ob50") mega_kill = ExtResource("4_0lbme") [node name="audio_stream_player" type="AudioStreamPlayer" parent="." unique_id=1168314007] +bus = &"Announcer" diff --git a/godot/scenes/player/effects.tscn b/godot/scenes/player/effects.tscn index 92c03f8..ee36c09 100644 --- a/godot/scenes/player/effects.tscn +++ b/godot/scenes/player/effects.tscn @@ -49,7 +49,9 @@ draw_pass_1 = SubResource("TubeTrailMesh_wwb7k") [node name="hit_sound" type="AudioStreamPlayer3D" parent="." unique_id=345049143] stream = ExtResource("1_uh1ab") +bus = &"SFX" [node name="walk" type="AudioStreamPlayer3D" parent="." unique_id=1589803505] stream = SubResource("AudioStreamRandomizer_uh1ab") max_distance = 20.0 +bus = &"SFX" diff --git a/godot/scenes/player/local_player.tscn b/godot/scenes/player/local_player.tscn index 4908bbe..1a7ccfc 100644 --- a/godot/scenes/player/local_player.tscn +++ b/godot/scenes/player/local_player.tscn @@ -182,6 +182,7 @@ vertical_alignment = 2 [node name="hit_sound" type="AudioStreamPlayer" parent="." unique_id=1224745673] stream = ExtResource("7_dguuj") +bus = &"SFX" [connection signal="pressed" from="pause_menu/v_box_container/settings" to="settings" method="open"] [connection signal="pressed" from="pause_menu/v_box_container/exit_to_lobby" to="." method="exit_to_lobby"] diff --git a/godot/scenes/player/raygun.tscn b/godot/scenes/player/raygun.tscn index cc9f464..7c6c349 100644 --- a/godot/scenes/player/raygun.tscn +++ b/godot/scenes/player/raygun.tscn @@ -15,6 +15,7 @@ cooldown = 1.5 [node name="sound_emitter" type="AudioStreamPlayer3D" parent="." unique_id=1572422640] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.8420726, 0) stream = ExtResource("3_m84jv") +bus = &"SFX" [node name="bullet_source" type="Node3D" parent="." unique_id=211401237] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.36108458, -1.490972) diff --git a/godot/scenes/player/shotgun.tscn b/godot/scenes/player/shotgun.tscn index 72f5f63..d2c6212 100644 --- a/godot/scenes/player/shotgun.tscn +++ b/godot/scenes/player/shotgun.tscn @@ -57,6 +57,7 @@ cooldown = 1.0 [node name="sound_emitter" type="AudioStreamPlayer3D" parent="." unique_id=1572422640] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.8420726, 0) stream = ExtResource("1_pyt38") +bus = &"SFX" [node name="bullet_source" type="Node3D" parent="." unique_id=211401237] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.36108458, -1.2375934) @@ -72,6 +73,6 @@ one_shot = true explosiveness = 1.0 local_coords = true trail_enabled = true -trail_lifetime = 0.09999999999999999 +trail_lifetime = 0.1 process_material = SubResource("ParticleProcessMaterial_1cgct") draw_pass_1 = SubResource("TubeTrailMesh_wwb7k") diff --git a/godot/scenes/ui/slider.tscn b/godot/scenes/ui/slider.tscn index ec397c3..4dcd2c7 100644 --- a/godot/scenes/ui/slider.tscn +++ b/godot/scenes/ui/slider.tscn @@ -9,6 +9,9 @@ offset_right = 214.0 offset_bottom = 23.0 [node name="label" type="Label" parent="." unique_id=2059967949] +custom_minimum_size = Vector2(30, 0) +custom_maximum_size = Vector2(30, -1) +clip_contents = true layout_mode = 2 text = "50" diff --git a/rust/src/game_settings.rs b/rust/src/game_settings.rs index 60a3f8c..b30a711 100644 --- a/rust/src/game_settings.rs +++ b/rust/src/game_settings.rs @@ -4,14 +4,21 @@ use std::{ }; use godot::{ - classes::{FileAccess, file_access::ModeFlags}, + classes::{AudioBusLayout, AudioServer, FileAccess, file_access::ModeFlags}, prelude::*, tools::get_autoload_by_name, }; use serde::{Deserialize, Serialize}; +use crate::ui::settings::Setting::MusicVolume; + pub const NETWORK_SINGLETON_NAME: &str = "GameSettingsGlobal"; +pub const MASTER_BUS: &str = "Master"; +pub const SFX_BUS: &str = "SFX"; +pub const MUSIC_BUS: &str = "Music"; +pub const ANNOUNCER_BUS: &str = "Announcer"; + #[derive(Clone, Debug, Serialize, Deserialize)] pub struct GameSettings { pub fov: f64, @@ -28,6 +35,24 @@ pub struct VolumeSettings { pub announcer_volume: f64, } +impl VolumeSettings { + pub fn master(&self) -> f32 { + (self.master_volume / 100.) as f32 + } + + pub fn sfx(&self) -> f32 { + (self.sfx_volume / 100.) as f32 + } + + pub fn music(&self) -> f32 { + (self.music_volume / 10_000.) as f32 + } + + pub fn announcer(&self) -> f32 { + (self.announcer_volume / 100.) as f32 + } +} + #[derive(Clone, Debug, Serialize, Deserialize)] pub struct RecentServer { pub addr: SocketAddr, @@ -80,12 +105,18 @@ impl GameSettingsManager { } pub fn update_settings(&mut self, settings: GameSettings) { + set_bus_volume(MASTER_BUS, settings.volume.master()); + set_bus_volume(SFX_BUS, settings.volume.sfx()); + set_bus_volume(MUSIC_BUS, settings.volume.music()); + set_bus_volume(ANNOUNCER_BUS, settings.volume.announcer()); + self.settings = settings; if let Some(mut file) = FileAccess::open("user://config.toml", ModeFlags::WRITE) { if let Ok(serialized) = toml::to_string(&self.settings) { file.store_string(&serialized); } } + self.run_deferred(|s| s.signals().on_settings_changed().emit()); } @@ -123,3 +154,8 @@ impl GameSettingsManager { self.update_settings(settings); } } + +fn set_bus_volume(bus: &str, volume: f32) { + let idx = AudioServer::singleton().get_bus_index(bus); + AudioServer::singleton().set_bus_volume_linear(idx, volume); +} diff --git a/rust/src/player/weapon.rs b/rust/src/player/weapon.rs index f0e1ef1..70f8039 100644 --- a/rust/src/player/weapon.rs +++ b/rust/src/player/weapon.rs @@ -8,6 +8,7 @@ use serde::{Deserialize, Serialize}; use crate::{ game_manager::Game, + game_settings::{GameSettingsManager, VolumeSettings}, net::util::{cast_ray, shotgun_ray}, player::{DamageSource, shootable::Shootable}, };