diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/entrance/CaveEntranceRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/entrance/CaveEntranceRoom.java index f99e378dd..e4786de41 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/entrance/CaveEntranceRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/entrance/CaveEntranceRoom.java @@ -56,10 +56,24 @@ public class CaveEntranceRoom extends CaveRoom { super.paint(level); int entrance; + int tries = 30; + boolean valid; do { entrance = level.pointToCell(random(2)); - } while (level.map[entrance] == Terrain.WALL || level.findMob(entrance) != null); + //need extra logic here as these rooms can spawn small and cramped in very rare cases + if (tries-- > 0){ + valid = level.map[entrance] != Terrain.WALL && level.findMob(entrance) == null; + } else { + valid = false; + for (int i : PathFinder.NEIGHBOURS4){ + if (level.map[entrance+i] != Terrain.WALL){ + valid = true; + } + } + valid = valid && level.findMob(entrance) == null; + } + } while (!valid); Painter.set( level, entrance, Terrain.ENTRANCE ); for (int i : PathFinder.NEIGHBOURS8){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/entrance/ChasmEntranceRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/entrance/ChasmEntranceRoom.java index cfd229462..8ede6c9b7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/entrance/ChasmEntranceRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/entrance/ChasmEntranceRoom.java @@ -55,10 +55,24 @@ public class ChasmEntranceRoom extends ChasmRoom { super.paint(level); int entrance; + int tries = 30; + boolean valid; do { entrance = level.pointToCell(random(2)); - } while (level.map[entrance] == Terrain.CHASM || level.findMob(entrance) != null); + //need extra logic here as these rooms can spawn small and cramped in very rare cases + if (tries-- > 0){ + valid = level.map[entrance] != Terrain.CHASM && level.findMob(entrance) == null; + } else { + valid = false; + for (int i : PathFinder.NEIGHBOURS4){ + if (level.map[entrance+i] != Terrain.CHASM){ + valid = true; + } + } + valid = valid && level.findMob(entrance) == null; + } + } while (!valid); Painter.set( level, entrance, Terrain.ENTRANCE ); for (int i : PathFinder.NEIGHBOURS8){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/exit/ChasmExitRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/exit/ChasmExitRoom.java index abb9fbd76..83f0ab86b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/exit/ChasmExitRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/exit/ChasmExitRoom.java @@ -55,10 +55,24 @@ public class ChasmExitRoom extends ChasmRoom { super.paint(level); int exit; + int tries = 30; + boolean valid; do { exit = level.pointToCell(random(2)); - } while (level.map[exit] == Terrain.CHASM || 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.CHASM && level.findMob(exit) == null; + } else { + valid = false; + for (int i : PathFinder.NEIGHBOURS4){ + if (level.map[exit+i] != Terrain.CHASM){ + valid = true; + } + } + valid = valid && level.findMob(exit) == null; + } + } while (!valid); Painter.set( level, exit, Terrain.EXIT ); for (int i : PathFinder.NEIGHBOURS8){