From e37428d5cd3e7474b3ba1ec76d541a322f3a179c Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 18 Mar 2023 08:51:33 +0200 Subject: [PATCH] Fix fuzzer teleporting out of Fort Ludios --- src/do.c | 4 +++- src/dog.c | 3 +++ src/mklev.c | 5 ++++- src/teleport.c | 1 + 4 files changed, 11 insertions(+), 2 deletions(-) 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; }