#region Copyright & License Information /* * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) * 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. For more information, * see COPYING. */ #endregion using System.Linq; using System.Net; using OpenRA.FileFormats; using OpenRA.Widgets; namespace OpenRA.Mods.Cnc.Widgets.Logic { public class CncMenuLogic { enum MenuType { Main, Multiplayer, Settings, None } MenuType Menu = MenuType.Main; Widget rootMenu; [ObjectCreator.UseCtor] public CncMenuLogic([ObjectCreator.Param] Widget widget, [ObjectCreator.Param] World world) { world.WorldActor.Trait() .Fade(CncMenuPaletteEffect.EffectType.Desaturated); rootMenu = widget.GetWidget("MENU_BACKGROUND"); rootMenu.GetWidget("VERSION_LABEL").GetText = WidgetUtils.ActiveModVersion; // Menu buttons var mainMenu = widget.GetWidget("MAIN_MENU"); mainMenu.IsVisible = () => Menu == MenuType.Main; mainMenu.GetWidget("SOLO_BUTTON").OnClick = StartSkirmishGame; mainMenu.GetWidget("MULTIPLAYER_BUTTON").OnClick = () => Menu = MenuType.Multiplayer; mainMenu.GetWidget("MODS_BUTTON").OnClick = () => { Menu = MenuType.None; Widget.OpenWindow("MODS_PANEL", new WidgetArgs() { { "onExit", () => Menu = MenuType.Main }, { "onSwitch", RemoveShellmapUI } }); }; mainMenu.GetWidget("SETTINGS_BUTTON").OnClick = () => Menu = MenuType.Settings; mainMenu.GetWidget("QUIT_BUTTON").OnClick = Game.Exit; // Multiplayer menu var multiplayerMenu = widget.GetWidget("MULTIPLAYER_MENU"); multiplayerMenu.IsVisible = () => Menu == MenuType.Multiplayer; multiplayerMenu.GetWidget("BACK_BUTTON").OnClick = () => Menu = MenuType.Main; multiplayerMenu.GetWidget("JOIN_BUTTON").OnClick = () => { Menu = MenuType.None; Widget.OpenWindow("SERVERBROWSER_PANEL", new WidgetArgs() { { "onExit", () => Menu = MenuType.Multiplayer }, { "openLobby", () => OpenLobbyPanel(MenuType.Multiplayer, false) } }); }; multiplayerMenu.GetWidget("CREATE_BUTTON").OnClick = () => { Menu = MenuType.None; Widget.OpenWindow("CREATESERVER_PANEL", new WidgetArgs() { { "onExit", () => Menu = MenuType.Multiplayer }, { "openLobby", () => OpenLobbyPanel(MenuType.Multiplayer, false) } }); }; multiplayerMenu.GetWidget("DIRECTCONNECT_BUTTON").OnClick = () => { Menu = MenuType.None; Widget.OpenWindow("DIRECTCONNECT_PANEL", new WidgetArgs() { { "onExit", () => Menu = MenuType.Multiplayer }, { "openLobby", () => OpenLobbyPanel(MenuType.Multiplayer, false) } }); }; // Settings menu var settingsMenu = widget.GetWidget("SETTINGS_MENU"); settingsMenu.IsVisible = () => Menu == MenuType.Settings; settingsMenu.GetWidget("REPLAYS_BUTTON").OnClick = () => { Menu = MenuType.None; Widget.OpenWindow("REPLAYBROWSER_PANEL", new WidgetArgs() { { "onExit", () => Menu = MenuType.Settings }, { "onStart", RemoveShellmapUI } }); }; settingsMenu.GetWidget("MUSIC_BUTTON").OnClick = () => { Menu = MenuType.None; Widget.OpenWindow("MUSIC_PANEL", new WidgetArgs() { { "onExit", () => Menu = MenuType.Settings }, }); }; settingsMenu.GetWidget("SETTINGS_BUTTON").OnClick = () => { Menu = MenuType.None; Widget.OpenWindow("SETTINGS_PANEL", new WidgetArgs() { { "world", world }, { "onExit", () => Menu = MenuType.Settings }, }); }; settingsMenu.GetWidget("BACK_BUTTON").OnClick = () => Menu = MenuType.Main; rootMenu.GetWidget("RECBLOCK").IsVisible = () => world.FrameNumber / 25 % 2 == 0; } void RemoveShellmapUI() { rootMenu.Parent.RemoveChild(rootMenu); } void OpenLobbyPanel(MenuType menu, bool addBots) { Menu = MenuType.None; Game.OpenWindow("SERVER_LOBBY", new WidgetArgs() { { "onExit", () => { Game.Disconnect(); Menu = menu; } }, { "onStart", RemoveShellmapUI }, { "addBots", addBots } }); } void StartSkirmishGame() { var map = WidgetUtils.ChooseInitialMap(Game.Settings.Server.Map); CncConnectingLogic.Connect(IPAddress.Loopback.ToString(), Game.CreateLocalServer(map), () => OpenLobbyPanel(MenuType.Main, true), () => { Game.CloseServer(); Menu = MenuType.Main; }); } } }