extern void mon_catchup_elapsed_time(struct monst *, long);
extern void keepdogs(boolean);
extern void migrate_to_level(struct monst *, coordxy, coordxy, coord *);
+extern void discard_migrating_mons(void);
extern int dogfood(struct monst *, struct obj *);
extern boolean tamedog(struct monst *, struct obj *);
extern void abuse_dog(struct monst *);
/* mark #overview data for all dungeon branches as uninteresting */
for (l_idx = 0; l_idx < g.n_dgns; ++l_idx)
remdun_mapseen(l_idx);
+ /* get rid of monsters scheduled to migrate to discarded levels */
+ discard_migrating_mons();
}
if (Is_rogue_level(newlevel) || Is_rogue_level(&u.uz))
vision_recalc(0);
}
+/* when entering the endgame, levels from the dungeon and its branches are
+ discarded because they can't be reached again; do the same for monsters
+ scheduled to migrate to those levels */
+void
+discard_migrating_mons(void)
+{
+ struct monst *mtmp, **mprev;
+ d_level mdest;
+
+ for (mprev = &g.migrating_mons; (mtmp = *mprev) != 0; ) {
+ mdest.dnum = mtmp->mux;
+ mdest.dlevel = mtmp->muy;
+ /* the Wizard is kept regardless of location so that he is
+ ready to be brought back; nothing should be scheduled to
+ migrate to the endgame but if we find such, we'll keep it */
+ if (!mtmp->iswiz && !In_endgame(&mdest))
+ *mprev = mtmp->nmon; /* remove mtmp from migrating_mons */
+ else
+ mprev = &mtmp->nmon; /* keep mtmp on migrating_mons */
+ }
+}
+
/* return quality of food; the lower the better */
/* fungi will eat even tainted food */
int