feat: implement upgrading & downgrading arcanes (#520)
This commit is contained in:
		
							parent
							
								
									59389a991b
								
							
						
					
					
						commit
						b7f381ba1d
					
				
							
								
								
									
										77
									
								
								src/controllers/api/arcaneCommonController.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								src/controllers/api/arcaneCommonController.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,77 @@
 | 
				
			|||||||
 | 
					import { RequestHandler } from "express";
 | 
				
			||||||
 | 
					import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
				
			||||||
 | 
					import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
				
			||||||
 | 
					import { getInventory, addMods } from "@/src/services/inventoryService";
 | 
				
			||||||
 | 
					import { IOid } from "@/src/types/commonTypes";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// eslint-disable-next-line @typescript-eslint/no-misused-promises
 | 
				
			||||||
 | 
					export const arcaneCommonController: RequestHandler = async (req, res) => {
 | 
				
			||||||
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
					    const json = getJSONfromString(String(req.body)) as IArcaneCommonRequest;
 | 
				
			||||||
 | 
					    const inventory = await getInventory(accountId);
 | 
				
			||||||
 | 
					    const upgrade = inventory.Upgrades.find(x => x._id!.toString() == json.arcane.ItemId.$oid);
 | 
				
			||||||
 | 
					    if (json.newRank == -1) {
 | 
				
			||||||
 | 
					        // Break down request?
 | 
				
			||||||
 | 
					        if (!upgrade || !upgrade.UpgradeFingerprint) {
 | 
				
			||||||
 | 
					            throw new Error(`Failed to find upgrade with OID ${json.arcane.ItemId.$oid}`);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Remove Upgrade
 | 
				
			||||||
 | 
					        inventory.Upgrades.pull({ _id: json.arcane.ItemId.$oid });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Add RawUpgrades
 | 
				
			||||||
 | 
					        const numRawUpgradesToGive = arcaneLevelCounts[JSON.parse(upgrade.UpgradeFingerprint).lvl];
 | 
				
			||||||
 | 
					        addMods(inventory, [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                ItemType: json.arcane.ItemType,
 | 
				
			||||||
 | 
					                ItemCount: numRawUpgradesToGive
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        res.json({ upgradeId: json.arcane.ItemId.$oid, numConsumed: numRawUpgradesToGive });
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        // Upgrade request?
 | 
				
			||||||
 | 
					        let numConsumed = arcaneLevelCounts[json.newRank];
 | 
				
			||||||
 | 
					        let upgradeId = json.arcane.ItemId.$oid;
 | 
				
			||||||
 | 
					        if (upgrade) {
 | 
				
			||||||
 | 
					            // Have an existing Upgrade item?
 | 
				
			||||||
 | 
					            if (upgrade.UpgradeFingerprint) {
 | 
				
			||||||
 | 
					                const existingLevel = JSON.parse(upgrade.UpgradeFingerprint).lvl;
 | 
				
			||||||
 | 
					                numConsumed -= arcaneLevelCounts[existingLevel];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            upgrade.UpgradeFingerprint = JSON.stringify({ lvl: json.newRank });
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            const newLength = inventory.Upgrades.push({
 | 
				
			||||||
 | 
					                ItemType: json.arcane.ItemType,
 | 
				
			||||||
 | 
					                UpgradeFingerprint: JSON.stringify({ lvl: json.newRank })
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            upgradeId = inventory.Upgrades[newLength - 1]._id!.toString();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Remove RawUpgrades
 | 
				
			||||||
 | 
					        addMods(inventory, [
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                ItemType: json.arcane.ItemType,
 | 
				
			||||||
 | 
					                ItemCount: numConsumed * -1
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        res.json({ newLevel: json.newRank, numConsumed, upgradeId });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    await inventory.save();
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const arcaneLevelCounts = [0, 3, 6, 10, 15, 21];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface IArcaneCommonRequest {
 | 
				
			||||||
 | 
					    arcane: {
 | 
				
			||||||
 | 
					        ItemType: string;
 | 
				
			||||||
 | 
					        ItemId: IOid;
 | 
				
			||||||
 | 
					        FromSKU: boolean;
 | 
				
			||||||
 | 
					        UpgradeFingerprint: string;
 | 
				
			||||||
 | 
					        PendingRerollFingerprint: string;
 | 
				
			||||||
 | 
					        ItemCount: number;
 | 
				
			||||||
 | 
					        LastAdded: IOid;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    newRank: number;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,5 +1,6 @@
 | 
				
			|||||||
import express from "express";
 | 
					import express from "express";
 | 
				
			||||||
import { addFriendImageController } from "@/src/controllers/api/addFriendImageController";
 | 
					import { addFriendImageController } from "@/src/controllers/api/addFriendImageController";
 | 
				
			||||||
 | 
					import { arcaneCommonController } from "@/src/controllers/api/arcaneCommonController";
 | 
				
			||||||
import { artifactsController } from "../controllers/api/artifactsController";
 | 
					import { artifactsController } from "../controllers/api/artifactsController";
 | 
				
			||||||
import { checkDailyMissionBonusController } from "@/src/controllers/api/checkDailyMissionBonusController";
 | 
					import { checkDailyMissionBonusController } from "@/src/controllers/api/checkDailyMissionBonusController";
 | 
				
			||||||
import { claimCompletedRecipeController } from "@/src/controllers/api/claimCompletedRecipeController";
 | 
					import { claimCompletedRecipeController } from "@/src/controllers/api/claimCompletedRecipeController";
 | 
				
			||||||
@ -101,6 +102,7 @@ apiRouter.get("/updateSession.php", updateSessionGetController);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// post
 | 
					// post
 | 
				
			||||||
apiRouter.post("/addFriendImage.php", addFriendImageController);
 | 
					apiRouter.post("/addFriendImage.php", addFriendImageController);
 | 
				
			||||||
 | 
					apiRouter.post("/arcaneCommon.php", arcaneCommonController);
 | 
				
			||||||
apiRouter.post("/artifacts.php", artifactsController);
 | 
					apiRouter.post("/artifacts.php", artifactsController);
 | 
				
			||||||
apiRouter.post("/claimCompletedRecipe.php", claimCompletedRecipeController);
 | 
					apiRouter.post("/claimCompletedRecipe.php", claimCompletedRecipeController);
 | 
				
			||||||
apiRouter.post("/createGuild.php", createGuildController);
 | 
					apiRouter.post("/createGuild.php", createGuildController);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user