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: focus 1.0 (#3775)

Closes #3772 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/3775 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>

19d3ce18
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

3 个文件 +268 -56
Modified src/controllers/api/focusController.ts +259 -53
@@ -12,10 +12,49 @@ import gameToBuildVersion from "../../constants/gameToBuildVersion.ts";
12 12 export const focusController: RequestHandler = async (req, res) => {
13 13 const account = await getAccountForRequest(req);
14 14
15 let focusVersion = 3;
16 if (account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["31.5.0"]) < 0) {
17 focusVersion = 2;
18 if (version_compare(account.BuildLabel, gameToBuildVersion["22.0.0"]) < 0) {
19 focusVersion = 1;
20 }
21 }
22
15 23 let op = req.query.op as string;
16 const focus2 = account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["31.5.0"]) < 0;
17 if (focus2) {
18 // Focus 2.0
24 if (focusVersion == 1) {
25 switch (req.query.op) {
26 case Focus1Operation.InstallLens:
27 op = "InstallLens";
28 break;
29 case Focus1Operation.UnlockWay:
30 op = "UnlockWay";
31 break;
32 case Focus1Operation.UnlockUpgrade:
33 op = "UnlockUpgrade";
34 break;
35 case Focus1Operation.IncreasePool:
36 op = "IncreasePool";
37 break;
38 case Focus1Operation.LevelUpUpgrade:
39 op = "LevelUpUpgrade";
40 break;
41 case Focus1Operation.ActivateWay:
42 op = "ActivateWay";
43 break;
44 case Focus1Operation.UpdateUpgrade:
45 op = "UpdateUpgrade";
46 break;
47 case Focus1Operation.UpgradeCooldown:
48 op = "UpgradeCooldown";
49 break;
50 case Focus1Operation.SentTrainingAmplifier:
51 op = "SentTrainingAmplifier";
52 break;
53 case Focus1Operation.UpdateCooldownReduction:
54 op = "UpdateCooldownReduction";
55 break;
56 }
57 } else if (focusVersion == 2) {
19 58 switch (req.query.op) {
20 59 case Focus2Operation.InstallLens:
21 60 op = "InstallLens";
@@ -78,6 +117,9 @@ export const focusController: RequestHandler = async (req, res) => {
78 117 }
79 118 }
80 119
120 //logger.debug(`focus op: ${op}`);
121 //logger.debug(String(req.body));
122
81 123 switch (op) {
82 124 default:
83 125 logger.error("Unhandled focus op type: " + String(req.query.op));
@@ -110,32 +152,49 @@ export const focusController: RequestHandler = async (req, res) => {
110 152 const inventory = await getInventory(account._id, "FocusAbility FocusUpgrades FocusXP");
111 153 const cost = inventory.FocusAbility ? 50_000 : 0;
112 154 inventory.FocusAbility ??= focusType;
113 inventory.FocusUpgrades.push({ ItemType: focusType });
155 inventory.FocusUpgrades.push({ ItemType: focusType, IsActive: true, TotalCapacity: 5 });
114 156 if (cost) {
115 157 inventory.FocusXP![focusPolarity]! -= cost;
116 158 }
117 159 await inventory.save();
118 160 res.json({
119 FocusUpgrade: { ItemType: focusType },
161 FocusUpgrade: { ItemType: focusType, IsActive: true, TotalCapacity: 5 },
120 162 FocusPointCosts: { [focusPolarity]: cost }
121 163 });
122 164 break;
123 165 }
124 166 case "IncreasePool": {
125 const request = JSON.parse(String(req.body)) as IIncreasePoolRequest;
126 const focusPolarity = focusTypeToPolarity(request.FocusType);
127 const inventory = await getInventory(account._id, "FocusXP FocusCapacity");
128 let cost = 0;
129 for (let capacity = request.CurrentTotalCapacity; capacity != request.NewTotalCapacity; ++capacity) {
130 cost += increasePoolCost[capacity - 5];
167 if (focusVersion > 1) {
168 const request = JSON.parse(String(req.body)) as IIncreasePool2Request;
169 const focusPolarity = focusTypeToPolarity(request.FocusType);
170 const inventory = await getInventory(account._id, "FocusXP FocusCapacity");
171 let cost = 0;
172 for (let capacity = request.CurrentTotalCapacity; capacity != request.NewTotalCapacity; ++capacity) {
173 cost += increasePoolCost[capacity - 5];
174 }
175 inventory.FocusXP![focusPolarity]! -= cost;
176 inventory.FocusCapacity = request.NewTotalCapacity;
177 await inventory.save();
178 res.json({
179 TotalCapacity: request.NewTotalCapacity,
180 FocusPointCosts: { [focusPolarity]: cost }
181 });
182 } else {
183 const request = JSON.parse(String(req.body)) as IIncreasePool1Request;
184 const focusPolarity = focusTypeToPolarity(request.FocusType);
185 const inventory = await getInventory(account._id, "FocusXP FocusUpgrades");
186 inventory.FocusXP![focusPolarity]! -= request.XPCost;
187 inventory.FocusUpgrades.find(x => x.ItemType == request.FocusType)!.TotalCapacity =
188 request.CurrentTotalCapacity;
189 await inventory.save();
190 res.json({
191 FocusUpgrade: {
192 ItemType: request.FocusType,
193 TotalCapacity: request.CurrentTotalCapacity
194 },
195 FocusPointCosts: { [focusPolarity]: request.XPCost }
196 });
131 197 }
132 inventory.FocusXP![focusPolarity]! -= cost;
133 inventory.FocusCapacity = request.NewTotalCapacity;
134 await inventory.save();
135 res.json({
136 TotalCapacity: request.NewTotalCapacity,
137 FocusPointCosts: { [focusPolarity]: cost }
138 });
139 198 break;
140 199 }
141 200 case "ActivateWay": {
@@ -156,49 +215,122 @@ export const focusController: RequestHandler = async (req, res) => {
156 215 break;
157 216 }
158 217 case "UnlockUpgrade": {
159 const request = JSON.parse(String(req.body)) as IUnlockUpgradeRequest;
160 const focusPolarity = focusTypeToPolarity(request.FocusTypes[0]);
161 const inventory = await getInventory(account._id);
162 let cost = 0;
163 for (const focusType of request.FocusTypes) {
164 if (focusType in ExportFocusUpgrades) {
165 cost += ExportFocusUpgrades[focusType].baseFocusPointCost;
166 } else if (focusType == "/Lotus/Upgrades/Focus/Power/Residual/ChannelEfficiencyFocusUpgrade") {
167 // Zenurik's Inner Might (Focus 2.0)
168 cost += 50_000;
169 } else {
170 logger.warn(`unknown focus upgrade ${focusType}, will unlock it for free`);
218 if (focusVersion > 1) {
219 const request = JSON.parse(String(req.body)) as IUnlockUpgrade2Request;
220 const focusPolarity = focusTypeToPolarity(request.FocusTypes[0]);
221 const inventory = await getInventory(account._id, "FocusUpgrades FocusXP");
222 let cost = 0;
223 for (const focusType of request.FocusTypes) {
224 cost += getUpgradeUnlockCost(focusType);
225 inventory.FocusUpgrades.push({ ItemType: focusType, Level: 0 });
171 226 }
172 inventory.FocusUpgrades.push({ ItemType: focusType, Level: 0 });
227 inventory.FocusXP![focusPolarity]! -= cost;
228 await inventory.save();
229 res.json({
230 FocusTypes: request.FocusTypes,
231 FocusPointCosts: { [focusPolarity]: cost }
232 });
233 } else {
234 const request = JSON.parse(String(req.body)) as IUnlockUpgrade1Request;
235 const focusPolarity = focusTypeToPolarity(request.FocusType);
236 const inventory = await getInventory(account._id, "FocusUpgrades FocusXP");
237 const cost = getUpgradeUnlockCost(request.FocusType);
238 inventory.FocusUpgrades.push({
239 ItemType: request.FocusType,
240 Level: 0,
241 IsActive: request.ActivateUpgrade
242 });
243 inventory.FocusXP![focusPolarity]! -= cost;
244 await inventory.save();
245 res.json({
246 FocusUpgrade: {
247 ItemType: request.FocusType,
248 Level: 0,
249 IsActive: request.ActivateUpgrade
250 },
251 FocusPointCosts: { [focusPolarity]: cost }
252 });
173 253 }
174 inventory.FocusXP![focusPolarity]! -= cost;
175 await inventory.save();
176 res.json({
177 FocusTypes: request.FocusTypes,
178 FocusPointCosts: { [focusPolarity]: cost }
179 });
180 254 break;
181 255 }
182 256 case "LevelUpUpgrade":
183 257 case "UpdateUpgrade": {
184 const request = JSON.parse(String(req.body)) as ILevelUpUpgradeRequest;
185 const focusPolarity = focusTypeToPolarity(request.FocusInfos[0].ItemType);
186 const inventory = await getInventory(account._id);
187 let cost = 0;
188 for (const focusUpgrade of request.FocusInfos) {
189 cost += focusUpgrade.FocusXpCost;
190 const focusUpgradeDb = inventory.FocusUpgrades.find(entry => entry.ItemType == focusUpgrade.ItemType)!;
191 if (op == "UpdateUpgrade") {
192 focusUpgradeDb.IsActive = focusUpgrade.IsActive;
258 if (focusVersion > 1) {
259 const request = JSON.parse(String(req.body)) as ILevelUpUpgrade2Request;
260 const focusPolarity = focusTypeToPolarity(request.FocusInfos[0].ItemType);
261 const inventory = await getInventory(account._id, "FocusUpgrades FocusXP");
262 let cost = 0;
263 for (const focusUpgrade of request.FocusInfos) {
264 cost += focusUpgrade.FocusXpCost;
265 const focusUpgradeDb = inventory.FocusUpgrades.find(
266 entry => entry.ItemType == focusUpgrade.ItemType
267 )!;
268 if (op == "UpdateUpgrade") {
269 focusUpgradeDb.IsActive = focusUpgrade.IsActive;
270 } else {
271 focusUpgradeDb.Level = focusUpgrade.Level;
272 }
273 }
274 inventory.FocusXP![focusPolarity]! -= cost;
275 await inventory.save();
276 res.json({
277 FocusInfos: request.FocusInfos,
278 FocusPointCosts: { [focusPolarity]: cost }
279 });
280 } else {
281 if (op == "LevelUpUpgrade") {
282 const request = JSON.parse(String(req.body)) as ILevelUpUpgrade1Request;
283 const focusPolarity = focusTypeToPolarity(request.FocusType);
284 const inventory = await getInventory(account._id, "FocusUpgrades FocusXP");
285 inventory.FocusUpgrades.find(x => x.ItemType == request.FocusType)!.Level = request.NewLvl;
286 inventory.FocusXP![focusPolarity]! -= request.XPCost;
287 await inventory.save();
288 res.json({
289 FocusUpgrade: {
290 ItemType: request.FocusType,
291 Level: request.NewLvl
292 },
293 FocusPointCosts: { [focusPolarity]: request.XPCost }
294 });
193 295 } else {
194 focusUpgradeDb.Level = focusUpgrade.Level;
296 const request = JSON.parse(String(req.body)) as IUpdateUpgrade1Request;
297 const inventory = await getInventory(account._id, "FocusUpgrades");
298 for (const focusType of request.FocusTypes) {
299 inventory.FocusUpgrades.find(x => x.ItemType == focusType)!.IsActive = request.ActivateUpgrade;
300 }
301 await inventory.save();
302 res.json(request);
195 303 }
196 304 }
197 inventory.FocusXP![focusPolarity]! -= cost;
305 break;
306 }
307 case "UpgradeCooldown": {
308 const request = JSON.parse(String(req.body)) as IUpgradeCooldownRequest;
309 const focusPolarity = focusTypeToPolarity(request.FocusType);
310 const inventory = await getInventory(account._id, "FocusUpgrades FocusXP");
311 inventory.FocusUpgrades.find(x => x.ItemType == request.FocusType)!.CooldownTier = request.NewTier;
312 inventory.FocusXP![focusPolarity]! -= request.XPCost;
198 313 await inventory.save();
199 314 res.json({
200 FocusInfos: request.FocusInfos,
201 FocusPointCosts: { [focusPolarity]: cost }
315 FocusUpgrade: {
316 ItemType: request.FocusType,
317 CooldownTier: request.NewTier
318 },
319 FocusPointCosts: { [focusPolarity]: request.XPCost }
320 });
321 break;
322 }
323 case "UpdateCooldownReduction": {
324 const request = JSON.parse(String(req.body)) as IUpdateCooldownReductionRequest;
325 const inventory = await getInventory(account._id, "FocusUpgrades");
326 inventory.FocusUpgrades.find(x => x.ItemType == request.FocusType)!.IsCooldownReductionActive =
327 request.ActivateCooldown;
328 await inventory.save();
329 res.json({
330 FocusUpgrade: {
331 ItemType: request.FocusType,
332 IsCooldownReductionActive: request.ActivateCooldown
333 }
202 334 });
203 335 break;
204 336 }
@@ -311,23 +443,59 @@ enum Focus2Operation {
311 443 ConvertShard = "11"
312 444 }
313 445
446 // Focus 1.0
447 enum Focus1Operation {
448 InstallLens = "1",
449 UnlockWay = "2",
450 UnlockUpgrade = "3",
451 IncreasePool = "4",
452 LevelUpUpgrade = "5",
453 ActivateWay = "6",
454 UpdateUpgrade = "7",
455 UpgradeCooldown = "8",
456 SentTrainingAmplifier = "9",
457 UpdateCooldownReduction = "10"
458 }
459
314 460 // For UnlockWay & ActivateWay
315 461 interface IWayRequest {
316 462 FocusType: string;
317 463 }
318 464
319 interface IUnlockUpgradeRequest {
465 // Focus 2.0 & Focus 3.0
466 interface IUnlockUpgrade2Request {
320 467 FocusTypes: string[];
321 468 }
322 469
470 // Focus 1.0
471 interface IUnlockUpgrade1Request {
472 FocusType: string;
473 ActivateUpgrade: boolean;
474 }
475
476 // Focus 1.0
477 interface IUpgradeCooldownRequest {
478 FocusType: string;
479 NewTier: number;
480 XPCost: number;
481 }
482
323 483 // Focus 2.0
324 interface IIncreasePoolRequest {
484 interface IIncreasePool2Request {
325 485 FocusType: string;
326 486 CurrentTotalCapacity: number;
327 487 NewTotalCapacity: number;
328 488 }
329 489
330 interface ILevelUpUpgradeRequest {
490 // Focus 1.0
491 interface IIncreasePool1Request {
492 FocusType: string;
493 CurrentTotalCapacity: number; // is actually the new total capacity
494 XPCost: number;
495 }
496
497 // Focus 2.0 & Focus 3.0
498 interface ILevelUpUpgrade2Request {
331 499 FocusInfos: {
332 500 ItemType: string;
333 501 FocusXpCost: number;
@@ -338,6 +506,25 @@ interface ILevelUpUpgradeRequest {
338 506 }[];
339 507 }
340 508
509 // Focus 1.0
510 interface ILevelUpUpgrade1Request {
511 FocusType: string;
512 XPCost: number;
513 NewLvl: number;
514 }
515
516 // Focus 1.0
517 interface IUpdateUpgrade1Request {
518 FocusTypes: string[];
519 ActivateUpgrade: boolean;
520 }
521
522 // Focus 1.0
523 interface IUpdateCooldownReductionRequest {
524 FocusType: string;
525 ActivateCooldown: boolean;
526 }
527
341 528 interface IUnbindUpgradeRequest {
342 529 ShardTypes: string[];
343 530 FocusTypes: string[];
@@ -365,6 +552,25 @@ const focusTypeToPolarity = (type: string): TFocusPolarity => {
365 552 return ("AP_" + type.substring(1).split("/")[3].toUpperCase()) as TFocusPolarity;
366 553 };
367 554
555 const focusUnlockCostSupplementals: Record<string, number> = {
556 "/Lotus/Upgrades/Focus/Power/Residual/ChannelEfficiencyFocusUpgrade": 50_000, // Zenurik's Inner Might (Focus 2.0)
557 "/Lotus/Upgrades/Focus/Attack/Residual/SlashDamageFocusUpgrade": 50_000, // Madurai's Blazing Fury (Focus 1.0)
558 "/Lotus/Upgrades/Focus/Attack/Chaos/FastAndShortFocusUpgrade": 80_000, // Madurai's Phoenix Flash (Focus 1.0)
559 "/Lotus/Upgrades/Focus/Attack/Active/SplitStreamFocusUpgrade": 25_000, // Madurai's Chimera Breath (Focus 1.0)
560 "/Lotus/Upgrades/Focus/Attack/Chaos/RadialBurstFocusUpgrade": 50_000 // Madurai's Rising Ashes (Focus 1.0)
561 };
562
563 const getUpgradeUnlockCost = (focusType: string): number => {
564 if (focusType in ExportFocusUpgrades) {
565 return ExportFocusUpgrades[focusType].baseFocusPointCost;
566 } else if (focusType in focusUnlockCostSupplementals) {
567 return focusUnlockCostSupplementals[focusType];
568 } else {
569 logger.warn(`unknown focus upgrade ${focusType}, unlocking it for free`);
570 return 0;
571 }
572 };
573
368 574 const shardValues = {
369 575 "/Lotus/Types/Gameplay/Eidolon/Resources/SentientShards/SentientShardCommonItem": 2_500,
370 576 "/Lotus/Types/Gameplay/Eidolon/Resources/SentientShards/SentientShardSynthesizedItem": 5_000,
Modified src/models/inventoryModels/inventoryModel.ts +4 -1
@@ -158,7 +158,10 @@ const focusUpgradeSchema = new Schema<IFocusUpgrade>(
158 158 ItemType: String,
159 159 Level: Number,
160 160 IsUniversal: Boolean,
161 IsActive: Number
161 IsActive: Schema.Types.Mixed,
162 TotalCapacity: Number,
163 CooldownTier: Number,
164 IsCooldownReductionActive: Boolean
162 165 },
163 166 { _id: false }
164 167 );
Modified src/types/inventoryTypes/inventoryTypes.ts +5 -2
@@ -414,7 +414,7 @@ export interface IInventoryClient
414 414 EmailItems: ITypeCount[];
415 415 CompletedSyndicates: string[];
416 416 FocusXP?: IFocusXP;
417 FocusCapacity?: number;
417 FocusCapacity?: number; // Focus 2.0
418 418 Wishlist: string[];
419 419 Alignment?: IAlignment;
420 420 CompletedSorties: string[];
@@ -740,7 +740,10 @@ export interface IFocusUpgrade {
740 740 ItemType: string;
741 741 Level?: number;
742 742 IsUniversal?: boolean;
743 IsActive?: number; // Focus 2.0
743 IsActive?: number | boolean; // Focus 2.0 | Focus 1.0
744 TotalCapacity?: number; // Focus 1.0
745 CooldownTier?: number; // Focus 1.0
746 IsCooldownReductionActive?: boolean; // Focus 1.0
744 747 }
745 748
746 749 export interface IFocusXP {