返回提交历史
Added
src/controllers/api/projectionManagerController.ts
+64
-0
Modified
src/routes/api.ts
+2
-0
XFEstudio/XFESpaceNinjaServer
feat: void relic refinement (#455)
e88decd9
代码差异
2 个文件
+66
-0
@@ -0,0 +1,64 @@
1
import { RequestHandler } from "express";
2
import { getAccountIdForRequest } from "@/src/services/loginService";
3
import { addMiscItems, getInventory } from "@/src/services/inventoryService";
4
import { ExportRelics, IRelic } from "warframe-public-export-plus";
5
6
// eslint-disable-next-line @typescript-eslint/no-misused-promises
7
export const projectionManagerController: RequestHandler = async (req, res) => {
8
const accountId = await getAccountIdForRequest(req);
9
const inventory = await getInventory(accountId);
10
const request = JSON.parse(String(req.body)) as IProjectionUpgradeRequest;
11
const [era, category, currentQuality] = parseProjection(request.projectionType);
12
const upgradeCost = (request.qualityTag - qualityKeywordToNumber[currentQuality]) * 25;
13
const newProjectionType = findProjection(era, category, qualityNumberToKeyword[request.qualityTag]);
14
addMiscItems(inventory, [
15
{
16
ItemType: request.projectionType,
17
ItemCount: -1
18
},
19
{
20
ItemType: newProjectionType,
21
ItemCount: 1
22
},
23
{
24
ItemType: "/Lotus/Types/Items/MiscItems/VoidTearDrop",
25
ItemCount: -upgradeCost
26
}
27
]);
28
await inventory.save();
29
res.json({
30
prevProjection: request.projectionType,
31
upgradedProjection: newProjectionType,
32
upgradeCost: upgradeCost
33
});
34
};
35
36
interface IProjectionUpgradeRequest {
37
projectionType: string;
38
qualityTag: number;
39
}
40
41
type VoidProjectionQuality = "VPQ_BRONZE" | "VPQ_SILVER" | "VPQ_GOLD" | "VPQ_PLATINUM";
42
43
const qualityNumberToKeyword: VoidProjectionQuality[] = ["VPQ_BRONZE", "VPQ_SILVER", "VPQ_GOLD", "VPQ_PLATINUM"];
44
const qualityKeywordToNumber: Record<VoidProjectionQuality, number> = {
45
VPQ_BRONZE: 0,
46
VPQ_SILVER: 1,
47
VPQ_GOLD: 2,
48
VPQ_PLATINUM: 3
49
};
50
51
// e.g. "/Lotus/Types/Game/Projections/T2VoidProjectionProteaPrimeDBronze" -> ["Lith", "W5", "VPQ_BRONZE"]
52
const parseProjection = (typeName: string): [string, string, VoidProjectionQuality] => {
53
const relic: IRelic | undefined = ExportRelics[typeName];
54
if (!relic) {
55
throw new Error(`Unknown projection ${typeName}`);
56
}
57
return [relic.era, relic.category, relic.quality];
58
};
59
60
const findProjection = (era: string, category: string, quality: VoidProjectionQuality): string => {
61
return Object.entries(ExportRelics).find(
62
([_, relic]) => relic.era == era && relic.category == category && relic.quality == quality
63
)![0];
64
};
@@ -40,6 +40,7 @@ import { missionInventoryUpdateController } from "@/src/controllers/api/missionI
40
40
import { modularWeaponCraftingController } from "@/src/controllers/api/modularWeaponCraftingController";
41
41
import { modularWeaponSaleController } from "@/src/controllers/api/modularWeaponSaleController";
42
42
import { nameWeaponController } from "@/src/controllers/api/nameWeaponController";
43
import { projectionManagerController } from "../controllers/api/projectionManagerController";
43
44
import { purchaseController } from "@/src/controllers/api/purchaseController";
44
45
import { queueDojoComponentDestructionController } from "@/src/controllers/api/queueDojoComponentDestructionController";
45
46
import { rerollRandomModController } from "@/src/controllers/api/rerollRandomModController";
@@ -118,6 +119,7 @@ apiRouter.post("/login.php", loginController);
118
119
apiRouter.post("/missionInventoryUpdate.php", missionInventoryUpdateController);
119
120
apiRouter.post("/modularWeaponCrafting.php", modularWeaponCraftingController);
120
121
apiRouter.post("/nameWeapon.php", nameWeaponController);
122
apiRouter.post("/projectionManager.php", projectionManagerController);
121
123
apiRouter.post("/purchase.php", purchaseController);
122
124
apiRouter.post("/rerollRandomMod.php", rerollRandomModController);
123
125
apiRouter.post("/saveLoadout.php", saveLoadoutController);