From 3e2022a3dd8fb1751bc3bdda6dc64e007ae50fa6 Mon Sep 17 00:00:00 2001 From: Ivaylo Draganov Date: Fri, 31 Jan 2020 18:41:18 +0200 Subject: [PATCH] Allow players to mute shellmap background music --- OpenRA.Game/Settings.cs | 1 + .../Traits/World/MusicPlaylist.cs | 17 +++++++++++++++-- .../Widgets/Logic/SettingsLogic.cs | 17 +++++++++++++++++ mods/cnc/chrome/settings.yaml | 7 +++++++ mods/cnc/maps/blank-shellmap/map.yaml | 1 + mods/common/chrome/settings.yaml | 7 +++++++ mods/d2k/maps/shellmap/rules.yaml | 1 + mods/ra/maps/desert-shellmap/rules.yaml | 1 + mods/ts/maps/fields-of-green/rules.yaml | 1 + 9 files changed, 51 insertions(+), 2 deletions(-) diff --git a/OpenRA.Game/Settings.cs b/OpenRA.Game/Settings.cs index fdcf4685a7..4ac363ccca 100644 --- a/OpenRA.Game/Settings.cs +++ b/OpenRA.Game/Settings.cs @@ -199,6 +199,7 @@ namespace OpenRA public bool CashTicks = true; public bool Mute = false; + public bool MuteBackgroundMusic = false; } public class PlayerSettings diff --git a/OpenRA.Mods.Common/Traits/World/MusicPlaylist.cs b/OpenRA.Mods.Common/Traits/World/MusicPlaylist.cs index 453f931cce..c79df891bf 100644 --- a/OpenRA.Mods.Common/Traits/World/MusicPlaylist.cs +++ b/OpenRA.Mods.Common/Traits/World/MusicPlaylist.cs @@ -33,6 +33,9 @@ namespace OpenRA.Mods.Common.Traits "It cannot be paused, but can be overridden by selecting a new track.")] public readonly string BackgroundMusic = null; + [Desc("Allow the background music to be muted by the player.")] + public readonly bool AllowMuteBackgroundMusic = false; + [Desc("Disable all world sounds (combat etc).")] public readonly bool DisableWorldSounds = false; @@ -49,6 +52,13 @@ namespace OpenRA.Mods.Common.Traits public readonly bool IsMusicInstalled; public readonly bool IsMusicAvailable; + public readonly bool AllowMuteBackgroundMusic; + + public bool IsBackgroundMusicMuted + { + get { return AllowMuteBackgroundMusic && Game.Settings.Sound.MuteBackgroundMusic; } + } + public bool CurrentSongIsBackground { get; private set; } MusicInfo currentSong; @@ -73,6 +83,7 @@ namespace OpenRA.Mods.Common.Traits random = playlist.Shuffle(Game.CosmeticRandom).ToArray(); IsMusicAvailable = playlist.Any(); + AllowMuteBackgroundMusic = info.AllowMuteBackgroundMusic; if (SongExists(info.BackgroundMusic)) { @@ -150,7 +161,7 @@ namespace OpenRA.Mods.Common.Traits void Play() { - if (!SongExists(currentSong)) + if (!SongExists(currentSong) || (CurrentSongIsBackground && IsBackgroundMusicMuted)) return; Game.Sound.PlayMusicThen(currentSong, () => @@ -228,7 +239,9 @@ namespace OpenRA.Mods.Common.Traits { currentSong = currentBackgroundSong; CurrentSongIsBackground = true; - Play(); + + if (!IsBackgroundMusicMuted) + Play(); } } diff --git a/OpenRA.Mods.Common/Widgets/Logic/SettingsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/SettingsLogic.cs index 00e616f4c9..42e2838c79 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/SettingsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/SettingsLogic.cs @@ -13,6 +13,7 @@ using System; using System.Collections.Generic; using System.Linq; using OpenRA.Graphics; +using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; using OpenRA.Support; using OpenRA.Widgets; @@ -401,10 +402,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic Action InitAudioPanel(Widget panel) { + var musicPlaylist = worldRenderer.World.WorldActor.Trait(); var ss = Game.Settings.Sound; BindCheckboxPref(panel, "CASH_TICKS", ss, "CashTicks"); BindCheckboxPref(panel, "MUTE_SOUND", ss, "Mute"); + BindCheckboxPref(panel, "MUTE_BACKGROUND_MUSIC", ss, "MuteBackgroundMusic"); BindSliderPref(panel, "SOUND_VOLUME", ss, "SoundVolume"); BindSliderPref(panel, "MUSIC_VOLUME", ss, "MusicVolume"); @@ -425,6 +428,19 @@ namespace OpenRA.Mods.Common.Widgets.Logic Game.Sound.UnmuteAudio(); }; + var muteBackgroundMusicCheckbox = panel.Get("MUTE_BACKGROUND_MUSIC"); + var muteBackgroundMusicCheckboxOnClick = muteBackgroundMusicCheckbox.OnClick; + muteBackgroundMusicCheckbox.OnClick = () => + { + muteBackgroundMusicCheckboxOnClick(); + + if (!musicPlaylist.AllowMuteBackgroundMusic) + return; + + if (musicPlaylist.CurrentSongIsBackground) + musicPlaylist.Stop(); + }; + // Replace controls with a warning label if sound is disabled var noDeviceLabel = panel.GetOrNull("NO_AUDIO_DEVICE"); if (noDeviceLabel != null) @@ -471,6 +487,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic ss.VideoVolume = dss.VideoVolume; ss.CashTicks = dss.CashTicks; ss.Mute = dss.Mute; + ss.MuteBackgroundMusic = dss.MuteBackgroundMusic; ss.Device = dss.Device; panel.Get("SOUND_VOLUME").Value = ss.SoundVolume; diff --git a/mods/cnc/chrome/settings.yaml b/mods/cnc/chrome/settings.yaml index aa224a6db3..99a97b288e 100644 --- a/mods/cnc/chrome/settings.yaml +++ b/mods/cnc/chrome/settings.yaml @@ -311,6 +311,13 @@ Container@SETTINGS_PANEL: Height: 20 Font: Regular Text: Mute Sound + Checkbox@MUTE_BACKGROUND_MUSIC: + X: 15 + Y: 103 + Width: 200 + Height: 20 + Font: Regular + Text: Mute Background Music Label@SOUND_LABEL: X: PARENT_RIGHT - WIDTH - 270 Y: 40 diff --git a/mods/cnc/maps/blank-shellmap/map.yaml b/mods/cnc/maps/blank-shellmap/map.yaml index 3108848eb4..9a423f1d0a 100644 --- a/mods/cnc/maps/blank-shellmap/map.yaml +++ b/mods/cnc/maps/blank-shellmap/map.yaml @@ -32,4 +32,5 @@ Rules: -CrateSpawner: MusicPlaylist: BackgroundMusic: map1 + AllowMuteBackgroundMusic: true DisableWorldSounds: true diff --git a/mods/common/chrome/settings.yaml b/mods/common/chrome/settings.yaml index 713befc564..8854ca8e0f 100644 --- a/mods/common/chrome/settings.yaml +++ b/mods/common/chrome/settings.yaml @@ -322,6 +322,13 @@ Background@SETTINGS_PANEL: Height: 20 Font: Regular Text: Mute Sound + Checkbox@MUTE_BACKGROUND_MUSIC: + X: 15 + Y: 103 + Width: 200 + Height: 20 + Font: Regular + Text: Mute Background Music Label@SOUND_LABEL: X: PARENT_RIGHT - WIDTH - 270 Y: 40 diff --git a/mods/d2k/maps/shellmap/rules.yaml b/mods/d2k/maps/shellmap/rules.yaml index 9579520ef8..31523eb8ca 100644 --- a/mods/d2k/maps/shellmap/rules.yaml +++ b/mods/d2k/maps/shellmap/rules.yaml @@ -13,6 +13,7 @@ World: Maximum: 3 MusicPlaylist: BackgroundMusic: options + AllowMuteBackgroundMusic: true DisableWorldSounds: true LuaScript: Scripts: d2k-shellmap.lua diff --git a/mods/ra/maps/desert-shellmap/rules.yaml b/mods/ra/maps/desert-shellmap/rules.yaml index 094ae6f655..2212860498 100644 --- a/mods/ra/maps/desert-shellmap/rules.yaml +++ b/mods/ra/maps/desert-shellmap/rules.yaml @@ -10,6 +10,7 @@ World: -MPStartLocations: MusicPlaylist: BackgroundMusic: intro + AllowMuteBackgroundMusic: true DisableWorldSounds: true ResourceType@ore: ValuePerUnit: 0 diff --git a/mods/ts/maps/fields-of-green/rules.yaml b/mods/ts/maps/fields-of-green/rules.yaml index 205c0d3dc6..1ab3e48f91 100644 --- a/mods/ts/maps/fields-of-green/rules.yaml +++ b/mods/ts/maps/fields-of-green/rules.yaml @@ -13,6 +13,7 @@ World: MusicPlaylist: BackgroundMusic: intro DisableWorldSounds: true + AllowMuteBackgroundMusic: true GlobalLightingPaletteEffect: Blue: 0.7 Ambient: 0.7