Make unit_give_away() immune to infinite recursion

Put the unit before recursing into its cargo.  This breaks cycles in
the "is loaded on" relations.  Such cycles exist only in a corrupt
game state.  Mildly inefficient, because callers typically put the
unit again.
This commit is contained in:
Markus Armbruster 2008-09-16 21:47:55 -04:00
parent 5820e12504
commit 6589601e56

View file

@ -301,13 +301,12 @@ unit_give_away(struct empobj *unit, natid recipient, natid giver)
unit->own = recipient; unit->own = recipient;
unit_wipe_orders(unit); unit_wipe_orders(unit);
put_empobj(unit->ef_type, unit->uid, unit);
for (type = EF_PLANE; type <= EF_NUKE; type++) { for (type = EF_PLANE; type <= EF_NUKE; type++) {
snxtitem_cargo(&ni, type, unit->ef_type, unit->uid); snxtitem_cargo(&ni, type, unit->ef_type, unit->uid);
while (nxtitem(&ni, &cargo)) { while (nxtitem(&ni, &cargo))
unit_give_away(&cargo.gen, recipient, giver); unit_give_away(&cargo.gen, recipient, giver);
put_empobj(type, cargo.gen.uid, &cargo.gen);
}
} }
} }