#region Copyright & License Information /* * Copyright (c) The OpenRA Developers and Contributors * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. For more * information, see COPYING. */ #endregion using System.Linq; using OpenRA.Mods.Common.Traits; using OpenRA.Widgets; namespace OpenRA.Mods.Common.Widgets.Logic { public class MenuButtonsChromeLogic : ChromeLogic { readonly World world; readonly Widget worldRoot; readonly Widget menuRoot; bool disableSystemButtons; Widget currentWidget; [ObjectCreator.UseCtor] public MenuButtonsChromeLogic(Widget widget, World world) { this.world = world; worldRoot = Ui.Root.Get("WORLD_ROOT"); menuRoot = Ui.Root.Get("MENU_ROOT"); // System buttons var options = widget.GetOrNull("OPTIONS_BUTTON"); if (options != null) { var blinking = false; var lp = world.LocalPlayer; options.IsDisabled = () => disableSystemButtons; options.OnClick = () => { blinking = false; OpenMenuPanel(options, new WidgetArgs() { { "initialPanel", IngameInfoPanel.AutoSelect } }); }; options.IsHighlighted = () => blinking && Game.LocalTick % 50 < 25; if (lp != null) { void StartBlinking(Player player, bool inhibitAnnouncement) { if (!inhibitAnnouncement && player == world.LocalPlayer) blinking = true; } var mo = lp.PlayerActor.TraitOrDefault(); if (mo != null) mo.ObjectiveAdded += StartBlinking; } } var debug = widget.GetOrNull("DEBUG_BUTTON"); if (debug != null) { // 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[SystemActors.Player].TraitInfo().CheckboxEnabled; var enabled = world.LobbyInfo.GlobalSettings.OptionOrDefault("cheats", def); debug.IsVisible = () => enabled; debug.IsDisabled = () => disableSystemButtons; debug.OnClick = () => OpenMenuPanel(debug, new WidgetArgs() { { "initialPanel", IngameInfoPanel.Debug } }); } } void OpenMenuPanel(MenuButtonWidget button, WidgetArgs widgetArgs = null) { disableSystemButtons = true; var cachedPause = world.PredictedPaused; if (button.HideIngameUI) { // Cancel custom input modes (guard, building placement, etc) world.CancelInputMode(); worldRoot.IsVisible = () => false; } if (button.Pause && world.LobbyInfo.NonBotClients.Count() == 1) world.SetPauseState(true); var cachedDisableWorldSounds = Game.Sound.DisableWorldSounds; if (button.DisableWorldSounds) Game.Sound.DisableWorldSounds = true; widgetArgs = widgetArgs ?? new WidgetArgs(); widgetArgs.Add("onExit", () => { if (button.HideIngameUI) worldRoot.IsVisible = () => true; if (button.DisableWorldSounds) Game.Sound.DisableWorldSounds = cachedDisableWorldSounds; if (button.Pause && world.LobbyInfo.NonBotClients.Count() == 1) world.SetPauseState(cachedPause); menuRoot.RemoveChild(currentWidget); disableSystemButtons = false; }); currentWidget = Game.LoadWidget(world, button.MenuContainer, menuRoot, widgetArgs); Game.RunAfterTick(Ui.ResetTooltips); } } }