From c3ab4f60fca480c046a7db9b191b9398e63acd38 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Thu, 15 Sep 2022 17:09:24 -0400 Subject: [PATCH] v1.4.0: improved logic for limiting char and item spawn placement --- .../levels/RegularLevel.java | 7 ++++++- .../shatteredpixeldungeon/levels/rooms/Room.java | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java index bdaa5b2af..f465ae3d0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java @@ -231,7 +231,11 @@ public abstract class RegularLevel extends Level { do { mob.pos = pointToCell(roomToSpawn.random()); tries--; - } while (tries >= 0 && (findMob(mob.pos) != null || !passable[mob.pos] || solid[mob.pos] || mob.pos == exit() + } while (tries >= 0 && (findMob(mob.pos) != null + || !passable[mob.pos] + || solid[mob.pos] + || !roomToSpawn.canPlaceCharacter(cellToPoint(mob.pos), this) + || mob.pos == exit() || (!openSpace[mob.pos] && mob.properties().contains(Char.Property.LARGE)))); if (tries >= 0) { @@ -598,6 +602,7 @@ public abstract class RegularLevel extends Level { if (passable[pos] && !solid[pos] && pos != exit() && heaps.get(pos) == null + && room.canPlaceItem(cellToPoint(pos), this) && findMob(pos) == null) { Trap t = traps.get(pos); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/Room.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/Room.java index 79be28ae3..dcdb3c8c5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/Room.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/Room.java @@ -334,6 +334,22 @@ public abstract class Room extends Rect implements Graph.Node, Bundlable { } return points; } + + //whether or not an item can be placed here (usually via randomDropCell) + public boolean canPlaceItem(Point p, Level l){ + return inside(p); + } + + public final ArrayList itemPlaceablePoints(Level l){ + ArrayList points = new ArrayList<>(); + for (int i = left; i <= right; i++) { + for (int j = top; j <= bottom; j++) { + Point p = new Point(i, j); + if (canPlaceItem(p, l)) points.add(p); + } + } + return points; + } //whether or not a character can be placed here (usually via spawn, tele, or wander) public boolean canPlaceCharacter(Point p, Level l){