chore: note that random element functions could return undefined
We should be explicit about the fact that we expect the arrays to not be empty.
This commit is contained in:
parent
743b784754
commit
43f33cee4b
@ -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({
|
||||
|
@ -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 =
|
||||
|
@ -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!;
|
||||
|
@ -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) });
|
||||
}
|
||||
};
|
||||
|
@ -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, [
|
||||
{
|
||||
|
@ -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()),
|
||||
|
@ -930,7 +930,7 @@ export const addMissionRewards = async (
|
||||
|
||||
if (rewardInfo.useVaultManifest) {
|
||||
MissionRewards.push({
|
||||
StoreItem: getRandomElement(corruptedMods),
|
||||
StoreItem: getRandomElement(corruptedMods)!,
|
||||
ItemCount: 1
|
||||
});
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -6,7 +6,7 @@ export interface IRngResult {
|
||||
probability: number;
|
||||
}
|
||||
|
||||
export const getRandomElement = <T>(arr: T[]): T => {
|
||||
export const getRandomElement = <T>(arr: T[]): T | undefined => {
|
||||
return arr[Math.floor(Math.random() * arr.length)];
|
||||
};
|
||||
|
||||
@ -113,7 +113,7 @@ export class CRng {
|
||||
return min;
|
||||
}
|
||||
|
||||
randomElement<T>(arr: T[]): T {
|
||||
randomElement<T>(arr: T[]): T | undefined {
|
||||
return arr[Math.floor(this.random() * arr.length)];
|
||||
}
|
||||
|
||||
@ -145,7 +145,7 @@ export class SRng {
|
||||
return min;
|
||||
}
|
||||
|
||||
randomElement<T>(arr: T[]): T {
|
||||
randomElement<T>(arr: T[]): T | undefined {
|
||||
return arr[this.randomInt(0, arr.length - 1)];
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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",
|
||||
|
Loading…
x
Reference in New Issue
Block a user