diff --git a/OpenRA.Game/Sound.cs b/OpenRA.Game/Sound.cs index bc8c871669..5e7b8115f3 100644 --- a/OpenRA.Game/Sound.cs +++ b/OpenRA.Game/Sound.cs @@ -102,6 +102,7 @@ namespace OpenRA soundEngine.StopSound(video); } + public static bool MusicPlaying { get; private set; } public static void PlayMusic(string name) { if (name == "" || name == null) @@ -115,22 +116,35 @@ namespace OpenRA StopMusic(); currentMusic = name; + MusicPlaying = true; var sound = sounds[name]; music = soundEngine.Play2D(sound, true, true, float2.Zero, MusicVolume); } + + public static void PlayMusic() + { + if (music == null) + return; + MusicPlaying = true; + soundEngine.PauseSound(music, false); + } public static void StopMusic() { if (music != null) soundEngine.StopSound(music); + MusicPlaying = false; currentMusic = null; } public static void PauseMusic() { - if (music != null) - soundEngine.PauseSound(music, true); + if (music == null) + return; + + MusicPlaying = false; + soundEngine.PauseSound(music, true); } public static float GlobalVolume diff --git a/OpenRA.Mods.Cnc/Missions/Gdi01Script.cs b/OpenRA.Mods.Cnc/Missions/Gdi01Script.cs index 4e5b73c2d7..d973e4bd5d 100644 --- a/OpenRA.Mods.Cnc/Missions/Gdi01Script.cs +++ b/OpenRA.Mods.Cnc/Missions/Gdi01Script.cs @@ -15,6 +15,7 @@ using OpenRA.Widgets; using OpenRA.Traits.Activities; using OpenRA.FileFormats; using OpenRA.Mods.RA.Activities; +using System; namespace OpenRA.Mods.RA { @@ -25,6 +26,29 @@ namespace OpenRA.Mods.RA Dictionary Actors; Dictionary Players; Map Map; + + public static void PlayFullscreenFMVThen(World w, string movie, Action then) + { + var playerRoot = Widget.RootWidget.OpenWindow("FMVPLAYER"); + var player = playerRoot.GetWidget("PLAYER"); + w.DisableTick = true; + player.Load(movie); + + // Stop music while fmv plays + var music = Sound.MusicPlaying; + if (music) + Sound.PauseMusic(); + + player.PlayThen(() => + { + if (music) + Sound.PlayMusic(); + + Widget.RootWidget.CloseWindow(); + w.DisableTick = false; + then(); + }); + } public void WorldLoaded(World w) { @@ -33,68 +57,41 @@ namespace OpenRA.Mods.RA Actors = w.WorldActor.Trait().Actors; Game.MoveViewport((.5f * (w.Map.TopLeft + w.Map.BottomRight).ToFloat2()).ToInt2()); - var playerRoot = Widget.RootWidget.OpenWindow("FMVPLAYER"); - var player = playerRoot.GetWidget("PLAYER"); - w.DisableTick = true; - - player.Load("gdi1.vqa"); - player.PlayThen(() => + PlayFullscreenFMVThen(w, "gdi1.vqa", () => PlayFullscreenFMVThen(w, "landing.vqa", () => { - player.Load("landing.vqa"); - player.PlayThen(() => - { - Widget.RootWidget.CloseWindow(); - w.DisableTick = false; - Sound.PlayMusic(Rules.Music["aoi"].Filename); - started = true; - }); - }); + Sound.PlayMusic(Rules.Music["aoi"].Filename); + started = true; + })); } public void OnVictory(World w) { started = false; - Sound.PlayToPlayer(w.LocalPlayer, "accom1.aud"); - w.LocalPlayer.WinState = WinState.Won; + Sound.PlayToPlayer(Players["GoodGuy"], "accom1.aud"); + Players["GoodGuy"].WinState = WinState.Won; w.WorldActor.CancelActivity(); w.WorldActor.QueueActivity(new Wait(125)); - w.WorldActor.QueueActivity(new CallFunc(() => + w.WorldActor.QueueActivity(new CallFunc(() => PlayFullscreenFMVThen(w, "consyard.vqa", () => { Sound.StopMusic(); - w.DisableTick = true; - var player = Widget.RootWidget.OpenWindow("FMVPLAYER").GetWidget("PLAYER"); - player.Load("consyard.vqa"); - player.PlayThen(() => - { - Widget.RootWidget.CloseWindow(); - w.DisableTick = false; - Game.Disconnect(); - }); - })); + Game.Disconnect(); + }))); } public void OnLose(World w) { started = false; - Sound.PlayToPlayer(w.LocalPlayer, "fail1.aud"); - w.LocalPlayer.WinState = WinState.Lost; + Sound.PlayToPlayer(Players["GoodGuy"], "fail1.aud"); + Players["GoodGuy"].WinState = WinState.Lost; w.WorldActor.CancelActivity(); w.WorldActor.QueueActivity(new Wait(125)); - w.WorldActor.QueueActivity(new CallFunc(() => + w.WorldActor.QueueActivity(new CallFunc(() => PlayFullscreenFMVThen(w, "gameover.vqa", () => { Sound.StopMusic(); - w.DisableTick = true; - var player = Widget.RootWidget.OpenWindow("FMVPLAYER").GetWidget("PLAYER"); - player.Load("gameover.vqa"); - player.PlayThen(() => - { - Widget.RootWidget.CloseWindow(); - w.DisableTick = false; - Game.Disconnect(); - }); - })); + Game.Disconnect(); + }))); } int ticks = 0;