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

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

代码差异

4 个文件 +33 -332
Modified src/services/serversideVendorsService.ts +33 -14
@@ -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") {
Deleted static/fixed_responses/getVendorInfo/DeimosFishmongerVendorManifest.json +0 -106
@@ -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 }
Deleted static/fixed_responses/getVendorInfo/OstronFishmongerVendorManifest.json +0 -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 }
Deleted static/fixed_responses/getVendorInfo/SolarisFishmongerVendorManifest.json +0 -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 }