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

SpaceNinjaServer

A simple server for a small space ninja game

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

XFEstudio/SpaceNinjaServer

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
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

2 个文件 +40 -248
Modified src/services/serversideVendorsService.ts +40 -4
@@ -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 }
Deleted static/fixed_responses/getVendorInfo/HubsRailjackCrewMemberVendorManifest.json +0 -244
@@ -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 }