Crossfire JXClient, Trunk  R20561
ExperienceTable.java
Go to the documentation of this file.
1 /*
2  * This file is part of JXClient, the Fullscreen Java Crossfire Client.
3  *
4  * JXClient is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * JXClient is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with JXClient; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  *
18  * Copyright (C) 2005-2008 Yann Chachkoff.
19  * Copyright (C) 2006-2011 Andreas Kirschbaum.
20  */
21 
22 package com.realtime.crossfire.jxclient.stats;
23 
24 import java.util.HashMap;
25 import java.util.Map;
26 import org.jetbrains.annotations.NotNull;
27 
32 public class ExperienceTable {
33 
37  @NotNull
38  private final Map<Integer, Long> info = new HashMap<>();
39 
43  private int minLevel;
44 
48  private int maxLevel;
49 
53  private void clear() {
54  info.clear();
55  minLevel = Integer.MAX_VALUE;
56  maxLevel = Integer.MIN_VALUE;
57  }
58 
64  private void add(final int level, final long exp) {
65  if (level < 1) {
66  return;
67  }
68 
69  info.put(level, exp);
70  if (minLevel > level) {
71  minLevel = level;
72  }
73  if (maxLevel < level) {
74  maxLevel = level;
75  }
76  }
77 
83  private long getExperience(final int level) {
84  if (minLevel >= maxLevel) {
85  return 0;
86  }
87 
88  final Long exp = info.get(level);
89  if (exp != null) {
90  return exp;
91  }
92 
93  if (level < minLevel) {
94  return info.get(minLevel);
95  }
96 
97  if (level > maxLevel) {
98  return maxLevel;
99  }
100 
101  for (int i = level; i < maxLevel; i++) {
102  final Long tmp = info.get(i);
103  if (tmp != null) {
104  return tmp;
105  }
106  }
107 
108  throw new AssertionError();
109  }
110 
117  public long getExperienceToNextLevel(final int currentLevel, final long currentExp) {
118  final long expNextLevel = getExperience(currentLevel+1);
119  return Math.max(0, expNextLevel-currentExp);
120  }
121 
130  public int getPercentsToNextLevel(final int currentLevel, final long currentExp) {
131  final long expThisLevel = getExperience(currentLevel);
132  final long expNextLevel = getExperience(currentLevel+1);
133  if (expThisLevel >= expNextLevel) {
134  return 0;
135  }
136 
137  if (currentExp < expThisLevel) {
138  return 0;
139  }
140  if (currentExp >= expNextLevel) {
141  return 100;
142  }
143 
144  return (int)((currentExp-expThisLevel)*100/(expNextLevel-expThisLevel));
145  }
146 
151  public void setExpTable(@NotNull final long[] expTable) {
152  clear();
153  for (int level = 1; level < expTable.length; level++) {
154  add(level, expTable[level]);
155  }
156  }
157 
158 }
int maxLevel
The maximum level value in info.
long getExperienceToNextLevel(final int currentLevel, final long currentExp)
Returns the experience needed to reach the next level.
int getPercentsToNextLevel(final int currentLevel, final long currentExp)
Returns the experience fraction of the current level in percents.
void add(final int level, final long exp)
Adds a new level->experience mapping.
void clear()
Forgets about all level-$> mappings.
long getExperience(final int level)
Returns the experience needed for a given level.
final Map< Integer, Long > info
Maps level to experience needed to reach the level.
void setExpTable(@NotNull final long[] expTable)
Updates the experience table information.
int minLevel
The minimum level value in info.