fix not using weighted RNG

This commit is contained in:
Sainan 2025-03-03 06:44:25 +01:00
parent 6a81a0a3d1
commit 89309aae19
2 changed files with 22 additions and 3 deletions

View File

@ -2,7 +2,7 @@ import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
import { config } from "@/src/services/configService"; import { config } from "@/src/services/configService";
import { addMiscItems, getInventory } from "@/src/services/inventoryService"; import { addMiscItems, getInventory } from "@/src/services/inventoryService";
import { getAccountIdForRequest } from "@/src/services/loginService"; 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 { IMongoDate, IOid } from "@/src/types/commonTypes";
import { IDroneClient } from "@/src/types/inventoryTypes/inventoryTypes"; import { IDroneClient } from "@/src/types/inventoryTypes/inventoryTypes";
import { IInventoryChanges } from "@/src/types/purchaseTypes"; 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); : new Date(Date.now() + getRandomInt(3, 4) * 3600_000);
drone.PendingDamage = getRandomInt(system.droneDamage.minValue, system.droneDamage.maxValue); 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); drone.ResourceType = "/Lotus/" + resource.StoreItem.substring(18);
const resourceMeta = ExportResources[drone.ResourceType]; const resourceMeta = ExportResources[drone.ResourceType];
if (resourceMeta.pickupQuantity) { if (resourceMeta.pickupQuantity) {

View File

@ -18,7 +18,7 @@ export const getRandomInt = (min: number, max: number): number => {
return Math.floor(Math.random() * (max - min + 1)) + min; return Math.floor(Math.random() * (max - min + 1)) + min;
}; };
export const getRandomReward = (pool: IRngResult[]): IRngResult | undefined => { export const getRandomReward = <T extends { probability: number }>(pool: T[]): T | undefined => {
if (pool.length == 0) return; if (pool.length == 0) return;
const totalChance = pool.reduce((accum, item) => accum + item.probability, 0); const totalChance = pool.reduce((accum, item) => accum + item.probability, 0);
@ -71,3 +71,21 @@ export const getRandomWeightedReward2 = (
} }
return getRandomReward(resultPool); return getRandomReward(resultPool);
}; };
export const getRandomWeightedReward3 = <T extends { Rarity: TRarity }>(
pool: T[],
weights: Record<TRarity, number>
): (T & { probability: number }) | undefined => {
const resultPool: (T & { probability: number })[] = [];
const rarityCounts: Record<TRarity, number> = { 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);
};