diff --git a/src/pilot.c b/src/pilot.c index ad64f88..735f424 100644 --- a/src/pilot.c +++ b/src/pilot.c @@ -1646,6 +1646,7 @@ Pilot* pilot_createEmpty(Ship* ship, char* name, * @return Copy of src. */ Pilot* pilot_copy(Pilot* src) { + int i; Pilot* dest = malloc(sizeof(Pilot)); memcpy(dest, src, sizeof(Pilot)); if(src->name) dest->name = strdup(src->name); @@ -1654,25 +1655,32 @@ Pilot* pilot_copy(Pilot* src) { dest->solid = malloc(sizeof(Solid)); memcpy(dest->solid, src->solid, sizeof(Solid)); + /* Copy mountpoints. */ + if(src->mounted != NULL) { + dest->mounted = malloc(sizeof(int)*src->ship->nmounts); + memcpy(dest->mounted, src->mounted, sizeof(int)*src->ship->nmounts); + } + /* Copy outfits. */ - dest->outfits = malloc(sizeof(PilotOutfit)*src->noutfits); - memcpy(dest->outfits, src->outfits, - sizeof(PilotOutfit)*src->noutfits); + dest->outfits = NULL; + dest->noutfits = 0; dest->secondary = NULL; dest->ammo = NULL; dest->afterburner = NULL; + for(i = 0; i < src->noutfits; i++) + pilot_addOutfit(dest, src->outfits[i].outfit, + src->outfits[i].quantity); /* Copy commodities. */ - dest->commodities = malloc(sizeof(PilotCommodity)*src->ncommodities); - memcpy(dest->commodities, src->commodities, - sizeof(PilotCommodity)*src->ncommodities); + dest->commodities = NULL; + dest->ncommodities = 0; + for(i = 0; i < src->ncommodities; i++) + pilot_addCargo(dest, src->commodities[i].commodity, + src->commodities[i].quantity); /* Ai is not copied. */ dest->task = NULL; - /* Will set afterburner and correct stats. */ - pilot_calcStats(dest); - return dest; } @@ -1688,6 +1696,14 @@ void pilot_free(Pilot* p) { if(p->hook_type[i] != PILOT_HOOK_NONE) hook_rm(p->hook[i]); + /* Remove outfits. */ + while(p->outfits != NULL) + pilot_rmOutfit(p, p->outfits[0].outfit, p->outfits[0].quantity); + + /* Remove commodities. */ + if(p->commodities) + free(p->commodities); + free(p->name); /* Clean up data. */ @@ -1697,10 +1713,6 @@ void pilot_free(Pilot* p) { if(player == p) player = NULL; solid_free(p->solid); if(p->mounted != NULL) free(p->mounted); - if(p->outfits != NULL) - pilot_rmOutfit(p, p->outfits[0].outfit, p->outfits[0].quantity); - if(p->outfits) free(p->outfits); - if(p->commodities) free(p->commodities); if(p->escorts) free(p->escorts); free(p); }