discard migrating monsters when entering endgame

When the hero enters the planes branch, all the rest of the dungeon
gets discarded since it can no longer be reached.  At the time that
that takes place, throw away any migrating monsters waiting to arrive
on any of those levels.
This commit is contained in:
PatR
2022-08-05 14:36:11 -07:00
parent 393283f05c
commit dc381d0560
3 changed files with 25 additions and 0 deletions

View File

@@ -600,6 +600,7 @@ extern void mon_arrive(struct monst *, int);
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 *);

View File

@@ -1463,6 +1463,8 @@ goto_level(
/* 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))

View File

@@ -843,6 +843,28 @@ migrate_to_level(
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