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
|
@ -38,19 +38,22 @@
|
|||
#include "nat.h"
|
||||
#include "optlist.h"
|
||||
#include "prototypes.h"
|
||||
#include "unit.h"
|
||||
|
||||
struct fileinit {
|
||||
int ef_type;
|
||||
void (*postread) (int, void *);
|
||||
void (*prewrite) (int, void *, void *);
|
||||
void (*oninit)(void *);
|
||||
void (*postread)(int, void *);
|
||||
void (*prewrite)(int, void *, void *);
|
||||
int (*onresize)(int);
|
||||
};
|
||||
|
||||
static struct fileinit fileinit[] = {
|
||||
{EF_SECTOR, sct_postread, sct_prewrite},
|
||||
{EF_SHIP, shp_postread, shp_prewrite},
|
||||
{EF_PLANE, pln_postread, pln_prewrite},
|
||||
{EF_LAND, lnd_postread, lnd_prewrite},
|
||||
{EF_NUKE, nuk_postread, nuk_prewrite}
|
||||
{EF_SECTOR, NULL, sct_postread, sct_prewrite, NULL},
|
||||
{EF_SHIP, NULL, shp_postread, shp_prewrite, unit_onresize},
|
||||
{EF_PLANE, pln_oninit, pln_postread, pln_prewrite, unit_onresize},
|
||||
{EF_LAND, lnd_oninit, lnd_postread, lnd_prewrite, unit_onresize},
|
||||
{EF_NUKE, nuk_oninit, nuk_postread, nuk_prewrite, unit_onresize}
|
||||
};
|
||||
|
||||
static void ef_open_srv(void);
|
||||
|
@ -67,6 +70,7 @@ ef_init_srv(void)
|
|||
for (i = 0; i < sizeof(fileinit) / sizeof(fileinit[0]); i++) {
|
||||
empfile[fileinit[i].ef_type].postread = fileinit[i].postread;
|
||||
empfile[fileinit[i].ef_type].prewrite = fileinit[i].prewrite;
|
||||
empfile[fileinit[i].ef_type].onresize = fileinit[i].onresize;
|
||||
}
|
||||
|
||||
nsc_init();
|
||||
|
@ -74,6 +78,7 @@ ef_init_srv(void)
|
|||
if (ef_verify() < 0)
|
||||
exit(EXIT_FAILURE);
|
||||
global_init();
|
||||
unit_cargo_init();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue