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 69d221272..fa9d22641 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/RegularLevel.java @@ -37,6 +37,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.journal.GuidePage; import com.shatteredpixel.shatteredpixeldungeon.items.keys.GoldenKey; import com.shatteredpixel.shatteredpixeldungeon.journal.Document; import com.shatteredpixel.shatteredpixeldungeon.levels.builders.Builder; +import com.shatteredpixel.shatteredpixeldungeon.levels.builders.FigureEightBuilder; import com.shatteredpixel.shatteredpixeldungeon.levels.builders.LoopBuilder; import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room; @@ -144,10 +145,18 @@ public abstract class RegularLevel extends Level { } protected Builder builder(){ - return new LoopBuilder() - .setLoopShape( 2 , - Random.Float(0.4f, 0.7f), - Random.Float(0f, 0.5f)); + if (Random.Int(2) == 0){ + return new LoopBuilder() + .setLoopShape( 2 , + Random.Float(0f, 0.65f), + Random.Float(0f, 0.50f)); + } else { + return new FigureEightBuilder() + .setLoopShape( 2 , + Random.Float(0.3f, 0.8f), + 0f); + } + } protected abstract Painter painter(); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SewerBossLevel.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SewerBossLevel.java index 3b1b39123..17f290247 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SewerBossLevel.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/SewerBossLevel.java @@ -83,7 +83,7 @@ public class SewerBossLevel extends SewerLevel { protected Builder builder(){ return new FigureEightBuilder() - .setLoopShape( 2 , Random.Float(0.4f, 0.7f), Random.Float(0f, 0.5f)) + .setLoopShape( 2 , Random.Float(0.3f, 0.8f), 0f) .setPathLength(1f, new float[]{1}) .setTunnelLength(new float[]{1, 2}, new float[]{1}); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/FigureEightBuilder.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/FigureEightBuilder.java index eec2c088f..2ca4721b1 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/FigureEightBuilder.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/FigureEightBuilder.java @@ -80,71 +80,73 @@ public class FigureEightBuilder extends RegularBuilder { public ArrayList build(ArrayList rooms) { setupRooms(rooms); - //TODO might want to make this able to work without an exit. Probably a random room would be landmark and the landmark room would become exit if (landmarkRoom == null){ //prefer large and giant standard rooms over others - for (Room r : multiConnections){ + for (Room r : mainPathRooms){ if ( r.maxConnections(Room.ALL) >= 4 && (landmarkRoom == null || landmarkRoom.minWidth()*landmarkRoom.minHeight() < r.minWidth()*r.minHeight())){ landmarkRoom = r; } } + //add another room to the path to compensate + if (!multiConnections.isEmpty()){ + mainPathRooms.add(multiConnections.remove(0)); + } } - - if (multiConnections.contains(landmarkRoom)){ - multiConnections.remove(landmarkRoom); - } + mainPathRooms.remove(landmarkRoom); + multiConnections.remove(landmarkRoom); float startAngle = Random.Float(0, 180); - - int roomsOnLoop = (int)(multiConnections.size()*pathLength) + Random.chances(pathLenJitterChances); - roomsOnLoop = Math.min(roomsOnLoop, multiConnections.size()); - - int roomsOnFirstLoop = roomsOnLoop/2; - if (roomsOnLoop % 2 == 1) roomsOnFirstLoop += Random.Int(2); - - firstLoop = new ArrayList<>(); + + int roomsOnFirstLoop = mainPathRooms.size()/2; + if (mainPathRooms.size() % 2 == 1) roomsOnFirstLoop += Random.Int(2); + + ArrayList roomsToLoop = (ArrayList) mainPathRooms.clone(); + + ArrayList firstLoopTemp = new ArrayList<>(); + firstLoopTemp.add(landmarkRoom); + for (int i = 0; i < roomsOnFirstLoop; i++){ + firstLoopTemp.add(roomsToLoop.remove(0)); + } + firstLoopTemp.add((firstLoopTemp.size()+1)/2, entrance); + float[] pathTunnels = pathTunnelChances.clone(); - for (int i = 0; i <= roomsOnFirstLoop; i++){ - if (i == 0) - firstLoop.add(landmarkRoom); - else - firstLoop.add(multiConnections.remove(0)); - + + firstLoop = new ArrayList<>(); + for (Room r : firstLoopTemp){ + firstLoop.add(r); + int tunnels = Random.chances(pathTunnels); if (tunnels == -1){ pathTunnels = pathTunnelChances.clone(); tunnels = Random.chances(pathTunnels); } pathTunnels[tunnels]--; - + for (int j = 0; j < tunnels; j++){ firstLoop.add(ConnectionRoom.createRoom()); } } - if (entrance != null) firstLoop.add((firstLoop.size()+1)/2, entrance); - - int roomsOnSecondLoop = roomsOnLoop - roomsOnFirstLoop; - + ArrayList secondLoopTemp = new ArrayList<>(); + secondLoopTemp.add(landmarkRoom); + secondLoopTemp.addAll(roomsToLoop); + secondLoopTemp.add((secondLoopTemp.size()+1)/2, exit); + secondLoop = new ArrayList<>(); - for (int i = 0; i <= roomsOnSecondLoop; i++){ - if (i == 0) - secondLoop.add(landmarkRoom); - else - secondLoop.add(multiConnections.remove(0)); - + for (Room r : secondLoopTemp){ + secondLoop.add(r); + int tunnels = Random.chances(pathTunnels); if (tunnels == -1){ pathTunnels = pathTunnelChances.clone(); tunnels = Random.chances(pathTunnels); } pathTunnels[tunnels]--; - + for (int j = 0; j < tunnels; j++){ secondLoop.add(ConnectionRoom.createRoom()); } } - if (exit != null) secondLoop.add((secondLoop.size()+1)/2, exit); landmarkRoom.setSize(); landmarkRoom.setPos(0, 0); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/LoopBuilder.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/LoopBuilder.java index 30564d545..11ba56859 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/LoopBuilder.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/LoopBuilder.java @@ -82,17 +82,14 @@ public class LoopBuilder extends RegularBuilder { entrance.setPos(0, 0); float startAngle = Random.Float(0, 360); - + + mainPathRooms.add(0, entrance); + mainPathRooms.add((mainPathRooms.size()+1)/2, exit); + ArrayList loop = new ArrayList<>(); - int roomsOnLoop = (int)(multiConnections.size()*pathLength) + Random.chances(pathLenJitterChances); - roomsOnLoop = Math.min(roomsOnLoop, multiConnections.size()); - float[] pathTunnels = pathTunnelChances.clone(); - for (int i = 0; i <= roomsOnLoop; i++){ - if (i == 0) - loop.add(entrance); - else - loop.add(multiConnections.remove(0)); + for (Room r : mainPathRooms){ + loop.add(r); int tunnels = Random.chances(pathTunnels); if (tunnels == -1){ @@ -106,8 +103,6 @@ public class LoopBuilder extends RegularBuilder { } } - if (exit != null) loop.add((loop.size()+1)/2, exit); - Room prev = entrance; float targetAngle; for (int i = 1; i < loop.size(); i++){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/RegularBuilder.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/RegularBuilder.java index 3e25d1c44..148e855c5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/RegularBuilder.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/RegularBuilder.java @@ -82,7 +82,9 @@ public abstract class RegularBuilder extends Builder { protected Room entrance = null; protected Room exit = null; protected Room shop = null; - + + protected ArrayList mainPathRooms = new ArrayList<>(); + protected ArrayList multiConnections = new ArrayList<>(); protected ArrayList singleConnections = new ArrayList<>(); @@ -92,6 +94,7 @@ public abstract class RegularBuilder extends Builder { } entrance = exit = shop = null; + mainPathRooms.clear(); singleConnections.clear(); multiConnections.clear(); for (Room r : rooms){ @@ -112,6 +115,20 @@ public abstract class RegularBuilder extends Builder { weightRooms(multiConnections); Random.shuffle(multiConnections); multiConnections = new ArrayList<>(new LinkedHashSet<>(multiConnections)); + //shuffle one more time to ensure that the actual ordering of the path doesn't put big rooms early + Random.shuffle(multiConnections); + + int roomsOnMainPath = (int)(multiConnections.size()*pathLength) + Random.chances(pathLenJitterChances); + + while (roomsOnMainPath > 0 && !multiConnections.isEmpty()){ + Room r = multiConnections.remove(0); + if (r instanceof StandardRoom){ + roomsOnMainPath -= ((StandardRoom) r).sizeCat.roomValue; + } else { + roomsOnMainPath--; + } + mainPathRooms.add(r); + } } // *** Branch Placement ***