00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 package com.realtime.crossfire.jxclient.stats;
00023
00024 import java.util.HashMap;
00025 import java.util.Map;
00026 import org.jetbrains.annotations.NotNull;
00027
00032 public class ExperienceTable {
00033
00037 @NotNull
00038 private final Map<Integer, Long> info = new HashMap<Integer, Long>();
00039
00043 private int minLevel = 0;
00044
00048 private int maxLevel = 0;
00049
00053 private void clear() {
00054 info.clear();
00055 minLevel = Integer.MAX_VALUE;
00056 maxLevel = Integer.MIN_VALUE;
00057 }
00058
00064 private void add(final int level, final long exp) {
00065 if (level < 1) {
00066 return;
00067 }
00068
00069 info.put(level, exp);
00070 if (minLevel > level) {
00071 minLevel = level;
00072 }
00073 if (maxLevel < level) {
00074 maxLevel = level;
00075 }
00076 }
00077
00083 private long getExperience(final int level) {
00084 if (minLevel >= maxLevel) {
00085 return 0;
00086 }
00087
00088 final Long exp = info.get(level);
00089 if (exp != null) {
00090 return exp;
00091 }
00092
00093 if (level < minLevel) {
00094 return info.get(minLevel);
00095 }
00096
00097 if (level > maxLevel) {
00098 return maxLevel;
00099 }
00100
00101 for (int i = level; i < maxLevel; i++) {
00102 final Long tmp = info.get(i);
00103 if (tmp != null) {
00104 return tmp;
00105 }
00106 }
00107
00108 throw new AssertionError();
00109 }
00110
00117 public long getExperienceToNextLevel(final int currentLevel, final long currentExp) {
00118 final long expNextLevel = getExperience(currentLevel+1);
00119 return Math.max(0, expNextLevel-currentExp);
00120 }
00121
00130 public int getPercentsToNextLevel(final int currentLevel, final long currentExp) {
00131 final long expThisLevel = getExperience(currentLevel);
00132 final long expNextLevel = getExperience(currentLevel+1);
00133 if (expThisLevel >= expNextLevel) {
00134 return 0;
00135 }
00136
00137 if (currentExp < expThisLevel) {
00138 return 0;
00139 }
00140 if (currentExp >= expNextLevel) {
00141 return 100;
00142 }
00143
00144 return (int)((currentExp-expThisLevel)*100/(expNextLevel-expThisLevel));
00145 }
00146
00151 public void setExpTable(@NotNull final long[] expTable) {
00152 clear();
00153 for (int level = 1; level < expTable.length; level++) {
00154 add(level, expTable[level]);
00155 }
00156 }
00157
00158 }