fix: ensure nightwave weekly challenges are unique #2423

Merged
Sainan merged 2 commits from unique-weekly into main 2025-07-06 20:13:43 -07:00
Showing only changes of commit ae1026df67 - Show all commits

View File

@ -395,34 +395,48 @@ const getSeasonDailyChallenge = (pools: IRotatingSeasonChallengePools, day: numb
}; };
}; };
const getSeasonWeeklyChallenge = (pools: IRotatingSeasonChallengePools, week: number, id: number): ISeasonChallenge => { const pushSeasonWeeklyChallenge = (
const weekStart = EPOCH + week * 604800000; activeChallenges: ISeasonChallenge[],
const weekEnd = weekStart + 604800000;
const challengeId = week * 7 + id;
const rng = new SRng(new SRng(challengeId).randomInt(0, 100_000));
return {
_id: { $oid: "67e1bb2d9d00cb47" + challengeId.toString().padStart(8, "0") },
Activation: { $date: { $numberLong: weekStart.toString() } },
Expiry: { $date: { $numberLong: weekEnd.toString() } },
Challenge: rng.randomElement(pools.weekly)!
};
};
const getSeasonWeeklyHardChallenge = (
pools: IRotatingSeasonChallengePools, pools: IRotatingSeasonChallengePools,
week: number, week: number,
id: number id: number
): ISeasonChallenge => { ): void => {
const weekStart = EPOCH + week * 604800000; const weekStart = EPOCH + week * 604800000;
const weekEnd = weekStart + 604800000; const weekEnd = weekStart + 604800000;
const challengeId = week * 7 + id; const challengeId = week * 7 + id;
const rng = new SRng(new SRng(challengeId).randomInt(0, 100_000)); const rng = new SRng(new SRng(challengeId).randomInt(0, 100_000));
return { let challenge: string;
do {
challenge = rng.randomElement(pools.weekly)!;
} while (activeChallenges.some(x => x.Challenge == challenge));
activeChallenges.push({
_id: { $oid: "67e1bb2d9d00cb47" + challengeId.toString().padStart(8, "0") }, _id: { $oid: "67e1bb2d9d00cb47" + challengeId.toString().padStart(8, "0") },
Activation: { $date: { $numberLong: weekStart.toString() } }, Activation: { $date: { $numberLong: weekStart.toString() } },
Expiry: { $date: { $numberLong: weekEnd.toString() } }, Expiry: { $date: { $numberLong: weekEnd.toString() } },
Challenge: rng.randomElement(pools.hardWeekly)! Challenge: challenge
});
}; };
const pushSeasonWeeklyHardChallenge = (
activeChallenges: ISeasonChallenge[],
pools: IRotatingSeasonChallengePools,
week: number,
id: number
): void => {
const weekStart = EPOCH + week * 604800000;
const weekEnd = weekStart + 604800000;
const challengeId = week * 7 + id;
const rng = new SRng(new SRng(challengeId).randomInt(0, 100_000));
let challenge: string;
do {
challenge = rng.randomElement(pools.hardWeekly)!;
} while (activeChallenges.some(x => x.Challenge == challenge));
activeChallenges.push({
_id: { $oid: "67e1bb2d9d00cb47" + challengeId.toString().padStart(8, "0") },
Activation: { $date: { $numberLong: weekStart.toString() } },
Expiry: { $date: { $numberLong: weekEnd.toString() } },
Challenge: challenge
});
}; };
const pushWeeklyActs = ( const pushWeeklyActs = (
@ -433,8 +447,8 @@ const pushWeeklyActs = (
const weekStart = EPOCH + week * 604800000; const weekStart = EPOCH + week * 604800000;
const weekEnd = weekStart + 604800000; const weekEnd = weekStart + 604800000;
activeChallenges.push(getSeasonWeeklyChallenge(pools, week, 0)); pushSeasonWeeklyChallenge(activeChallenges, pools, week, 0);
activeChallenges.push(getSeasonWeeklyChallenge(pools, week, 1)); pushSeasonWeeklyChallenge(activeChallenges, pools, week, 1);
if (pools.hasWeeklyPermanent) { if (pools.hasWeeklyPermanent) {
activeChallenges.push({ activeChallenges.push({
_id: { $oid: "67e1b96e9d00cb47" + (week * 7 + 0).toString().padStart(8, "0") }, _id: { $oid: "67e1b96e9d00cb47" + (week * 7 + 0).toString().padStart(8, "0") },
@ -454,14 +468,14 @@ const pushWeeklyActs = (
Expiry: { $date: { $numberLong: weekEnd.toString() } }, Expiry: { $date: { $numberLong: weekEnd.toString() } },
Challenge: "/Lotus/Types/Challenges/Seasons/Weekly/SeasonWeeklyPermanentKillEnemies" Challenge: "/Lotus/Types/Challenges/Seasons/Weekly/SeasonWeeklyPermanentKillEnemies"
}); });
activeChallenges.push(getSeasonWeeklyHardChallenge(pools, week, 2)); pushSeasonWeeklyHardChallenge(activeChallenges, pools, week, 2);
activeChallenges.push(getSeasonWeeklyHardChallenge(pools, week, 3)); pushSeasonWeeklyHardChallenge(activeChallenges, pools, week, 3);
} else { } else {
activeChallenges.push(getSeasonWeeklyChallenge(pools, week, 2)); pushSeasonWeeklyChallenge(activeChallenges, pools, week, 2);
activeChallenges.push(getSeasonWeeklyChallenge(pools, week, 3)); pushSeasonWeeklyChallenge(activeChallenges, pools, week, 3);
activeChallenges.push(getSeasonWeeklyChallenge(pools, week, 4)); pushSeasonWeeklyChallenge(activeChallenges, pools, week, 4);
activeChallenges.push(getSeasonWeeklyHardChallenge(pools, week, 5)); pushSeasonWeeklyHardChallenge(activeChallenges, pools, week, 5);
activeChallenges.push(getSeasonWeeklyHardChallenge(pools, week, 6)); pushSeasonWeeklyHardChallenge(activeChallenges, pools, week, 6);
} }
}; };