diff --git a/src/controllers/api/activateRandomModController.ts b/src/controllers/api/activateRandomModController.ts index 4ac822c7..5dc8499c 100644 --- a/src/controllers/api/activateRandomModController.ts +++ b/src/controllers/api/activateRandomModController.ts @@ -17,7 +17,7 @@ export const activateRandomModController: RequestHandler = async (req, res) => { ItemCount: -1 } ]); - const rivenType = getRandomElement(rivenRawToRealWeighted[request.ItemType]); + const rivenType = getRandomElement(rivenRawToRealWeighted[request.ItemType])!; const fingerprint = createVeiledRivenFingerprint(ExportUpgrades[rivenType]); const upgradeIndex = inventory.Upgrades.push({ diff --git a/src/controllers/api/artifactTransmutationController.ts b/src/controllers/api/artifactTransmutationController.ts index 7e39e79e..4310c7c4 100644 --- a/src/controllers/api/artifactTransmutationController.ts +++ b/src/controllers/api/artifactTransmutationController.ts @@ -28,7 +28,7 @@ export const artifactTransmutationController: RequestHandler = async (req, res) }); const rawRivenType = getRandomRawRivenType(); - const rivenType = getRandomElement(rivenRawToRealWeighted[rawRivenType]); + const rivenType = getRandomElement(rivenRawToRealWeighted[rawRivenType])!; const fingerprint = createVeiledRivenFingerprint(ExportUpgrades[rivenType]); const upgradeIndex = diff --git a/src/controllers/api/modularWeaponSaleController.ts b/src/controllers/api/modularWeaponSaleController.ts index f60f6c3d..3e37547b 100644 --- a/src/controllers/api/modularWeaponSaleController.ts +++ b/src/controllers/api/modularWeaponSaleController.ts @@ -141,7 +141,7 @@ const getModularWeaponSale = ( getItemType: (parts: string[]) => string ): IModularWeaponSaleInfo => { const rng = new CRng(day); - const parts = partTypes.map(partType => rng.randomElement(partTypeToParts[partType])); + const parts = partTypes.map(partType => rng.randomElement(partTypeToParts[partType])!); let partsCost = 0; for (const part of parts) { partsCost += ExportWeapons[part].premiumPrice!; diff --git a/src/helpers/rivenHelper.ts b/src/helpers/rivenHelper.ts index 35426a29..34a7babc 100644 --- a/src/helpers/rivenHelper.ts +++ b/src/helpers/rivenHelper.ts @@ -31,7 +31,7 @@ export interface IFingerprintStat { } export const createVeiledRivenFingerprint = (meta: IUpgrade): IVeiledRivenFingerprint => { - const challenge = getRandomElement(meta.availableChallenges!); + const challenge = getRandomElement(meta.availableChallenges!)!; const fingerprintChallenge: IRivenChallenge = { Type: challenge.fullName, Progress: 0, @@ -54,11 +54,11 @@ export const createVeiledRivenFingerprint = (meta: IUpgrade): IVeiledRivenFinger export const createUnveiledRivenFingerprint = (meta: IUpgrade): IUnveiledRivenFingerprint => { const fingerprint: IUnveiledRivenFingerprint = { - compat: getRandomElement(meta.compatibleItems!), + compat: getRandomElement(meta.compatibleItems!)!, lim: 0, lvl: 0, lvlReq: getRandomInt(8, 16), - pol: getRandomElement(["AP_ATTACK", "AP_DEFENSE", "AP_TACTIC"]), + pol: getRandomElement(["AP_ATTACK", "AP_DEFENSE", "AP_TACTIC"])!, buffs: [], curses: [] }; @@ -81,7 +81,7 @@ export const randomiseRivenStats = (meta: IUpgrade, fingerprint: IUnveiledRivenF if (Math.random() < 0.5) { const entry = getRandomElement( meta.upgradeEntries!.filter(x => x.canBeCurse && !fingerprint.buffs.find(y => y.Tag == x.tag)) - ); + )!; fingerprint.curses.push({ Tag: entry.tag, Value: Math.trunc(Math.random() * 0x40000000) }); } }; diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index c3d47ec6..da8b0848 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -1798,7 +1798,7 @@ export const addKeyChainItems = async ( }; export const createLibraryDailyTask = (): ILibraryDailyTaskInfo => { - const enemyTypes = getRandomElement(libraryDailyTasks); + const enemyTypes = getRandomElement(libraryDailyTasks)!; const enemyAvatar = ExportEnemies.avatars[enemyTypes[0]]; const scansRequired = getRandomInt(2, 4); return { @@ -1944,22 +1944,22 @@ export const giveNemesisPetRecipe = (inventory: TInventoryDatabaseDocument, neme "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadA", "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadB", "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadC" - ]); + ])!; const body = getRandomElement([ "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartBodyA", "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartBodyB", "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartBodyC" - ]); + ])!; const legs = getRandomElement([ "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartLegsA", "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartLegsB", "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartLegsC" - ]); + ])!; const tail = getRandomElement([ "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartTailA", "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartTailB", "/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartTailC" - ]); + ])!; const recipeType = Object.entries(ExportRecipes).find(arr => arr[1].resultType == head)![0]; addRecipes(inventory, [ { diff --git a/src/services/loginRewardService.ts b/src/services/loginRewardService.ts index c897442e..1734247a 100644 --- a/src/services/loginRewardService.ts +++ b/src/services/loginRewardService.ts @@ -102,7 +102,7 @@ const getRandomLoginReward = (rng: CRng, day: number, inventory: TInventoryDatab // This account has all applicable warframes and weapons already mastered (filthy cheater), need a different reward. return getRandomLoginReward(rng, day, inventory); } - reward.StoreItemType = toStoreItem(rng.randomElement(eligibleRecipes)); + reward.StoreItemType = toStoreItem(rng.randomElement(eligibleRecipes)!); } return { //_id: toOid(new Types.ObjectId()), diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 89b55cea..35486d21 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -930,7 +930,7 @@ export const addMissionRewards = async ( if (rewardInfo.useVaultManifest) { MissionRewards.push({ - StoreItem: getRandomElement(corruptedMods), + StoreItem: getRandomElement(corruptedMods)!, ItemCount: 1 }); } diff --git a/src/services/personalRoomsService.ts b/src/services/personalRoomsService.ts index 97f1b41d..8cf49ec1 100644 --- a/src/services/personalRoomsService.ts +++ b/src/services/personalRoomsService.ts @@ -47,12 +47,12 @@ export const createGarden = (): IGardeningDatabase => { Name: "Garden0", Plants: [ { - PlantType: getRandomElement(plantTypes), + PlantType: getRandomElement(plantTypes)!, EndTime: endTime, PlotIndex: 0 }, { - PlantType: getRandomElement(plantTypes), + PlantType: getRandomElement(plantTypes)!, EndTime: endTime, PlotIndex: 1 } @@ -62,12 +62,12 @@ export const createGarden = (): IGardeningDatabase => { Name: "Garden1", Plants: [ { - PlantType: getRandomElement(plantTypes), + PlantType: getRandomElement(plantTypes)!, EndTime: endTime, PlotIndex: 0 }, { - PlantType: getRandomElement(plantTypes), + PlantType: getRandomElement(plantTypes)!, EndTime: endTime, PlotIndex: 1 } @@ -77,12 +77,12 @@ export const createGarden = (): IGardeningDatabase => { Name: "Garden2", Plants: [ { - PlantType: getRandomElement(plantTypes), + PlantType: getRandomElement(plantTypes)!, EndTime: endTime, PlotIndex: 0 }, { - PlantType: getRandomElement(plantTypes), + PlantType: getRandomElement(plantTypes)!, EndTime: endTime, PlotIndex: 1 } diff --git a/src/services/rngService.ts b/src/services/rngService.ts index 84a4ed8d..68225ca1 100644 --- a/src/services/rngService.ts +++ b/src/services/rngService.ts @@ -6,7 +6,7 @@ export interface IRngResult { probability: number; } -export const getRandomElement = (arr: T[]): T => { +export const getRandomElement = (arr: T[]): T | undefined => { return arr[Math.floor(Math.random() * arr.length)]; }; @@ -113,7 +113,7 @@ export class CRng { return min; } - randomElement(arr: T[]): T { + randomElement(arr: T[]): T | undefined { return arr[Math.floor(this.random() * arr.length)]; } @@ -145,7 +145,7 @@ export class SRng { return min; } - randomElement(arr: T[]): T { + randomElement(arr: T[]): T | undefined { return arr[this.randomInt(0, arr.length - 1)]; } diff --git a/src/services/serversideVendorsService.ts b/src/services/serversideVendorsService.ts index d594e79f..82ceae46 100644 --- a/src/services/serversideVendorsService.ts +++ b/src/services/serversideVendorsService.ts @@ -212,7 +212,7 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani while (processed.ItemManifest.length + offersToAdd.length < numItemsTarget) { // TODO: Consider per-bin item limits // TODO: Consider item probability weightings - offersToAdd.push(rng.randomElement(manifest.items)); + offersToAdd.push(rng.randomElement(manifest.items)!); } } else { let binThisCycle; @@ -256,7 +256,7 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani for (let i = 0; i != rawItem.numRandomItemPrices; ++i) { let itemPrice: { type: string; count: IRange }; do { - itemPrice = rng.randomElement(manifest.randomItemPricesPerBin![rawItem.bin]); + itemPrice = rng.randomElement(manifest.randomItemPricesPerBin![rawItem.bin])!; } while (item.ItemPrices.find(x => x.ItemType == itemPrice.type)); item.ItemPrices.push({ ItemType: itemPrice.type, diff --git a/src/services/worldStateService.ts b/src/services/worldStateService.ts index cc93b48a..fba58cd8 100644 --- a/src/services/worldStateService.ts +++ b/src/services/worldStateService.ts @@ -225,7 +225,7 @@ const pushSortieIfRelevant = (worldState: IWorldState, day: number): void => { const seed = new CRng(day).randomInt(0, 0xffff); const rng = new CRng(seed); - const boss = rng.randomElement(sortieBosses); + const boss = rng.randomElement(sortieBosses)!; const modifiers = [ "SORTIE_MODIFIER_LOW_ENERGY", @@ -299,7 +299,7 @@ const pushSortieIfRelevant = (worldState: IWorldState, day: number): void => { missionIndex = ExportRegions[node].missionIndex; if (missionIndex != 28) { - missionIndex = rng.randomElement(availableMissionIndexes); + missionIndex = rng.randomElement(availableMissionIndexes)!; } } while ( specialMissionTypes.indexOf(missionIndex) != -1 && @@ -309,7 +309,7 @@ const pushSortieIfRelevant = (worldState: IWorldState, day: number): void => { if (i == 2 && rng.randomInt(0, 2) == 2) { const filteredModifiers = modifiers.filter(mod => mod !== "SORTIE_MODIFIER_MELEE_ONLY"); - const modifierType = rng.randomElement(filteredModifiers); + const modifierType = rng.randomElement(filteredModifiers)!; if (boss == "SORTIE_BOSS_PHORID") { selectedNodes.push({ @@ -343,7 +343,7 @@ const pushSortieIfRelevant = (worldState: IWorldState, day: number): void => { ? modifiers.filter(mod => mod != "SORTIE_MODIFIER_HAZARD_RADIATION") : modifiers; - const modifierType = rng.randomElement(filteredModifiers); + const modifierType = rng.randomElement(filteredModifiers)!; selectedNodes.push({ missionType, @@ -386,7 +386,7 @@ const getSeasonDailyChallenge = (day: number): ISeasonChallenge => { Daily: true, Activation: { $date: { $numberLong: dayStart.toString() } }, Expiry: { $date: { $numberLong: dayEnd.toString() } }, - Challenge: rng.randomElement(dailyChallenges) + Challenge: rng.randomElement(dailyChallenges)! }; }; @@ -405,7 +405,7 @@ const getSeasonWeeklyChallenge = (week: number, id: number): ISeasonChallenge => _id: { $oid: "67e1bb2d9d00cb47" + challengeId.toString().padStart(8, "0") }, Activation: { $date: { $numberLong: weekStart.toString() } }, Expiry: { $date: { $numberLong: weekEnd.toString() } }, - Challenge: rng.randomElement(weeklyChallenges) + Challenge: rng.randomElement(weeklyChallenges)! }; }; @@ -422,7 +422,7 @@ const getSeasonWeeklyHardChallenge = (week: number, id: number): ISeasonChalleng _id: { $oid: "67e1bb2d9d00cb47" + challengeId.toString().padStart(8, "0") }, Activation: { $date: { $numberLong: weekStart.toString() } }, Expiry: { $date: { $numberLong: weekEnd.toString() } }, - Challenge: rng.randomElement(weeklyHardChallenges) + Challenge: rng.randomElement(weeklyHardChallenges)! }; }; @@ -1193,7 +1193,7 @@ export const getLiteSortie = (week: number): ILiteSortie => { "MT_EXTERMINATION", "MT_SABOTAGE", "MT_RESCUE" - ]), + ])!, node: firstNode }, { @@ -1203,8 +1203,8 @@ export const getLiteSortie = (week: number): ILiteSortie => { "MT_ARTIFACT", "MT_EXCAVATE", "MT_SURVIVAL" - ]), - node: rng.randomElement(nodes) + ])!, + node: rng.randomElement(nodes)! }, { missionType: "MT_ASSASSINATION",