Merge branch 'mckol/mute-keybinds' into 'master'

Mute audio keybinds (and respective buttons in settings)

See merge request veloren/veloren!3361
This commit is contained in:
Marcel 2022-09-21 09:22:45 +00:00
commit f590e68f7e
19 changed files with 393 additions and 131 deletions

View File

@ -1 +1 @@
Mckol <mckol363@gmail.com> LunarEclipse <mckol363@gmail.com>

BIN
assets/voxygen/element/ui/generic/buttons/mute_btn.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/element/ui/generic/buttons/mute_btn_hover.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/element/ui/generic/buttons/mute_btn_press.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/voxygen/element/ui/generic/buttons/muted_btn.png (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -66,3 +66,8 @@ gameinput-greet = Greet
gameinput-map-locationmarkerbutton = Set a waypoint in the Map gameinput-map-locationmarkerbutton = Set a waypoint in the Map
gameinput-spectatespeedboost = Spectate speed boost gameinput-spectatespeedboost = Spectate speed boost
gameinput-spectateviewpoint = Spectate viewpoint gameinput-spectateviewpoint = Spectate viewpoint
gameinput-mutemaster = Mute master volume
gameinput-muteinactivemaster = Mute master volume (inactive window)
gameinput-mutemusic = Mute music volume
gameinput-mutesfx = Mute SFX volume
gameinput-muteambience = Mute ambience volume

View File

@ -64,3 +64,8 @@ gameinput-mapzoomin = Przybliż mapę
gameinput-mapzoomout = Oddal mapę gameinput-mapzoomout = Oddal mapę
gameinput-greet = Pozdrów gameinput-greet = Pozdrów
gameinput-map-locationmarkerbutton = Utwórz znacznik na mapie gameinput-map-locationmarkerbutton = Utwórz znacznik na mapie
gameinput-mutemaster = Wycisz dźwięk
gameinput-muteinactivemaster = Wycisz dźwięk (okno w tle)
gameinput-mutemusic = Wycisz muzykę
gameinput-mutesfx = Wycisz efekty dźwiękowe
gameinput-muteambience = Wycisz efekty środowiskowe

View File

@ -152,6 +152,16 @@ pub enum GameInput {
SpectateSpeedBoost, SpectateSpeedBoost,
#[strum(serialize = "gameinput-spectateviewpoint")] #[strum(serialize = "gameinput-spectateviewpoint")]
SpectateViewpoint, SpectateViewpoint,
#[strum(serialize = "gameinput-mutemaster")]
MuteMaster,
#[strum(serialize = "gameinput-muteinactivemaster")]
MuteInactiveMaster,
#[strum(serialize = "gameinput-mutemusic")]
MuteMusic,
#[strum(serialize = "gameinput-mutesfx")]
MuteSfx,
#[strum(serialize = "gameinput-muteambience")]
MuteAmbience,
} }
impl GameInput { impl GameInput {

View File

@ -556,6 +556,15 @@ image_ids! {
button_hover: "voxygen.element.ui.generic.buttons.button_hover", button_hover: "voxygen.element.ui.generic.buttons.button_hover",
button_press: "voxygen.element.ui.generic.buttons.button_press", button_press: "voxygen.element.ui.generic.buttons.button_press",
// Mute Buttons
button_mute: "voxygen.element.ui.generic.buttons.mute_btn",
button_mute_hover: "voxygen.element.ui.generic.buttons.mute_btn_hover",
button_mute_press: "voxygen.element.ui.generic.buttons.mute_btn_press",
button_muted: "voxygen.element.ui.generic.buttons.muted_btn",
button_muted_hover: "voxygen.element.ui.generic.buttons.muted_btn_hover",
button_muted_press: "voxygen.element.ui.generic.buttons.muted_btn_press",
// Enemy Healthbar // Enemy Healthbar
enemy_health: "voxygen.element.ui.generic.frames.enemybar", enemy_health: "voxygen.element.ui.generic.frames.enemybar",
enemy_health_bg: "voxygen.element.ui.generic.frames.enemybar_bg", enemy_health_bg: "voxygen.element.ui.generic.frames.enemybar_bg",

View File

@ -67,7 +67,9 @@ use crate::{
}, },
session::{ session::{
interactable::Interactable, interactable::Interactable,
settings_change::{Chat as ChatChange, Interface as InterfaceChange, SettingsChange}, settings_change::{
Audio, Chat as ChatChange, Interface as InterfaceChange, SettingsChange,
},
}, },
settings::chat::ChatFilter, settings::chat::ChatFilter,
ui::{ ui::{
@ -4122,6 +4124,13 @@ impl Hud {
// Press key while not typing // Press key while not typing
WinEvent::InputUpdate(key, state) if !self.typing() => { WinEvent::InputUpdate(key, state) if !self.typing() => {
let gs_audio = &global_state.settings.audio;
let mut toggle_mute = |audio: Audio| {
self.events
.push(Event::SettingsChange(SettingsChange::Audio(audio)));
true
};
let matching_key = match key { let matching_key = match key {
GameInput::Command if state => { GameInput::Command if state => {
self.force_chat_input = Some("/".to_owned()); self.force_chat_input = Some("/".to_owned());
@ -4185,6 +4194,23 @@ impl Hud {
GameInput::MapZoomOut if state => { GameInput::MapZoomOut if state => {
handle_map_zoom(0.5, self.world_map.1, &self.show, global_state) handle_map_zoom(0.5, self.world_map.1, &self.show, global_state)
}, },
GameInput::MuteMaster if state => {
toggle_mute(Audio::MuteMasterVolume(!gs_audio.master_volume.muted))
},
GameInput::MuteInactiveMaster if state => {
toggle_mute(Audio::MuteInactiveMasterVolume(
!gs_audio.inactive_master_volume_perc.muted,
))
},
GameInput::MuteMusic if state => {
toggle_mute(Audio::MuteMusicVolume(!gs_audio.music_volume.muted))
},
GameInput::MuteSfx if state => {
toggle_mute(Audio::MuteSfxVolume(!gs_audio.sfx_volume.muted))
},
GameInput::MuteAmbience if state => {
toggle_mute(Audio::MuteAmbienceVolume(!gs_audio.ambience_volume.muted))
},
// Skillbar // Skillbar
input => { input => {
if let Some(slot) = try_hotbar_slot_from_input(input) { if let Some(slot) = try_hotbar_slot_from_input(input) {

View File

@ -1,14 +1,14 @@
use super::{RESET_BUTTONS_HEIGHT, RESET_BUTTONS_WIDTH}; use super::{RESET_BUTTONS_HEIGHT, RESET_BUTTONS_WIDTH};
use crate::{ use crate::{
hud::{img_ids::Imgs, TEXT_COLOR}, hud::{img_ids::Imgs, TEXT_COLOR, TEXT_COLOR_GREY},
session::settings_change::{Audio as AudioChange, Audio::*}, session::settings_change::{Audio as AudioChange, Audio::*},
ui::{fonts::Fonts, ImageSlider}, ui::{fonts::Fonts, ImageSlider, ToggleButton},
GlobalState, GlobalState,
}; };
use conrod_core::{ use conrod_core::{
color, color,
position::Relative, position::{Align, Relative},
widget::{self, Button, Rectangle, Scrollbar, Text}, widget::{self, Button, Rectangle, Scrollbar, Text},
widget_ids, Colorable, Labelable, Positionable, Sizeable, Widget, WidgetCommon, widget_ids, Colorable, Labelable, Positionable, Sizeable, Widget, WidgetCommon,
}; };
@ -22,18 +22,23 @@ widget_ids! {
master_volume_text, master_volume_text,
master_volume_slider, master_volume_slider,
master_volume_number, master_volume_number,
master_volume_muted,
inactive_master_volume_text, inactive_master_volume_text,
inactive_master_volume_slider, inactive_master_volume_slider,
inactive_master_volume_number, inactive_master_volume_number,
inactive_master_volume_muted,
music_volume_text, music_volume_text,
music_volume_slider, music_volume_slider,
music_volume_number, music_volume_number,
music_volume_muted,
sfx_volume_text, sfx_volume_text,
sfx_volume_slider, sfx_volume_slider,
sfx_volume_number, sfx_volume_number,
sfx_volume_muted,
ambience_volume_text, ambience_volume_text,
ambience_volume_slider, ambience_volume_slider,
ambience_volume_number, ambience_volume_number,
ambience_volume_muted,
music_spacing_text, music_spacing_text,
music_spacing_slider, music_spacing_slider,
music_spacing_number, music_spacing_number,
@ -107,6 +112,12 @@ impl<'a> Widget for Sound<'a> {
.rgba(0.33, 0.33, 0.33, 1.0) .rgba(0.33, 0.33, 0.33, 1.0)
.set(state.ids.window_scrollbar, ui); .set(state.ids.window_scrollbar, ui);
let non_master_volume_text_color =
match self.global_state.settings.audio.master_volume.muted {
true => TEXT_COLOR_GREY,
false => TEXT_COLOR,
};
// Master Volume // Master Volume
Text::new(&self.localized_strings.get_msg("hud-settings-master_volume")) Text::new(&self.localized_strings.get_msg("hud-settings-master_volume"))
.top_left_with_margins_on(state.ids.window, 10.0, 10.0) .top_left_with_margins_on(state.ids.window, 10.0, 10.0)
@ -114,16 +125,30 @@ impl<'a> Widget for Sound<'a> {
.font_id(self.fonts.cyri.conrod_id) .font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR) .color(TEXT_COLOR)
.set(state.ids.master_volume_text, ui); .set(state.ids.master_volume_text, ui);
// Master Volume Muted Indicator
let master_muted = ToggleButton::new(
self.global_state.settings.audio.master_volume.muted,
self.imgs.button_mute,
self.imgs.button_muted,
)
.w_h(24.0, 25.0)
.down_from(state.ids.master_volume_text, 10.0)
.hover_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover)
.press_images(self.imgs.button_mute_press, self.imgs.button_muted_press)
.set(state.ids.master_volume_muted, ui);
if master_muted != self.global_state.settings.audio.master_volume.muted {
events.push(MuteMasterVolume(master_muted));
}
// Master Volume Slider // Master Volume Slider
if let Some(new_val) = ImageSlider::continuous( if let Some(new_val) = ImageSlider::continuous(
self.global_state.settings.audio.master_volume, self.global_state.settings.audio.master_volume.volume,
0.0, 0.0,
1.0, 1.0,
self.imgs.slider_indicator, self.imgs.slider_indicator,
self.imgs.slider, self.imgs.slider,
) )
.w_h(104.0, 22.0) .w_h(104.0, 22.0)
.down_from(state.ids.master_volume_text, 10.0) .right_from(state.ids.master_volume_muted, 8.0)
.track_breadth(12.0) .track_breadth(12.0)
.slider_length(10.0) .slider_length(10.0)
.pad_track((5.0, 5.0)) .pad_track((5.0, 5.0))
@ -134,7 +159,7 @@ impl<'a> Widget for Sound<'a> {
// Master Volume Number // Master Volume Number
Text::new(&format!( Text::new(&format!(
"{:2.0}%", "{:2.0}%",
self.global_state.settings.audio.master_volume * 100.0 self.global_state.settings.audio.master_volume.volume * 100.0
)) ))
.right_from(state.ids.master_volume_slider, 8.0) .right_from(state.ids.master_volume_slider, 8.0)
.font_size(self.fonts.cyri.scale(14)) .font_size(self.fonts.cyri.scale(14))
@ -148,21 +173,50 @@ impl<'a> Widget for Sound<'a> {
.localized_strings .localized_strings
.get_msg("hud-settings-inactive_master_volume_perc"), .get_msg("hud-settings-inactive_master_volume_perc"),
) )
.down_from(state.ids.master_volume_slider, 10.0) .down_from(state.ids.master_volume_muted, 10.0)
.font_size(self.fonts.cyri.scale(14)) .font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id) .font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR) .color(TEXT_COLOR)
.set(state.ids.inactive_master_volume_text, ui); .set(state.ids.inactive_master_volume_text, ui);
// Master Volume (inactive window) Muted Indicator
let inactive_master_muted = ToggleButton::new(
self.global_state
.settings
.audio
.inactive_master_volume_perc
.muted,
self.imgs.button_mute,
self.imgs.button_muted,
)
.w_h(24.0, 25.0)
.down_from(state.ids.inactive_master_volume_text, 10.0)
.hover_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover)
.press_images(self.imgs.button_mute_press, self.imgs.button_muted_press)
.set(state.ids.inactive_master_volume_muted, ui);
if inactive_master_muted
!= self
.global_state
.settings
.audio
.inactive_master_volume_perc
.muted
{
events.push(MuteInactiveMasterVolume(inactive_master_muted));
}
// Master Volume (inactive window) Slider // Master Volume (inactive window) Slider
if let Some(new_val) = ImageSlider::continuous( if let Some(new_val) = ImageSlider::continuous(
self.global_state.settings.audio.inactive_master_volume_perc, self.global_state
.settings
.audio
.inactive_master_volume_perc
.volume,
0.0, 0.0,
1.0, 1.0,
self.imgs.slider_indicator, self.imgs.slider_indicator,
self.imgs.slider, self.imgs.slider,
) )
.w_h(104.0, 22.0) .w_h(104.0, 22.0)
.down_from(state.ids.inactive_master_volume_text, 10.0) .right_from(state.ids.inactive_master_volume_muted, 8.0)
.track_breadth(12.0) .track_breadth(12.0)
.slider_length(10.0) .slider_length(10.0)
.pad_track((5.0, 5.0)) .pad_track((5.0, 5.0))
@ -173,31 +227,50 @@ impl<'a> Widget for Sound<'a> {
// Master Volume (inactive window) Number // Master Volume (inactive window) Number
Text::new(&format!( Text::new(&format!(
"{:2.0}%", "{:2.0}%",
self.global_state.settings.audio.inactive_master_volume_perc * 100.0 self.global_state
.settings
.audio
.inactive_master_volume_perc
.volume
* 100.0
)) ))
.right_from(state.ids.inactive_master_volume_slider, 8.0) .right_from(state.ids.inactive_master_volume_slider, 8.0)
.font_size(self.fonts.cyri.scale(14)) .font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id) .font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR) .color(non_master_volume_text_color)
.set(state.ids.inactive_master_volume_number, ui); .set(state.ids.inactive_master_volume_number, ui);
// Music Volume // Music Volume
Text::new(&self.localized_strings.get_msg("hud-settings-music_volume")) Text::new(&self.localized_strings.get_msg("hud-settings-music_volume"))
.down_from(state.ids.inactive_master_volume_slider, 10.0) .down_from(state.ids.inactive_master_volume_muted, 10.0)
.font_size(self.fonts.cyri.scale(14)) .font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id) .font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR) .color(TEXT_COLOR)
.set(state.ids.music_volume_text, ui); .set(state.ids.music_volume_text, ui);
// Music Muted Indicator
let music_muted = ToggleButton::new(
self.global_state.settings.audio.music_volume.muted,
self.imgs.button_mute,
self.imgs.button_muted,
)
.w_h(24.0, 25.0)
.down_from(state.ids.music_volume_text, 10.0)
.hover_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover)
.press_images(self.imgs.button_mute_press, self.imgs.button_muted_press)
.set(state.ids.music_volume_muted, ui);
if music_muted != self.global_state.settings.audio.music_volume.muted {
events.push(MuteMusicVolume(music_muted));
}
// Music Volume Slider // Music Volume Slider
if let Some(new_val) = ImageSlider::continuous( if let Some(new_val) = ImageSlider::continuous(
self.global_state.settings.audio.music_volume, self.global_state.settings.audio.music_volume.volume,
0.0, 0.0,
1.0, 1.0,
self.imgs.slider_indicator, self.imgs.slider_indicator,
self.imgs.slider, self.imgs.slider,
) )
.w_h(104.0, 22.0) .w_h(104.0, 22.0)
.down_from(state.ids.music_volume_text, 10.0) .right_from(state.ids.music_volume_muted, 8.0)
.track_breadth(12.0) .track_breadth(12.0)
.slider_length(10.0) .slider_length(10.0)
.pad_track((5.0, 5.0)) .pad_track((5.0, 5.0))
@ -208,12 +281,12 @@ impl<'a> Widget for Sound<'a> {
// Music Volume Number // Music Volume Number
Text::new(&format!( Text::new(&format!(
"{:2.0}%", "{:2.0}%",
self.global_state.settings.audio.music_volume * 100.0 self.global_state.settings.audio.music_volume.volume * 100.0
)) ))
.right_from(state.ids.music_volume_slider, 8.0) .right_from(state.ids.music_volume_slider, 8.0)
.font_size(self.fonts.cyri.scale(14)) .font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id) .font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR) .color(non_master_volume_text_color)
.set(state.ids.music_volume_number, ui); .set(state.ids.music_volume_number, ui);
// SFX Volume // SFX Volume
@ -222,21 +295,35 @@ impl<'a> Widget for Sound<'a> {
.localized_strings .localized_strings
.get_msg("hud-settings-sound_effect_volume"), .get_msg("hud-settings-sound_effect_volume"),
) )
.down_from(state.ids.music_volume_slider, 10.0) .down_from(state.ids.music_volume_muted, 10.0)
.font_size(self.fonts.cyri.scale(14)) .font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id) .font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR) .color(TEXT_COLOR)
.set(state.ids.sfx_volume_text, ui); .set(state.ids.sfx_volume_text, ui);
// SFX Volume Muted Indicator
let sfx_muted = ToggleButton::new(
self.global_state.settings.audio.sfx_volume.muted,
self.imgs.button_mute,
self.imgs.button_muted,
)
.w_h(24.0, 25.0)
.down_from(state.ids.sfx_volume_text, 10.0)
.hover_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover)
.press_images(self.imgs.button_mute_press, self.imgs.button_muted_press)
.set(state.ids.sfx_volume_muted, ui);
if sfx_muted != self.global_state.settings.audio.sfx_volume.muted {
events.push(MuteSfxVolume(sfx_muted));
}
// SFX Volume Slider // SFX Volume Slider
if let Some(new_val) = ImageSlider::continuous( if let Some(new_val) = ImageSlider::continuous(
self.global_state.settings.audio.sfx_volume, self.global_state.settings.audio.sfx_volume.volume,
0.0, 0.0,
1.0, 1.0,
self.imgs.slider_indicator, self.imgs.slider_indicator,
self.imgs.slider, self.imgs.slider,
) )
.w_h(104.0, 22.0) .w_h(104.0, 22.0)
.down_from(state.ids.sfx_volume_text, 10.0) .right_from(state.ids.sfx_volume_muted, 8.0)
.track_breadth(12.0) .track_breadth(12.0)
.slider_length(10.0) .slider_length(10.0)
.pad_track((5.0, 5.0)) .pad_track((5.0, 5.0))
@ -247,34 +334,49 @@ impl<'a> Widget for Sound<'a> {
// SFX Volume Number // SFX Volume Number
Text::new(&format!( Text::new(&format!(
"{:2.0}%", "{:2.0}%",
self.global_state.settings.audio.sfx_volume * 100.0 self.global_state.settings.audio.sfx_volume.volume * 100.0
)) ))
.right_from(state.ids.sfx_volume_slider, 8.0) .right_from(state.ids.sfx_volume_slider, 8.0)
.font_size(self.fonts.cyri.scale(14)) .font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id) .font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR) .color(non_master_volume_text_color)
.set(state.ids.sfx_volume_number, ui); .set(state.ids.sfx_volume_number, ui);
// Ambience Volume // Ambience Volume
Text::new( Text::new(
&self &self
.localized_strings .localized_strings
.get_msg("hud-settings-ambience_volume"), .get_msg("hud-settings-ambience_volume"),
) )
.down_from(state.ids.sfx_volume_slider, 10.0) .down_from(state.ids.sfx_volume_muted, 10.0)
.font_size(self.fonts.cyri.scale(14)) .font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id) .font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR) .color(TEXT_COLOR)
.set(state.ids.ambience_volume_text, ui); .set(state.ids.ambience_volume_text, ui);
// Ambience Volume Muted Indicator
let ambience_muted = ToggleButton::new(
self.global_state.settings.audio.ambience_volume.muted,
self.imgs.button_mute,
self.imgs.button_muted,
)
.w_h(24.0, 25.0)
.down_from(state.ids.ambience_volume_text, 10.0)
.hover_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover)
.press_images(self.imgs.button_mute_press, self.imgs.button_muted_press)
.set(state.ids.ambience_volume_muted, ui);
if ambience_muted != self.global_state.settings.audio.ambience_volume.muted {
events.push(MuteAmbienceVolume(ambience_muted));
}
// Ambience Volume Slider // Ambience Volume Slider
if let Some(new_val) = ImageSlider::continuous( if let Some(new_val) = ImageSlider::continuous(
self.global_state.settings.audio.ambience_volume, self.global_state.settings.audio.ambience_volume.volume,
0.0, 0.0,
1.0, 1.0,
self.imgs.slider_indicator, self.imgs.slider_indicator,
self.imgs.slider, self.imgs.slider,
) )
.w_h(104.0, 22.0) .w_h(104.0, 22.0)
.down_from(state.ids.ambience_volume_text, 10.0) .right_from(state.ids.ambience_volume_muted, 8.0)
.track_breadth(12.0) .track_breadth(12.0)
.slider_length(10.0) .slider_length(10.0)
.pad_track((5.0, 5.0)) .pad_track((5.0, 5.0))
@ -285,17 +387,17 @@ impl<'a> Widget for Sound<'a> {
// Ambience Volume Number // Ambience Volume Number
Text::new(&format!( Text::new(&format!(
"{:2.0}%", "{:2.0}%",
self.global_state.settings.audio.ambience_volume * 100.0 self.global_state.settings.audio.ambience_volume.volume * 100.0
)) ))
.right_from(state.ids.ambience_volume_slider, 8.0) .right_from(state.ids.ambience_volume_slider, 8.0)
.font_size(self.fonts.cyri.scale(14)) .font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id) .font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR) .color(non_master_volume_text_color)
.set(state.ids.ambience_volume_number, ui); .set(state.ids.ambience_volume_number, ui);
// Music spacing // Music spacing
Text::new(&self.localized_strings.get_msg("hud-settings-music_spacing")) Text::new(&self.localized_strings.get_msg("hud-settings-music_spacing"))
.down_from(state.ids.ambience_volume_slider, 10.0) .down_from(state.ids.ambience_volume_muted, 10.0)
.font_size(self.fonts.cyri.scale(14)) .font_size(self.fonts.cyri.scale(14))
.font_id(self.fonts.cyri.conrod_id) .font_id(self.fonts.cyri.conrod_id)
.color(TEXT_COLOR) .color(TEXT_COLOR)
@ -310,6 +412,7 @@ impl<'a> Widget for Sound<'a> {
) )
.w_h(104.0, 22.0) .w_h(104.0, 22.0)
.down_from(state.ids.music_spacing_text, 10.0) .down_from(state.ids.music_spacing_text, 10.0)
.x_align_to(state.ids.ambience_volume_slider, Align::Start)
.track_breadth(12.0) .track_breadth(12.0)
.slider_length(10.0) .slider_length(10.0)
.pad_track((5.0, 5.0)) .pad_track((5.0, 5.0))
@ -361,6 +464,7 @@ impl<'a> Widget for Sound<'a> {
.hover_image(self.imgs.button_hover) .hover_image(self.imgs.button_hover)
.press_image(self.imgs.button_press) .press_image(self.imgs.button_press)
.down_from(state.ids.music_spacing_slider, 12.0) .down_from(state.ids.music_spacing_slider, 12.0)
.x_align_to(state.ids.ambience_volume_text, Align::Start)
.label(&self.localized_strings.get_msg("hud-settings-reset_sound")) .label(&self.localized_strings.get_msg("hud-settings-reset_sound"))
.label_font_size(self.fonts.cyri.scale(14)) .label_font_size(self.fonts.cyri.scale(14))
.label_color(TEXT_COLOR) .label_color(TEXT_COLOR)

View File

@ -142,10 +142,10 @@ fn main() {
// AudioOutput::Device(ref dev) => Some(dev.clone()), // AudioOutput::Device(ref dev) => Some(dev.clone()),
}; };
audio.set_master_volume(settings.audio.master_volume); audio.set_master_volume(settings.audio.master_volume.get_checked());
audio.set_music_volume(settings.audio.music_volume); audio.set_music_volume(settings.audio.music_volume.get_checked());
audio.set_sfx_volume(settings.audio.sfx_volume); audio.set_sfx_volume(settings.audio.sfx_volume.get_checked());
audio.set_ambience_volume(settings.audio.ambience_volume); audio.set_ambience_volume(settings.audio.ambience_volume.get_checked());
audio.set_music_spacing(settings.audio.music_spacing); audio.set_music_spacing(settings.audio.music_spacing);
// Load the profile. // Load the profile.

View File

@ -103,7 +103,10 @@ impl Screen {
let key = |code| match controls.keybindings.get(&code) { let key = |code| match controls.keybindings.get(&code) {
Some(Some(key_mouse)) => key_mouse.display_string(key_layout), Some(Some(key_mouse)) => key_mouse.display_string(key_layout),
Some(None) => i18n.get_msg("main-unbound_key_tip").into_owned(), Some(None) => i18n.get_msg("main-unbound_key_tip").into_owned(),
None => ControlSettings::default_binding(code).display_string(key_layout), None => match ControlSettings::default_binding(code) {
Some(key_mouse) => key_mouse.display_string(key_layout),
None => i18n.get_msg("main-unbound_key_tip").into_owned(),
},
}; };
let keys = i18n::fluent_args! { let keys = i18n::fluent_args! {
"gameinput-togglelantern" => key(GameInput::ToggleLantern), "gameinput-togglelantern" => key(GameInput::ToggleLantern),

View File

@ -90,10 +90,14 @@ pub fn run(mut global_state: GlobalState, event_loop: EventLoop, server: Option<
if let winit::event::WindowEvent::Focused(focused) = event { if let winit::event::WindowEvent::Focused(focused) = event {
global_state.audio.set_master_volume(if focused { global_state.audio.set_master_volume(if focused {
global_state.settings.audio.master_volume global_state.settings.audio.master_volume.get_checked()
} else { } else {
global_state.settings.audio.inactive_master_volume_perc global_state
* global_state.settings.audio.master_volume .settings
.audio
.inactive_master_volume_perc
.get_checked()
* global_state.settings.audio.master_volume.get_checked()
}); });
} }

View File

@ -8,8 +8,8 @@ use crate::{
}, },
render::RenderMode, render::RenderMode,
settings::{ settings::{
AudioSettings, ChatSettings, ControlSettings, Fps, GamepadSettings, GameplaySettings, audio::AudioVolume, AudioSettings, ChatSettings, ControlSettings, Fps, GamepadSettings,
GraphicsSettings, InterfaceSettings, GameplaySettings, GraphicsSettings, InterfaceSettings,
}, },
window::FullScreenSettings, window::FullScreenSettings,
GlobalState, GlobalState,
@ -19,10 +19,15 @@ use i18n::{LanguageMetadata, LocalizationHandle};
#[derive(Clone)] #[derive(Clone)]
pub enum Audio { pub enum Audio {
AdjustMasterVolume(f32), AdjustMasterVolume(f32),
MuteMasterVolume(bool),
AdjustInactiveMasterVolume(f32), AdjustInactiveMasterVolume(f32),
MuteInactiveMasterVolume(bool),
AdjustMusicVolume(f32), AdjustMusicVolume(f32),
MuteMusicVolume(bool),
AdjustSfxVolume(f32), AdjustSfxVolume(f32),
MuteSfxVolume(bool),
AdjustAmbienceVolume(f32), AdjustAmbienceVolume(f32),
MuteAmbienceVolume(bool),
AdjustMusicSpacing(f32), AdjustMusicSpacing(f32),
//ChangeAudioDevice(String), //ChangeAudioDevice(String),
ResetAudioSettings, ResetAudioSettings,
@ -194,31 +199,73 @@ settings_change_from!(Networking);
impl SettingsChange { impl SettingsChange {
pub fn process(self, global_state: &mut GlobalState, session_state: &mut SessionState) { pub fn process(self, global_state: &mut GlobalState, session_state: &mut SessionState) {
let mut settings = &mut global_state.settings; let mut settings = &mut global_state.settings;
match self { match self {
SettingsChange::Audio(audio_change) => { SettingsChange::Audio(audio_change) => {
fn update_volume(audio: &mut AudioVolume, volume: f32) -> f32 {
audio.volume = volume;
audio.get_checked()
}
fn update_muted(audio: &mut AudioVolume, muted: bool) -> f32 {
audio.muted = muted;
audio.get_checked()
}
match audio_change { match audio_change {
Audio::AdjustMasterVolume(master_volume) => { Audio::AdjustMasterVolume(master_volume) => {
global_state.audio.set_master_volume(master_volume); let volume_checked =
update_volume(&mut settings.audio.master_volume, master_volume);
settings.audio.master_volume = master_volume; global_state.audio.set_master_volume(volume_checked);
},
Audio::MuteMasterVolume(master_muted) => {
let volume_checked =
update_muted(&mut settings.audio.master_volume, master_muted);
global_state.audio.set_master_volume(volume_checked);
}, },
Audio::AdjustInactiveMasterVolume(inactive_master_volume_perc) => { Audio::AdjustInactiveMasterVolume(inactive_master_volume_perc) => {
settings.audio.inactive_master_volume_perc = inactive_master_volume_perc; settings.audio.inactive_master_volume_perc.volume =
inactive_master_volume_perc;
},
Audio::MuteInactiveMasterVolume(inactive_master_volume_muted) => {
settings.audio.inactive_master_volume_perc.muted =
inactive_master_volume_muted;
}, },
Audio::AdjustMusicVolume(music_volume) => { Audio::AdjustMusicVolume(music_volume) => {
global_state.audio.set_music_volume(music_volume); let volume_checked =
update_volume(&mut settings.audio.music_volume, music_volume);
settings.audio.music_volume = music_volume; global_state.audio.set_music_volume(volume_checked);
},
Audio::MuteMusicVolume(music_muted) => {
let volume_checked =
update_muted(&mut settings.audio.music_volume, music_muted);
global_state.audio.set_music_volume(volume_checked);
}, },
Audio::AdjustSfxVolume(sfx_volume) => { Audio::AdjustSfxVolume(sfx_volume) => {
global_state.audio.set_sfx_volume(sfx_volume); let volume_checked =
update_volume(&mut settings.audio.sfx_volume, sfx_volume);
settings.audio.sfx_volume = sfx_volume; global_state.audio.set_sfx_volume(volume_checked);
},
Audio::MuteSfxVolume(sfx_muted) => {
let volume_checked =
update_muted(&mut settings.audio.sfx_volume, sfx_muted);
global_state.audio.set_sfx_volume(volume_checked);
}, },
Audio::AdjustAmbienceVolume(ambience_volume) => { Audio::AdjustAmbienceVolume(ambience_volume) => {
global_state.audio.set_ambience_volume(ambience_volume); global_state.audio.set_ambience_volume(ambience_volume);
settings.audio.ambience_volume = ambience_volume; settings.audio.ambience_volume.volume = ambience_volume;
},
Audio::MuteAmbienceVolume(ambience_muted) => {
let volume_checked =
update_muted(&mut settings.audio.ambience_volume, ambience_muted);
global_state.audio.set_ambience_volume(volume_checked);
}, },
Audio::AdjustMusicSpacing(multiplier) => { Audio::AdjustMusicSpacing(multiplier) => {
global_state.audio.set_music_spacing(multiplier); global_state.audio.set_music_spacing(multiplier);
@ -232,9 +279,14 @@ impl SettingsChange {
//}, //},
Audio::ResetAudioSettings => { Audio::ResetAudioSettings => {
settings.audio = AudioSettings::default(); settings.audio = AudioSettings::default();
let audio = &settings.audio;
global_state.audio.set_music_volume(audio.music_volume); let audio = &mut global_state.audio;
global_state.audio.set_sfx_volume(audio.sfx_volume);
// TODO: check if updating the master volume is necessary
// (it wasn't done before)
audio.set_master_volume(settings.audio.master_volume.get_checked());
audio.set_music_volume(settings.audio.music_volume.get_checked());
audio.set_sfx_volume(settings.audio.sfx_volume.get_checked());
}, },
} }
}, },

View File

@ -15,17 +15,35 @@ pub enum AudioOutput {
impl AudioOutput { impl AudioOutput {
pub fn is_enabled(&self) -> bool { !matches!(self, Self::Off) } pub fn is_enabled(&self) -> bool { !matches!(self, Self::Off) }
} }
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
pub struct AudioVolume {
pub volume: f32,
pub muted: bool,
}
impl AudioVolume {
pub fn new(volume: f32, muted: bool) -> Self { Self { volume, muted } }
pub fn get_checked(&self) -> f32 {
match self.muted {
true => 0.0,
false => self.volume,
}
}
}
/// `AudioSettings` controls the volume of different audio subsystems and which /// `AudioSettings` controls the volume of different audio subsystems and which
/// device is used. /// device is used.
#[derive(Clone, Debug, Serialize, Deserialize)] #[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(default)] #[serde(default)]
pub struct AudioSettings { pub struct AudioSettings {
pub master_volume: f32, pub master_volume: AudioVolume,
#[serde(rename = "inactive_master_volume")] #[serde(rename = "inactive_master_volume")]
pub inactive_master_volume_perc: f32, pub inactive_master_volume_perc: AudioVolume,
pub music_volume: f32, pub music_volume: AudioVolume,
pub sfx_volume: f32, pub sfx_volume: AudioVolume,
pub ambience_volume: f32, pub ambience_volume: AudioVolume,
pub num_sfx_channels: usize, pub num_sfx_channels: usize,
pub num_ui_channels: usize, pub num_ui_channels: usize,
pub music_spacing: f32, pub music_spacing: f32,
@ -37,11 +55,11 @@ pub struct AudioSettings {
impl Default for AudioSettings { impl Default for AudioSettings {
fn default() -> Self { fn default() -> Self {
Self { Self {
master_volume: 1.0, master_volume: AudioVolume::new(1.0, false),
inactive_master_volume_perc: 0.5, inactive_master_volume_perc: AudioVolume::new(0.5, false),
music_volume: 0.25, music_volume: AudioVolume::new(0.4, false),
sfx_volume: 0.6, sfx_volume: AudioVolume::new(0.6, false),
ambience_volume: 0.6, ambience_volume: AudioVolume::new(0.6, false),
num_sfx_channels: 60, num_sfx_channels: 60,
num_ui_channels: 10, num_ui_channels: 10,
music_spacing: 1.0, music_spacing: 1.0,

View File

@ -17,7 +17,7 @@ impl From<ControlSettings> for ControlSettingsSerde {
// Do a delta between default() ControlSettings and the argument, and let // Do a delta between default() ControlSettings and the argument, and let
// keybindings be only the custom keybindings chosen by the user. // keybindings be only the custom keybindings chosen by the user.
for (k, v) in control_settings.keybindings { for (k, v) in control_settings.keybindings {
if Some(ControlSettings::default_binding(k)) != v { if ControlSettings::default_binding(k) != v {
// Keybinding chosen by the user // Keybinding chosen by the user
user_bindings.insert(k, v); user_bindings.insert(k, v);
} }
@ -121,76 +121,81 @@ impl ControlSettings {
false false
} }
pub fn default_binding(game_input: GameInput) -> KeyMouse { pub fn default_binding(game_input: GameInput) -> Option<KeyMouse> {
// If a new GameInput is added, be sure to update GameInput::iterator() too! // If a new GameInput is added, be sure to update GameInput::iterator() too!
match game_input { match game_input {
GameInput::Primary => KeyMouse::Mouse(MouseButton::Left), GameInput::Primary => Some(KeyMouse::Mouse(MouseButton::Left)),
GameInput::Secondary => KeyMouse::Mouse(MouseButton::Right), GameInput::Secondary => Some(KeyMouse::Mouse(MouseButton::Right)),
GameInput::Block => KeyMouse::Key(VirtualKeyCode::LAlt), GameInput::Block => Some(KeyMouse::Key(VirtualKeyCode::LAlt)),
GameInput::ToggleCursor => KeyMouse::Key(VirtualKeyCode::Comma), GameInput::ToggleCursor => Some(KeyMouse::Key(VirtualKeyCode::Comma)),
GameInput::Escape => KeyMouse::Key(VirtualKeyCode::Escape), GameInput::Escape => Some(KeyMouse::Key(VirtualKeyCode::Escape)),
GameInput::Chat => KeyMouse::Key(VirtualKeyCode::Return), GameInput::Chat => Some(KeyMouse::Key(VirtualKeyCode::Return)),
GameInput::Command => KeyMouse::Key(VirtualKeyCode::Slash), GameInput::Command => Some(KeyMouse::Key(VirtualKeyCode::Slash)),
GameInput::MoveForward => KeyMouse::Key(VirtualKeyCode::W), GameInput::MoveForward => Some(KeyMouse::Key(VirtualKeyCode::W)),
GameInput::MoveLeft => KeyMouse::Key(VirtualKeyCode::A), GameInput::MoveLeft => Some(KeyMouse::Key(VirtualKeyCode::A)),
GameInput::MoveBack => KeyMouse::Key(VirtualKeyCode::S), GameInput::MoveBack => Some(KeyMouse::Key(VirtualKeyCode::S)),
GameInput::MoveRight => KeyMouse::Key(VirtualKeyCode::D), GameInput::MoveRight => Some(KeyMouse::Key(VirtualKeyCode::D)),
GameInput::Jump => KeyMouse::Key(VirtualKeyCode::Space), GameInput::Jump => Some(KeyMouse::Key(VirtualKeyCode::Space)),
GameInput::Sit => KeyMouse::Key(VirtualKeyCode::K), GameInput::Sit => Some(KeyMouse::Key(VirtualKeyCode::K)),
GameInput::Dance => KeyMouse::Key(VirtualKeyCode::J), GameInput::Dance => Some(KeyMouse::Key(VirtualKeyCode::J)),
GameInput::Greet => KeyMouse::Key(VirtualKeyCode::H), GameInput::Greet => Some(KeyMouse::Key(VirtualKeyCode::H)),
GameInput::Glide => KeyMouse::Key(VirtualKeyCode::LControl), GameInput::Glide => Some(KeyMouse::Key(VirtualKeyCode::LControl)),
GameInput::Climb => KeyMouse::Key(VirtualKeyCode::Space), GameInput::Climb => Some(KeyMouse::Key(VirtualKeyCode::Space)),
GameInput::ClimbDown => KeyMouse::Key(VirtualKeyCode::LShift), GameInput::ClimbDown => Some(KeyMouse::Key(VirtualKeyCode::LShift)),
GameInput::SwimUp => KeyMouse::Key(VirtualKeyCode::Space), GameInput::SwimUp => Some(KeyMouse::Key(VirtualKeyCode::Space)),
GameInput::SwimDown => KeyMouse::Key(VirtualKeyCode::LShift), GameInput::SwimDown => Some(KeyMouse::Key(VirtualKeyCode::LShift)),
GameInput::Fly => KeyMouse::Key(VirtualKeyCode::H), GameInput::Fly => Some(KeyMouse::Key(VirtualKeyCode::H)),
GameInput::Sneak => KeyMouse::Key(VirtualKeyCode::LShift), GameInput::Sneak => Some(KeyMouse::Key(VirtualKeyCode::LShift)),
GameInput::ToggleLantern => KeyMouse::Key(VirtualKeyCode::G), GameInput::ToggleLantern => Some(KeyMouse::Key(VirtualKeyCode::G)),
GameInput::Mount => KeyMouse::Key(VirtualKeyCode::F), GameInput::Mount => Some(KeyMouse::Key(VirtualKeyCode::F)),
GameInput::Map => KeyMouse::Key(VirtualKeyCode::M), GameInput::Map => Some(KeyMouse::Key(VirtualKeyCode::M)),
GameInput::Bag => KeyMouse::Key(VirtualKeyCode::B), GameInput::Bag => Some(KeyMouse::Key(VirtualKeyCode::B)),
GameInput::Trade => KeyMouse::Key(VirtualKeyCode::T), GameInput::Trade => Some(KeyMouse::Key(VirtualKeyCode::T)),
GameInput::Social => KeyMouse::Key(VirtualKeyCode::O), GameInput::Social => Some(KeyMouse::Key(VirtualKeyCode::O)),
GameInput::Crafting => KeyMouse::Key(VirtualKeyCode::C), GameInput::Crafting => Some(KeyMouse::Key(VirtualKeyCode::C)),
GameInput::Spellbook => KeyMouse::Key(VirtualKeyCode::P), GameInput::Spellbook => Some(KeyMouse::Key(VirtualKeyCode::P)),
GameInput::Settings => KeyMouse::Key(VirtualKeyCode::F10), GameInput::Settings => Some(KeyMouse::Key(VirtualKeyCode::F10)),
GameInput::Help => KeyMouse::Key(VirtualKeyCode::F1), GameInput::Help => Some(KeyMouse::Key(VirtualKeyCode::F1)),
GameInput::ToggleInterface => KeyMouse::Key(VirtualKeyCode::F2), GameInput::ToggleInterface => Some(KeyMouse::Key(VirtualKeyCode::F2)),
GameInput::ToggleDebug => KeyMouse::Key(VirtualKeyCode::F3), GameInput::ToggleDebug => Some(KeyMouse::Key(VirtualKeyCode::F3)),
#[cfg(feature = "egui-ui")] #[cfg(feature = "egui-ui")]
GameInput::ToggleEguiDebug => KeyMouse::Key(VirtualKeyCode::F7), GameInput::ToggleEguiDebug => Some(KeyMouse::Key(VirtualKeyCode::F7)),
GameInput::ToggleChat => KeyMouse::Key(VirtualKeyCode::F5), GameInput::ToggleChat => Some(KeyMouse::Key(VirtualKeyCode::F5)),
GameInput::Fullscreen => KeyMouse::Key(VirtualKeyCode::F11), GameInput::Fullscreen => Some(KeyMouse::Key(VirtualKeyCode::F11)),
GameInput::Screenshot => KeyMouse::Key(VirtualKeyCode::F4), GameInput::Screenshot => Some(KeyMouse::Key(VirtualKeyCode::F4)),
GameInput::ToggleIngameUi => KeyMouse::Key(VirtualKeyCode::F6), GameInput::ToggleIngameUi => Some(KeyMouse::Key(VirtualKeyCode::F6)),
GameInput::Roll => MIDDLE_CLICK_KEY, GameInput::Roll => Some(MIDDLE_CLICK_KEY),
GameInput::Respawn => KeyMouse::Key(VirtualKeyCode::Space), GameInput::Respawn => Some(KeyMouse::Key(VirtualKeyCode::Space)),
GameInput::Interact => KeyMouse::Key(VirtualKeyCode::E), GameInput::Interact => Some(KeyMouse::Key(VirtualKeyCode::E)),
GameInput::ToggleWield => KeyMouse::Key(VirtualKeyCode::R), GameInput::ToggleWield => Some(KeyMouse::Key(VirtualKeyCode::R)),
GameInput::FreeLook => KeyMouse::Key(VirtualKeyCode::L), GameInput::FreeLook => Some(KeyMouse::Key(VirtualKeyCode::L)),
GameInput::AutoWalk => KeyMouse::Key(VirtualKeyCode::Period), GameInput::AutoWalk => Some(KeyMouse::Key(VirtualKeyCode::Period)),
GameInput::CameraClamp => KeyMouse::Key(VirtualKeyCode::Apostrophe), GameInput::CameraClamp => Some(KeyMouse::Key(VirtualKeyCode::Apostrophe)),
GameInput::CycleCamera => KeyMouse::Key(VirtualKeyCode::Key0), GameInput::CycleCamera => Some(KeyMouse::Key(VirtualKeyCode::Key0)),
GameInput::Slot1 => KeyMouse::Key(VirtualKeyCode::Key1), GameInput::Slot1 => Some(KeyMouse::Key(VirtualKeyCode::Key1)),
GameInput::Slot2 => KeyMouse::Key(VirtualKeyCode::Key2), GameInput::Slot2 => Some(KeyMouse::Key(VirtualKeyCode::Key2)),
GameInput::Slot3 => KeyMouse::Key(VirtualKeyCode::Key3), GameInput::Slot3 => Some(KeyMouse::Key(VirtualKeyCode::Key3)),
GameInput::Slot4 => KeyMouse::Key(VirtualKeyCode::Key4), GameInput::Slot4 => Some(KeyMouse::Key(VirtualKeyCode::Key4)),
GameInput::Slot5 => KeyMouse::Key(VirtualKeyCode::Key5), GameInput::Slot5 => Some(KeyMouse::Key(VirtualKeyCode::Key5)),
GameInput::Slot6 => KeyMouse::Key(VirtualKeyCode::Key6), GameInput::Slot6 => Some(KeyMouse::Key(VirtualKeyCode::Key6)),
GameInput::Slot7 => KeyMouse::Key(VirtualKeyCode::Key7), GameInput::Slot7 => Some(KeyMouse::Key(VirtualKeyCode::Key7)),
GameInput::Slot8 => KeyMouse::Key(VirtualKeyCode::Key8), GameInput::Slot8 => Some(KeyMouse::Key(VirtualKeyCode::Key8)),
GameInput::Slot9 => KeyMouse::Key(VirtualKeyCode::Key9), GameInput::Slot9 => Some(KeyMouse::Key(VirtualKeyCode::Key9)),
GameInput::Slot10 => KeyMouse::Key(VirtualKeyCode::Q), GameInput::Slot10 => Some(KeyMouse::Key(VirtualKeyCode::Q)),
GameInput::SwapLoadout => KeyMouse::Key(VirtualKeyCode::Tab), GameInput::SwapLoadout => Some(KeyMouse::Key(VirtualKeyCode::Tab)),
GameInput::Select => KeyMouse::Key(VirtualKeyCode::X), GameInput::Select => Some(KeyMouse::Key(VirtualKeyCode::X)),
GameInput::AcceptGroupInvite => KeyMouse::Key(VirtualKeyCode::Y), GameInput::AcceptGroupInvite => Some(KeyMouse::Key(VirtualKeyCode::Y)),
GameInput::DeclineGroupInvite => KeyMouse::Key(VirtualKeyCode::N), GameInput::DeclineGroupInvite => Some(KeyMouse::Key(VirtualKeyCode::N)),
GameInput::MapZoomIn => KeyMouse::Key(VirtualKeyCode::Plus), GameInput::MapZoomIn => Some(KeyMouse::Key(VirtualKeyCode::Plus)),
GameInput::MapZoomOut => KeyMouse::Key(VirtualKeyCode::Minus), GameInput::MapZoomOut => Some(KeyMouse::Key(VirtualKeyCode::Minus)),
GameInput::MapSetMarker => KeyMouse::Mouse(MouseButton::Middle), GameInput::MapSetMarker => Some(KeyMouse::Mouse(MouseButton::Middle)),
GameInput::SpectateSpeedBoost => KeyMouse::Key(VirtualKeyCode::LControl), GameInput::SpectateSpeedBoost => Some(KeyMouse::Key(VirtualKeyCode::LControl)),
GameInput::SpectateViewpoint => KeyMouse::Mouse(MouseButton::Middle), GameInput::SpectateViewpoint => Some(KeyMouse::Mouse(MouseButton::Middle)),
GameInput::MuteMaster => Some(KeyMouse::Key(VirtualKeyCode::Mute)),
GameInput::MuteInactiveMaster => None,
GameInput::MuteMusic => Some(KeyMouse::Key(VirtualKeyCode::F8)),
GameInput::MuteSfx => None,
GameInput::MuteAmbience => None,
} }
} }
} }
@ -203,7 +208,10 @@ impl Default for ControlSettings {
}; };
// Sets the initial keybindings for those GameInputs. // Sets the initial keybindings for those GameInputs.
for game_input in GameInput::iter() { for game_input in GameInput::iter() {
new_settings.insert_binding(game_input, ControlSettings::default_binding(game_input)); match ControlSettings::default_binding(game_input) {
None => {},
Some(default) => new_settings.insert_binding(game_input, default),
};
} }
new_settings new_settings
} }