module.exports = { /** * Growth rate * `2.576652002695681` */ growth: Math.pow(Math.PI / Math.E, 1.618) * Math.E * .75, /** * get XP range at specified level * @param {Number} level * @param {Number} multiplier */ xpRange(level, multiplier = global.multiplier || 1) { if (level < 0) throw new TypeError('level cannot be negative value') level = Math.floor(level) let min = level === 0 ? 0 : Math.round(Math.pow(level, this.growth) * multiplier) + 1 let max = Math.round(Math.pow(++level, this.growth) * multiplier) return { min, max, xp: max - min } }, /** * get level by xp * @param {Number} xp * @param {Number} multiplier */ findLevel(xp, multiplier = global.multiplier || 1) { if (xp === Infinity) return Infinity if (isNaN(xp)) return NaN if (xp <= 0) return -1 let level = 0 do level++ while (this.xpRange(level, multiplier).min <= xp) return --level }, /** * is able to level up? * @param {Number} level * @param {Number} xp * @param {Number} multiplier */ canLevelUp(level, xp, multiplier = global.multiplier || 1) { if (level < 0) return false if (xp === Infinity) return true if (isNaN(xp)) return false if (xp <= 0) return false return level < this.findLevel(xp, multiplier) } }