ExperienceDialog.java 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package org.leumasjaffe.charsheet.view.level;
  2. import java.util.Arrays;
  3. import javax.swing.JOptionPane;
  4. import org.leumasjaffe.charsheet.model.DDCharacter;
  5. import org.leumasjaffe.charsheet.model.observable.IntValue;
  6. import org.leumasjaffe.observer.ObserverDispatch;
  7. import lombok.experimental.UtilityClass;
  8. @UtilityClass
  9. public class ExperienceDialog {
  10. private int[] EXPERIENCE_CACHE;
  11. static {
  12. final int levelsToCalc = 20;
  13. EXPERIENCE_CACHE = new int[levelsToCalc];
  14. for (int i = 0; i < levelsToCalc; ++i) {
  15. EXPERIENCE_CACHE[i] = experienceForLevel(i+1);
  16. }
  17. }
  18. public void gainExperience(DDCharacter model) {
  19. final String input = JOptionPane.showInputDialog("How much experience");
  20. if (input == null || input.isEmpty()) return;
  21. final int exp = Integer.parseInt(input);
  22. if (exp <= 0) return;
  23. final IntValue mdlExp = model.getExperience();
  24. mdlExp.value(mdlExp.value()+exp);
  25. ObserverDispatch.notifySubscribers(mdlExp, null);
  26. }
  27. public static int computeLevelsNeeded(DDCharacter chara, int bonusLevels) {
  28. final int exp = chara.getExperience().value();
  29. final int currentLevel = chara.getLevel();
  30. final int expectedLevel = Math.abs(Arrays.binarySearch(EXPERIENCE_CACHE, exp) + 1);
  31. return bonusLevels + expectedLevel - currentLevel;
  32. }
  33. public int experienceForLevel(int level) {
  34. return 500 * level * (level - 1);
  35. }
  36. }