]> granicus.if.org Git - nethack/commitdiff
Fix monsters overflowing out of rooms in special levels
authorPasi Kallinen <paxed@alt.org>
Sun, 29 Mar 2020 08:17:37 +0000 (11:17 +0300)
committerPasi Kallinen <paxed@alt.org>
Sun, 29 Mar 2020 08:17:40 +0000 (11:17 +0300)
In a special level, creating more monsters inside room contents
than was space in the room placed monsters outside the room,
possibly inside walls of rooms created afterwards.

Prevent monster creation if inside room contents and there's no
space for the monster.

src/mkroom.c
src/sp_lev.c

index 0a3319289e9e922185d6d32c9cda9ead9f11ff28..d5196ce1a5aafccf4cadbb85f01fa05dfeb6cd67 100644 (file)
@@ -652,6 +652,11 @@ inside_room(croom, x, y)
 struct mkroom *croom;
 xchar x, y;
 {
+    if (croom->irregular) {
+        int i = (int) ((croom - g.rooms) + ROOMOFFSET);
+        return (!levl[x][y].edge && (int) levl[x][y].roomno == i);
+    }
+
     return (boolean) (x >= croom->lx - 1 && x <= croom->hx + 1
                       && y >= croom->ly - 1 && y <= croom->hy + 1);
 }
index f5078c7d4a477d48ff97adbbff3e77d2de4638ee..d60c4a06288e0325ea9d9f6959c7608232dc43be 100755 (executable)
@@ -1794,6 +1794,9 @@ struct mkroom *croom;
     if (MON_AT(x, y) && enexto(&cc, x, y, pm))
         x = cc.x, y = cc.y;
 
+    if (croom && !inside_room(croom, x, y))
+        return;
+
     if (m->align != AM_SPLEV_RANDOM)
         mtmp = mk_roamer(pm, Amask2align(amask), x, y, m->peaceful);
     else if (PM_ARCHEOLOGIST <= m->id && m->id <= PM_WIZARD)