Cargo lists storing lists of cargo for each carrier

Persistent game state encodes "who carries what" by storing the
carrier uid in the cargo.  Cargo lists augment that: they store lists
of cargo for each carrier.  They are not persistent.

New unit_cargo_init() to compute the cargo lists from game state.
Call it in ef_init_srv() and at the end of update_main().

New unit_onresize() to resize the cargo list data structure.
Installed as units' struct empfile callback onresize to make them
resize automatically with the unit files.

New unit_carrier_change() to update cargo lists when carriers change
in game state.  Convenience wrappers pln_carrier_change(),
lnd_carrier_change() and nuk_carrier_change().  Call them from
prewrite callbacks to keep cargo lists in sync with game state.

To make that work, unused units must not point to a carrier.  Add new
pln_oninit(), lnd_oninit() and nuk_oninit() take care of newly created
units.  Change lnd_prewrite() and nuk_prewrite() to take dead land
units and nukes off their carrier.  pln_prewrite() did that already.

New unit_cargo_first(), unit_cargo_next() to traverse cargo lists.
Convenience wrappers lnd_first_on_ship(), lnd_first_on_land(),
lnd_next_on_unit(), pln_first_on_ship(), pln_first_on_land(),
pln_next_on_unit() and nuk_on_plane().  The latter is disabled for now
because it clashes with an existing function.
This commit is contained in:
Markus Armbruster 2008-09-06 18:40:58 -04:00
parent f21cb48f69
commit 64a53c90f0
11 changed files with 478 additions and 10 deletions

View file

@ -119,6 +119,7 @@ pln_prewrite(int n, void *old, void *new)
if (pp->pln_effic < PLANE_MINEFF) {
own = 0;
pp->pln_effic = 0;
pp->pln_ship = pp->pln_land = -1;
for (i = 0; NULL != (np = getnukep(i)); i++) {
if (np->nuk_own && np->nuk_plane == n) {
mpr(np->nuk_own, "%s lost!\n", prnuke(np));
@ -129,6 +130,13 @@ pln_prewrite(int n, void *old, void *new)
}
}
if (CANT_HAPPEN(pp->pln_ship >= 0 && pp->pln_land >= 0))
pp->pln_land = -1;
if (oldpp->pln_ship != pp->pln_ship)
pln_carrier_change(pp, EF_SHIP, oldpp->pln_ship, pp->pln_ship);
if (oldpp->pln_land != pp->pln_land)
pln_carrier_change(pp, EF_LAND, oldpp->pln_land, pp->pln_land);
/* We've avoided assigning to pp->pln_own, in case oldsp == sp */
if (oldpp->pln_own != own)
lost_and_found(EF_PLANE, oldpp->pln_own, own,
@ -137,6 +145,14 @@ pln_prewrite(int n, void *old, void *new)
pp->pln_own = own;
}
void
pln_oninit(void *ptr)
{
struct plnstr *pp = ptr;
pp->pln_ship = pp->pln_land = -1;
}
char *
prplane(struct plnstr *pp)
{