static int createunit_read(trigger * t, gamedata *data) { createunit_data *td = (createunit_data *)t->data.v; variant var; int result = AT_READ_OK; var = read_faction_reference(data); if (var.i > 0) { td->f = findfaction(var.i); if (!td->f) { ur_add(var, &td->f, resolve_faction); } } else { result = AT_READ_FAIL; } // read_reference(&td->f, store, read_faction_reference, resolve_faction); read_reference(&td->r, data, read_region_reference, RESOLVE_REGION(data->version)); td->race = (const struct race *)read_race_reference(data->store).v; if (!td->race) { result = AT_READ_FAIL; } READ_INT(data->store, &td->number); return result; }
void read_groups(struct storage *store, faction * f) { for (;;) { ally **pa; group *g; int gid; char buf[1024]; READ_INT(store, &gid); if (gid == 0) break; READ_STR(store, buf, sizeof(buf)); g = new_group(f, buf, gid); pa = &g->allies; for (;;) { ally *a; variant fid; READ_INT(store, &fid.i); if (fid.i <= 0) break; a = ally_add(pa, findfaction(fid.i)); READ_INT(store, &a->status); if (!a->faction) ur_add(fid, &a->faction, resolve_faction); } a_read(store, &g->attribs, g); } }
void read_groups(struct storage *store, faction * f) { for (;;) { ally **pa; group *g; int gid; char buf[1024]; READ_INT(store, &gid); if (gid == 0) break; READ_STR(store, buf, sizeof(buf)); g = new_group(f, buf, gid); pa = &g->allies; for (;;) { ally *a; variant fid; READ_INT(store, &fid.i); if (fid.i <= 0) break; if (global.data_version < STORAGE_VERSION && fid.i == 0) break; a = malloc(sizeof(ally)); *pa = a; pa = &a->next; READ_INT(store, &a->status); a->faction = findfaction(fid.i); if (!a->faction) ur_add(fid, &a->faction, resolve_faction); } *pa = 0; a_read(store, &g->attribs, g); } }
static int cw_read(attrib * a, void *target, storage * store) { bresolve *br = calloc(sizeof(bresolve), 1); curse *c = (curse *) a->data.v; wallcurse *wc = (wallcurse *) c->data.v; variant var; curse_read(a, store, target); br->self = c; READ_INT(store, &br->id); var.i = br->id; ur_add(var, &wc->wall, resolve_borderid); var.v = br; ur_add(var, &wc->buddy, resolve_buddy); return AT_READ_OK; }
int read_reference(void *address, storage * store, read_fun reader, resolve_fun resolver) { variant var = reader(store); int result = resolver(var, address); if (result != 0) { ur_add(var, address, resolver); } return result; }
static void wall_read(connection * b, storage * store) { static wall_data dummy; wall_data *fd = b->data.v ? (wall_data *) b->data.v : &dummy; variant mno; if (global.data_version < STORAGE_VERSION) { READ_INT(store, &mno.i); fd->mage = findunit(mno.i); if (!fd->mage && b->data.v) { ur_add(mno, &fd->mage, resolve_unit); } } else { read_reference(&fd->mage, store, read_unit_reference, resolve_unit); } READ_INT(store, &fd->force); if (global.data_version >= NOBORDERATTRIBS_VERSION) { READ_INT(store, &fd->countdown); } fd->active = true; }