[Change] Implemented pilot_copy a little better.

This commit is contained in:
Allanis 2014-05-22 18:48:36 +01:00
parent f23b51e540
commit a70a55982e

View File

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