[Fix] Fixed mission cargo not moving correctly when changing ships.

This commit is contained in:
Allanis 2014-03-10 19:26:37 +00:00
parent 4a4737130b
commit 652ebbb3d0
3 changed files with 47 additions and 7 deletions

View File

@ -994,7 +994,7 @@ int pilot_rmOutfit(Pilot* pilot, Outfit* outfit, int quantity) {
osec = (pilot->secondary) ? pilot->secondary->outfit->name : NULL; osec = (pilot->secondary) ? pilot->secondary->outfit->name : NULL;
/* Remove the outfit. */ /* Remove the outfit. */
memmove(pilot->outfits+i, pilot->outfits+i+1, memmove(&pilot->outfits[i], &pilot->outfits[i+1],
sizeof(PilotOutfit)*(pilot->noutfits-i-1)); sizeof(PilotOutfit)*(pilot->noutfits-i-1));
pilot->noutfits--; pilot->noutfits--;
pilot->outfits = realloc(pilot->outfits, pilot->outfits = realloc(pilot->outfits,
@ -1128,6 +1128,41 @@ int pilot_cargoFree(Pilot* p) {
return p->cargo_free; return p->cargo_free;
} }
/**
*
*/
int pilot_moveCargo(Pilot* dest, Pilot* src) {
int i;
/* Nothing to copy, success! */
if(src->ncommodities == 0)
return 0;
/* Check if it fits. */
if(pilot_cargoUsed(src) > pilot_cargoFree(dest)) {
WARN("Unable to copy cargo over from pilot '%s' to '%s'", src->name, dest->name);
return -1;
}
/* Alloate new space. */
i = dest->ncommodities;
dest->ncommodities += src->ncommodities;
dest->commodities = realloc(dest->commodities,
sizeof(PilotCommodity)*dest->ncommodities);
/* Copy over. */
memmove(&dest->commodities[i], &src->commodities[0],
sizeof(PilotCommodity) * src->ncommodities);
/* Clean src. */
src->ncommodities = 0;
if(src->commodities != NULL)
free(src->commodities);
src->commodities = NULL;
return 0;
}
/* Try to add quantity of cargo to pilot, return quantity actually added. */ /* Try to add quantity of cargo to pilot, return quantity actually added. */
int pilot_addCargo(Pilot* pilot, Commodity* cargo, int quantity) { int pilot_addCargo(Pilot* pilot, Commodity* cargo, int quantity) {
int i, q; int i, q;

View File

@ -260,6 +260,7 @@ int pilot_cargoUsed(Pilot* pilot); /* Get amount of cargo onboard. */
int pilot_cargoFree(Pilot* p); /* Cargo space. */ int pilot_cargoFree(Pilot* p); /* Cargo space. */
int pilot_addCargo(Pilot* pilot, Commodity* cargo, int quantity); int pilot_addCargo(Pilot* pilot, Commodity* cargo, int quantity);
int pilot_rmCargo(Pilot* pilot, Commodity* cargo, int quantity); int pilot_rmCargo(Pilot* pilot, Commodity* cargo, int quantity);
int pilot_moveCargo(Pilot* dest, Pilot* src);
/* Mission cargo - Not to be confused with normal cargo. */ /* Mission cargo - Not to be confused with normal cargo. */
unsigned int pilot_addMissionCargo(Pilot* pilot, Commodity* cargo, int quantity); unsigned int pilot_addMissionCargo(Pilot* pilot, Commodity* cargo, int quantity);
int pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id); int pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id);

View File

@ -462,6 +462,15 @@ static void player_newShipMake(char* name) {
gl_bindCamera(&player->solid->pos); /* Set opengl camera. */ gl_bindCamera(&player->solid->pos); /* Set opengl camera. */
/* Copy cargo over. */
if(player_nstack > 0) { /* Not during creation though. */
pilot_moveCargo(player, player_stack[player_nstack-1]);
/* Recalculate stats after cargo movement. */
pilot_calcStats(player);
pilot_calcStats(player_stack[player_nstack-1]);
}
/* Moniez!! */ /* Moniez!! */
player->credits = player_credits; player->credits = player_credits;
player_credits = 0; player_credits = 0;
@ -486,12 +495,7 @@ void player_swapShip(char* shipname) {
ship->credits = player->credits; ship->credits = player->credits;
/* Move cargo over. */ /* Move cargo over. */
for(j = 0; j < player->ncommodities; j++) { pilot_moveCargo(ship, player);
pilot_addCargo(ship, player->commodities[j].commodity,
player->commodities[j].quantity);
pilot_rmCargo(player, player->commodities[j].commodity,
player->commodities[j].quantity);
}
/* Extra pass to calculate stats. */ /* Extra pass to calculate stats. */
pilot_calcStats(ship); pilot_calcStats(ship);