diff --git a/src/do.c b/src/do.c index f41e45db9..937f957ab 100644 --- a/src/do.c +++ b/src/do.c @@ -1635,7 +1635,9 @@ goto_level( /* returning from tutorial via portal */ u_on_newpos(stway->sx, stway->sy); } else { - panic("goto_level: no corresponding portal!"); + if (!iflags.debug_fuzzer) + impossible("goto_level: no corresponding portal!"); + u_on_rndspot(0); } } else { seetrap(ttrap); diff --git a/src/dog.c b/src/dog.c index 46510d395..8b97d5b86 100644 --- a/src/dog.c +++ b/src/dog.c @@ -490,6 +490,9 @@ mon_arrive(struct monst *mtmp, int when) if (t) { xlocale = t->tx, ylocale = t->ty; break; + } else if (iflags.debug_fuzzer && (stway = stairway_find_dir(TRUE)) != 0) { + /* debugfuzzer returning from knox */ + xlocale = stway->sx, ylocale = stway->sy; } else if (!(u.uevent.qexpelled && (Is_qstart(&u.uz0) || Is_qstart(&u.uz)))) { impossible("mon_arrive: no corresponding portal?"); diff --git a/src/mklev.c b/src/mklev.c index 5efa37dbb..99a9f90d0 100644 --- a/src/mklev.c +++ b/src/mklev.c @@ -1313,7 +1313,10 @@ place_branch( } if (br->type == BR_PORTAL) { - mkportal(x, y, dest->dnum, dest->dlevel); + if (u.ucamefrom.dnum || u.ucamefrom.dlevel) + mkportal(x, y, u.ucamefrom.dnum, u.ucamefrom.dlevel); + else + mkportal(x, y, dest->dnum, dest->dlevel); } else if (make_stairs) { boolean goes_up = on_level(&br->end1, &u.uz) ? br->end1_up : !br->end1_up; diff --git a/src/teleport.c b/src/teleport.c index 1eef5a146..884ee82ff 100644 --- a/src/teleport.c +++ b/src/teleport.c @@ -866,6 +866,7 @@ level_tele(void) || gd.dungeons[newlevel.dnum].flags.unconnected || !gd.dungeons[newlevel.dnum].num_dunlevs); newlevel.dlevel = 1 + rn2(dunlevs_in_dungeon(&newlevel)); + assign_level(&u.ucamefrom, &u.uz); schedule_goto(&newlevel, UTOTYPE_NONE, (char *) 0, (char *) 0); return; }