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; } }
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) },
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; } }
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; } }
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; } }
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; } }
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; } }
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; } }
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; }
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; }