public CncIngameMenuLogic(Widget widget, World world, Action onExit, WorldRenderer worldRenderer)
		{
			var resumeDisabled = false;
			menu = widget.Get("INGAME_MENU");
			var mpe = world.WorldActor.Trait<MenuPaletteEffect>();
			mpe.Fade(MenuPaletteEffect.EffectType.Desaturated);

			menu.Get<LabelWidget>("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<ButtonWidget>("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<ButtonWidget>("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<ButtonWidget>("MUSIC_BUTTON").OnClick = () =>
			{
				hideButtons = true;
				Ui.OpenWindow("MUSIC_PANEL", new WidgetArgs()
				{
					{ "onExit", () => hideButtons = false },
				});
			};

			menu.Get<ButtonWidget>("SETTINGS_BUTTON").OnClick = () =>
			{
				hideButtons = true;
				Ui.OpenWindow("SETTINGS_PANEL", new WidgetArgs()
				{
					{ "world", world },
					{ "worldRenderer", worldRenderer },
					{ "onExit", () => hideButtons = false },
				});
			};

			var resumeButton = menu.Get<ButtonWidget>("RESUME_BUTTON");
			resumeButton.IsDisabled = () => resumeDisabled;
			resumeButton.OnClick = () =>
			{
				Ui.CloseWindow();
				Ui.Root.RemoveChild(menu);
				world.WorldActor.Trait<MenuPaletteEffect>().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<ButtonWidget>("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, "CHEATS_PANEL", panelParent, new WidgetArgs() { { "onExit", doNothing } });
				debugPanel.IsVisible = () => panelType == PanelType.Debug;
				debugButton.IsVisible = () => visibleButtons > 1;
			}

			// Mission objectives
			var iop = world.WorldActor.TraitsImplementing<IObjectivesPanel>().FirstOrDefault();
			var objectivesButton = panelParent.Get<ButtonWidget>("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;
			}
		}
Beispiel #2
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 = () =>
            {
                if (world.Type == WorldType.Regular)
                {
                    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;

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

            abortMissionButton.IsVisible = () => world.Type == WorldType.Regular;
            abortMissionButton.OnClick   = () =>
            {
                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);
            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;

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

            saveMapButton.IsVisible = () => world.Type == WorldType.Editor;
            saveMapButton.OnClick   = () =>
            {
                hideMenu = true;
                Ui.OpenWindow("SAVE_MAP_PANEL", new WidgetArgs()
                {
                    { "onExit", () => hideMenu = false },
                    { "map", world.Map },
                    { "editorActorLayer", world.WorldActor.Trait <EditorActorLayer>() }
                });
            };

            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 && world.Type != WorldType.Editor)
            {
                var gameInfoPanel = Game.LoadWidget(world, "GAME_INFO_PANEL", panelRoot, new WidgetArgs()
                {
                    { "activePanel", activePanel }
                });

                gameInfoPanel.IsVisible = () => !hideMenu;
            }
        }
Beispiel #3
0
        public IngameMenuLogic(Widget widget, World world, Action onExit, WorldRenderer worldRenderer)
        {
            var resumeDisabled = false;
            var mpe            = world.WorldActor.TraitOrDefault <MenuPaletteEffect>();

            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 onSurrender = () =>
            {
                world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor, false));
                onExit();
            };

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

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

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

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

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

            widget.Get <ButtonWidget>("SURRENDER").OnClick = () =>
            {
                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;
        }