From 89309aae195dcde7518c33b669307c77645d9f4f Mon Sep 17 00:00:00 2001 From: Sainan Date: Mon, 3 Mar 2025 06:44:25 +0100 Subject: [PATCH] fix not using weighted RNG --- src/controllers/api/dronesController.ts | 5 +++-- src/services/rngService.ts | 20 +++++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/controllers/api/dronesController.ts b/src/controllers/api/dronesController.ts index d84be238..c52a7ed9 100644 --- a/src/controllers/api/dronesController.ts +++ b/src/controllers/api/dronesController.ts @@ -2,7 +2,7 @@ import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers"; import { config } from "@/src/services/configService"; import { addMiscItems, getInventory } from "@/src/services/inventoryService"; import { getAccountIdForRequest } from "@/src/services/loginService"; -import { getRandomElement, getRandomInt } from "@/src/services/rngService"; +import { getRandomInt, getRandomWeightedReward3 } from "@/src/services/rngService"; import { IMongoDate, IOid } from "@/src/types/commonTypes"; import { IDroneClient } from "@/src/types/inventoryTypes/inventoryTypes"; import { IInventoryChanges } from "@/src/types/purchaseTypes"; @@ -55,7 +55,8 @@ export const dronesController: RequestHandler = async (req, res) => { : new Date(Date.now() + getRandomInt(3, 4) * 3600_000); drone.PendingDamage = getRandomInt(system.droneDamage.minValue, system.droneDamage.maxValue); } - const resource = getRandomElement(system.resources); + const resource = getRandomWeightedReward3(system.resources, droneMeta.probabilities)!; + //logger.debug(`drone rolled`, resource); drone.ResourceType = "/Lotus/" + resource.StoreItem.substring(18); const resourceMeta = ExportResources[drone.ResourceType]; if (resourceMeta.pickupQuantity) { diff --git a/src/services/rngService.ts b/src/services/rngService.ts index f519c0d8..a7ce5ce4 100644 --- a/src/services/rngService.ts +++ b/src/services/rngService.ts @@ -18,7 +18,7 @@ export const getRandomInt = (min: number, max: number): number => { return Math.floor(Math.random() * (max - min + 1)) + min; }; -export const getRandomReward = (pool: IRngResult[]): IRngResult | undefined => { +export const getRandomReward = (pool: T[]): T | undefined => { if (pool.length == 0) return; const totalChance = pool.reduce((accum, item) => accum + item.probability, 0); @@ -71,3 +71,21 @@ export const getRandomWeightedReward2 = ( } return getRandomReward(resultPool); }; + +export const getRandomWeightedReward3 = ( + pool: T[], + weights: Record +): (T & { probability: number }) | undefined => { + const resultPool: (T & { probability: number })[] = []; + const rarityCounts: Record = { COMMON: 0, UNCOMMON: 0, RARE: 0, LEGENDARY: 0 }; + for (const entry of pool) { + ++rarityCounts[entry.Rarity]; + } + for (const entry of pool) { + resultPool.push({ + ...entry, + probability: weights[entry.Rarity] / rarityCounts[entry.Rarity] + }); + } + return getRandomReward(resultPool); +};