From 175bf532d2a9e5830ae92fbf69ebf9599d84588d Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Wed, 26 Jul 2023 14:05:22 -0400 Subject: [PATCH] v2.2.0: added a failure condition check for branch creation --- .../levels/builders/BranchesBuilder.java | 4 +++- .../levels/builders/FigureEightBuilder.java | 4 +++- .../levels/builders/LineBuilder.java | 4 +++- .../levels/builders/LoopBuilder.java | 4 +++- .../levels/builders/RegularBuilder.java | 12 ++++++++++-- 5 files changed, 22 insertions(+), 6 deletions(-) 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 561e84372..7e7afc848 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 @@ -88,7 +88,9 @@ public class BranchesBuilder extends RegularBuilder { roomsToBranch.addAll(multiConnections); if (exit != null) roomsToBranch.add(exit); roomsToBranch.addAll(singleConnections); - createBranches(rooms, branchable, roomsToBranch, branchTunnelChances); + if (!createBranches(rooms, branchable, roomsToBranch, branchTunnelChances)){ + return null; + } findNeighbours(rooms); 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 4416cc70a..e51bb0b61 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 @@ -241,7 +241,9 @@ public class FigureEightBuilder extends RegularBuilder { roomsToBranch.addAll(multiConnections); roomsToBranch.addAll(singleConnections); weightRooms(branchable); - createBranches(rooms, branchable, roomsToBranch, branchTunnelChances); + if (!createBranches(rooms, branchable, roomsToBranch, branchTunnelChances)){ + return null; + } findNeighbours(rooms); 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 edb835e97..f94fa21fa 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 @@ -82,7 +82,9 @@ public class LineBuilder extends RegularBuilder { roomsToBranch.addAll(multiConnections); roomsToBranch.addAll(singleConnections); weightRooms(branchable); - createBranches(rooms, branchable, roomsToBranch, branchTunnelChances); + if (!createBranches(rooms, branchable, roomsToBranch, branchTunnelChances)){ + return null; + } findNeighbours(rooms); 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 01bea5dae..e8634f41e 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 @@ -155,7 +155,9 @@ public class LoopBuilder extends RegularBuilder { roomsToBranch.addAll(multiConnections); roomsToBranch.addAll(singleConnections); weightRooms(branchable); - createBranches(rooms, branchable, roomsToBranch, branchTunnelChances); + if (!createBranches(rooms, branchable, roomsToBranch, branchTunnelChances)){ + return null; + } findNeighbours(rooms); 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 661d3df10..d872ebe1f 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 @@ -144,7 +144,7 @@ public abstract class RegularBuilder extends Builder { //places the rooms in roomsToBranch into branches from rooms in branchable. //note that the three arrays should be separate, they may contain the same rooms however - protected void createBranches(ArrayList rooms, ArrayList branchable, + protected boolean createBranches(ArrayList rooms, ArrayList branchable, ArrayList roomsToBranch, float[] connChances){ int i = 0; @@ -152,9 +152,13 @@ public abstract class RegularBuilder extends Builder { int tries; Room curr; ArrayList connectingRoomsThisBranch = new ArrayList<>(); - + int failedBranchAttempts = 0; float[] connectionChances = connChances.clone(); while (i < roomsToBranch.size()){ + + if (failedBranchAttempts > 100){ + return false; + } Room r = roomsToBranch.get(i); @@ -197,6 +201,7 @@ public abstract class RegularBuilder extends Builder { } if (connectingRoomsThisBranch.size() != connectingRooms){ + failedBranchAttempts++; continue; } @@ -214,6 +219,7 @@ public abstract class RegularBuilder extends Builder { rooms.remove(t); } connectingRoomsThisBranch.clear(); + failedBranchAttempts++; continue; } @@ -232,6 +238,8 @@ public abstract class RegularBuilder extends Builder { i++; } + + return true; } protected float randomBranchAngle( Room r ){