From b183286fdbf9fd0d1ee0f40d5acc7166b3a2a916 Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Wed, 20 Mar 2013 22:29:07 +0000
Subject: [PATCH] [Add] Preliminary main menu.

---
 TODO           |  1 -
 src/lephisto.c | 11 +++++++----
 src/menu.c     | 53 ++++++++++++++++++++++++++++++++++++++++++++------
 src/menu.h     |  9 ++++++++-
 src/toolkit.h  |  2 +-
 5 files changed, 63 insertions(+), 13 deletions(-)

diff --git a/TODO b/TODO
index d62a658..8e47c7b 100644
--- a/TODO
+++ b/TODO
@@ -2,7 +2,6 @@ Vital:
 	-- Missions
 	-- Save
 		-- Allow multiple ships in storage.
-	-- Main Menu.
 	-- Player faction system.
 
 Major:
diff --git a/src/lephisto.c b/src/lephisto.c
index 3038d79..8c984be 100644
--- a/src/lephisto.c
+++ b/src/lephisto.c
@@ -26,6 +26,7 @@
 #include "sound.h"
 #include "spfx.h"
 #include "economy.h"
+#include "menu.h"
 #include "music.h"
 
 #define XML_START_ID    "Start"
@@ -160,8 +161,7 @@ int main(int argc, char** argv) {
   fleet_load();
   space_load();
 
-  // Create new player. TODO: Start menu.
-  player_new();
+	menu_main();
 
   gtime = SDL_GetTicks(); // Init the time.
 
@@ -193,9 +193,12 @@ int main(int argc, char** argv) {
     
     fps_control(); // Who doesn't love FPS control?
 		toolkit_update(); // Simulate key repetition.
-    if(!paused && !toolkit) update_space(); // Update the game.
 
-    render_space();
+		if(!menu_isOpen(MENU_MAIN)) {
+			if(!paused && !toolkit) update_space(); // Update the game.
+			render_space();
+		}
+
     if(toolkit) toolkit_render();
 
     SDL_GL_SwapBuffers();
diff --git a/src/menu.c b/src/menu.c
index 72b269d..e27cb56 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -10,6 +10,9 @@
 #include "player.h"
 #include "menu.h"
 
+#define MAIN_WIDTH			120
+#define MAIN_HEIGHT			250
+
 #define MENU_WIDTH  		120
 #define MENU_HEIGHT 		200
 
@@ -25,15 +28,13 @@
 #define BUTTON_WIDTH		80
 #define BUTTON_HEIGHT		30
 
-#define MENU_SMALL				(1<<0)
-#define MENU_INFO					(1<<1)
-#define MENU_DEATH				(1<<2)
-#define menu_isOpen(f)		(menu_open  & (f))
 #define menu_Open(f)			(menu_open |= (f))
 #define menu_Close(f)			(menu_open ^= (f))
 
-static int menu_open = 0;
+int menu_open = 0;
 
+static void menu_main_close(void);
+static void menu_main_new(char* str);
 static void menu_small_close(char* str);
 static void edit_options(void);
 static void exit_game(void);
@@ -42,10 +43,50 @@ static void info_outfits_menu(char* str);
 static void info_outfits_menu_close(char* str);
 static void menu_death_respawn(char* str);
 
+void menu_main(void) {
+	unsigned int bwid, wid;
+
+	// Create background image window.
+	bwid = window_create("BG", -1, -1, gl_screen.w, gl_screen.h);
+	window_addRect(bwid, 0, 0, gl_screen.w, gl_screen.h, "rctBG", &cBlack, 0);
+
+	// Create menu window.
+	wid = window_create("Main Menu", -1, -1, MAIN_WIDTH, MAIN_HEIGHT);
+	window_addButton(wid, 20, 20 + (BUTTON_HEIGHT+20)*3,
+				BUTTON_WIDTH, BUTTON_HEIGHT,
+				"btnLoad", "Load Game", NULL);
+	window_addButton(wid, 20, 20 + (BUTTON_HEIGHT+20)*2,
+				BUTTON_WIDTH, BUTTON_HEIGHT,
+				"btnNew", "New Game", menu_main_new);
+	window_addButton(wid, 20, 20 + (BUTTON_HEIGHT+20),
+				BUTTON_WIDTH, BUTTON_HEIGHT,
+				"btnOptions", "Options", (void(*)(char*)) edit_options);
+	window_addButton(wid, 20, 20, BUTTON_WIDTH, BUTTON_HEIGHT,
+				"btnExit", "Exit", (void(*)(char*)) exit_game);
+
+	menu_Open(MENU_MAIN);
+}
+
+static void menu_main_close(void) {
+	window_destroy(window_get("Main Menu"));
+	window_destroy(window_get("BG"));
+
+	menu_Close(MENU_MAIN);
+}
+
+static void menu_main_new(char* str) {
+	(void)str;
+
+	menu_main_close();
+	player_new();
+}
+
 // Ze ingame menu.
 // Small ingame menu.
 void menu_small(void) {
-  if(menu_isOpen(MENU_SMALL) || menu_isOpen(MENU_DEATH))
+  if(menu_isOpen(MENU_MAIN) ||
+			menu_isOpen(MENU_SMALL) ||
+			menu_isOpen(MENU_DEATH))
 		return; // It's already open..
 	pause();
 
diff --git a/src/menu.h b/src/menu.h
index 1231040..82c658f 100644
--- a/src/menu.h
+++ b/src/menu.h
@@ -1,7 +1,14 @@
 #pragma once
 
-void menu_small(void);
+#define MENU_MAIN				(1<<0)
+#define MENU_SMALL			(1<<1)
+#define MENU_INFO				(1<<2)
+#define MENU_DEATH			(1<<3)
+#define menu_isOpen(f)	(menu_open & (f))
+extern int menu_open;
 
+void menu_main(void);
+void menu_small(void);
 void menu_info(void);
 void menu_deah(void);
 
diff --git a/src/toolkit.h b/src/toolkit.h
index ab0cda6..1bded20 100644
--- a/src/toolkit.h
+++ b/src/toolkit.h
@@ -46,7 +46,7 @@ void window_modifyText(const unsigned int wid, char* name, char* newstring);
 void window_modifyImage(const unsigned int wid, char* name, glTexture* image);
 
 // Get!
-glTexture window_getImage(const unsigned int wid, char* name);
+glTexture* window_getImage(const unsigned int wid, char* name);
 
 // Get the window by name.
 int window_exists(const char* wdwname);