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.
This commit is contained in:
@@ -168,12 +168,18 @@ class CombatLevelOverlay extends Overlay
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static int calcLevelsPray(double start, int end, int prayerLevel)
|
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)
|
if ((prayerLevel + neededLevels) % 2 != 0)
|
||||||
{
|
{
|
||||||
return neededLevels + 1;
|
return neededLevels + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return neededLevels;
|
return neededLevels;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -270,10 +270,47 @@ public class CombatLevelPluginTest
|
|||||||
when(client.getRealSkillLevel(Skill.MAGIC)).thenReturn(99);
|
when(client.getRealSkillLevel(Skill.MAGIC)).thenReturn(99);
|
||||||
when(client.getRealSkillLevel(Skill.HITPOINTS)).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<String, Double> baseValues = getBaseValues();
|
HashMap<String, Double> baseValues = getBaseValues();
|
||||||
|
|
||||||
// test prayer
|
return calcLevelsPray(
|
||||||
assertEquals(1, calcLevelsPray(baseValues.get("base") + baseValues.get("max"),
|
baseValues.get("base") + baseValues.get("max"),
|
||||||
player.getCombatLevel() + 1, client.getRealSkillLevel(Skill.PRAYER)));
|
player.getCombatLevel() + 1,
|
||||||
|
client.getRealSkillLevel(Skill.PRAYER)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user