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: 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
AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
提交于

代码差异

11 个文件 +273 -50
Modified src/services/inventoryService.ts +25 -0
@@ -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": {
Modified src/services/itemDataService.ts +189 -24
@@ -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) {
Modified src/services/missionInventoryUpdateService.ts +47 -26
@@ -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 }
Modified static/webui/script.js +5 -0
@@ -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")
Modified static/webui/translations/de.js +1 -0
@@ -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`,
Modified static/webui/translations/en.js +1 -0
@@ -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`,
Modified static/webui/translations/es.js +1 -0
@@ -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`,
Modified static/webui/translations/fr.js +1 -0
@@ -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`,
Modified static/webui/translations/ru.js +1 -0
@@ -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: `Курсор`,
Modified static/webui/translations/uk.js +1 -0
@@ -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: `Курсор`,
Modified static/webui/translations/zh.js +1 -0
@@ -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`,