From 7c63138e3f81dbd08f49df9830f98b6a7e3816f1 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Fri, 1 Jul 2011 01:08:18 +1200 Subject: [PATCH] Mechanism for showing mission objectives in the ingame menu. Fixes #948. --- OpenRA.Game/Traits/TraitsInterfaces.cs | 2 ++ .../Widgets/Logic/CncIngameMenuLogic.cs | 18 ++++++++++++++---- OpenRA.Mods.RA/ConquestVictoryConditions.cs | 16 +++++++++++++++- mods/cnc/chrome/ingamemenu.yaml | 2 ++ mods/cnc/rules/system.yaml | 2 ++ 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index a8a5003d57..00df96503e 100755 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -218,4 +218,6 @@ namespace OpenRA.Traits } public interface ILintPass { void Run(Action emitError); } + + public interface IObjectivesPanel { string ObjectivesPanel { get; } } } diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameMenuLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameMenuLogic.cs index fb7bac7120..dd70b2b0d9 100644 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameMenuLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameMenuLogic.cs @@ -11,13 +11,15 @@ using System; using OpenRA.Mods.RA.Activities; using OpenRA.Widgets; +using OpenRA.Traits; +using System.Linq; namespace OpenRA.Mods.Cnc.Widgets.Logic { public class CncIngameMenuLogic { - Widget menu; - + Widget menu, prompt; + [ObjectCreator.UseCtor] public CncIngameMenuLogic([ObjectCreator.Param] Widget widget, [ObjectCreator.Param] World world, @@ -28,6 +30,8 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic var mpe = world.WorldActor.Trait(); mpe.Fade(CncMenuPaletteEffect.EffectType.Desaturated); + prompt = menu.GetWidget("CONFIRM_PROMPT"); + bool hideButtons = false; menu.GetWidget("MENU_BUTTONS").IsVisible = () => !hideButtons; @@ -85,12 +89,18 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic }; menu.GetWidget("RECBLOCK").IsVisible = () => world.FrameNumber / 25 % 2 == 0; + + // Mission objectives panel + var iop = world.WorldActor.TraitsImplementing().FirstOrDefault(); + if (iop != null && iop.ObjectivesPanel != null) + { + var obj = Game.LoadWidget(world, iop.ObjectivesPanel, menu.GetWidget("OBJECTIVES_ROOT"), new WidgetArgs()); + obj.IsVisible = () => !prompt.IsVisible(); + } } public void PromptConfirmAction(string title, string text, Action onConfirm, Action onCancel) { - var prompt = menu.GetWidget("CONFIRM_PROMPT"); - prompt.GetWidget("PROMPT_TITLE").GetText = () => title; prompt.GetWidget("PROMPT_TEXT").GetText = () => text; diff --git a/OpenRA.Mods.RA/ConquestVictoryConditions.cs b/OpenRA.Mods.RA/ConquestVictoryConditions.cs index 84b5d9a6eb..be5ac6918b 100644 --- a/OpenRA.Mods.RA/ConquestVictoryConditions.cs +++ b/OpenRA.Mods.RA/ConquestVictoryConditions.cs @@ -17,7 +17,6 @@ namespace OpenRA.Mods.RA { public string WinNotification = null; public string LoseNotification = null; - public object Create(ActorInitializer init) { return new ConquestVictoryConditions(this); } } @@ -86,4 +85,19 @@ namespace OpenRA.Mods.RA public class MustBeDestroyedInfo : TraitInfo { } public class MustBeDestroyed { } + + // 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/mods/cnc/chrome/ingamemenu.yaml b/mods/cnc/chrome/ingamemenu.yaml index 041b410c2e..e05b1854c5 100644 --- a/mods/cnc/chrome/ingamemenu.yaml +++ b/mods/cnc/chrome/ingamemenu.yaml @@ -79,6 +79,8 @@ Container@INGAME_MENU: Width:140 Height:35 Text:Resume + Container@OBJECTIVES_ROOT: + Id:OBJECTIVES_ROOT Container@CONFIRM_PROMPT: Id:CONFIRM_PROMPT X:(WINDOW_RIGHT - WIDTH)/2 diff --git a/mods/cnc/rules/system.yaml b/mods/cnc/rules/system.yaml index e6a15bbd70..d9f8615106 100644 --- a/mods/cnc/rules/system.yaml +++ b/mods/cnc/rules/system.yaml @@ -152,6 +152,8 @@ World: WaterChance: 0 PathFinder: ValidateOrder: + ConquestObjectivesPanel: + ObjectivesPanel: CONQUEST_OBJECTIVES CRATE: Tooltip: