コード例 #1
0
ファイル: IngameMenuLogic.cs プロジェクト: RobotCaleb/OpenRA
        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<MenuPaletteEffect>();
            if (mpe != null)
                mpe.Fade(mpe.Info.MenuEffect);

            menu.Get<LabelWidget>("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);
                resumeDisabled = true;

                var exitDelay = 1200;
                if (mpe != null)
                {
                    Game.RunAfterDelay(exitDelay, () => mpe.Fade(MenuPaletteEffect.EffectType.Black));
                    exitDelay += 40 * mpe.Info.FadeLength;
                }
                Game.RunAfterDelay(exitDelay, () =>
                {
                    Game.Disconnect();
                    Ui.ResetAll();
                    Game.LoadShellMap();
                });
            };

            Action closeMenu = () =>
            {
                Ui.CloseWindow();
                if (mpe != null)
                    mpe.Fade(MenuPaletteEffect.EffectType.None);
                onExit();
            };

            Action showMenu = () => hideMenu = false;

            menu.Get<ButtonWidget>("ABORT_MISSION").OnClick = () =>
            {
                hideMenu = true;
                ConfirmationDialogs.PromptConfirmAction("Abort Mission", "Leave this game and return to the menu?", onQuit, showMenu);
            };

            Action onSurrender = () =>
            {
                world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor, false));
                closeMenu();
            };
            var surrenderButton = menu.Get<ButtonWidget>("SURRENDER");
            surrenderButton.IsDisabled = () => (world.LocalPlayer == null || world.LocalPlayer.WinState != WinState.Undefined);
            surrenderButton.OnClick = () =>
            {
                hideMenu = true;
                ConfirmationDialogs.PromptConfirmAction("Surrender", "Are you sure you want to surrender?", onSurrender, showMenu);
            };
            surrenderButton.IsDisabled = () => world.LocalPlayer == null || world.LocalPlayer.WinState != WinState.Undefined;

            menu.Get<ButtonWidget>("MUSIC").OnClick = () =>
            {
                hideMenu = true;
                Ui.OpenWindow("MUSIC_PANEL", new WidgetArgs()
                {
                    { "onExit", () => hideMenu = false },
                    { "world", world }
                });
            };

            var settingsButton = widget.Get<ButtonWidget>("SETTINGS");
            settingsButton.OnClick = () =>
            {
                hideMenu = true;
                Ui.OpenWindow("SETTINGS_PANEL", new WidgetArgs()
                {
                    { "world", world },
                    { "worldRenderer", worldRenderer },
                    { "onExit", () => hideMenu = false },
                });
            };

            var resumeButton = menu.Get<ButtonWidget>("RESUME");
            resumeButton.IsDisabled = () => resumeDisabled;
            resumeButton.OnClick = closeMenu;

            var panelRoot = widget.GetOrNull("PANEL_ROOT");
            if (panelRoot != null)
            {
                var gameInfoPanel = Game.LoadWidget(world, "GAME_INFO_PANEL", panelRoot, new WidgetArgs()
                {
                    { "activePanel", activePanel }
                });

                gameInfoPanel.IsVisible = () => !hideMenu;
            }
        }
コード例 #2
0
ファイル: GameInfoLogic.cs プロジェクト: ScriptBox21/OpenRA
 public GameInfoLogic(Widget widget, ModData modData, World world, IngameInfoPanel initialPanel, Action <bool> hideMenu)
 {
     var panels = new Dictionary <IngameInfoPanel, (string Panel, string Label, Action <ButtonWidget, Widget> Setup)>()
     {
         { IngameInfoPanel.Objectives, ("OBJECTIVES_PANEL", "Objectives", SetupObjectivesPanel) },
         { IngameInfoPanel.Map, ("MAP_PANEL", "Briefing", SetupMapPanel) },
コード例 #3
0
        public IngameMenuLogic(Widget widget, ModData modData, World world, Action onExit, WorldRenderer worldRenderer,
                               IngameInfoPanel initialPanel, Dictionary <string, MiniYaml> logicArgs)
        {
            this.modData       = modData;
            this.world         = world;
            this.worldRenderer = worldRenderer;
            this.onExit        = onExit;

            var buttonHandlers = new Dictionary <string, Action>
            {
                { "ABORT_MISSION", CreateAbortMissionButton },
                { "RESTART", CreateRestartButton },
                { "SURRENDER", CreateSurrenderButton },
                { "LOAD_GAME", CreateLoadGameButton },
                { "SAVE_GAME", CreateSaveGameButton },
                { "MUSIC", CreateMusicButton },
                { "SETTINGS", CreateSettingsButton },
                { "RESUME", CreateResumeButton },
                { "SAVE_MAP", CreateSaveMapButton },
                { "EXIT_EDITOR", CreateExitEditorButton }
            };

            isSinglePlayer = !world.LobbyInfo.GlobalSettings.Dedicated && world.LobbyInfo.NonBotClients.Count() == 1;

            menu = widget.Get("INGAME_MENU");
            mpe  = world.WorldActor.TraitOrDefault <MenuPaletteEffect>();
            mpe?.Fade(mpe.Info.MenuEffect);

            menu.Get <LabelWidget>("VERSION_LABEL").Text = modData.Manifest.Metadata.Version;

            buttonContainer = menu.Get("MENU_BUTTONS");
            buttonTemplate  = buttonContainer.Get <ButtonWidget>("BUTTON_TEMPLATE");
            buttonContainer.RemoveChild(buttonTemplate);
            buttonContainer.IsVisible = () => !hideMenu;

            if (logicArgs.TryGetValue("ButtonStride", out var buttonStrideNode))
            {
                buttonStride = FieldLoader.GetValue <int2>("ButtonStride", buttonStrideNode.Value);
            }

            var scriptContext = world.WorldActor.TraitOrDefault <LuaScript>();

            hasError = scriptContext != null && scriptContext.FatalErrorOccurred;

            if (logicArgs.TryGetValue("Buttons", out var buttonsNode))
            {
                var buttonIds = FieldLoader.GetValue <string[]>("Buttons", buttonsNode.Value);
                foreach (var button in buttonIds)
                {
                    if (buttonHandlers.TryGetValue(button, out var createHandler))
                    {
                        createHandler();
                    }
                }
            }

            // Recenter the button container
            if (buttons.Count > 0)
            {
                var expand = (buttons.Count - 1) * buttonStride;
                buttonContainer.Bounds.X      -= expand.X / 2;
                buttonContainer.Bounds.Y      -= expand.Y / 2;
                buttonContainer.Bounds.Width  += expand.X;
                buttonContainer.Bounds.Height += expand.Y;
            }

            var panelRoot = widget.GetOrNull("PANEL_ROOT");

            if (panelRoot != null && world.Type != WorldType.Editor)
            {
                Action <bool> requestHideMenu = h => hideMenu = h;
                var           gameInfoPanel   = Game.LoadWidget(world, "GAME_INFO_PANEL", panelRoot, new WidgetArgs()
                {
                    { "initialPanel", initialPanel },
                    { "hideMenu", requestHideMenu }
                });

                gameInfoPanel.IsVisible = () => !hideMenu;
            }
        }
コード例 #4
0
ファイル: GameInfoLogic.cs プロジェクト: huwpascoe/OpenRA
        public GameInfoLogic(Widget widget, World world, IngameInfoPanel activePanel)
        {
            var lp      = world.LocalPlayer;
            var numTabs = 0;

            widget.IsVisible = () => activePanel != IngameInfoPanel.AutoSelect;

            // Objectives/Stats tab
            var scriptContext = world.WorldActor.TraitOrDefault <LuaScript>();
            var hasError      = scriptContext != null && scriptContext.FatalErrorOccurred;
            var iop           = world.WorldActor.TraitsImplementing <IObjectivesPanel>().FirstOrDefault();
            var hasObjectives = hasError || (lp != null && iop != null && iop.PanelName != null);

            if (hasObjectives)
            {
                numTabs++;
                var objectivesTabButton = widget.Get <ButtonWidget>(string.Concat("BUTTON", numTabs.ToString()));
                objectivesTabButton.GetText       = () => "Objectives";
                objectivesTabButton.IsVisible     = () => lp != null && numTabs > 1 && !hasError;
                objectivesTabButton.OnClick       = () => activePanel = IngameInfoPanel.Objectives;
                objectivesTabButton.IsHighlighted = () => activePanel == IngameInfoPanel.Objectives;

                var panel           = hasError ? "SCRIPT_ERROR_PANEL" : iop.PanelName;
                var objectivesPanel = widget.Get <ContainerWidget>("OBJECTIVES_PANEL");
                objectivesPanel.IsVisible = () => activePanel == IngameInfoPanel.Objectives;

                Game.LoadWidget(world, panel, objectivesPanel, new WidgetArgs());

                if (activePanel == IngameInfoPanel.AutoSelect)
                {
                    activePanel = IngameInfoPanel.Objectives;
                }
            }

            // Briefing tab
            if (world.Map.CustomPreview != null)
            {
                numTabs++;
                var mapTabButton = widget.Get <ButtonWidget>(string.Concat("BUTTON", numTabs.ToString()));
                mapTabButton.Text          = "Briefing";
                mapTabButton.IsVisible     = () => numTabs > 1 && !hasError;
                mapTabButton.OnClick       = () => activePanel = IngameInfoPanel.Map;
                mapTabButton.IsHighlighted = () => activePanel == IngameInfoPanel.Map;

                var mapPanel = widget.Get <ContainerWidget>("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 <ButtonWidget>(string.Concat("BUTTON", numTabs.ToString()));
                debugTabButton.Text          = "Debug";
                debugTabButton.IsVisible     = () => lp != null && world.LobbyInfo.GlobalSettings.AllowCheats && numTabs > 1 && !hasError;
                debugTabButton.IsDisabled    = () => world.IsGameOver;
                debugTabButton.OnClick       = () => activePanel = IngameInfoPanel.Debug;
                debugTabButton.IsHighlighted = () => activePanel == IngameInfoPanel.Debug;

                var debugPanelContainer = widget.Get <ContainerWidget>("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 <LabelWidget>("TITLE");
            var titleTextNoTabs = widget.GetOrNull <LabelWidget>("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 <BackgroundWidget>("BACKGROUND");
            var bgNoTabs = widget.GetOrNull <BackgroundWidget>("BACKGROUND_NO_TABS");

            bg.IsVisible = () => numTabs > 1 || (numTabs == 1 && bgNoTabs == null);
            if (bgNoTabs != null)
            {
                bgNoTabs.IsVisible = () => numTabs == 1;
            }
        }
コード例 #5
0
ファイル: IngameMenuLogic.cs プロジェクト: huwpascoe/OpenRA
        public IngameMenuLogic(Widget widget, World world, Action onExit, WorldRenderer worldRenderer, IngameInfoPanel activePanel)
        {
            var leaving = false;

            menu = widget.Get("INGAME_MENU");
            var mpe = world.WorldActor.TraitOrDefault <MenuPaletteEffect>();

            if (mpe != null)
            {
                mpe.Fade(mpe.Info.MenuEffect);
            }

            menu.Get <LabelWidget>("VERSION_LABEL").Text = Game.ModData.Manifest.Mod.Version;

            var hideMenu = false;

            menu.Get("MENU_BUTTONS").IsVisible = () => !hideMenu;

            var scriptContext = world.WorldActor.TraitOrDefault <LuaScript>();
            var hasError      = scriptContext != null && scriptContext.FatalErrorOccurred;

            // TODO: Create a mechanism to do things like this cleaner. Also needed for scripted missions
            Action onQuit = () =>
            {
                if (world.Type == WorldType.Regular)
                {
                    Game.Sound.PlayNotification(world.Map.Rules, null, "Speech", "Leave", world.LocalPlayer == null ? null : world.LocalPlayer.Faction.InternalName);
                }

                leaving = true;

                var iop       = world.WorldActor.TraitsImplementing <IObjectivesPanel>().FirstOrDefault();
                var exitDelay = iop != null ? iop.ExitDelay : 0;
                if (mpe != null)
                {
                    Game.RunAfterDelay(exitDelay, () =>
                    {
                        if (Game.IsCurrentWorld(world))
                        {
                            mpe.Fade(MenuPaletteEffect.EffectType.Black);
                        }
                    });
                    exitDelay += 40 * mpe.Info.FadeLength;
                }

                Game.RunAfterDelay(exitDelay, () =>
                {
                    if (!Game.IsCurrentWorld(world))
                    {
                        return;
                    }

                    Game.Disconnect();
                    Ui.ResetAll();
                    Game.LoadShellMap();
                });
            };

            Action closeMenu = () =>
            {
                Ui.CloseWindow();
                if (mpe != null)
                {
                    mpe.Fade(MenuPaletteEffect.EffectType.None);
                }
                onExit();
            };

            Action showMenu = () => hideMenu = false;

            var abortMissionButton = menu.Get <ButtonWidget>("ABORT_MISSION");

            abortMissionButton.IsVisible  = () => world.Type == WorldType.Regular;
            abortMissionButton.IsDisabled = () => leaving;
            if (world.IsGameOver)
            {
                abortMissionButton.GetText = () => "Leave";
            }

            abortMissionButton.OnClick = () =>
            {
                if (world.IsGameOver)
                {
                    onQuit();
                    return;
                }

                hideMenu = true;
                ConfirmationDialogs.PromptConfirmAction("Abort Mission", "Leave this game and return to the menu?", onQuit, showMenu);
            };

            var exitEditorButton = menu.Get <ButtonWidget>("EXIT_EDITOR");

            exitEditorButton.IsVisible = () => world.Type == WorldType.Editor;
            exitEditorButton.OnClick   = () =>
            {
                hideMenu = true;
                ConfirmationDialogs.PromptConfirmAction("Exit Map Editor", "Exit and lose all unsaved changes?", onQuit, showMenu);
            };

            Action onSurrender = () =>
            {
                world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor, false));
                closeMenu();
            };
            var surrenderButton = menu.Get <ButtonWidget>("SURRENDER");

            surrenderButton.IsVisible  = () => world.Type == WorldType.Regular;
            surrenderButton.IsDisabled = () => (world.LocalPlayer == null || world.LocalPlayer.WinState != WinState.Undefined) || hasError;
            surrenderButton.OnClick    = () =>
            {
                hideMenu = true;
                ConfirmationDialogs.PromptConfirmAction("Surrender", "Are you sure you want to surrender?", onSurrender, showMenu);
            };

            var saveMapButton = menu.Get <ButtonWidget>("SAVE_MAP");

            saveMapButton.IsVisible = () => world.Type == WorldType.Editor;
            saveMapButton.OnClick   = () =>
            {
                hideMenu = true;
                var editorActorLayer = world.WorldActor.Trait <EditorActorLayer>();
                Ui.OpenWindow("SAVE_MAP_PANEL", new WidgetArgs()
                {
                    { "onSave", (Action <string>)(_ => hideMenu = false) },
                    { "onExit", () => hideMenu = false },
                    { "map", world.Map },
                    { "playerDefinitions", editorActorLayer.Players.ToMiniYaml() },
                    { "actorDefinitions", editorActorLayer.Save() }
                });
            };

            var musicButton = menu.Get <ButtonWidget>("MUSIC");

            musicButton.IsDisabled = () => leaving;
            musicButton.OnClick    = () =>
            {
                hideMenu = true;
                Ui.OpenWindow("MUSIC_PANEL", new WidgetArgs()
                {
                    { "onExit", () => hideMenu = false },
                    { "world", world }
                });
            };

            var settingsButton = widget.Get <ButtonWidget>("SETTINGS");

            settingsButton.IsDisabled = () => leaving;
            settingsButton.OnClick    = () =>
            {
                hideMenu = true;
                Ui.OpenWindow("SETTINGS_PANEL", new WidgetArgs()
                {
                    { "world", world },
                    { "worldRenderer", worldRenderer },
                    { "onExit", () => hideMenu = false },
                });
            };

            var resumeButton = menu.Get <ButtonWidget>("RESUME");

            resumeButton.IsDisabled = () => leaving;
            if (world.IsGameOver)
            {
                resumeButton.GetText = () => "Return to map";
            }

            resumeButton.OnClick = closeMenu;

            var panelRoot = widget.GetOrNull("PANEL_ROOT");

            if (panelRoot != null && world.Type != WorldType.Editor)
            {
                var gameInfoPanel = Game.LoadWidget(world, "GAME_INFO_PANEL", panelRoot, new WidgetArgs()
                {
                    { "activePanel", activePanel }
                });

                gameInfoPanel.IsVisible = () => !hideMenu;
            }
        }
コード例 #6
0
ファイル: IngameMenuLogic.cs プロジェクト: CH4Code/OpenRA
        public IngameMenuLogic(Widget widget, ModData modData, World world, Action onExit, WorldRenderer worldRenderer, IngameInfoPanel activePanel)
        {
            var leaving = false;
            menu = widget.Get("INGAME_MENU");
            var mpe = world.WorldActor.TraitOrDefault<MenuPaletteEffect>();
            if (mpe != null)
                mpe.Fade(mpe.Info.MenuEffect);

            menu.Get<LabelWidget>("VERSION_LABEL").Text = modData.Manifest.Mod.Version;

            var hideMenu = false;
            menu.Get("MENU_BUTTONS").IsVisible = () => !hideMenu;

            var scriptContext = world.WorldActor.TraitOrDefault<LuaScript>();
            var hasError = scriptContext != null && scriptContext.FatalErrorOccurred;

            // TODO: Create a mechanism to do things like this cleaner. Also needed for scripted missions
            Action onQuit = () =>
            {
                if (world.Type == WorldType.Regular)
                    Game.Sound.PlayNotification(world.Map.Rules, null, "Speech", "Leave", world.LocalPlayer == null ? null : world.LocalPlayer.Faction.InternalName);

                leaving = true;

                var iop = world.WorldActor.TraitsImplementing<IObjectivesPanel>().FirstOrDefault();
                var exitDelay = iop != null ? iop.ExitDelay : 0;
                if (mpe != null)
                {
                    Game.RunAfterDelay(exitDelay, () =>
                    {
                        if (Game.IsCurrentWorld(world))
                            mpe.Fade(MenuPaletteEffect.EffectType.Black);
                    });
                    exitDelay += 40 * mpe.Info.FadeLength;
                }

                Game.RunAfterDelay(exitDelay, () =>
                {
                    if (!Game.IsCurrentWorld(world))
                        return;

                    Game.Disconnect();
                    Ui.ResetAll();
                    Game.LoadShellMap();
                });
            };

            Action closeMenu = () =>
            {
                Ui.CloseWindow();
                if (mpe != null)
                    mpe.Fade(MenuPaletteEffect.EffectType.None);
                onExit();
            };

            Action showMenu = () => hideMenu = false;

            var abortMissionButton = menu.Get<ButtonWidget>("ABORT_MISSION");
            abortMissionButton.IsVisible = () => world.Type == WorldType.Regular;
            abortMissionButton.IsDisabled = () => leaving;
            if (world.IsGameOver)
                abortMissionButton.GetText = () => "Leave";

            abortMissionButton.OnClick = () =>
            {
                hideMenu = true;

                if (world.LocalPlayer == null || world.LocalPlayer.WinState != WinState.Won)
                {
                    Action restartAction = null;
                    var iop = world.WorldActor.TraitsImplementing<IObjectivesPanel>().FirstOrDefault();
                    var exitDelay = iop != null ? iop.ExitDelay : 0;

                    if (world.LobbyInfo.IsSinglePlayer)
                    {
                        restartAction = () =>
                        {
                            Ui.CloseWindow();
                            if (mpe != null)
                            {
                                if (Game.IsCurrentWorld(world))
                                    mpe.Fade(MenuPaletteEffect.EffectType.Black);
                                exitDelay += 40 * mpe.Info.FadeLength;
                            }

                            Game.RunAfterDelay(exitDelay, Game.RestartGame);
                        };
                    }

                    ConfirmationDialogs.PromptConfirmAction(
                        title: "Leave Mission",
                        text: "Leave this game and return to the menu?",
                        onConfirm: onQuit,
                        onCancel: showMenu,
                        confirmText: "Leave",
                        cancelText: "Stay",
                        otherText: "Restart",
                        onOther: restartAction);
                }
                else
                    onQuit();
            };

            var exitEditorButton = menu.Get<ButtonWidget>("EXIT_EDITOR");
            exitEditorButton.IsVisible = () => world.Type == WorldType.Editor;
            exitEditorButton.OnClick = () =>
            {
                hideMenu = true;
                ConfirmationDialogs.PromptConfirmAction(
                    title: "Exit Map Editor",
                    text: "Exit and lose all unsaved changes?",
                    onConfirm: onQuit,
                    onCancel: showMenu);
            };

            Action onSurrender = () =>
            {
                world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor, false));
                closeMenu();
            };
            var surrenderButton = menu.Get<ButtonWidget>("SURRENDER");
            surrenderButton.IsVisible = () => world.Type == WorldType.Regular;
            surrenderButton.IsDisabled = () =>
                world.LocalPlayer == null || world.LocalPlayer.WinState != WinState.Undefined ||
                world.Map.Visibility.HasFlag(MapVisibility.MissionSelector) || hasError;
            surrenderButton.OnClick = () =>
            {
                hideMenu = true;
                ConfirmationDialogs.PromptConfirmAction(
                    title: "Surrender",
                    text: "Are you sure you want to surrender?",
                    onConfirm: onSurrender,
                    onCancel: showMenu,
                    confirmText: "Surrender",
                    cancelText: "Stay");
            };

            var saveMapButton = menu.Get<ButtonWidget>("SAVE_MAP");
            saveMapButton.IsVisible = () => world.Type == WorldType.Editor;
            saveMapButton.OnClick = () =>
            {
                hideMenu = true;
                var editorActorLayer = world.WorldActor.Trait<EditorActorLayer>();
                Ui.OpenWindow("SAVE_MAP_PANEL", new WidgetArgs()
                {
                    { "onSave", (Action<string>)(_ => hideMenu = false) },
                    { "onExit", () => hideMenu = false },
                    { "map", world.Map },
                    { "playerDefinitions", editorActorLayer.Players.ToMiniYaml() },
                    { "actorDefinitions", editorActorLayer.Save() }
                });
            };

            var musicButton = menu.Get<ButtonWidget>("MUSIC");
            musicButton.IsDisabled = () => leaving;
            musicButton.OnClick = () =>
            {
                hideMenu = true;
                Ui.OpenWindow("MUSIC_PANEL", new WidgetArgs()
                {
                    { "onExit", () => hideMenu = false },
                    { "world", world }
                });
            };

            var settingsButton = widget.Get<ButtonWidget>("SETTINGS");
            settingsButton.IsDisabled = () => leaving;
            settingsButton.OnClick = () =>
            {
                hideMenu = true;
                Ui.OpenWindow("SETTINGS_PANEL", new WidgetArgs()
                {
                    { "world", world },
                    { "worldRenderer", worldRenderer },
                    { "onExit", () => hideMenu = false },
                });
            };

            var resumeButton = menu.Get<ButtonWidget>("RESUME");
            resumeButton.IsDisabled = () => leaving;
            if (world.IsGameOver)
                resumeButton.GetText = () => "Return to map";

            resumeButton.OnClick = closeMenu;

            var panelRoot = widget.GetOrNull("PANEL_ROOT");
            if (panelRoot != null && world.Type != WorldType.Editor)
            {
                var gameInfoPanel = Game.LoadWidget(world, "GAME_INFO_PANEL", panelRoot, new WidgetArgs()
                {
                    { "activePanel", activePanel }
                });

                gameInfoPanel.IsVisible = () => !hideMenu;
            }
        }
コード例 #7
0
ファイル: GameInfoLogic.cs プロジェクト: anvilvapre/OpenRA-1
        public GameInfoLogic(Widget widget, World world, IngameInfoPanel activePanel)
        {
            var lp      = world.LocalPlayer;
            var numTabs = 0;

            widget.IsVisible = () => activePanel != IngameInfoPanel.AutoSelect;

            // Objectives/Stats tab
            var scriptContext      = world.WorldActor.TraitOrDefault <LuaScript>();
            var hasError           = scriptContext != null && scriptContext.FatalErrorOccurred;
            var iop                = world.WorldActor.TraitsImplementing <IObjectivesPanel>().FirstOrDefault();
            var hasObjectivesPanel = hasError || (iop != null && iop.PanelName != null);

            if (hasObjectivesPanel)
            {
                numTabs++;
                var objectivesTabButton = widget.Get <ButtonWidget>(string.Concat("BUTTON", numTabs.ToString()));
                objectivesTabButton.GetText       = () => "Objectives";
                objectivesTabButton.IsVisible     = () => numTabs > 1 && !hasError;
                objectivesTabButton.OnClick       = () => activePanel = IngameInfoPanel.Objectives;
                objectivesTabButton.IsHighlighted = () => activePanel == IngameInfoPanel.Objectives;

                var panel           = hasError ? "SCRIPT_ERROR_PANEL" : iop.PanelName;
                var objectivesPanel = widget.Get <ContainerWidget>("OBJECTIVES_PANEL");
                objectivesPanel.IsVisible = () => activePanel == IngameInfoPanel.Objectives;

                Game.LoadWidget(world, panel, objectivesPanel, new WidgetArgs());

                if (activePanel == IngameInfoPanel.AutoSelect)
                {
                    activePanel = IngameInfoPanel.Objectives;
                }
            }

            // Briefing tab
            var missionData = world.WorldActor.Info.TraitInfoOrDefault <MissionDataInfo>();

            if (missionData != null && !string.IsNullOrEmpty(missionData.Briefing))
            {
                numTabs++;
                var mapTabButton = widget.Get <ButtonWidget>(string.Concat("BUTTON", numTabs.ToString()));
                mapTabButton.Text          = "Briefing";
                mapTabButton.IsVisible     = () => numTabs > 1 && !hasError;
                mapTabButton.OnClick       = () => activePanel = IngameInfoPanel.Map;
                mapTabButton.IsHighlighted = () => activePanel == IngameInfoPanel.Map;

                var mapPanel = widget.Get <ContainerWidget>("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
            // Can't use DeveloperMode.Enabled because there is a hardcoded hack to *always*
            // enable developer mode for singleplayer games, but we only want to show the button
            // if it has been explicitly enabled
            var def = world.Map.Rules.Actors["player"].TraitInfo <DeveloperModeInfo>().Enabled;
            var developerEnabled = world.LobbyInfo.GlobalSettings.OptionOrDefault("cheats", def);

            if (lp != null && developerEnabled)
            {
                numTabs++;
                var debugTabButton = widget.Get <ButtonWidget>(string.Concat("BUTTON", numTabs.ToString()));
                debugTabButton.Text          = "Debug";
                debugTabButton.IsVisible     = () => lp != null && numTabs > 1 && !hasError;
                debugTabButton.IsDisabled    = () => world.IsGameOver;
                debugTabButton.OnClick       = () => activePanel = IngameInfoPanel.Debug;
                debugTabButton.IsHighlighted = () => activePanel == IngameInfoPanel.Debug;

                var debugPanelContainer = widget.Get <ContainerWidget>("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 <LabelWidget>("TITLE");
            var titleTextNoTabs = widget.GetOrNull <LabelWidget>("TITLE_NO_TABS");

            var mapTitle      = world.Map.Title;
            var firstCategory = world.Map.Categories.FirstOrDefault();

            if (firstCategory != null)
            {
                mapTitle = firstCategory + ": " + mapTitle;
            }

            titleText.IsVisible = () => numTabs > 1 || (numTabs == 1 && titleTextNoTabs == null);
            titleText.GetText   = () => mapTitle;
            if (titleTextNoTabs != null)
            {
                titleTextNoTabs.IsVisible = () => numTabs == 1;
                titleTextNoTabs.GetText   = () => mapTitle;
            }

            var bg       = widget.Get <BackgroundWidget>("BACKGROUND");
            var bgNoTabs = widget.GetOrNull <BackgroundWidget>("BACKGROUND_NO_TABS");

            bg.IsVisible = () => numTabs > 1 || (numTabs == 1 && bgNoTabs == null);
            if (bgNoTabs != null)
            {
                bgNoTabs.IsVisible = () => numTabs == 1;
            }
        }
コード例 #8
0
        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 <MenuPaletteEffect>();

            if (mpe != null)
            {
                mpe.Fade(mpe.Info.MenuEffect);
            }

            menu.Get <LabelWidget>("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);
                resumeDisabled = true;

                var exitDelay = 1200;
                if (mpe != null)
                {
                    Game.RunAfterDelay(exitDelay, () => mpe.Fade(MenuPaletteEffect.EffectType.Black));
                    exitDelay += 40 * mpe.Info.FadeLength;
                }
                Game.RunAfterDelay(exitDelay, () =>
                {
                    Game.Disconnect();
                    Ui.ResetAll();
                    Game.LoadShellMap();
                });
            };

            Action closeMenu = () =>
            {
                Ui.CloseWindow();
                if (mpe != null)
                {
                    mpe.Fade(MenuPaletteEffect.EffectType.None);
                }
                onExit();
            };

            Action showMenu = () => hideMenu = false;

            menu.Get <ButtonWidget>("ABORT_MISSION").OnClick = () =>
            {
                hideMenu = true;
                ConfirmationDialogs.PromptConfirmAction("Abort Mission", "Leave this game and return to the menu?", onQuit, showMenu);
            };

            Action onSurrender = () =>
            {
                world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor, false));
                closeMenu();
            };
            var surrenderButton = menu.Get <ButtonWidget>("SURRENDER");

            surrenderButton.IsDisabled = () => (world.LocalPlayer == null || world.LocalPlayer.WinState != WinState.Undefined);
            surrenderButton.OnClick    = () =>
            {
                hideMenu = true;
                ConfirmationDialogs.PromptConfirmAction("Surrender", "Are you sure you want to surrender?", onSurrender, showMenu);
            };
            surrenderButton.IsDisabled = () => world.LocalPlayer == null || world.LocalPlayer.WinState != WinState.Undefined;

            menu.Get <ButtonWidget>("MUSIC").OnClick = () =>
            {
                hideMenu = true;
                Ui.OpenWindow("MUSIC_PANEL", new WidgetArgs()
                {
                    { "onExit", () => hideMenu = false },
                    { "world", world }
                });
            };

            var settingsButton = widget.Get <ButtonWidget>("SETTINGS");

            settingsButton.OnClick = () =>
            {
                hideMenu = true;
                Ui.OpenWindow("SETTINGS_PANEL", new WidgetArgs()
                {
                    { "world", world },
                    { "worldRenderer", worldRenderer },
                    { "onExit", () => hideMenu = false },
                });
            };

            var resumeButton = menu.Get <ButtonWidget>("RESUME");

            resumeButton.IsDisabled = () => resumeDisabled;
            resumeButton.OnClick    = closeMenu;

            var panelRoot = widget.GetOrNull("PANEL_ROOT");

            if (panelRoot != null)
            {
                var gameInfoPanel = Game.LoadWidget(world, "GAME_INFO_PANEL", panelRoot, new WidgetArgs()
                {
                    { "activePanel", activePanel }
                });

                gameInfoPanel.IsVisible = () => !hideMenu;
            }
        }
コード例 #9
0
ファイル: GameInfoLogic.cs プロジェクト: CH4Code/OpenRA
        public GameInfoLogic(Widget widget, World world, IngameInfoPanel activePanel)
        {
            var lp = world.LocalPlayer;
            var numTabs = 0;

            widget.IsVisible = () => activePanel != IngameInfoPanel.AutoSelect;

            // Objectives/Stats tab
            var scriptContext = world.WorldActor.TraitOrDefault<LuaScript>();
            var hasError = scriptContext != null && scriptContext.FatalErrorOccurred;
            var iop = world.WorldActor.TraitsImplementing<IObjectivesPanel>().FirstOrDefault();
            var hasObjectivesPanel = hasError || (iop != null && iop.PanelName != null);

            if (hasObjectivesPanel)
            {
                numTabs++;
                var objectivesTabButton = widget.Get<ButtonWidget>(string.Concat("BUTTON", numTabs.ToString()));
                objectivesTabButton.GetText = () => "Objectives";
                objectivesTabButton.IsVisible = () => numTabs > 1 && !hasError;
                objectivesTabButton.OnClick = () => activePanel = IngameInfoPanel.Objectives;
                objectivesTabButton.IsHighlighted = () => activePanel == IngameInfoPanel.Objectives;

                var panel = hasError ? "SCRIPT_ERROR_PANEL" : iop.PanelName;
                var objectivesPanel = widget.Get<ContainerWidget>("OBJECTIVES_PANEL");
                objectivesPanel.IsVisible = () => activePanel == IngameInfoPanel.Objectives;

                Game.LoadWidget(world, panel, objectivesPanel, new WidgetArgs());

                if (activePanel == IngameInfoPanel.AutoSelect)
                    activePanel = IngameInfoPanel.Objectives;
            }

            // Briefing tab
            var missionData = world.WorldActor.Info.TraitInfoOrDefault<MissionDataInfo>();
            if (missionData != null && !string.IsNullOrEmpty(missionData.Briefing))
            {
                numTabs++;
                var mapTabButton = widget.Get<ButtonWidget>(string.Concat("BUTTON", numTabs.ToString()));
                mapTabButton.Text = "Briefing";
                mapTabButton.IsVisible = () => numTabs > 1 && !hasError;
                mapTabButton.OnClick = () => activePanel = IngameInfoPanel.Map;
                mapTabButton.IsHighlighted = () => activePanel == IngameInfoPanel.Map;

                var mapPanel = widget.Get<ContainerWidget>("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<ButtonWidget>(string.Concat("BUTTON", numTabs.ToString()));
                debugTabButton.Text = "Debug";
                debugTabButton.IsVisible = () => lp != null && world.LobbyInfo.GlobalSettings.AllowCheats && numTabs > 1 && !hasError;
                debugTabButton.IsDisabled = () => world.IsGameOver;
                debugTabButton.OnClick = () => activePanel = IngameInfoPanel.Debug;
                debugTabButton.IsHighlighted = () => activePanel == IngameInfoPanel.Debug;

                var debugPanelContainer = widget.Get<ContainerWidget>("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<LabelWidget>("TITLE");
            var titleTextNoTabs = widget.GetOrNull<LabelWidget>("TITLE_NO_TABS");

            var mapTitle = world.Map.Title;
            var firstCategory = world.Map.Categories.FirstOrDefault();
            if (firstCategory != null)
                mapTitle = firstCategory + ": " + mapTitle;

            titleText.IsVisible = () => numTabs > 1 || (numTabs == 1 && titleTextNoTabs == null);
            titleText.GetText = () => mapTitle;
            if (titleTextNoTabs != null)
            {
                titleTextNoTabs.IsVisible = () => numTabs == 1;
                titleTextNoTabs.GetText = () => mapTitle;
            }

            var bg = widget.Get<BackgroundWidget>("BACKGROUND");
            var bgNoTabs = widget.GetOrNull<BackgroundWidget>("BACKGROUND_NO_TABS");

            bg.IsVisible = () => numTabs > 1 || (numTabs == 1 && bgNoTabs == null);
            if (bgNoTabs != null)
                bgNoTabs.IsVisible = () => numTabs == 1;
        }
コード例 #10
0
ファイル: GameInfoLogic.cs プロジェクト: ushardul/OpenRA
        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<IObjectivesPanel>().FirstOrDefault();
            if (lp != null && iop != null && iop.PanelName != null)
            {
                numTabs++;
                var objectivesTabButton = widget.Get<ButtonWidget>(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<ContainerWidget>("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<ButtonWidget>(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<ContainerWidget>("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<ButtonWidget>(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<ContainerWidget>("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<LabelWidget>("TITLE");
            var titleTextNoTabs = widget.GetOrNull<LabelWidget>("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<BackgroundWidget>("BACKGROUND");
            var bgNoTabs = widget.GetOrNull<BackgroundWidget>("BACKGROUND_NO_TABS");

            bg.IsVisible = () => numTabs > 1 || (numTabs == 1 && bgNoTabs == null);
            if (bgNoTabs != null)
                bgNoTabs.IsVisible = () => numTabs == 1;
        }