From 0c6f6e556f152067ca64895e2100cd903df6cc23 Mon Sep 17 00:00:00 2001 From: Sainan Date: Thu, 2 Jan 2025 08:54:27 +0100 Subject: [PATCH 1/3] feat: infusing abilities (#676) --- src/controllers/api/upgradesController.ts | 203 ++++++++++++---------- src/services/itemDataService.ts | 4 + 2 files changed, 118 insertions(+), 89 deletions(-) diff --git a/src/controllers/api/upgradesController.ts b/src/controllers/api/upgradesController.ts index 4319598c..e21d54d0 100644 --- a/src/controllers/api/upgradesController.ts +++ b/src/controllers/api/upgradesController.ts @@ -3,11 +3,13 @@ import { IUpgradesRequest } from "@/src/types/requestTypes"; import { ArtifactPolarity, IEquipmentDatabase, - EquipmentFeatures + EquipmentFeatures, + IAbilityOverride } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes"; import { getAccountIdForRequest } from "@/src/services/loginService"; import { addMiscItems, getInventory, updateCurrency } from "@/src/services/inventoryService"; +import { getRecipeByResult } from "@/src/services/itemDataService"; export const upgradesController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); @@ -28,97 +30,120 @@ export const upgradesController: RequestHandler = async (req, res) => { ]); } - switch (operation.UpgradeRequirement) { - case "/Lotus/Types/Items/MiscItems/OrokinReactor": - case "/Lotus/Types/Items/MiscItems/OrokinCatalyst": - for (const item of inventory[payload.ItemCategory]) { - if (item._id.toString() == payload.ItemId.$oid) { - item.Features ??= 0; - item.Features |= EquipmentFeatures.DOUBLE_CAPACITY; - break; - } + if (operation.OperationType == "UOT_ABILITY_OVERRIDE") { + console.assert(payload.ItemCategory == "Suits"); + const suit = inventory.Suits.find(x => x._id.toString() == payload.ItemId.$oid)!; + + let newAbilityOverride: IAbilityOverride | undefined; + if (operation.UpgradeRequirement != "") { + newAbilityOverride = { + Ability: operation.UpgradeRequirement, + Index: operation.PolarizeSlot + }; + + const recipe = getRecipeByResult(operation.UpgradeRequirement)!; + for (const ingredient of recipe.ingredients) { + inventory.InfestedFoundry!.Resources!.find(x => x.ItemType == ingredient.ItemType)!.Count -= + ingredient.ItemCount; } - break; - case "/Lotus/Types/Items/MiscItems/UtilityUnlocker": - case "/Lotus/Types/Items/MiscItems/WeaponUtilityUnlocker": - for (const item of inventory[payload.ItemCategory]) { - if (item._id.toString() == payload.ItemId.$oid) { - item.Features ??= 0; - item.Features |= EquipmentFeatures.UTILITY_SLOT; - break; - } - } - break; - case "/Lotus/Types/Items/MiscItems/HeavyWeaponCatalyst": - console.assert(payload.ItemCategory == "SpaceGuns"); - for (const item of inventory[payload.ItemCategory]) { - if (item._id.toString() == payload.ItemId.$oid) { - item.Features ??= 0; - item.Features |= EquipmentFeatures.GRAVIMAG_INSTALLED; - break; - } - } - break; - case "/Lotus/Types/Items/MiscItems/WeaponPrimaryArcaneUnlocker": - case "/Lotus/Types/Items/MiscItems/WeaponSecondaryArcaneUnlocker": - case "/Lotus/Types/Items/MiscItems/WeaponMeleeArcaneUnlocker": - case "/Lotus/Types/Items/MiscItems/WeaponAmpArcaneUnlocker": - for (const item of inventory[payload.ItemCategory]) { - if (item._id.toString() == payload.ItemId.$oid) { - item.Features ??= 0; - item.Features |= EquipmentFeatures.ARCANE_SLOT; - break; - } - } - break; - case "/Lotus/Types/Items/MiscItems/Forma": - case "/Lotus/Types/Items/MiscItems/FormaUmbra": - case "/Lotus/Types/Items/MiscItems/FormaAura": - case "/Lotus/Types/Items/MiscItems/FormaStance": - for (const item of inventory[payload.ItemCategory]) { - if (item._id.toString() == payload.ItemId.$oid) { - item.XP = 0; - setSlotPolarity(item, operation.PolarizeSlot, operation.PolarizeValue); - item.Polarized ??= 0; - item.Polarized += 1; - break; - } - } - break; - case "/Lotus/Types/Items/MiscItems/ModSlotUnlocker": - for (const item of inventory[payload.ItemCategory]) { - if (item._id.toString() == payload.ItemId.$oid) { - item.ModSlotPurchases ??= 0; - item.ModSlotPurchases += 1; - break; - } - } - break; - case "/Lotus/Types/Items/MiscItems/CustomizationSlotUnlocker": - for (const item of inventory[payload.ItemCategory]) { - if (item._id.toString() == payload.ItemId.$oid) { - item.CustomizationSlotPurchases ??= 0; - item.CustomizationSlotPurchases += 1; - break; - } - } - break; - case "": - console.assert(operation.OperationType == "UOT_SWAP_POLARITY"); - for (const item of inventory[payload.ItemCategory]) { - if (item._id.toString() == payload.ItemId.$oid) { - for (let i = 0; i != operation.PolarityRemap.length; ++i) { - if (operation.PolarityRemap[i].Slot != i) { - setSlotPolarity(item, i, operation.PolarityRemap[i].Value); - } + } + + for (const entry of operation.PolarityRemap) { + suit.Configs[entry.Slot] ??= {}; + suit.Configs[entry.Slot].AbilityOverride = newAbilityOverride; + } + } else + switch (operation.UpgradeRequirement) { + case "/Lotus/Types/Items/MiscItems/OrokinReactor": + case "/Lotus/Types/Items/MiscItems/OrokinCatalyst": + for (const item of inventory[payload.ItemCategory]) { + if (item._id.toString() == payload.ItemId.$oid) { + item.Features ??= 0; + item.Features |= EquipmentFeatures.DOUBLE_CAPACITY; + break; } - break; } - } - break; - default: - throw new Error("Unsupported upgrade: " + operation.UpgradeRequirement); - } + break; + case "/Lotus/Types/Items/MiscItems/UtilityUnlocker": + case "/Lotus/Types/Items/MiscItems/WeaponUtilityUnlocker": + for (const item of inventory[payload.ItemCategory]) { + if (item._id.toString() == payload.ItemId.$oid) { + item.Features ??= 0; + item.Features |= EquipmentFeatures.UTILITY_SLOT; + break; + } + } + break; + case "/Lotus/Types/Items/MiscItems/HeavyWeaponCatalyst": + console.assert(payload.ItemCategory == "SpaceGuns"); + for (const item of inventory[payload.ItemCategory]) { + if (item._id.toString() == payload.ItemId.$oid) { + item.Features ??= 0; + item.Features |= EquipmentFeatures.GRAVIMAG_INSTALLED; + break; + } + } + break; + case "/Lotus/Types/Items/MiscItems/WeaponPrimaryArcaneUnlocker": + case "/Lotus/Types/Items/MiscItems/WeaponSecondaryArcaneUnlocker": + case "/Lotus/Types/Items/MiscItems/WeaponMeleeArcaneUnlocker": + case "/Lotus/Types/Items/MiscItems/WeaponAmpArcaneUnlocker": + for (const item of inventory[payload.ItemCategory]) { + if (item._id.toString() == payload.ItemId.$oid) { + item.Features ??= 0; + item.Features |= EquipmentFeatures.ARCANE_SLOT; + break; + } + } + break; + case "/Lotus/Types/Items/MiscItems/Forma": + case "/Lotus/Types/Items/MiscItems/FormaUmbra": + case "/Lotus/Types/Items/MiscItems/FormaAura": + case "/Lotus/Types/Items/MiscItems/FormaStance": + for (const item of inventory[payload.ItemCategory]) { + if (item._id.toString() == payload.ItemId.$oid) { + item.XP = 0; + setSlotPolarity(item, operation.PolarizeSlot, operation.PolarizeValue); + item.Polarized ??= 0; + item.Polarized += 1; + break; + } + } + break; + case "/Lotus/Types/Items/MiscItems/ModSlotUnlocker": + for (const item of inventory[payload.ItemCategory]) { + if (item._id.toString() == payload.ItemId.$oid) { + item.ModSlotPurchases ??= 0; + item.ModSlotPurchases += 1; + break; + } + } + break; + case "/Lotus/Types/Items/MiscItems/CustomizationSlotUnlocker": + for (const item of inventory[payload.ItemCategory]) { + if (item._id.toString() == payload.ItemId.$oid) { + item.CustomizationSlotPurchases ??= 0; + item.CustomizationSlotPurchases += 1; + break; + } + } + break; + case "": + console.assert(operation.OperationType == "UOT_SWAP_POLARITY"); + for (const item of inventory[payload.ItemCategory]) { + if (item._id.toString() == payload.ItemId.$oid) { + for (let i = 0; i != operation.PolarityRemap.length; ++i) { + if (operation.PolarityRemap[i].Slot != i) { + setSlotPolarity(item, i, operation.PolarityRemap[i].Value); + } + } + break; + } + } + break; + default: + throw new Error("Unsupported upgrade: " + operation.UpgradeRequirement); + } } await inventory.save(); res.json({ InventoryChanges: {} }); diff --git a/src/services/itemDataService.ts b/src/services/itemDataService.ts index b1c8be02..f45f759b 100644 --- a/src/services/itemDataService.ts +++ b/src/services/itemDataService.ts @@ -65,6 +65,10 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => { return ExportRecipes[uniqueName]; }; +export const getRecipeByResult = (resultType: string): IRecipe | undefined => { + return Object.values(ExportRecipes).find(x => x.resultType == resultType); +}; + export const getExalted = (uniqueName: string): string[] | undefined => { return getSuitByUniqueName(uniqueName)?.exalted; }; -- 2.47.2 From 52d1b72701af55329e7b1f494d4d64b4bf488b0e Mon Sep 17 00:00:00 2001 From: Sainan Date: Thu, 2 Jan 2025 08:55:04 +0100 Subject: [PATCH 2/3] fix: selling MiscItems doesn't remove them from inventory (#680) --- src/controllers/api/sellController.ts | 10 ++++++++++ src/types/sellTypes.ts | 1 + 2 files changed, 11 insertions(+) diff --git a/src/controllers/api/sellController.ts b/src/controllers/api/sellController.ts index 55ff8358..0c877fea 100644 --- a/src/controllers/api/sellController.ts +++ b/src/controllers/api/sellController.ts @@ -86,6 +86,16 @@ export const sellController: RequestHandler = async (req, res) => { } }); } + if (payload.Items.MiscItems) { + payload.Items.MiscItems.forEach(sellItem => { + addMiscItems(inventory, [ + { + ItemType: sellItem.String, + ItemCount: sellItem.Count * -1 + } + ]); + }); + } await inventory.save(); res.json({}); diff --git a/src/types/sellTypes.ts b/src/types/sellTypes.ts index cd9fb2dd..c61f2bf4 100644 --- a/src/types/sellTypes.ts +++ b/src/types/sellTypes.ts @@ -7,6 +7,7 @@ export interface ISellRequest { Consumables?: ISellItem[]; Recipes?: ISellItem[]; Upgrades?: ISellItem[]; + MiscItems?: ISellItem[]; }; SellPrice: number; SellCurrency: -- 2.47.2 From dc5367f249aaff337eb9ed05028ff2de6c7b93f3 Mon Sep 17 00:00:00 2001 From: Sainan Date: Thu, 2 Jan 2025 10:07:28 +0100 Subject: [PATCH 3/3] fix: enable completeAllQuests in default/example config --- config.json.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.json.example b/config.json.example index 2f8582bf..100dc42d 100644 --- a/config.json.example +++ b/config.json.example @@ -14,7 +14,7 @@ "unlockAllScans": true, "unlockAllMissions": true, "unlockAllQuests": true, - "completeAllQuests": false, + "completeAllQuests": true, "infiniteCredits": true, "infinitePlatinum": true, "unlockAllShipFeatures": true, -- 2.47.2