diff --git a/OpenRA.Game/GameRules/Settings.cs b/OpenRA.Game/GameRules/Settings.cs index 8eab776a6b..753ceaefca 100755 --- a/OpenRA.Game/GameRules/Settings.cs +++ b/OpenRA.Game/GameRules/Settings.cs @@ -48,6 +48,7 @@ namespace OpenRA.GameRules public float SoundVolume = 0.5f; public float MusicVolume = 0.5f; public float VideoVolume = 0.5f; + public bool Shuffle = false; } public class PlayerSettings diff --git a/OpenRA.Game/Widgets/Delegates/MusicPlayerDelegate.cs b/OpenRA.Game/Widgets/Delegates/MusicPlayerDelegate.cs index 1e616bb203..1962a7d9da 100644 --- a/OpenRA.Game/Widgets/Delegates/MusicPlayerDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/MusicPlayerDelegate.cs @@ -74,6 +74,14 @@ namespace OpenRA.Widgets.Delegates return bg.GetWidget("BUTTON_PLAY").OnMouseUp(mi); }; + var shuffle = bg.GetWidget("SHUFFLE"); + shuffle.OnMouseDown = mi => + { + Game.Settings.Sound.Shuffle ^= true; + return true; + }; + shuffle.Checked = () => Game.Settings.Sound.Shuffle; + bg.GetWidget("TIME").GetText = () => { if (CurrentSong == null) @@ -118,35 +126,27 @@ namespace OpenRA.Widgets.Delegates string GetNextSong() { - var songs = Rules.Music.Select(a => a.Key) - .Where(a => FileSystem.Exists(Rules.Music[a].Filename)); + var songs = Rules.Music.Where(a => a.Value.Exists) + .Select(a => a.Key); - var nextSong = songs - .SkipWhile(m => m != CurrentSong) - .Skip(1) - .FirstOrDefault(); + if (Game.Settings.Sound.Shuffle) + return songs.Random(Game.CosmeticRandom); - if (nextSong == null) - nextSong = songs.FirstOrDefault(); - - return nextSong; + return songs.SkipWhile(m => m != CurrentSong) + .Skip(1).FirstOrDefault() ?? songs.FirstOrDefault(); + } string GetPrevSong() { - var songs = Rules.Music.Select(a => a.Key) - .Where(a => FileSystem.Exists(Rules.Music[a].Filename)) - .Reverse(); + var songs = Rules.Music.Where(a => a.Value.Exists) + .Select(a => a.Key).Reverse(); - var nextSong = songs - .SkipWhile(m => m != CurrentSong) - .Skip(1) - .FirstOrDefault(); + if (Game.Settings.Sound.Shuffle) + return songs.Random(Game.CosmeticRandom); - if (nextSong == null) - nextSong = songs.FirstOrDefault(); - - return nextSong; + return songs.SkipWhile(m => m != CurrentSong) + .Skip(1).FirstOrDefault() ?? songs.FirstOrDefault(); } } }