mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
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:
commit
f590e68f7e
BIN
assets/voxygen/element/ui/generic/buttons/mute_btn.png
(Stored with Git LFS)
Normal file
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
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
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
BIN
assets/voxygen/element/ui/generic/buttons/muted_btn.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/voxygen/element/ui/generic/buttons/muted_btn_hover.png
(Stored with Git LFS)
Normal file
BIN
assets/voxygen/element/ui/generic/buttons/muted_btn_hover.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
assets/voxygen/element/ui/generic/buttons/muted_btn_press.png
(Stored with Git LFS)
Normal file
BIN
assets/voxygen/element/ui/generic/buttons/muted_btn_press.png
(Stored with Git LFS)
Normal file
Binary file not shown.
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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",
|
||||||
|
@ -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) {
|
||||||
|
@ -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)
|
||||||
|
@ -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.
|
||||||
|
@ -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),
|
||||||
|
@ -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()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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());
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user