import { TRarity } from "warframe-public-export-plus"; export interface IRngResult { type: string; itemCount: number; probability: number; } export const getRandomElement = (arr: T[]): T => { return arr[Math.floor(Math.random() * arr.length)]; }; // Returns a random integer between min (inclusive) and max (inclusive). // https://stackoverflow.com/a/1527820 export const getRandomInt = (min: number, max: number): number => { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1)) + min; }; export const getRandomReward = (pool: T[]): T | undefined => { if (pool.length == 0) return; const totalChance = pool.reduce((accum, item) => accum + item.probability, 0); const randomValue = Math.random() * totalChance; let cumulativeChance = 0; for (const item of pool) { cumulativeChance += item.probability; if (randomValue <= cumulativeChance) { return item; } } throw new Error("What the fuck?"); }; export const getRandomWeightedReward = ( 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); }; export const getRandomWeightedRewardUc = ( 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); }; export class CRng { state: number; constructor(seed: number = 1) { this.state = seed; } random(): number { this.state = (this.state * 1103515245 + 12345) & 0x7fffffff; return (this.state & 0x3fffffff) / 0x3fffffff; } randomInt(min: number, max: number): number { min = Math.ceil(min); max = Math.floor(max); return Math.floor(this.random() * (max - min + 1)) + min; } randomElement(arr: T[]): T { return arr[Math.floor(this.random() * arr.length)]; } }