返回提交历史
Modified
src/controllers/api/upgradesController.ts
+107
-82
Modified
src/services/itemDataService.ts
+4
-0
XFEstudio/SpaceNinjaServer
feat: infusing abilities (#676)
0c6f6e55
代码差异
2 个文件
+111
-82
@@ -3,11 +3,13 @@ import { IUpgradesRequest } from "@/src/types/requestTypes";
3
3
import {
4
4
ArtifactPolarity,
5
5
IEquipmentDatabase,
6
EquipmentFeatures
6
EquipmentFeatures,
7
IAbilityOverride
7
8
} from "@/src/types/inventoryTypes/commonInventoryTypes";
8
9
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
9
10
import { getAccountIdForRequest } from "@/src/services/loginService";
10
11
import { addMiscItems, getInventory, updateCurrency } from "@/src/services/inventoryService";
12
import { getRecipeByResult } from "@/src/services/itemDataService";
11
13
12
14
export const upgradesController: RequestHandler = async (req, res) => {
13
15
const accountId = await getAccountIdForRequest(req);
@@ -28,97 +30,120 @@ export const upgradesController: RequestHandler = async (req, res) => {
28
30
]);
29
31
}
30
32
31
switch (operation.UpgradeRequirement) {
32
case "/Lotus/Types/Items/MiscItems/OrokinReactor":
33
case "/Lotus/Types/Items/MiscItems/OrokinCatalyst":
34
for (const item of inventory[payload.ItemCategory]) {
35
if (item._id.toString() == payload.ItemId.$oid) {
36
item.Features ??= 0;
37
item.Features |= EquipmentFeatures.DOUBLE_CAPACITY;
38
break;
39
}
33
if (operation.OperationType == "UOT_ABILITY_OVERRIDE") {
34
console.assert(payload.ItemCategory == "Suits");
35
const suit = inventory.Suits.find(x => x._id.toString() == payload.ItemId.$oid)!;
36
37
let newAbilityOverride: IAbilityOverride | undefined;
38
if (operation.UpgradeRequirement != "") {
39
newAbilityOverride = {
40
Ability: operation.UpgradeRequirement,
41
Index: operation.PolarizeSlot
42
};
43
44
const recipe = getRecipeByResult(operation.UpgradeRequirement)!;
45
for (const ingredient of recipe.ingredients) {
46
inventory.InfestedFoundry!.Resources!.find(x => x.ItemType == ingredient.ItemType)!.Count -=
47
ingredient.ItemCount;
40
48
}
41
break;
42
case "/Lotus/Types/Items/MiscItems/UtilityUnlocker":
43
case "/Lotus/Types/Items/MiscItems/WeaponUtilityUnlocker":
44
for (const item of inventory[payload.ItemCategory]) {
45
if (item._id.toString() == payload.ItemId.$oid) {
46
item.Features ??= 0;
47
item.Features |= EquipmentFeatures.UTILITY_SLOT;
48
break;
49
}
50
51
for (const entry of operation.PolarityRemap) {
52
suit.Configs[entry.Slot] ??= {};
53
suit.Configs[entry.Slot].AbilityOverride = newAbilityOverride;
54
}
55
} else
56
switch (operation.UpgradeRequirement) {
57
case "/Lotus/Types/Items/MiscItems/OrokinReactor":
58
case "/Lotus/Types/Items/MiscItems/OrokinCatalyst":
59
for (const item of inventory[payload.ItemCategory]) {
60
if (item._id.toString() == payload.ItemId.$oid) {
61
item.Features ??= 0;
62
item.Features |= EquipmentFeatures.DOUBLE_CAPACITY;
63
break;
64
}
49
65
}
50
}
51
break;
52
case "/Lotus/Types/Items/MiscItems/HeavyWeaponCatalyst":
53
console.assert(payload.ItemCategory == "SpaceGuns");
54
for (const item of inventory[payload.ItemCategory]) {
55
if (item._id.toString() == payload.ItemId.$oid) {
56
item.Features ??= 0;
57
item.Features |= EquipmentFeatures.GRAVIMAG_INSTALLED;
58
break;
66
break;
67
case "/Lotus/Types/Items/MiscItems/UtilityUnlocker":
68
case "/Lotus/Types/Items/MiscItems/WeaponUtilityUnlocker":
69
for (const item of inventory[payload.ItemCategory]) {
70
if (item._id.toString() == payload.ItemId.$oid) {
71
item.Features ??= 0;
72
item.Features |= EquipmentFeatures.UTILITY_SLOT;
73
break;
74
}
59
75
}
60
}
61
break;
62
case "/Lotus/Types/Items/MiscItems/WeaponPrimaryArcaneUnlocker":
63
case "/Lotus/Types/Items/MiscItems/WeaponSecondaryArcaneUnlocker":
64
case "/Lotus/Types/Items/MiscItems/WeaponMeleeArcaneUnlocker":
65
case "/Lotus/Types/Items/MiscItems/WeaponAmpArcaneUnlocker":
66
for (const item of inventory[payload.ItemCategory]) {
67
if (item._id.toString() == payload.ItemId.$oid) {
68
item.Features ??= 0;
69
item.Features |= EquipmentFeatures.ARCANE_SLOT;
70
break;
76
break;
77
case "/Lotus/Types/Items/MiscItems/HeavyWeaponCatalyst":
78
console.assert(payload.ItemCategory == "SpaceGuns");
79
for (const item of inventory[payload.ItemCategory]) {
80
if (item._id.toString() == payload.ItemId.$oid) {
81
item.Features ??= 0;
82
item.Features |= EquipmentFeatures.GRAVIMAG_INSTALLED;
83
break;
84
}
71
85
}
72
}
73
break;
74
case "/Lotus/Types/Items/MiscItems/Forma":
75
case "/Lotus/Types/Items/MiscItems/FormaUmbra":
76
case "/Lotus/Types/Items/MiscItems/FormaAura":
77
case "/Lotus/Types/Items/MiscItems/FormaStance":
78
for (const item of inventory[payload.ItemCategory]) {
79
if (item._id.toString() == payload.ItemId.$oid) {
80
item.XP = 0;
81
setSlotPolarity(item, operation.PolarizeSlot, operation.PolarizeValue);
82
item.Polarized ??= 0;
83
item.Polarized += 1;
84
break;
86
break;
87
case "/Lotus/Types/Items/MiscItems/WeaponPrimaryArcaneUnlocker":
88
case "/Lotus/Types/Items/MiscItems/WeaponSecondaryArcaneUnlocker":
89
case "/Lotus/Types/Items/MiscItems/WeaponMeleeArcaneUnlocker":
90
case "/Lotus/Types/Items/MiscItems/WeaponAmpArcaneUnlocker":
91
for (const item of inventory[payload.ItemCategory]) {
92
if (item._id.toString() == payload.ItemId.$oid) {
93
item.Features ??= 0;
94
item.Features |= EquipmentFeatures.ARCANE_SLOT;
95
break;
96
}
85
97
}
86
}
87
break;
88
case "/Lotus/Types/Items/MiscItems/ModSlotUnlocker":
89
for (const item of inventory[payload.ItemCategory]) {
90
if (item._id.toString() == payload.ItemId.$oid) {
91
item.ModSlotPurchases ??= 0;
92
item.ModSlotPurchases += 1;
93
break;
98
break;
99
case "/Lotus/Types/Items/MiscItems/Forma":
100
case "/Lotus/Types/Items/MiscItems/FormaUmbra":
101
case "/Lotus/Types/Items/MiscItems/FormaAura":
102
case "/Lotus/Types/Items/MiscItems/FormaStance":
103
for (const item of inventory[payload.ItemCategory]) {
104
if (item._id.toString() == payload.ItemId.$oid) {
105
item.XP = 0;
106
setSlotPolarity(item, operation.PolarizeSlot, operation.PolarizeValue);
107
item.Polarized ??= 0;
108
item.Polarized += 1;
109
break;
110
}
94
111
}
95
}
96
break;
97
case "/Lotus/Types/Items/MiscItems/CustomizationSlotUnlocker":
98
for (const item of inventory[payload.ItemCategory]) {
99
if (item._id.toString() == payload.ItemId.$oid) {
100
item.CustomizationSlotPurchases ??= 0;
101
item.CustomizationSlotPurchases += 1;
102
break;
112
break;
113
case "/Lotus/Types/Items/MiscItems/ModSlotUnlocker":
114
for (const item of inventory[payload.ItemCategory]) {
115
if (item._id.toString() == payload.ItemId.$oid) {
116
item.ModSlotPurchases ??= 0;
117
item.ModSlotPurchases += 1;
118
break;
119
}
103
120
}
104
}
105
break;
106
case "":
107
console.assert(operation.OperationType == "UOT_SWAP_POLARITY");
108
for (const item of inventory[payload.ItemCategory]) {
109
if (item._id.toString() == payload.ItemId.$oid) {
110
for (let i = 0; i != operation.PolarityRemap.length; ++i) {
111
if (operation.PolarityRemap[i].Slot != i) {
112
setSlotPolarity(item, i, operation.PolarityRemap[i].Value);
121
break;
122
case "/Lotus/Types/Items/MiscItems/CustomizationSlotUnlocker":
123
for (const item of inventory[payload.ItemCategory]) {
124
if (item._id.toString() == payload.ItemId.$oid) {
125
item.CustomizationSlotPurchases ??= 0;
126
item.CustomizationSlotPurchases += 1;
127
break;
128
}
129
}
130
break;
131
case "":
132
console.assert(operation.OperationType == "UOT_SWAP_POLARITY");
133
for (const item of inventory[payload.ItemCategory]) {
134
if (item._id.toString() == payload.ItemId.$oid) {
135
for (let i = 0; i != operation.PolarityRemap.length; ++i) {
136
if (operation.PolarityRemap[i].Slot != i) {
137
setSlotPolarity(item, i, operation.PolarityRemap[i].Value);
138
}
113
139
}
140
break;
114
141
}
115
break;
116
142
}
117
}
118
break;
119
default:
120
throw new Error("Unsupported upgrade: " + operation.UpgradeRequirement);
121
}
143
break;
144
default:
145
throw new Error("Unsupported upgrade: " + operation.UpgradeRequirement);
146
}
122
147
}
123
148
await inventory.save();
124
149
res.json({ InventoryChanges: {} });
@@ -65,6 +65,10 @@ export const getRecipe = (uniqueName: string): IRecipe | undefined => {
65
65
return ExportRecipes[uniqueName];
66
66
};
67
67
68
export const getRecipeByResult = (resultType: string): IRecipe | undefined => {
69
return Object.values(ExportRecipes).find(x => x.resultType == resultType);
70
};
71
68
72
export const getExalted = (uniqueName: string): string[] | undefined => {
69
73
return getSuitByUniqueName(uniqueName)?.exalted;
70
74
};