From 7153104e4d16400c9a78232f710648c08e99a3fa Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Tue, 11 Apr 2017 22:46:51 -0400 Subject: [PATCH] v0.6.0: implemented point connection limits for rooms --- .../src/main/java/com/watabou/utils/Rect.java | 6 ++-- .../levels/painters/RegularPainter.java | 14 ++++---- .../levels/rooms/Room.java | 32 ++++++++++++++++--- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/SPD-classes/src/main/java/com/watabou/utils/Rect.java b/SPD-classes/src/main/java/com/watabou/utils/Rect.java index edd5d2ad2..c43724dcb 100644 --- a/SPD-classes/src/main/java/com/watabou/utils/Rect.java +++ b/SPD-classes/src/main/java/com/watabou/utils/Rect.java @@ -21,7 +21,7 @@ package com.watabou.utils; -import java.util.HashSet; +import java.util.ArrayList; public class Rect { @@ -133,8 +133,8 @@ public class Rect { return shrink( 1 ); } - public HashSet getPoints() { - HashSet points = new HashSet<>(square()*2); + public ArrayList getPoints() { + ArrayList points = new ArrayList<>(square()*2); for (int i = left; i <= right; i++) for (int j = top; j <= bottom; j++) points.add(new Point(i, j)); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/painters/RegularPainter.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/painters/RegularPainter.java index 76f20cb67..97d719c22 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/painters/RegularPainter.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/painters/RegularPainter.java @@ -29,6 +29,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.StandardRoom; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap; import com.watabou.utils.PathFinder; +import com.watabou.utils.Point; import com.watabou.utils.Random; import com.watabou.utils.Rect; @@ -113,15 +114,12 @@ public class RegularPainter extends Painter { if (door == null) { Rect i = r.intersect( n ); - if (i.width() == 0) { - door = new Room.Door( - i.left, - Random.Int( i.top + 1, i.bottom ) ); - } else { - door = new Room.Door( - Random.Int( i.left + 1, i.right ), - i.top); + ArrayList doorSpots = new ArrayList<>(); + for (Point p : i.getPoints()){ + if (r.canConnect(p) && n.canConnect(p)) + doorSpots.add(p); } + door = new Room.Door(Random.element(doorSpots)); r.connected.put( n, door ); n.connected.put( r, door ); 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 1092c26ec..63a95f42e 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 @@ -190,20 +190,38 @@ public class Room extends Rect implements Graph.Node, Bundlable { //TODO make abstract public int maxConnections(int direction){ return -1; } + //only considers point-specific limits, not direction limits + public boolean canConnect(Point p){ + //point must be along exactly one edge, no corners. + return (p.x == left || p.x == right) != (p.y == top || p.y == bottom); + } + + //only considers direction limits, not point-specific limits public boolean canConnect(int direction){ return remConnections(direction) > 0; } + //considers both direction and point limits public boolean canConnect( Room r ){ Rect i = intersect( r ); + + boolean foundPoint = false; + for (Point p : i.getPoints()){ + if (canConnect(p) && r.canConnect(p)){ + foundPoint = true; + break; + } + } + if (!foundPoint) return false; + if (i.width() == 0 && i.left == left) - return canConnect(LEFT); + return canConnect(LEFT) && r.canConnect(LEFT); else if (i.height() == 0 && i.top == top) - return canConnect(TOP); + return canConnect(TOP) && r.canConnect(TOP); else if (i.width() == 0 && i.right == right) - return canConnect(RIGHT); + return canConnect(RIGHT) && r.canConnect(RIGHT); else if (i.height() == 0 && i.bottom == bottom) - return canConnect(BOTTOM); + return canConnect(BOTTOM) && r.canConnect(BOTTOM); else return false; } @@ -224,7 +242,7 @@ public class Room extends Rect implements Graph.Node, Bundlable { public boolean connect( Room room ) { if ((neigbours.contains(room) || addNeigbour(room)) - && !connected.containsKey( room ) && canConnect(room) && room.canConnect(this)) { + && !connected.containsKey( room ) && canConnect(room)) { connected.put( room, null ); room.connected.put( this, null ); return true; @@ -288,6 +306,10 @@ public class Room extends Rect implements Graph.Node, Bundlable { } public Type type = Type.EMPTY; + public Door( Point p ){ + super(p); + } + public Door( int x, int y ) { super( x, y ); }