From 4e8e1822143727ef62a6ac12f50f425a6e3fa240 Mon Sep 17 00:00:00 2001 From: Ville Kopio <13101000+vkopio@users.noreply.github.com> Date: Tue, 14 May 2019 04:25:47 +0300 Subject: [PATCH] combatlevel plugin: fix prayer levels until combat level calculation Add more prayer level tests to expose a bug in which needed prayer levels for next combat level was 0 instead of 2 in some corner cases and implemented fixes. For example: Let prayer level p be an odd number. The current combat level is exactly same for p and p - 1. Therefore given n is the needed prayer levels for a combat level with p - 1 prayer then n - 1 is the needed prayer levels for a combal level with p prayer. Further more the usage of Math.floor was incorrect in every cases so it is changed to Math.ceil. --- .../combatlevel/CombatLevelOverlay.java | 8 +++- .../combatlevel/CombatLevelPluginTest.java | 43 +++++++++++++++++-- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelOverlay.java index bc107e31b2..6e81a7a983 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelOverlay.java @@ -168,12 +168,18 @@ class CombatLevelOverlay extends Overlay @VisibleForTesting static int calcLevelsPray(double start, int end, int prayerLevel) { - final int neededLevels = (int) Math.floor(calcMultipliedLevels(start, end, PRAY_MULT)); + int neededLevels = (int) Math.ceil(calcMultipliedLevels(start, end, PRAY_MULT)); + + if (prayerLevel % 2 != 0) + { + neededLevels--; + } if ((prayerLevel + neededLevels) % 2 != 0) { return neededLevels + 1; } + return neededLevels; } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/combatlevel/CombatLevelPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/combatlevel/CombatLevelPluginTest.java index 3c1ff06f0c..361fa04aea 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/combatlevel/CombatLevelPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/combatlevel/CombatLevelPluginTest.java @@ -270,10 +270,47 @@ public class CombatLevelPluginTest when(client.getRealSkillLevel(Skill.MAGIC)).thenReturn(99); when(client.getRealSkillLevel(Skill.HITPOINTS)).thenReturn(99); + assertEquals(1, neededPrayerLevels()); + } + + @Test + public void testEvenPrayerLevelsNeededWhenNearNextCombatLevel() + { + when(player.getCombatLevel()).thenReturn(90); + when(client.getRealSkillLevel(Skill.ATTACK)).thenReturn(74); + when(client.getRealSkillLevel(Skill.STRENGTH)).thenReturn(75); + when(client.getRealSkillLevel(Skill.DEFENCE)).thenReturn(72); + when(client.getRealSkillLevel(Skill.PRAYER)).thenReturn(52); + when(client.getRealSkillLevel(Skill.RANGED)).thenReturn(44); + when(client.getRealSkillLevel(Skill.MAGIC)).thenReturn(60); + when(client.getRealSkillLevel(Skill.HITPOINTS)).thenReturn(72); + + assertEquals(2, neededPrayerLevels()); + } + + @Test + public void testOddPrayerLevelsNeededWhenNearNextCombatLevel() + { + when(player.getCombatLevel()).thenReturn(90); + when(client.getRealSkillLevel(Skill.ATTACK)).thenReturn(74); + when(client.getRealSkillLevel(Skill.STRENGTH)).thenReturn(75); + when(client.getRealSkillLevel(Skill.DEFENCE)).thenReturn(72); + when(client.getRealSkillLevel(Skill.PRAYER)).thenReturn(53); + when(client.getRealSkillLevel(Skill.RANGED)).thenReturn(44); + when(client.getRealSkillLevel(Skill.MAGIC)).thenReturn(60); + when(client.getRealSkillLevel(Skill.HITPOINTS)).thenReturn(72); + + assertEquals(1, neededPrayerLevels()); + } + + private int neededPrayerLevels() + { HashMap baseValues = getBaseValues(); - // test prayer - assertEquals(1, calcLevelsPray(baseValues.get("base") + baseValues.get("max"), - player.getCombatLevel() + 1, client.getRealSkillLevel(Skill.PRAYER))); + return calcLevelsPray( + baseValues.get("base") + baseValues.get("max"), + player.getCombatLevel() + 1, + client.getRealSkillLevel(Skill.PRAYER) + ); } }