From 77e2e2ebe4a4fac22cd180462d8ca115570ff1db Mon Sep 17 00:00:00 2001 From: Louis Hong Date: Thu, 21 Nov 2024 11:46:46 -0800 Subject: [PATCH] heat solver: decay calculations now considers distances to tools. can now use 0 padding without issues. --- .../EasyGiantsFoundryConfig.java | 8 +-- .../EasyGiantsFoundryState.java | 8 ++- .../easygiantsfoundry/FoundryOverlay3D.java | 6 ++- .../easygiantsfoundry/HeatActionSolver.java | 50 +++++++++++++++++-- .../HeatActionStateMachine.java | 3 +- 5 files changed, 64 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java index baf7ea2..7766f3b 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java @@ -520,15 +520,15 @@ public interface EasyGiantsFoundryConfig extends Config max = 50 ) @ConfigItem( - keyName = "heatActionBuffer", // renamed to reset player's settings for previous bugged implementation - name = "Lava/Waterfall Padding Ticks", - description = "Units in ticks; buffers more than optimal heat when in lava/waterfall calculations to compensate for heat decay when the player is afk or running/walking slower than optimal.", + keyName = "paddingTicks", // renamed to reset player's settings for previous bugged implementation + name = "Padding Ticks", + description = "Number of inefficient idle ticks between actions; calculations will pad more than optimal heat compensate for heat decay during idle/afk.", position = 0, section = advancedSettings ) default int heatActionPadTicks() { - return 4; + return 3; } @ConfigItem( diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java index 0e1ba90..1a80774 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryState.java @@ -49,6 +49,8 @@ public class EasyGiantsFoundryState private final List stages = new ArrayList<>(); private double heatRangeRatio = 0; + public final HeatActionStateMachine heatActionStateMachine = new HeatActionStateMachine(); + public void reset() { stages.clear(); @@ -335,5 +337,9 @@ public class EasyGiantsFoundryState return actions; } - public HeatActionStateMachine heatActionStateMachine = new HeatActionStateMachine(); + + public boolean isPlayerRunning() + { + return client.getVarpValue(173) == 1; + } } diff --git a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java index 8689ee4..d7283d7 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java @@ -230,7 +230,8 @@ public class FoundryOverlay3D extends Overlay state.getHeatAmount(), true, isLava, - config.heatActionPadTicks() * 2 + config.heatActionPadTicks(), + state.isPlayerRunning() ); final int fastDuration = fastResult.getDuration(); @@ -242,7 +243,8 @@ public class FoundryOverlay3D extends Overlay state.getHeatAmount(), false, isLava, - config.heatActionPadTicks() * 2 + config.heatActionPadTicks(), + state.isPlayerRunning() ); final int slowDuration = slowResult.getDuration(); diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java index 6516e15..0478f40 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java @@ -119,6 +119,24 @@ public class HeatActionSolver 95, 91, // last one will always overshoot 1000 }; + + + // index 1 is stage, ordinal order + // index 2 [0] = lava [1] = waterfall + // in units of tiles + public static final int[][] DISTANCE_TO_STAGE = new int[][] { + new int[] {4, 14}, + new int[] {7, 9}, + new int[] {12, 10} + }; + + // index is stage, ordinal order + public static final int[] TOOL_TICK_CYCLE = new int[] { + 5, + 2, + 2 + }; + public static final int MAX_INDEX = DX_1.length; public static final int FAST_INDEX = 10; @@ -206,16 +224,24 @@ public class HeatActionSolver int start, boolean isFast, boolean isActionHeating, - int padding) + int paddingTicks, + boolean isRunning) { final boolean isStageHeating = stage.isHeating(); + // adding tool cycle ticks because the first cycle at a tool is almost always nulled + // (unless manually reaching the tile, then clicking the tool) + final int toolDelay = TOOL_TICK_CYCLE[stage.ordinal()]; + final int travelTicks = solveTravelTicks(isRunning, stage, isActionHeating) + toolDelay; + final int travelDecay = (int) Math.ceil((double) travelTicks / 2); + + final int paddingDecay = (int) Math.ceil((double) paddingTicks / 2); // 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 = Math.max(0, Math.min(1000, range[0] + padding)); - final int max = Math.max(0, Math.min(1000, range[1] + padding)); + final int min = Math.max(0, Math.min(1000, range[0] + paddingDecay + travelDecay)); + final int max = Math.max(0, Math.min(1000, range[1] + paddingDecay + travelDecay)); final int actionsLeft_DeltaHeat = actionLeftInStage * stage.getHeatChange(); @@ -340,5 +366,23 @@ public class HeatActionSolver return DurationResult.of(estimatedDuration, goalInRange, overshoot, start + dx0); } + private static int solveTravelTicks(boolean isRunning, Stage stage, boolean isLava) + { + final int index1 = stage.ordinal(); + final int index2 = isLava ? 0 : 1; + final int distance = DISTANCE_TO_STAGE[index1][index2]; + + if (isRunning) + { + // for odd distances, like 7 + // 7 / 2 = 3.5 + // rounded to 4 + return (int) Math.ceil((double) distance / 2); + } + else + { + return distance; + } + } } diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java index c0c3d19..ccf6204 100644 --- a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java +++ b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java @@ -121,7 +121,8 @@ public class HeatActionStateMachine getStartingHeat(), actionFast, isHeating(), - config.heatActionPadTicks() * 2 + config.heatActionPadTicks(), + state.isPlayerRunning() ); goalInRange = result.isGoalInRange();