[Change] Sanitized dealing with mission cargo somewhat.

This commit is contained in:
Allanis 2014-03-07 21:45:54 +00:00
parent 88f339845c
commit ccb2be36c1
6 changed files with 32 additions and 22 deletions

View File

@ -733,6 +733,7 @@ static int player_addCargo(lua_State* L) {
if(lua_isnumber(L, 2)) quantity = (int)lua_tonumber(L, 2); if(lua_isnumber(L, 2)) quantity = (int)lua_tonumber(L, 2);
else LLUA_INVALID_PARAMETER(); else LLUA_INVALID_PARAMETER();
/* First try to add the cargo. */
ret = pilot_addMissionCargo(player, cargo, quantity); ret = pilot_addMissionCargo(player, cargo, quantity);
mission_linkCargo(cur_mission, ret); 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); if(lua_isnumber(L, 1)) id = (unsigned int) lua_tonumber(L, 1);
else LLUA_INVALID_PARAMETER(); else LLUA_INVALID_PARAMETER();
ret = pilot_rmMissionCargo(player, id); /* First try to remove the cargo from player. */
mission_unlinkCargo(cur_mission, id); 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); lua_pushboolean(L, !ret);
return 1; return 1;

View File

@ -302,14 +302,16 @@ void mission_sysMark(void) {
} }
/* Links cargo to the mission for posterior cleanup. */ /* 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->ncargo++;
misn->cargo = realloc(misn->cargo, sizeof(unsigned int) * misn->ncargo); misn->cargo = realloc(misn->cargo, sizeof(unsigned int) * misn->ncargo);
misn->cargo[misn->ncargo-1] = cargo_id; misn->cargo[misn->ncargo-1] = cargo_id;
return 0;
} }
/* Unlink cargo from the mission, removes it from the player. */ /* 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; int i;
for(i = 0; i < misn->ncargo; 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. */ if(i >= misn->ncargo) { /* Not found. */
DEBUG("Mission '%s' attempting to unlink in existant cargo %d.", DEBUG("Mission '%s' attempting to unlink in existant cargo %d.",
misn->title, cargo_id); misn->title, cargo_id);
return; return 1;
} }
/* Shrink cargo size - No need to realloc. */ /* 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)); sizeof(unsigned int) * (misn->ncargo-i-1));
misn->ncargo--; misn->ncargo--;
player_rmMissionCargo(cargo_id);
return 0;
} }
/** /**

View File

@ -85,8 +85,8 @@ MissionData* mission_get(int id);
void mission_sysMark(void); void mission_sysMark(void);
/* Cargo stuff. */ /* Cargo stuff. */
void mission_linkCargo(Mission* misn, unsigned int cargo_id); int mission_linkCargo(Mission* misn, unsigned int cargo_id);
void mission_unlinkCargo(Mission* misn, unsigned int cargo_id); int mission_unlinkCargo(Mission* misn, unsigned int cargo_id);
/* Load/Quit. */ /* Load/Quit. */
int missions_load(void); int missions_load(void);

View File

@ -1180,6 +1180,13 @@ static void pilot_calcCargo(Pilot* pilot) {
pilot->solid->mass = pilot->ship->mass + q; /* Cargo affects weight. */ 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) { unsigned int pilot_addMissionCargo(Pilot* pilot, Commodity* cargo, int quantity) {
int q; int q;
q = quantity; q = quantity;
@ -1198,7 +1205,12 @@ unsigned int pilot_addMissionCargo(Pilot* pilot, Commodity* cargo, int quantity)
return pilot->commodities[pilot->ncommodities-1].id; 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 pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id) {
int i; int i;
@ -1213,7 +1225,7 @@ int pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id) {
/* Remove cargo. */ /* Remove cargo. */
pilot->cargo_free += pilot->commodities[i].quantity; pilot->cargo_free += pilot->commodities[i].quantity;
pilot->solid->mass -= 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)); sizeof(PilotCommodity) * (pilot->ncommodities-i-1));
pilot->ncommodities--; pilot->ncommodities--;

View File

@ -775,17 +775,6 @@ int player_cargoOwned(const char* commodityname) {
return 0; 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) * @fn void player_renderBG(void)
* *

View File

@ -55,7 +55,6 @@ void player_playSound(int sound, int once);
/* Cargo. */ /* Cargo. */
int player_outfitOwned(const char* outfitname); int player_outfitOwned(const char* outfitname);
int player_cargoOwned(const char* commodityname); int player_cargoOwned(const char* commodityname);
void player_rmMissionCargo(unsigned int cargo_id);
/* Pilot ships. */ /* Pilot ships. */
void player_ships(char** sships, glTexture** tships); void player_ships(char** sships, glTexture** tships);