From cbda130c040a36cd833fc73e6f8a56f7031ff378 Mon Sep 17 00:00:00 2001 From: Sainan Date: Thu, 16 Jan 2025 15:22:05 +0100 Subject: [PATCH 1/2] feat: archon shard fusion --- src/controllers/api/archonFusionController.ts | 49 ++++++++++++++ .../api/infestedFoundryController.ts | 16 +---- src/helpers/shardHelper.ts | 66 +++++++++++++++++++ src/routes/api.ts | 2 + 4 files changed, 118 insertions(+), 15 deletions(-) create mode 100644 src/controllers/api/archonFusionController.ts create mode 100644 src/helpers/shardHelper.ts diff --git a/src/controllers/api/archonFusionController.ts b/src/controllers/api/archonFusionController.ts new file mode 100644 index 00000000..558c7f7b --- /dev/null +++ b/src/controllers/api/archonFusionController.ts @@ -0,0 +1,49 @@ +import { RequestHandler } from "express"; +import { getAccountIdForRequest } from "@/src/services/loginService"; +import { addMiscItems, getInventory } from "@/src/services/inventoryService"; +import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes"; +import { colorToShard, combineColors, shardToColor } from "@/src/helpers/shardHelper"; + +export const archonFusionController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + const request = JSON.parse(String(req.body)) as IArchonFusionRequest; + const inventory = await getInventory(accountId); + request.Consumed.forEach(x => x.ItemCount * -1); + addMiscItems(inventory, request.Consumed); + const newArchons: IMiscItem[] = []; + switch (request.FusionType) { + case "AFT_ASCENT": + newArchons.push({ + ItemType: request.Consumed[0].ItemType + "Mythic", + ItemCount: 1 + }); + break; + + case "AFT_COALESCENT": + newArchons.push({ + ItemType: + colorToShard[ + combineColors( + shardToColor[request.Consumed[0].ItemType], + shardToColor[request.Consumed[1].ItemType] + ) + ], + ItemCount: 1 + }); + break; + + default: + throw new Error(`unknown archon fusion type: ${request.FusionType}`); + } + addMiscItems(inventory, newArchons); + await inventory.save(); + res.json({ + NewArchons: newArchons + }); +}; + +interface IArchonFusionRequest { + Consumed: IMiscItem[]; + FusionType: string; + StatResultType: "SRT_NEW_STAT"; // ??? +} diff --git a/src/controllers/api/infestedFoundryController.ts b/src/controllers/api/infestedFoundryController.ts index 16c356fe..35b0d3d9 100644 --- a/src/controllers/api/infestedFoundryController.ts +++ b/src/controllers/api/infestedFoundryController.ts @@ -15,6 +15,7 @@ import { getRecipe } from "@/src/services/itemDataService"; import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel"; import { toMongoDate } from "@/src/helpers/inventoryHelpers"; import { logger } from "@/src/utils/logger"; +import { colorToShard } from "@/src/helpers/shardHelper"; export const infestedFoundryController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); @@ -355,21 +356,6 @@ interface IHelminthFeedRequest { }[]; } -const colorToShard: Record = { - ACC_RED: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalAmar", - ACC_RED_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalAmarMythic", - ACC_YELLOW: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalNira", - ACC_YELLOW_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalNiraMythic", - ACC_BLUE: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalBoreal", - ACC_BLUE_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalBorealMythic", - ACC_GREEN: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalGreen", - ACC_GREEN_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalGreenMythic", - ACC_ORANGE: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalOrange", - ACC_ORANGE_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalOrangeMythic", - ACC_PURPLE: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalViolet", - ACC_PURPLE_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalVioletMythic" -}; - export const addInfestedFoundryXP = (infestedFoundry: IInfestedFoundry, delta: number): ITypeCount[] => { const recipeChanges: ITypeCount[] = []; infestedFoundry.XP ??= 0; diff --git a/src/helpers/shardHelper.ts b/src/helpers/shardHelper.ts new file mode 100644 index 00000000..0971f7b7 --- /dev/null +++ b/src/helpers/shardHelper.ts @@ -0,0 +1,66 @@ +export const colorToShard: Record = { + ACC_RED: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalAmar", + ACC_RED_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalAmarMythic", + ACC_YELLOW: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalNira", + ACC_YELLOW_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalNiraMythic", + ACC_BLUE: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalBoreal", + ACC_BLUE_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalBorealMythic", + ACC_GREEN: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalGreen", + ACC_GREEN_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalGreenMythic", + ACC_ORANGE: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalOrange", + ACC_ORANGE_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalOrangeMythic", + ACC_PURPLE: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalViolet", + ACC_PURPLE_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalVioletMythic" +}; + +export const shardToColor: Record = { + "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalAmar": "ACC_RED", + "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalAmarMythic": "ACC_RED_MYTHIC", + "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalNira": "ACC_YELLOW", + "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalNiraMythic": "ACC_YELLOW_MYTHIC", + "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalBoreal": "ACC_BLUE", + "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalBorealMythic": "ACC_BLUE_MYTHIC", + "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalGreen": "ACC_GREEN", + "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalGreenMythic": "ACC_GREEN_MYTHIC", + "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalOrange": "ACC_ORANGE", + "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalOrangeMythic": "ACC_ORANGE_MYTHIC", + "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalViolet": "ACC_PURPLE", + "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalVioletMythic": "ACC_PURPLE_MYTHIC" +}; + +export const combineColors = (a: string, b: string): string => { + return ( + combinePlainColors(a.replace("_MYTHIC", ""), b.replace("_MYTHIC", "")) + + (a.indexOf("_MYTHIC") != -1 ? "_MYTHIC" : "") + ); +}; + +const combinePlainColors = (a: string, b: string): string => { + switch (a) { + case "ACC_RED": + switch (b) { + case "ACC_YELLOW": + return "ACC_ORANGE"; + case "ACC_BLUE": + return "ACC_PURPLE"; + } + break; + case "ACC_YELLOW": + switch (b) { + case "ACC_RED": + return "ACC_ORANGE"; + case "ACC_BLUE": + return "ACC_GREEN"; + } + break; + case "ACC_BLUE": + switch (b) { + case "ACC_RED": + return "ACC_PURPLE"; + case "ACC_YELLOW": + return "ACC_GREEN"; + } + break; + } + throw new Error(`invalid color combination request: ${a} and ${b}`); +}; diff --git a/src/routes/api.ts b/src/routes/api.ts index b6e2613c..c6b644ec 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -2,6 +2,7 @@ import express from "express"; import { activateRandomModController } from "@/src/controllers/api/activateRandomModController"; import { addFriendImageController } from "@/src/controllers/api/addFriendImageController"; import { arcaneCommonController } from "@/src/controllers/api/arcaneCommonController"; +import { archonFusionController } from "@/src/controllers/api/archonFusionController"; import { artifactsController } from "../controllers/api/artifactsController"; import { checkDailyMissionBonusController } from "@/src/controllers/api/checkDailyMissionBonusController"; import { claimCompletedRecipeController } from "@/src/controllers/api/claimCompletedRecipeController"; @@ -114,6 +115,7 @@ apiRouter.get("/updateSession.php", updateSessionGetController); apiRouter.post("/activateRandomMod.php", activateRandomModController); apiRouter.post("/addFriendImage.php", addFriendImageController); apiRouter.post("/arcaneCommon.php", arcaneCommonController); +apiRouter.post("/archonFusion.php", archonFusionController); apiRouter.post("/artifacts.php", artifactsController); apiRouter.post("/claimCompletedRecipe.php", claimCompletedRecipeController); apiRouter.post("/createGuild.php", createGuildController); -- 2.47.2 From 94c2232745404624db51a8a688877ba40f43f6c0 Mon Sep 17 00:00:00 2001 From: Sainan Date: Thu, 16 Jan 2025 15:28:09 +0100 Subject: [PATCH 2/2] oopsie --- src/controllers/api/archonFusionController.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/controllers/api/archonFusionController.ts b/src/controllers/api/archonFusionController.ts index 558c7f7b..04c92384 100644 --- a/src/controllers/api/archonFusionController.ts +++ b/src/controllers/api/archonFusionController.ts @@ -8,7 +8,9 @@ export const archonFusionController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); const request = JSON.parse(String(req.body)) as IArchonFusionRequest; const inventory = await getInventory(accountId); - request.Consumed.forEach(x => x.ItemCount * -1); + request.Consumed.forEach(x => { + x.ItemCount *= -1; + }); addMiscItems(inventory, request.Consumed); const newArchons: IMiscItem[] = []; switch (request.FusionType) { -- 2.47.2