diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java
index ae7402c..b5006eb 100644
--- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java
+++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryConfig.java
@@ -504,15 +504,4 @@ public interface EasyGiantsFoundryConfig extends Config
)
String generalSettings = "generalSettings";
- @ConfigItem(
- keyName = "heatingCoolingMarginOfError",
- name = "Heating/Cooling Margin of Error",
- description = "The margin of error for lava/waterfall calculations to compensate for decay and overshooting.",
- position = 0,
- section = generalSettings
- )
- default int heatingCoolingBuffer()
- {
- return 20;
- }
}
diff --git a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java
index 3cd158a..6ed742e 100644
--- a/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java
+++ b/src/main/java/com/toofifty/easygiantsfoundry/EasyGiantsFoundryPlugin.java
@@ -338,7 +338,7 @@ public class EasyGiantsFoundryPlugin extends Plugin
{
Widget title = Objects.requireNonNull(mouldParent.getChild(1));
- // not sure why, the ":" character turns into ": ," when rendered; obmitting it.
+ // not sure why, the ":" character turns into ": ," when rendered; omitting it.
title.setText("Giants' Foundry Mould Setup
(Score " + mouldScore + ")");
}
}
@@ -369,8 +369,8 @@ public class EasyGiantsFoundryPlugin extends Plugin
state.heatingCoolingState.onTick();
}
- previousHeat = event.getValue();
}
+ previousHeat = event.getValue();
}
@Subscribe
diff --git a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java
index 8064292..1eaa0bc 100644
--- a/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java
+++ b/src/main/java/com/toofifty/easygiantsfoundry/FoundryOverlay3D.java
@@ -134,7 +134,7 @@ public class FoundryOverlay3D extends Overlay
return null;
}
- drawHeatingActionOverlay(graphics, stageObject);
+ drawActionOverlay(graphics, stageObject);
Heat heat = state.getCurrentHeat();
Color color = getObjectColor(stage, heat);
@@ -155,11 +155,11 @@ public class FoundryOverlay3D extends Overlay
if (state.heatingCoolingState.isCooling())
{
- drawHeatingActionOverlay(graphics, waterfall, false);
+ drawHeatingCoolingOverlay(graphics, waterfall);
}
if (state.heatingCoolingState.isHeating())
{
- drawHeatingActionOverlay(graphics, lavaPool, true);
+ drawHeatingCoolingOverlay(graphics, lavaPool);
}
@@ -192,10 +192,10 @@ public class FoundryOverlay3D extends Overlay
modelOutlineRenderer.drawOutline(stageObject, config.borderThickness(), _color, config.borderFeather());
}
- private void drawHeatingActionOverlay(
+ private void drawHeatingCoolingOverlay(
Graphics2D graphics,
- GameObject stageObject,
- boolean isLava /* and not cooling */)
+ GameObject stageObject
+ )
{
if (!config.drawLavaWaterInfoOverlay())
{
@@ -208,22 +208,10 @@ public class FoundryOverlay3D extends Overlay
}
String text;
- if (isLava)
- {
- // %d heats or %d dunks
- text = String.format("%d %s",
- state.heatingCoolingState.getRemainingDuration(),
- state.heatingCoolingState.getActionName()
- );
- }
- else
- {
- // %d cools
- text = String.format("%d %s",
- state.heatingCoolingState.getRemainingDuration(),
- state.heatingCoolingState.getActionName()
- );
- }
+ text = String.format("%d %s",
+ state.heatingCoolingState.getRemainingDuration(),
+ state.heatingCoolingState.getActionName()
+ );
LocalPoint stageLoc = stageObject.getLocalLocation();
stageLoc = new LocalPoint(stageLoc.getX(), stageLoc.getY());
@@ -437,7 +425,7 @@ public class FoundryOverlay3D extends Overlay
}
}
- private void drawHeatingActionOverlay(Graphics2D graphics, GameObject gameObject)
+ private void drawActionOverlay(Graphics2D graphics, GameObject gameObject)
{
int actionsLeft = state.getActionsLeftInStage();
int heatLeft = state.getActionsForHeatLevel();
diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java
index 6c534e6..e500b9d 100644
--- a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java
+++ b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionSolver.java
@@ -78,6 +78,13 @@ public class HeatActionSolver
{
/**
+ * Warning: this method prefers overshooting goal. For example, if goal is 957,
+ * it will return index that reaches >957.
+ * This may be desirable if we're aiming to heat over range minimum,
+ * but undesirable when cooling below range maximum; make sure to -1 the index if so.
+ *
+ *
+ *
* @param goal the desired heat destination
* @param init_dx1 initial speed of heating/cooling. currently 7 for heat/cool, 27 for dunk/quench.
* @param dx2_offset bonus acceleration. currently, 0 for heat/cool, 2 for dunk/quench.
diff --git a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java
index edb2cbf..00e0da6 100644
--- a/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java
+++ b/src/main/java/com/toofifty/easygiantsfoundry/HeatActionStateMachine.java
@@ -113,26 +113,32 @@ public class HeatActionStateMachine
*/
public void calculateEstimates()
{
+ // 0: left/min 1: right/max
int[] range = State.getCurrentHeatRange();
+ int stageMin = range[0];
+ int stageMax = range[1];
+
Stage stage = State.getCurrentStage();
int actionsLeft = State.getActionsLeftInStage();
- int actionsLeft_DeltaHeat = actionsLeft * stage.getHeatChange();
+ int actionsLeft_DeltaHeat = (actionsLeft+1) * stage.getHeatChange();
if (isHeating())
{
if (stage.isHeating())
{
- GoalHeat = Math.max(range[0] + Config.heatingCoolingBuffer(), range[1] - actionsLeft_DeltaHeat);
+ GoalHeat = Math.max(stageMin, stageMax - actionsLeft_DeltaHeat);
if (StartingHeat < GoalHeat)
{
- EstimatedDuration = HeatActionSolver.findDx0Index(
+ int duration = HeatActionSolver.findDx0Index(
GoalHeat - StartingHeat,
- Velocity, AccelerationBonus);
+ Velocity, AccelerationBonus
+ );
- GoalHeat += EstimatedDuration / 2; // compensate for decay during heating
+ GoalHeat += duration / 2;
EstimatedDuration = HeatActionSolver.findDx0Index(
GoalHeat - StartingHeat,
- Velocity, AccelerationBonus);
+ Velocity, AccelerationBonus
+ );
}
else // overheating
{
@@ -141,13 +147,21 @@ public class HeatActionStateMachine
}
else // is cooling
{
- GoalHeat = Math.min(range[1] - Config.heatingCoolingBuffer(), range[0] - actionsLeft_DeltaHeat);
+ // actionsLeft_DeltaHeat is negative here
+ GoalHeat = Math.min(stageMax, stageMin - actionsLeft_DeltaHeat);
if (StartingHeat < GoalHeat)
{
+ int duration = HeatActionSolver.findDx0Index(
+ GoalHeat - StartingHeat,
+ Velocity, AccelerationBonus
+ ) - 1;
+
+ GoalHeat -= duration / 2;
+
EstimatedDuration = HeatActionSolver.findDx0Index(
GoalHeat - StartingHeat,
Velocity, AccelerationBonus
- );
+ ) - 1;
}
else // cold enough
{
@@ -157,11 +171,39 @@ public class HeatActionStateMachine
}
else if (isCooling())
{
- if (stage.isCooling())
- {
- GoalHeat = Math.max(range[1] - Config.heatingCoolingBuffer(), range[0] + actionsLeft_DeltaHeat);
+ if (stage.isHeating()) {
+ GoalHeat = Math.max(stageMin, stageMax - actionsLeft_DeltaHeat);
+ if (StartingHeat > GoalHeat)
+ {
+ int duration = HeatActionSolver.findDx0Index(
+ StartingHeat - GoalHeat,
+ Math.abs(Velocity), Math.abs(AccelerationBonus)
+ ) - 1;
+
+ GoalHeat += duration / 2;
+
+ EstimatedDuration = HeatActionSolver.findDx0Index(
+ (StartingHeat - GoalHeat),
+ Math.abs(Velocity), Math.abs(AccelerationBonus)
+ ) - 1;
+ }
+ else
+ {
+ EstimatedDuration = 0;
+ }
+ }
+ // Heating Stage
+ else {
+ GoalHeat = Math.max(stageMax, stageMin + actionsLeft_DeltaHeat);
if (StartingHeat > GoalHeat) // too hot
{
+ int duration = HeatActionSolver.findDx0Index(
+ StartingHeat - GoalHeat,
+ Math.abs(Velocity), Math.abs(AccelerationBonus)
+ );
+
+ GoalHeat -= duration / 2;
+
EstimatedDuration = HeatActionSolver.findDx0Index(
StartingHeat - GoalHeat,
Math.abs(Velocity), Math.abs(AccelerationBonus)
@@ -172,21 +214,7 @@ public class HeatActionStateMachine
EstimatedDuration = 0;
}
}
- else // Heating Stage
- {
- GoalHeat = Math.max(range[0] + Config.heatingCoolingBuffer(), range[1] - actionsLeft_DeltaHeat);
- if (StartingHeat > GoalHeat)
- {
- EstimatedDuration = HeatActionSolver.findDx0Index(
- (StartingHeat - GoalHeat),
- Math.abs(Velocity), Math.abs(AccelerationBonus)
- );
- }
- else
- {
- EstimatedDuration = 0;
- }
- }
+
}
}
diff --git a/src/test/java/com/toofifty/easygiantsfoundry/HeatSolverTest.java b/src/test/java/com/toofifty/easygiantsfoundry/HeatSolverTest.java
index 69cac3c..f5fb53b 100644
--- a/src/test/java/com/toofifty/easygiantsfoundry/HeatSolverTest.java
+++ b/src/test/java/com/toofifty/easygiantsfoundry/HeatSolverTest.java
@@ -90,7 +90,7 @@ public class HeatSolverTest
for (int i = 0; i < answer_dx1.length; i++)
{
- TestHeatSolver_Dx0_Helper(answer_dx0.get(i), answer_dx0.get(0), i + 1);
+ TestHeatSolver_Dx0_Helper(answer_dx0.get(i), answer_dx0.get(0), i);
}
}
@@ -131,7 +131,9 @@ public class HeatSolverTest
// System.err.println(
// HeatSolver.findDx0IndexContinue(1000, 7, 0));
System.err.println(
- HeatActionSolver.findDx0Index(1000, 7, 1));
+ HeatActionSolver.findDx0Index(957, 27, 2));
+// System.err.println(
+// HeatActionSolver.findDx0Index(1000, 7, 1));
}
public void TestHeatSolver_Dx0_Helper(int dx0, int constant, int answer_index)
@@ -139,7 +141,7 @@ public class HeatSolverTest
System.err.print(dx0 + "->" + HeatActionSolver.findDx0Index(dx0, constant, 0) + ",");
// test calcDx0Index
- assertEquals("Asserting dx0 index for " + answer_index,
+ assertEquals("Asserting dx0 for index " + answer_index,
answer_index, HeatActionSolver.findDx0Index(dx0, constant, 0));
}