level.js
957 Bytes
// ponytail: 等级门槛先写成常量(PRD:由运营配置);要在后台改时与稀有度区间一起换成配置表。
/** 第 n 级(从 1 起)所需的累计 XP。经验 = 结算到手的积分。 */
const LEVEL_MIN_XP = Object.freeze([0, 100, 300, 600, 1000, 1500, 2100, 2800, 3600, 4500])
export const MAX_LEVEL = LEVEL_MIN_XP.length
/**
* @param {number} xp 非负整数
* @returns {number} 1 – MAX_LEVEL
*/
export function levelForXp(xp) {
if (!Number.isSafeInteger(xp) || xp < 0) throw new Error(`levelForXp: xp invalid: ${xp}`)
return LEVEL_MIN_XP.findLastIndex((min) => xp >= min) + 1
}
/**
* 排行榜与周目标的周:周一 00:00 UTC 起算(每周一重置)。
* @param {Date} now
* @returns {Date}
*/
export function weekStart(now) {
const day = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()))
day.setUTCDate(day.getUTCDate() - ((day.getUTCDay() + 6) % 7))
return day
}