示例#1
0
文件: region.c 项目: stm2/server
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);
}
示例#2
0
文件: unit.c 项目: UweKopf/server
void unit_setid(unit * u, int id)
{
  unit *nu = findunit(id);
  if (nu == NULL) {
    uunhash(u);
    u->no = id;
    uhash(u);
  }
}
示例#3
0
文件: unit.c 项目: UweKopf/server
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;
}