返回提交历史
Modified
src/services/serversideVendorsService.ts
+33
-14
Deleted
static/fixed_responses/getVendorInfo/DeimosFishmongerVendorManifest.json
+0
-106
Deleted
static/fixed_responses/getVendorInfo/OstronFishmongerVendorManifest.json
+0
-106
Deleted
static/fixed_responses/getVendorInfo/SolarisFishmongerVendorManifest.json
+0
-106
XFEstudio/XFESpaceNinjaServer
chore: auto-generate "daily special" for fish vendors (#1902)
Trying to go a bit more towards an "auto-generate by default" approach, with manual overrides where needed. Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1902 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
5df533a7
代码差异
4 个文件
+33
-332
@@ -1,4 +1,5 @@
1
1
import { unixTimesInMs } from "@/src/constants/timeConstants";
2
import { catBreadHash } from "@/src/helpers/stringHelpers";
2
3
import { CRng, mixSeeds } from "@/src/services/rngService";
3
4
import { IMongoDate } from "@/src/types/commonTypes";
4
5
import { IItemManifest, IVendorInfo, IVendorManifest } from "@/src/types/vendorTypes";
@@ -6,7 +7,6 @@ import { ExportVendors, IRange } from "warframe-public-export-plus";
6
7
7
8
import ArchimedeanVendorManifest from "@/static/fixed_responses/getVendorInfo/ArchimedeanVendorManifest.json";
8
9
import DeimosEntratiFragmentVendorProductsManifest from "@/static/fixed_responses/getVendorInfo/DeimosEntratiFragmentVendorProductsManifest.json";
9
import DeimosFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosFishmongerVendorManifest.json";
10
10
import DeimosHivemindCommisionsManifestFishmonger from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestFishmonger.json";
11
11
import DeimosHivemindCommisionsManifestPetVendor from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestPetVendor.json";
12
12
import DeimosHivemindCommisionsManifestProspector from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestProspector.json";
@@ -22,12 +22,10 @@ import HubsIronwakeDondaVendorManifest from "@/static/fixed_responses/getVendorI
22
22
import HubsRailjackCrewMemberVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsRailjackCrewMemberVendorManifest.json";
23
23
import MaskSalesmanManifest from "@/static/fixed_responses/getVendorInfo/MaskSalesmanManifest.json";
24
24
import Nova1999ConquestShopManifest from "@/static/fixed_responses/getVendorInfo/Nova1999ConquestShopManifest.json";
25
import OstronFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronFishmongerVendorManifest.json";
26
25
import OstronPetVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronPetVendorManifest.json";
27
26
import OstronProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronProspectorVendorManifest.json";
28
27
import RadioLegionIntermission12VendorManifest from "@/static/fixed_responses/getVendorInfo/RadioLegionIntermission12VendorManifest.json";
29
28
import SolarisDebtTokenVendorRepossessionsManifest from "@/static/fixed_responses/getVendorInfo/SolarisDebtTokenVendorRepossessionsManifest.json";
30
import SolarisFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisFishmongerVendorManifest.json";
31
29
import SolarisProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisProspectorVendorManifest.json";
32
30
import Temple1999VendorManifest from "@/static/fixed_responses/getVendorInfo/Temple1999VendorManifest.json";
33
31
import TeshinHardModeVendorManifest from "@/static/fixed_responses/getVendorInfo/TeshinHardModeVendorManifest.json";
@@ -36,7 +34,6 @@ import ZarimanCommisionsManifestArchimedean from "@/static/fixed_responses/getVe
36
34
const rawVendorManifests: IVendorManifest[] = [
37
35
ArchimedeanVendorManifest,
38
36
DeimosEntratiFragmentVendorProductsManifest,
39
DeimosFishmongerVendorManifest,
40
37
DeimosHivemindCommisionsManifestFishmonger,
41
38
DeimosHivemindCommisionsManifestPetVendor,
42
39
DeimosHivemindCommisionsManifestProspector,
@@ -52,12 +49,10 @@ const rawVendorManifests: IVendorManifest[] = [
52
49
HubsRailjackCrewMemberVendorManifest,
53
50
MaskSalesmanManifest,
54
51
Nova1999ConquestShopManifest,
55
OstronFishmongerVendorManifest,
56
52
OstronPetVendorManifest,
57
53
OstronProspectorVendorManifest,
58
54
RadioLegionIntermission12VendorManifest,
59
55
SolarisDebtTokenVendorRepossessionsManifest,
60
SolarisFishmongerVendorManifest,
61
56
SolarisProspectorVendorManifest,
62
57
Temple1999VendorManifest,
63
58
TeshinHardModeVendorManifest, // uses preprocessing
@@ -87,17 +82,11 @@ const generatableVendors: IGeneratableVendorInfo[] = [
87
82
cycleOffset: 1744934400_000,
88
83
cycleDuration: 4 * unixTimesInMs.day
89
84
},
90
{
91
_id: { $oid: "5be4a159b144f3cdf1c22efa" },
92
TypeName: "/Lotus/Types/Game/VendorManifests/Solaris/DebtTokenVendorManifest",
93
RandomSeedType: "VRST_FLAVOUR_TEXT",
94
cycleDuration: unixTimesInMs.hour
95
},
96
85
{
97
86
_id: { $oid: "61ba123467e5d37975aeeb03" },
98
87
TypeName: "/Lotus/Types/Game/VendorManifests/Hubs/GuildAdvertisementVendorManifest",
99
88
RandomSeedType: "VRST_FLAVOUR_TEXT",
100
cycleDuration: unixTimesInMs.week
89
cycleDuration: unixTimesInMs.week // TODO: Auto-detect this based on the items, so we don't need to specify it explicitly.
101
90
}
102
91
// {
103
92
// _id: { $oid: "5dbb4c41e966f7886c3ce939" },
@@ -105,6 +94,10 @@ const generatableVendors: IGeneratableVendorInfo[] = [
105
94
// }
106
95
];
107
96
97
const getVendorOid = (typeName: string): string => {
98
return "5be4a159b144f3cd" + catBreadHash(typeName).toString(16).padStart(8, "0");
99
};
100
108
101
export const getVendorManifestByTypeName = (typeName: string): IVendorManifest | undefined => {
109
102
for (const vendorManifest of rawVendorManifests) {
110
103
if (vendorManifest.VendorInfo.TypeName == typeName) {
@@ -116,6 +109,14 @@ export const getVendorManifestByTypeName = (typeName: string): IVendorManifest |
116
109
return generateVendorManifest(vendorInfo);
117
110
}
118
111
}
112
if (typeName in ExportVendors) {
113
return generateVendorManifest({
114
_id: { $oid: getVendorOid(typeName) },
115
TypeName: typeName,
116
RandomSeedType: ExportVendors[typeName].randomSeedType,
117
cycleDuration: unixTimesInMs.hour
118
});
119
}
119
120
return undefined;
120
121
};
121
122
@@ -130,6 +131,17 @@ export const getVendorManifestByOid = (oid: string): IVendorManifest | undefined
130
131
return generateVendorManifest(vendorInfo);
131
132
}
132
133
}
134
for (const [typeName, manifest] of Object.entries(ExportVendors)) {
135
const typeNameOid = getVendorOid(typeName);
136
if (typeNameOid == oid) {
137
return generateVendorManifest({
138
_id: { $oid: typeNameOid },
139
TypeName: typeName,
140
RandomSeedType: manifest.randomSeedType,
141
cycleDuration: unixTimesInMs.hour
142
});
143
}
144
}
133
145
return undefined;
134
146
};
135
147
@@ -195,7 +207,7 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
195
207
const rng = new CRng(mixSeeds(vendorSeed, cycleIndex));
196
208
const manifest = ExportVendors[vendorInfo.TypeName];
197
209
const offersToAdd = [];
198
if (manifest.numItems && manifest.numItems.minValue != manifest.numItems.maxValue) {
210
if (manifest.numItems && !manifest.isOneBinPerCycle) {
199
211
const numItemsTarget = rng.randomInt(manifest.numItems.minValue, manifest.numItems.maxValue);
200
212
while (processed.ItemManifest.length + offersToAdd.length < numItemsTarget) {
201
213
// TODO: Consider per-bin item limits
@@ -263,6 +275,13 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
263
275
) * rawItem.credits.step;
264
276
item.RegularPrice = [value, value];
265
277
}
278
if (rawItem.platinum) {
279
const value =
280
typeof rawItem.platinum == "number"
281
? rawItem.platinum
282
: rng.randomInt(rawItem.platinum.minValue, rawItem.platinum.maxValue);
283
item.PremiumPrice = [value, value];
284
}
266
285
if (vendorInfo.RandomSeedType) {
267
286
item.LocTagRandSeed = (rng.randomInt(0, 0xffff) << 16) | rng.randomInt(0, 0xffff);
268
287
if (vendorInfo.RandomSeedType == "VRST_WEAPON") {
@@ -1,106 +0,0 @@
1
{
2
"VendorInfo": {
3
"_id": {
4
"$oid": "5f456e01c96976e97d6b8016"
5
},
6
"TypeName": "/Lotus/Types/Game/VendorManifests/Deimos/FishmongerVendorManifest",
7
"ItemManifest": [
8
{
9
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Deimos/FishParts/DeimosOrokinFishAPartItem",
10
"PremiumPrice": [9, 9],
11
"Bin": "BIN_1",
12
"QuantityMultiplier": 10,
13
"Expiry": {
14
"$date": {
15
"$numberLong": "9999999000000"
16
}
17
},
18
"AllowMultipurchase": true,
19
"Id": {
20
"$oid": "66fd60b20ba592c4c95e91b9"
21
}
22
},
23
{
24
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishDPartItem",
25
"PremiumPrice": [17, 17],
26
"Bin": "BIN_0",
27
"QuantityMultiplier": 20,
28
"Expiry": {
29
"$date": {
30
"$numberLong": "9999999000000"
31
}
32
},
33
"AllowMultipurchase": true,
34
"Id": {
35
"$oid": "66fd60b20ba592c4c95e91ba"
36
}
37
},
38
{
39
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishCPartItem",
40
"PremiumPrice": [10, 10],
41
"Bin": "BIN_1",
42
"QuantityMultiplier": 20,
43
"Expiry": {
44
"$date": {
45
"$numberLong": "9999999000000"
46
}
47
},
48
"AllowMultipurchase": true,
49
"Id": {
50
"$oid": "66fd60b20ba592c4c95e91bb"
51
}
52
},
53
{
54
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishBPartItem",
55
"PremiumPrice": [6, 6],
56
"Bin": "BIN_0",
57
"QuantityMultiplier": 20,
58
"Expiry": {
59
"$date": {
60
"$numberLong": "9999999000000"
61
}
62
},
63
"AllowMultipurchase": true,
64
"Id": {
65
"$oid": "66fd60b20ba592c4c95e91bc"
66
}
67
},
68
{
69
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishAPartItem",
70
"PremiumPrice": [5, 5],
71
"Bin": "BIN_0",
72
"QuantityMultiplier": 20,
73
"Expiry": {
74
"$date": {
75
"$numberLong": "9999999000000"
76
}
77
},
78
"AllowMultipurchase": true,
79
"Id": {
80
"$oid": "66fd60b20ba592c4c95e91bd"
81
}
82
},
83
{
84
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Deimos/FishParts/DeimosGenericSharedFishPartItem",
85
"PremiumPrice": [7, 7],
86
"Bin": "BIN_0",
87
"QuantityMultiplier": 20,
88
"Expiry": {
89
"$date": {
90
"$numberLong": "9999999000000"
91
}
92
},
93
"AllowMultipurchase": true,
94
"Id": {
95
"$oid": "66fd60b20ba592c4c95e91be"
96
}
97
}
98
],
99
"PropertyTextHash": "6DF13A7FB573C25B4B4F989CBEFFC615",
100
"Expiry": {
101
"$date": {
102
"$numberLong": "9999999000000"
103
}
104
}
105
}
106
}
@@ -1,106 +0,0 @@
1
{
2
"VendorInfo": {
3
"_id": {
4
"$oid": "59d6e27ebcc718474eb17115"
5
},
6
"TypeName": "/Lotus/Types/Game/VendorManifests/Ostron/FishmongerVendorManifest",
7
"ItemManifest": [
8
{
9
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Eidolon/FishParts/DayUncommonFishAPartItem",
10
"PremiumPrice": [14, 14],
11
"Bin": "BIN_1",
12
"QuantityMultiplier": 10,
13
"Expiry": {
14
"$date": {
15
"$numberLong": "9999999000000"
16
}
17
},
18
"AllowMultipurchase": true,
19
"Id": {
20
"$oid": "66fd60b20ba592c4c95e9808"
21
}
22
},
23
{
24
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Eidolon/FishParts/BothUncommonFishBPartItem",
25
"PremiumPrice": [12, 12],
26
"Bin": "BIN_1",
27
"QuantityMultiplier": 10,
28
"Expiry": {
29
"$date": {
30
"$numberLong": "9999999000000"
31
}
32
},
33
"AllowMultipurchase": true,
34
"Id": {
35
"$oid": "66fd60b20ba592c4c95e9809"
36
}
37
},
38
{
39
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Eidolon/FishParts/DayCommonFishCPartItem",
40
"PremiumPrice": [8, 8],
41
"Bin": "BIN_0",
42
"QuantityMultiplier": 20,
43
"Expiry": {
44
"$date": {
45
"$numberLong": "9999999000000"
46
}
47
},
48
"AllowMultipurchase": true,
49
"Id": {
50
"$oid": "66fd60b20ba592c4c95e980a"
51
}
52
},
53
{
54
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Eidolon/FishParts/DayCommonFishBPartItem",
55
"PremiumPrice": [7, 7],
56
"Bin": "BIN_0",
57
"QuantityMultiplier": 20,
58
"Expiry": {
59
"$date": {
60
"$numberLong": "9999999000000"
61
}
62
},
63
"AllowMultipurchase": true,
64
"Id": {
65
"$oid": "66fd60b20ba592c4c95e980b"
66
}
67
},
68
{
69
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Eidolon/FishParts/DayCommonFishAPartItem",
70
"PremiumPrice": [10, 10],
71
"Bin": "BIN_0",
72
"QuantityMultiplier": 20,
73
"Expiry": {
74
"$date": {
75
"$numberLong": "9999999000000"
76
}
77
},
78
"AllowMultipurchase": true,
79
"Id": {
80
"$oid": "66fd60b20ba592c4c95e980c"
81
}
82
},
83
{
84
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Eidolon/FishParts/BothCommonFishBPartItem",
85
"PremiumPrice": [8, 8],
86
"Bin": "BIN_0",
87
"QuantityMultiplier": 20,
88
"Expiry": {
89
"$date": {
90
"$numberLong": "9999999000000"
91
}
92
},
93
"AllowMultipurchase": true,
94
"Id": {
95
"$oid": "66fd60b20ba592c4c95e980d"
96
}
97
}
98
],
99
"PropertyTextHash": "CC3B9DAFB38F412998E90A41421A8986",
100
"Expiry": {
101
"$date": {
102
"$numberLong": "9999999000000"
103
}
104
}
105
}
106
}
@@ -1,106 +0,0 @@
1
{
2
"VendorInfo": {
3
"_id": {
4
"$oid": "5b0de8556df82a56ea9bae82"
5
},
6
"TypeName": "/Lotus/Types/Game/VendorManifests/Solaris/FishmongerVendorManifest",
7
"ItemManifest": [
8
{
9
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Solaris/FishParts/CorpusFishThermalLaserItem",
10
"PremiumPrice": [15, 15],
11
"Bin": "BIN_1",
12
"QuantityMultiplier": 10,
13
"Expiry": {
14
"$date": {
15
"$numberLong": "9999999000000"
16
}
17
},
18
"AllowMultipurchase": true,
19
"Id": {
20
"$oid": "66fd60b20ba592c4c95e9515"
21
}
22
},
23
{
24
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Solaris/FishParts/CorpusFishVenedoCaseItem",
25
"PremiumPrice": [8, 8],
26
"Bin": "BIN_0",
27
"QuantityMultiplier": 20,
28
"Expiry": {
29
"$date": {
30
"$numberLong": "9999999000000"
31
}
32
},
33
"AllowMultipurchase": true,
34
"Id": {
35
"$oid": "66fd60b20ba592c4c95e9516"
36
}
37
},
38
{
39
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Solaris/FishParts/SolarisFishDissipatorCoilItem",
40
"PremiumPrice": [18, 18],
41
"Bin": "BIN_0",
42
"QuantityMultiplier": 20,
43
"Expiry": {
44
"$date": {
45
"$numberLong": "9999999000000"
46
}
47
},
48
"AllowMultipurchase": true,
49
"Id": {
50
"$oid": "66fd60b20ba592c4c95e9517"
51
}
52
},
53
{
54
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Solaris/FishParts/CorpusFishExaBrainItem",
55
"PremiumPrice": [5, 5],
56
"Bin": "BIN_0",
57
"QuantityMultiplier": 20,
58
"Expiry": {
59
"$date": {
60
"$numberLong": "9999999000000"
61
}
62
},
63
"AllowMultipurchase": true,
64
"Id": {
65
"$oid": "66fd60b20ba592c4c95e9518"
66
}
67
},
68
{
69
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Solaris/FishParts/CorpusFishAnoscopicSensorItem",
70
"PremiumPrice": [5, 5],
71
"Bin": "BIN_0",
72
"QuantityMultiplier": 20,
73
"Expiry": {
74
"$date": {
75
"$numberLong": "9999999000000"
76
}
77
},
78
"AllowMultipurchase": true,
79
"Id": {
80
"$oid": "66fd60b20ba592c4c95e9519"
81
}
82
},
83
{
84
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Solaris/FishParts/GenericFishScrapItem",
85
"PremiumPrice": [5, 5],
86
"Bin": "BIN_0",
87
"QuantityMultiplier": 20,
88
"Expiry": {
89
"$date": {
90
"$numberLong": "9999999000000"
91
}
92
},
93
"AllowMultipurchase": true,
94
"Id": {
95
"$oid": "66fd60b20ba592c4c95e951a"
96
}
97
}
98
],
99
"PropertyTextHash": "946131D0CF5CDF7C2C03BB967DE0DF49",
100
"Expiry": {
101
"$date": {
102
"$numberLong": "9999999000000"
103
}
104
}
105
}
106
}