package org.leumasjaffe.charsheet.view.level; import java.util.Arrays; import javax.swing.JOptionPane; import org.leumasjaffe.charsheet.model.DDCharacter; import org.leumasjaffe.charsheet.model.observable.IntValue; import org.leumasjaffe.observer.ObserverDispatch; import lombok.experimental.UtilityClass; @UtilityClass public class ExperienceDialog { private int[] EXPERIENCE_CACHE; static { final int levelsToCalc = 20; EXPERIENCE_CACHE = new int[levelsToCalc]; for (int i = 0; i < levelsToCalc; ++i) { EXPERIENCE_CACHE[i] = experienceForLevel(i+1); } } public void gainExperience(DDCharacter model) { final String input = JOptionPane.showInputDialog("How much experience"); if (input == null || input.isEmpty()) return; final int exp = Integer.parseInt(input); if (exp <= 0) return; final IntValue mdlExp = model.getExperience(); mdlExp.value(mdlExp.value()+exp); ObserverDispatch.notifySubscribers(mdlExp, null); } public static int computeLevelsNeeded(DDCharacter chara, int bonusLevels) { final int exp = chara.getExperience().value(); final int currentLevel = chara.getLevel(); final int expectedLevel = Math.abs(Arrays.binarySearch(EXPERIENCE_CACHE, exp) + 1); return bonusLevels + expectedLevel - currentLevel; } public int experienceForLevel(int level) { return 500 * level * (level - 1); } }