[Change] Implemented pilot_copy a little better.
This commit is contained in:
parent
f23b51e540
commit
a70a55982e
38
src/pilot.c
38
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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user