diff --git a/laf-cloud/functions/dailyTaskConfig.ts b/laf-cloud/functions/dailyTaskConfig.ts index fa04bf3..7ad3cc5 100644 --- a/laf-cloud/functions/dailyTaskConfig.ts +++ b/laf-cloud/functions/dailyTaskConfig.ts @@ -55,26 +55,27 @@ type Candidate = { const reward = (type: RewardItem["type"], count: number): RewardItem => ({ type, count }); // 每组中的条目为等概率互斥选项,生成任务时选定一个并写入 rewards。 +// 沙漏、火箭及其无限时长奖励尚未开放,暂不加入候选;类型定义保留以兼容历史数据。 export const DAILY_REWARD_OPTIONS: Record> = { A: { - 2: [reward("coin", 100), reward("hourglass", 1)], - 3: [reward("coin", 150), reward("hourglass", 2)], + 2: [reward("coin", 100)], + 3: [reward("coin", 150)], 4: [reward("infinite_health", 900)], - 5: [reward("coin", 200), reward("freeze", 1), reward("rocket", 1)], + 5: [reward("coin", 200), reward("freeze", 1)], 6: [reward("coin", 300), reward("magic_wand", 1)], }, B: { - 3: [reward("coin", 150), reward("hourglass", 2)], - 4: [reward("freeze", 1), reward("rocket", 1)], + 3: [reward("coin", 150)], + 4: [reward("freeze", 1)], 5: [reward("magic_wand", 1)], 6: [reward("hammer", 1)], }, C: { - 2: [reward("coin", 150), reward("hourglass", 2)], + 2: [reward("coin", 150)], 3: [reward("infinite_health", 900)], - 4: [reward("coin", 300), reward("rocket", 1)], + 4: [reward("coin", 300)], 5: [reward("infinite_health", 1800)], - 6: [reward("coin", 500), reward("infinite_rocket", 1800)], + 6: [reward("coin", 500)], }, D: { 2: [reward("infinite_health", 900)], diff --git a/laf-cloud/tests/daily-task-config.test.mjs b/laf-cloud/tests/daily-task-config.test.mjs index 5598802..63d5eba 100644 --- a/laf-cloud/tests/daily-task-config.test.mjs +++ b/laf-cloud/tests/daily-task-config.test.mjs @@ -94,3 +94,25 @@ test('existing generated rewards survive configuration rollout until their next const week=refreshTaskData(next,'existing',20,now+7*86400000).data; assert.deepEqual(week.weeklyRewards,WEEKLY_REWARDS); }); + + +test('unfinished hourglass and rocket rewards stay out of daily and weekly configuration', () => { + const disabled = new Set(['hourglass', 'rocket', 'infinite_hourglass', 'infinite_rocket']); + const expected = { + A: {2:[['coin',100]],3:[['coin',150]],4:[['infinite_health',900]],5:[['coin',200],['freeze',1]],6:[['coin',300],['magic_wand',1]]}, + B: {3:[['coin',150]],4:[['freeze',1]],5:[['magic_wand',1]],6:[['hammer',1]]}, + C: {2:[['coin',150]],3:[['infinite_health',900]],4:[['coin',300]],5:[['infinite_health',1800]],6:[['coin',500]]}, + D: {2:[['infinite_health',900]],3:[['coin',100]],4:[['infinite_health',900]],5:[['coin',200]],6:[['coin',300]]}, + E: {2:[['infinite_health',900]],3:[['infinite_health',900]]}, + }; + for (const [group, tiers] of Object.entries(expected)) { + for (const [stars, rewards] of Object.entries(tiers)) { + assert.deepEqual(DAILY_REWARD_OPTIONS[group][stars], rewards.map(([type,count])=>({type,count}))); + } + } + for (const task of Object.values(DAILY_TASK_POOLS).flat()) { + assert.ok(task.rewardOptions.length > 0, task.taskId); + assert.ok(task.rewardOptions.every(reward => !disabled.has(reward.type)), task.taskId); + } + assert.ok(WEEKLY_REWARDS.every(tier => tier.rewards.every(reward => !disabled.has(reward.type)))); +});