返回提交历史
Modified
src/controllers/api/activateRandomModController.ts
+1
-1
Modified
src/controllers/api/artifactTransmutationController.ts
+1
-1
Modified
src/controllers/api/modularWeaponSaleController.ts
+1
-1
Modified
src/helpers/rivenHelper.ts
+4
-4
Modified
src/services/inventoryService.ts
+5
-5
Modified
src/services/loginRewardService.ts
+1
-1
Modified
src/services/missionInventoryUpdateService.ts
+1
-1
Modified
src/services/personalRoomsService.ts
+6
-6
Modified
src/services/rngService.ts
+3
-3
Modified
src/services/serversideVendorsService.ts
+2
-2
Modified
src/services/worldStateService.ts
+10
-10
XFEstudio/SpaceNinjaServer
chore: note that random element functions could return undefined (#1910)
We should be explicit about the fact that we expect the arrays to not be empty. Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1910 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
1cf7b41d
代码差异
11 个文件
+35
-35
@@ -17,7 +17,7 @@ export const activateRandomModController: RequestHandler = async (req, res) => {
17
17
ItemCount: -1
18
18
}
19
19
]);
20
const rivenType = getRandomElement(rivenRawToRealWeighted[request.ItemType]);
20
const rivenType = getRandomElement(rivenRawToRealWeighted[request.ItemType])!;
21
21
const fingerprint = createVeiledRivenFingerprint(ExportUpgrades[rivenType]);
22
22
const upgradeIndex =
23
23
inventory.Upgrades.push({
@@ -28,7 +28,7 @@ export const artifactTransmutationController: RequestHandler = async (req, res)
28
28
});
29
29
30
30
const rawRivenType = getRandomRawRivenType();
31
const rivenType = getRandomElement(rivenRawToRealWeighted[rawRivenType]);
31
const rivenType = getRandomElement(rivenRawToRealWeighted[rawRivenType])!;
32
32
const fingerprint = createVeiledRivenFingerprint(ExportUpgrades[rivenType]);
33
33
34
34
const upgradeIndex =
@@ -141,7 +141,7 @@ const getModularWeaponSale = (
141
141
getItemType: (parts: string[]) => string
142
142
): IModularWeaponSaleInfo => {
143
143
const rng = new CRng(day);
144
const parts = partTypes.map(partType => rng.randomElement(partTypeToParts[partType]));
144
const parts = partTypes.map(partType => rng.randomElement(partTypeToParts[partType])!);
145
145
let partsCost = 0;
146
146
for (const part of parts) {
147
147
partsCost += ExportWeapons[part].premiumPrice!;
@@ -31,7 +31,7 @@ export interface IFingerprintStat {
31
31
}
32
32
33
33
export const createVeiledRivenFingerprint = (meta: IUpgrade): IVeiledRivenFingerprint => {
34
const challenge = getRandomElement(meta.availableChallenges!);
34
const challenge = getRandomElement(meta.availableChallenges!)!;
35
35
const fingerprintChallenge: IRivenChallenge = {
36
36
Type: challenge.fullName,
37
37
Progress: 0,
@@ -54,11 +54,11 @@ export const createVeiledRivenFingerprint = (meta: IUpgrade): IVeiledRivenFinger
54
54
55
55
export const createUnveiledRivenFingerprint = (meta: IUpgrade): IUnveiledRivenFingerprint => {
56
56
const fingerprint: IUnveiledRivenFingerprint = {
57
compat: getRandomElement(meta.compatibleItems!),
57
compat: getRandomElement(meta.compatibleItems!)!,
58
58
lim: 0,
59
59
lvl: 0,
60
60
lvlReq: getRandomInt(8, 16),
61
pol: getRandomElement(["AP_ATTACK", "AP_DEFENSE", "AP_TACTIC"]),
61
pol: getRandomElement(["AP_ATTACK", "AP_DEFENSE", "AP_TACTIC"])!,
62
62
buffs: [],
63
63
curses: []
64
64
};
@@ -81,7 +81,7 @@ export const randomiseRivenStats = (meta: IUpgrade, fingerprint: IUnveiledRivenF
81
81
if (Math.random() < 0.5) {
82
82
const entry = getRandomElement(
83
83
meta.upgradeEntries!.filter(x => x.canBeCurse && !fingerprint.buffs.find(y => y.Tag == x.tag))
84
);
84
)!;
85
85
fingerprint.curses.push({ Tag: entry.tag, Value: Math.trunc(Math.random() * 0x40000000) });
86
86
}
87
87
};
@@ -1798,7 +1798,7 @@ export const addKeyChainItems = async (
1798
1798
};
1799
1799
1800
1800
export const createLibraryDailyTask = (): ILibraryDailyTaskInfo => {
1801
const enemyTypes = getRandomElement(libraryDailyTasks);
1801
const enemyTypes = getRandomElement(libraryDailyTasks)!;
1802
1802
const enemyAvatar = ExportEnemies.avatars[enemyTypes[0]];
1803
1803
const scansRequired = getRandomInt(2, 4);
1804
1804
return {
@@ -1944,22 +1944,22 @@ export const giveNemesisPetRecipe = (inventory: TInventoryDatabaseDocument, neme
1944
1944
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadA",
1945
1945
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadB",
1946
1946
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartHeadC"
1947
]);
1947
])!;
1948
1948
const body = getRandomElement([
1949
1949
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartBodyA",
1950
1950
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartBodyB",
1951
1951
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartBodyC"
1952
]);
1952
])!;
1953
1953
const legs = getRandomElement([
1954
1954
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartLegsA",
1955
1955
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartLegsB",
1956
1956
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartLegsC"
1957
]);
1957
])!;
1958
1958
const tail = getRandomElement([
1959
1959
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartTailA",
1960
1960
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartTailB",
1961
1961
"/Lotus/Types/Friendly/Pets/ZanukaPets/ZanukaPetParts/ZanukaPetPartTailC"
1962
]);
1962
])!;
1963
1963
const recipeType = Object.entries(ExportRecipes).find(arr => arr[1].resultType == head)![0];
1964
1964
addRecipes(inventory, [
1965
1965
{
@@ -102,7 +102,7 @@ const getRandomLoginReward = (rng: CRng, day: number, inventory: TInventoryDatab
102
102
// This account has all applicable warframes and weapons already mastered (filthy cheater), need a different reward.
103
103
return getRandomLoginReward(rng, day, inventory);
104
104
}
105
reward.StoreItemType = toStoreItem(rng.randomElement(eligibleRecipes));
105
reward.StoreItemType = toStoreItem(rng.randomElement(eligibleRecipes)!);
106
106
}
107
107
return {
108
108
//_id: toOid(new Types.ObjectId()),
@@ -930,7 +930,7 @@ export const addMissionRewards = async (
930
930
931
931
if (rewardInfo.useVaultManifest) {
932
932
MissionRewards.push({
933
StoreItem: getRandomElement(corruptedMods),
933
StoreItem: getRandomElement(corruptedMods)!,
934
934
ItemCount: 1
935
935
});
936
936
}
@@ -47,12 +47,12 @@ export const createGarden = (): IGardeningDatabase => {
47
47
Name: "Garden0",
48
48
Plants: [
49
49
{
50
PlantType: getRandomElement(plantTypes),
50
PlantType: getRandomElement(plantTypes)!,
51
51
EndTime: endTime,
52
52
PlotIndex: 0
53
53
},
54
54
{
55
PlantType: getRandomElement(plantTypes),
55
PlantType: getRandomElement(plantTypes)!,
56
56
EndTime: endTime,
57
57
PlotIndex: 1
58
58
}
@@ -62,12 +62,12 @@ export const createGarden = (): IGardeningDatabase => {
62
62
Name: "Garden1",
63
63
Plants: [
64
64
{
65
PlantType: getRandomElement(plantTypes),
65
PlantType: getRandomElement(plantTypes)!,
66
66
EndTime: endTime,
67
67
PlotIndex: 0
68
68
},
69
69
{
70
PlantType: getRandomElement(plantTypes),
70
PlantType: getRandomElement(plantTypes)!,
71
71
EndTime: endTime,
72
72
PlotIndex: 1
73
73
}
@@ -77,12 +77,12 @@ export const createGarden = (): IGardeningDatabase => {
77
77
Name: "Garden2",
78
78
Plants: [
79
79
{
80
PlantType: getRandomElement(plantTypes),
80
PlantType: getRandomElement(plantTypes)!,
81
81
EndTime: endTime,
82
82
PlotIndex: 0
83
83
},
84
84
{
85
PlantType: getRandomElement(plantTypes),
85
PlantType: getRandomElement(plantTypes)!,
86
86
EndTime: endTime,
87
87
PlotIndex: 1
88
88
}
@@ -6,7 +6,7 @@ export interface IRngResult {
6
6
probability: number;
7
7
}
8
8
9
export const getRandomElement = <T>(arr: T[]): T => {
9
export const getRandomElement = <T>(arr: T[]): T | undefined => {
10
10
return arr[Math.floor(Math.random() * arr.length)];
11
11
};
12
12
@@ -113,7 +113,7 @@ export class CRng {
113
113
return min;
114
114
}
115
115
116
randomElement<T>(arr: T[]): T {
116
randomElement<T>(arr: T[]): T | undefined {
117
117
return arr[Math.floor(this.random() * arr.length)];
118
118
}
119
119
@@ -145,7 +145,7 @@ export class SRng {
145
145
return min;
146
146
}
147
147
148
randomElement<T>(arr: T[]): T {
148
randomElement<T>(arr: T[]): T | undefined {
149
149
return arr[this.randomInt(0, arr.length - 1)];
150
150
}
151
151
@@ -212,7 +212,7 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
212
212
while (processed.ItemManifest.length + offersToAdd.length < numItemsTarget) {
213
213
// TODO: Consider per-bin item limits
214
214
// TODO: Consider item probability weightings
215
offersToAdd.push(rng.randomElement(manifest.items));
215
offersToAdd.push(rng.randomElement(manifest.items)!);
216
216
}
217
217
} else {
218
218
let binThisCycle;
@@ -256,7 +256,7 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
256
256
for (let i = 0; i != rawItem.numRandomItemPrices; ++i) {
257
257
let itemPrice: { type: string; count: IRange };
258
258
do {
259
itemPrice = rng.randomElement(manifest.randomItemPricesPerBin![rawItem.bin]);
259
itemPrice = rng.randomElement(manifest.randomItemPricesPerBin![rawItem.bin])!;
260
260
} while (item.ItemPrices.find(x => x.ItemType == itemPrice.type));
261
261
item.ItemPrices.push({
262
262
ItemType: itemPrice.type,
@@ -225,7 +225,7 @@ const pushSortieIfRelevant = (worldState: IWorldState, day: number): void => {
225
225
const seed = new CRng(day).randomInt(0, 0xffff);
226
226
const rng = new CRng(seed);
227
227
228
const boss = rng.randomElement(sortieBosses);
228
const boss = rng.randomElement(sortieBosses)!;
229
229
230
230
const modifiers = [
231
231
"SORTIE_MODIFIER_LOW_ENERGY",
@@ -302,7 +302,7 @@ const pushSortieIfRelevant = (worldState: IWorldState, day: number): void => {
302
302
303
303
missionIndex = ExportRegions[node].missionIndex;
304
304
if (missionIndex != 28) {
305
missionIndex = rng.randomElement(availableMissionIndexes);
305
missionIndex = rng.randomElement(availableMissionIndexes)!;
306
306
}
307
307
} while (
308
308
specialMissionTypes.indexOf(missionIndex) != -1 &&
@@ -312,7 +312,7 @@ const pushSortieIfRelevant = (worldState: IWorldState, day: number): void => {
312
312
313
313
if (i == 2 && rng.randomInt(0, 2) == 2) {
314
314
const filteredModifiers = modifiers.filter(mod => mod !== "SORTIE_MODIFIER_MELEE_ONLY");
315
const modifierType = rng.randomElement(filteredModifiers);
315
const modifierType = rng.randomElement(filteredModifiers)!;
316
316
317
317
if (boss == "SORTIE_BOSS_PHORID") {
318
318
selectedNodes.push({
@@ -346,7 +346,7 @@ const pushSortieIfRelevant = (worldState: IWorldState, day: number): void => {
346
346
? modifiers.filter(mod => mod != "SORTIE_MODIFIER_HAZARD_RADIATION")
347
347
: modifiers;
348
348
349
const modifierType = rng.randomElement(filteredModifiers);
349
const modifierType = rng.randomElement(filteredModifiers)!;
350
350
351
351
selectedNodes.push({
352
352
missionType,
@@ -389,7 +389,7 @@ const getSeasonDailyChallenge = (day: number): ISeasonChallenge => {
389
389
Daily: true,
390
390
Activation: { $date: { $numberLong: dayStart.toString() } },
391
391
Expiry: { $date: { $numberLong: dayEnd.toString() } },
392
Challenge: rng.randomElement(dailyChallenges)
392
Challenge: rng.randomElement(dailyChallenges)!
393
393
};
394
394
};
395
395
@@ -408,7 +408,7 @@ const getSeasonWeeklyChallenge = (week: number, id: number): ISeasonChallenge =>
408
408
_id: { $oid: "67e1bb2d9d00cb47" + challengeId.toString().padStart(8, "0") },
409
409
Activation: { $date: { $numberLong: weekStart.toString() } },
410
410
Expiry: { $date: { $numberLong: weekEnd.toString() } },
411
Challenge: rng.randomElement(weeklyChallenges)
411
Challenge: rng.randomElement(weeklyChallenges)!
412
412
};
413
413
};
414
414
@@ -425,7 +425,7 @@ const getSeasonWeeklyHardChallenge = (week: number, id: number): ISeasonChalleng
425
425
_id: { $oid: "67e1bb2d9d00cb47" + challengeId.toString().padStart(8, "0") },
426
426
Activation: { $date: { $numberLong: weekStart.toString() } },
427
427
Expiry: { $date: { $numberLong: weekEnd.toString() } },
428
Challenge: rng.randomElement(weeklyHardChallenges)
428
Challenge: rng.randomElement(weeklyHardChallenges)!
429
429
};
430
430
};
431
431
@@ -1196,7 +1196,7 @@ export const getLiteSortie = (week: number): ILiteSortie => {
1196
1196
"MT_EXTERMINATION",
1197
1197
"MT_SABOTAGE",
1198
1198
"MT_RESCUE"
1199
]),
1199
])!,
1200
1200
node: firstNode
1201
1201
},
1202
1202
{
@@ -1206,8 +1206,8 @@ export const getLiteSortie = (week: number): ILiteSortie => {
1206
1206
"MT_ARTIFACT",
1207
1207
"MT_EXCAVATE",
1208
1208
"MT_SURVIVAL"
1209
]),
1210
node: rng.randomElement(nodes)
1209
])!,
1210
node: rng.randomElement(nodes)!
1211
1211
},
1212
1212
{
1213
1213
missionType: "MT_ASSASSINATION",