diff --git a/godot/scenes/ui/settings.tscn b/godot/scenes/ui/settings.tscn index fb28c66..ebe0134 100644 --- a/godot/scenes/ui/settings.tscn +++ b/godot/scenes/ui/settings.tscn @@ -17,38 +17,20 @@ offset_bottom = 112.0 grow_horizontal = 2 grow_vertical = 2 -[node name="label" type="Label" parent="." unique_id=2036746921] -layout_mode = 0 -offset_left = 57.0 -offset_right = 357.0 -offset_bottom = 23.0 -text = "Settings" -horizontal_alignment = 1 - [node name="grid" type="GridContainer" parent="." unique_id=833231169] custom_minimum_size = Vector2(400, 0) custom_maximum_size = Vector2(400, -1) -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -145.0 -offset_top = -74.0 -offset_right = 155.0 -offset_bottom = 67.0 -grow_horizontal = 2 -grow_vertical = 2 +layout_mode = 2 columns = 2 -[node name="button" type="Button" parent="." unique_id=1301469030] -layout_mode = 0 -offset_left = 182.0 -offset_top = 192.0 -offset_right = 232.0 -offset_bottom = 223.0 +[node name="label" type="Label" parent="grid" unique_id=2036746921] +layout_mode = 2 +text = "Settings" +horizontal_alignment = 1 + +[node name="button" type="Button" parent="grid" unique_id=1301469030] +layout_mode = 2 size_flags_horizontal = 4 text = "Close" -[connection signal="pressed" from="button" to="." method="close"] +[connection signal="pressed" from="grid/button" to="." method="close"] diff --git a/rust/src/game_settings.rs b/rust/src/game_settings.rs index f4ad595..60a3f8c 100644 --- a/rust/src/game_settings.rs +++ b/rust/src/game_settings.rs @@ -17,6 +17,15 @@ pub struct GameSettings { pub fov: f64, pub default_name: String, pub recent_servers: Vec, + pub volume: VolumeSettings, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct VolumeSettings { + pub master_volume: f64, + pub sfx_volume: f64, + pub music_volume: f64, + pub announcer_volume: f64, } #[derive(Clone, Debug, Serialize, Deserialize)] @@ -31,6 +40,12 @@ impl Default for GameSettings { fov: 90., default_name: "Default McGee".to_owned(), recent_servers: Vec::new(), + volume: VolumeSettings { + master_volume: 100., + sfx_volume: 100., + music_volume: 100., + announcer_volume: 100., + }, } } } diff --git a/rust/src/ui/settings.rs b/rust/src/ui/settings.rs index a6eee1c..afc8149 100644 --- a/rust/src/ui/settings.rs +++ b/rust/src/ui/settings.rs @@ -1,7 +1,10 @@ use std::collections::HashMap; use godot::{ - classes::{Control, GridContainer, IPanel, Label, LineEdit, Panel, control::SizeFlags}, + classes::{ + Control, GridContainer, IPanel, IPanelContainer, Label, LineEdit, Panel, PanelContainer, + control::SizeFlags, + }, prelude::*, }; @@ -11,6 +14,10 @@ use crate::{game_settings::GameSettingsManager, ui::slider::SliderContainer}; pub enum Setting { FoV, DefaultName, + MasterVolume, + SfxVolume, + MusicVolume, + AnnouncerVolume, } impl ToString for Setting { @@ -18,6 +25,10 @@ impl ToString for Setting { match self { Setting::FoV => "Field of View", Setting::DefaultName => "Default Name", + Setting::MasterVolume => "Master volume", + Setting::SfxVolume => "Sfx Volume", + Setting::MusicVolume => "Music Volume", + Setting::AnnouncerVolume => "Announcer Volume", } .to_string() } @@ -37,7 +48,7 @@ pub struct SliderValue { } #[derive(GodotClass)] -#[class(base=Panel, init)] +#[class(base=PanelContainer, init)] pub struct SettingsPanel { #[export] settings_grid: Option>, @@ -46,11 +57,11 @@ pub struct SettingsPanel { settings: HashMap, - base: Base, + base: Base, } #[godot_api] -impl IPanel for SettingsPanel { +impl IPanelContainer for SettingsPanel { fn ready(&mut self) { let singleton = GameSettingsManager::singleton(); let settings = &singleton.bind().settings; @@ -66,6 +77,38 @@ impl IPanel for SettingsPanel { Setting::DefaultName, SettingValue::String(settings.default_name.clone()), ); + self.settings.insert( + Setting::MasterVolume, + SettingValue::SliderNumber(SliderValue { + min: 0., + max: 100., + value: settings.volume.master_volume, + }), + ); + self.settings.insert( + Setting::SfxVolume, + SettingValue::SliderNumber(SliderValue { + min: 0., + max: 100., + value: settings.volume.sfx_volume, + }), + ); + self.settings.insert( + Setting::MusicVolume, + SettingValue::SliderNumber(SliderValue { + min: 0., + max: 100., + value: settings.volume.music_volume, + }), + ); + self.settings.insert( + Setting::AnnouncerVolume, + SettingValue::SliderNumber(SliderValue { + min: 0., + max: 100., + value: settings.volume.announcer_volume, + }), + ); if let Some(mut grid) = self.settings_grid.clone() { for (setting, value) in &self.settings { @@ -141,6 +184,18 @@ impl SettingsPanel { (Setting::DefaultName, SettingValue::String(value)) => { new_settings.default_name = value.clone() } + (Setting::MasterVolume, SettingValue::SliderNumber(value)) => { + new_settings.volume.master_volume = value.value; + } + (Setting::SfxVolume, SettingValue::SliderNumber(value)) => { + new_settings.volume.sfx_volume = value.value; + } + (Setting::MusicVolume, SettingValue::SliderNumber(value)) => { + new_settings.volume.music_volume = value.value; + } + (Setting::AnnouncerVolume, SettingValue::SliderNumber(value)) => { + new_settings.volume.announcer_volume = value.value; + } _ => {} } }