From e536ab4da3d45060700458a4116a1dc74ce699ea Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Sun, 13 Apr 2014 23:26:07 +0100
Subject: [PATCH] [Fix] Too many missions without any "active missions".

---
 src/menu.c     |  1 +
 src/misn_lua.c |  1 +
 src/mission.c  | 42 +++++++++++++++++-------------------------
 3 files changed, 19 insertions(+), 25 deletions(-)

diff --git a/src/menu.c b/src/menu.c
index 935b8f4..cdac85c 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -628,6 +628,7 @@ static void mission_menu_abort(unsigned int wid, char* str) {
       mission_cleanup(misn);
       memmove(misn, &player_missions[pos+1],
           sizeof(Mission) * (MISSION_MAX-pos-1));
+      memset(&player_missions[MISSION_MAX-1], 0, sizeof(Mission));
     }
     
     /* Regenerate list. */
diff --git a/src/misn_lua.c b/src/misn_lua.c
index 44707d2..470cbaf 100644
--- a/src/misn_lua.c
+++ b/src/misn_lua.c
@@ -297,6 +297,7 @@ static int misn_runTopStack(Mission* misn, char* func) {
       if(cur_mission == &player_missions[i]) {
         memmove(&player_missions[i], &player_missions[i+1],
             sizeof(Mission) * (MISSION_MAX-i-1));
+        memset(&player_missions[MISSION_MAX-1], 0, sizeof(Mission));
         break;
       }
   }
diff --git a/src/mission.c b/src/mission.c
index 1b146a0..46ff0c0 100644
--- a/src/mission.c
+++ b/src/mission.c
@@ -296,7 +296,8 @@ void mission_sysMark(void) {
   space_clearMarkers();
 
   for(i = 0; i < MISSION_MAX; i++) {
-    if(player_missions[i].sys_marker != NULL) {
+    if((player_missions[i].id != 0) &&
+        (player_missions[i].sys_marker != NULL)) {
       sys = system_get(player_missions[i].sys_marker);
       sys_setFlag(sys, SYSTEM_MARKED);
     }
@@ -384,26 +385,21 @@ void missions_update(const double dt) {
 /* Clean up a mission. */
 void mission_cleanup(Mission* misn) {
   int i;
-  if(misn->id != 0) {
+  if(misn->id != 0)
     hook_rmParent(misn->id); /* Remove existing hooks. */
-    misn->id = 0;
-  }
-  if(misn->title != NULL) {
+  
+  if(misn->title != NULL)
     free(misn->title);
-    misn->title = NULL;
-  }
-  if(misn->desc != NULL) {
+  
+  if(misn->desc != NULL)
     free(misn->desc);
-    misn->desc = NULL;
-  }
-  if(misn->reward != NULL) {
+  
+  if(misn->reward != NULL)
     free(misn->reward);
-    misn->reward = NULL;
-  }
-  if(misn->sys_marker != NULL) {
+  
+  if(misn->sys_marker != NULL)
     free(misn->sys_marker);
-    misn->sys_marker = NULL;
-  }
+  
   if(misn->cargo != NULL) {
     for(i = 0; i < misn->ncargo; i++) { /* Must unlink all the cargo. */
       if(player != NULL) /* Only remove if player exists. */
@@ -411,20 +407,16 @@ void mission_cleanup(Mission* misn) {
       mission_unlinkCargo(misn, misn->cargo[i]);
     }
     free(misn->cargo);
-    misn->cargo = NULL;
-    misn->ncargo = 0;
   }
   for(i = 0; i < MISSION_TIMER_MAX; i++) {
-    misn->timer[i] = 0.;
-    if(misn->tfunc[i] != NULL) {
+    if(misn->tfunc[i] != NULL)
       free(misn->tfunc[i]);
-      misn->tfunc[i] = NULL;
-    }
   }
-  if(misn->L) {
+  if(misn->L)
     lua_close(misn->L);
-    misn->L = NULL;
-  }
+
+  /* Clear the memory. */
+  memset(misn, 0, sizeof(Mission));
 }
 
 /* Free a mission. */