[Fix] Fixed mission cargo not moving correctly when changing ships.
This commit is contained in:
parent
4a4737130b
commit
652ebbb3d0
37
src/pilot.c
37
src/pilot.c
@ -994,7 +994,7 @@ int pilot_rmOutfit(Pilot* pilot, Outfit* outfit, int quantity) {
|
||||
osec = (pilot->secondary) ? pilot->secondary->outfit->name : NULL;
|
||||
|
||||
/* 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));
|
||||
pilot->noutfits--;
|
||||
pilot->outfits = realloc(pilot->outfits,
|
||||
@ -1128,6 +1128,41 @@ int pilot_cargoFree(Pilot* p) {
|
||||
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. */
|
||||
int pilot_addCargo(Pilot* pilot, Commodity* cargo, int quantity) {
|
||||
int i, q;
|
||||
|
@ -260,6 +260,7 @@ int pilot_cargoUsed(Pilot* pilot); /* Get amount of cargo onboard. */
|
||||
int pilot_cargoFree(Pilot* p); /* Cargo space. */
|
||||
int pilot_addCargo(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. */
|
||||
unsigned int pilot_addMissionCargo(Pilot* pilot, Commodity* cargo, int quantity);
|
||||
int pilot_rmMissionCargo(Pilot* pilot, unsigned int cargo_id);
|
||||
|
16
src/player.c
16
src/player.c
@ -462,6 +462,15 @@ static void player_newShipMake(char* name) {
|
||||
|
||||
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!! */
|
||||
player->credits = player_credits;
|
||||
player_credits = 0;
|
||||
@ -486,12 +495,7 @@ void player_swapShip(char* shipname) {
|
||||
ship->credits = player->credits;
|
||||
|
||||
/* Move cargo over. */
|
||||
for(j = 0; j < player->ncommodities; j++) {
|
||||
pilot_addCargo(ship, player->commodities[j].commodity,
|
||||
player->commodities[j].quantity);
|
||||
pilot_rmCargo(player, player->commodities[j].commodity,
|
||||
player->commodities[j].quantity);
|
||||
}
|
||||
pilot_moveCargo(ship, player);
|
||||
|
||||
/* Extra pass to calculate stats. */
|
||||
pilot_calcStats(ship);
|
||||
|
Loading…
Reference in New Issue
Block a user