levelling.js 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. export const growth = Math.pow(Math.PI / Math.E, 1.618) * Math.E * .75;
  2. export function xpRange(level, multiplier = global.multiplier || 1) {
  3. if (level < 0) {
  4. throw new TypeError('level cannot be negative value');
  5. }
  6. level = Math.floor(level);
  7. const min = level === 0 ? 0 : Math.round(Math.pow(level, growth) * multiplier) + 1;
  8. const max = Math.round(Math.pow(++level, growth) * multiplier);
  9. return {
  10. min,
  11. max,
  12. xp: max - min,
  13. };
  14. }
  15. export function findLevel(xp, multiplier = global.multiplier || 1) {
  16. if (xp === Infinity) {
  17. return Infinity;
  18. }
  19. if (isNaN(xp)) {
  20. return NaN;
  21. }
  22. if (xp <= 0) {
  23. return -1;
  24. }
  25. let level = 0;
  26. do {
  27. level++;
  28. }
  29. while (xpRange(level, multiplier).min <= xp);
  30. return --level;
  31. }
  32. export function canLevelUp(level, xp, multiplier = global.multiplier || 1) {
  33. if (level < 0) {
  34. return false;
  35. }
  36. if (xp === Infinity) {
  37. return true;
  38. }
  39. if (isNaN(xp)) {
  40. return false;
  41. }
  42. if (xp <= 0) {
  43. return false;
  44. }
  45. return level < findLevel(xp, multiplier);
  46. }