using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Subsurface.Networking; using System.IO; namespace Subsurface { class MainMenuScreen : Screen { enum Tabs { Main = 0, NewGame = 1, LoadGame = 2, JoinServer = 3 } private GUIFrame[] menuTabs; private GUIListBox mapList; private GUIListBox saveList; private GUITextBox seedBox; private GUITextBox nameBox, ipBox; private Game1 game; int selectedTab; public MainMenuScreen(Game1 game) { menuTabs = new GUIFrame[Enum.GetValues(typeof(Tabs)).Length]; Rectangle panelRect = new Rectangle( Game1.GraphicsWidth / 2 - 250, Game1.GraphicsHeight/ 2 - 250, 500, 500); menuTabs[(int)Tabs.Main] = new GUIFrame(panelRect, GUI.style); //menuTabs[(int)Tabs.Main].Padding = GUI.style.smallPadding; GUIButton button = new GUIButton(new Rectangle(0, 0, 0, 30), "New Game", Alignment.CenterX, GUI.style, menuTabs[(int)Tabs.Main]); button.UserData = (int)Tabs.NewGame; button.OnClicked = SelectTab; //button.Enabled = false; button = new GUIButton(new Rectangle(0, 60, 0, 30), "Load Game", Alignment.CenterX, GUI.style, menuTabs[(int)Tabs.Main]); button.UserData = (int)Tabs.LoadGame; button.OnClicked = SelectTab; //button.Enabled = false; button = new GUIButton(new Rectangle(0, 120, 0, 30), "Join Server", Alignment.CenterX, GUI.style, menuTabs[(int)Tabs.Main]); button.UserData = (int)Tabs.JoinServer; button.OnClicked = SelectTab; button = new GUIButton(new Rectangle(0, 180, 0, 30), "Host Server", Alignment.CenterX, GUI.style, menuTabs[(int)Tabs.Main]); button.OnClicked = HostServerClicked; //button.Enabled = false; button = new GUIButton(new Rectangle(0, 240, 0, 30), "Quit", Alignment.CenterX, GUI.style, menuTabs[(int)Tabs.Main]); button.OnClicked = QuitClicked; //---------------------------------------------------------------------- menuTabs[(int)Tabs.NewGame] = new GUIFrame(panelRect, GUI.style); //menuTabs[(int)Tabs.NewGame].Padding = GUI.style.smallPadding; new GUITextBlock(new Rectangle(0, -20, 0, 30), "New Game", null, null, Alignment.CenterX, GUI.style, menuTabs[(int)Tabs.NewGame]); new GUITextBlock(new Rectangle(0, 30, 0, 30), "Selected submarine:", null, null, Alignment.Left, GUI.style, menuTabs[(int)Tabs.NewGame]); mapList = new GUIListBox(new Rectangle(0, 60, 200, 360), GUI.style, menuTabs[(int)Tabs.NewGame]); foreach (Submarine sub in Submarine.SavedSubmarines) { GUITextBlock textBlock = new GUITextBlock( new Rectangle(0, 0, 0, 25), sub.Name, GUI.style, Alignment.Left, Alignment.Left, mapList); textBlock.Padding = new Vector4(10.0f, 0.0f, 0.0f, 0.0f); textBlock.UserData = sub; } if (Submarine.SavedSubmarines.Count > 0) mapList.Select(Submarine.SavedSubmarines[0]); new GUITextBlock(new Rectangle((int)(mapList.Rect.Width + 20), 30, 100, 20), "Map Seed: ", GUI.style, Alignment.Left, Alignment.TopLeft, menuTabs[(int)Tabs.NewGame]); seedBox = new GUITextBox(new Rectangle((int)(mapList.Rect.Width + 20), 60, 180, 20), Alignment.TopLeft, GUI.style, menuTabs[(int)Tabs.NewGame]); seedBox.Text = ToolBox.RandomSeed(8); button = new GUIButton(new Rectangle(0, 0, 100, 30), "Start",Alignment.BottomRight, GUI.style, menuTabs[(int)Tabs.NewGame]); button.OnClicked = StartGame; //---------------------------------------------------------------------- menuTabs[(int)Tabs.LoadGame] = new GUIFrame(panelRect, GUI.style); //menuTabs[(int)Tabs.LoadGame].Padding = GUI.style.smallPadding; new GUITextBlock(new Rectangle(0, 0, 0, 30), "Load Game", Color.Transparent, Color.Black, Alignment.CenterX, null, menuTabs[(int)Tabs.LoadGame]); if (!Directory.Exists(SaveUtil.SaveFolder)) { DebugConsole.ThrowError("Save folder ''"+SaveUtil.SaveFolder+" not found! Attempting to create a new folder"); try { Directory.CreateDirectory(SaveUtil.SaveFolder); } catch (Exception e) { DebugConsole.ThrowError("Failed to create the folder ''"+SaveUtil.SaveFolder+"''!", e); } } string[] saveFiles = Directory.GetFiles(SaveUtil.SaveFolder, "*.save"); //new GUITextBlock(new Rectangle(0, 30, 0, 30), "Selected map:", Color.Transparent, Color.Black, Alignment.Left, menuTabs[(int)Tabs.NewGame]); saveList = new GUIListBox(new Rectangle(0, 60, 200, 360), Color.White, GUI.style, menuTabs[(int)Tabs.LoadGame]); foreach (string saveFile in saveFiles) { GUITextBlock textBlock = new GUITextBlock( new Rectangle(0, 0, 0, 25), saveFile, GUI.style, Alignment.Left, Alignment.Left, saveList); textBlock.Padding = new Vector4(10.0f, 0.0f, 0.0f, 0.0f); textBlock.UserData = saveFile; } button = new GUIButton(new Rectangle(0, 0, 100, 30), "Start",Alignment.Right | Alignment.Bottom, GUI.style, menuTabs[(int)Tabs.LoadGame]); button.OnClicked = LoadGame; //---------------------------------------------------------------------- menuTabs[(int)Tabs.JoinServer] = new GUIFrame(panelRect, GUI.style); //menuTabs[(int)Tabs.JoinServer].Padding = GUI.style.smallPadding; new GUITextBlock(new Rectangle(0, 0, 0, 30), "Join Server", GUI.style, Alignment.CenterX, Alignment.CenterX, menuTabs[(int)Tabs.JoinServer]); new GUITextBlock(new Rectangle(0, 30, 0, 30), "Name:", GUI.style, Alignment.CenterX, Alignment.CenterX, menuTabs[(int)Tabs.JoinServer]); nameBox = new GUITextBox(new Rectangle(0, 60, 200, 30), Color.White, Color.Black, Alignment.CenterX, Alignment.CenterX, null, menuTabs[(int)Tabs.JoinServer]); new GUITextBlock(new Rectangle(0, 100, 0, 30), "Server IP:", GUI.style, Alignment.CenterX, Alignment.CenterX, menuTabs[(int)Tabs.JoinServer]); ipBox = new GUITextBox(new Rectangle(0, 130, 200, 30), Color.White, Color.Black, Alignment.CenterX, Alignment.CenterX, null, menuTabs[(int)Tabs.JoinServer]); GUIButton joinButton = new GUIButton(new Rectangle(0, 0, 200, 30), "Join", Alignment.BottomCenter, GUI.style, menuTabs[(int)Tabs.JoinServer]); joinButton.OnClicked = JoinServer; //---------------------------------------------------------------------- for (int i = 1; i < 4; i++ ) { button = new GUIButton(new Rectangle(-20, -20, 100, 30), "Back", Alignment.TopLeft, GUI.style, menuTabs[i]); button.OnClicked = PreviousTab; } this.game = game; } private bool SelectTab(GUIButton button, object obj) { selectedTab = (int)obj; return true; } private bool HostServerClicked(GUIButton button, object obj) { Game1.NetLobbyScreen.IsServer = true; Game1.NetLobbyScreen.Select(); return true; } private bool QuitClicked(GUIButton button, object obj) { game.Exit(); return true; } public override void Update(double deltaTime) { menuTabs[selectedTab].Update((float)deltaTime); Game1.TitleScreen.Position.Y = MathHelper.Lerp(Game1.TitleScreen.Position.Y, -870.0f, 0.1f); } public override void Draw(double deltaTime, GraphicsDevice graphics, SpriteBatch spriteBatch) { graphics.Clear(Color.CornflowerBlue); Game1.TitleScreen.Draw(spriteBatch, graphics, -1.0f, (float)deltaTime); //Game1.GameScreen.DrawMap(graphics, spriteBatch); spriteBatch.Begin(); menuTabs[selectedTab].Draw(spriteBatch); GUI.Draw((float)deltaTime, spriteBatch, null); spriteBatch.End(); } private bool StartGame(GUIButton button, object obj) { Submarine selectedMap = mapList.SelectedData as Submarine; if (selectedMap == null) return false; Game1.GameSession = new GameSession(selectedMap, GameModePreset.list.Find(gm => gm.Name == "Single Player")); (Game1.GameSession.gameMode as SinglePlayerMode).GenerateMap(seedBox.Text); Game1.LobbyScreen.Select(); return true; } private bool PreviousTab(GUIButton button, object obj) { selectedTab = (int)Tabs.Main; return true; } private bool LoadGame(GUIButton button, object obj) { string saveFile = saveList.SelectedData as string; if (string.IsNullOrWhiteSpace(saveFile)) return false; try { SaveUtil.LoadGame(saveFile); } catch (Exception e) { DebugConsole.ThrowError("Loading map ''"+saveFile+"'' failed", e); return false; } Game1.LobbyScreen.Select(); return true; } private bool JoinServer(GUIButton button, object obj) { if (string.IsNullOrEmpty(nameBox.Text)) return false; if (string.IsNullOrEmpty(ipBox.Text)) return false; Game1.NetworkMember = new GameClient(nameBox.Text); Game1.Client.ConnectToServer(ipBox.Text); return true; //{ // Game1.NetLobbyScreen.Select(); // return true; //} //else //{ // Game1.NetworkMember = null; // return false; //} } } }