v2.2.0: fixed various un-triggered logic errors in builder code

This commit is contained in:
Evan Debenham
2023-07-17 15:37:02 -04:00
parent da0968702e
commit b454a8eb93
4 changed files with 52 additions and 22 deletions
@@ -22,6 +22,7 @@
package com.shatteredpixel.shatteredpixeldungeon.levels.builders; package com.shatteredpixel.shatteredpixeldungeon.levels.builders;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room; import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.Room;
import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.connection.ConnectionRoom;
import com.watabou.utils.Random; import com.watabou.utils.Random;
import java.util.ArrayList; import java.util.ArrayList;
@@ -47,8 +48,42 @@ public class BranchesBuilder extends RegularBuilder {
if (shop != null){ if (shop != null){
placeRoom(branchable, entrance, shop, Random.Float(360f)); 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<Room> roomsToBranch = new ArrayList<>(); ArrayList<Room> roomsToBranch = new ArrayList<>();
roomsToBranch.addAll(mainPathRooms);
roomsToBranch.addAll(multiConnections); roomsToBranch.addAll(multiConnections);
if (exit != null) roomsToBranch.add(exit); if (exit != null) roomsToBranch.add(exit);
roomsToBranch.addAll(singleConnections); roomsToBranch.addAll(singleConnections);
@@ -130,7 +130,7 @@ public class FigureEightBuilder extends RegularBuilder {
ArrayList<Room> secondLoopTemp = new ArrayList<>(); ArrayList<Room> secondLoopTemp = new ArrayList<>();
secondLoopTemp.add(landmarkRoom); secondLoopTemp.add(landmarkRoom);
secondLoopTemp.addAll(roomsToLoop); secondLoopTemp.addAll(roomsToLoop);
secondLoopTemp.add((secondLoopTemp.size()+1)/2, exit); if (exit != null) secondLoopTemp.add((secondLoopTemp.size()+1)/2, exit);
secondLoop = new ArrayList<>(); secondLoop = new ArrayList<>();
for (Room r : secondLoopTemp){ for (Room r : secondLoopTemp){
@@ -44,47 +44,42 @@ public class LineBuilder extends RegularBuilder {
entrance.setSize(); entrance.setSize();
entrance.setPos(0, 0); entrance.setPos(0, 0);
branchable.add(entrance);
mainPathRooms.add(0, entrance);
if (exit != null) mainPathRooms.add(exit);
if (shop != null){ if (shop != null){
placeRoom(rooms, entrance, shop, direction + 180f); placeRoom(rooms, entrance, shop, direction + 180f);
} }
int roomsOnPath = (int)(multiConnections.size()*pathLength) + Random.chances(pathLenJitterChances); Room prev = entrance;
roomsOnPath = Math.min(roomsOnPath, multiConnections.size());
Room curr = entrance;
float[] pathTunnels = pathTunnelChances.clone(); float[] pathTunnels = pathTunnelChances.clone();
for (int i = 0; i <= roomsOnPath; i++){ for (int i = 1; i < mainPathRooms.size(); i++){
if (i == roomsOnPath && exit == null) Room r = mainPathRooms.get(i);
continue;
int tunnels = Random.chances(pathTunnels); int tunnels = Random.chances(pathTunnels);
if (tunnels == -1){ if (tunnels == -1){
pathTunnels = pathTunnelChances.clone(); pathTunnels = pathTunnelChances.clone();
tunnels = Random.chances(pathTunnels); tunnels = Random.chances(pathTunnels);
} }
pathTunnels[tunnels]--; pathTunnels[tunnels]--;
for (int j = 0; j < tunnels; j++){ for (int j = 0; j < tunnels; j++){
ConnectionRoom t = ConnectionRoom.createRoom(); 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); branchable.add(t);
rooms.add(t); rooms.add(t);
curr = t; prev = t;
} }
Room r = (i == roomsOnPath ? exit : multiConnections.get(i)); placeRoom(rooms, prev, r, direction + Random.Float(-pathVariance, pathVariance));
placeRoom(rooms, curr, r, direction + Random.Float(-pathVariance, pathVariance));
branchable.add(r); branchable.add(r);
curr = r; prev = r;
} }
ArrayList<Room> roomsToBranch = new ArrayList<>(); ArrayList<Room> roomsToBranch = new ArrayList<>();
for (int i = roomsOnPath; i < multiConnections.size(); i++){ roomsToBranch.addAll(multiConnections);
roomsToBranch.add(multiConnections.get(i));
}
roomsToBranch.addAll(singleConnections); roomsToBranch.addAll(singleConnections);
weightRooms(branchable); weightRooms(branchable);
createBranches(rooms, branchable, roomsToBranch, branchTunnelChances); createBranches(rooms, branchable, roomsToBranch, branchTunnelChances);
@@ -84,7 +84,7 @@ public class LoopBuilder extends RegularBuilder {
float startAngle = Random.Float(0, 360); float startAngle = Random.Float(0, 360);
mainPathRooms.add(0, entrance); mainPathRooms.add(0, entrance);
mainPathRooms.add((mainPathRooms.size()+1)/2, exit); if (exit != null) mainPathRooms.add((mainPathRooms.size()+1)/2, exit);
ArrayList<Room> loop = new ArrayList<>(); ArrayList<Room> loop = new ArrayList<>();
float[] pathTunnels = pathTunnelChances.clone(); float[] pathTunnels = pathTunnelChances.clone();