XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFESpaceNinjaServer

feat: implement helminth naming & archon shard installation (#320)

Co-authored-by: Sainan <Sainan@users.noreply.github.com>

74de4e07
Sainan <sainan@calamity.gg>
提交于

代码差异

5 个文件 +136 -23
Added src/controllers/api/infestedFoundryController.ts +88 -0
@@ -0,0 +1,88 @@
1 import { RequestHandler } from "express";
2 import { getAccountIdForRequest } from "@/src/services/loginService";
3 import { getJSONfromString } from "@/src/helpers/stringHelpers";
4 import { getInventory, addMiscItems } from "@/src/services/inventoryService";
5 import { IOid } from "@/src/types/commonTypes";
6
7 export const infestedFoundryController: RequestHandler = async (req, res) => {
8 const accountId = await getAccountIdForRequest(req);
9 const payload = getJSONfromString(req.body.toString());
10 switch (req.query.mode) {
11 case "s": {
12 // shard installation
13 const request = payload as IShardInstallRequest;
14 const inventory = await getInventory(accountId);
15 const suit = inventory.Suits.find(suit => suit._id.toString() == request.SuitId.$oid)!;
16 if (
17 !suit.ArchonCrystalUpgrades ||
18 suit.ArchonCrystalUpgrades.length != 5 // we shouldn't have an array like this, but older inventories may disagree...
19 ) {
20 suit.ArchonCrystalUpgrades = [{}, {}, {}, {}, {}];
21 }
22 suit.ArchonCrystalUpgrades[request.Slot] = {
23 UpgradeType: request.UpgradeType,
24 Color: request.Color
25 };
26 const miscItemChanges = [
27 {
28 ItemType: colorToShard[request.Color],
29 ItemCount: -1
30 }
31 ];
32 addMiscItems(inventory, miscItemChanges);
33 await inventory.save();
34 res.json({
35 InventoryChanges: {
36 MiscItems: miscItemChanges
37 }
38 });
39 break;
40 }
41
42 case "n": {
43 // name the beast
44 const inventory = await getInventory(accountId);
45 inventory.InfestedFoundry ??= {};
46 inventory.InfestedFoundry.Name = payload.newName as string;
47 await inventory.save();
48 res.json({
49 InventoryChanges: {
50 InfestedFoundry: {
51 Name: inventory.InfestedFoundry.Name
52 }
53 }
54 });
55 break;
56 }
57
58 case "o": // offerings update
59 // {"OfferingsIndex":540,"SuitTypes":["/Lotus/Powersuits/PaxDuviricus/PaxDuviricusBaseSuit","/Lotus/Powersuits/Nezha/NezhaBaseSuit","/Lotus/Powersuits/Devourer/DevourerBaseSuit"],"Extra":false}
60 res.status(404).end();
61 break;
62
63 default:
64 throw new Error(`unhandled infestedFoundry mode: ${req.query.mode}`);
65 }
66 };
67
68 interface IShardInstallRequest {
69 SuitId: IOid;
70 Slot: number;
71 UpgradeType: string;
72 Color: string;
73 }
74
75 const colorToShard: Record<string, string> = {
76 ACC_RED: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalAmar",
77 ACC_RED_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalAmarMythic",
78 ACC_YELLOW: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalNira",
79 ACC_YELLOW_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalNiraMythic",
80 ACC_BLUE: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalBoreal",
81 ACC_BLUE_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalBorealMythic",
82 ACC_GREEN: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalGreen",
83 ACC_GREEN_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalGreenMythic",
84 ACC_ORANGE: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalOrange",
85 ACC_ORANGE_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalOrangeMythic",
86 ACC_PURPLE: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalViolet",
87 ACC_PURPLE_MYTHIC: "/Lotus/Types/Gameplay/NarmerSorties/ArchonCrystalVioletMythic"
88 };
Modified src/models/inventoryModels/inventoryModel.ts +31 -13
@@ -45,7 +45,8 @@ import {
45 45 IOperatorConfigDatabase,
46 46 IPolarity,
47 47 IEquipmentDatabase,
48 IOperatorConfigClient
48 IOperatorConfigClient,
49 IArchonCrystalUpgrade
49 50 } from "@/src/types/inventoryTypes/commonInventoryTypes";
50 51 import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
51 52
@@ -182,6 +183,20 @@ ItemConfigSchema.set("toJSON", {
182 183 }
183 184 });
184 185
186 const ArchonCrystalUpgradeSchema = new Schema<IArchonCrystalUpgrade>(
187 {
188 UpgradeType: String,
189 Color: String
190 },
191 { _id: false }
192 );
193
194 ArchonCrystalUpgradeSchema.set("toJSON", {
195 transform(_document, returnedObject) {
196 delete returnedObject.__v;
197 }
198 });
199
185 200 const EquipmentSchema = new Schema<IEquipmentDatabase>({
186 201 ItemType: String,
187 202 Configs: [ItemConfigSchema],
@@ -193,7 +208,7 @@ const EquipmentSchema = new Schema<IEquipmentDatabase>({
193 208 FocusLens: String,
194 209 ModSlotPurchases: Number,
195 210 CustomizationSlotPurchases: Number,
196 UpgradeType: Schema.Types.Mixed, //todo
211 UpgradeType: String,
197 212 UpgradeFingerprint: String,
198 213 ItemName: String,
199 214 InfestationDate: Date,
@@ -203,7 +218,7 @@ const EquipmentSchema = new Schema<IEquipmentDatabase>({
203 218 UnlockLevel: Number,
204 219 Expiry: Date,
205 220 SkillTree: String,
206 ArchonCrystalUpgrades: [Schema.Types.Mixed] //TODO
221 ArchonCrystalUpgrades: { type: [ArchonCrystalUpgradeSchema], default: undefined }
207 222 });
208 223
209 224 EquipmentSchema.virtual("ItemId").get(function () {
@@ -432,16 +447,19 @@ const consumedSchuitsSchema = new Schema<IConsumedSuit>({
432 447 c: colorSchema
433 448 });
434 449
435 const infestedFoundrySchema = new Schema<IInfestedFoundry>({
436 Name: String,
437 Resources: [typeCountSchema],
438 Slots: Number,
439 XP: Number,
440 ConsumedSuits: [consumedSchuitsSchema],
441 InvigorationIndex: Number,
442 InvigorationSuitOfferings: [String],
443 InvigorationsApplied: Number
444 });
450 const infestedFoundrySchema = new Schema<IInfestedFoundry>(
451 {
452 Name: String,
453 Resources: { type: [typeCountSchema], default: undefined },
454 Slots: Number,
455 XP: Number,
456 ConsumedSuits: { type: [consumedSchuitsSchema], default: undefined },
457 InvigorationIndex: Number,
458 InvigorationSuitOfferings: { type: [String], default: undefined },
459 InvigorationsApplied: Number
460 },
461 { _id: false }
462 );
445 463
446 464 const questProgressSchema = new Schema<IQuestProgress>({
447 465 c: Number,
Modified src/routes/api.ts +2 -0
@@ -25,6 +25,7 @@ import { hostSessionController } from "@/src/controllers/api/hostSessionControll
25 25 import { hubController } from "@/src/controllers/api/hubController";
26 26 import { hubInstancesController } from "@/src/controllers/api/hubInstancesController";
27 27 import { inboxController } from "@/src/controllers/api/inboxController";
28 import { infestedFoundryController } from "@/src/controllers/api/infestedFoundryController";
28 29 import { inventoryController } from "@/src/controllers/api/inventoryController";
29 30 import { inventorySlotsController } from "@/src/controllers/api/inventorySlotsController";
30 31 import { joinSessionController } from "@/src/controllers/api/joinSessionController";
@@ -101,6 +102,7 @@ apiRouter.post("/genericUpdate.php", genericUpdateController);
101 102 apiRouter.post("/getAlliance.php", getAllianceController);
102 103 apiRouter.post("/guildTech.php", guildTechController);
103 104 apiRouter.post("/hostSession.php", hostSessionController);
105 apiRouter.post("/infestedFoundry.php", infestedFoundryController);
104 106 apiRouter.post("/inventorySlots.php", inventorySlotsController);
105 107 apiRouter.post("/joinSession.php", joinSessionController);
106 108 apiRouter.post("/login.php", loginController);
Modified src/types/inventoryTypes/commonInventoryTypes.ts +6 -1
@@ -103,6 +103,11 @@ export interface IEquipmentDatabase {
103 103 UnlockLevel?: number;
104 104 Expiry?: IMongoDate;
105 105 SkillTree?: string;
106 ArchonCrystalUpgrades?: []; //TODO
106 ArchonCrystalUpgrades?: IArchonCrystalUpgrade[];
107 107 _id: Types.ObjectId;
108 108 }
109
110 export interface IArchonCrystalUpgrade {
111 UpgradeType?: string;
112 Color?: string;
113 }
Modified src/types/inventoryTypes/inventoryTypes.ts +9 -9
@@ -232,7 +232,7 @@ export interface IInventoryResponse {
232 232 DailyAffiliationEntrati: number;
233 233 DailyAffiliationNecraloid: number;
234 234 MechSuits: IEquipmentDatabase[];
235 InfestedFoundry: IInfestedFoundry;
235 InfestedFoundry?: IInfestedFoundry;
236 236 BlessingCooldown: IMongoDate;
237 237 CrewShipHarnesses: IEquipmentDatabase[];
238 238 CrewShipRawSalvage: IConsumable[];
@@ -482,14 +482,14 @@ export interface IFusionTreasure {
482 482 }
483 483
484 484 export interface IInfestedFoundry {
485 Name: string;
486 Resources: ITypeCount[];
487 Slots: number;
488 XP: number;
489 ConsumedSuits: IConsumedSuit[];
490 InvigorationIndex: number;
491 InvigorationSuitOfferings: string[];
492 InvigorationsApplied: number;
485 Name?: string;
486 Resources?: ITypeCount[];
487 Slots?: number;
488 XP?: number;
489 ConsumedSuits?: IConsumedSuit[];
490 InvigorationIndex?: number;
491 InvigorationSuitOfferings?: string[];
492 InvigorationsApplied?: number;
493 493 }
494 494
495 495 export interface IConsumedSuit {