diff --git a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj
index 16f9bd17b6..da1e2b10cf 100644
--- a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj
+++ b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj
@@ -105,6 +105,7 @@
+
diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs
index dad4807901..7006e31d2b 100644
--- a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs
+++ b/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs
@@ -22,16 +22,16 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
{
enum MenuType { None, Cheats }
MenuType menu = MenuType.None;
-
+
Widget ingameRoot;
ProductionTabsWidget queueTabs;
World world;
-
+
void AddChatLine(Color c, string from, string text)
{
ingameRoot.GetWidget("CHAT_DISPLAY").AddLine(c, from, text);
}
-
+
public void UnregisterEvents()
{
Game.AddChatLine -= AddChatLine;
@@ -43,7 +43,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
world.ActorRemoved += queueTabs.ActorChanged;
}
}
-
+
void SetupProductionGroupButton(ToggleButtonWidget button, string group)
{
Action selectTab = reverse =>
@@ -63,7 +63,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
icon.GetImageName = () => button.IsDisabled() ? chromeName+"-disabled" :
queueTabs.Groups[group].Alert ? chromeName+"-alert" : chromeName;
}
-
+
[ObjectCreator.UseCtor]
public CncIngameChromeLogic([ObjectCreator.Param] Widget widget,
[ObjectCreator.Param] World world )
@@ -71,97 +71,101 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
this.world = world;
world.WorldActor.Trait()
.Fade(CncMenuPaletteEffect.EffectType.None);
-
+
Game.AddChatLine += AddChatLine;
Game.BeforeGameStart += UnregisterEvents;
-
+
ingameRoot = widget.GetWidget("INGAME_ROOT");
var playerRoot = ingameRoot.GetWidget("PLAYER_ROOT");
-
- Action onOptionsClick = () =>
- {
- if (menu != MenuType.None)
- {
- Widget.CloseWindow();
- menu = MenuType.None;
- }
-
- ingameRoot.IsVisible = () => false;
- Game.LoadWidget(world, "INGAME_MENU", Widget.RootWidget, new WidgetArgs()
- {
- { "onExit", () => ingameRoot.IsVisible = () => true }
- });
- };
// Observer
if (world.LocalPlayer == null)
- {
- var observerWidgets = Game.LoadWidget(world, "OBSERVER_WIDGETS", playerRoot, new WidgetArgs());
- observerWidgets.GetWidget("OPTIONS_BUTTON").OnClick = onOptionsClick;
- }
+ InitObserverWidgets(world, playerRoot);
else
+ InitPlayerWidgets(world, playerRoot);
+ }
+
+ public void OptionsClicked()
+ {
+ if (menu != MenuType.None)
{
- // Real player
- var playerWidgets = Game.LoadWidget(world, "PLAYER_WIDGETS", playerRoot, new WidgetArgs());
- playerWidgets.IsVisible = () => true;
-
- var sidebarRoot = playerWidgets.GetWidget("SIDEBAR_BACKGROUND");
-
- var sellButton = sidebarRoot.GetWidget("SELL_BUTTON");
- sellButton.OnClick = () => world.ToggleInputMode();
- sellButton.IsToggled = () => world.OrderGenerator is SellOrderGenerator;
- var sellIcon = sellButton.GetWidget("ICON");
- sellIcon.GetImageName = () => world.OrderGenerator is SellOrderGenerator ? "sell-active" : "sell";
-
- var repairButton = sidebarRoot.GetWidget("REPAIR_BUTTON");
- repairButton.IsDisabled = () => !RepairOrderGenerator.PlayerIsAllowedToRepair( world );
- repairButton.OnClick = () => world.ToggleInputMode();
- repairButton.IsToggled = () => world.OrderGenerator is RepairOrderGenerator;
- var repairIcon = repairButton.GetWidget("ICON");
- repairIcon.GetImageName = () => repairButton.IsDisabled() ? "repair-disabled" :
- world.OrderGenerator is RepairOrderGenerator ? "repair-active" : "repair";
-
- var playerResources = world.LocalPlayer.PlayerActor.Trait();
- sidebarRoot.GetWidget("CASH_DISPLAY").GetText = () =>
- "${0}".F(playerResources.DisplayCash + playerResources.DisplayOre);
-
- queueTabs = playerWidgets.GetWidget("PRODUCTION_TABS");
- world.ActorAdded += queueTabs.ActorChanged;
- world.ActorRemoved += queueTabs.ActorChanged;
-
- var queueTypes = sidebarRoot.GetWidget("PRODUCTION_TYPES");
- SetupProductionGroupButton(queueTypes.GetWidget("BUILDING"), "Building");
- SetupProductionGroupButton(queueTypes.GetWidget("DEFENSE"), "Defense");
- SetupProductionGroupButton(queueTypes.GetWidget("INFANTRY"), "Infantry");
- SetupProductionGroupButton(queueTypes.GetWidget("VEHICLE"), "Vehicle");
- SetupProductionGroupButton(queueTypes.GetWidget("AIRCRAFT"), "Aircraft");
-
- playerWidgets.GetWidget("OPTIONS_BUTTON").OnClick = onOptionsClick;
-
- var cheatsButton = playerWidgets.GetWidget("CHEATS_BUTTON");
- cheatsButton.OnClick = () =>
- {
- if (menu != MenuType.None)
- Widget.CloseWindow();
-
- menu = MenuType.Cheats;
- Game.OpenWindow("CHEATS_PANEL", new WidgetArgs() {{"onExit", () => menu = MenuType.None }});
- };
- cheatsButton.IsVisible = () => world.LocalPlayer != null && world.LobbyInfo.GlobalSettings.AllowCheats;
-
- var postgameBG = ingameRoot.GetWidget("POSTGAME_BG");
- postgameBG.IsVisible = () =>
- {
- return world.LocalPlayer != null && world.LocalPlayer.WinState != WinState.Undefined;
- };
-
- postgameBG.GetWidget("TEXT").GetText = () =>
- {
- var state = world.LocalPlayer.WinState;
- return (state == WinState.Undefined)? "" :
- ((state == WinState.Lost)? "YOU ARE DEFEATED" : "YOU ARE VICTORIOUS");
- };
+ Widget.CloseWindow();
+ menu = MenuType.None;
}
+
+ ingameRoot.IsVisible = () => false;
+ Game.LoadWidget(world, "INGAME_MENU", Widget.RootWidget, new WidgetArgs()
+ {
+ { "onExit", () => ingameRoot.IsVisible = () => true }
+ });
+ }
+
+ public void InitObserverWidgets(World world, Widget playerRoot)
+ {
+ var observerWidgets = Game.LoadWidget(world, "OBSERVER_WIDGETS", playerRoot, new WidgetArgs());
+ observerWidgets.GetWidget("OPTIONS_BUTTON").OnClick = OptionsClicked;
+ }
+
+ public void InitPlayerWidgets(World world, Widget playerRoot)
+ {
+ // Real player
+ var playerWidgets = Game.LoadWidget(world, "PLAYER_WIDGETS", playerRoot, new WidgetArgs());
+ playerWidgets.IsVisible = () => true;
+
+ var sidebarRoot = playerWidgets.GetWidget("SIDEBAR_BACKGROUND");
+
+ var sellButton = sidebarRoot.GetWidget("SELL_BUTTON");
+ sellButton.OnClick = () => world.ToggleInputMode();
+ sellButton.IsToggled = () => world.OrderGenerator is SellOrderGenerator;
+ var sellIcon = sellButton.GetWidget("ICON");
+ sellIcon.GetImageName = () => world.OrderGenerator is SellOrderGenerator ? "sell-active" : "sell";
+
+ var repairButton = sidebarRoot.GetWidget("REPAIR_BUTTON");
+ repairButton.IsDisabled = () => !RepairOrderGenerator.PlayerIsAllowedToRepair( world );
+ repairButton.OnClick = () => world.ToggleInputMode();
+ repairButton.IsToggled = () => world.OrderGenerator is RepairOrderGenerator;
+ var repairIcon = repairButton.GetWidget("ICON");
+ repairIcon.GetImageName = () => repairButton.IsDisabled() ? "repair-disabled" :
+ world.OrderGenerator is RepairOrderGenerator ? "repair-active" : "repair";
+
+ var playerResources = world.LocalPlayer.PlayerActor.Trait();
+ sidebarRoot.GetWidget("CASH_DISPLAY").GetText = () =>
+ "${0}".F(playerResources.DisplayCash + playerResources.DisplayOre);
+
+ queueTabs = playerWidgets.GetWidget("PRODUCTION_TABS");
+ world.ActorAdded += queueTabs.ActorChanged;
+ world.ActorRemoved += queueTabs.ActorChanged;
+
+ var queueTypes = sidebarRoot.GetWidget("PRODUCTION_TYPES");
+ SetupProductionGroupButton(queueTypes.GetWidget("BUILDING"), "Building");
+ SetupProductionGroupButton(queueTypes.GetWidget("DEFENSE"), "Defense");
+ SetupProductionGroupButton(queueTypes.GetWidget("INFANTRY"), "Infantry");
+ SetupProductionGroupButton(queueTypes.GetWidget("VEHICLE"), "Vehicle");
+ SetupProductionGroupButton(queueTypes.GetWidget("AIRCRAFT"), "Aircraft");
+
+ playerWidgets.GetWidget("OPTIONS_BUTTON").OnClick = OptionsClicked;
+
+ var cheatsButton = playerWidgets.GetWidget("CHEATS_BUTTON");
+ cheatsButton.OnClick = () =>
+ {
+ if (menu != MenuType.None)
+ Widget.CloseWindow();
+
+ menu = MenuType.Cheats;
+ Game.OpenWindow("CHEATS_PANEL", new WidgetArgs() {{"onExit", () => menu = MenuType.None }});
+ };
+ cheatsButton.IsVisible = () => world.LocalPlayer != null && world.LobbyInfo.GlobalSettings.AllowCheats;
+
+ var winLossWatcher = playerWidgets.GetWidget("WIN_LOSS_WATCHER");
+ winLossWatcher.OnTick = () =>
+ {
+ if (world.LocalPlayer.WinState != WinState.Undefined)
+ Game.RunAfterTick(() =>
+ {
+ playerRoot.RemoveChildren();
+ InitObserverWidgets(world, playerRoot);
+ });
+ };
}
}
}
diff --git a/OpenRA.Mods.Cnc/Widgets/LogicTickerWidget.cs b/OpenRA.Mods.Cnc/Widgets/LogicTickerWidget.cs
new file mode 100644
index 0000000000..e7cd9b1917
--- /dev/null
+++ b/OpenRA.Mods.Cnc/Widgets/LogicTickerWidget.cs
@@ -0,0 +1,21 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2011 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 OpenRA.Widgets;
+
+namespace OpenRA.Mods.Cnc.Widgets
+{
+ public class LogicTickerWidget : Widget
+ {
+ public Action OnTick = () => {};
+ public override void Tick() { OnTick(); }
+ }
+}
\ No newline at end of file
diff --git a/OpenRA.Mods.RA/Widgets/RadarWidget.cs b/OpenRA.Mods.RA/Widgets/RadarWidget.cs
index 35fe208f6e..25d209744a 100755
--- a/OpenRA.Mods.RA/Widgets/RadarWidget.cs
+++ b/OpenRA.Mods.RA/Widgets/RadarWidget.cs
@@ -149,9 +149,8 @@ namespace OpenRA.Mods.RA.Widgets
int updateTicks = 0;
public override void Tick()
{
- var hasRadarNew = world.LocalPlayer == null || world
- .ActorsWithTrait()
- .Any(a => a.Actor.Owner == world.LocalPlayer && a.Trait.IsActive);
+ var hasRadarNew = world.LocalPlayer == null || world.LocalPlayer.WinState != WinState.Undefined ||
+ world.ActorsWithTrait().Any(a => a.Actor.Owner == world.LocalPlayer && a.Trait.IsActive);
if (hasRadarNew != hasRadar)
{
diff --git a/mods/cnc/chrome/ingame.yaml b/mods/cnc/chrome/ingame.yaml
index 119eeaf894..a942fac0ab 100644
--- a/mods/cnc/chrome/ingame.yaml
+++ b/mods/cnc/chrome/ingame.yaml
@@ -88,6 +88,8 @@ Container@OBSERVER_WIDGETS:
Container@PLAYER_WIDGETS:
Id:PLAYER_WIDGETS
Children:
+ LogicTicker:
+ Id:WIN_LOSS_WATCHER
Button@CHEATS_BUTTON:
Id:CHEATS_BUTTON
X:WINDOW_RIGHT-400
@@ -98,23 +100,6 @@ Container@PLAYER_WIDGETS:
WorldCommand:
Width:WINDOW_RIGHT
Height:WINDOW_BOTTOM
- Background@POSTGAME_BG:
- Id:POSTGAME_BG
- X:(WINDOW_RIGHT - WIDTH)/2
- Y:(WINDOW_BOTTOM - HEIGHT)/2
- Width:400
- Height:100
- Background:panel-black
- Visible:false
- Children:
- Label@TEXT:
- Id:TEXT
- X:(PARENT_RIGHT - WIDTH)/2
- Y:(PARENT_BOTTOM - HEIGHT)/2
- Width:200
- Height:40
- Align:Center
- Font:Bold
SupportPowers:
TooltipContainer:TOOLTIP_CONTAINER
X:10