From ccb2be36c194c070f3bf0bcd5716bc3320747572 Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Fri, 7 Mar 2014 21:45:54 +0000
Subject: [PATCH] [Change] Sanitized dealing with mission cargo somewhat.

---
 src/misn_lua.c | 11 +++++++++--
 src/mission.c  | 11 +++++++----
 src/mission.h  |  4 ++--
 src/pilot.c    | 16 ++++++++++++++--
 src/player.c   | 11 -----------
 src/player.h   |  1 -
 6 files changed, 32 insertions(+), 22 deletions(-)

diff --git a/src/misn_lua.c b/src/misn_lua.c
index 70ef1b4..b54180e 100644
--- a/src/misn_lua.c
+++ b/src/misn_lua.c
@@ -733,6 +733,7 @@ static int player_addCargo(lua_State* L) {
   if(lua_isnumber(L, 2)) quantity = (int)lua_tonumber(L, 2);
   else LLUA_INVALID_PARAMETER();
 
+  /* First try to add the cargo. */
   ret = pilot_addMissionCargo(player, cargo, quantity);
   mission_linkCargo(cur_mission, ret);
 
@@ -749,8 +750,14 @@ static int player_rmCargo(lua_State* L) {
   if(lua_isnumber(L, 1)) id = (unsigned int) lua_tonumber(L, 1);
   else LLUA_INVALID_PARAMETER();
 
-  ret = pilot_rmMissionCargo(player, id);
-  mission_unlinkCargo(cur_mission, id);
+  /* First try to remove the cargo from player. */
+  if(pilot_rmMissionCargo(player, id) != 0) {
+    lua_pushboolean(L, 0);
+    return 1;
+  }
+
+  /* Now unlink the mission cargo if it was successful. */
+  ret = mission_unlinkCargo(cur_mission, id);
 
   lua_pushboolean(L, !ret);
   return 1;
diff --git a/src/mission.c b/src/mission.c
index 7eef19c..40e4f24 100644
--- a/src/mission.c
+++ b/src/mission.c
@@ -302,14 +302,16 @@ void mission_sysMark(void) {
 }
 
 /* Links cargo to the mission for posterior cleanup. */
-void mission_linkCargo(Mission* misn, unsigned int cargo_id) {
+int mission_linkCargo(Mission* misn, unsigned int cargo_id) {
   misn->ncargo++;
   misn->cargo = realloc(misn->cargo, sizeof(unsigned int) * misn->ncargo);
   misn->cargo[misn->ncargo-1] = cargo_id;
+  
+  return 0;
 }
 
 /* Unlink cargo from the mission, removes it from the player. */
-void mission_unlinkCargo(Mission* misn, unsigned int cargo_id) {
+int mission_unlinkCargo(Mission* misn, unsigned int cargo_id) {
   int i;
 
   for(i = 0; i < misn->ncargo; i++)
@@ -319,7 +321,7 @@ void mission_unlinkCargo(Mission* misn, unsigned int cargo_id) {
   if(i >= misn->ncargo) { /* Not found. */
     DEBUG("Mission '%s' attempting to unlink in existant cargo %d.",
         misn->title, cargo_id);
-    return;
+    return 1;
   }
 
   /* Shrink cargo size - No need to realloc. */
@@ -327,7 +329,8 @@ void mission_unlinkCargo(Mission* misn, unsigned int cargo_id) {
       sizeof(unsigned int) * (misn->ncargo-i-1));
 
   misn->ncargo--;
-  player_rmMissionCargo(cargo_id);
+
+  return 0;
 }
 
 /**
diff --git a/src/mission.h b/src/mission.h
index 132e2a6..d9e31c7 100644
--- a/src/mission.h
+++ b/src/mission.h
@@ -85,8 +85,8 @@ MissionData* mission_get(int id);
 void mission_sysMark(void);
 
 /* Cargo stuff. */
-void mission_linkCargo(Mission* misn, unsigned int cargo_id);
-void mission_unlinkCargo(Mission* misn, unsigned int cargo_id);
+int mission_linkCargo(Mission* misn, unsigned int cargo_id);
+int mission_unlinkCargo(Mission* misn, unsigned int cargo_id);
 
 /* Load/Quit. */
 int missions_load(void);
diff --git a/src/pilot.c b/src/pilot.c
index eb40ca0..2fedcbb 100644
--- a/src/pilot.c
+++ b/src/pilot.c
@@ -1180,6 +1180,13 @@ static void pilot_calcCargo(Pilot* pilot) {
   pilot->solid->mass = pilot->ship->mass + q;   /* Cargo affects weight. */
 }
 
+/**
+ * @brief Add special mission cargo, can't sell it and such.
+ *    @param pilot Pilot to add it to.
+ *    @param cargo Comodity to add.
+ *    @param quantity Quantity to add.
+ *    @return The mission cargo ID of created cargo.
+ */
 unsigned int pilot_addMissionCargo(Pilot* pilot, Commodity* cargo, int quantity) {
   int q;
   q = quantity;
@@ -1198,7 +1205,12 @@ unsigned int pilot_addMissionCargo(Pilot* pilot, Commodity* cargo, int quantity)
   return pilot->commodities[pilot->ncommodities-1].id;
 }
 
-/* Remove special misssion cargo based on id. */
+/**
+ * @brief Remove special mission cargo based on id.
+ *    @param pilot Pilot to remove cargo from.
+ *    @param cargo_id ID of the cargo to remove.
+ *    @return 0 on success (cargo removed).
+ */
 int pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id) {
   int i;
 
@@ -1213,7 +1225,7 @@ int pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id) {
   /* Remove cargo. */
   pilot->cargo_free += pilot->commodities[i].quantity;
   pilot->solid->mass -= pilot->commodities[i].quantity;
-  memmove(pilot->commodities+i, pilot->commodities+i+1,
+  memmove(&pilot->commodities[i], &pilot->commodities[i+1],
       sizeof(PilotCommodity) * (pilot->ncommodities-i-1));
 
   pilot->ncommodities--;
diff --git a/src/player.c b/src/player.c
index 84a217c..395e171 100644
--- a/src/player.c
+++ b/src/player.c
@@ -775,17 +775,6 @@ int player_cargoOwned(const char* commodityname) {
   return 0;
 }
 
-void player_rmMissionCargo(unsigned int cargo_id) {
-  int i;
-
-  /* Check if already done. */
-  if((player != NULL) && !pilot_rmMissionCargo(player, cargo_id)) return;
-
-  for(i = 0; i < player_nstack; i++)
-    if(!pilot_rmMissionCargo(player_stack[i], cargo_id))
-      return; /* Success. */
-}
-
 /**
  * @fn void player_renderBG(void)
  *
diff --git a/src/player.h b/src/player.h
index edc3e87..b291c83 100644
--- a/src/player.h
+++ b/src/player.h
@@ -55,7 +55,6 @@ void player_playSound(int sound, int once);
 /* Cargo. */
 int player_outfitOwned(const char* outfitname);
 int player_cargoOwned(const char* commodityname);
-void player_rmMissionCargo(unsigned int cargo_id);
 
 /* Pilot ships. */
 void    player_ships(char** sships, glTexture** tships);