From cfdbc06a310744ef5712c070a995040db55d7b85 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sun, 18 May 2014 18:09:31 +1200 Subject: [PATCH] Add fade in/out effects to RA and TS. The palette effect interacts badly with the multiplicative blending in D2K. --- OpenRA.Mods.RA/MenuPaletteEffect.cs | 3 +- .../Widgets/Logic/IngameMenuLogic.cs | 53 +++++++++---------- mods/ra/rules/world.yaml | 1 + mods/ts/rules/world.yaml | 1 + 4 files changed, 30 insertions(+), 28 deletions(-) diff --git a/OpenRA.Mods.RA/MenuPaletteEffect.cs b/OpenRA.Mods.RA/MenuPaletteEffect.cs index 074ed4197b..52b8451843 100644 --- a/OpenRA.Mods.RA/MenuPaletteEffect.cs +++ b/OpenRA.Mods.RA/MenuPaletteEffect.cs @@ -16,12 +16,13 @@ using OpenRA.Traits; namespace OpenRA.Mods.RA { + [Desc("Fades the world from/to black at the start/end of the game, and can (optionally) desaturate the world")] public class MenuPaletteEffectInfo : ITraitInfo { [Desc("Time (in ticks) to fade between states")] public readonly int FadeLength = 10; - [Desc("Effect style to fade into")] + [Desc("Effect style to fade to. Accepts values of None or Desaturated")] public readonly MenuPaletteEffect.EffectType Effect = MenuPaletteEffect.EffectType.None; public object Create(ActorInitializer init) { return new MenuPaletteEffect(this); } diff --git a/OpenRA.Mods.RA/Widgets/Logic/IngameMenuLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/IngameMenuLogic.cs index 671b8fdd33..678a3ef6ec 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/IngameMenuLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/IngameMenuLogic.cs @@ -19,11 +19,29 @@ namespace OpenRA.Mods.RA.Widgets.Logic [ObjectCreator.UseCtor] public IngameMenuLogic(Widget widget, World world, Action onExit, WorldRenderer worldRenderer) { + var resumeDisabled = false; + var mpe = world.WorldActor.TraitOrDefault(); + Action onQuit = () => { - onExit(); - LeaveGame(world); + Sound.PlayNotification(world.Map.Rules, null, "Speech", "Leave", world.LocalPlayer == null ? null : world.LocalPlayer.Country.Race); + resumeDisabled = true; + + var exitDelay = 1200; + if (mpe != null) + { + Game.RunAfterDelay(exitDelay, () => mpe.Fade(MenuPaletteEffect.EffectType.Black)); + exitDelay += 40 * mpe.Info.FadeLength; + } + + Game.RunAfterDelay(exitDelay, () => + { + Game.Disconnect(); + Ui.ResetAll(); + Game.LoadShellMap(); + }); }; + Action onSurrender = () => { world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor, false)); @@ -32,22 +50,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic widget.Get("DISCONNECT").OnClick = () => { - bool gameOver = world.LocalPlayer != null && world.LocalPlayer.WinState != WinState.Undefined; - - if (gameOver) - { - onQuit(); - } - else - { - widget.Visible = false; - ConfirmationDialogs.PromptConfirmAction( - "Abort Mission", - "Leave this game and return to the menu?", - onQuit, - () => widget.Visible = true, - "Abort"); - } + widget.Visible = false; + ConfirmationDialogs.PromptConfirmAction("Abort Mission", "Leave this game and return to the menu?", onQuit, () => widget.Visible = true); }; widget.Get("SETTINGS").OnClick = () => @@ -65,7 +69,10 @@ namespace OpenRA.Mods.RA.Widgets.Logic widget.Visible = false; Ui.OpenWindow("MUSIC_PANEL", new WidgetArgs { { "onExit", () => { widget.Visible = true; } } }); }; - widget.Get("RESUME").OnClick = () => onExit(); + + var resumeButton = widget.Get("RESUME"); + resumeButton.OnClick = () => onExit(); + resumeButton.IsDisabled = () => resumeDisabled; widget.Get("SURRENDER").OnClick = () => { @@ -79,13 +86,5 @@ namespace OpenRA.Mods.RA.Widgets.Logic }; widget.Get("SURRENDER").IsVisible = () => world.LocalPlayer != null && world.LocalPlayer.WinState == WinState.Undefined; } - - void LeaveGame(World world) - { - Sound.PlayNotification(world.Map.Rules, null, "Speech", "Leave", world.LocalPlayer == null ? null : world.LocalPlayer.Country.Race); - Game.Disconnect(); - Ui.CloseWindow(); - Game.LoadShellMap(); - } } } diff --git a/mods/ra/rules/world.yaml b/mods/ra/rules/world.yaml index f86e32085d..26d5a21173 100644 --- a/mods/ra/rules/world.yaml +++ b/mods/ra/rules/world.yaml @@ -8,6 +8,7 @@ World: LoadWidgetAtGameStart: Widget: INGAME_ROOT ScreenShaker: + MenuPaletteEffect: WaterPaletteRotation: ExcludePalettes: player, effect ChronoshiftPaletteEffect: diff --git a/mods/ts/rules/world.yaml b/mods/ts/rules/world.yaml index 3e346f1406..dcac7c751a 100644 --- a/mods/ts/rules/world.yaml +++ b/mods/ts/rules/world.yaml @@ -7,6 +7,7 @@ World: ActorMap: LoadWidgetAtGameStart: Widget: INGAME_ROOT + MenuPaletteEffect: BuildingInfluence: ChooseBuildTabOnSelect: PaletteFromFile@player: