buglist - full level triggers impossible() from migrating mons
<email deleted> wrote: > If more monsters fall through a trap door than can fit on the > level below, when you go down the stairs, you get the following > message: > "Program in disorder - perhaps you'd better #quit. > rloc(): couldn't relocate monster" > This message seems to appear once for every monster-too-many that > fell through the hole. I originally found this while > intentionally completely filling a level with black puddings > (there was a trap door I didn't know about). I also confirmed it > in a wiz-mode test using gremlins and water. [confirmed: moveloop -> deferred_goto -> goto_level -> losedogs -> mon_arrive -> rloc -> impossible] This patch: - causes rloc() to return TRUE if successful, or FALSE if it wasn't. - adds code to mon_arrive() in dog.c to deal with the failed rloc() - allows the x,y parameters to mkcorpstat() to be 0,0 in order to trigger random placement of the corpse on the level - if you define DEBUG_MIGRATING_MONS when you build cmd.c then you'll have a debug-mode command #migratemons to store the number of random monsters that you specify on the migrating monsters chain.
This commit is contained in:
@@ -839,7 +839,7 @@ mdamagem(magr, mdef, mattk)
|
||||
we'll get "it" in the suddenly disappears message */
|
||||
if (vis) Strcpy(mdef_Monnam, Monnam(mdef));
|
||||
mdef->mstrategy &= ~STRAT_WAITFORU;
|
||||
rloc(mdef);
|
||||
(void) rloc(mdef, FALSE);
|
||||
if (vis && !canspotmon(mdef)
|
||||
#ifdef STEED
|
||||
&& mdef != u.usteed
|
||||
@@ -967,7 +967,7 @@ mdamagem(magr, mdef, mattk)
|
||||
pline("%s steals some gold from %s.", buf, mon_nam(mdef));
|
||||
}
|
||||
if (!tele_restrict(magr)) {
|
||||
rloc(magr);
|
||||
(void) rloc(magr, FALSE);
|
||||
if (vis && !canspotmon(magr))
|
||||
pline("%s suddenly disappears!", buf);
|
||||
}
|
||||
@@ -1034,7 +1034,7 @@ mdamagem(magr, mdef, mattk)
|
||||
0 : MM_AGR_DIED));
|
||||
if (magr->data->mlet == S_NYMPH &&
|
||||
!tele_restrict(magr)) {
|
||||
rloc(magr);
|
||||
(void) rloc(magr, FALSE);
|
||||
if (vis && !canspotmon(magr))
|
||||
pline("%s suddenly disappears!", buf);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user