From 656e70227c8ed816a668311f93a781f1a3a94e0f Mon Sep 17 00:00:00 2001 From: Sainan Date: Fri, 7 Jun 2024 16:06:35 +0200 Subject: [PATCH] feat: implement polarity swapping (#283) --- src/controllers/api/upgradesController.ts | 31 ++++++++++++++++---- src/models/inventoryModels/inventoryModel.ts | 11 ++++--- src/types/requestTypes.ts | 4 +-- 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/controllers/api/upgradesController.ts b/src/controllers/api/upgradesController.ts index 3ec9a6dd..b0545632 100644 --- a/src/controllers/api/upgradesController.ts +++ b/src/controllers/api/upgradesController.ts @@ -1,6 +1,6 @@ import { RequestHandler } from "express"; import { IUpgradesRequest } from "@/src/types/requestTypes"; -import { IPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes"; +import { FocusSchool } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { IGenericItemDatabase, IMiscItem, TGenericItemKey } from "@/src/types/inventoryTypes/inventoryTypes"; import { getAccountIdForRequest } from "@/src/services/loginService"; import { addMiscItems, getInventory, updateCurrency } from "@/src/services/inventoryService"; @@ -64,11 +64,7 @@ export const upgradesController: RequestHandler = async (req, res) => { for (const item of inventory[payload.ItemCategory as TGenericItemKey] as IGenericItemDatabase[]) { if (item._id.toString() == payload.ItemId.$oid) { item.XP = 0; - item.Polarity ??= []; - item.Polarity.push({ - Slot: operation.PolarizeSlot, - Value: operation.PolarizeValue - } satisfies IPolarity); + setSlotPolarity(item, operation.PolarizeSlot, operation.PolarizeValue); item.Polarized ??= 0; item.Polarized += 1; break; @@ -105,6 +101,19 @@ export const upgradesController: RequestHandler = async (req, res) => { } } break; + case "": + console.assert(operation.OperationType == "UOT_SWAP_POLARITY"); + for (const item of inventory[payload.ItemCategory as TGenericItemKey] as IGenericItemDatabase[]) { + 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); } @@ -112,3 +121,13 @@ export const upgradesController: RequestHandler = async (req, res) => { await inventory.save(); res.json({ InventoryChanges }); }; + +const setSlotPolarity = (item: IGenericItemDatabase, slot: number, polarity: FocusSchool): void => { + item.Polarity ??= []; + const entry = item.Polarity.find(entry => entry.Slot == slot); + if (entry) { + entry.Value = polarity; + } else { + item.Polarity.push({ Slot: slot, Value: polarity }); + } +}; diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index 938c0d8a..679216b7 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -97,10 +97,13 @@ pendingRecipeSchema.set("toJSON", { } }); -const polaritySchema = new Schema({ - Slot: Number, - Value: String -}); +const polaritySchema = new Schema( + { + Slot: Number, + Value: String + }, + { _id: false } +); const abilityOverrideSchema = new Schema({ Ability: String, diff --git a/src/types/requestTypes.ts b/src/types/requestTypes.ts index bdb68be4..78ea111f 100644 --- a/src/types/requestTypes.ts +++ b/src/types/requestTypes.ts @@ -1,5 +1,5 @@ import { IOid } from "./commonTypes"; -import { FocusSchool } from "@/src/types/inventoryTypes/commonInventoryTypes"; +import { IPolarity, FocusSchool } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { IBooster, IChallengeProgress, @@ -95,5 +95,5 @@ export interface IUpgradeOperation { UpgradeRequirement: string; // uniqueName of item being consumed PolarizeSlot: number; PolarizeValue: FocusSchool; - PolarityRemap: object[]; + PolarityRemap: IPolarity[]; }