XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

SpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 1 Star 0
返回提交历史

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
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

11 个文件 +35 -35
Modified src/controllers/api/activateRandomModController.ts +1 -1
@@ -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({
Modified src/controllers/api/artifactTransmutationController.ts +1 -1
@@ -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 =
Modified src/controllers/api/modularWeaponSaleController.ts +1 -1
@@ -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!;
Modified src/helpers/rivenHelper.ts +4 -4
@@ -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 };
Modified src/services/inventoryService.ts +5 -5
@@ -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 {
Modified src/services/loginRewardService.ts +1 -1
@@ -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()),
Modified src/services/missionInventoryUpdateService.ts +1 -1
@@ -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 }
Modified src/services/personalRoomsService.ts +6 -6
@@ -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 }
Modified src/services/rngService.ts +3 -3
@@ -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
Modified src/services/serversideVendorsService.ts +2 -2
@@ -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,
Modified src/services/worldStateService.ts +10 -10
@@ -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",