void free_region(region * r) { if (last == r) last = NULL; free(r->display); if (r->land) free_land(r->land); if (r->msgs) { free_messagelist(r->msgs->begin); free(r->msgs); r->msgs = 0; } while (r->individual_messages) { struct individual_message *msg = r->individual_messages; r->individual_messages = msg->next; if (msg->msgs) { free_messagelist(msg->msgs->begin); free(msg->msgs); } free(msg); } while (r->attribs) a_remove(&r->attribs, r->attribs); while (r->resources) { rawmaterial *res = r->resources; r->resources = res->next; free(res); } while (r->units) { unit *u = r->units; r->units = u->next; uunhash(u); free_unit(u); free(u); } while (r->buildings) { building *b = r->buildings; assert(b->region == r); r->buildings = b->next; bunhash(b); /* must be done here, because remove_building does it, and wasn't called */ free_building(b); } while (r->ships) { ship *s = r->ships; assert(s->region == r); r->ships = s->next; sunhash(s); free_ship(s); } free(r); }
void unit_setid(unit * u, int id) { unit *nu = findunit(id); if (nu == NULL) { uunhash(u); u->no = id; uhash(u); } }
int remove_unit(unit ** ulist, unit * u) { int result; assert(ufindhash(u->no)); handle_event(u->attribs, "destroy", u); result = gift_items(u, GIFT_SELF | GIFT_FRIENDS | GIFT_PEASANTS); if (result != 0) { make_zombie(u); return -1; } if (u->number) set_number(u, 0); leave(u, true); u->region = NULL; uunhash(u); if (ulist) { while (*ulist != u) { ulist = &(*ulist)->next; } assert(*ulist == u); *ulist = u->next; } u->next = deleted_units; deleted_units = u; dhash(u->no, u->faction); u_setfaction(u, NULL); u->region = NULL; return 0; }