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

View File

@@ -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<Room> roomsToBranch = new ArrayList<>();
roomsToBranch.addAll(mainPathRooms);
roomsToBranch.addAll(multiConnections);
if (exit != null) roomsToBranch.add(exit);
roomsToBranch.addAll(singleConnections);

View File

@@ -130,7 +130,7 @@ public class FigureEightBuilder extends RegularBuilder {
ArrayList<Room> 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){

View File

@@ -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<Room> 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);

View File

@@ -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<Room> loop = new ArrayList<>();
float[] pathTunnels = pathTunnelChances.clone();