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: #1902 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
This commit is contained in:
parent
9417aa3c84
commit
5df533a7fb
@ -1,4 +1,5 @@
|
||||
import { unixTimesInMs } from "@/src/constants/timeConstants";
|
||||
import { catBreadHash } from "@/src/helpers/stringHelpers";
|
||||
import { CRng, mixSeeds } from "@/src/services/rngService";
|
||||
import { IMongoDate } from "@/src/types/commonTypes";
|
||||
import { IItemManifest, IVendorInfo, IVendorManifest } from "@/src/types/vendorTypes";
|
||||
@ -6,7 +7,6 @@ import { ExportVendors, IRange } from "warframe-public-export-plus";
|
||||
|
||||
import ArchimedeanVendorManifest from "@/static/fixed_responses/getVendorInfo/ArchimedeanVendorManifest.json";
|
||||
import DeimosEntratiFragmentVendorProductsManifest from "@/static/fixed_responses/getVendorInfo/DeimosEntratiFragmentVendorProductsManifest.json";
|
||||
import DeimosFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/DeimosFishmongerVendorManifest.json";
|
||||
import DeimosHivemindCommisionsManifestFishmonger from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestFishmonger.json";
|
||||
import DeimosHivemindCommisionsManifestPetVendor from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestPetVendor.json";
|
||||
import DeimosHivemindCommisionsManifestProspector from "@/static/fixed_responses/getVendorInfo/DeimosHivemindCommisionsManifestProspector.json";
|
||||
@ -22,12 +22,10 @@ import HubsIronwakeDondaVendorManifest from "@/static/fixed_responses/getVendorI
|
||||
import HubsRailjackCrewMemberVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsRailjackCrewMemberVendorManifest.json";
|
||||
import MaskSalesmanManifest from "@/static/fixed_responses/getVendorInfo/MaskSalesmanManifest.json";
|
||||
import Nova1999ConquestShopManifest from "@/static/fixed_responses/getVendorInfo/Nova1999ConquestShopManifest.json";
|
||||
import OstronFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronFishmongerVendorManifest.json";
|
||||
import OstronPetVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronPetVendorManifest.json";
|
||||
import OstronProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronProspectorVendorManifest.json";
|
||||
import RadioLegionIntermission12VendorManifest from "@/static/fixed_responses/getVendorInfo/RadioLegionIntermission12VendorManifest.json";
|
||||
import SolarisDebtTokenVendorRepossessionsManifest from "@/static/fixed_responses/getVendorInfo/SolarisDebtTokenVendorRepossessionsManifest.json";
|
||||
import SolarisFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisFishmongerVendorManifest.json";
|
||||
import SolarisProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisProspectorVendorManifest.json";
|
||||
import Temple1999VendorManifest from "@/static/fixed_responses/getVendorInfo/Temple1999VendorManifest.json";
|
||||
import TeshinHardModeVendorManifest from "@/static/fixed_responses/getVendorInfo/TeshinHardModeVendorManifest.json";
|
||||
@ -36,7 +34,6 @@ import ZarimanCommisionsManifestArchimedean from "@/static/fixed_responses/getVe
|
||||
const rawVendorManifests: IVendorManifest[] = [
|
||||
ArchimedeanVendorManifest,
|
||||
DeimosEntratiFragmentVendorProductsManifest,
|
||||
DeimosFishmongerVendorManifest,
|
||||
DeimosHivemindCommisionsManifestFishmonger,
|
||||
DeimosHivemindCommisionsManifestPetVendor,
|
||||
DeimosHivemindCommisionsManifestProspector,
|
||||
@ -52,12 +49,10 @@ const rawVendorManifests: IVendorManifest[] = [
|
||||
HubsRailjackCrewMemberVendorManifest,
|
||||
MaskSalesmanManifest,
|
||||
Nova1999ConquestShopManifest,
|
||||
OstronFishmongerVendorManifest,
|
||||
OstronPetVendorManifest,
|
||||
OstronProspectorVendorManifest,
|
||||
RadioLegionIntermission12VendorManifest,
|
||||
SolarisDebtTokenVendorRepossessionsManifest,
|
||||
SolarisFishmongerVendorManifest,
|
||||
SolarisProspectorVendorManifest,
|
||||
Temple1999VendorManifest,
|
||||
TeshinHardModeVendorManifest, // uses preprocessing
|
||||
@ -87,17 +82,11 @@ const generatableVendors: IGeneratableVendorInfo[] = [
|
||||
cycleOffset: 1744934400_000,
|
||||
cycleDuration: 4 * unixTimesInMs.day
|
||||
},
|
||||
{
|
||||
_id: { $oid: "5be4a159b144f3cdf1c22efa" },
|
||||
TypeName: "/Lotus/Types/Game/VendorManifests/Solaris/DebtTokenVendorManifest",
|
||||
RandomSeedType: "VRST_FLAVOUR_TEXT",
|
||||
cycleDuration: unixTimesInMs.hour
|
||||
},
|
||||
{
|
||||
_id: { $oid: "61ba123467e5d37975aeeb03" },
|
||||
TypeName: "/Lotus/Types/Game/VendorManifests/Hubs/GuildAdvertisementVendorManifest",
|
||||
RandomSeedType: "VRST_FLAVOUR_TEXT",
|
||||
cycleDuration: unixTimesInMs.week
|
||||
cycleDuration: unixTimesInMs.week // TODO: Auto-detect this based on the items, so we don't need to specify it explicitly.
|
||||
}
|
||||
// {
|
||||
// _id: { $oid: "5dbb4c41e966f7886c3ce939" },
|
||||
@ -105,6 +94,10 @@ const generatableVendors: IGeneratableVendorInfo[] = [
|
||||
// }
|
||||
];
|
||||
|
||||
const getVendorOid = (typeName: string): string => {
|
||||
return "5be4a159b144f3cd" + catBreadHash(typeName).toString(16).padStart(8, "0");
|
||||
};
|
||||
|
||||
export const getVendorManifestByTypeName = (typeName: string): IVendorManifest | undefined => {
|
||||
for (const vendorManifest of rawVendorManifests) {
|
||||
if (vendorManifest.VendorInfo.TypeName == typeName) {
|
||||
@ -116,6 +109,14 @@ export const getVendorManifestByTypeName = (typeName: string): IVendorManifest |
|
||||
return generateVendorManifest(vendorInfo);
|
||||
}
|
||||
}
|
||||
if (typeName in ExportVendors) {
|
||||
return generateVendorManifest({
|
||||
_id: { $oid: getVendorOid(typeName) },
|
||||
TypeName: typeName,
|
||||
RandomSeedType: ExportVendors[typeName].randomSeedType,
|
||||
cycleDuration: unixTimesInMs.hour
|
||||
});
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
|
||||
@ -130,6 +131,17 @@ export const getVendorManifestByOid = (oid: string): IVendorManifest | undefined
|
||||
return generateVendorManifest(vendorInfo);
|
||||
}
|
||||
}
|
||||
for (const [typeName, manifest] of Object.entries(ExportVendors)) {
|
||||
const typeNameOid = getVendorOid(typeName);
|
||||
if (typeNameOid == oid) {
|
||||
return generateVendorManifest({
|
||||
_id: { $oid: typeNameOid },
|
||||
TypeName: typeName,
|
||||
RandomSeedType: manifest.randomSeedType,
|
||||
cycleDuration: unixTimesInMs.hour
|
||||
});
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
|
||||
@ -195,7 +207,7 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
|
||||
const rng = new CRng(mixSeeds(vendorSeed, cycleIndex));
|
||||
const manifest = ExportVendors[vendorInfo.TypeName];
|
||||
const offersToAdd = [];
|
||||
if (manifest.numItems && manifest.numItems.minValue != manifest.numItems.maxValue) {
|
||||
if (manifest.numItems && !manifest.isOneBinPerCycle) {
|
||||
const numItemsTarget = rng.randomInt(manifest.numItems.minValue, manifest.numItems.maxValue);
|
||||
while (processed.ItemManifest.length + offersToAdd.length < numItemsTarget) {
|
||||
// TODO: Consider per-bin item limits
|
||||
@ -263,6 +275,13 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
|
||||
) * rawItem.credits.step;
|
||||
item.RegularPrice = [value, value];
|
||||
}
|
||||
if (rawItem.platinum) {
|
||||
const value =
|
||||
typeof rawItem.platinum == "number"
|
||||
? rawItem.platinum
|
||||
: rng.randomInt(rawItem.platinum.minValue, rawItem.platinum.maxValue);
|
||||
item.PremiumPrice = [value, value];
|
||||
}
|
||||
if (vendorInfo.RandomSeedType) {
|
||||
item.LocTagRandSeed = (rng.randomInt(0, 0xffff) << 16) | rng.randomInt(0, 0xffff);
|
||||
if (vendorInfo.RandomSeedType == "VRST_WEAPON") {
|
||||
|
@ -1,106 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "5f456e01c96976e97d6b8016"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/Deimos/FishmongerVendorManifest",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Deimos/FishParts/DeimosOrokinFishAPartItem",
|
||||
"PremiumPrice": [9, 9],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 10,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e91b9"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishDPartItem",
|
||||
"PremiumPrice": [17, 17],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 20,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e91ba"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishCPartItem",
|
||||
"PremiumPrice": [10, 10],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 20,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e91bb"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishBPartItem",
|
||||
"PremiumPrice": [6, 6],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 20,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e91bc"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Deimos/FishParts/DeimosInfestedFishAPartItem",
|
||||
"PremiumPrice": [5, 5],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 20,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e91bd"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Deimos/FishParts/DeimosGenericSharedFishPartItem",
|
||||
"PremiumPrice": [7, 7],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 20,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e91be"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "6DF13A7FB573C25B4B4F989CBEFFC615",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,106 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "59d6e27ebcc718474eb17115"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/Ostron/FishmongerVendorManifest",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Eidolon/FishParts/DayUncommonFishAPartItem",
|
||||
"PremiumPrice": [14, 14],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 10,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9808"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Eidolon/FishParts/BothUncommonFishBPartItem",
|
||||
"PremiumPrice": [12, 12],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 10,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9809"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Eidolon/FishParts/DayCommonFishCPartItem",
|
||||
"PremiumPrice": [8, 8],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 20,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e980a"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Eidolon/FishParts/DayCommonFishBPartItem",
|
||||
"PremiumPrice": [7, 7],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 20,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e980b"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Eidolon/FishParts/DayCommonFishAPartItem",
|
||||
"PremiumPrice": [10, 10],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 20,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e980c"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Eidolon/FishParts/BothCommonFishBPartItem",
|
||||
"PremiumPrice": [8, 8],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 20,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e980d"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "CC3B9DAFB38F412998E90A41421A8986",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,106 +0,0 @@
|
||||
{
|
||||
"VendorInfo": {
|
||||
"_id": {
|
||||
"$oid": "5b0de8556df82a56ea9bae82"
|
||||
},
|
||||
"TypeName": "/Lotus/Types/Game/VendorManifests/Solaris/FishmongerVendorManifest",
|
||||
"ItemManifest": [
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Solaris/FishParts/CorpusFishThermalLaserItem",
|
||||
"PremiumPrice": [15, 15],
|
||||
"Bin": "BIN_1",
|
||||
"QuantityMultiplier": 10,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9515"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Solaris/FishParts/CorpusFishVenedoCaseItem",
|
||||
"PremiumPrice": [8, 8],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 20,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9516"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Solaris/FishParts/SolarisFishDissipatorCoilItem",
|
||||
"PremiumPrice": [18, 18],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 20,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9517"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Solaris/FishParts/CorpusFishExaBrainItem",
|
||||
"PremiumPrice": [5, 5],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 20,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9518"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Solaris/FishParts/CorpusFishAnoscopicSensorItem",
|
||||
"PremiumPrice": [5, 5],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 20,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e9519"
|
||||
}
|
||||
},
|
||||
{
|
||||
"StoreItem": "/Lotus/StoreItems/Types/Items/Fish/Solaris/FishParts/GenericFishScrapItem",
|
||||
"PremiumPrice": [5, 5],
|
||||
"Bin": "BIN_0",
|
||||
"QuantityMultiplier": 20,
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
},
|
||||
"AllowMultipurchase": true,
|
||||
"Id": {
|
||||
"$oid": "66fd60b20ba592c4c95e951a"
|
||||
}
|
||||
}
|
||||
],
|
||||
"PropertyTextHash": "946131D0CF5CDF7C2C03BB967DE0DF49",
|
||||
"Expiry": {
|
||||
"$date": {
|
||||
"$numberLong": "9999999000000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user