From 8cec848a0f8894151f1d7890c70e2f21bdf8ce0c Mon Sep 17 00:00:00 2001 From: Oliver Brakmann Date: Sun, 27 Jul 2014 13:25:58 +0200 Subject: [PATCH] Add a mission objectives GUI panel --- OpenRA.Game/Traits/TraitsInterfaces.cs | 2 +- OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj | 2 - .../Widgets/Logic/CncIngameMenuLogic.cs | 131 ----------- .../Widgets/Logic/IngameChromeLogic.cs | 81 +------ OpenRA.Mods.RA/ConquestVictoryConditions.cs | 15 -- OpenRA.Mods.RA/MenuPaletteEffect.cs | 5 +- OpenRA.Mods.RA/OpenRA.Mods.RA.csproj | 4 + OpenRA.Mods.RA/Player/MissionObjectives.cs | 20 ++ .../Widgets/Logic/DebugMenuLogic.cs | 17 +- .../Widgets/Logic/DiplomacyLogic.cs | 12 +- .../Logic/Ingame/GameInfoBriefingLogic.cs | 38 +++ .../Widgets/Logic/Ingame/GameInfoLogic.cs | 109 +++++++++ .../Logic/Ingame/GameInfoObjectivesLogic.cs | 72 ++++++ .../Logic/Ingame/GameInfoStatsLogic.cs | 50 ++-- .../Widgets/Logic/IngameMenuLogic.cs | 100 ++++---- .../Widgets/Logic/ObserverStatsLogic.cs | 12 +- .../Widgets/Logic/OrderButtonsChromeLogic.cs | 55 +++-- mods/cnc/chrome/ingame-debug.yaml | 220 +++++++++--------- mods/cnc/chrome/ingame-info.yaml | 55 +++++ mods/cnc/chrome/ingame-infobriefing.yaml | 32 +++ mods/cnc/chrome/ingame-infoobjectives.yaml | 40 ++++ mods/cnc/chrome/ingame-infostats.yaml | 108 +++++++++ mods/cnc/chrome/ingame-menu.yaml | 32 +-- mods/cnc/chrome/objectives.yaml | 120 ---------- mods/cnc/mod.yaml | 7 +- mods/cnc/rules/world.yaml | 5 +- mods/d2k/chrome/ingame-menu.yaml | 61 +++++ mods/d2k/chrome/ingame-observer.yaml | 6 +- mods/d2k/chrome/ingame-player.yaml | 19 +- mods/d2k/chrome/ingame.yaml | 3 +- mods/d2k/mod.yaml | 9 +- mods/d2k/rules/world.yaml | 2 + mods/ra/chrome/ingame-debug.yaml | 179 +++++++------- mods/ra/chrome/ingame-info.yaml | 64 +++++ mods/ra/chrome/ingame-infobriefing.yaml | 32 +++ mods/ra/chrome/ingame-infoobjectives.yaml | 40 ++++ mods/ra/chrome/ingame-infostats.yaml | 108 +++++++++ mods/ra/chrome/ingame-menu.yaml | 118 ++++++---- mods/ra/chrome/ingame-objectives.yaml | 98 -------- mods/ra/chrome/ingame-observer.yaml | 4 +- mods/ra/chrome/ingame-player.yaml | 14 -- mods/ra/mod.yaml | 8 +- mods/ra/rules/world.yaml | 2 + mods/ts/chrome/ingame-player.yaml | 18 +- mods/ts/chrome/ingame.yaml | 4 +- mods/ts/mod.yaml | 5 +- 46 files changed, 1252 insertions(+), 886 deletions(-) delete mode 100644 OpenRA.Mods.Cnc/Widgets/Logic/CncIngameMenuLogic.cs create mode 100644 OpenRA.Mods.RA/Widgets/Logic/Ingame/GameInfoBriefingLogic.cs create mode 100644 OpenRA.Mods.RA/Widgets/Logic/Ingame/GameInfoLogic.cs create mode 100644 OpenRA.Mods.RA/Widgets/Logic/Ingame/GameInfoObjectivesLogic.cs rename OpenRA.Mods.Cnc/Widgets/Logic/CncConquestObjectivesLogic.cs => OpenRA.Mods.RA/Widgets/Logic/Ingame/GameInfoStatsLogic.cs (53%) create mode 100644 mods/cnc/chrome/ingame-info.yaml create mode 100644 mods/cnc/chrome/ingame-infobriefing.yaml create mode 100644 mods/cnc/chrome/ingame-infoobjectives.yaml create mode 100644 mods/cnc/chrome/ingame-infostats.yaml delete mode 100644 mods/cnc/chrome/objectives.yaml create mode 100644 mods/d2k/chrome/ingame-menu.yaml create mode 100644 mods/ra/chrome/ingame-info.yaml create mode 100644 mods/ra/chrome/ingame-infobriefing.yaml create mode 100644 mods/ra/chrome/ingame-infoobjectives.yaml create mode 100644 mods/ra/chrome/ingame-infostats.yaml delete mode 100644 mods/ra/chrome/ingame-objectives.yaml diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index f5dfce3daf..e8fb764998 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -271,7 +271,7 @@ namespace OpenRA.Traits public interface ILintPass { void Run(Action emitError, Action emitWarning, Map map); } - public interface IObjectivesPanel { string ObjectivesPanel { get; } } + public interface IObjectivesPanel { string PanelName { get; } } public interface INotifyObjectivesUpdated { diff --git a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj index 9f86250d9f..de31845598 100644 --- a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj +++ b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj @@ -75,8 +75,6 @@ - - diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameMenuLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameMenuLogic.cs deleted file mode 100644 index 3826fff390..0000000000 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameMenuLogic.cs +++ /dev/null @@ -1,131 +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.Linq; -using OpenRA.Graphics; -using OpenRA.Mods.RA; -using OpenRA.Mods.RA.Widgets; -using OpenRA.Traits; -using OpenRA.Widgets; - -namespace OpenRA.Mods.Cnc.Widgets.Logic -{ - public class CncIngameMenuLogic - { - Widget menu; - - enum PanelType { Objectives, Debug } - - [ObjectCreator.UseCtor] - public CncIngameMenuLogic(Widget widget, World world, Action onExit, WorldRenderer worldRenderer) - { - var resumeDisabled = false; - menu = widget.Get("INGAME_MENU"); - var mpe = world.WorldActor.Trait(); - mpe.Fade(MenuPaletteEffect.EffectType.Desaturated); - - menu.Get("VERSION_LABEL").Text = Game.modData.Manifest.Mod.Version; - - var hideButtons = false; - menu.Get("MENU_BUTTONS").IsVisible = () => !hideButtons; - - // TODO: Create a mechanism to do things like this cleaner. Also needed for scripted missions - Action onQuit = () => - { - Sound.PlayNotification(world.Map.Rules, null, "Speech", "Leave", null); - resumeDisabled = true; - Game.RunAfterDelay(1200, () => mpe.Fade(MenuPaletteEffect.EffectType.Black)); - Game.RunAfterDelay(1200 + 40 * mpe.Info.FadeLength, () => - { - Game.Disconnect(); - Ui.ResetAll(); - Game.LoadShellMap(); - }); - }; - - Action doNothing = () => { }; - - menu.Get("QUIT_BUTTON").OnClick = () => - ConfirmationDialogs.PromptConfirmAction("Abort Mission", "Leave this game and return to the menu?", onQuit, doNothing); - - Action onSurrender = () => world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor, false)); - var surrenderButton = menu.Get("SURRENDER_BUTTON"); - surrenderButton.IsDisabled = () => (world.LocalPlayer == null || world.LocalPlayer.WinState != WinState.Undefined); - surrenderButton.OnClick = () => - ConfirmationDialogs.PromptConfirmAction("Surrender", "Are you sure you want to surrender?", onSurrender, doNothing); - - menu.Get("MUSIC_BUTTON").OnClick = () => - { - hideButtons = true; - Ui.OpenWindow("MUSIC_PANEL", new WidgetArgs() - { - { "onExit", () => hideButtons = false }, - { "world", world } - }); - }; - - menu.Get("SETTINGS_BUTTON").OnClick = () => - { - hideButtons = true; - Ui.OpenWindow("SETTINGS_PANEL", new WidgetArgs() - { - { "world", world }, - { "worldRenderer", worldRenderer }, - { "onExit", () => hideButtons = false }, - }); - }; - - var resumeButton = menu.Get("RESUME_BUTTON"); - resumeButton.IsDisabled = () => resumeDisabled; - resumeButton.OnClick = () => - { - Ui.CloseWindow(); - Ui.Root.RemoveChild(menu); - world.WorldActor.Trait().Fade(MenuPaletteEffect.EffectType.None); - onExit(); - }; - - // Menu panels - ordered from lowest to highest priority - var panelParent = Game.OpenWindow(world, "INGAME_MENU_PANEL"); - var panelType = PanelType.Objectives; - var visibleButtons = 0; - - // Debug / Cheats panel - var debugButton = panelParent.Get("DEBUG_BUTTON"); - debugButton.OnClick = () => panelType = PanelType.Debug; - debugButton.IsHighlighted = () => panelType == PanelType.Debug; - - if (world.LocalPlayer != null && world.LobbyInfo.GlobalSettings.AllowCheats) - { - panelType = PanelType.Debug; - visibleButtons++; - var debugPanel = Game.LoadWidget(world, "DEBUG_PANEL", panelParent, new WidgetArgs() { { "onExit", doNothing }, { "transient", true } }); - debugPanel.IsVisible = () => panelType == PanelType.Debug; - debugButton.IsVisible = () => visibleButtons > 1; - } - - // Mission objectives - var iop = world.WorldActor.TraitsImplementing().FirstOrDefault(); - var objectivesButton = panelParent.Get("OBJECTIVES_BUTTON"); - objectivesButton.OnClick = () => panelType = PanelType.Objectives; - objectivesButton.IsHighlighted = () => panelType == PanelType.Objectives; - - if (iop != null && iop.ObjectivesPanel != null) - { - panelType = PanelType.Objectives; - visibleButtons++; - var objectivesPanel = Game.LoadWidget(world, iop.ObjectivesPanel, panelParent, new WidgetArgs()); - objectivesPanel.IsVisible = () => panelType == PanelType.Objectives; - objectivesButton.IsVisible = () => visibleButtons > 1; - } - } - } -} diff --git a/OpenRA.Mods.D2k/Widgets/Logic/IngameChromeLogic.cs b/OpenRA.Mods.D2k/Widgets/Logic/IngameChromeLogic.cs index db55cffc9d..a7f254bc0a 100644 --- a/OpenRA.Mods.D2k/Widgets/Logic/IngameChromeLogic.cs +++ b/OpenRA.Mods.D2k/Widgets/Logic/IngameChromeLogic.cs @@ -13,6 +13,8 @@ using System.Linq; using OpenRA.Mods.RA; using OpenRA.Mods.RA.Buildings; using OpenRA.Mods.RA.Widgets; +using OpenRA.Mods.RA.Widgets.Logic; +using OpenRA.Mods.D2k.Widgets; using OpenRA.Traits; using OpenRA.Widgets; @@ -40,54 +42,12 @@ namespace OpenRA.Mods.D2k.Widgets.Logic void InitRootWidgets() { - var cachedPause = false; - Widget optionsBG = null; - optionsBG = Game.LoadWidget(world, "INGAME_OPTIONS_BG", Ui.Root, new WidgetArgs - { - { "transient", false }, - { "onExit", () => - { - optionsBG.Visible = false; - - if (world.LobbyInfo.IsSinglePlayer) - world.SetPauseState(cachedPause); - } - } - }); - - optionsBG.Visible = false; - - gameRoot.Get("INGAME_OPTIONS_BUTTON").OnClick = () => - { - optionsBG.Visible ^= true; - if (optionsBG.Visible) - { - cachedPause = world.PredictedPaused; - - if (world.LobbyInfo.IsSinglePlayer) - world.SetPauseState(true); - } - else - world.SetPauseState(cachedPause); - }; - Game.LoadWidget(world, "CHAT_PANEL", gameRoot, new WidgetArgs()); } void InitObserverWidgets() { - var observerWidgets = Game.LoadWidget(world, "OBSERVER_WIDGETS", playerRoot, new WidgetArgs()); - - Widget observerstats = null; - observerstats = Game.LoadWidget(world, "INGAME_OBSERVERSTATS_BG", observerWidgets, new WidgetArgs - { - { "transient", false }, - { "onExit", () => observerstats.Visible = false } - }); - observerstats.Visible = false; - - var statsButton = observerWidgets.Get("OBSERVER_STATS_BUTTON"); - statsButton.OnClick = () => observerstats.Visible ^= true; + Game.LoadWidget(world, "OBSERVER_WIDGETS", playerRoot, new WidgetArgs()); } enum RadarBinState { Closed, BinAnimating, RadarAnimating, Open }; @@ -95,41 +55,6 @@ namespace OpenRA.Mods.D2k.Widgets.Logic { var playerWidgets = Game.LoadWidget(world, "PLAYER_WIDGETS", playerRoot, new WidgetArgs()); - Widget diplomacy = null; - diplomacy = Game.LoadWidget(world, "INGAME_DIPLOMACY_BG", playerWidgets, new WidgetArgs - { - { "transient", false }, - { "onExit", () => diplomacy.Visible = false } - }); - diplomacy.Visible = false; - - var diplomacyButton = playerWidgets.Get("INGAME_DIPLOMACY_BUTTON"); - diplomacyButton.OnClick = () => diplomacy.Visible ^= true; - var validPlayers = 0; - validPlayers = world.Players.Where(a => a != world.LocalPlayer && !a.NonCombatant).Count(); - diplomacyButton.IsVisible = () => validPlayers > 0; - - Widget cheats = null; - cheats = Game.LoadWidget(world, "INGAME_DEBUG_BG", playerWidgets, new WidgetArgs - { - { "transient", false }, - { "onExit", () => cheats.Visible = false } - }); - cheats.Visible = false; - - var cheatsButton = playerWidgets.Get("INGAME_DEBUG_BUTTON"); - cheatsButton.OnClick = () => cheats.Visible ^= true; - cheatsButton.IsVisible = () => world.LobbyInfo.GlobalSettings.AllowCheats; - - var iop = world.WorldActor.TraitsImplementing().FirstOrDefault(); - if (iop != null && iop.ObjectivesPanel != null) - { - var objectivesButton = playerWidgets.Get("OBJECTIVES_BUTTON"); - var objectivesWidget = Game.LoadWidget(world, iop.ObjectivesPanel, playerWidgets, new WidgetArgs()); - objectivesButton.Visible = true; - objectivesButton.OnClick += () => objectivesWidget.Visible ^= true; - } - var radarActive = false; var binState = RadarBinState.Closed; var radarBin = playerWidgets.Get("INGAME_RADAR_BIN"); diff --git a/OpenRA.Mods.RA/ConquestVictoryConditions.cs b/OpenRA.Mods.RA/ConquestVictoryConditions.cs index 7a5618c86f..f4e277d44c 100644 --- a/OpenRA.Mods.RA/ConquestVictoryConditions.cs +++ b/OpenRA.Mods.RA/ConquestVictoryConditions.cs @@ -91,19 +91,4 @@ namespace OpenRA.Mods.RA [Desc("Tag trait for things that must be destroyed for a short game to end.")] public class MustBeDestroyedInfo : TraitInfo { } public class MustBeDestroyed { } - - [Desc("Provides game mode information for players/observers.", - "Goes on WorldActor - observers don't have a player it can live on.")] - public class ConquestObjectivesPanelInfo : ITraitInfo - { - public string ObjectivesPanel = null; - public object Create(ActorInitializer init) { return new ConquestObjectivesPanel(this); } - } - - public class ConquestObjectivesPanel : IObjectivesPanel - { - ConquestObjectivesPanelInfo info; - public ConquestObjectivesPanel(ConquestObjectivesPanelInfo info) { this.info = info; } - public string ObjectivesPanel { get { return info.ObjectivesPanel; } } - } } diff --git a/OpenRA.Mods.RA/MenuPaletteEffect.cs b/OpenRA.Mods.RA/MenuPaletteEffect.cs index feee5ea158..b206fff4fc 100644 --- a/OpenRA.Mods.RA/MenuPaletteEffect.cs +++ b/OpenRA.Mods.RA/MenuPaletteEffect.cs @@ -21,9 +21,12 @@ namespace OpenRA.Mods.RA [Desc("Time (in ticks) to fade between states")] public readonly int FadeLength = 10; - [Desc("Effect style to fade to. Accepts values of None or Desaturated")] + [Desc("Effect style to fade to during gameplay. Accepts values of None or Desaturated.")] public readonly MenuPaletteEffect.EffectType Effect = MenuPaletteEffect.EffectType.None; + [Desc("Effect style to fade to when opening the in-game menu. Accepts values of None, Black or Desaturated.")] + public readonly MenuPaletteEffect.EffectType MenuEffect = MenuPaletteEffect.EffectType.None; + public object Create(ActorInitializer init) { return new MenuPaletteEffect(this); } } diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 8d182014a0..d62d7d5450 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -373,6 +373,10 @@ + + + + diff --git a/OpenRA.Mods.RA/Player/MissionObjectives.cs b/OpenRA.Mods.RA/Player/MissionObjectives.cs index 7fdbcf42c5..fc0b5632d5 100644 --- a/OpenRA.Mods.RA/Player/MissionObjectives.cs +++ b/OpenRA.Mods.RA/Player/MissionObjectives.cs @@ -8,6 +8,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Primitives; @@ -77,6 +78,7 @@ namespace OpenRA.Mods.RA objectives.Insert(newID, new MissionObjective(type, description)); + ObjectiveAdded(player); foreach (var imo in player.PlayerActor.TraitsImplementing()) imo.OnObjectiveAdded(player, newID); @@ -195,8 +197,26 @@ namespace OpenRA.Mods.RA } } + public event Action ObjectiveAdded = player => { }; + public void OnObjectiveAdded(Player player, int id) {} public void OnObjectiveCompleted(Player player, int id) {} public void OnObjectiveFailed(Player player, int id) {} } + + [Desc("Provides game mode progress information for players.", + "Goes on WorldActor - observers don't have a player it can live on.", + "Current options for PanelName are 'SKIRMISH_STATS' and 'MISSION_OBJECTIVES'.")] + public class ObjectivesPanelInfo : ITraitInfo + { + public string PanelName = null; + public object Create(ActorInitializer init) { return new ObjectivesPanel(this); } + } + + public class ObjectivesPanel : IObjectivesPanel + { + ObjectivesPanelInfo info; + public ObjectivesPanel(ObjectivesPanelInfo info) { this.info = info; } + public string PanelName { get { return info.PanelName; } } + } } diff --git a/OpenRA.Mods.RA/Widgets/Logic/DebugMenuLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/DebugMenuLogic.cs index e1f27035f7..8b56cef6a3 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/DebugMenuLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/DebugMenuLogic.cs @@ -18,7 +18,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic public class DebugMenuLogic { [ObjectCreator.UseCtor] - public DebugMenuLogic(Widget widget, Action onExit, World world, bool transient) + public DebugMenuLogic(Widget widget, World world) { var devTrait = world.LocalPlayer.PlayerActor.Trait(); @@ -112,21 +112,6 @@ namespace OpenRA.Mods.RA.Widgets.Logic showAstarCostCheckbox.IsChecked = () => dbgOverlay != null ? dbgOverlay.Visible : false; showAstarCostCheckbox.OnClick = () => { if (dbgOverlay != null) dbgOverlay.Visible ^= true; }; } - - var close = widget.GetOrNull("CLOSE"); - if (close != null) - { - close.OnClick = () => - { - if (transient) - { - Ui.CloseWindow(); - Ui.Root.RemoveChild(widget); - } - - onExit(); - }; - } } public void Order(World world, string order) diff --git a/OpenRA.Mods.RA/Widgets/Logic/DiplomacyLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/DiplomacyLogic.cs index 6a3d822f15..4f2301ac32 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/DiplomacyLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/DiplomacyLogic.cs @@ -23,7 +23,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic ScrollPanelWidget diplomacyPanel; [ObjectCreator.UseCtor] - public DiplomacyLogic(Widget widget, Action onExit, World world, bool transient) + public DiplomacyLogic(Widget widget, Action onExit, World world) { this.world = world; @@ -33,18 +33,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic var close = widget.GetOrNull("CLOSE"); if (close != null) - { close.OnClick = () => { - if (transient) - { - Ui.CloseWindow(); - Ui.Root.RemoveChild(widget); - } - + Ui.CloseWindow(); + Ui.Root.RemoveChild(widget); onExit(); }; - } } void LayoutPlayers() diff --git a/OpenRA.Mods.RA/Widgets/Logic/Ingame/GameInfoBriefingLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/Ingame/GameInfoBriefingLogic.cs new file mode 100644 index 0000000000..32114e4d59 --- /dev/null +++ b/OpenRA.Mods.RA/Widgets/Logic/Ingame/GameInfoBriefingLogic.cs @@ -0,0 +1,38 @@ +#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.Linq; +using OpenRA.Widgets; +using OpenRA.Traits; +using OpenRA.Mods.RA; + +namespace OpenRA.Mods.RA.Widgets.Logic +{ + class GameInfoBriefingLogic + { + [ObjectCreator.UseCtor] + public GameInfoBriefingLogic(Widget widget, World world) + { + var previewWidget = widget.Get("MAP_PREVIEW"); + previewWidget.Preview = () => Game.modData.MapCache[world.Map.Uid]; + + var mapDescriptionPanel = widget.Get("MAP_DESCRIPTION_PANEL"); + var mapDescription = widget.Get("MAP_DESCRIPTION"); + var mapFont = Game.Renderer.Fonts[mapDescription.Font]; + var text = world.Map.Description != null ? world.Map.Description.Replace("\\n", "\n") : ""; + text = WidgetUtils.WrapText(text, mapDescription.Bounds.Width, mapFont); + mapDescription.Text = text; + mapDescription.Bounds.Height = mapFont.Measure(text).Y; + mapDescriptionPanel.ScrollToTop(); + mapDescriptionPanel.Layout.AdjustChildren(); + } + } +} diff --git a/OpenRA.Mods.RA/Widgets/Logic/Ingame/GameInfoLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/Ingame/GameInfoLogic.cs new file mode 100644 index 0000000000..23b5dc9541 --- /dev/null +++ b/OpenRA.Mods.RA/Widgets/Logic/Ingame/GameInfoLogic.cs @@ -0,0 +1,109 @@ +#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.Linq; +using OpenRA.Widgets; +using OpenRA.Traits; +using OpenRA.Mods.RA; + +namespace OpenRA.Mods.RA.Widgets.Logic +{ + public enum IngameInfoPanel { AutoSelect, Map, Objectives, Debug }; + + class GameInfoLogic + { + [ObjectCreator.UseCtor] + public GameInfoLogic(Widget widget, World world, IngameInfoPanel activePanel) + { + var lp = world.LocalPlayer; + var numTabs = 0; + + widget.IsVisible = () => activePanel != IngameInfoPanel.AutoSelect; + + // Objectives/Stats tab + var iop = world.WorldActor.TraitsImplementing().FirstOrDefault(); + if (lp != null && iop != null && iop.PanelName != null) + { + numTabs++; + var objectivesTabButton = widget.Get(string.Concat("BUTTON", numTabs.ToString())); + objectivesTabButton.GetText = () => "Objectives"; + objectivesTabButton.IsVisible = () => lp != null && numTabs > 1; + objectivesTabButton.OnClick = () => activePanel = IngameInfoPanel.Objectives; + objectivesTabButton.IsHighlighted = () => activePanel == IngameInfoPanel.Objectives; + + var objectivesPanel = widget.Get("OBJECTIVES_PANEL"); + objectivesPanel.IsVisible = () => activePanel == IngameInfoPanel.Objectives; + + Game.LoadWidget(world, iop.PanelName, objectivesPanel, new WidgetArgs()); + + if (activePanel == IngameInfoPanel.AutoSelect) + activePanel = IngameInfoPanel.Objectives; + } + + // Briefing tab + if (world.Map.CustomPreview != null) + { + numTabs++; + var mapTabButton = widget.Get(string.Concat("BUTTON", numTabs.ToString())); + mapTabButton.Text = "Briefing"; + mapTabButton.IsVisible = () => numTabs > 1; + mapTabButton.OnClick = () => activePanel = IngameInfoPanel.Map; + mapTabButton.IsHighlighted = () => activePanel == IngameInfoPanel.Map; + + var mapPanel = widget.Get("MAP_PANEL"); + mapPanel.IsVisible = () => activePanel == IngameInfoPanel.Map; + + Game.LoadWidget(world, "MAP_PANEL", mapPanel, new WidgetArgs()); + + if (activePanel == IngameInfoPanel.AutoSelect) + activePanel = IngameInfoPanel.Map; + } + + // Debug/Cheats tab + if (lp != null && world.LobbyInfo.GlobalSettings.AllowCheats) + { + numTabs++; + var debugTabButton = widget.Get(string.Concat("BUTTON", numTabs.ToString())); + debugTabButton.Text = "Debug"; + debugTabButton.IsVisible = () => lp != null && world.LobbyInfo.GlobalSettings.AllowCheats && numTabs > 1; + debugTabButton.OnClick = () => activePanel = IngameInfoPanel.Debug; + debugTabButton.IsHighlighted = () => activePanel == IngameInfoPanel.Debug; + + var debugPanelContainer = widget.Get("DEBUG_PANEL"); + debugPanelContainer.IsVisible = () => activePanel == IngameInfoPanel.Debug; + + Game.LoadWidget(world, "DEBUG_PANEL", debugPanelContainer, new WidgetArgs()); + + if (activePanel == IngameInfoPanel.AutoSelect) + activePanel = IngameInfoPanel.Debug; + } + + // Handle empty space when tabs aren't displayed + var titleText = widget.Get("TITLE"); + var titleTextNoTabs = widget.GetOrNull("TITLE_NO_TABS"); + + titleText.IsVisible = () => numTabs > 1 || (numTabs == 1 && titleTextNoTabs == null); + titleText.GetText = () => string.Concat(world.Map.Type, ": ", world.Map.Title); + if (titleTextNoTabs != null) + { + titleTextNoTabs.IsVisible = () => numTabs == 1; + titleTextNoTabs.GetText = () => string.Concat(world.Map.Type, ": ", world.Map.Title); + } + + var bg = widget.Get("BACKGROUND"); + var bgNoTabs = widget.GetOrNull("BACKGROUND_NO_TABS"); + + bg.IsVisible = () => numTabs > 1 || (numTabs == 1 && bgNoTabs == null); + if (bgNoTabs != null) + bgNoTabs.IsVisible = () => numTabs == 1; + } + } +} diff --git a/OpenRA.Mods.RA/Widgets/Logic/Ingame/GameInfoObjectivesLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/Ingame/GameInfoObjectivesLogic.cs new file mode 100644 index 0000000000..b167a47f60 --- /dev/null +++ b/OpenRA.Mods.RA/Widgets/Logic/Ingame/GameInfoObjectivesLogic.cs @@ -0,0 +1,72 @@ +#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.Linq; +using System.Drawing; +using OpenRA.Widgets; +using OpenRA.Traits; +using OpenRA.Mods.RA; + +namespace OpenRA.Mods.RA.Widgets.Logic +{ + class GameInfoObjectivesLogic + { + ContainerWidget template; + + [ObjectCreator.UseCtor] + public GameInfoObjectivesLogic(Widget widget, World world) + { + var lp = world.LocalPlayer; + + var missionStatus = widget.Get("MISSION_STATUS"); + missionStatus.GetText = () => lp.WinState == WinState.Undefined ? "In progress" : + lp.WinState == WinState.Won ? "Accomplished" : "Failed"; + missionStatus.GetColor = () => lp.WinState == WinState.Undefined ? Color.White : + lp.WinState == WinState.Won ? Color.LimeGreen : Color.Red; + + var mo = lp.PlayerActor.TraitOrDefault(); + if (mo == null) + return; + + var objectivesPanel = widget.Get("OBJECTIVES_PANEL"); + template = objectivesPanel.Get("OBJECTIVE_TEMPLATE"); + + PopulateObjectivesList(mo, objectivesPanel, template); + + Action RedrawObjectives = player => + { + if (player == lp) + PopulateObjectivesList(mo, objectivesPanel, template); + }; + mo.ObjectiveAdded += RedrawObjectives; + } + + void PopulateObjectivesList(MissionObjectives mo, ScrollPanelWidget parent, ContainerWidget template) + { + parent.RemoveChildren(); + + foreach (var objective in mo.Objectives.OrderBy(o => o.Type)) + { + var widget = template.Clone(); + + var label = widget.Get("OBJECTIVE_TYPE"); + label.GetText = () => objective.Type == ObjectiveType.Primary ? "Primary" : "Secondary"; + + var checkbox = widget.Get("OBJECTIVE_STATUS"); + checkbox.IsChecked = () => objective.State != ObjectiveState.Incomplete; + checkbox.GetCheckType = () => objective.State == ObjectiveState.Completed ? "checked" : "crossed"; + checkbox.GetText = () => objective.Description; + + parent.AddChild(widget); + } + } + } +} \ No newline at end of file diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncConquestObjectivesLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/Ingame/GameInfoStatsLogic.cs similarity index 53% rename from OpenRA.Mods.Cnc/Widgets/Logic/CncConquestObjectivesLogic.cs rename to OpenRA.Mods.RA/Widgets/Logic/Ingame/GameInfoStatsLogic.cs index 9e7e2df3e7..0b56ef02d4 100644 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncConquestObjectivesLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/Ingame/GameInfoStatsLogic.cs @@ -1,6 +1,6 @@ -#region Copyright & License Information +#region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * 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, @@ -8,46 +8,42 @@ */ #endregion +using System; using System.Drawing; using System.Linq; -using OpenRA.Mods.RA; using OpenRA.Widgets; +using OpenRA.Traits; +using OpenRA.Mods.RA; -namespace OpenRA.Mods.Cnc.Widgets.Logic +namespace OpenRA.Mods.RA.Widgets.Logic { - public class CncConquestObjectivesLogic + class GameInfoStatsLogic { [ObjectCreator.UseCtor] - public CncConquestObjectivesLogic(Widget widget, World world) + public GameInfoStatsLogic(Widget widget, World world) { - var panel = widget.Get("CONQUEST_OBJECTIVES"); - panel.Get("TITLE").GetText = () => "Conquest: " + world.Map.Title; + var lp = world.LocalPlayer; - var statusLabel = panel.Get("STATUS"); - statusLabel.IsVisible = () => world.LocalPlayer != null; + var checkbox = widget.Get("STATS_CHECKBOX"); + checkbox.IsChecked = () => lp.WinState != WinState.Undefined; + checkbox.GetCheckType = () => lp.WinState == WinState.Won ? + "checked" : "crossed"; - if (world.LocalPlayer != null) - { - var lp = world.LocalPlayer; - var objectiveCheckbox = panel.Get("1"); - objectiveCheckbox.IsChecked = () => lp.WinState != WinState.Undefined; - objectiveCheckbox.GetCheckType = () => lp.WinState == WinState.Won ? - "checked" : "crossed"; + var statusLabel = widget.Get("STATS_STATUS"); - statusLabel.GetText = () => lp.WinState == WinState.Won ? "Complete" : - lp.WinState == WinState.Lost ? "Failed" : "Incomplete"; - statusLabel.GetColor = () => lp.WinState == WinState.Won ? Color.Green : - lp.WinState == WinState.Lost ? Color.Red : Color.White; - } + statusLabel.GetText = () => lp.WinState == WinState.Won ? "Accomplished" : + lp.WinState == WinState.Lost ? "Failed" : "In progress"; + statusLabel.GetColor = () => lp.WinState == WinState.Won ? Color.LimeGreen : + lp.WinState == WinState.Lost ? Color.Red : Color.White; - var scrollpanel = panel.Get("PLAYER_LIST"); - var itemTemplate = scrollpanel.Get("PLAYER_TEMPLATE"); - scrollpanel.RemoveChildren(); + var playerPanel = widget.Get("PLAYER_LIST"); + var playerTemplate = playerPanel.Get("PLAYER_TEMPLATE"); + playerPanel.RemoveChildren(); foreach (var p in world.Players.Where(a => !a.NonCombatant)) { var pp = p; - var item = itemTemplate.Clone(); + var item = playerTemplate.Clone(); var nameLabel = item.Get("NAME"); nameLabel.GetText = () => pp.WinState == WinState.Lost ? pp.PlayerName + " (Dead)" : pp.PlayerName; nameLabel.GetColor = () => pp.Color.RGB; @@ -61,7 +57,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic var client = world.LobbyInfo.ClientWithIndex(pp.ClientIndex); var teamNumber = (client == null) ? 0 : client.Team; team.GetText = () => (teamNumber == 0) ? "-" : teamNumber.ToString(); - scrollpanel.AddChild(item); + playerPanel.AddChild(item); var stats = pp.PlayerActor.TraitOrDefault(); if (stats == null) diff --git a/OpenRA.Mods.RA/Widgets/Logic/IngameMenuLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/IngameMenuLogic.cs index 2dd149f74d..50fabfb33f 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/IngameMenuLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/IngameMenuLogic.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#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 @@ -9,19 +9,34 @@ #endregion using System; +using System.Linq; using OpenRA.Graphics; +using OpenRA.Mods.RA; +using OpenRA.Mods.RA.Widgets; +using OpenRA.Traits; using OpenRA.Widgets; namespace OpenRA.Mods.RA.Widgets.Logic { - class IngameMenuLogic + public class IngameMenuLogic { + Widget menu; + [ObjectCreator.UseCtor] - public IngameMenuLogic(Widget widget, World world, Action onExit, WorldRenderer worldRenderer, bool transient) + public IngameMenuLogic(Widget widget, World world, Action onExit, WorldRenderer worldRenderer, IngameInfoPanel activePanel) { var resumeDisabled = false; + menu = widget.Get("INGAME_MENU"); var mpe = world.WorldActor.TraitOrDefault(); + if (mpe != null) + mpe.Fade(mpe.Info.MenuEffect); + menu.Get("VERSION_LABEL").Text = Game.modData.Manifest.Mod.Version; + + var hideMenu = false; + menu.Get("MENU_BUTTONS").IsVisible = () => !hideMenu; + + // TODO: Create a mechanism to do things like this cleaner. Also needed for scripted missions Action onQuit = () => { Sound.PlayNotification(world.Map.Rules, null, "Speech", "Leave", world.LocalPlayer == null ? null : world.LocalPlayer.Country.Race); @@ -33,7 +48,6 @@ namespace OpenRA.Mods.RA.Widgets.Logic Game.RunAfterDelay(exitDelay, () => mpe.Fade(MenuPaletteEffect.EffectType.Black)); exitDelay += 40 * mpe.Info.FadeLength; } - Game.RunAfterDelay(exitDelay, () => { Game.Disconnect(); @@ -42,62 +56,68 @@ namespace OpenRA.Mods.RA.Widgets.Logic }); }; - Action onSurrender = () => + Action closeMenu = () => { - world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor, false)); + Ui.CloseWindow(); + Ui.Root.RemoveChild(menu); + if (mpe != null) + mpe.Fade(MenuPaletteEffect.EffectType.None); onExit(); }; - widget.Get("DISCONNECT").OnClick = () => + Action showMenu = () => hideMenu = false; + + menu.Get("ABORT_MISSION").OnClick = () => { - widget.Visible = false; - ConfirmationDialogs.PromptConfirmAction("Abort Mission", "Leave this game and return to the menu?", onQuit, () => widget.Visible = true); + hideMenu = true; + ConfirmationDialogs.PromptConfirmAction("Abort Mission", "Leave this game and return to the menu?", onQuit, showMenu); }; - widget.Get("SETTINGS").OnClick = () => + Action onSurrender = () => { - widget.Visible = false; - Ui.OpenWindow("SETTINGS_PANEL", new WidgetArgs() - { - { "onExit", () => widget.Visible = true }, - { "worldRenderer", worldRenderer }, - }); + world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor, false)); + closeMenu(); }; - - widget.Get("MUSIC").OnClick = () => + var surrenderButton = menu.Get("SURRENDER"); + surrenderButton.IsDisabled = () => (world.LocalPlayer == null || world.LocalPlayer.WinState != WinState.Undefined); + surrenderButton.OnClick = () => { - widget.Visible = false; - Ui.OpenWindow("MUSIC_PANEL", new WidgetArgs + hideMenu = true; + ConfirmationDialogs.PromptConfirmAction("Surrender", "Are you sure you want to surrender?", onSurrender, showMenu); + }; + widget.Get("SURRENDER").IsVisible = () => world.LocalPlayer != null && world.LocalPlayer.WinState == WinState.Undefined; + + menu.Get("MUSIC").OnClick = () => + { + hideMenu = true; + Ui.OpenWindow("MUSIC_PANEL", new WidgetArgs() { - { "onExit", () => { widget.Visible = true; } }, + { "onExit", () => hideMenu = false }, { "world", world } }); }; - var resumeButton = widget.Get("RESUME"); - resumeButton.IsDisabled = () => resumeDisabled; - resumeButton.OnClick = () => + menu.Get("SETTINGS").OnClick = () => { - if (transient) + hideMenu = true; + Ui.OpenWindow("SETTINGS_PANEL", new WidgetArgs() { - Ui.CloseWindow(); - Ui.Root.RemoveChild(widget); - } - - onExit(); + { "world", world }, + { "worldRenderer", worldRenderer }, + { "onExit", () => hideMenu = false }, + }); }; - widget.Get("SURRENDER").OnClick = () => + var resumeButton = menu.Get("RESUME"); + resumeButton.IsDisabled = () => resumeDisabled; + resumeButton.OnClick = closeMenu; + + // Game info panel + var gameInfoPanel = Game.LoadWidget(world, "GAME_INFO_PANEL", menu, new WidgetArgs() { - widget.Visible = false; - ConfirmationDialogs.PromptConfirmAction( - "Surrender", - "Are you sure you want to surrender?", - onSurrender, - () => widget.Visible = true, - "Surrender"); - }; - widget.Get("SURRENDER").IsVisible = () => world.LocalPlayer != null && world.LocalPlayer.WinState == WinState.Undefined; + { "activePanel", activePanel } + }); + gameInfoPanel.IsVisible = () => !hideMenu; } } } diff --git a/OpenRA.Mods.RA/Widgets/Logic/ObserverStatsLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/ObserverStatsLogic.cs index a24b302d21..4d30629241 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/ObserverStatsLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/ObserverStatsLogic.cs @@ -40,7 +40,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic WorldRenderer worldRenderer; [ObjectCreator.UseCtor] - public ObserverStatsLogic(World world, WorldRenderer worldRenderer, Widget widget, Action onExit, bool transient) + public ObserverStatsLogic(World world, WorldRenderer worldRenderer, Widget widget, Action onExit) { this.world = world; this.worldRenderer = worldRenderer; @@ -139,18 +139,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic var close = widget.GetOrNull("CLOSE"); if (close != null) - { close.OnClick = () => { - if (transient) - { - Ui.CloseWindow(); - Ui.Root.RemoveChild(widget); - } - + Ui.CloseWindow(); + Ui.Root.RemoveChild(widget); onExit(); }; - } } void ClearStats() diff --git a/OpenRA.Mods.RA/Widgets/Logic/OrderButtonsChromeLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/OrderButtonsChromeLogic.cs index 3bb5bda0ed..2b5a826f0a 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/OrderButtonsChromeLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/OrderButtonsChromeLogic.cs @@ -8,9 +8,11 @@ */ #endregion +using System; using System.Linq; using OpenRA.Mods.RA.Orders; using OpenRA.Widgets; +using OpenRA.Traits; namespace OpenRA.Mods.RA.Widgets.Logic { @@ -59,8 +61,32 @@ namespace OpenRA.Mods.RA.Widgets.Logic var options = widget.GetOrNull("OPTIONS_BUTTON"); if (options != null) { + var blinking = false; + var lp = world.LocalPlayer; options.IsDisabled = () => disableSystemButtons; - options.OnClick = () => OpenMenuPanel(options); + options.OnClick = () => + { + blinking = false; + OpenMenuPanel(options, new WidgetArgs() + { + { "activePanel", IngameInfoPanel.AutoSelect } + }); + }; + options.IsHighlighted = () => blinking && Game.LocalTick % 50 < 25; + + if (lp != null) + { + Action StartBlinking = player => + { + if (player == world.LocalPlayer) + blinking = true; + }; + + var mo = lp.PlayerActor.TraitOrDefault(); + + if (mo != null) + mo.ObjectiveAdded += StartBlinking; + } } var diplomacy = widget.GetOrNull("DIPLOMACY_BUTTON"); @@ -76,7 +102,10 @@ namespace OpenRA.Mods.RA.Widgets.Logic { debug.IsVisible = () => world.LobbyInfo.GlobalSettings.AllowCheats; debug.IsDisabled = () => disableSystemButtons; - debug.OnClick = () => OpenMenuPanel(debug); + debug.OnClick = () => OpenMenuPanel(debug, new WidgetArgs() + { + { "activePanel", IngameInfoPanel.Debug } + }); } var stats = widget.GetOrNull("OBSERVER_STATS_BUTTON"); @@ -87,7 +116,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic } } - void OpenMenuPanel(MenuButtonWidget button) + void OpenMenuPanel(MenuButtonWidget button, WidgetArgs widgetArgs = null) { disableSystemButtons = true; var cachedPause = world.PredictedPaused; @@ -98,21 +127,19 @@ namespace OpenRA.Mods.RA.Widgets.Logic if (button.Pause && world.LobbyInfo.IsSinglePlayer) world.SetPauseState(true); - Game.LoadWidget(world, button.MenuContainer, Ui.Root, new WidgetArgs() + widgetArgs = widgetArgs ?? new WidgetArgs(); + widgetArgs.Add("onExit", () => { - { "transient", true }, - { "onExit", () => - { - if (button.HideIngameUI) - ingameRoot.IsVisible = () => true; + if (button.HideIngameUI) + ingameRoot.IsVisible = () => true; - if (button.Pause && world.LobbyInfo.IsSinglePlayer) - world.SetPauseState(cachedPause); + if (button.Pause && world.LobbyInfo.IsSinglePlayer) + world.SetPauseState(cachedPause); - disableSystemButtons = false; - } - } + disableSystemButtons = false; }); + + Game.LoadWidget(world, button.MenuContainer, Ui.Root, widgetArgs); } static void BindOrderButton(World world, ButtonWidget w, string icon) diff --git a/mods/cnc/chrome/ingame-debug.yaml b/mods/cnc/chrome/ingame-debug.yaml index d7db534ff5..148e0ec559 100644 --- a/mods/cnc/chrome/ingame-debug.yaml +++ b/mods/cnc/chrome/ingame-debug.yaml @@ -3,122 +3,110 @@ Container@DEBUG_PANEL: Width: PARENT_RIGHT Height: PARENT_BOTTOM Children: - Label@TITLE: - Width: PARENT_RIGHT - Y: 0-25 - Font: BigBold - Contrast: true + Label@CHEATS_TITLE: + Y: 25 + Font: Bold + Text: Cheats Align: Center - Text: Debug Options - Background@bg: Width: PARENT_RIGHT - Height: PARENT_BOTTOM - Background: panel-black - Children: - Label@CHEATS_TITLE: - Y: 25 - Font: Bold - Text: Cheats - Align: Center - Width: PARENT_RIGHT - Checkbox@INSTANT_BUILD: - X: 45 - Y: 45 - Width: 200 - Height: 20 - Font: Regular - Text: Instant Build Speed - Checkbox@ENABLE_TECH: - X: 45 - Y: 75 - Width: 200 - Height: 20 - Font: Regular - Text: Build Everything - Checkbox@BUILD_ANYWHERE: - X: 45 - Y: 105 - Width: 200 - Height: 20 - Font: Regular - Text: Build Anywhere - Checkbox@UNLIMITED_POWER: - X: 290 - Y: 45 - Width: 200 - Height: 20 - Font: Regular - Text: Unlimited Power - Checkbox@INSTANT_CHARGE: - X: 290 - Y: 75 - Width: 200 - Height: 20 - Font: Regular - Text: Instant Charge Time - Checkbox@DISABLE_SHROUD: - X: 290 - Y: 105 - Height: 20 - Width: 200 - Font: Regular - Text: Disable Shroud & Fog - Button@GIVE_CASH: - X: 90 - Y: 145 - Width: 140 - Height: 35 - Text: Give $20,000 - Button@GROW_RESOURCES: - X: 271 - Y: 145 - Width: 140 - Height: 35 - Text: Grow Resources - Button@GIVE_EXPLORATION: - X: 90 - Y: 195 - Width: 140 - Height: 35 - Text: Clear Shroud - Button@RESET_EXPLORATION: - X: 271 - Y: 195 - Width: 140 - Height: 35 - Text: Reset Shroud - Label@VISUALIZATIONS_TITLE: - Y: 255 - Font: Bold - Text: Visualizations - Align: Center - Width: PARENT_RIGHT - Checkbox@SHOW_UNIT_PATHS: - X: 45 - Y: 285 - Width: 200 - Height: 20 - Font: Regular - Text: Show Unit Paths - Checkbox@SHOW_ASTAR: - X: 45 - Y: 315 - Height: 20 - Width: 200 - Font: Regular - Text: Show A* Cost - Checkbox@SHOW_COMBATOVERLAY: - X: 290 - Y: 285 - Height: 20 - Width: 200 - Font: Regular - Text: Show Combat Geometry - Checkbox@SHOW_GEOMETRY: - X: 290 - Y: 315 - Height: 20 - Width: 200 - Font: Regular - Text: Show Render Geometry + Checkbox@INSTANT_BUILD: + X: 45 + Y: 45 + Width: 200 + Height: 20 + Font: Regular + Text: Instant Build Speed + Checkbox@ENABLE_TECH: + X: 45 + Y: 75 + Width: 200 + Height: 20 + Font: Regular + Text: Build Everything + Checkbox@BUILD_ANYWHERE: + X: 45 + Y: 105 + Width: 200 + Height: 20 + Font: Regular + Text: Build Anywhere + Checkbox@UNLIMITED_POWER: + X: 290 + Y: 45 + Width: 200 + Height: 20 + Font: Regular + Text: Unlimited Power + Checkbox@INSTANT_CHARGE: + X: 290 + Y: 75 + Width: 200 + Height: 20 + Font: Regular + Text: Instant Charge Time + Checkbox@DISABLE_SHROUD: + X: 290 + Y: 105 + Height: 20 + Width: 200 + Font: Regular + Text: Disable Shroud & Fog + Button@GIVE_CASH: + X: 90 + Y: 145 + Width: 140 + Height: 35 + Text: Give $20,000 + Button@GROW_RESOURCES: + X: 271 + Y: 145 + Width: 140 + Height: 35 + Text: Grow Resources + Button@GIVE_EXPLORATION: + X: 90 + Y: 195 + Width: 140 + Height: 35 + Text: Clear Shroud + Button@RESET_EXPLORATION: + X: 271 + Y: 195 + Width: 140 + Height: 35 + Text: Reset Shroud + Label@VISUALIZATIONS_TITLE: + Y: 255 + Font: Bold + Text: Visualizations + Align: Center + Width: PARENT_RIGHT + Checkbox@SHOW_UNIT_PATHS: + X: 45 + Y: 285 + Width: 200 + Height: 20 + Font: Regular + Text: Show Unit Paths + Checkbox@SHOW_ASTAR: + X: 45 + Y: 315 + Height: 20 + Width: 200 + Font: Regular + Text: Show A* Cost + Checkbox@SHOW_COMBATOVERLAY: + X: 290 + Y: 285 + Height: 20 + Width: 200 + Font: Regular + Text: Show Combat Geometry + Checkbox@SHOW_GEOMETRY: + X: 290 + Y: 315 + Height: 20 + Width: 200 + Font: Regular + Text: Show Render Geometry diff --git a/mods/cnc/chrome/ingame-info.yaml b/mods/cnc/chrome/ingame-info.yaml new file mode 100644 index 0000000000..7b0a99f610 --- /dev/null +++ b/mods/cnc/chrome/ingame-info.yaml @@ -0,0 +1,55 @@ +Container@GAME_INFO_PANEL: + X: (WINDOW_RIGHT - WIDTH) / 2 + Y: (WINDOW_BOTTOM - HEIGHT) / 2 + Width: 512 + Height: 375 + Logic: GameInfoLogic + Visible: False + Children: + Label@TITLE: + Width: PARENT_RIGHT + Y: 0 - 20 + Text: Game Information + Align: Center + Font: BigBold + Contrast: true + Label@TITLE_NO_TABS: + Width: PARENT_RIGHT + Y: 15 + Text: Game Information + Align: Center + Font: BigBold + Contrast: true + Container@TAB_CONTAINER: + Children: + Button@BUTTON1: + Y: 5 + Width: 140 + Height: 35 + Visible: False + Button@BUTTON2: + X: 150 + Y: 5 + Width: 140 + Height: 35 + Visible: False + Button@BUTTON3: + X: 300 + Y: 5 + Width: 140 + Height: 35 + Visible: False + Background@BACKGROUND: + Y: 39 + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + Background: panel-black + Children: + Container@STATS_PANEL: + Container@MAP_PANEL: + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + Container@OBJECTIVES_PANEL: + Container@DEBUG_PANEL: + Width: PARENT_RIGHT + Height: PARENT_BOTTOM diff --git a/mods/cnc/chrome/ingame-infobriefing.yaml b/mods/cnc/chrome/ingame-infobriefing.yaml new file mode 100644 index 0000000000..5151240779 --- /dev/null +++ b/mods/cnc/chrome/ingame-infobriefing.yaml @@ -0,0 +1,32 @@ +Container@MAP_PANEL: + Height: PARENT_BOTTOM + Width: PARENT_RIGHT + Logic: GameInfoBriefingLogic + Children: + Background@PREVIEW_BG: + X: (PARENT_RIGHT - WIDTH) / 2 + Y: 15 + Width: 324 + Height: 160 + Background: panel-gray + Children: + MapPreview@MAP_PREVIEW: + Width: 320 + Height: 156 + X: 2 + Y: 2 + IgnoreMouseOver: True + IgnoreMouseInput: True + ShowSpawnPoints: False + ScrollPanel@MAP_DESCRIPTION_PANEL: + X: 15 + Y: 190 + Width: 482 + Height: 170 + Children: + Label@MAP_DESCRIPTION: + X: 5 + Y: 195 + Width: 452 + Height: 160 + diff --git a/mods/cnc/chrome/ingame-infoobjectives.yaml b/mods/cnc/chrome/ingame-infoobjectives.yaml new file mode 100644 index 0000000000..b61e92a4af --- /dev/null +++ b/mods/cnc/chrome/ingame-infoobjectives.yaml @@ -0,0 +1,40 @@ +Container@MISSION_OBJECTIVES: + Height: PARENT_BOTTOM + Width: PARENT_RIGHT + Logic: GameInfoObjectivesLogic + Children: + Label@MISSION: + X: 15 + Y: 15 + Width: 80 + Height: 20 + Font: MediumBold + Text: Mission: + Label@MISSION_STATUS: + X: 95 + Y: 15 + Width: PARENT_RIGHT - 110 + Height: 20 + Font: MediumBold + ScrollPanel@OBJECTIVES_PANEL: + X: 15 + Y: 50 + Width: 482 + Height: 310 + ItemSpacing: 35 + Children: + Container@OBJECTIVE_TEMPLATE: + Children: + Label@OBJECTIVE_TYPE: + X: 10 + Y: 0 - 20 + Height: 20 + Width: 70 + Align: Center + Checkbox@OBJECTIVE_STATUS: + X: 90 + Y: 0 - 20 + Width: PARENT_RIGHT - 100 + Height: 20 + Disabled: True + TextColorDisabled: 255,255,255 diff --git a/mods/cnc/chrome/ingame-infostats.yaml b/mods/cnc/chrome/ingame-infostats.yaml new file mode 100644 index 0000000000..46dcfa0f0d --- /dev/null +++ b/mods/cnc/chrome/ingame-infostats.yaml @@ -0,0 +1,108 @@ +Container@SKIRMISH_STATS: + Height: PARENT_BOTTOM + Width: PARENT_RIGHT + Logic: GameInfoStatsLogic + Children: + Label@STATS_OBJECTIVE: + X: 15 + Y: 10 + Width: 85 + Height: 25 + Font: MediumBold + Text: Mission: + Label@STATS_STATUS: + X: 100 + Y: 10 + Width: PARENT_RIGHT - 10 + Height: 25 + Font: MediumBold + Checkbox@STATS_CHECKBOX: + X: 15 + Y: 45 + Width: 482 + Height: 20 + Font: Bold + Text: Destroy all opposition! + Disabled: yes + TextColorDisabled: 255,255,255 + Container@STATS_HEADERS: + X: 17 + Y: 80 + Width: 393 + Children: + Label@NAME: + X: 10 + Width: 150 + Height: 25 + Text: Player + Font: Bold + Label@RACE: + X: 150 + Width: 80 + Height: 25 + Text: Faction + Font: Bold + Align: Center + Label@STANCE: + X: 240 + Width: 70 + Height: 25 + Text: Team + Font: Bold + Align: Center + Label@KILLS: + X: 310 + Width: 70 + Height: 25 + Text: Kills + Font: Bold + Align: Center + Label@DEATHS: + X: 380 + Width: 70 + Height: 25 + Text: Deaths + Font: Bold + Align: Center + ScrollPanel@PLAYER_LIST: + X: 15 + Y: 105 + Width: 482 + Height: 250 + ItemSpacing: 5 + Children: + Container@PLAYER_TEMPLATE: + Width: PARENT_RIGHT-27 + Height: 25 + X: 2 + Y: 0 + Children: + Label@NAME: + X: 10 + Width: 150 + Height: 25 + Image@FACTIONFLAG: + X: 159 + Y: 6 + Width: 32 + Height: 16 + Label@FACTION: + X: 195 + Width: 40 + Height: 25 + Label@TEAM: + X: 240 + Width: 70 + Height: 25 + Align: Center + Label@KILLS: + X: 310 + Width: 70 + Height: 25 + Align: Center + Label@DEATHS: + X: 380 + Width: 70 + Height: 25 + Align: Center + diff --git a/mods/cnc/chrome/ingame-menu.yaml b/mods/cnc/chrome/ingame-menu.yaml index 606e1789a9..859a57978c 100644 --- a/mods/cnc/chrome/ingame-menu.yaml +++ b/mods/cnc/chrome/ingame-menu.yaml @@ -1,27 +1,7 @@ -Container@INGAME_MENU_PANEL: - X: (WINDOW_RIGHT - WIDTH)/2 - Y: (WINDOW_BOTTOM - HEIGHT)/2 - Width: 512 - Height: 370 - Children: - Button@OBJECTIVES_BUTTON: - Y: PARENT_BOTTOM - 1 - Width: 140 - Height: 35 - Text: Objectives - Visible: false - Button@DEBUG_BUTTON: - X: 150 - Y: PARENT_BOTTOM - 1 - Width: 140 - Height: 35 - Text: Debug - Visible: false - Container@INGAME_MENU: Width: WINDOW_RIGHT Height: WINDOW_BOTTOM - Logic: CncIngameMenuLogic + Logic: IngameMenuLogic Children: Image@EVA: X: WINDOW_RIGHT-128-43 @@ -46,31 +26,31 @@ Container@INGAME_MENU: Width: 740 Height: 35 Children: - Button@QUIT_BUTTON: + Button@ABORT_MISSION: X: 0 Y: 0 Width: 140 Height: 35 Text: Abort Mission - Button@SURRENDER_BUTTON: + Button@SURRENDER: X: 150 Y: 0 Width: 140 Height: 35 Text: Surrender - Button@MUSIC_BUTTON: + Button@MUSIC: X: 300 Y: 0 Width: 140 Height: 35 Text: Music - Button@SETTINGS_BUTTON: + Button@SETTINGS: X: 450 Y: 0 Width: 140 Height: 35 Text: Settings - Button@RESUME_BUTTON: + Button@RESUME: Key: escape X: 600 Y: 0 diff --git a/mods/cnc/chrome/objectives.yaml b/mods/cnc/chrome/objectives.yaml deleted file mode 100644 index 2599c1e804..0000000000 --- a/mods/cnc/chrome/objectives.yaml +++ /dev/null @@ -1,120 +0,0 @@ -Container@CONQUEST_OBJECTIVES: - Logic: CncConquestObjectivesLogic - Width: PARENT_RIGHT - Height: PARENT_BOTTOM - Children: - Label@TITLE: - Width: PARENT_RIGHT - Y: 0-25 - Font: BigBold - Contrast: true - Align: Center - Background@bg: - Width: PARENT_RIGHT - Height: PARENT_BOTTOM - Background: panel-black - Children: - Label@PRIMARY: - X: 15 - Y: 10 - Width: 482 - Height: 25 - Font: MediumBold - Text: Primary Objectives: - Label@STATUS: - X: 190 - Y: 10 - Width: 482 - Height: 25 - Font: MediumBold - Text: Incomplete - Checkbox@1: - X: 25 - Y: 45 - Width: 482 - Height: 20 - Font: Bold - Text: Crush all opposition! - Disabled: yes - Container@LABEL_CONTAINER: - X: 17 - Y: 80 - Width: 393 - Children: - Label@NAME: - X: 10 - Width: 150 - Height: 25 - Text: Player - Align: Center - Font: Bold - Label@RACE: - X: 150 - Width: 80 - Height: 25 - Text: Faction - Font: Bold - Align: Center - Label@STANCE: - X: 240 - Width: 70 - Height: 25 - Text: Team - Font: Bold - Align: Center - Label@KILLS: - X: 310 - Width: 70 - Height: 25 - Text: Kills - Font: Bold - Align: Center - Label@DEATHS: - X: 380 - Width: 70 - Height: 25 - Text: Deaths - Font: Bold - Align: Center - ScrollPanel@PLAYER_LIST: - X: 15 - Y: 105 - Width: 482 - Height: 250 - ItemSpacing: 5 - Children: - Container@PLAYER_TEMPLATE: - Width: PARENT_RIGHT-27 - Height: 25 - X: 2 - Y: 0 - Children: - Label@NAME: - X: 10 - Width: 150 - Height: 25 - Image@FACTIONFLAG: - X: 159 - Y: 6 - Width: 32 - Height: 16 - Label@FACTION: - X: 195 - Width: 40 - Height: 25 - Label@TEAM: - X: 240 - Width: 70 - Height: 25 - Align: Center - Label@KILLS: - X: 310 - Width: 70 - Height: 25 - Align: Center - Label@DEATHS: - X: 380 - Width: 70 - Height: 25 - Align: Center - diff --git a/mods/cnc/mod.yaml b/mods/cnc/mod.yaml index 13479e27d0..dafb8b1977 100644 --- a/mods/cnc/mod.yaml +++ b/mods/cnc/mod.yaml @@ -88,13 +88,16 @@ ChromeLayout: mods/cnc/chrome/replaybrowser.yaml mods/cnc/chrome/ingame.yaml mods/cnc/chrome/ingame-chat.yaml - mods/cnc/chrome/ingame-debug.yaml mods/cnc/chrome/ingame-menu.yaml + mods/cnc/chrome/ingame-debug.yaml + mods/cnc/chrome/ingame-info.yaml + mods/cnc/chrome/ingame-infobriefing.yaml + mods/cnc/chrome/ingame-infoobjectives.yaml + mods/cnc/chrome/ingame-infostats.yaml mods/cnc/chrome/music.yaml mods/cnc/chrome/settings.yaml mods/cnc/chrome/credits.yaml mods/cnc/chrome/dialogs.yaml - mods/cnc/chrome/objectives.yaml mods/cnc/chrome/tooltips.yaml mods/cnc/chrome/irc.yaml mods/cnc/chrome/assetbrowser.yaml diff --git a/mods/cnc/rules/world.yaml b/mods/cnc/rules/world.yaml index 2014d5aff4..fe0e1d98e3 100644 --- a/mods/cnc/rules/world.yaml +++ b/mods/cnc/rules/world.yaml @@ -8,6 +8,7 @@ World: LoadWidgetAtGameStart: Widget: INGAME_ROOT MenuPaletteEffect: + MenuEffect: Desaturated CloakPaletteEffect: ScreenShaker: NukePaletteEffect: @@ -185,7 +186,7 @@ World: PathFinder: ValidateOrder: DebugPauseState: - ConquestObjectivesPanel: - ObjectivesPanel: CONQUEST_OBJECTIVES + ObjectivesPanel: + PanelName: SKIRMISH_STATS RadarPings: diff --git a/mods/d2k/chrome/ingame-menu.yaml b/mods/d2k/chrome/ingame-menu.yaml new file mode 100644 index 0000000000..bcddf2682d --- /dev/null +++ b/mods/d2k/chrome/ingame-menu.yaml @@ -0,0 +1,61 @@ +Container@INGAME_MENU: + Width: WINDOW_RIGHT + Height: WINDOW_BOTTOM + Logic: IngameMenuLogic + Children: + Label@VERSION_LABEL: + X: WINDOW_RIGHT - 10 + Y: WINDOW_BOTTOM - 20 + Align: Right + Font: Regular + Contrast: True + Background@MENU_BUTTONS: + X: 100 + Y: (WINDOW_BOTTOM - HEIGHT)/2 + Width: 200 + Height: 295 + Children: + Label@LABEL_TITLE: + X: (PARENT_RIGHT - WIDTH)/2 + Y: 20 + Width: 200 + Height: 30 + Text: Options + Align: Center + Font: Bold + Button@RESUME: + X: (PARENT_RIGHT - WIDTH)/2 + Y: 60 + Width: 140 + Height: 30 + Text: Resume + Font: Bold + Key: escape + Button@SETTINGS: + X: (PARENT_RIGHT - WIDTH)/2 + Y: 100 + Width: 140 + Height: 30 + Text: Settings + Font: Bold + Button@MUSIC: + X: (PARENT_RIGHT - WIDTH)/2 + Y: 140 + Width: 140 + Height: 30 + Text: Music + Font: Bold + Button@SURRENDER: + X: (PARENT_RIGHT - WIDTH)/2 + Y: 180 + Width: 140 + Height: 30 + Text: Surrender + Font: Bold + Button@ABORT_MISSION: + X: (PARENT_RIGHT - WIDTH)/2 + Y: 220 + Width: 140 + Height: 30 + Text: Abort Mission + Font: Bold diff --git a/mods/d2k/chrome/ingame-observer.yaml b/mods/d2k/chrome/ingame-observer.yaml index 996d72c9b4..3aa2336b2d 100644 --- a/mods/d2k/chrome/ingame-observer.yaml +++ b/mods/d2k/chrome/ingame-observer.yaml @@ -1,6 +1,10 @@ Container@OBSERVER_WIDGETS: Children: - Button@OBSERVER_STATS_BUTTON: + MenuButton@OBSERVER_STATS_BUTTON: + Logic: OrderButtonsChromeLogic + MenuContainer: INGAME_OBSERVERSTATS_BG + HideIngameUI: False + Pause: False X: 162 Y: 0 Width: 160 diff --git a/mods/d2k/chrome/ingame-player.yaml b/mods/d2k/chrome/ingame-player.yaml index 38f2eb8fbf..e60ff102b8 100644 --- a/mods/d2k/chrome/ingame-player.yaml +++ b/mods/d2k/chrome/ingame-player.yaml @@ -3,7 +3,10 @@ Container@PLAYER_WIDGETS: LogicKeyListener@CONTROLGROUP_KEYHANDLER: Logic: ControlGroupLogic LogicTicker@SIDEBAR_TICKER: - Button@INGAME_DIPLOMACY_BUTTON: + MenuButton@DIPLOMACY_BUTTON: + Logic: OrderButtonsChromeLogic + MenuContainer: INGAME_DIPLOMACY_BG + HideIngameUI: False X: 162 Y: 0 Width: 160 @@ -11,24 +14,16 @@ Container@PLAYER_WIDGETS: Text: Diplomacy (P) Font: Bold Key: p - Button@INGAME_DEBUG_BUTTON: + MenuButton@DEBUG_BUTTON: + Logic: OrderButtonsChromeLogic + MenuContainer: INGAME_MENU X: 324 Y: 0 Width: 160 Height: 25 Text: Debug (Shift + Esc) - Visible: false Font: Bold Key: escape Shift - Button@OBJECTIVES_BUTTON: - X: 486 - Y: 0 - Width: 160 - Height: 25 - Text: Objectives (O) - Visible: false - Font: Bold - Key: o SlidingContainer@INGAME_RADAR_BIN: X: WINDOW_RIGHT-215 Y: 0 diff --git a/mods/d2k/chrome/ingame.yaml b/mods/d2k/chrome/ingame.yaml index 6fb6d8f353..ba99368f3b 100644 --- a/mods/d2k/chrome/ingame.yaml +++ b/mods/d2k/chrome/ingame.yaml @@ -46,7 +46,8 @@ Container@INGAME_ROOT: Y: 34 Order: Descending Container@PLAYER_ROOT: - Button@INGAME_OPTIONS_BUTTON: + MenuButton@OPTIONS_BUTTON: + Logic: OrderButtonsChromeLogic X: 0 Y: 0 Width: 160 diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index e27ad056d8..cc9d32dd33 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -61,7 +61,11 @@ ChromeLayout: mods/ra/chrome/ingame-chat.yaml mods/ra/chrome/ingame-diplomacy.yaml mods/ra/chrome/ingame-fmvplayer.yaml - mods/ra/chrome/ingame-menu.yaml + mods/d2k/chrome/ingame-menu.yaml + mods/ra/chrome/ingame-info.yaml + mods/ra/chrome/ingame-infobriefing.yaml + mods/ra/chrome/ingame-infoobjectives.yaml + mods/ra/chrome/ingame-infostats.yaml mods/d2k/chrome/ingame-observer.yaml mods/ra/chrome/ingame-observerstats.yaml mods/d2k/chrome/ingame-player.yaml @@ -152,6 +156,9 @@ Fonts: Title: Font:mods/d2k/Dune2k.ttf Size:32 + MediumBold: + Font:FreeSansBold.ttf + Size:18 BigBold: Font:FreeSansBold.ttf Size:24 diff --git a/mods/d2k/rules/world.yaml b/mods/d2k/rules/world.yaml index 6df1ce8aec..d1dfee1296 100644 --- a/mods/d2k/rules/world.yaml +++ b/mods/d2k/rules/world.yaml @@ -189,4 +189,6 @@ World: ValidateOrder: DebugPauseState: RadarPings: + ObjectivesPanel: + PanelName: SKIRMISH_STATS diff --git a/mods/ra/chrome/ingame-debug.yaml b/mods/ra/chrome/ingame-debug.yaml index b10dd915b9..b2e20db205 100644 --- a/mods/ra/chrome/ingame-debug.yaml +++ b/mods/ra/chrome/ingame-debug.yaml @@ -1,110 +1,117 @@ -Background@INGAME_DEBUG_BG: +Container@DEBUG_PANEL: Logic: DebugMenuLogic - X: (WINDOW_RIGHT - WIDTH)/2 - Y: (WINDOW_BOTTOM - HEIGHT)/2 - Width: 350 - Height: 475 + Y: 20 + Width: PARENT_RIGHT + Height: PARENT_BOTTOM Children: - Label@LABEL_TITLE: - X: (PARENT_RIGHT - WIDTH)/2 - Y: 20 - Width: 250 - Height: 25 + Label@LABLE_TITLE: + Y: 25 + Font: Bold Text: Debug Options Align: Center - Font: Bold - Checkbox@DISABLE_SHROUD: - X: 30 - Y: 50 - Height: 20 - Width: PARENT_RIGHT - 30 - Text: Disable Shroud & Fog - Button@GIVE_EXPLORATION: - X: 30 - Y: 80 - Width: 120 - Height: 25 - Text: Give Exploration - Button@RESET_EXPLORATION: - X: 200 - Y: 80 - Width: 120 - Height: 25 - Text: Reset Exploration - Checkbox@SHOW_UNIT_PATHS: - X: 30 - Y: 110 - Width: PARENT_RIGHT - 30 - Height: 20 - Text: Show Unit Paths - Button@GIVE_CASH: - X: 30 - Y: 140 - Width: 135 - Height: 20 - Text: Give $20000 Cash - Height: 25 - Button@GROW_RESOURCES: - X: 185 - Y: 140 - Width: 135 - Height: 20 - Text: Grow Resources - Height: 25 + Width: PARENT_RIGHT Checkbox@INSTANT_BUILD: - X: 30 - Y: 170 - Width: PARENT_RIGHT - 30 + X: 45 + Y: 45 + Width: 200 Height: 20 + Font: Regular Text: Instant Build Speed - Checkbox@INSTANT_CHARGE: - X: 30 - Y: 200 - Width: PARENT_RIGHT - 30 - Height: 20 - Text: Support Powers Charge Instantly Checkbox@ENABLE_TECH: - X: 30 - Y: 230 - Width: PARENT_RIGHT - 30 + X: 45 + Y: 75 + Width: 200 Height: 20 + Font: Regular Text: Build Everything - Checkbox@UNLIMITED_POWER: - X: 30 - Y: 260 - Width: PARENT_RIGHT - 30 - Height: 20 - Text: Unlimited Power Checkbox@BUILD_ANYWHERE: - X: 30 - Y: 290 - Width: PARENT_RIGHT - 30 + X: 45 + Y: 105 + Width: 200 Height: 20 + Font: Regular Text: Build Anywhere - Checkbox@SHOW_ASTAR: - X: 30 - Y: 320 - Width: PARENT_RIGHT - 30 + Checkbox@UNLIMITED_POWER: + X: 290 + Y: 45 + Width: 200 Height: 20 + Font: Regular + Text: Unlimited Power + Checkbox@INSTANT_CHARGE: + X: 290 + Y: 75 + Width: 200 + Height: 20 + Font: Regular + Text: Instant Charge Time + Checkbox@DISABLE_SHROUD: + X: 290 + Y: 105 + Height: 20 + Width: 200 + Font: Regular + Text: Disable Shroud & Fog + Button@GIVE_CASH: + X: 90 + Y: 150 + Width: 140 + Height: 30 + Font: Bold + Text: Give $20,000 + Button@GROW_RESOURCES: + X: 271 + Y: 150 + Width: 140 + Height: 30 + Font: Bold + Text: Grow Resources + Button@GIVE_EXPLORATION: + X: 90 + Y: 200 + Width: 140 + Height: 30 + Font: Bold + Text: Clear Shroud + Button@RESET_EXPLORATION: + X: 271 + Y: 200 + Width: 140 + Height: 30 + Font: Bold + Text: Reset Shroud + Label@VISUALIZATIONS_TITLE: + Y: 255 + Font: Bold + Text: Visualizations + Align: Center + Width: PARENT_RIGHT + Checkbox@SHOW_UNIT_PATHS: + X: 45 + Y: 285 + Width: 200 + Height: 20 + Font: Regular + Text: Show Unit Paths + Checkbox@SHOW_ASTAR: + X: 45 + Y: 315 + Height: 20 + Width: 200 + Font: Regular Text: Show A* Cost Checkbox@SHOW_COMBATOVERLAY: - X: 30 - Y: 350 + X: 290 + Y: 285 Height: 20 Width: 200 + Font: Regular Text: Show Combat Geometry Checkbox@SHOW_GEOMETRY: - X: 30 - Y: 380 + X: 290 + Y: 315 Height: 20 Width: 200 + Font: Regular Text: Show Render Geometry - Button@CLOSE: - X: 30 - Y: 420 - Width: PARENT_RIGHT - 60 - Height: 25 - Text: Close - Key: escape - Font: Bold diff --git a/mods/ra/chrome/ingame-info.yaml b/mods/ra/chrome/ingame-info.yaml new file mode 100644 index 0000000000..6aad3f056d --- /dev/null +++ b/mods/ra/chrome/ingame-info.yaml @@ -0,0 +1,64 @@ +Container@GAME_INFO_PANEL: + X: (WINDOW_RIGHT - WIDTH) / 2 + Y: (WINDOW_BOTTOM - HEIGHT) / 2 + Width: 522 + Height: 455 + Logic: GameInfoLogic + Visible: False + Children: + Background@BACKGROUND: + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + Background@BACKGROUND_NO_TABS: + Y: 25 + Width: PARENT_RIGHT + Height: PARENT_BOTTOM - 25 + Label@TITLE: + Y: 20 + Width: PARENT_RIGHT + Height: 25 + Align: Center + Font: Bold + Label@TITLE_NO_TABS: + Y: 45 + Width: PARENT_RIGHT + Height: 25 + Align: Center + Font: Bold + Container@TAB_CONTAINER: + X: (PARENT_RIGHT - WIDTH) / 2 + Width: 360 + Height: 25 + Children: + Button@BUTTON1: + Y: 50 + Width: 120 + Height: 25 + Font: Bold + Visible: False + Button@BUTTON2: + X: 120 + Y: 50 + Width: 120 + Height: 25 + Font: Bold + Visible: False + Button@BUTTON3: + X: 240 + Y: 50 + Width: 120 + Height: 25 + Font: Bold + Visible: False + Container@STATS_PANEL: + Y: 65 + Container@MAP_PANEL: + Y: 65 + Width: PARENT_RIGHT + Height: PARENT_BOTTOM + Container@OBJECTIVES_PANEL: + Y: 65 + Container@DEBUG_PANEL: + Y: 65 + Width: PARENT_RIGHT + Height: PARENT_BOTTOM diff --git a/mods/ra/chrome/ingame-infobriefing.yaml b/mods/ra/chrome/ingame-infobriefing.yaml new file mode 100644 index 0000000000..de0813f7fe --- /dev/null +++ b/mods/ra/chrome/ingame-infobriefing.yaml @@ -0,0 +1,32 @@ +Container@MAP_PANEL: + Height: PARENT_BOTTOM + Width: PARENT_RIGHT + Logic: GameInfoBriefingLogic + Children: + Background@PREVIEW_BG: + X: (PARENT_RIGHT - WIDTH) / 2 + Y: 20 + Width: 324 + Height: 160 + Background: panel-gray + Children: + MapPreview@MAP_PREVIEW: + Width: 320 + Height: 156 + X: 2 + Y: 2 + IgnoreMouseOver: True + IgnoreMouseInput: True + ShowSpawnPoints: False + ScrollPanel@MAP_DESCRIPTION_PANEL: + X: 20 + Y: 195 + Width: 482 + Height: 175 + Children: + Label@MAP_DESCRIPTION: + X: 5 + Y: 180 + Width: 452 + Height: 145 + diff --git a/mods/ra/chrome/ingame-infoobjectives.yaml b/mods/ra/chrome/ingame-infoobjectives.yaml new file mode 100644 index 0000000000..1dde1deee0 --- /dev/null +++ b/mods/ra/chrome/ingame-infoobjectives.yaml @@ -0,0 +1,40 @@ +Container@MISSION_OBJECTIVES: + Height: PARENT_BOTTOM + Width: PARENT_RIGHT + Logic: GameInfoObjectivesLogic + Children: + Label@MISSION: + X: 20 + Y: 20 + Width: 80 + Height: 25 + Font: MediumBold + Text: Mission: + Label@MISSION_STATUS: + X: 100 + Y: 20 + Width: PARENT_RIGHT - 120 + Height: 25 + Font: MediumBold + ScrollPanel@OBJECTIVES_PANEL: + X: 20 + Y: 60 + Width: 482 + Height: 310 + ItemSpacing: 35 + Children: + Container@OBJECTIVE_TEMPLATE: + Children: + Label@OBJECTIVE_TYPE: + X: 10 + Y: 0 - 20 + Height: 20 + Width: 70 + Align: Center + Checkbox@OBJECTIVE_STATUS: + X: 90 + Y: 0 - 20 + Width: PARENT_RIGHT - 100 + Height: 20 + Disabled: True + TextColorDisabled: 255,255,255 diff --git a/mods/ra/chrome/ingame-infostats.yaml b/mods/ra/chrome/ingame-infostats.yaml new file mode 100644 index 0000000000..4c8d45ddcd --- /dev/null +++ b/mods/ra/chrome/ingame-infostats.yaml @@ -0,0 +1,108 @@ +Container@SKIRMISH_STATS: + Height: PARENT_BOTTOM + Width: PARENT_RIGHT + Logic: GameInfoStatsLogic + Children: + Label@MISSION: + X: 20 + Y: 20 + Width: 482 + Height: 25 + Font: MediumBold + Text: Mission: + Label@STATS_STATUS: + X: 100 + Y: 20 + Width: PARENT_RIGHT - 10 + Height: 25 + Font: MediumBold + Checkbox@STATS_CHECKBOX: + X: 20 + Y: 55 + Width: 482 + Height: 20 + Font: Bold + Text: Destroy all opposition! + Disabled: yes + TextColorDisabled: 255,255,255 + Container@STATS_HEADERS: + X: 22 + Y: 80 + Width: 393 + Children: + Label@NAME: + X: 10 + Width: 150 + Height: 25 + Text: Player + Font: Bold + Label@RACE: + X: 150 + Width: 80 + Height: 25 + Text: Faction + Font: Bold + Align: Center + Label@STANCE: + X: 240 + Width: 70 + Height: 25 + Text: Team + Font: Bold + Align: Center + Label@KILLS: + X: 310 + Width: 70 + Height: 25 + Text: Kills + Font: Bold + Align: Center + Label@DEATHS: + X: 380 + Width: 70 + Height: 25 + Text: Deaths + Font: Bold + Align: Center + ScrollPanel@PLAYER_LIST: + X: 20 + Y: 105 + Width: 482 + Height: 265 + ItemSpacing: 5 + Children: + Container@PLAYER_TEMPLATE: + Width: PARENT_RIGHT-27 + Height: 25 + X: 2 + Y: 0 + Children: + Label@NAME: + X: 10 + Width: 150 + Height: 25 + Image@FACTIONFLAG: + X: 159 + Y: 6 + Width: 32 + Height: 16 + Label@FACTION: + X: 195 + Width: 40 + Height: 25 + Label@TEAM: + X: 240 + Width: 70 + Height: 25 + Align: Center + Label@KILLS: + X: 310 + Width: 70 + Height: 25 + Align: Center + Label@DEATHS: + X: 380 + Width: 70 + Height: 25 + Align: Center + diff --git a/mods/ra/chrome/ingame-menu.yaml b/mods/ra/chrome/ingame-menu.yaml index 73ad81ea76..f3483b91e7 100644 --- a/mods/ra/chrome/ingame-menu.yaml +++ b/mods/ra/chrome/ingame-menu.yaml @@ -1,52 +1,74 @@ -Background@INGAME_OPTIONS_BG: - X: (WINDOW_RIGHT - WIDTH)/2 - Y: (WINDOW_BOTTOM - HEIGHT)/2 - Width: 300 - Height: 295 +Container@INGAME_MENU: + Width: WINDOW_RIGHT + Height: WINDOW_BOTTOM Logic: IngameMenuLogic Children: - Label@LABEL_TITLE: - X: (PARENT_RIGHT - WIDTH)/2 - Y: 20 - Width: 250 + Background@BORDER: + X: 0 - 15 + Y: 0 - 15 + Width: WINDOW_RIGHT + 30 + Height: WINDOW_BOTTOM + 30 + Background: mainmenu-border + Image@LOGO: + X: WINDOW_RIGHT - 296 + Y: 30 + ImageCollection: logos + ImageName: logo + Label@VERSION_LABEL: + X: WINDOW_RIGHT - 296 + Y: 296 - 20 + Width: 296 - 20 Height: 25 - Text: Options Align: Center - Font: Bold - Button@RESUME: - X: (PARENT_RIGHT - WIDTH)/2 - Y: 60 - Width: 160 - Height: 25 - Text: Resume - Font: Bold - Key: escape - Button@SETTINGS: - X: (PARENT_RIGHT - WIDTH)/2 - Y: 100 - Width: 160 - Height: 25 - Text: Settings - Font: Bold - Button@MUSIC: - X: (PARENT_RIGHT - WIDTH)/2 - Y: 140 - Width: 160 - Height: 25 - Text: Music - Font: Bold - Button@SURRENDER: - X: (PARENT_RIGHT - WIDTH)/2 - Y: 180 - Width: 160 - Height: 25 - Text: Surrender - Font: Bold - Button@DISCONNECT: - X: (PARENT_RIGHT - WIDTH)/2 - Y: 220 - Width: 160 - Height: 25 - Text: Abort Mission - Font: Bold - + Font: Regular + Contrast: True + Background@MENU_BUTTONS: + X: 100 + Y: (WINDOW_BOTTOM - HEIGHT)/2 + Width: 200 + Height: 295 + Children: + Label@LABEL_TITLE: + X: (PARENT_RIGHT - WIDTH)/2 + Y: 20 + Width: 200 + Height: 30 + Text: Options + Align: Center + Font: Bold + Button@RESUME: + X: (PARENT_RIGHT - WIDTH)/2 + Y: 60 + Width: 140 + Height: 30 + Text: Resume + Font: Bold + Key: escape + Button@SETTINGS: + X: (PARENT_RIGHT - WIDTH)/2 + Y: 100 + Width: 140 + Height: 30 + Text: Settings + Font: Bold + Button@MUSIC: + X: (PARENT_RIGHT - WIDTH)/2 + Y: 140 + Width: 140 + Height: 30 + Text: Music + Font: Bold + Button@SURRENDER: + X: (PARENT_RIGHT - WIDTH)/2 + Y: 180 + Width: 140 + Height: 30 + Text: Surrender + Font: Bold + Button@ABORT_MISSION: + X: (PARENT_RIGHT - WIDTH)/2 + Y: 220 + Width: 140 + Height: 30 + Text: Abort Mission + Font: Bold diff --git a/mods/ra/chrome/ingame-objectives.yaml b/mods/ra/chrome/ingame-objectives.yaml deleted file mode 100644 index 87b6bc02fa..0000000000 --- a/mods/ra/chrome/ingame-objectives.yaml +++ /dev/null @@ -1,98 +0,0 @@ -Background@MISSION_OBJECTIVES: - Logic: MissionObjectivesLogic - X: 25 - Y: 50 - Width: 512 - Height: 530 - Visible: false - Background: dialog - Children: - Label@TITLE: - X: 0 - Y: 15 - Width: PARENT_RIGHT - Height: 25 - Font: Bold - Align: Center - Text: Objectives - Label@PRIMARY_OBJECTIVE_HEADER: - X: 40 - Y: 40 - Width: 300 - Height: 25 - Font: Bold - Text: Primary Objectives - Label@PRIMARY_STATUS_HEADER: - X: 350 - Y: 40 - Width: 122 - Height: 25 - Font: Bold - Text: Status - ScrollPanel@PRIMARY_OBJECTIVES: - X: 25 - Y: 70 - Width: PARENT_RIGHT-50 - Height: 200 - ItemSpacing: 20 - Children: - Container@PRIMARY_OBJECTIVE_TEMPLATE: - X: 15 - Y: 0 - Width: PARENT_RIGHT - Children: - Label@PRIMARY_OBJECTIVE: - X: 0 - Y: 0 - Width: 300 - Height: PARENT_BOTTOM - Font: Regular - WordWrap: True - Label@PRIMARY_STATUS: - X: 310 - Y: 0 - Width: 122 - Height: PARENT_BOTTOM - Font: Bold - WordWrap: True - Label@SECONDARY_OBJECTIVE_HEADER: - X: 40 - Y: 275 - Width: 300 - Height: 25 - Font: Bold - Text: Secondary Objectives - Label@SECONDARY_STATUS_HEADER: - X: 350 - Y: 275 - Width: 122 - Height: 25 - Font: Bold - Text: Status - ScrollPanel@SECONDARY_OBJECTIVES: - X: 25 - Y: 305 - Width: PARENT_RIGHT-50 - Height: 200 - ItemSpacing: 20 - Children: - Container@SECONDARY_OBJECTIVE_TEMPLATE: - X: 15 - Y: 0 - Width: PARENT_RIGHT - Children: - Label@SECONDARY_OBJECTIVE: - X: 0 - Y: 0 - Width: 300 - Height: PARENT_BOTTOM - Font: Regular - WordWrap: True - Label@SECONDARY_STATUS: - X: 310 - Y: 0 - Width: 122 - Height: PARENT_BOTTOM - Font: Bold - WordWrap: True - diff --git a/mods/ra/chrome/ingame-observer.yaml b/mods/ra/chrome/ingame-observer.yaml index 06c37dead3..e751dac3f1 100644 --- a/mods/ra/chrome/ingame-observer.yaml +++ b/mods/ra/chrome/ingame-observer.yaml @@ -21,8 +21,8 @@ Container@OBSERVER_WIDGETS: Font: Bold Contrast: true MenuButton@OPTIONS_BUTTON: - MenuContainer: INGAME_OPTIONS_BG - HideIngameUI: false + MenuContainer: INGAME_MENU + HideIngameUI: true Pause: false X: 0 Y: 0 diff --git a/mods/ra/chrome/ingame-player.yaml b/mods/ra/chrome/ingame-player.yaml index fb72542e65..e75d3e083e 100644 --- a/mods/ra/chrome/ingame-player.yaml +++ b/mods/ra/chrome/ingame-player.yaml @@ -3,15 +3,6 @@ Container@PLAYER_WIDGETS: LogicKeyListener@CONTROLGROUP_KEYHANDLER: Logic: ControlGroupLogic LogicTicker@SIDEBAR_TICKER: - Button@OBJECTIVES_BUTTON: - X: 486 - Y: 0 - Width: 160 - Height: 25 - Text: Objectives (O) - Visible: false - Font: Bold - Key: o Container@SUPPORT_POWERS: Logic: SupportPowerBinLogic X: 10 @@ -106,9 +97,6 @@ Container@PLAYER_WIDGETS: ImageCollection: order-icons MenuButton@DEBUG_BUTTON: Logic: AddRaceSuffixLogic - MenuContainer: INGAME_DEBUG_BG - HideIngameUI: false - Pause: false Key: escape Shift X: 128 Width: 28 @@ -144,8 +132,6 @@ Container@PLAYER_WIDGETS: ImageName: diplomacy MenuButton@OPTIONS_BUTTON: Logic: AddRaceSuffixLogic - MenuContainer: INGAME_OPTIONS_BG - HideIngameUI: false Key: escape X: 192 Width: 28 diff --git a/mods/ra/mod.yaml b/mods/ra/mod.yaml index 9043bd1e6e..cbcbc3e30f 100644 --- a/mods/ra/mod.yaml +++ b/mods/ra/mod.yaml @@ -74,8 +74,11 @@ ChromeLayout: mods/ra/chrome/ingame-chat.yaml mods/ra/chrome/ingame-diplomacy.yaml mods/ra/chrome/ingame-fmvplayer.yaml + mods/ra/chrome/ingame-info.yaml + mods/ra/chrome/ingame-infobriefing.yaml + mods/ra/chrome/ingame-infoobjectives.yaml + mods/ra/chrome/ingame-infostats.yaml mods/ra/chrome/ingame-menu.yaml - mods/ra/chrome/ingame-objectives.yaml mods/ra/chrome/ingame-observer.yaml mods/ra/chrome/ingame-observerstats.yaml mods/ra/chrome/ingame-player.yaml @@ -169,6 +172,9 @@ Fonts: Title: Font:mods/ra/ZoodRangmah.ttf Size:48 + MediumBold: + Font:FreeSansBold.ttf + Size:18 BigBold: Font:FreeSansBold.ttf Size:24 diff --git a/mods/ra/rules/world.yaml b/mods/ra/rules/world.yaml index 4f34728d95..49cd27c7fd 100644 --- a/mods/ra/rules/world.yaml +++ b/mods/ra/rules/world.yaml @@ -174,4 +174,6 @@ World: DebugPauseState: RadarPings: StartGameNotification: + ObjectivesPanel: + PanelName: SKIRMISH_STATS diff --git a/mods/ts/chrome/ingame-player.yaml b/mods/ts/chrome/ingame-player.yaml index 79c93d15f4..3804db6a7e 100644 --- a/mods/ts/chrome/ingame-player.yaml +++ b/mods/ts/chrome/ingame-player.yaml @@ -3,7 +3,10 @@ Container@PLAYER_WIDGETS: LogicKeyListener@CONTROLGROUP_KEYHANDLER: Logic: ControlGroupLogic LogicTicker@SIDEBAR_TICKER: - Button@INGAME_DIPLOMACY_BUTTON: + MenuButton@DIPLOMACY_BUTTON: + Logic: OrderButtonsChromeLogic + MenuContainer: INGAME_DIPLOMACY_BG + HideIngameUI: False X: 162 Y: 0 Width: 160 @@ -11,7 +14,9 @@ Container@PLAYER_WIDGETS: Text: Diplomacy (P) Font: Bold Key: p - Button@INGAME_DEBUG_BUTTON: + MenuButton@DEBUG_BUTTON: + Logic: OrderButtonsChromeLogic + MenuContainer: INGAME_MENU X: 324 Y: 0 Width: 160 @@ -20,15 +25,6 @@ Container@PLAYER_WIDGETS: Visible: false Font: Bold Key: escape Shift - Button@OBJECTIVES_BUTTON: - X: 486 - Y: 0 - Width: 160 - Height: 25 - Text: Objectives (O) - Visible: false - Font: Bold - Key: o SlidingContainer@INGAME_RADAR_BIN: X: WINDOW_RIGHT-215 Y: 0 diff --git a/mods/ts/chrome/ingame.yaml b/mods/ts/chrome/ingame.yaml index bc6ed0b61f..c470852efe 100644 --- a/mods/ts/chrome/ingame.yaml +++ b/mods/ts/chrome/ingame.yaml @@ -46,7 +46,9 @@ Container@INGAME_ROOT: Y: 34 Order: Descending Container@PLAYER_ROOT: - Button@INGAME_OPTIONS_BUTTON: + MenuButton@OPTIONS_BUTTON: + Logic: OrderButtonsChromeLogic + MenuContainer: INGAME_MENU X: 0 Y: 0 Width: 160 diff --git a/mods/ts/mod.yaml b/mods/ts/mod.yaml index bd7ce9714d..0c1e5c35eb 100644 --- a/mods/ts/mod.yaml +++ b/mods/ts/mod.yaml @@ -104,7 +104,10 @@ ChromeLayout: mods/ra/chrome/ingame-diplomacy.yaml mods/ra/chrome/ingame-fmvplayer.yaml mods/ra/chrome/ingame-menu.yaml - mods/ra/chrome/ingame-objectives.yaml + mods/ra/chrome/ingame-info.yaml + mods/ra/chrome/ingame-infobriefing.yaml + mods/ra/chrome/ingame-infoobjectives.yaml + mods/ra/chrome/ingame-infostats.yaml mods/ra/chrome/ingame-observer.yaml mods/ra/chrome/ingame-observerstats.yaml mods/ts/chrome/ingame-player.yaml