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