#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.Collections.Generic; using OpenRA.FileFormats; using System.Net; using OpenRA.Network; using OpenRA.Server; using OpenRA.Widgets; using System; using System.Drawing; using System.Linq; using OpenRA.GameRules; using OpenRA.Mods.RA; using OpenRA.Support; namespace OpenRA.Mods.Cnc.Widgets { public class CncMenuLogic : IWidgetDelegate { enum MenuType { Main, Multiplayer, Settings, None } MenuType Menu = MenuType.Main; [ObjectCreator.UseCtor] public CncMenuLogic([ObjectCreator.Param] Widget widget, [ObjectCreator.Param] World world) { world.WorldActor.Trait().Active = true; // Root level menu 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("REPLAYS_BUTTON").OnClick = () => { Menu = MenuType.None; Widget.OpenWindow("REPLAYBROWSER_PANEL", new WidgetArgs() { { "onExit", () => Menu = MenuType.Main }, { "onStart", 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) } }); }; multiplayerMenu.GetWidget("CREATE_BUTTON").OnClick = () => { Menu = MenuType.None; Widget.OpenWindow("CREATESERVER_PANEL", new WidgetArgs() { { "onExit", () => Menu = MenuType.Multiplayer }, { "openLobby", () => OpenLobbyPanel(MenuType.Multiplayer) } }); }; multiplayerMenu.GetWidget("DIRECTCONNECT_BUTTON").OnClick = () => { Menu = MenuType.None; Widget.OpenWindow("DIRECTCONNECT_PANEL", new WidgetArgs() { { "onExit", () => Menu = MenuType.Multiplayer }, { "openLobby", () => OpenLobbyPanel(MenuType.Multiplayer) } }); }; // Settings menu var settingsMenu = widget.GetWidget("SETTINGS_MENU"); settingsMenu.IsVisible = () => Menu == MenuType.Settings; settingsMenu.GetWidget("MODS_BUTTON").OnClick = () => { Menu = MenuType.None; Widget.OpenWindow("MODS_PANEL", new WidgetArgs() { { "onExit", () => Menu = MenuType.Settings }, { "onSwitch", RemoveShellmapUI } }); }; settingsMenu.GetWidget("MUSIC_BUTTON").OnClick = () => { Menu = MenuType.None; Widget.OpenWindow("MUSIC_PANEL", new WidgetArgs() { { "onExit", () => Menu = MenuType.Settings }, }); }; settingsMenu.GetWidget("PREFERENCES_BUTTON").OnClick = () => { Menu = MenuType.None; Widget.OpenWindow("SETTINGS_PANEL", new WidgetArgs() { { "onExit", () => Menu = MenuType.Settings }, }); }; settingsMenu.GetWidget("BACK_BUTTON").OnClick = () => Menu = MenuType.Main; } void RemoveShellmapUI() { var root = Widget.RootWidget.GetWidget("MENU_BACKGROUND"); root.Parent.RemoveChild(root); } void OpenLobbyPanel(MenuType menu) { Menu = MenuType.None; Game.OpenWindow("SERVER_LOBBY", new WidgetArgs() { { "onExit", () => { Game.DisconnectOnly(); Menu = menu; } }, { "onStart", RemoveShellmapUI } }); } void StartSkirmishGame() { var map = Game.modData.AvailableMaps.FirstOrDefault(m => m.Value.Selectable).Key; Game.CreateLocalServer(map); CncConnectingLogic.Connect(IPAddress.Loopback.ToString(), Game.Settings.Server.LoopbackPort, () => OpenLobbyPanel(MenuType.Main), () => { Game.CloseServer(); Menu = MenuType.Main; }); } } }