From c3dec7af82b1ce4f259d50fc654eb17bcbd61e8e Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Sun, 24 Jun 2018 22:42:04 -0400 Subject: [PATCH] v0.7.0: fixed scroll of teleport rarely getting the player stuck --- .../items/scrolls/ScrollOfTeleportation.java | 6 +++--- .../levels/RegularLevel.java | 1 + .../shatteredpixeldungeon/levels/rooms/Room.java | 15 +++++++++++++++ .../levels/rooms/secret/SecretRunestoneRoom.java | 5 +++++ .../levels/rooms/standard/ExitRoom.java | 5 +++++ 5 files changed, 29 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfTeleportation.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfTeleportation.java index 214dcf18e..5e7c9e3e0 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfTeleportation.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/scrolls/ScrollOfTeleportation.java @@ -147,7 +147,7 @@ public class ScrollOfTeleportation extends Scroll { if (r instanceof SpecialRoom){ int terr; boolean locked = false; - for (Point p : r.getPoints()){ + for (Point p : r.charPlaceablePoints(level)){ terr = level.map[level.pointToCell(p)]; if (terr == Terrain.LOCKED_DOOR || terr == Terrain.BARRICADE){ locked = true; @@ -160,9 +160,9 @@ public class ScrollOfTeleportation extends Scroll { } int cell; - for (Point p : r.getPoints()){ + for (Point p : r.charPlaceablePoints(level)){ cell = level.pointToCell(p); - if (level.passable[cell] && !level.visited[cell] && Actor.findChar(cell) != null){ + if (level.passable[cell] && !level.visited[cell] && Actor.findChar(cell) == null){ candidates.add(cell); } } 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 9d3874833..cd679d55b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java @@ -263,6 +263,7 @@ public abstract class RegularLevel extends Level { if (!heroFOV[cell] && Actor.findChar( cell ) == null && passable[cell] + && room.canPlaceCharacter(cellToPoint(cell), this) && cell != exit) { return cell; } 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 db6e7b723..616d3c824 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 @@ -308,6 +308,21 @@ public abstract class Room extends Rect implements Graph.Node, Bundlable { return points; } + //whether or not a character (usually spawned) can be placed here + public boolean canPlaceCharacter(Point p, Level l){ + return inside(p); + } + + public final ArrayList charPlaceablePoints(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 (canPlaceCharacter(p, l)) points.add(p); + } + } + return points; + } // **** Graph.Node interface **** diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretRunestoneRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretRunestoneRoom.java index 35bdb8c10..e88033aa2 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretRunestoneRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/secret/SecretRunestoneRoom.java @@ -92,4 +92,9 @@ public class SecretRunestoneRoom extends SecretRoom { public boolean canPlaceGrass(Point p) { return false; } + + @Override + public boolean canPlaceCharacter(Point p, Level l) { + return super.canPlaceCharacter(p, l) && l.map[l.pointToCell(p)] != Terrain.EMPTY_SP; + } } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/ExitRoom.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/ExitRoom.java index e1bf89670..c38c91caa 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/ExitRoom.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/rooms/standard/ExitRoom.java @@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room; +import com.watabou.utils.Point; public class ExitRoom extends StandardRoom { @@ -51,4 +52,8 @@ public class ExitRoom extends StandardRoom { Painter.set( level, level.exit, Terrain.EXIT ); } + @Override + public boolean canPlaceCharacter(Point p, Level l) { + return super.canPlaceCharacter(p, l) && l.pointToCell(p) != l.exit; + } }