From d4d55bb6dcfcd1c35ec655b0d86b2a9515a97866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sat, 27 Dec 2014 18:53:52 +0100 Subject: [PATCH] modularize the remaining legacy ingame interface widgets and consolidate chrome root initialization --- .../Traits/World/LoadWidgetAtGameStart.cs | 14 +- .../LoadIngamePlayerOrObserverUILogic.cs | 1 - OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj | 2 +- .../Widgets/Logic/IngameChromeLogic.cs | 122 ------------------ .../Widgets/Logic/SlidingRadarBinLogic.cs | 60 +++++++++ mods/cnc/maps/shellmap/map.yaml | 2 - mods/cnc/rules/world.yaml | 2 +- mods/d2k/chrome.yaml | 8 +- mods/d2k/chrome/ingame-player.yaml | 3 + mods/d2k/chrome/ingame.yaml | 2 +- mods/d2k/maps/shellmap/map.yaml | 2 - mods/d2k/rules/world.yaml | 1 - mods/ra/maps/desert-shellmap/map.yaml | 2 - mods/ra/rules/world.yaml | 1 - mods/ts/chrome.yaml | 5 +- mods/ts/chrome/ingame-player.yaml | 3 + mods/ts/chrome/ingame.yaml | 2 +- mods/ts/maps/blank-shellmap/map.yaml | 1 - mods/ts/rules/world.yaml | 1 - 19 files changed, 84 insertions(+), 150 deletions(-) delete mode 100644 OpenRA.Mods.D2k/Widgets/Logic/IngameChromeLogic.cs create mode 100644 OpenRA.Mods.D2k/Widgets/Logic/SlidingRadarBinLogic.cs diff --git a/OpenRA.Mods.Common/Traits/World/LoadWidgetAtGameStart.cs b/OpenRA.Mods.Common/Traits/World/LoadWidgetAtGameStart.cs index 0112471355..fc0cae3c01 100644 --- a/OpenRA.Mods.Common/Traits/World/LoadWidgetAtGameStart.cs +++ b/OpenRA.Mods.Common/Traits/World/LoadWidgetAtGameStart.cs @@ -9,6 +9,7 @@ #endregion using OpenRA.Graphics; +using OpenRA.Mods.Common.Widgets; using OpenRA.Traits; using OpenRA.Widgets; @@ -16,14 +17,22 @@ namespace OpenRA.Mods.Common.Traits { public class LoadWidgetAtGameStartInfo : ITraitInfo { - public readonly string Widget = null; + [Desc("The widget tree to open when a shellmap is loaded (i.e. the main menu).")] + public readonly string ShellmapRoot = "MAINMENU"; + + [Desc("The widget tree to open when a regular map is loaded (i.e. the ingame UI).")] + public readonly string IngameRoot = "INGAME_ROOT"; + + [Desc("Remove any existing UI when a map is loaded.")] public readonly bool ClearRoot = true; + public object Create(ActorInitializer init) { return new LoadWidgetAtGameStart(this); } } public class LoadWidgetAtGameStart : IWorldLoaded { readonly LoadWidgetAtGameStartInfo info; + public LoadWidgetAtGameStart(LoadWidgetAtGameStartInfo info) { this.info = info; @@ -35,7 +44,8 @@ namespace OpenRA.Mods.Common.Traits if (info.ClearRoot) Ui.ResetAll(); - Game.LoadWidget(world, info.Widget, Ui.Root, new WidgetArgs()); + var widget = world.Type == WorldType.Shellmap ? info.ShellmapRoot : info.IngameRoot; + Game.LoadWidget(world, widget, Ui.Root, new WidgetArgs()); } } } \ No newline at end of file diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/LoadIngamePlayerOrObserverUILogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/LoadIngamePlayerOrObserverUILogic.cs index 1e8fc96a07..da900fb03f 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/LoadIngamePlayerOrObserverUILogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/LoadIngamePlayerOrObserverUILogic.cs @@ -8,7 +8,6 @@ */ #endregion -using System; using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets.Logic diff --git a/OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj b/OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj index efaee4287b..cb51a2f0a2 100644 --- a/OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj +++ b/OpenRA.Mods.D2k/OpenRA.Mods.D2k.csproj @@ -92,11 +92,11 @@ - + diff --git a/OpenRA.Mods.D2k/Widgets/Logic/IngameChromeLogic.cs b/OpenRA.Mods.D2k/Widgets/Logic/IngameChromeLogic.cs deleted file mode 100644 index aa64a72e42..0000000000 --- a/OpenRA.Mods.D2k/Widgets/Logic/IngameChromeLogic.cs +++ /dev/null @@ -1,122 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see COPYING. - */ -#endregion - -using System; -using System.Drawing; -using System.Linq; -using OpenRA.Mods.Common.Traits; -using OpenRA.Mods.Common.Widgets; -using OpenRA.Mods.D2k.Widgets; -using OpenRA.Mods.RA; -using OpenRA.Mods.RA.Widgets; -using OpenRA.Mods.RA.Widgets.Logic; -using OpenRA.Traits; -using OpenRA.Widgets; - -namespace OpenRA.Mods.D2k.Widgets.Logic -{ - public class IngameChromeLogic - { - readonly Widget ingameRoot; - readonly Widget worldRoot; - readonly Widget menuRoot; - readonly Widget playerRoot; - readonly World world; - - [ObjectCreator.UseCtor] - public IngameChromeLogic(World world) - { - this.world = world; - ingameRoot = Ui.Root.Get("INGAME_ROOT"); - worldRoot = ingameRoot.Get("WORLD_ROOT"); - menuRoot = ingameRoot.Get("MENU_ROOT"); - playerRoot = worldRoot.Get("PLAYER_ROOT"); - - InitRootWidgets(); - if (world.LocalPlayer == null) - InitObserverWidgets(); - else - InitPlayerWidgets(); - } - - void InitRootWidgets() - { - Game.LoadWidget(world, "CHAT_PANEL", worldRoot, new WidgetArgs()); - - world.GameOver += () => - { - worldRoot.RemoveChildren(); - menuRoot.RemoveChildren(); - Game.LoadWidget(world, "LEAVE_MAP_WIDGET", menuRoot, new WidgetArgs()); - }; - } - - void InitObserverWidgets() - { - Game.LoadWidget(world, "OBSERVER_WIDGETS", playerRoot, new WidgetArgs()); - } - - enum RadarBinState { Closed, BinAnimating, RadarAnimating, Open } - void InitPlayerWidgets() - { - var playerWidgets = Game.LoadWidget(world, "PLAYER_WIDGETS", playerRoot, new WidgetArgs()); - - var radarActive = false; - var binState = RadarBinState.Closed; - var radarBin = playerWidgets.Get("INGAME_RADAR_BIN"); - radarBin.IsOpen = () => radarActive || binState > RadarBinState.BinAnimating; - radarBin.AfterOpen = () => binState = RadarBinState.RadarAnimating; - radarBin.AfterClose = () => binState = RadarBinState.Closed; - - var radarMap = radarBin.Get("RADAR_MINIMAP"); - radarMap.IsEnabled = () => radarActive && binState >= RadarBinState.RadarAnimating; - radarMap.AfterOpen = () => binState = RadarBinState.Open; - radarMap.AfterClose = () => binState = RadarBinState.BinAnimating; - - radarBin.Get("RADAR_BIN_BG").GetImageCollection = () => "chrome-" + world.LocalPlayer.Country.Race; - - var powerManager = world.LocalPlayer.PlayerActor.Trait(); - var powerBar = radarBin.Get("POWERBAR"); - powerBar.IndicatorCollection = "power-" + world.LocalPlayer.Country.Race; - powerBar.GetProvided = () => powerManager.PowerProvided; - powerBar.GetUsed = () => powerManager.PowerDrained; - powerBar.TooltipFormat = "Power Usage: {0}/{1}"; - powerBar.GetBarColor = () => - { - if (powerManager.PowerState == PowerState.Critical) - return Color.Red; - if (powerManager.PowerState == PowerState.Low) - return Color.Orange; - return Color.LimeGreen; - }; - - var cachedRadarActive = false; - var sidebarTicker = playerWidgets.Get("SIDEBAR_TICKER"); - sidebarTicker.OnTick = () => - { - // Update radar bin - radarActive = world.ActorsWithTrait() - .Any(a => a.Actor.Owner == world.LocalPlayer && a.Trait.IsActive); - - if (radarActive != cachedRadarActive) - Sound.PlayNotification(world.Map.Rules, null, "Sounds", radarActive ? "RadarUp" : "RadarDown", null); - cachedRadarActive = radarActive; - - // Switch to observer mode after win/loss - if (world.ObserveAfterWinOrLose && world.LocalPlayer.WinState != WinState.Undefined) - Game.RunAfterTick(() => - { - playerRoot.RemoveChildren(); - InitObserverWidgets(); - }); - }; - } - } -} diff --git a/OpenRA.Mods.D2k/Widgets/Logic/SlidingRadarBinLogic.cs b/OpenRA.Mods.D2k/Widgets/Logic/SlidingRadarBinLogic.cs new file mode 100644 index 0000000000..ecc8758bdc --- /dev/null +++ b/OpenRA.Mods.D2k/Widgets/Logic/SlidingRadarBinLogic.cs @@ -0,0 +1,60 @@ +#region Copyright & License Information +/* + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System; +using System.Drawing; +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Mods.Common.Widgets; +using OpenRA.Mods.D2k.Widgets; +using OpenRA.Mods.RA; +using OpenRA.Mods.RA.Widgets; +using OpenRA.Mods.RA.Widgets.Logic; +using OpenRA.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.D2k.Widgets.Logic +{ + public class SlidingRadarBinLogic + { + enum RadarBinState { Closed, BinAnimating, RadarAnimating, Open } + + [ObjectCreator.UseCtor] + public SlidingRadarBinLogic(Widget widget, World world) + { + var radarActive = false; + var binState = RadarBinState.Closed; + var radarBin = widget.Get("INGAME_RADAR_BIN"); + radarBin.IsOpen = () => radarActive || binState > RadarBinState.BinAnimating; + radarBin.AfterOpen = () => binState = RadarBinState.RadarAnimating; + radarBin.AfterClose = () => binState = RadarBinState.Closed; + + var radarMap = radarBin.Get("RADAR_MINIMAP"); + radarMap.IsEnabled = () => radarActive && binState >= RadarBinState.RadarAnimating; + radarMap.AfterOpen = () => binState = RadarBinState.Open; + radarMap.AfterClose = () => binState = RadarBinState.BinAnimating; + + radarBin.Get("RADAR_BIN_BG").GetImageCollection = () => "chrome-" + world.LocalPlayer.Country.Race; + + var cachedRadarActive = false; + var radarTicker = widget.Get("RADAR_TICKER"); + radarTicker.OnTick = () => + { + // Update radar bin + radarActive = world.ActorsWithTrait() + .Any(a => a.Actor.Owner == world.LocalPlayer && a.Trait.IsActive); + + if (radarActive != cachedRadarActive) + Sound.PlayNotification(world.Map.Rules, null, "Sounds", radarActive ? "RadarUp" : "RadarDown", null); + cachedRadarActive = radarActive; + }; + } + } +} diff --git a/mods/cnc/maps/shellmap/map.yaml b/mods/cnc/maps/shellmap/map.yaml index 74fec2a1ef..01e992d66c 100644 --- a/mods/cnc/maps/shellmap/map.yaml +++ b/mods/cnc/maps/shellmap/map.yaml @@ -997,8 +997,6 @@ Rules: Loop: true LuaScript: Scripts: shellmap.lua - LoadWidgetAtGameStart: - Widget: MENU_BACKGROUND LST: Mobile: Speed: 42 diff --git a/mods/cnc/rules/world.yaml b/mods/cnc/rules/world.yaml index a26240673b..7b9aabb8f4 100644 --- a/mods/cnc/rules/world.yaml +++ b/mods/cnc/rules/world.yaml @@ -6,7 +6,7 @@ World: ScreenMap: ActorMap: LoadWidgetAtGameStart: - Widget: INGAME_ROOT + ShellmapRoot: MENU_BACKGROUND MenuPaletteEffect: MenuEffect: Desaturated CloakPaletteEffect: diff --git a/mods/d2k/chrome.yaml b/mods/d2k/chrome.yaml index 93421d2a01..a3274fce3b 100644 --- a/mods/d2k/chrome.yaml +++ b/mods/d2k/chrome.yaml @@ -6,7 +6,7 @@ chrome-atreides: chrome-atreides.png radar: 297,31,210,222 tooltip-bg: 0,288,272,136 -power-atreides: chrome-atreides.png +sidebar-bits: chrome-atreides.png power-indicator: 187,4,4,7 palette-atreides: chrome-atreides.png @@ -43,9 +43,6 @@ chrome-harkonnen: chrome-harkonnen.png radar: 297,31,210,222 tooltip-bg: 0,288,272,136 -power-harkonnen: chrome-harkonnen.png - power-indicator: 187,4,4,7 - palette-harkonnen: chrome-harkonnen.png top: 297,288,201,9 dock-top: 498,274,14,23 @@ -80,9 +77,6 @@ chrome-ordos: chrome-ordos.png radar: 297,31,210,222 tooltip-bg: 0,288,272,136 -power-ordos: chrome-ordos.png - power-indicator: 187,4,4,7 - palette-ordos: chrome-ordos.png top: 297,288,201,9 dock-top: 498,274,14,23 diff --git a/mods/d2k/chrome/ingame-player.yaml b/mods/d2k/chrome/ingame-player.yaml index 608e3ff541..4ecbb6598b 100644 --- a/mods/d2k/chrome/ingame-player.yaml +++ b/mods/d2k/chrome/ingame-player.yaml @@ -34,12 +34,14 @@ Container@PLAYER_WIDGETS: Font: Bold Key: escape Shift SlidingContainer@INGAME_RADAR_BIN: + Logic: SlidingRadarBinLogic X: WINDOW_RIGHT-215 Y: 0 OpenOffset: 0,29 ClosedOffset: 0,-166 AnimationLength: 15 Children: + LogicTicker@RADAR_TICKER: Image@RADAR_BIN_BG: ImageName: radar Radar@RADAR_MINIMAP: @@ -48,6 +50,7 @@ Container@PLAYER_WIDGETS: Width: 192 Height: 192 ResourceBar@POWERBAR: + Logic: IngamePowerBarLogic X: 42 Y: 205 Width: 138 diff --git a/mods/d2k/chrome/ingame.yaml b/mods/d2k/chrome/ingame.yaml index 56ac6acc44..92823c536f 100644 --- a/mods/d2k/chrome/ingame.yaml +++ b/mods/d2k/chrome/ingame.yaml @@ -1,5 +1,5 @@ Container@INGAME_ROOT: - Logic: IngameChromeLogic + Logic: LoadIngamePlayerOrObserverUILogic Children: Container@WORLD_ROOT: Children: diff --git a/mods/d2k/maps/shellmap/map.yaml b/mods/d2k/maps/shellmap/map.yaml index a5d7c55b1d..031f4040c7 100644 --- a/mods/d2k/maps/shellmap/map.yaml +++ b/mods/d2k/maps/shellmap/map.yaml @@ -116,8 +116,6 @@ Smudges: Rules: World: - LoadWidgetAtGameStart: - Widget: MAINMENU -CrateSpawner: -SpawnMPUnits: -MPStartLocations: diff --git a/mods/d2k/rules/world.yaml b/mods/d2k/rules/world.yaml index 3a16fa2556..78827c2ef4 100644 --- a/mods/d2k/rules/world.yaml +++ b/mods/d2k/rules/world.yaml @@ -6,7 +6,6 @@ World: ScreenMap: ActorMap: LoadWidgetAtGameStart: - Widget: INGAME_ROOT ScreenShaker: BuildingInfluence: ChooseBuildTabOnSelect: diff --git a/mods/ra/maps/desert-shellmap/map.yaml b/mods/ra/maps/desert-shellmap/map.yaml index 712a4b131a..6692772afd 100644 --- a/mods/ra/maps/desert-shellmap/map.yaml +++ b/mods/ra/maps/desert-shellmap/map.yaml @@ -1274,8 +1274,6 @@ Rules: ValuePerUnit: 0 LuaScript: Scripts: desert-shellmap.lua - LoadWidgetAtGameStart: - Widget: MAINMENU -StartGameNotification: OILB: CashTrickler: diff --git a/mods/ra/rules/world.yaml b/mods/ra/rules/world.yaml index 3d9681f316..8cffc74687 100644 --- a/mods/ra/rules/world.yaml +++ b/mods/ra/rules/world.yaml @@ -6,7 +6,6 @@ World: ScreenMap: ActorMap: LoadWidgetAtGameStart: - Widget: INGAME_ROOT ScreenShaker: MenuPaletteEffect: WaterPaletteRotation: diff --git a/mods/ts/chrome.yaml b/mods/ts/chrome.yaml index b8551e74da..90e8d08e2c 100644 --- a/mods/ts/chrome.yaml +++ b/mods/ts/chrome.yaml @@ -6,7 +6,7 @@ chrome-gdi: chrome-gdi.png tooltip-bg: 0,288,272,136 radar: 297,31,210,222 -power-gdi: chrome-gdi.png +sidebar-bits: chrome-gdi.png power-indicator: 187,4,4,7 palette-gdi: chrome-gdi.png @@ -43,9 +43,6 @@ chrome-nod: chrome-nod.png tooltip-bg: 0,288,272,136 radar: 297,31,210,222 -power-nod: chrome-nod.png - power-indicator: 187,4,4,7 - palette-nod: chrome-nod.png top: 297,288,201,9 dock-top: 498,274,14,23 diff --git a/mods/ts/chrome/ingame-player.yaml b/mods/ts/chrome/ingame-player.yaml index 9a9cba3a0c..5ad92d9205 100644 --- a/mods/ts/chrome/ingame-player.yaml +++ b/mods/ts/chrome/ingame-player.yaml @@ -36,12 +36,14 @@ Container@PLAYER_WIDGETS: Font: Bold Key: escape Shift SlidingContainer@INGAME_RADAR_BIN: + Logic: SlidingRadarBinLogic X: WINDOW_RIGHT-215 Y: 0 OpenOffset: 0,29 ClosedOffset: 0,-166 AnimationLength: 15 Children: + LogicTicker@RADAR_TICKER: Image@RADAR_BIN_BG: ImageName: radar Radar@RADAR_MINIMAP: @@ -50,6 +52,7 @@ Container@PLAYER_WIDGETS: Width: 192 Height: 192 ResourceBar@POWERBAR: + Logic: IngamePowerBarLogic X: 42 Y: 205 Width: 138 diff --git a/mods/ts/chrome/ingame.yaml b/mods/ts/chrome/ingame.yaml index a547fccddf..76899d4801 100644 --- a/mods/ts/chrome/ingame.yaml +++ b/mods/ts/chrome/ingame.yaml @@ -1,5 +1,5 @@ Container@INGAME_ROOT: - Logic: IngameChromeLogic + Logic: LoadIngamePlayerOrObserverUILogic Children: Container@WORLD_ROOT: Children: diff --git a/mods/ts/maps/blank-shellmap/map.yaml b/mods/ts/maps/blank-shellmap/map.yaml index 94ed7f7e74..e2771579c1 100644 --- a/mods/ts/maps/blank-shellmap/map.yaml +++ b/mods/ts/maps/blank-shellmap/map.yaml @@ -41,7 +41,6 @@ Rules: -SpawnMPUnits: -MPStartLocations: LoadWidgetAtGameStart: - Widget: MAINMENU Sequences: diff --git a/mods/ts/rules/world.yaml b/mods/ts/rules/world.yaml index 7064ed2afe..82ce3da423 100644 --- a/mods/ts/rules/world.yaml +++ b/mods/ts/rules/world.yaml @@ -6,7 +6,6 @@ World: ScreenMap: ActorMap: LoadWidgetAtGameStart: - Widget: INGAME_ROOT MenuPaletteEffect: BuildingInfluence: ChooseBuildTabOnSelect: