// 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 }