Merge pull request #7124 from Nightfirecat/fix-prayer-to-next-combat-level-calculation
Fix prayer to next combat level calculation
This commit is contained in:
@@ -43,6 +43,11 @@ import java.awt.Rectangle;
|
|||||||
class CombatLevelOverlay extends Overlay
|
class CombatLevelOverlay extends Overlay
|
||||||
{
|
{
|
||||||
private static final Color COMBAT_LEVEL_COLOUR = new Color(0xff981f);
|
private static final Color COMBAT_LEVEL_COLOUR = new Color(0xff981f);
|
||||||
|
private static final double PRAY_MULT = 0.125;
|
||||||
|
static final double ATT_STR_MULT = 0.325;
|
||||||
|
static final double DEF_HP_MULT = 0.25;
|
||||||
|
static final double RANGE_MAGIC_LEVEL_MULT = 1.5;
|
||||||
|
static final double RANGE_MAGIC_MULT = 0.325;
|
||||||
|
|
||||||
private final Client client;
|
private final Client client;
|
||||||
private final CombatLevelConfig config;
|
private final CombatLevelConfig config;
|
||||||
@@ -94,53 +99,50 @@ class CombatLevelOverlay extends Overlay
|
|||||||
int prayerLevel = client.getRealSkillLevel(Skill.PRAYER);
|
int prayerLevel = client.getRealSkillLevel(Skill.PRAYER);
|
||||||
|
|
||||||
// calculate initial required numbers
|
// calculate initial required numbers
|
||||||
double base = 0.25 * (defenceLevel + hitpointsLevel + Math.floor(prayerLevel / 2));
|
double base = DEF_HP_MULT * (defenceLevel + hitpointsLevel + Math.floor(prayerLevel / 2));
|
||||||
double melee = 0.325 * (attackLevel + strengthLevel);
|
double melee = ATT_STR_MULT * (attackLevel + strengthLevel);
|
||||||
double range = 0.325 * Math.floor(rangedLevel * 1.5);
|
double range = RANGE_MAGIC_MULT * Math.floor(rangedLevel * RANGE_MAGIC_LEVEL_MULT);
|
||||||
double mage = 0.325 * Math.floor(magicLevel * 1.5);
|
double mage = RANGE_MAGIC_MULT * Math.floor(magicLevel * RANGE_MAGIC_LEVEL_MULT);
|
||||||
double max = Math.max(melee, Math.max(range, mage));
|
double max = Math.max(melee, Math.max(range, mage));
|
||||||
|
|
||||||
// find the needed levels until level up
|
// find the needed levels until level up
|
||||||
int next = client.getLocalPlayer().getCombatLevel() + 1;
|
int next = client.getLocalPlayer().getCombatLevel() + 1;
|
||||||
int meleeNeed = calcLevels(base + melee, next, 0.325);
|
int meleeNeed = calcLevels(base + melee, next, ATT_STR_MULT);
|
||||||
int hpdefNeed = calcLevels(base + max, next, 0.25);
|
int hpdefNeed = calcLevels(base + max, next, DEF_HP_MULT);
|
||||||
int prayNeed = calcLevels(base + max, next, 0.125);
|
int prayNeed = calcLevelsPray(base + max, next, prayerLevel);
|
||||||
int rangeNeed = calcLevelsRM(rangedLevel, next, base);
|
int rangeNeed = calcLevelsRM(rangedLevel, next, base);
|
||||||
int magicNeed = calcLevelsRM(magicLevel, next, base);
|
int magicNeed = calcLevelsRM(magicLevel, next, base);
|
||||||
|
|
||||||
// prayer is a special case, increasing combat every even level. need to correct its value
|
|
||||||
prayNeed = correctPrayer(prayerLevel, prayNeed);
|
|
||||||
|
|
||||||
// create tooltip string
|
// create tooltip string
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sb.append(ColorUtil.wrapWithColorTag("Next combat level:</br>", COMBAT_LEVEL_COLOUR));
|
sb.append(ColorUtil.wrapWithColorTag("Next combat level:</br>", COMBAT_LEVEL_COLOUR));
|
||||||
|
|
||||||
if ((attackLevel + strengthLevel + meleeNeed) <= 198)
|
if ((attackLevel + strengthLevel + meleeNeed) <= Experience.MAX_REAL_LEVEL * 2)
|
||||||
{
|
{
|
||||||
sb.append(meleeNeed).append(" Attack/Strength</br>");
|
sb.append(meleeNeed).append(" Attack/Strength</br>");
|
||||||
}
|
}
|
||||||
if ((hitpointsLevel + defenceLevel + hpdefNeed) <= 198)
|
if ((hitpointsLevel + defenceLevel + hpdefNeed) <= Experience.MAX_REAL_LEVEL * 2)
|
||||||
{
|
{
|
||||||
sb.append(hpdefNeed).append(" Defence/Hitpoints</br>");
|
sb.append(hpdefNeed).append(" Defence/Hitpoints</br>");
|
||||||
}
|
}
|
||||||
if ((rangedLevel + rangeNeed) <= 99)
|
if ((rangedLevel + rangeNeed) <= Experience.MAX_REAL_LEVEL)
|
||||||
{
|
{
|
||||||
sb.append(rangeNeed).append(" Ranged</br>");
|
sb.append(rangeNeed).append(" Ranged</br>");
|
||||||
}
|
}
|
||||||
if ((magicLevel + magicNeed) <= 99)
|
if ((magicLevel + magicNeed) <= Experience.MAX_REAL_LEVEL)
|
||||||
{
|
{
|
||||||
sb.append(magicNeed).append(" Magic</br>");
|
sb.append(magicNeed).append(" Magic</br>");
|
||||||
}
|
}
|
||||||
if ((prayerLevel + prayNeed) <= 99)
|
if ((prayerLevel + prayNeed) <= Experience.MAX_REAL_LEVEL)
|
||||||
{
|
{
|
||||||
sb.append(prayNeed).append(" Prayer");
|
sb.append(prayNeed).append(" Prayer");
|
||||||
}
|
}
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/***
|
/**
|
||||||
* Calculate skill levels required for increasing combat level, meant
|
* Calculate skill levels required for increasing combat level, meant
|
||||||
* for all combat skills besides ranged and magic.
|
* for all combat skills besides prayer, ranged, and magic.
|
||||||
* @param start initial value
|
* @param start initial value
|
||||||
* @param end ending value (combat level + 1)
|
* @param end ending value (combat level + 1)
|
||||||
* @param multiple how much adding one skill level will change combat
|
* @param multiple how much adding one skill level will change combat
|
||||||
@@ -149,10 +151,38 @@ class CombatLevelOverlay extends Overlay
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static int calcLevels(double start, int end, double multiple)
|
static int calcLevels(double start, int end, double multiple)
|
||||||
{
|
{
|
||||||
return (int) Math.ceil((end - start) / multiple);
|
return (int) Math.ceil(calcMultipliedLevels(start, end, multiple));
|
||||||
}
|
}
|
||||||
|
|
||||||
/***
|
/**
|
||||||
|
* Calculate skill levels for increasing combat level, meant ONLY for the Prayer skill.
|
||||||
|
* <p>
|
||||||
|
* Note: Prayer is a special case, only leveling up upon even level numbers. This is accounted
|
||||||
|
* for in this function.
|
||||||
|
* </p>
|
||||||
|
* @param start current combat level
|
||||||
|
* @param end ending value (combat level + 1)
|
||||||
|
* @param prayerLevel the player's current prayer level
|
||||||
|
* @return Prayer levels required to level up combat
|
||||||
|
*/
|
||||||
|
@VisibleForTesting
|
||||||
|
static int calcLevelsPray(double start, int end, int prayerLevel)
|
||||||
|
{
|
||||||
|
final int neededLevels = (int) Math.floor(calcMultipliedLevels(start, end, PRAY_MULT));
|
||||||
|
|
||||||
|
if ((prayerLevel + neededLevels) % 2 != 0)
|
||||||
|
{
|
||||||
|
return neededLevels + 1;
|
||||||
|
}
|
||||||
|
return neededLevels;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static double calcMultipliedLevels(double start, int end, double multiple)
|
||||||
|
{
|
||||||
|
return (end - start) / multiple;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
* Calculate skill levels required for increasing combat level, meant
|
* Calculate skill levels required for increasing combat level, meant
|
||||||
* ONLY for Ranged and Magic skills.
|
* ONLY for Ranged and Magic skills.
|
||||||
* @param start either the current ranged or magic level
|
* @param start either the current ranged or magic level
|
||||||
@@ -163,23 +193,7 @@ class CombatLevelOverlay extends Overlay
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static int calcLevelsRM(double start, int end, double dhp)
|
static int calcLevelsRM(double start, int end, double dhp)
|
||||||
{
|
{
|
||||||
start = Math.floor(start * 1.5) * 0.325;
|
start = Math.floor(start * RANGE_MAGIC_LEVEL_MULT) * RANGE_MAGIC_MULT;
|
||||||
return (int) Math.ceil((end - dhp - start) / 0.4875);
|
return (int) Math.ceil((end - dhp - start) / (RANGE_MAGIC_MULT * RANGE_MAGIC_LEVEL_MULT));
|
||||||
}
|
|
||||||
|
|
||||||
/***
|
|
||||||
* Corrects how many levels you need to level up combat through prayer.
|
|
||||||
* @param level current prayer level
|
|
||||||
* @param need needed prayer level calculated by calcLevels(...)
|
|
||||||
* @return a corrected number to increase combat through prayer only
|
|
||||||
*/
|
|
||||||
@VisibleForTesting
|
|
||||||
static int correctPrayer(int level, int need)
|
|
||||||
{
|
|
||||||
if ((level + need) % 2 == 1)
|
|
||||||
{
|
|
||||||
need++;
|
|
||||||
}
|
|
||||||
return need;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,8 +31,12 @@ import net.runelite.api.Client;
|
|||||||
import net.runelite.api.Player;
|
import net.runelite.api.Player;
|
||||||
import net.runelite.api.Skill;
|
import net.runelite.api.Skill;
|
||||||
import static net.runelite.client.plugins.combatlevel.CombatLevelOverlay.calcLevels;
|
import static net.runelite.client.plugins.combatlevel.CombatLevelOverlay.calcLevels;
|
||||||
|
import static net.runelite.client.plugins.combatlevel.CombatLevelOverlay.calcLevelsPray;
|
||||||
import static net.runelite.client.plugins.combatlevel.CombatLevelOverlay.calcLevelsRM;
|
import static net.runelite.client.plugins.combatlevel.CombatLevelOverlay.calcLevelsRM;
|
||||||
import static net.runelite.client.plugins.combatlevel.CombatLevelOverlay.correctPrayer;
|
import static net.runelite.client.plugins.combatlevel.CombatLevelOverlay.ATT_STR_MULT;
|
||||||
|
import static net.runelite.client.plugins.combatlevel.CombatLevelOverlay.DEF_HP_MULT;
|
||||||
|
import static net.runelite.client.plugins.combatlevel.CombatLevelOverlay.RANGE_MAGIC_LEVEL_MULT;
|
||||||
|
import static net.runelite.client.plugins.combatlevel.CombatLevelOverlay.RANGE_MAGIC_MULT;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -45,10 +49,6 @@ import java.util.HashMap;
|
|||||||
@RunWith(MockitoJUnitRunner.class)
|
@RunWith(MockitoJUnitRunner.class)
|
||||||
public class CombatLevelPluginTest
|
public class CombatLevelPluginTest
|
||||||
{
|
{
|
||||||
private static final double ATT_STR_MULT = 0.325;
|
|
||||||
private static final double DEF_HP_MULT = 0.25;
|
|
||||||
private static final double PRAY_MULT = 0.125;
|
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
@Bind
|
@Bind
|
||||||
private Client client;
|
private Client client;
|
||||||
@@ -73,10 +73,10 @@ public class CombatLevelPluginTest
|
|||||||
int rangedLevel = client.getRealSkillLevel(Skill.RANGED);
|
int rangedLevel = client.getRealSkillLevel(Skill.RANGED);
|
||||||
int prayerLevel = client.getRealSkillLevel(Skill.PRAYER);
|
int prayerLevel = client.getRealSkillLevel(Skill.PRAYER);
|
||||||
|
|
||||||
double base = 0.25 * (defenceLevel + hitpointsLevel + Math.floor(prayerLevel / 2));
|
double base = DEF_HP_MULT * (defenceLevel + hitpointsLevel + Math.floor(prayerLevel / 2));
|
||||||
double melee = 0.325 * (attackLevel + strengthLevel);
|
double melee = ATT_STR_MULT * (attackLevel + strengthLevel);
|
||||||
double range = 0.325 * Math.floor(rangedLevel * 1.5);
|
double range = RANGE_MAGIC_MULT * Math.floor(rangedLevel * RANGE_MAGIC_LEVEL_MULT);
|
||||||
double mage = 0.325 * Math.floor(magicLevel * 1.5);
|
double mage = RANGE_MAGIC_MULT * Math.floor(magicLevel * RANGE_MAGIC_LEVEL_MULT);
|
||||||
double max = Math.max(melee, Math.max(range, mage));
|
double max = Math.max(melee, Math.max(range, mage));
|
||||||
|
|
||||||
HashMap<String, Double> result = new HashMap<>();
|
HashMap<String, Double> result = new HashMap<>();
|
||||||
@@ -102,16 +102,15 @@ public class CombatLevelPluginTest
|
|||||||
|
|
||||||
// test attack/strength
|
// test attack/strength
|
||||||
assertEquals(2, calcLevels(baseValues.get("base") + baseValues.get("melee"),
|
assertEquals(2, calcLevels(baseValues.get("base") + baseValues.get("melee"),
|
||||||
player.getCombatLevel() + 1, ATT_STR_MULT));
|
player.getCombatLevel() + 1, ATT_STR_MULT));
|
||||||
|
|
||||||
// test defence/hitpoints
|
// test defence/hitpoints
|
||||||
assertEquals(3, calcLevels(baseValues.get("base") + baseValues.get("max"),
|
assertEquals(3, calcLevels(baseValues.get("base") + baseValues.get("max"),
|
||||||
player.getCombatLevel() + 1, DEF_HP_MULT));
|
player.getCombatLevel() + 1, DEF_HP_MULT));
|
||||||
|
|
||||||
// test prayer
|
// test prayer
|
||||||
int prayNeed = calcLevels(baseValues.get("base") + baseValues.get("max"),
|
assertEquals(5, calcLevelsPray(baseValues.get("base") + baseValues.get("max"),
|
||||||
player.getCombatLevel() + 1, PRAY_MULT);
|
player.getCombatLevel() + 1, client.getRealSkillLevel(Skill.PRAYER)));
|
||||||
assertEquals(5, correctPrayer(client.getRealSkillLevel(Skill.PRAYER), prayNeed));
|
|
||||||
|
|
||||||
// test ranged
|
// test ranged
|
||||||
assertEquals(2, calcLevelsRM(client.getRealSkillLevel(Skill.RANGED),
|
assertEquals(2, calcLevelsRM(client.getRealSkillLevel(Skill.RANGED),
|
||||||
@@ -145,9 +144,8 @@ public class CombatLevelPluginTest
|
|||||||
player.getCombatLevel() + 1, DEF_HP_MULT));
|
player.getCombatLevel() + 1, DEF_HP_MULT));
|
||||||
|
|
||||||
// test prayer
|
// test prayer
|
||||||
int prayNeed = calcLevels(baseValues.get("base") + baseValues.get("max"),
|
assertEquals(2, calcLevelsPray(baseValues.get("base") + baseValues.get("max"),
|
||||||
player.getCombatLevel() + 1, PRAY_MULT);
|
player.getCombatLevel() + 1, client.getRealSkillLevel(Skill.PRAYER)));
|
||||||
assertEquals(2, correctPrayer(client.getRealSkillLevel(Skill.PRAYER), prayNeed));
|
|
||||||
|
|
||||||
// test ranged
|
// test ranged
|
||||||
assertEquals(4, calcLevelsRM(client.getRealSkillLevel(Skill.RANGED),
|
assertEquals(4, calcLevelsRM(client.getRealSkillLevel(Skill.RANGED),
|
||||||
@@ -182,9 +180,8 @@ public class CombatLevelPluginTest
|
|||||||
player.getCombatLevel() + 1, DEF_HP_MULT));
|
player.getCombatLevel() + 1, DEF_HP_MULT));
|
||||||
|
|
||||||
// test prayer
|
// test prayer
|
||||||
int prayNeed = calcLevels(baseValues.get("base") + baseValues.get("max"),
|
assertEquals(4, calcLevelsPray(baseValues.get("base") + baseValues.get("max"),
|
||||||
player.getCombatLevel() + 1, PRAY_MULT);
|
player.getCombatLevel() + 1, client.getRealSkillLevel(Skill.PRAYER)));
|
||||||
assertEquals(4, correctPrayer(client.getRealSkillLevel(Skill.PRAYER), prayNeed));
|
|
||||||
|
|
||||||
// test ranged
|
// test ranged
|
||||||
assertEquals(17, calcLevelsRM(client.getRealSkillLevel(Skill.RANGED),
|
assertEquals(17, calcLevelsRM(client.getRealSkillLevel(Skill.RANGED),
|
||||||
@@ -219,9 +216,8 @@ public class CombatLevelPluginTest
|
|||||||
player.getCombatLevel() + 1, DEF_HP_MULT));
|
player.getCombatLevel() + 1, DEF_HP_MULT));
|
||||||
|
|
||||||
// test prayer
|
// test prayer
|
||||||
int prayNeed = calcLevels(baseValues.get("base") + baseValues.get("max"),
|
assertEquals(3, calcLevelsPray(baseValues.get("base") + baseValues.get("max"),
|
||||||
player.getCombatLevel() + 1, PRAY_MULT);
|
player.getCombatLevel() + 1, client.getRealSkillLevel(Skill.PRAYER)));
|
||||||
assertEquals(3, correctPrayer(client.getRealSkillLevel(Skill.PRAYER), prayNeed));
|
|
||||||
|
|
||||||
// test ranged
|
// test ranged
|
||||||
assertEquals(14, calcLevelsRM(client.getRealSkillLevel(Skill.RANGED),
|
assertEquals(14, calcLevelsRM(client.getRealSkillLevel(Skill.RANGED),
|
||||||
@@ -257,8 +253,26 @@ public class CombatLevelPluginTest
|
|||||||
player.getCombatLevel() + 1, DEF_HP_MULT));
|
player.getCombatLevel() + 1, DEF_HP_MULT));
|
||||||
|
|
||||||
// test prayer
|
// test prayer
|
||||||
int prayNeed = calcLevels(baseValues.get("base") + baseValues.get("max"),
|
assertEquals(4, calcLevelsPray(baseValues.get("base") + baseValues.get("max"),
|
||||||
player.getCombatLevel() + 1, PRAY_MULT);
|
player.getCombatLevel() + 1, client.getRealSkillLevel(Skill.PRAYER)));
|
||||||
assertEquals(4, correctPrayer(client.getRealSkillLevel(Skill.PRAYER), prayNeed));
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPrayerLevelsNeeded()
|
||||||
|
{
|
||||||
|
when(player.getCombatLevel()).thenReturn(124);
|
||||||
|
when(client.getRealSkillLevel(Skill.ATTACK)).thenReturn(99);
|
||||||
|
when(client.getRealSkillLevel(Skill.STRENGTH)).thenReturn(99);
|
||||||
|
when(client.getRealSkillLevel(Skill.DEFENCE)).thenReturn(99);
|
||||||
|
when(client.getRealSkillLevel(Skill.PRAYER)).thenReturn(89);
|
||||||
|
when(client.getRealSkillLevel(Skill.RANGED)).thenReturn(99);
|
||||||
|
when(client.getRealSkillLevel(Skill.MAGIC)).thenReturn(99);
|
||||||
|
when(client.getRealSkillLevel(Skill.HITPOINTS)).thenReturn(99);
|
||||||
|
|
||||||
|
HashMap<String, Double> baseValues = getBaseValues();
|
||||||
|
|
||||||
|
// test prayer
|
||||||
|
assertEquals(1, calcLevelsPray(baseValues.get("base") + baseValues.get("max"),
|
||||||
|
player.getCombatLevel() + 1, client.getRealSkillLevel(Skill.PRAYER)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user