[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. * @return Copy of src.
*/ */
Pilot* pilot_copy(Pilot* src) { Pilot* pilot_copy(Pilot* src) {
int i;
Pilot* dest = malloc(sizeof(Pilot)); Pilot* dest = malloc(sizeof(Pilot));
memcpy(dest, src, sizeof(Pilot)); memcpy(dest, src, sizeof(Pilot));
if(src->name) dest->name = strdup(src->name); if(src->name) dest->name = strdup(src->name);
@ -1654,25 +1655,32 @@ Pilot* pilot_copy(Pilot* src) {
dest->solid = malloc(sizeof(Solid)); dest->solid = malloc(sizeof(Solid));
memcpy(dest->solid, src->solid, 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. */ /* Copy outfits. */
dest->outfits = malloc(sizeof(PilotOutfit)*src->noutfits); dest->outfits = NULL;
memcpy(dest->outfits, src->outfits, dest->noutfits = 0;
sizeof(PilotOutfit)*src->noutfits);
dest->secondary = NULL; dest->secondary = NULL;
dest->ammo = NULL; dest->ammo = NULL;
dest->afterburner = NULL; dest->afterburner = NULL;
for(i = 0; i < src->noutfits; i++)
pilot_addOutfit(dest, src->outfits[i].outfit,
src->outfits[i].quantity);
/* Copy commodities. */ /* Copy commodities. */
dest->commodities = malloc(sizeof(PilotCommodity)*src->ncommodities); dest->commodities = NULL;
memcpy(dest->commodities, src->commodities, dest->ncommodities = 0;
sizeof(PilotCommodity)*src->ncommodities); for(i = 0; i < src->ncommodities; i++)
pilot_addCargo(dest, src->commodities[i].commodity,
src->commodities[i].quantity);
/* Ai is not copied. */ /* Ai is not copied. */
dest->task = NULL; dest->task = NULL;
/* Will set afterburner and correct stats. */
pilot_calcStats(dest);
return dest; return dest;
} }
@ -1688,6 +1696,14 @@ void pilot_free(Pilot* p) {
if(p->hook_type[i] != PILOT_HOOK_NONE) if(p->hook_type[i] != PILOT_HOOK_NONE)
hook_rm(p->hook[i]); 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); free(p->name);
/* Clean up data. */ /* Clean up data. */
@ -1697,10 +1713,6 @@ void pilot_free(Pilot* p) {
if(player == p) player = NULL; if(player == p) player = NULL;
solid_free(p->solid); solid_free(p->solid);
if(p->mounted != NULL) free(p->mounted); 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); if(p->escorts) free(p->escorts);
free(p); free(p);
} }