feat: void relic refinement #455
							
								
								
									
										64
									
								
								src/controllers/api/projectionManagerController.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								src/controllers/api/projectionManagerController.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,64 @@
 | 
				
			|||||||
 | 
					import { RequestHandler } from "express";
 | 
				
			||||||
 | 
					import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
				
			||||||
 | 
					import { addMiscItems, getInventory } from "@/src/services/inventoryService";
 | 
				
			||||||
 | 
					import { ExportRelics, IRelic } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// eslint-disable-next-line @typescript-eslint/no-misused-promises
 | 
				
			||||||
 | 
					export const projectionManagerController: RequestHandler = async (req, res) => {
 | 
				
			||||||
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
					    const inventory = await getInventory(accountId);
 | 
				
			||||||
 | 
					    const request = JSON.parse(String(req.body)) as IProjectionUpgradeRequest;
 | 
				
			||||||
 | 
					    const [era, category, currentQuality] = parseProjection(request.projectionType);
 | 
				
			||||||
 | 
					    const upgradeCost = (request.qualityTag - qualityKeywordToNumber[currentQuality]) * 25;
 | 
				
			||||||
 | 
					    const newProjectionType = findProjection(era, category, qualityNumberToKeyword[request.qualityTag]);
 | 
				
			||||||
 | 
					    addMiscItems(inventory, [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ItemType: request.projectionType,
 | 
				
			||||||
 | 
					            ItemCount: -1
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ItemType: newProjectionType,
 | 
				
			||||||
 | 
					            ItemCount: 1
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ItemType: "/Lotus/Types/Items/MiscItems/VoidTearDrop",
 | 
				
			||||||
 | 
					            ItemCount: -upgradeCost
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]);
 | 
				
			||||||
 | 
					    await inventory.save();
 | 
				
			||||||
 | 
					    res.json({
 | 
				
			||||||
 | 
					        prevProjection: request.projectionType,
 | 
				
			||||||
 | 
					        upgradedProjection: newProjectionType,
 | 
				
			||||||
 | 
					        upgradeCost: upgradeCost
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface IProjectionUpgradeRequest {
 | 
				
			||||||
 | 
					    projectionType: string;
 | 
				
			||||||
 | 
					    qualityTag: number;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type VoidProjectionQuality = "VPQ_BRONZE" | "VPQ_SILVER" | "VPQ_GOLD" | "VPQ_PLATINUM";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const qualityNumberToKeyword: VoidProjectionQuality[] = ["VPQ_BRONZE", "VPQ_SILVER", "VPQ_GOLD", "VPQ_PLATINUM"];
 | 
				
			||||||
 | 
					const qualityKeywordToNumber: Record<VoidProjectionQuality, number> = {
 | 
				
			||||||
 | 
					    VPQ_BRONZE: 0,
 | 
				
			||||||
 | 
					    VPQ_SILVER: 1,
 | 
				
			||||||
 | 
					    VPQ_GOLD: 2,
 | 
				
			||||||
 | 
					    VPQ_PLATINUM: 3
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// e.g. "/Lotus/Types/Game/Projections/T2VoidProjectionProteaPrimeDBronze" -> ["Lith", "W5", "VPQ_BRONZE"]
 | 
				
			||||||
 | 
					const parseProjection = (typeName: string): [string, string, VoidProjectionQuality] => {
 | 
				
			||||||
 | 
					    const relic: IRelic | undefined = ExportRelics[typeName];
 | 
				
			||||||
 | 
					    if (!relic) {
 | 
				
			||||||
 | 
					        throw new Error(`Unknown projection ${typeName}`);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return [relic.era, relic.category, relic.quality];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const findProjection = (era: string, category: string, quality: VoidProjectionQuality): string => {
 | 
				
			||||||
 | 
					    return Object.entries(ExportRelics).find(
 | 
				
			||||||
 | 
					        ([_, relic]) => relic.era == era && relic.category == category && relic.quality == quality
 | 
				
			||||||
 | 
					    )![0];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@ -40,6 +40,7 @@ import { missionInventoryUpdateController } from "@/src/controllers/api/missionI
 | 
				
			|||||||
import { modularWeaponCraftingController } from "@/src/controllers/api/modularWeaponCraftingController";
 | 
					import { modularWeaponCraftingController } from "@/src/controllers/api/modularWeaponCraftingController";
 | 
				
			||||||
import { modularWeaponSaleController } from "@/src/controllers/api/modularWeaponSaleController";
 | 
					import { modularWeaponSaleController } from "@/src/controllers/api/modularWeaponSaleController";
 | 
				
			||||||
import { nameWeaponController } from "@/src/controllers/api/nameWeaponController";
 | 
					import { nameWeaponController } from "@/src/controllers/api/nameWeaponController";
 | 
				
			||||||
 | 
					import { projectionManagerController } from "../controllers/api/projectionManagerController";
 | 
				
			||||||
import { purchaseController } from "@/src/controllers/api/purchaseController";
 | 
					import { purchaseController } from "@/src/controllers/api/purchaseController";
 | 
				
			||||||
import { queueDojoComponentDestructionController } from "@/src/controllers/api/queueDojoComponentDestructionController";
 | 
					import { queueDojoComponentDestructionController } from "@/src/controllers/api/queueDojoComponentDestructionController";
 | 
				
			||||||
import { rerollRandomModController } from "@/src/controllers/api/rerollRandomModController";
 | 
					import { rerollRandomModController } from "@/src/controllers/api/rerollRandomModController";
 | 
				
			||||||
@ -118,6 +119,7 @@ apiRouter.post("/login.php", loginController);
 | 
				
			|||||||
apiRouter.post("/missionInventoryUpdate.php", missionInventoryUpdateController);
 | 
					apiRouter.post("/missionInventoryUpdate.php", missionInventoryUpdateController);
 | 
				
			||||||
apiRouter.post("/modularWeaponCrafting.php", modularWeaponCraftingController);
 | 
					apiRouter.post("/modularWeaponCrafting.php", modularWeaponCraftingController);
 | 
				
			||||||
apiRouter.post("/nameWeapon.php", nameWeaponController);
 | 
					apiRouter.post("/nameWeapon.php", nameWeaponController);
 | 
				
			||||||
 | 
					apiRouter.post("/projectionManager.php", projectionManagerController);
 | 
				
			||||||
apiRouter.post("/purchase.php", purchaseController);
 | 
					apiRouter.post("/purchase.php", purchaseController);
 | 
				
			||||||
apiRouter.post("/rerollRandomMod.php", rerollRandomModController);
 | 
					apiRouter.post("/rerollRandomMod.php", rerollRandomModController);
 | 
				
			||||||
apiRouter.post("/saveLoadout.php", saveLoadoutController);
 | 
					apiRouter.post("/saveLoadout.php", saveLoadoutController);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user