diff --git a/src/controllers/api/focusController.ts b/src/controllers/api/focusController.ts index f5d945fc..b2ac53f6 100644 --- a/src/controllers/api/focusController.ts +++ b/src/controllers/api/focusController.ts @@ -1,6 +1,149 @@ -import { Handler } from "express"; +import { RequestHandler } from "express"; +import { getAccountIdForRequest } from "@/src/services/loginService"; +import { getInventory, addMiscItems } from "@/src/services/inventoryService"; +import { IMiscItem, TFocusPolarity } from "@/src/types/inventoryTypes/inventoryTypes"; +import { logger } from "@/src/utils/logger"; +import baseFocusPointCosts from "@/static/json/baseFocusPointCosts.json"; -export const focusController: Handler = (_req, _res) => { - //console.log("focusController", req.query); - _res.sendStatus(400); +export const focusController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + switch (req.query.op) { + default: + logger.error("Unhandled focus op type: " + req.query.op); + logger.debug(req.body.toString()); + res.end(); + break; + case FocusOperation.UnlockWay: { + const focusType = (JSON.parse(req.body.toString()) as IWayRequest).FocusType; + const focusPolarity = focusTypeToPolarity(focusType); + const inventory = await getInventory(accountId); + const cost = inventory.FocusAbility ? 50_000 : 0; + inventory.FocusAbility ??= focusType; + inventory.FocusUpgrades.push({ ItemType: focusType }); + if (inventory.FocusXP) { + inventory.FocusXP[focusPolarity] -= cost; + } + await inventory.save(); + res.json({ + FocusUpgrade: { ItemType: focusType }, + FocusPointCosts: { [focusPolarity]: cost } + }); + break; + } + case FocusOperation.ActivateWay: { + const focusType = (JSON.parse(req.body.toString()) as IWayRequest).FocusType; + const inventory = await getInventory(accountId); + inventory.FocusAbility = focusType; + await inventory.save(); + res.end(); + break; + } + case FocusOperation.UnlockUpgrade: { + const request = JSON.parse(req.body.toString()) as IUnlockUpgradeRequest; + const focusPolarity = focusTypeToPolarity(request.FocusTypes[0]); + const inventory = await getInventory(accountId); + let cost = 0; + for (const focusType of request.FocusTypes) { + cost += baseFocusPointCosts[focusType as keyof typeof baseFocusPointCosts]; + inventory.FocusUpgrades.push({ ItemType: focusType, Level: 0 }); + } + inventory.FocusXP[focusPolarity] -= cost; + await inventory.save(); + res.json({ + FocusTypes: request.FocusTypes, + FocusPointCosts: { [focusPolarity]: cost } + }); + break; + } + case FocusOperation.LevelUpUpgrade: { + const request = JSON.parse(req.body.toString()) as ILevelUpUpgradeRequest; + const focusPolarity = focusTypeToPolarity(request.FocusInfos[0].ItemType); + const inventory = await getInventory(accountId); + let cost = 0; + for (const focusUpgrade of request.FocusInfos) { + cost += focusUpgrade.FocusXpCost; + const focusUpgradeDb = inventory.FocusUpgrades.find(entry => entry.ItemType == focusUpgrade.ItemType)!; + focusUpgradeDb.Level = focusUpgrade.Level; + if (focusUpgrade.IsUniversal) { + focusUpgradeDb.IsUniversal = true; + } + } + inventory.FocusXP[focusPolarity] -= cost; + await inventory.save(); + res.json({ + FocusInfos: request.FocusInfos, + FocusPointCosts: { [focusPolarity]: cost } + }); + break; + } + case FocusOperation.ConvertShard: { + const request = JSON.parse(req.body.toString()) as IConvertShardRequest; + // Tally XP + let xp = 0; + for (const shard of request.Shards) { + xp += shardValues[shard.ItemType as keyof typeof shardValues] * shard.ItemCount; + } + // Send response + res.json({ + FocusPointGains: { + [request.Polarity]: xp + }, + MiscItemCosts: request.Shards + }); + // Commit added XP and removed shards to DB + for (const shard of request.Shards) { + shard.ItemCount *= -1; + } + const inventory = await getInventory(accountId); + inventory.FocusXP ??= { AP_POWER: 0, AP_TACTIC: 0, AP_DEFENSE: 0, AP_ATTACK: 0, AP_WARD: 0 }; + inventory.FocusXP[request.Polarity] += xp; + addMiscItems(inventory, request.Shards); + await inventory.save(); + break; + } + } +}; + +enum FocusOperation { + UnlockWay = "2", + UnlockUpgrade = "3", + LevelUpUpgrade = "4", + ActivateWay = "5", + ConvertShard = "9" +} + +// For UnlockWay & ActivateWay +interface IWayRequest { + FocusType: string; +} + +interface IUnlockUpgradeRequest { + FocusTypes: string[]; +} + +interface ILevelUpUpgradeRequest { + FocusInfos: { + ItemType: string; + FocusXpCost: number; + IsUniversal: boolean; + Level: number; + IsActiveAbility: boolean; + }[]; +} + +interface IConvertShardRequest { + Shards: IMiscItem[]; + Polarity: TFocusPolarity; +} + +// Works for ways & upgrades +const focusTypeToPolarity = (type: string): TFocusPolarity => { + return ("AP_" + type.substr(1).split("/")[3].toUpperCase()) as TFocusPolarity; +}; + +const shardValues = { + "/Lotus/Types/Gameplay/Eidolon/Resources/SentientShards/SentientShardCommonItem": 2_500, + "/Lotus/Types/Gameplay/Eidolon/Resources/SentientShards/SentientShardSynthesizedItem": 5_000, + "/Lotus/Types/Gameplay/Eidolon/Resources/SentientShards/SentientShardBrilliantItem": 25_000, + "/Lotus/Types/Gameplay/Eidolon/Resources/SentientShards/SentientShardBrilliantTierTwoItem": 40_000 }; diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index 8bf01538..1173be27 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -553,6 +553,8 @@ export interface IFocusXP { AP_WARD: number; } +export type TFocusPolarity = keyof IFocusXP; + export interface IFusionTreasure { ItemCount: number; ItemType: string; diff --git a/static/json/baseFocusPointCosts.json b/static/json/baseFocusPointCosts.json new file mode 100644 index 00000000..5f69e30b --- /dev/null +++ b/static/json/baseFocusPointCosts.json @@ -0,0 +1,82 @@ +{ + "/Lotus/Upgrades/Focus/Attack/Active/AttackEfficiencyFocusUpgrade": 95000, + "/Lotus/Upgrades/Focus/Attack/Active/BlastChargeFocusUpgrade": 80000, + "/Lotus/Upgrades/Focus/Attack/Active/BlastFireballFocusUpgrade": 50000, + "/Lotus/Upgrades/Focus/Attack/Active/CloakAttackChargeFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Attack/Active/CloakBlindFocusUpgrade": 50000, + "/Lotus/Upgrades/Focus/Attack/Active/ConsecutiveEfficienyUpgrade": 60000, + "/Lotus/Upgrades/Focus/Attack/Active/ConsecutivePowerUpgrade": 95000, + "/Lotus/Upgrades/Focus/Attack/Active/DashDamageFocusUpgrade": 80000, + "/Lotus/Upgrades/Focus/Attack/Active/DashFireFocusUpgrade": 50000, + "/Lotus/Upgrades/Focus/Attack/Active/GhostWaveUpgrade": 60000, + "/Lotus/Upgrades/Focus/Attack/Active/GhostlyTouchUpgrade": 95000, + "/Lotus/Upgrades/Focus/Attack/Residual/ElementalDamageFocusUpgrade": 25000, + "/Lotus/Upgrades/Focus/Attack/Residual/PhysicalDamageFocusUpgrade": 25000, + "/Lotus/Upgrades/Focus/Attack/Residual/PowerSnapFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Attack/Stats/MoreAmmoFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Attack/Stats/RegenAmmoFocusUpgrade": 95000, + "/Lotus/Upgrades/Focus/Defense/Active/BlastAllyShieldFocusUpgrade": 50000, + "/Lotus/Upgrades/Focus/Defense/Active/BlastSelfShieldFocusUpgrade": 50000, + "/Lotus/Upgrades/Focus/Defense/Active/CloakHealFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Defense/Active/CloakHealOthersFocusUpgrade": 95000, + "/Lotus/Upgrades/Focus/Defense/Active/CloakShieldFocusUpgrade": 50000, + "/Lotus/Upgrades/Focus/Defense/Active/DashImmunityFocusUpgrade": 95000, + "/Lotus/Upgrades/Focus/Defense/Active/DashShockwaveFocusUpgrade": 80000, + "/Lotus/Upgrades/Focus/Defense/Active/DefenseShieldBreakFocusUpgrade": 95000, + "/Lotus/Upgrades/Focus/Defense/Active/DefenseShieldFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Defense/Active/SonicDissipationUpgrade": 60000, + "/Lotus/Upgrades/Focus/Defense/Residual/InstantReviveFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Defense/Residual/RadialXpFocusUpgrade": 25000, + "/Lotus/Upgrades/Focus/Defense/Stats/HealthMaxFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Defense/Stats/HealthRegenFocusUpgrade": 95000, + "/Lotus/Upgrades/Focus/Power/Active/BlastBurstFocusUpgrade": 50000, + "/Lotus/Upgrades/Focus/Power/Active/BlastSlowFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Power/Active/CloakPullFocusUpgrade": 80000, + "/Lotus/Upgrades/Focus/Power/Active/CloakStaticFocusUpgrade": 50000, + "/Lotus/Upgrades/Focus/Power/Active/DashBubbleFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Power/Active/DashElectricityFocusUpgrade": 80000, + "/Lotus/Upgrades/Focus/Power/Active/DisarmedEnergyUpgrade": 95000, + "/Lotus/Upgrades/Focus/Power/Active/DisarmingProjectionUpgrade": 60000, + "/Lotus/Upgrades/Focus/Power/Active/PowerFieldFocusUpgrade": 95000, + "/Lotus/Upgrades/Focus/Power/Residual/EnergyOverTimeFocusUpgrade": 25000, + "/Lotus/Upgrades/Focus/Power/Residual/FreeAbilityCastsFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Power/Residual/SlowHeadshotDamageFocusUpgrade": 95000, + "/Lotus/Upgrades/Focus/Power/Stats/EnergyPoolFocusUpgrade": 95000, + "/Lotus/Upgrades/Focus/Power/Stats/EnergyRestoreFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Tactic/Active/BlastConfuseFocusUpgrade": 25000, + "/Lotus/Upgrades/Focus/Tactic/Active/BlastDisarmFocusUpgrade": 50000, + "/Lotus/Upgrades/Focus/Tactic/Active/CloakMeleeCritFocusUpgrade": 50000, + "/Lotus/Upgrades/Focus/Tactic/Active/CloakRevealFocusUpgrade": 50000, + "/Lotus/Upgrades/Focus/Tactic/Active/ComboAmpDamageFocusUpgrade": 95000, + "/Lotus/Upgrades/Focus/Tactic/Active/DashFinisherFocusUpgrade": 50000, + "/Lotus/Upgrades/Focus/Tactic/Active/DashWaveFocusUpgrade": 50000, + "/Lotus/Upgrades/Focus/Tactic/Active/FinisherTransferenceUpgrade": 95000, + "/Lotus/Upgrades/Focus/Tactic/Active/LiftHitDamageUpgrade": 95000, + "/Lotus/Upgrades/Focus/Tactic/Active/LiftHitWaveUpgrade": 60000, + "/Lotus/Upgrades/Focus/Tactic/Active/ProjectionExecutionUpgrade": 60000, + "/Lotus/Upgrades/Focus/Tactic/Active/ProjectionStretchUpgrade": 95000, + "/Lotus/Upgrades/Focus/Tactic/Active/SlamComboFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Tactic/Residual/MeleeComboFocusUpgrade": 25000, + "/Lotus/Upgrades/Focus/Tactic/Residual/MeleeXpFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Tactic/Stats/DashSpeedFocusUpgrade": 50000, + "/Lotus/Upgrades/Focus/Tactic/Stats/MoveSpeedFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Ward/Active/BlastBulletAttractorFocusUpgrade": 80000, + "/Lotus/Upgrades/Focus/Ward/Active/BlastDamagePickupFocusUpgrade": 80000, + "/Lotus/Upgrades/Focus/Ward/Active/ClearStaticOnKillFocusUpgrade": 95000, + "/Lotus/Upgrades/Focus/Ward/Active/CloakAllyCloakFocusUpgrade": 50000, + "/Lotus/Upgrades/Focus/Ward/Active/CloakReduceDamageFocusUpgrade": 50000, + "/Lotus/Upgrades/Focus/Ward/Active/DashReduceArmourFocusUpgrade": 80000, + "/Lotus/Upgrades/Focus/Ward/Active/DashReduceDamageFocusUpgrade": 80000, + "/Lotus/Upgrades/Focus/Ward/Active/InvulnerableReturnFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Ward/Active/KnockdownImmunityFocusUpgrade": 25000, + "/Lotus/Upgrades/Focus/Ward/Active/MagneticExtensionUpgrade": 95000, + "/Lotus/Upgrades/Focus/Ward/Active/MagneticFieldFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Ward/Active/SunderingDissipationUpgrade": 60000, + "/Lotus/Upgrades/Focus/Ward/Active/UnairuWispFocusUpgrade": 95000, + "/Lotus/Upgrades/Focus/Ward/Residual/ArmourBuffFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Ward/Residual/ReflectDamageFocusUpgrade": 25000, + "/Lotus/Upgrades/Focus/Ward/Residual/SecondChanceDamageBuffFocusUpgrade": 95000, + "/Lotus/Upgrades/Focus/Ward/Residual/SecondChanceFocusUpgrade": 60000, + "/Lotus/Upgrades/Focus/Ward/Stats/ArmourIncreaseFocusUpgrade": 50000, + "/Lotus/Upgrades/Focus/Ward/Stats/BlastRadiusFocusUpgrade": 50000 +}