返回提交历史
Modified
src/controllers/api/focusController.ts
+259
-53
Modified
src/models/inventoryModels/inventoryModel.ts
+4
-1
Modified
src/types/inventoryTypes/inventoryTypes.ts
+5
-2
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
代码差异
3 个文件
+268
-56
@@ -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,
@@ -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
);
@@ -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 {