diff --git a/src/controllers/api/updateQuestController.ts b/src/controllers/api/updateQuestController.ts index 3a91ada0..875d8089 100644 --- a/src/controllers/api/updateQuestController.ts +++ b/src/controllers/api/updateQuestController.ts @@ -3,8 +3,7 @@ import { parseString } from "@/src/helpers/general"; import { logger } from "@/src/utils/logger"; import { getJSONfromString } from "@/src/helpers/stringHelpers"; import { updateQuestKey, IUpdateQuestRequest } from "@/src/services/questService"; -import { getQuestCompletionItems } from "@/src/services/itemDataService"; -import { addItems, getInventory } from "@/src/services/inventoryService"; +import { getInventory, handleKeyRewards } from "@/src/services/inventoryService"; import { IInventoryChanges } from "@/src/types/purchaseTypes"; // eslint-disable-next-line @typescript-eslint/no-misused-promises @@ -27,13 +26,7 @@ export const updateQuestController: RequestHandler = async (req, res) => { if (updateQuestRequest.QuestKeys[0].Completed) { logger.debug(`completed quest ${updateQuestRequest.QuestKeys[0].ItemType} `); const questKeyName = updateQuestRequest.QuestKeys[0].ItemType; - const questCompletionItems = getQuestCompletionItems(questKeyName); - logger.debug(`quest completion items`, questCompletionItems); - - if (questCompletionItems) { - const inventoryChanges = await addItems(inventory, questCompletionItems); - updateQuestResponse.InventoryChanges = inventoryChanges; - } + updateQuestResponse.InventoryChanges = await handleKeyRewards(inventory, questKeyName); inventory.ActiveQuest = ""; } diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index 1241d61c..01647562 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -31,7 +31,7 @@ import { IUpdateChallengeProgressRequest } from "../types/requestTypes"; import { logger } from "@/src/utils/logger"; -import { getExalted, getKeyChainItems } from "@/src/services/itemDataService"; +import { getExalted, getKeyChainItems, getKeyRewards } from "@/src/services/itemDataService"; import { IEquipmentClient, IItemConfig } from "../types/inventoryTypes/commonInventoryTypes"; import { ExportArcanes, @@ -50,6 +50,7 @@ import { createShip } from "./shipService"; import { creditBundles, fusionBundles } from "@/src/services/missionInventoryUpdateService"; import { IKeyChainRequest } from "@/src/controllers/api/giveKeyChainTriggeredItemsController"; import { toOid } from "../helpers/inventoryHelpers"; +import { handleStoreItemAcquisition } from "@/src/services/purchaseService"; export const createInventory = async ( accountOwnerId: Types.ObjectId, @@ -464,20 +465,29 @@ export const addItem = async ( } } case "Game": { - if (typeName.substr(1).split("/")[3] == "Projections") { - // Void Relics, e.g. /Lotus/Types/Game/Projections/T2VoidProjectionGaussPrimeDBronze - const miscItemChanges = [ - { - ItemType: typeName, - ItemCount: quantity - } satisfies IMiscItem - ]; - addMiscItems(inventory, miscItemChanges); - return { - InventoryChanges: { - MiscItems: miscItemChanges - } - }; + switch (typeName.substr(1).split("/")[3]) { + case "Projections": + // Void Relics, e.g. /Lotus/Types/Game/Projections/T2VoidProjectionGaussPrimeDBronze + const miscItemChanges = [ + { + ItemType: typeName, + ItemCount: quantity + } satisfies IMiscItem + ]; + addMiscItems(inventory, miscItemChanges); + return { + InventoryChanges: { + MiscItems: miscItemChanges + } + }; + case "CrewShip": + // Plexus - /Lotus/Types/Game/CrewShip/RailJack/DefaultHarness + const inventoryChanges = addCrewShipHarness(inventory, typeName); + return { + InventoryChanges: { + ...inventoryChanges + } + }; } break; } @@ -1158,3 +1168,45 @@ export const addKeyChainItems = async ( return inventoryChanges; }; + +export const handleKeyRewards = async ( + inventory: TInventoryDatabaseDocument, + keyType: string +): Promise => { + const keyRewards = getKeyRewards(keyType); + const inventoryChanges: IInventoryChanges = {}; + const itemsToAdd: ITypeCount[] = []; + if (keyRewards) { + for (const item of keyRewards) { + let changes: IInventoryChanges = {}; + + switch (item.rewardType) { + case "RT_CREDITS": + const currencyChanges = updateCurrency(inventory, -item.amount, false); + changes = { ...currencyChanges } as IInventoryChanges; + break; + + case "RT_STORE_ITEM": + changes = (await handleStoreItemAcquisition(item.itemType, inventory, 1)).InventoryChanges; + break; + + case "RT_RECIPE": + itemsToAdd.push({ ItemType: item.itemType, ItemCount: 1 }); + break; + + case "RT_RESOURCE": + itemsToAdd.push({ ItemType: item.itemType, ItemCount: item.amount }); + break; + } + + combineInventoryChanges(inventoryChanges, changes); + } + } + + if (itemsToAdd.length > 0) { + const resourceChanges = await addItems(inventory, itemsToAdd); + combineInventoryChanges(inventoryChanges, resourceChanges); + } + + return inventoryChanges; +}; diff --git a/src/services/itemDataService.ts b/src/services/itemDataService.ts index d68ef666..e67f2f94 100644 --- a/src/services/itemDataService.ts +++ b/src/services/itemDataService.ts @@ -1,6 +1,5 @@ import { IKeyChainRequest } from "@/src/controllers/api/giveKeyChainTriggeredItemsController"; import { getIndexAfter } from "@/src/helpers/stringHelpers"; -import { ITypeCount } from "@/src/types/inventoryTypes/inventoryTypes"; import { logger } from "@/src/utils/logger"; import { dict_de, @@ -32,7 +31,6 @@ import { IRecipe, IRegion } from "warframe-public-export-plus"; -import questCompletionItems from "@/static/fixed_responses/questCompletionRewards.json"; export type WeaponTypeInternal = | "LongGuns" @@ -162,23 +160,6 @@ export const getKeyChainItems = ({ KeyChain, ChainStage }: IKeyChainRequest): st return keyChainStage.itemsToGiveWhenTriggered; }; -export const getLevelKeyRewards = (levelKey: string) => { - const levelKeyData = ExportKeys[levelKey]; - if (!levelKeyData) { - const error = `LevelKey ${levelKey} not found`; - logger.error(error); - throw new Error(error); - } - - if (!levelKeyData.rewards) { - const error = `LevelKey ${levelKey} does not contain rewards`; - logger.error(error); - throw new Error(error); - } - - return levelKeyData.rewards; -}; - export const getNode = (nodeName: string): IRegion => { const node = ExportRegions[nodeName]; if (!node) { @@ -188,15 +169,19 @@ export const getNode = (nodeName: string): IRegion => { return node; }; -export const getQuestCompletionItems = (questKey: string) => { - const items = (questCompletionItems as unknown as Record | undefined)?.[questKey]; - - if (!items) { - logger.error( - `Quest ${questKey} not found in questCompletionItems, quest completion items have not been given. This is a temporary solution` - ); +export const getKeyRewards = (key: string) => { + const keyData = ExportKeys[key]; + if (!keyData) { + const error = `Key ${key} not found in ExportKeys`; + logger.error(error); } - return items; + + if (!keyData.rewards) { + const error = `Key ${key} does not contain rewards`; + logger.debug(error); + } + + return keyData.rewards; }; export const getKeyChainMessage = ({ KeyChain, ChainStage }: IKeyChainRequest) => { diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 0cf0a0c7..ad085d83 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -17,12 +17,13 @@ import { addMods, addRecipes, combineInventoryChanges, + handleKeyRewards, updateSyndicate } from "@/src/services/inventoryService"; import { updateQuestKey } from "@/src/services/questService"; import { HydratedDocument } from "mongoose"; import { IInventoryChanges } from "@/src/types/purchaseTypes"; -import { getLevelKeyRewards, getNode } from "@/src/services/itemDataService"; +import { getNode } from "@/src/services/itemDataService"; import { InventoryDocumentProps, TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel"; import { getEntriesUnsafe } from "@/src/utils/ts-utils"; import { IEquipmentClient } from "@/src/types/inventoryTypes/commonInventoryTypes"; @@ -252,20 +253,8 @@ export const addMissionRewards = async ( let missionCompletionCredits = 0; //inventory change is what the client has not rewarded itself, also the client needs to know the credit changes for display if (levelKeyName) { - const fixedLevelRewards = getLevelKeyRewards(levelKeyName); - //logger.debug(`fixedLevelRewards ${fixedLevelRewards}`); - for (const reward of fixedLevelRewards) { - //quest stage completion credit rewards - if (reward.rewardType == "RT_CREDITS") { - inventory.RegularCredits += reward.amount; - missionCompletionCredits += reward.amount; - continue; - } - MissionRewards.push({ - StoreItem: reward.itemType, - ItemCount: reward.rewardType === "RT_RESOURCE" ? reward.amount : 1 - }); - } + const levelFixedRewards = await handleKeyRewards(inventory, levelKeyName); + combineInventoryChanges(inventoryChanges, levelFixedRewards); } for (const reward of MissionRewards) { diff --git a/static/fixed_responses/questCompletionRewards.json b/static/fixed_responses/questCompletionRewards.json deleted file mode 100644 index 9d727f64..00000000 --- a/static/fixed_responses/questCompletionRewards.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain": [ - { - "ItemType": "/Lotus/Types/Keys/DuviriQuest/DuviriQuestKeyChain", - "ItemCount": 1 - }, - { - "ItemType": "/Lotus/Types/NeutralCreatures/ErsatzHorse/ErsatzHorsePowerSuit", - "ItemCount": 1 - } - ], - "/Lotus/Types/Keys/InfestedMicroplanetQuest/InfestedMicroplanetQuestKeyChain": [{ "ItemType": "/Lotus/Types/Recipes/WarframeRecipes/BrokenFrameBlueprint", "ItemCount": 1 }] -}