/* Relink all lights that are so marked. */ void relink_light_sources(boolean ghostly, struct level *lev) { char which; unsigned nid; light_source *ls; for (ls = lev->lev_lights; ls; ls = ls->next) { if (ls->flags & LSF_NEEDS_FIXUP) { if (ls->type == LS_OBJECT || ls->type == LS_MONSTER) { if (ghostly) { if (!lookup_id_mapping((long)ls->id, &nid)) impossible("relink_light_sources: no id mapping"); } else nid = (long) ls->id; if (ls->type == LS_OBJECT) { which = 'o'; ls->id = find_oid(nid); } else { which = 'm'; ls->id = find_mid(lev, nid, FM_EVERYWHERE); } if (!ls->id) impossible("relink_light_sources: cant find %c_id %d", which, nid); } else impossible("relink_light_sources: bad type (%d)", ls->type); ls->flags &= ~LSF_NEEDS_FIXUP; } } }
/* update monster IDs for region being loaded from bones; `ghostly' implied */ static void reset_region_mids(struct region *reg) { int i = 0, n = reg->n_monst; unsigned *mid_list = reg->monsters; while (i < n) if (!lookup_id_mapping(mid_list[i], &mid_list[i])) { /* shrink list to remove missing monster; order doesn't matter */ mid_list[i] = mid_list[--n]; } else { /* move on to next monster */ ++i; } reg->n_monst = n; return; }