From 5cbb97b279e9350584a36cc52a08be3a46891711 Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Thu, 28 Mar 2013 16:29:48 +0000
Subject: [PATCH] [Add] Mission now uses stack.

---
 src/mission.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++--
 src/mission.h |  1 +
 2 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/src/mission.c b/src/mission.c
index cfcae6f..ede6249 100644
--- a/src/mission.c
+++ b/src/mission.c
@@ -13,11 +13,16 @@
 Mission player_missions[MISSION_MAX];
 
 // Mission stack.
-//static Mission* mission_stack = NULL; // Unmuteable after creation.
-//static int mission_nstack = 0;
+static Mission* mission_stack = NULL; // Unmuteable after creation.
+static int mission_nstack = 0;
 
+// Extern.
 extern int misn_run(Mission* misn, char* func);
 
+// Static.
+static void mission_cleanup(Mission* misn);
+static void mission_free(MissionData* mission);
+
 // Create a mission.
 int mission_create(MissionData* misn) {
   int i;
@@ -39,6 +44,36 @@ int mission_create(MissionData* misn) {
   return 0;
 }
 
+// Clean up a mission.
+static void mission_cleanup(Mission* misn) {
+  misn->data = NULL;
+  if(misn->title) free(misn->title);
+  if(misn->desc)  free(misn->desc);
+  if(misn->reward) free(misn->reward);
+  lua_close(misn->L);
+}
+
+// Free a mission.
+static void mission_free(MissionData* mission) {
+  if(mission->name) {
+    free(mission->name);
+    mission->name = NULL;
+  }
+  if(mission->avail.planet) {
+    free(mission->avail.planet);
+    mission->avail.planet = NULL;
+  }
+  if(mission->avail.system) {
+    free(mission->avail.system);
+    mission->avail.system = NULL;
+  }
+  if(mission->avail.factions) {
+    free(mission->avail.factions);
+    mission->avail.factions = NULL;
+    mission->avail.nfactions = 0;
+  }
+}
+
 // Load/Free.
 int missions_load(void) {
 #if 0
@@ -63,6 +98,20 @@ int missions_load(void) {
 }
 
 void missions_free(void) {
+  int i;
 
+  // Free the mission data.
+  for(i = 0; i < mission_nstack; i++)
+    mission_free(&mission_stack[i]);
+  free(mission_stack);
+  mission_stack = NULL;
+  mission_nstack = 0;
+}
+
+void missions_cleanup(void) {
+  int i;
+
+  for(i = 0; i < MISSION_MAX; i++)
+    mission_cleanup(&player_missions[i]);
 }
 
diff --git a/src/mission.h b/src/mission.h
index 2d16d0d..c3504eb 100644
--- a/src/mission.h
+++ b/src/mission.h
@@ -48,4 +48,5 @@ extern Mission player_mission[MISSION_MAX];
 // Load/Quit.
 int missions_load(void);
 void missions_free(void);
+void missions_cleanup(void);