aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/de')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScore.java21
1 files changed, 12 insertions, 9 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScore.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScore.java
index 98d3d79b..6059f9d5 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScore.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/DungeonScore.java
@@ -51,6 +51,7 @@ public class DungeonScore {
//Other patterns
private static final Pattern MIMIC_FLOORS_PATTERN = Pattern.compile("[FM][67]]");
+ private static FloorRequirement floorRequirement;
private static String currentFloor;
private static boolean floorHasMimics;
private static boolean sent270;
@@ -120,6 +121,7 @@ public class DungeonScore {
}
private static void reset() {
+ floorRequirement = null;
currentFloor = "";
floorHasMimics = false;
sent270 = false;
@@ -141,6 +143,7 @@ public class DungeonScore {
puzzleCount = getPuzzleCount();
isMayorPaul = Utils.getMayor().equals("Paul");
startingTime = System.currentTimeMillis();
+ floorRequirement = FloorRequirement.valueOf(currentFloor);
floorHasMimics = MIMIC_FLOORS_PATTERN.matcher(currentFloor).matches();
}
@@ -151,28 +154,28 @@ public class DungeonScore {
}
private static int calculateSkillScore() {
- return 20 + (int) Math.floor(80.0 * (getCompletedRooms() + getExtraCompletedRooms()) / getTotalRooms()) - getPuzzlePenalty() - getDeathScorePenalty();
+ int totalRooms = getTotalRooms(); //This is necessary to avoid division by 0 at the start of dungeons, which results in infinite score
+ return 20 + Math.max((totalRooms != 0 ? (int) (80.0 * (getCompletedRooms() + getExtraCompletedRooms()) / totalRooms) : 0) - getPuzzlePenalty() - getDeathScorePenalty(), 0); //Can't go below 20 skill score
}
private static int calculateExploreScore() {
- int completedRoomScore = (int) Math.floor(60.0 * (getCompletedRooms() + getExtraCompletedRooms()) / getTotalRooms());
- int percentageRequirement = FloorRequirement.valueOf(currentFloor).percentage;
- int secretsScore = (int) Math.floor(40 * Math.min(percentageRequirement, getSecretsPercentage()) / percentageRequirement);
- return completedRoomScore + secretsScore;
+ int totalRooms = getTotalRooms(); //This is necessary to avoid division by 0 at the start of dungeons, which results in infinite score
+ int completedRoomScore = totalRooms != 0 ? (int) (60.0 * (getCompletedRooms() + getExtraCompletedRooms()) / totalRooms) : 0;
+ int secretsScore = (int) (40 * Math.min(floorRequirement.percentage, getSecretsPercentage()) / floorRequirement.percentage);
+ return Math.max(completedRoomScore + secretsScore, 0);
}
private static int calculateTimeScore() {
int score = 100;
int timeSpent = (int) (System.currentTimeMillis() - startingTime) / 1000;
- int timeRequirement = FloorRequirement.valueOf(currentFloor).timeLimit;
- if (timeSpent < timeRequirement) return score;
+ if (timeSpent < floorRequirement.timeLimit) return score;
- double timePastRequirement = ((double) (timeSpent - timeRequirement) / timeRequirement) * 100;
+ double timePastRequirement = ((double) (timeSpent - floorRequirement.timeLimit) / floorRequirement.timeLimit) * 100;
if (timePastRequirement < 20) return score - (int) timePastRequirement / 2;
if (timePastRequirement < 40) return score - (int) (10 + (timePastRequirement - 20) / 4);
if (timePastRequirement < 50) return score - (int) (15 + (timePastRequirement - 40) / 5);
if (timePastRequirement < 60) return score - (int) (17 + (timePastRequirement - 50) / 6);
- return score - (int) (18 + (2.0 / 3.0) + (timePastRequirement - 60) / 7);
+ return Math.max(score - (int) (18 + (2.0 / 3.0) + (timePastRequirement - 60) / 7), 0); //This can theoretically go down to -20 if the time limit is one of the lower ones like 480, but individual score categories can't go below 0
}
private static int calculateBonusScore() {