From ae1026df67eaa728e4a00ef73c39d3df32a5b1d7 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Sun, 6 Jul 2025 07:17:39 +0200 Subject: [PATCH] fix: ensure nightwave weekly challenges are unique --- src/services/worldStateService.ts | 68 +++++++++++++++++++------------ 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/src/services/worldStateService.ts b/src/services/worldStateService.ts index cd4139ac..dac84c0f 100644 --- a/src/services/worldStateService.ts +++ b/src/services/worldStateService.ts @@ -395,34 +395,48 @@ const getSeasonDailyChallenge = (pools: IRotatingSeasonChallengePools, day: numb }; }; -const getSeasonWeeklyChallenge = (pools: IRotatingSeasonChallengePools, week: number, id: number): ISeasonChallenge => { - 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)); - 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 = ( +const pushSeasonWeeklyChallenge = ( + activeChallenges: ISeasonChallenge[], pools: IRotatingSeasonChallengePools, week: number, id: number -): ISeasonChallenge => { +): 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)); - 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") }, Activation: { $date: { $numberLong: weekStart.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 = ( @@ -433,8 +447,8 @@ const pushWeeklyActs = ( const weekStart = EPOCH + week * 604800000; const weekEnd = weekStart + 604800000; - activeChallenges.push(getSeasonWeeklyChallenge(pools, week, 0)); - activeChallenges.push(getSeasonWeeklyChallenge(pools, week, 1)); + pushSeasonWeeklyChallenge(activeChallenges, pools, week, 0); + pushSeasonWeeklyChallenge(activeChallenges, pools, week, 1); if (pools.hasWeeklyPermanent) { activeChallenges.push({ _id: { $oid: "67e1b96e9d00cb47" + (week * 7 + 0).toString().padStart(8, "0") }, @@ -454,14 +468,14 @@ const pushWeeklyActs = ( Expiry: { $date: { $numberLong: weekEnd.toString() } }, Challenge: "/Lotus/Types/Challenges/Seasons/Weekly/SeasonWeeklyPermanentKillEnemies" }); - activeChallenges.push(getSeasonWeeklyHardChallenge(pools, week, 2)); - activeChallenges.push(getSeasonWeeklyHardChallenge(pools, week, 3)); + pushSeasonWeeklyHardChallenge(activeChallenges, pools, week, 2); + pushSeasonWeeklyHardChallenge(activeChallenges, pools, week, 3); } else { - activeChallenges.push(getSeasonWeeklyChallenge(pools, week, 2)); - activeChallenges.push(getSeasonWeeklyChallenge(pools, week, 3)); - activeChallenges.push(getSeasonWeeklyChallenge(pools, week, 4)); - activeChallenges.push(getSeasonWeeklyHardChallenge(pools, week, 5)); - activeChallenges.push(getSeasonWeeklyHardChallenge(pools, week, 6)); + pushSeasonWeeklyChallenge(activeChallenges, pools, week, 2); + pushSeasonWeeklyChallenge(activeChallenges, pools, week, 3); + pushSeasonWeeklyChallenge(activeChallenges, pools, week, 4); + pushSeasonWeeklyHardChallenge(activeChallenges, pools, week, 5); + pushSeasonWeeklyHardChallenge(activeChallenges, pools, week, 6); } };