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:
parent
f21cb48f69
commit
64a53c90f0
11 changed files with 478 additions and 10 deletions
|
@ -120,6 +120,7 @@ lnd_prewrite(int n, void *old, void *new)
|
|||
|
||||
if (llp->lnd_own && llp->lnd_effic < LAND_MINEFF) {
|
||||
own = 0;
|
||||
llp->lnd_ship = llp->lnd_land = -1;
|
||||
|
||||
for (i = 0; NULL != (lp = getlandp(i)); i++) {
|
||||
if (lp->lnd_own && lp->lnd_land == n) {
|
||||
|
@ -149,6 +150,13 @@ lnd_prewrite(int n, void *old, void *new)
|
|||
item_prewrite(llp->lnd_item);
|
||||
}
|
||||
|
||||
if (CANT_HAPPEN(llp->lnd_ship >= 0 && llp->lnd_land >= 0))
|
||||
llp->lnd_land = -1;
|
||||
if (oldlp->lnd_ship != llp->lnd_ship)
|
||||
lnd_carrier_change(llp, EF_SHIP, oldlp->lnd_ship, llp->lnd_ship);
|
||||
if (oldlp->lnd_land != llp->lnd_land)
|
||||
lnd_carrier_change(llp, EF_LAND, oldlp->lnd_land, llp->lnd_land);
|
||||
|
||||
/* We've avoided assigning to llp->lnd_own, in case oldsp == sp */
|
||||
if (oldlp->lnd_own != own)
|
||||
lost_and_found(EF_LAND, oldlp->lnd_own, own,
|
||||
|
@ -157,6 +165,14 @@ lnd_prewrite(int n, void *old, void *new)
|
|||
llp->lnd_own = own;
|
||||
}
|
||||
|
||||
void
|
||||
lnd_oninit(void *ptr)
|
||||
{
|
||||
struct lndstr *lp = ptr;
|
||||
|
||||
lp->lnd_ship = lp->lnd_land = -1;
|
||||
}
|
||||
|
||||
char *
|
||||
prland(struct lndstr *lp)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue