From 0b757572776b0b9bcd98523371d4281d589fdcfe Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Fri, 25 Apr 2025 11:53:54 -0700 Subject: [PATCH] chore: improve distribution of rewardSeed (#1831) This was previously not ideal due to float imprecision, but now it's 64 bits and there's enough entropy for all of them. Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1831 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com> --- src/models/inventoryModels/inventoryModel.ts | 2 +- src/services/inventoryService.ts | 13 +++++++++---- src/types/inventoryTypes/inventoryTypes.ts | 4 ++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index 2e09caf8..c9dd4be8 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -390,7 +390,7 @@ MailboxSchema.set("toJSON", { const DuviriInfoSchema = new Schema( { - Seed: Number, + Seed: BigInt, NumCompletions: { type: Number, default: 0 } }, { diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index 94554299..9d1bf0ed 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -120,10 +120,15 @@ export const createInventory = async ( } }; -export const generateRewardSeed = (): number => { - const min = -Number.MAX_SAFE_INTEGER; - const max = Number.MAX_SAFE_INTEGER; - return Math.floor(Math.random() * (max - min + 1)) + min; +export const generateRewardSeed = (): bigint => { + const hiDword = getRandomInt(0, 0x7fffffff); + const loDword = getRandomInt(0, 0xffffffff); + let seed = (BigInt(hiDword) << 32n) | BigInt(loDword); + if (Math.random() < 0.5) { + seed *= -1n; + seed -= 1n; + } + return seed; }; //TODO: RawUpgrades might need to return a LastAdded diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index 66ce5b3c..b7c63a75 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -134,7 +134,7 @@ export const equipmentKeys = [ export type TEquipmentKey = (typeof equipmentKeys)[number]; export interface IDuviriInfo { - Seed: number; + Seed: bigint; NumCompletions: number; } @@ -202,7 +202,7 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu Mailbox?: IMailboxClient; SubscribedToEmails: number; Created: IMongoDate; - RewardSeed: number | bigint; + RewardSeed: bigint; RegularCredits: number; PremiumCredits: number; PremiumCreditsFree: number;