返回提交历史
Modified
src/services/serversideVendorsService.ts
+40
-4
Deleted
static/fixed_responses/getVendorInfo/HubsRailjackCrewMemberVendorManifest.json
+0
-244
XFEstudio/XFESpaceNinjaServer
feat: autogenerate railjack crew member vendor (#2170)
Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2170 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
9731004d
代码差异
2 个文件
+40
-248
@@ -20,7 +20,6 @@ import DeimosPetVendorManifest from "@/static/fixed_responses/getVendorInfo/Deim
20
20
import DuviriAcrithisVendorManifest from "@/static/fixed_responses/getVendorInfo/DuviriAcrithisVendorManifest.json";
21
21
import EntratiLabsEntratiLabsCommisionsManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabsCommisionsManifest.json";
22
22
import EntratiLabsEntratiLabVendorManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabVendorManifest.json";
23
import HubsRailjackCrewMemberVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsRailjackCrewMemberVendorManifest.json";
24
23
import MaskSalesmanManifest from "@/static/fixed_responses/getVendorInfo/MaskSalesmanManifest.json";
25
24
import Nova1999ConquestShopManifest from "@/static/fixed_responses/getVendorInfo/Nova1999ConquestShopManifest.json";
26
25
import OstronPetVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronPetVendorManifest.json";
@@ -42,7 +41,6 @@ const rawVendorManifests: IVendorManifest[] = [
42
41
DuviriAcrithisVendorManifest,
43
42
EntratiLabsEntratiLabsCommisionsManifest,
44
43
EntratiLabsEntratiLabVendorManifest,
45
HubsRailjackCrewMemberVendorManifest,
46
44
MaskSalesmanManifest,
47
45
Nova1999ConquestShopManifest,
48
46
OstronPetVendorManifest,
@@ -273,20 +271,39 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
273
271
const offersToAdd: IVendorOffer[] = [];
274
272
if (!manifest.isOneBinPerCycle) {
275
273
const remainingItemCapacity: Record<string, number> = {};
274
const missingItemsPerBin: Record<number, number> = {};
275
let numOffersThatNeedToMatchABin = 0;
276
if (manifest.numItemsPerBin) {
277
for (let bin = 0; bin != manifest.numItemsPerBin.length; ++bin) {
278
missingItemsPerBin[bin] = manifest.numItemsPerBin[bin];
279
numOffersThatNeedToMatchABin += manifest.numItemsPerBin[bin];
280
}
281
}
276
282
for (const item of manifest.items) {
277
283
remainingItemCapacity[item.storeItem] = 1 + item.duplicates;
278
284
}
279
285
for (const offer of info.ItemManifest) {
280
286
remainingItemCapacity[offer.StoreItem] -= 1;
287
const bin = parseInt(offer.Bin.substring(4));
288
if (missingItemsPerBin[bin]) {
289
missingItemsPerBin[bin] -= 1;
290
numOffersThatNeedToMatchABin -= 1;
291
}
281
292
}
282
293
if (manifest.numItems && manifest.items.length != manifest.numItems.minValue) {
283
294
const numItemsTarget = rng.randomInt(manifest.numItems.minValue, manifest.numItems.maxValue);
284
295
while (info.ItemManifest.length + offersToAdd.length < numItemsTarget) {
285
// TODO: Consider per-bin item limits
286
296
// TODO: Consider item probability weightings
287
297
const item = rng.randomElement(manifest.items)!;
288
if (remainingItemCapacity[item.storeItem] != 0) {
298
if (
299
remainingItemCapacity[item.storeItem] != 0 &&
300
(numOffersThatNeedToMatchABin == 0 || missingItemsPerBin[item.bin])
301
) {
289
302
remainingItemCapacity[item.storeItem] -= 1;
303
if (missingItemsPerBin[item.bin]) {
304
missingItemsPerBin[item.bin] -= 1;
305
numOffersThatNeedToMatchABin -= 1;
306
}
290
307
offersToAdd.push(item);
291
308
}
292
309
}
@@ -383,6 +400,12 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
383
400
info.ItemManifest.push(item);
384
401
}
385
402
403
info.ItemManifest.sort((a, b) => {
404
const aBin = parseInt(a.Bin.substring(4));
405
const bBin = parseInt(b.Bin.substring(4));
406
return aBin == bBin ? 0 : aBin < bBin ? +1 : -1;
407
});
408
386
409
// Update vendor expiry
387
410
let soonestOfferExpiry: number = Number.MAX_SAFE_INTEGER;
388
411
for (const offer of info.ItemManifest) {
@@ -424,4 +447,17 @@ if (isDev) {
424
447
) {
425
448
logger.warn(`self test failed for /Lotus/Types/Game/VendorManifests/Hubs/IronwakeDondaVendorManifest`);
426
449
}
450
451
const cms = getVendorManifestByTypeName("/Lotus/Types/Game/VendorManifests/Hubs/RailjackCrewMemberVendorManifest")!
452
.VendorInfo.ItemManifest;
453
if (
454
cms.length != 9 ||
455
cms[0].Bin != "BIN_2" ||
456
cms[8].Bin != "BIN_0" ||
457
cms.reduce((a, x) => a + (x.Bin == "BIN_2" ? 1 : 0), 0) < 2 ||
458
cms.reduce((a, x) => a + (x.Bin == "BIN_1" ? 1 : 0), 0) < 2 ||
459
cms.reduce((a, x) => a + (x.Bin == "BIN_0" ? 1 : 0), 0) < 4
460
) {
461
logger.warn(`self test failed for /Lotus/Types/Game/VendorManifests/Hubs/RailjackCrewMemberVendorManifest`);
462
}
427
463
}
@@ -1,244 +0,0 @@
1
{
2
"VendorInfo": {
3
"_id": {
4
"$oid": "5fb70313c96976e97d6be787"
5
},
6
"TypeName": "/Lotus/Types/Game/VendorManifests/Hubs/RailjackCrewMemberVendorManifest",
7
"ItemManifest": [
8
{
9
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/SteelMeridianCrewMemberGeneratorStrong",
10
"ItemPrices": [
11
{
12
"ItemType": "/Lotus/Types/Items/RailjackMiscItems/IsosRailjackItem",
13
"ItemCount": 2220,
14
"ProductCategory": "MiscItems"
15
}
16
],
17
"RegularPrice": [2180000, 2180000],
18
"Bin": "BIN_2",
19
"QuantityMultiplier": 1,
20
"Expiry": {
21
"$date": {
22
"$numberLong": "9999999000000"
23
}
24
},
25
"PurchaseQuantityLimit": 1,
26
"Affiliation": "SteelMeridianSyndicate",
27
"MinAffiliationRank": 0,
28
"ReductionPerPositiveRank": 0.1,
29
"IncreasePerNegativeRank": 0.5,
30
"AllowMultipurchase": false,
31
"LocTagRandSeed": 4185144421,
32
"Id": {
33
"$oid": "670daf92d21f34757a5e73da"
34
}
35
},
36
{
37
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/NewLokaCrewMemberGeneratorStrong",
38
"ItemPrices": [
39
{
40
"ItemType": "/Lotus/Types/Items/RailjackMiscItems/IsosRailjackItem",
41
"ItemCount": 2130,
42
"ProductCategory": "MiscItems"
43
}
44
],
45
"RegularPrice": [1890000, 1890000],
46
"Bin": "BIN_2",
47
"QuantityMultiplier": 1,
48
"Expiry": {
49
"$date": {
50
"$numberLong": "9999999000000"
51
}
52
},
53
"PurchaseQuantityLimit": 1,
54
"Affiliation": "NewLokaSyndicate",
55
"MinAffiliationRank": 0,
56
"ReductionPerPositiveRank": 0.1,
57
"IncreasePerNegativeRank": 0.5,
58
"AllowMultipurchase": false,
59
"LocTagRandSeed": 496053258,
60
"Id": {
61
"$oid": "670daf92d21f34757a5e73db"
62
}
63
},
64
{
65
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/SteelMeridianCrewMemberGeneratorMediumVersionTwo",
66
"ItemPrices": [
67
{
68
"ItemType": "/Lotus/Types/Items/RailjackMiscItems/IsosRailjackItem",
69
"ItemCount": 440,
70
"ProductCategory": "MiscItems"
71
}
72
],
73
"Bin": "BIN_1",
74
"QuantityMultiplier": 1,
75
"Expiry": {
76
"$date": {
77
"$numberLong": "9999999000000"
78
}
79
},
80
"PurchaseQuantityLimit": 1,
81
"Affiliation": "SteelMeridianSyndicate",
82
"MinAffiliationRank": 0,
83
"ReductionPerPositiveRank": 0.1,
84
"IncreasePerNegativeRank": 0.5,
85
"AllowMultipurchase": false,
86
"LocTagRandSeed": 2078883475,
87
"Id": {
88
"$oid": "670daf92d21f34757a5e73dc"
89
}
90
},
91
{
92
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/NewLokaCrewMemberGeneratorMediumVersionTwo",
93
"ItemPrices": [
94
{
95
"ItemType": "/Lotus/Types/Items/RailjackMiscItems/AsteriteRailjackItem",
96
"ItemCount": 730,
97
"ProductCategory": "MiscItems"
98
}
99
],
100
"Bin": "BIN_1",
101
"QuantityMultiplier": 1,
102
"Expiry": {
103
"$date": {
104
"$numberLong": "9999999000000"
105
}
106
},
107
"PurchaseQuantityLimit": 1,
108
"Affiliation": "NewLokaSyndicate",
109
"MinAffiliationRank": 0,
110
"ReductionPerPositiveRank": 0.1,
111
"IncreasePerNegativeRank": 0.5,
112
"AllowMultipurchase": false,
113
"LocTagRandSeed": 3890380934,
114
"Id": {
115
"$oid": "670daf92d21f34757a5e73dd"
116
}
117
},
118
{
119
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/CephalonSudaCrewMemberGeneratorMediumVersionTwo",
120
"ItemPrices": [
121
{
122
"ItemType": "/Lotus/Types/Items/RailjackMiscItems/AsteriteRailjackItem",
123
"ItemCount": 720,
124
"ProductCategory": "MiscItems"
125
}
126
],
127
"Bin": "BIN_1",
128
"QuantityMultiplier": 1,
129
"Expiry": {
130
"$date": {
131
"$numberLong": "9999999000000"
132
}
133
},
134
"PurchaseQuantityLimit": 1,
135
"Affiliation": "CephalonSudaSyndicate",
136
"MinAffiliationRank": 0,
137
"ReductionPerPositiveRank": 0.1,
138
"IncreasePerNegativeRank": 0.5,
139
"AllowMultipurchase": false,
140
"LocTagRandSeed": 3425148044,
141
"Id": {
142
"$oid": "670daf92d21f34757a5e73de"
143
}
144
},
145
{
146
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/ArbitersCrewMemberGeneratorMediumVersionTwo",
147
"ItemPrices": [
148
{
149
"ItemType": "/Lotus/Types/Items/RailjackMiscItems/CubicsRailjackItem",
150
"ItemCount": 6500,
151
"ProductCategory": "MiscItems"
152
}
153
],
154
"Bin": "BIN_1",
155
"QuantityMultiplier": 1,
156
"Expiry": {
157
"$date": {
158
"$numberLong": "9999999000000"
159
}
160
},
161
"PurchaseQuantityLimit": 1,
162
"Affiliation": "ArbitersSyndicate",
163
"MinAffiliationRank": 0,
164
"ReductionPerPositiveRank": 0.1,
165
"IncreasePerNegativeRank": 0.5,
166
"AllowMultipurchase": false,
167
"LocTagRandSeed": 2472754512,
168
"Id": {
169
"$oid": "670daf92d21f34757a5e73df"
170
}
171
},
172
{
173
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/PerrinCrewMemberGeneratorVersionTwo",
174
"RegularPrice": [105000, 105000],
175
"Bin": "BIN_0",
176
"QuantityMultiplier": 1,
177
"Expiry": {
178
"$date": {
179
"$numberLong": "9999999000000"
180
}
181
},
182
"PurchaseQuantityLimit": 1,
183
"Affiliation": "PerrinSyndicate",
184
"MinAffiliationRank": 0,
185
"ReductionPerPositiveRank": 0.1,
186
"IncreasePerNegativeRank": 0.5,
187
"AllowMultipurchase": false,
188
"LocTagRandSeed": 966238763,
189
"Id": {
190
"$oid": "670daf92d21f34757a5e73e0"
191
}
192
},
193
{
194
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/NewLokaCrewMemberGeneratorVersionTwo",
195
"RegularPrice": [120000, 120000],
196
"Bin": "BIN_0",
197
"QuantityMultiplier": 1,
198
"Expiry": {
199
"$date": {
200
"$numberLong": "9999999000000"
201
}
202
},
203
"PurchaseQuantityLimit": 1,
204
"Affiliation": "NewLokaSyndicate",
205
"MinAffiliationRank": 0,
206
"ReductionPerPositiveRank": 0.1,
207
"IncreasePerNegativeRank": 0.5,
208
"AllowMultipurchase": false,
209
"LocTagRandSeed": 356717213,
210
"Id": {
211
"$oid": "670daf92d21f34757a5e73e1"
212
}
213
},
214
{
215
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/ArbitersCrewMemberGeneratorVersionTwo",
216
"RegularPrice": [120000, 120000],
217
"Bin": "BIN_0",
218
"QuantityMultiplier": 1,
219
"Expiry": {
220
"$date": {
221
"$numberLong": "9999999000000"
222
}
223
},
224
"PurchaseQuantityLimit": 1,
225
"Affiliation": "ArbitersSyndicate",
226
"MinAffiliationRank": 0,
227
"ReductionPerPositiveRank": 0.1,
228
"IncreasePerNegativeRank": 0.5,
229
"AllowMultipurchase": false,
230
"LocTagRandSeed": 1969797050,
231
"Id": {
232
"$oid": "670daf92d21f34757a5e73e2"
233
}
234
}
235
],
236
"PropertyTextHash": "BE543CCC0A4F50A1D80CD2B523796EAE",
237
"RandomSeedType": "VRST_FLAVOUR_TEXT",
238
"Expiry": {
239
"$date": {
240
"$numberLong": "9999999000000"
241
}
242
}
243
}
244
}