返回提交历史
Modified
src/services/inventoryService.ts
+25
-0
Modified
src/services/itemDataService.ts
+189
-24
Modified
src/services/missionInventoryUpdateService.ts
+47
-26
Modified
static/webui/script.js
+5
-0
Modified
static/webui/translations/de.js
+1
-0
Modified
static/webui/translations/en.js
+1
-0
Modified
static/webui/translations/es.js
+1
-0
Modified
static/webui/translations/fr.js
+1
-0
Modified
static/webui/translations/ru.js
+1
-0
Modified
static/webui/translations/uk.js
+1
-0
Modified
static/webui/translations/zh.js
+1
-0
XFEstudio/XFESpaceNinjaServer
chore: old keys crafting/buying (#3342)
sequel to #3284 adds rewards handling for that keys allows to add `Lephantis Nav Coord.` through webui Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/3342 Reviewed-by: Sainan <63328889+sainan@users.noreply.github.com> Co-authored-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Co-committed-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
2d14b424
代码差异
11 个文件
+273
-50
@@ -1049,6 +1049,15 @@ export const addItem = async (
1049
1049
);
1050
1050
}
1051
1051
return addCustomization(inventory, typeName);
1052
} else if (typeName.substring(1).split("/")[3] == "MiscItems") {
1053
const miscItemChanges = [
1054
{
1055
ItemType: typeName,
1056
ItemCount: quantity
1057
} satisfies IMiscItem
1058
];
1059
addMiscItems(inventory, miscItemChanges);
1060
return { MiscItems: miscItemChanges };
1052
1061
}
1053
1062
break;
1054
1063
}
@@ -1104,6 +1113,22 @@ export const addItem = async (
1104
1113
]);
1105
1114
}
1106
1115
break;
1116
case "Keys":
1117
if (typeName.endsWith("Blueprint")) {
1118
const recipeChanges = [
1119
{
1120
ItemType: typeName,
1121
ItemCount: quantity
1122
} satisfies ITypeCount
1123
];
1124
addRecipes(inventory, recipeChanges);
1125
return { Recipes: recipeChanges };
1126
} else if (typeName.endsWith("Key") || typeName.substring(1).split("/")[3] == "RaidKeys") {
1127
const levelKeyChanges = [{ ItemType: typeName, ItemCount: quantity }];
1128
addLevelKeys(inventory, levelKeyChanges);
1129
return { LevelKeys: levelKeyChanges };
1130
}
1131
break;
1107
1132
}
1108
1133
break;
1109
1134
case "Weapons": {
@@ -9,6 +9,7 @@ import type {
9
9
IRecipe,
10
10
IRegion,
11
11
ISyndicate,
12
TMissionDeck,
12
13
TReward
13
14
} from "warframe-public-export-plus";
14
15
import {
@@ -41,6 +42,7 @@ import {
41
42
ExportRailjackWeapons,
42
43
ExportRecipes,
43
44
ExportResources,
45
ExportRewards,
44
46
ExportSentinels,
45
47
ExportSyndicates,
46
48
ExportWarframes,
@@ -106,7 +108,6 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
106
108
consumeOnUse: false,
107
109
num: 1,
108
110
codexSecret: false,
109
alwaysAvailable: true,
110
111
ingredients: [
111
112
{
112
113
ItemType: "/Lotus/Types/Items/MiscItems/Rubedo",
@@ -122,7 +123,8 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
122
123
}
123
124
],
124
125
excludeFromMarket: true,
125
tradable: false
126
tradable: false,
127
creditsCost: 100000
126
128
};
127
129
} else if (uniqueName == "/Lotus/Types/Keys/NightmareGrineerRaidKeyBlueprint") {
128
130
// The Law of Retribution (Nightmare) raid bp. Removed in 22.14.0
@@ -134,7 +136,6 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
134
136
consumeOnUse: false,
135
137
num: 1,
136
138
codexSecret: false,
137
alwaysAvailable: true,
138
139
ingredients: [
139
140
{
140
141
ItemType: "/Lotus/Types/Items/MiscItems/Rubedo",
@@ -150,7 +151,8 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
150
151
}
151
152
],
152
153
excludeFromMarket: true,
153
tradable: false
154
tradable: false,
155
creditsCost: 100000
154
156
};
155
157
} else if (uniqueName == "/Lotus/Types/Keys/GolemRaidKeyBlueprint") {
156
158
// The Jordas Verdict raid bp. Removed in 22.14.0
@@ -162,7 +164,6 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
162
164
consumeOnUse: false,
163
165
num: 1,
164
166
codexSecret: false,
165
alwaysAvailable: true,
166
167
ingredients: [
167
168
{
168
169
ItemType: "/Lotus/Types/Items/MiscItems/Plastids",
@@ -178,7 +179,8 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
178
179
}
179
180
],
180
181
excludeFromMarket: true,
181
tradable: false
182
tradable: false,
183
creditsCost: 100000
182
184
};
183
185
} else if (uniqueName == "/Lotus/Types/Keys/GolemKeyBlueprint") {
184
186
// Orokin Derelict Assassination bp for Lephantis. Removed in 28.3.0
@@ -190,7 +192,6 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
190
192
consumeOnUse: false,
191
193
num: 1,
192
194
codexSecret: false,
193
alwaysAvailable: true,
194
195
ingredients: [
195
196
{
196
197
ItemType: "/Lotus/Types/Items/MiscItems/BossNavCode",
@@ -210,7 +211,8 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
210
211
}
211
212
],
212
213
excludeFromMarket: true,
213
tradable: false
214
tradable: false,
215
creditsCost: 2500
214
216
};
215
217
} else if (uniqueName == "/Lotus/Types/Keys/DerelictCaptureKeyBlueprint") {
216
218
// Orokin Derelict Capture bp. Removed in 28.3.0
@@ -222,7 +224,6 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
222
224
consumeOnUse: false,
223
225
num: 1,
224
226
codexSecret: false,
225
alwaysAvailable: true,
226
227
ingredients: [
227
228
{
228
229
ItemType: "/Lotus/Types/Items/MiscItems/NavCode",
@@ -242,7 +243,8 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
242
243
}
243
244
],
244
245
excludeFromMarket: true,
245
tradable: false
246
tradable: false,
247
creditsCost: 1500
246
248
};
247
249
} else if (uniqueName == "/Lotus/Types/Keys/DerelictDefenseKeyBlueprint") {
248
250
// Orokin Derelict Defense bp. Removed in 28.3.0
@@ -254,7 +256,6 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
254
256
consumeOnUse: false,
255
257
num: 1,
256
258
codexSecret: false,
257
alwaysAvailable: true,
258
259
ingredients: [
259
260
{
260
261
ItemType: "/Lotus/Types/Items/MiscItems/NavCode",
@@ -274,7 +275,8 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
274
275
}
275
276
],
276
277
excludeFromMarket: true,
277
tradable: false
278
tradable: false,
279
creditsCost: 1500
278
280
};
279
281
} else if (uniqueName == "/Lotus/Types/Keys/DerelictExterminateKeyBlueprint") {
280
282
// Orokin Derelict Exterminate bp. Removed in 28.3.0
@@ -286,7 +288,6 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
286
288
consumeOnUse: false,
287
289
num: 1,
288
290
codexSecret: false,
289
alwaysAvailable: true,
290
291
ingredients: [
291
292
{
292
293
ItemType: "/Lotus/Types/Items/MiscItems/NavCode",
@@ -306,7 +307,8 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
306
307
}
307
308
],
308
309
excludeFromMarket: true,
309
tradable: false
310
tradable: false,
311
creditsCost: 1500
310
312
};
311
313
} else if (uniqueName == "/Lotus/Types/Keys/DerelictMobileDefenseKeyBlueprint") {
312
314
// Orokin Derelict Mobile Defense bp. Removed in 28.3.0
@@ -318,7 +320,6 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
318
320
consumeOnUse: false,
319
321
num: 1,
320
322
codexSecret: false,
321
alwaysAvailable: true,
322
323
ingredients: [
323
324
{
324
325
ItemType: "/Lotus/Types/Items/MiscItems/NavCode",
@@ -338,7 +339,8 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
338
339
}
339
340
],
340
341
excludeFromMarket: true,
341
tradable: false
342
tradable: false,
343
creditsCost: 1500
342
344
};
343
345
} else if (uniqueName == "/Lotus/Types/Keys/DerelictSabotageKeyBlueprint") {
344
346
// Orokin Derelict Sabotage bp. Removed in 28.3.0
@@ -350,7 +352,6 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
350
352
consumeOnUse: false,
351
353
num: 1,
352
354
codexSecret: false,
353
alwaysAvailable: true,
354
355
ingredients: [
355
356
{
356
357
ItemType: "/Lotus/Types/Items/MiscItems/NavCode",
@@ -370,7 +371,8 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
370
371
}
371
372
],
372
373
excludeFromMarket: true,
373
tradable: false
374
tradable: false,
375
creditsCost: 1500
374
376
};
375
377
} else if (uniqueName == "/Lotus/Types/Keys/DerelictSurvivalKeyBlueprint") {
376
378
// Orokin Derelict Survival bp. Removed in 28.3.0
@@ -382,7 +384,6 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
382
384
consumeOnUse: false,
383
385
num: 1,
384
386
codexSecret: false,
385
alwaysAvailable: true,
386
387
ingredients: [
387
388
{
388
389
ItemType: "/Lotus/Types/Items/MiscItems/NavCode",
@@ -402,7 +403,8 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
402
403
}
403
404
],
404
405
excludeFromMarket: true,
405
tradable: false
406
tradable: false,
407
creditsCost: 1500
406
408
};
407
409
} else if (uniqueName == "/Lotus/Types/Keys/VeyHekKeyBlueprint") {
408
410
// Vay Hek Frequency Triangulator (Assassination key) bp. Removed in 15.13.0
@@ -414,7 +416,6 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
414
416
consumeOnUse: false,
415
417
num: 1,
416
418
codexSecret: false,
417
alwaysAvailable: true,
418
419
ingredients: [
419
420
{
420
421
ItemType: "/Lotus/Types/Items/MiscItems/VayHekCoordinateFragmentA",
@@ -434,7 +435,8 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
434
435
}
435
436
],
436
437
excludeFromMarket: true,
437
tradable: false
438
tradable: false,
439
creditsCost: 10000
438
440
};
439
441
}
440
442
@@ -593,13 +595,13 @@ export const getLevelKeyRewards = (
593
595
levelKey: string,
594
596
buildLabel: string | undefined
595
597
): { levelKeyRewards?: IMissionReward; levelKeyRewards2?: TReward[]; levelMission?: Partial<IRegion> } => {
596
const key = ExportKeys[levelKey] as IKey | undefined;
598
const key = getKey(levelKey);
597
599
598
600
const levelKeyRewards = key?.missionReward;
599
601
let levelKeyRewards2 = key?.rewards;
600
602
const levelMission = key?.mission;
601
603
602
if (!levelKeyRewards && !levelKeyRewards2) {
604
if (!levelKeyRewards && !levelKeyRewards2 && !levelMission) {
603
605
logger.warn(
604
606
`Could not find any reward information for ${levelKey}, gonna have to potentially short-change you`
605
607
);
@@ -913,6 +915,160 @@ export const getBoosterPack = (uniqueName: string, buildLabel: string = ""): IBo
913
915
return ExportBoosterPacks[uniqueName];
914
916
};
915
917
918
export const getKey = (uniqueName: string): IKey | undefined => {
919
if (
920
uniqueName == "/Lotus/Types/Keys/RaidKeys/Raid01Stage01KeyItem" ||
921
uniqueName == "/Lotus/Types/Keys/RaidKeys/Raid01Stage01NightmareKeyItem"
922
) {
923
return {
924
name: "/Lotus/Language/Items/GrineerTrialsName",
925
description: "/Lotus/Language/Items/GrineerTrialsDesc",
926
icon: "/Lotus/Interface/Quests/GrineerRaidKeyChain.png",
927
parentName: "/Lotus/Types/Keys/RaidKeys/BaseRaidKey",
928
codexSecret: true,
929
mission: {
930
minEnemyLevel: 70,
931
maxEnemyLevel: 80
932
}
933
};
934
} else if (
935
uniqueName == "/Lotus/Types/Keys/RaidKeys/Raid01Stage02KeyItem" ||
936
uniqueName == "/Lotus/Types/Keys/RaidKeys/Raid01Stage02NightmareKeyItem"
937
) {
938
return {
939
name: "/Lotus/Language/Items/GrineerTrialsName",
940
description: "/Lotus/Language/Items/GrineerTrialsDesc",
941
icon: "/Lotus/Interface/Quests/GrineerRaidKeyChain.png",
942
parentName: "/Lotus/Types/Keys/RaidKeys/BaseRaidKey",
943
codexSecret: true,
944
mission: {
945
minEnemyLevel: 80,
946
maxEnemyLevel: 90
947
}
948
};
949
} else if (uniqueName == "/Lotus/Types/Keys/RaidKeys/Raid01Stage03KeyItem") {
950
return {
951
name: "/Lotus/Language/Items/GrineerTrialsName",
952
description: "/Lotus/Language/Items/GrineerTrialsDesc",
953
icon: "/Lotus/Interface/Quests/GrineerRaidKeyChain.png",
954
parentName: "/Lotus/Types/Keys/RaidKeys/BaseRaidKey",
955
codexSecret: true,
956
missionReward: {
957
credits: 200000,
958
droptable: "/Lotus/Types/Game/MissionDecks/RaidRewards/HekRaid"
959
},
960
mission: {
961
minEnemyLevel: 80,
962
maxEnemyLevel: 100
963
}
964
};
965
} else if (uniqueName == "/Lotus/Types/Keys/RaidKeys/Raid01Stage03NightmareKeyItem") {
966
return {
967
name: "/Lotus/Language/Items/GrineerNightmareTrialsName",
968
description: "/Lotus/Language/Items/GrineerTrialsDesc",
969
icon: "/Lotus/Interface/Quests/GrineerRaidKeyChain.png",
970
parentName: "/Lotus/Types/Keys/RaidKeys/BaseRaidKey",
971
codexSecret: true,
972
missionReward: {
973
credits: 250000,
974
droptable: "/Lotus/Types/Game/MissionDecks/RaidRewards/NightmareHekRaid"
975
},
976
mission: {
977
minEnemyLevel: 80,
978
maxEnemyLevel: 100
979
}
980
};
981
} else if (uniqueName == "/Lotus/Types/Keys/RaidKeys/RaidGolemStage01KeyItem") {
982
return {
983
name: "/Lotus/Language/Items/GolemTrialsName",
984
description: "/Lotus/Language/Items/GolemTrialsDesc",
985
icon: "/Lotus/Interface/Icons/Store/GolemRaidKey.png",
986
parentName: "/Lotus/Types/Keys/RaidKeys/BaseRaidKey",
987
codexSecret: true,
988
mission: {
989
minEnemyLevel: 86,
990
maxEnemyLevel: 88
991
}
992
};
993
} else if (uniqueName == "/Lotus/Types/Keys/RaidKeys/RaidGolemStage02KeyItem") {
994
return {
995
name: "/Lotus/Language/Items/GolemTrialsName",
996
description: "/Lotus/Language/Items/GolemTrialsDesc",
997
icon: "/Lotus/Interface/Icons/Store/GolemRaidKey.png",
998
parentName: "/Lotus/Types/Keys/RaidKeys/BaseRaidKey",
999
codexSecret: true,
1000
mission: {
1001
minEnemyLevel: 88,
1002
maxEnemyLevel: 92
1003
}
1004
};
1005
} else if (uniqueName == "/Lotus/Types/Keys/RaidKeys/RaidGolemStage03KeyItem") {
1006
return {
1007
name: "/Lotus/Language/Items/GolemTrialsName",
1008
description: "/Lotus/Language/Items/GolemTrialsDesc",
1009
icon: "/Lotus/Interface/Icons/Store/GolemRaidKey.png",
1010
parentName: "/Lotus/Types/Keys/RaidKeys/BaseRaidKey",
1011
codexSecret: true,
1012
missionReward: {
1013
credits: 300000,
1014
items: ["/Lotus/StoreItems/Upgrades/Mods/FusionBundles/RareFusionBundle"],
1015
droptable: "/Lotus/Types/Game/MissionDecks/RaidRewards/GolemRaid"
1016
},
1017
mission: {
1018
minEnemyLevel: 92,
1019
maxEnemyLevel: 97
1020
}
1021
};
1022
} else if (uniqueName == "/Lotus/Types/Keys/DerelictGolemKey") {
1023
return {
1024
name: "/Lotus/Language/Items/OrokinDerelictBossKey",
1025
description: "/Lotus/Language/Items/OrokinDerelictBossKeyDesc",
1026
icon: "/Lotus/Interface/Icons/Store/OrokinDerelictKey.png",
1027
parentName: "/Lotus/Types/Game/KeyItems/DerelictKeyItem",
1028
codexSecret: false,
1029
missionReward: {
1030
credits: 7500,
1031
droptable: "/Lotus/Types/Game/MissionDecks/GolemMissionRewards"
1032
},
1033
mission: {
1034
minEnemyLevel: 25,
1035
maxEnemyLevel: 35
1036
}
1037
};
1038
} else if (uniqueName == "/Lotus/Types/Keys/DerelictSabotageKey") {
1039
return {
1040
name: "/Lotus/Language/Items/OrokinDerelictSabotageKey",
1041
description: "/Lotus/Language/Items/OrokinDerelictSabotageKeyDesc",
1042
icon: "/Lotus/Interface/Icons/Store/OrokinDerelictKey.png",
1043
parentName: "/Lotus/Types/Game/KeyItems/DerelictKeyItem",
1044
codexSecret: false,
1045
cacheRewardManifest: "/Lotus/Types/Game/MissionDecks/OrokinDerelictSabotageRewards",
1046
mission: {
1047
minEnemyLevel: 25,
1048
maxEnemyLevel: 35
1049
}
1050
};
1051
} else if (uniqueName.startsWith("/Lotus/Types/Keys/Derelict")) {
1052
return {
1053
name: "/Lotus/Language/Items/OrokinDerelictCaptureKey",
1054
description: "/Lotus/Language/Items/OrokinDerelictCaptureKeyDesc",
1055
icon: "/Lotus/Interface/Icons/Store/OrokinDerelictKey.png",
1056
parentName: "/Lotus/Types/Game/KeyItems/DerelictKeyItem",
1057
codexSecret: false,
1058
mission: {
1059
minEnemyLevel: 25,
1060
maxEnemyLevel: 35
1061
}
1062
};
1063
}
1064
1065
return ExportKeys[uniqueName];
1066
};
1067
1068
export const getMissionDeck = (uniqueName: string): TMissionDeck | undefined => {
1069
return ExportRewards[uniqueName];
1070
};
1071
916
1072
export const getPrice = (
917
1073
storeItemName: string,
918
1074
quantity: number = 1,
@@ -972,6 +1128,15 @@ export const getPrice = (
972
1128
} else if (!usePremium && "creditsCost" in item) {
973
1129
price = item.creditsCost;
974
1130
}
1131
} else {
1132
const recipe = getRecipe(internalName);
1133
if (recipe) {
1134
if (usePremium && "platinumCost" in recipe) {
1135
price = recipe.platinumCost;
1136
} else if (!usePremium && "creditsCost" in recipe) {
1137
price = recipe.creditsCost;
1138
}
1139
}
975
1140
}
976
1141
977
1142
if (usePremium) {
@@ -8,7 +8,6 @@ import {
8
8
ExportAnimals,
9
9
ExportEnemies,
10
10
ExportFusionBundles,
11
ExportKeys,
12
11
ExportRegions,
13
12
ExportRelics,
14
13
ExportRewards
@@ -52,7 +51,14 @@ import {
52
51
import { updateQuestKey } from "./questService.ts";
53
52
import { Types } from "mongoose";
54
53
import type { IAffiliationMods, IInventoryChanges } from "../types/purchaseTypes.ts";
55
import { fromStoreItem, getLevelKeyRewards, isStoreItem, toStoreItem } from "./itemDataService.ts";
54
import {
55
fromStoreItem,
56
getKey,
57
getLevelKeyRewards,
58
getMissionDeck,
59
isStoreItem,
60
toStoreItem
61
} from "./itemDataService.ts";
56
62
import type { TInventoryDatabaseDocument } from "../models/inventoryModels/inventoryModel.ts";
57
63
import { getEntriesUnsafe } from "../utils/ts-utils.ts";
58
64
import { handleStoreItemAcquisition } from "./purchaseService.ts";
@@ -1843,11 +1849,12 @@ export const addFixedLevelRewards = (
1843
1849
}
1844
1850
}
1845
1851
if (rewards.droptable) {
1846
if (rewards.droptable in ExportRewards) {
1852
const metaDroptable = getMissionDeck(rewards.droptable);
1853
if (metaDroptable) {
1847
1854
const rotations: number[] = rewardInfo ? getRotations(rewardInfo) : [0];
1848
1855
logger.debug(`rolling ${rewards.droptable} for level key rewards`, { rotations });
1849
1856
for (const tier of rotations) {
1850
const reward = getRandomRewardByChance(ExportRewards[rewards.droptable][tier]);
1857
const reward = getRandomRewardByChance(metaDroptable[tier]);
1851
1858
if (reward) {
1852
1859
MissionRewards.push({
1853
1860
StoreItem: reward.type,
@@ -2291,17 +2298,25 @@ function getRandomMissionDrops(
2291
2298
}
2292
2299
}
2293
2300
if (currentMissionKey) {
2294
const keyMeta = ExportKeys[currentMissionKey];
2295
if (keyMeta.cacheRewardManifest) {
2296
const deck = ExportRewards[keyMeta.cacheRewardManifest];
2297
for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
2298
const drop = getRandomRewardByChance(deck[rotation]);
2299
if (drop) {
2300
drops.push({
2301
StoreItem: drop.type,
2302
ItemCount: drop.itemCount,
2303
FromEnemyCache: true
2304
});
2301
const keyMeta = getKey(currentMissionKey);
2302
if (!keyMeta) {
2303
logger.error(`unknown levelKey ${currentMissionKey} while proccesing EnemyCachesFound`);
2304
} else if (keyMeta.cacheRewardManifest) {
2305
const deck = getMissionDeck(keyMeta.cacheRewardManifest);
2306
if (!deck) {
2307
logger.error(
2308
`unknown droptable ${keyMeta.cacheRewardManifest} while proccesing EnemyCachesFound`
2309
);
2310
} else {
2311
for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
2312
const drop = getRandomRewardByChance(deck[rotation]);
2313
if (drop) {
2314
drops.push({
2315
StoreItem: drop.type,
2316
ItemCount: drop.itemCount,
2317
FromEnemyCache: true
2318
});
2319
}
2305
2320
}
2306
2321
}
2307
2322
}
@@ -2323,17 +2338,23 @@ function getRandomMissionDrops(
2323
2338
}
2324
2339
}
2325
2340
} else if (levelKeyName) {
2326
const keyMeta = ExportKeys[levelKeyName];
2327
if (keyMeta.cacheRewardManifest) {
2328
const deck = ExportRewards[keyMeta.cacheRewardManifest];
2329
for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
2330
const drop = getRandomRewardByChance(deck[rotation]);
2331
if (drop) {
2332
drops.push({
2333
StoreItem: drop.type,
2334
ItemCount: drop.itemCount,
2335
FromEnemyCache: true
2336
});
2341
const keyMeta = getKey(levelKeyName);
2342
if (!keyMeta) {
2343
logger.error(`unknown levelKey ${levelKeyName} while proccesing EnemyCachesFound`);
2344
} else if (keyMeta.cacheRewardManifest) {
2345
const deck = getMissionDeck(keyMeta.cacheRewardManifest);
2346
if (!deck) {
2347
logger.error(`unknown droptable ${keyMeta.cacheRewardManifest} while proccesing EnemyCachesFound`);
2348
} else {
2349
for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
2350
const drop = getRandomRewardByChance(deck[rotation]);
2351
if (drop) {
2352
drops.push({
2353
StoreItem: drop.type,
2354
ItemCount: drop.itemCount,
2355
FromEnemyCache: true
2356
});
2357
}
2337
2358
}
2338
2359
}
2339
2360
}
@@ -498,6 +498,11 @@ function fetchItemList() {
498
498
name: loc("code_pigment")
499
499
});
500
500
501
data.miscitems.push({
502
uniqueName: "/Lotus/Types/Items/MiscItems/BossNavCode",
503
name: loc("code_bossNavCode")
504
});
505
501
506
data.VarziaOffers.unshift({
502
507
uniqueName: "",
503
508
name: loc("disabled")
@@ -69,6 +69,7 @@ dict = {
69
69
code_completed: `Abgeschlossen`,
70
70
code_active: `Aktiv`,
71
71
code_pigment: `Pigment`,
72
code_bossNavCode: `Lephantis Nav-Koordinaten`,
72
73
code_controller: `Controller-Cursor`,
73
74
code_mouseLine: `Linien-Cursor`,
74
75
code_mouse: `Cursor`,
@@ -68,6 +68,7 @@ dict = {
68
68
code_completed: `Completed`,
69
69
code_active: `Active`,
70
70
code_pigment: `Pigment`,
71
code_bossNavCode: `Lephantis Nav Coordinate`,
71
72
code_controller: `Controller cursor`,
72
73
code_mouseLine: `Line cursor`,
73
74
code_mouse: `Cursor`,
@@ -69,6 +69,7 @@ dict = {
69
69
code_completed: `Completada`,
70
70
code_active: `Activa`,
71
71
code_pigment: `Pigmento`,
72
code_bossNavCode: `Coordenadas de Navegación de Lephantis`,
72
73
code_controller: `Cursor de Mando`,
73
74
code_mouseLine: `Cursor de línea`,
74
75
code_mouse: `Cursor`,
@@ -69,6 +69,7 @@ dict = {
69
69
code_completed: `Complétée`,
70
70
code_active: `Active`,
71
71
code_pigment: `Pigment`,
72
code_bossNavCode: `Coord. Nav de Lephantis`,
72
73
code_controller: `Curseur manette`,
73
74
code_mouseLine: `Curseur linéaire`,
74
75
code_mouse: `Curseur`,
@@ -69,6 +69,7 @@ dict = {
69
69
code_completed: `Завершено`,
70
70
code_active: `Активный`,
71
71
code_pigment: `Пигмент`,
72
code_bossNavCode: `Координаты Лефантиса`,
72
73
code_controller: `Курсор контроллера`,
73
74
code_mouseLine: `Линейный курсор`,
74
75
code_mouse: `Курсор`,
@@ -69,6 +69,7 @@ dict = {
69
69
code_completed: `Завершено`,
70
70
code_active: `Активний`,
71
71
code_pigment: `Барвник`,
72
code_bossNavCode: `Навкоордината Лефантиса`,
72
73
code_controller: `Курсор контролера`,
73
74
code_mouseLine: `Лінійний курсор`,
74
75
code_mouse: `Курсор`,
@@ -69,6 +69,7 @@ dict = {
69
69
code_completed: `已完成`,
70
70
code_active: `正在执行`,
71
71
code_pigment: `颜料`,
72
code_bossNavCode: `雷凡魔像导航坐标`,
72
73
code_controller: `[UNTRANSLATED] Controller cursor`,
73
74
code_mouseLine: `[UNTRANSLATED] Line cursor`,
74
75
code_mouse: `[UNTRANSLATED] Cursor`,