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: