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);