Jump to content

ExperienceTable Class / snippet


Botre

Recommended Posts

LAST UPDATE: MARCH 26, 2015

package org.bjornkrols.experience;
import java.util.Arrays;

/**
 * @author 		Bjorn Krols (Botre)
 * @version		0.1
 * @since		March 6, 2015
 */

public final class ExperienceTable {
	/**
	 * The maximum skill level in OSRS.
	 */
	private static final int MAXIMUM_LEVEL = 99;
	
	/**
	 * A table holding the experience amounts for a specific number of levels.
	 */
	private static final int[] TABLE = create(MAXIMUM_LEVEL);

	private ExperienceTable() { 
		// This class should never be instantiated.
		// Do not delete or make accessible.
	}
	
	/**
	 * @return The total amount of experience required for the level.
	 */
	public static int getXp(int level) {
		return level == 0 ? 0 : TABLE[level - 1];
	}

	/**
	 * @return The level acquired by the amount of experience.
	 */
	public static int getLevel(int experience) {
		return Math.abs(Arrays.binarySearch(TABLE, experience) + 1);
	}

	/**
	 * Creates the experience table.
	 */
	private static int[] create(int maximumLevel) {
		int[] table = new int[maximumLevel];
		int experience = 0;
		for (int i = 1; i < maximumLevel; i++) {
			experience += Math.floor(i + 300 * Math.pow(2, i / 7.0));
			table[i] = (int) Math.floor(experience / 4);
		}
		return table;
	}

}
Edited by Botre
  • Like 4
Link to comment
Share on other sites

Oh sweet, Its cool that you're actually calculating the exp rather than using a static table biggrin.png

 

apa

 

It still uses table look-up (because it's cheaper).

 

I made it generate the table though, because otherwise certain people will cry about it not being flexible (I personally really doubt they'll ever implement levels > 126 but whatever).

Link to comment
Share on other sites

Yeah but no. Ever heard of polymorphism? Enjoy updating all your scripts if Jagex decides to increase the max level from 99 - 500.

	public RSExperienceTable() {
		generateTable(126);
	}

to

	public RSExperienceTable() {
		generateTable(500);
	}

It would take 5 seconds. And it's unlikely I'll ever have to pay that time price :p

 

If they were to update it to 500 with the current formula it would take 536870911 xp.

Meaning you would have to calc a long every x seconds.

But why stop at 500?

Why not make the calculation return a BigDecimal, just to be safe, in case they add decimal levels?

Link to comment
Share on other sites

import java.util.Arrays;

/**
 * 
 * @author Bjorn Krols (Botre)
 *
 */

public final class RSExperienceTable {

	int[] table;

	public RSExperienceTable() {
		generateTable(126);
	}

	public RSExperienceTable(int maxLevel) {
		generateTable(maxLevel);
	}

	public int getXp(int level) {
		return level == 0 ? 0 : table[level - 1];
	}

	public int getLevel(int experience) {
		return Math.abs(Arrays.binarySearch(table, experience) + 1);
	}

	private void generateTable(int maxLevel) {
		int[] table = new int[maxLevel];
		int experience = 0;
		for (int i = 1; i < maxLevel; i++) {
			experience += Math.floor(i + 300 * Math.pow(2, i / 7.0));
			table[i] = Math.floorDiv(experience, 4);
		}
		this.table = table;
	}

} 
  

Why final :o

what swiz said. How you going to use an instances when is final.

Link to comment
Share on other sites

Because I decided that's where that inheritance branch should end :ph34r:

There's no need for it to been extendable.

Making a class final really just makes it unextendable ^^

Lol what? Do you even know what final does?

it was pretty late when I replied and I had it mixed up lol. Edited by josedpay
  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...