diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/BranchesBuilder.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/BranchesBuilder.java index be2c74e07..d97e74ad7 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/BranchesBuilder.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/BranchesBuilder.java @@ -22,6 +22,7 @@ package com.shatteredpixel.shatteredpixeldungeon.levels.builders; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room; +import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.connection.ConnectionRoom; import com.watabou.utils.Random; import java.util.ArrayList; @@ -47,8 +48,42 @@ public class BranchesBuilder extends RegularBuilder { if (shop != null){ placeRoom(branchable, entrance, shop, Random.Float(360f)); } - + + //we place up to 2 or 3 main path rooms first so that levelgen has a starting point for branches + int mainBranchRooms = Math.max(Random.Int(2, 3), mainPathRooms.size()); + float[] pathTunnels = pathTunnelChances.clone(); + for (int i = 1; i < mainBranchRooms; i++){ + Room prev = entrance; + Room r = mainPathRooms.get(0); + + int tunnels = Random.chances(pathTunnels); + if (tunnels == -1){ + pathTunnels = pathTunnelChances.clone(); + tunnels = Random.chances(pathTunnels); + } + pathTunnels[tunnels]--; + + for (int j = 0; j < tunnels; j++){ + ConnectionRoom t = ConnectionRoom.createRoom(); + float result; + do { + result = placeRoom(rooms, prev, t, Random.Float(360f)); + } while (result == -1); + branchable.add(t); + rooms.add(t); + prev = t; + } + + float result; + do { + result = placeRoom(rooms, prev, r, Random.Float(360f)); + } while (result == -1); + branchable.add(r); + mainPathRooms.remove(r); + } + ArrayList roomsToBranch = new ArrayList<>(); + roomsToBranch.addAll(mainPathRooms); roomsToBranch.addAll(multiConnections); if (exit != null) roomsToBranch.add(exit); roomsToBranch.addAll(singleConnections); 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 f6ce541d6..4416cc70a 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 @@ -130,7 +130,7 @@ public class FigureEightBuilder extends RegularBuilder { ArrayList secondLoopTemp = new ArrayList<>(); secondLoopTemp.add(landmarkRoom); secondLoopTemp.addAll(roomsToLoop); - secondLoopTemp.add((secondLoopTemp.size()+1)/2, exit); + if (exit != null) secondLoopTemp.add((secondLoopTemp.size()+1)/2, exit); secondLoop = new ArrayList<>(); for (Room r : secondLoopTemp){ diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/LineBuilder.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/LineBuilder.java index 098f2299d..edb835e97 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/LineBuilder.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/levels/builders/LineBuilder.java @@ -44,47 +44,42 @@ public class LineBuilder extends RegularBuilder { entrance.setSize(); entrance.setPos(0, 0); - branchable.add(entrance); + + mainPathRooms.add(0, entrance); + if (exit != null) mainPathRooms.add(exit); if (shop != null){ placeRoom(rooms, entrance, shop, direction + 180f); } - int roomsOnPath = (int)(multiConnections.size()*pathLength) + Random.chances(pathLenJitterChances); - roomsOnPath = Math.min(roomsOnPath, multiConnections.size()); - - Room curr = entrance; - + Room prev = entrance; + float[] pathTunnels = pathTunnelChances.clone(); - for (int i = 0; i <= roomsOnPath; i++){ - if (i == roomsOnPath && exit == null) - continue; - + for (int i = 1; i < mainPathRooms.size(); i++){ + Room r = mainPathRooms.get(i); + int tunnels = Random.chances(pathTunnels); if (tunnels == -1){ pathTunnels = pathTunnelChances.clone(); tunnels = Random.chances(pathTunnels); } pathTunnels[tunnels]--; - + for (int j = 0; j < tunnels; j++){ ConnectionRoom t = ConnectionRoom.createRoom(); - placeRoom(rooms, curr, t, direction + Random.Float(-pathVariance, pathVariance)); + placeRoom(rooms, prev, t, direction + Random.Float(-pathVariance, pathVariance)); branchable.add(t); rooms.add(t); - curr = t; + prev = t; } - Room r = (i == roomsOnPath ? exit : multiConnections.get(i)); - placeRoom(rooms, curr, r, direction + Random.Float(-pathVariance, pathVariance)); + placeRoom(rooms, prev, r, direction + Random.Float(-pathVariance, pathVariance)); branchable.add(r); - curr = r; + prev = r; } ArrayList roomsToBranch = new ArrayList<>(); - for (int i = roomsOnPath; i < multiConnections.size(); i++){ - roomsToBranch.add(multiConnections.get(i)); - } + roomsToBranch.addAll(multiConnections); roomsToBranch.addAll(singleConnections); weightRooms(branchable); createBranches(rooms, branchable, roomsToBranch, branchTunnelChances); 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 09c190787..01bea5dae 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 @@ -84,7 +84,7 @@ public class LoopBuilder extends RegularBuilder { float startAngle = Random.Float(0, 360); mainPathRooms.add(0, entrance); - mainPathRooms.add((mainPathRooms.size()+1)/2, exit); + if (exit != null) mainPathRooms.add((mainPathRooms.size()+1)/2, exit); ArrayList loop = new ArrayList<>(); float[] pathTunnels = pathTunnelChances.clone();