resolve a TODO by reducing wormhole data size

This commit is contained in:
Enno Rehling 2015-12-17 13:04:51 +01:00
parent 74d8b53ba8
commit 9d1b5dccb8
1 changed files with 10 additions and 14 deletions

View File

@ -56,7 +56,6 @@ static int cmp_age(const void *v1, const void *v2)
} }
typedef struct wormhole_data { typedef struct wormhole_data {
building *entry; // TODO: remove, use attribute-owner
region *exit; region *exit;
} wormhole_data; } wormhole_data;
@ -73,13 +72,14 @@ static void wormhole_done(struct attrib *a)
static int wormhole_age(struct attrib *a, void *owner) static int wormhole_age(struct attrib *a, void *owner)
{ {
wormhole_data *data = (wormhole_data *)a->data.v; wormhole_data *data = (wormhole_data *)a->data.v;
int maxtransport = data->entry->size; building *b = (building *)owner;
region *r = data->entry->region; int maxtransport = b->size;
region *r = b->region;
unit *u = r->units; unit *u = r->units;
unused_arg(owner); unused_arg(owner);
for (; u != NULL && maxtransport != 0; u = u->next) { for (; u != NULL && maxtransport != 0; u = u->next) {
if (u->building == data->entry) { if (u->building == b) {
message *m = NULL; message *m = NULL;
if (u->number > maxtransport || has_limited_skills(u)) { if (u->number > maxtransport || has_limited_skills(u)) {
m = msg_message("wormhole_requirements", "unit region", u, u->region); m = msg_message("wormhole_requirements", "unit region", u, u->region);
@ -97,7 +97,7 @@ static int wormhole_age(struct attrib *a, void *owner)
} }
} }
remove_building(&r->buildings, data->entry); remove_building(&r->buildings, b);
ADDMSG(&r->msgs, msg_message("wormhole_dissolve", "region", r)); ADDMSG(&r->msgs, msg_message("wormhole_dissolve", "region", r));
/* age returns 0 if the attribute needs to be removed, !=0 otherwise */ /* age returns 0 if the attribute needs to be removed, !=0 otherwise */
@ -107,7 +107,6 @@ static int wormhole_age(struct attrib *a, void *owner)
static void wormhole_write(const struct attrib *a, const void *owner, struct storage *store) static void wormhole_write(const struct attrib *a, const void *owner, struct storage *store)
{ {
wormhole_data *data = (wormhole_data *)a->data.v; wormhole_data *data = (wormhole_data *)a->data.v;
write_building_reference(data->entry, store);
write_region_reference(data->exit, store); write_region_reference(data->exit, store);
} }
@ -132,12 +131,11 @@ static int wormhole_read(struct attrib *a, void *owner, struct storage *store)
read_fun reader = (global.data_version < UIDHASH_VERSION) read_fun reader = (global.data_version < UIDHASH_VERSION)
? read_building_reference : read_region_reference; ? read_building_reference : read_region_reference;
int rb = if (global.data_version < ATTRIBOWNER_VERSION) {
read_reference(&data->entry, store, read_building_reference, READ_INT(store, NULL);
resolve_building); }
int rr = read_reference(&data->exit, store, reader, resolver); if (read_reference(&data->exit, store, reader, resolver) == 0) {
if (rb == 0 && rr == 0) { if (!data->exit) {
if (!data->exit || !data->entry) {
return AT_READ_FAIL; return AT_READ_FAIL;
} }
} }
@ -163,8 +161,6 @@ make_wormhole(const building_type * bt_wormhole, region * r1, region * r2)
attrib *a2 = a_add(&b2->attribs, a_new(&at_wormhole)); attrib *a2 = a_add(&b2->attribs, a_new(&at_wormhole));
wormhole_data *d1 = (wormhole_data *)a1->data.v; wormhole_data *d1 = (wormhole_data *)a1->data.v;
wormhole_data *d2 = (wormhole_data *)a2->data.v; wormhole_data *d2 = (wormhole_data *)a2->data.v;
d1->entry = b1;
d2->entry = b2;
d1->exit = b2->region; d1->exit = b2->region;
d2->exit = b1->region; d2->exit = b1->region;
b1->size = bt_wormhole->maxsize; b1->size = bt_wormhole->maxsize;