diff --git a/OpenRA.Mods.Common/Scripting/Global/MediaGlobal.cs b/OpenRA.Mods.Common/Scripting/Global/MediaGlobal.cs index a9292fca8d..496e2fcffc 100644 --- a/OpenRA.Mods.Common/Scripting/Global/MediaGlobal.cs +++ b/OpenRA.Mods.Common/Scripting/Global/MediaGlobal.cs @@ -20,7 +20,6 @@ using OpenRA.Graphics; using OpenRA.Mods.Common.Effects; using OpenRA.Mods.Common.Traits; using OpenRA.Scripting; -using OpenRA.Traits; namespace OpenRA.Mods.Common.Scripting { @@ -62,16 +61,8 @@ namespace OpenRA.Mods.Common.Scripting if (!playlist.IsMusicAvailable) return; - MusicInfo musicInfo; - if (string.IsNullOrEmpty(track)) - musicInfo = playlist.GetNextSong(); - else if (world.Map.Rules.Music.ContainsKey(track)) - musicInfo = world.Map.Rules.Music[track]; - else - { - Log.Write("lua", "Missing music track: " + track); - return; - } + var musicInfo = !string.IsNullOrEmpty(track) ? GetMusicTrack(track) + : playlist.GetNextSong(); if (func != null) { @@ -95,6 +86,28 @@ namespace OpenRA.Mods.Common.Scripting playlist.Play(musicInfo); } + [Desc("Play track defined in music.yaml or map.yaml as background music." + + " If music is already playing use Media.StopMusic() to stop it" + + " and the background music will start automatically." + + " Keep the track empty to disable background music.")] + public void SetBackgroundMusic(string track = null) + { + if (!playlist.IsMusicAvailable) + return; + + playlist.SetBackgroundMusic(string.IsNullOrEmpty(track) ? null : GetMusicTrack(track)); + } + + MusicInfo GetMusicTrack(string track) + { + var music = world.Map.Rules.Music; + if (music.ContainsKey(track)) + return music[track]; + + Log.Write("lua", "Missing music track: " + track); + return null; + } + [Desc("Stop the current song.")] public void StopMusic() { diff --git a/OpenRA.Mods.Common/Traits/World/MusicPlaylist.cs b/OpenRA.Mods.Common/Traits/World/MusicPlaylist.cs index d0bc536470..e429801802 100644 --- a/OpenRA.Mods.Common/Traits/World/MusicPlaylist.cs +++ b/OpenRA.Mods.Common/Traits/World/MusicPlaylist.cs @@ -168,6 +168,14 @@ namespace OpenRA.Mods.Common.Traits Game.Sound.PlayMusicThen(music, onComplete); } + public void SetBackgroundMusic(MusicInfo music) + { + currentBackgroundSong = music; + + if (CurrentSongIsBackground) + Stop(); + } + public MusicInfo GetNextSong() { return GetSong(false);