From 0cda8011650f1c4a2dacbfdad89e6996d30165cf Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Thu, 14 Nov 2024 03:41:44 -0800 Subject: [PATCH] heat solver: Fixed index going out of bounds When attempting solving impossible heat goals and ranges, algo runs out of prebaked DX1 values. 1. Fixed incorrect loop condition that caused the out of bounds. 2. Clamped the heat goal so they also never attempt to solve impossible heat goals. Stacktrace ---------- java.lang.ArrayIndexOutOfBoundsException: Index 27 out of bounds for length 27 at com.toofifty.easygiantsfoundry.HeatActionSolver.relativeSolve(HeatActionSolver.java:188) at com.toofifty.easygiantsfoundry.HeatActionSolver.heatingSolve(HeatActionSolver.java:136) at com.toofifty.easygiantsfoundry.HeatActionSolver.solve(HeatActionSolver.java:288) at com.toofifty.easygiantsfoundry.FoundryOverlay3D.drawHeatChangerPreviewOverlay(FoundryOverlay3D.java:244) --- .../toofifty/easygiantsfoundry/HeatActionSolver.java | 11 ++++++----- .../easygiantsfoundry/HeatActionStateMachine.java | 2 -- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java index bf33807..4367a5b 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java @@ -151,7 +151,7 @@ public class HeatActionSolver while (true) { - if (index >= MAX_INDEX) + if (index > MAX_INDEX) { break; } @@ -175,6 +175,7 @@ public class HeatActionSolver dx0 -= decayValue; } + dx0 += DX_1[index]; ++index; decay = !decay; @@ -210,11 +211,11 @@ public class HeatActionSolver final boolean isStageHeating = stage.isHeating(); - // adding 1.8s/6ticks worth of padding so preform doesn't decay out of range - // average distance from lava+waterfall around 6 ticks + // adding 2.4s/8ticks worth of padding so preform doesn't decay out of range + // average distance from lava+waterfall around 8 ticks // preform decays 1 heat every 2 ticks - final int min = range[0] + padding; - final int max = range[1] + padding; + final int min = Math.min(1000, range[0] + padding); + final int max = Math.min(1000, range[1] + padding); final int actionsLeft_DeltaHeat = actionLeftInStage * stage.getHeatChange(); diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java index 7b5ba91..c0c3d19 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java @@ -135,8 +135,6 @@ public class HeatActionStateMachine /** * Helper to remind the neccessary parameters to start the state-machine. * - * @param velocity the velocity of the heating/cooling action, 7 for slow, 27 for fast. - * @param accelerationBonus the acceleration bonus of the heating/cooling action. Usually 0 for slow, 2 for fast. * @param actionName the name of the action to display in the ui overlay */ public void setup(boolean isFast, boolean isHeating, String actionName)