forked from OpenWF/SpaceNinjaServer
chore: improve randomness of void storm missions (#2428)
Instead of alternating the mission pool every hour, we now use sequentiallyUniqueRandomElement which should ensure that we don't duplicate any of the last x missions (x = 3 for Lith & Axi and x = 1 Meso & Neo). Reviewed-on: OpenWF/SpaceNinjaServer#2428 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
This commit is contained in:
parent
1545cdb8ce
commit
d6145561fd
@ -971,25 +971,26 @@ const getCalendarSeason = (week: number): ICalendarSeason => {
|
||||
|
||||
// Not very faithful, but to avoid the same node coming up back-to-back (which is not valid), I've split these into 2 arrays which we're alternating between.
|
||||
|
||||
const voidStormMissionsA = {
|
||||
VoidT1: ["CrewBattleNode519", "CrewBattleNode518", "CrewBattleNode515", "CrewBattleNode503"],
|
||||
VoidT2: ["CrewBattleNode501", "CrewBattleNode534", "CrewBattleNode530"],
|
||||
VoidT3: ["CrewBattleNode521", "CrewBattleNode516"],
|
||||
const voidStormMissions = {
|
||||
VoidT1: [
|
||||
"CrewBattleNode519",
|
||||
"CrewBattleNode518",
|
||||
"CrewBattleNode515",
|
||||
"CrewBattleNode503",
|
||||
"CrewBattleNode509",
|
||||
"CrewBattleNode522",
|
||||
"CrewBattleNode511",
|
||||
"CrewBattleNode512"
|
||||
],
|
||||
VoidT2: ["CrewBattleNode501", "CrewBattleNode534", "CrewBattleNode530", "CrewBattleNode535", "CrewBattleNode533"],
|
||||
VoidT3: ["CrewBattleNode521", "CrewBattleNode516", "CrewBattleNode524", "CrewBattleNode525"],
|
||||
VoidT4: [
|
||||
"CrewBattleNode555",
|
||||
"CrewBattleNode553",
|
||||
"CrewBattleNode554",
|
||||
"CrewBattleNode539",
|
||||
"CrewBattleNode531",
|
||||
"CrewBattleNode527"
|
||||
]
|
||||
};
|
||||
|
||||
const voidStormMissionsB = {
|
||||
VoidT1: ["CrewBattleNode509", "CrewBattleNode522", "CrewBattleNode511", "CrewBattleNode512"],
|
||||
VoidT2: ["CrewBattleNode535", "CrewBattleNode533"],
|
||||
VoidT3: ["CrewBattleNode524", "CrewBattleNode525"],
|
||||
VoidT4: [
|
||||
"CrewBattleNode527",
|
||||
"CrewBattleNode542",
|
||||
"CrewBattleNode538",
|
||||
"CrewBattleNode543",
|
||||
@ -997,18 +998,21 @@ const voidStormMissionsB = {
|
||||
"CrewBattleNode550",
|
||||
"CrewBattleNode529"
|
||||
]
|
||||
};
|
||||
} as const;
|
||||
|
||||
const voidStormLookbehind = {
|
||||
VoidT1: 3,
|
||||
VoidT2: 1,
|
||||
VoidT3: 1,
|
||||
VoidT4: 3
|
||||
} as const;
|
||||
|
||||
const pushVoidStorms = (arr: IVoidStorm[], hour: number): void => {
|
||||
const activation = hour * unixTimesInMs.hour + 40 * unixTimesInMs.minute;
|
||||
const expiry = activation + 90 * unixTimesInMs.minute;
|
||||
let accum = 0;
|
||||
const rng = new SRng(new SRng(hour).randomInt(0, 100_000));
|
||||
const voidStormMissions = structuredClone(hour & 1 ? voidStormMissionsA : voidStormMissionsB);
|
||||
const tierIdx = { VoidT1: hour * 2, VoidT2: hour, VoidT3: hour, VoidT4: hour * 2 };
|
||||
for (const tier of ["VoidT1", "VoidT1", "VoidT2", "VoidT3", "VoidT4", "VoidT4"] as const) {
|
||||
const idx = rng.randomInt(0, voidStormMissions[tier].length - 1);
|
||||
const node = voidStormMissions[tier][idx];
|
||||
voidStormMissions[tier].splice(idx, 1);
|
||||
arr.push({
|
||||
_id: {
|
||||
$oid:
|
||||
@ -1016,7 +1020,12 @@ const pushVoidStorms = (arr: IVoidStorm[], hour: number): void => {
|
||||
"0321e89b" +
|
||||
(accum++).toString().padStart(8, "0")
|
||||
},
|
||||
Node: node,
|
||||
Node: sequentiallyUniqueRandomElement(
|
||||
voidStormMissions[tier],
|
||||
tierIdx[tier]++,
|
||||
voidStormLookbehind[tier],
|
||||
2051969264
|
||||
)!,
|
||||
Activation: { $date: { $numberLong: activation.toString() } },
|
||||
Expiry: { $date: { $numberLong: expiry.toString() } },
|
||||
ActiveMissionTier: tier
|
||||
|
Loading…
x
Reference in New Issue
Block a user