From da589033767d4b410c34cda596ad81b6626e08a7 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 28 Oct 2021 09:59:45 -0400 Subject: [PATCH] skillcalc: use fixed point arithmetic for xp calculations --- .../skillcalculator/SkillCalculator.java | 18 ++++++++++-------- .../plugins/skillcalculator/UIActionSlot.java | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java index 672996ebeb..3645a3228a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculator.java @@ -34,7 +34,6 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.ArrayList; import java.util.List; @@ -62,7 +61,6 @@ import net.runelite.client.ui.components.IconTextField; class SkillCalculator extends JPanel { private static final int MAX_XP = 200_000_000; - private static final DecimalFormat XP_FORMAT = new DecimalFormat("#.#"); private final UICalculatorInputArea uiInput; private final Client client; @@ -203,7 +201,7 @@ class SkillCalculator extends JPanel int actionCount = 0; int neededXP = targetXP - currentXP; - double xp = 0; + int xp = 0; for (UIActionSlot slot : combinedActionSlots) { @@ -213,7 +211,8 @@ class SkillCalculator extends JPanel if (neededXP > 0) { assert xp != 0; - actionCount = (int) Math.ceil(neededXP / xp); + neededXP *= 10; + actionCount = (neededXP - 1) / xp + 1; } combinedActionSlot.setText(formatXPActionString(xp, actionCount, "exp - ")); @@ -344,11 +343,12 @@ class SkillCalculator extends JPanel int neededXP = targetXP - currentXP; SkillAction action = slot.getAction(); final float bonus = action.isIgnoreBonus() ? 1f : xpFactor; - final double xp = Math.round(action.getXp() * bonus * 10f) / 10d; + final int xp = Math.round(action.getXp() * bonus * 10f); if (neededXP > 0) { - actionCount = (int) Math.ceil(neededXP / xp); + neededXP *= 10; + actionCount = (neededXP - 1) / xp + 1; } slot.setText("Lvl. " + action.getLevel() + " (" + formatXPActionString(xp, actionCount, "exp) - ")); @@ -360,9 +360,11 @@ class SkillCalculator extends JPanel updateCombinedAction(); } - private static String formatXPActionString(double xp, int actionCount, String expExpression) + private static String formatXPActionString(int xp, int actionCount, String expExpression) { - return XP_FORMAT.format(xp) + expExpression + NumberFormat.getIntegerInstance().format(actionCount) + (actionCount == 1 ? " action" : " actions"); + int integer = xp / 10; + int frac = xp % 10; + return (frac != 0 ? (integer + "." + frac) : integer) + expExpression + NumberFormat.getIntegerInstance().format(actionCount) + (actionCount == 1 ? " action" : " actions"); } private void updateInputFields() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java index aa2fd23937..31d6f3340d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/UIActionSlot.java @@ -85,7 +85,7 @@ class UIActionSlot extends JPanel @Getter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE) - private double value; + private int value; UIActionSlot(SkillAction action, ClientThread clientThread, ItemManager itemManager, JLabel uiIcon) {