From 6c849e85bb8886565bce4d882be870ca97acb858 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Mon, 9 Sep 2024 11:14:35 -0400 Subject: [PATCH] v2.5.0: fixed very rare cases of cave exit rooms failing to generate --- .../levels/rooms/standard/exit/CaveExitRoom.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/exit/CaveExitRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/exit/CaveExitRoom.java index 0601633a5..18a605d67 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/exit/CaveExitRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/exit/CaveExitRoom.java @@ -57,10 +57,24 @@ public class CaveExitRoom extends CaveRoom { super.paint(level); int exit; + int tries = 30; + boolean valid; do { exit = level.pointToCell(random(2)); - } while (level.map[exit] == Terrain.WALL || level.findMob(exit) != null); + //need extra logic here as these rooms can spawn small and cramped in very rare cases + if (tries-- > 0){ + valid = level.map[exit] != Terrain.WALL && level.findMob(exit) == null; + } else { + valid = false; + for (int i : PathFinder.NEIGHBOURS4){ + if (level.map[exit+i] != Terrain.WALL){ + valid = true; + } + } + valid = valid && level.findMob(exit) == null; + } + } while (!valid); Painter.set( level, exit, Terrain.EXIT ); for (int i : PathFinder.NEIGHBOURS8){