feat: tenet weapon vendor rotation #1717

Merged
Sainan merged 2 commits from glast-rot into main 2025-04-18 11:18:12 -07:00
2 changed files with 19 additions and 141 deletions

View File

@ -34,7 +34,6 @@ const rawVendorManifests: IRawVendorManifest[] = [
getVendorManifestJson("EntratiLabsEntratiLabVendorManifest"), getVendorManifestJson("EntratiLabsEntratiLabVendorManifest"),
getVendorManifestJson("GuildAdvertisementVendorManifest"), // uses preprocessing getVendorManifestJson("GuildAdvertisementVendorManifest"), // uses preprocessing
getVendorManifestJson("HubsIronwakeDondaVendorManifest"), // uses preprocessing getVendorManifestJson("HubsIronwakeDondaVendorManifest"), // uses preprocessing
getVendorManifestJson("HubsPerrinSequenceWeaponVendorManifest"),
getVendorManifestJson("HubsRailjackCrewMemberVendorManifest"), getVendorManifestJson("HubsRailjackCrewMemberVendorManifest"),
getVendorManifestJson("MaskSalesmanManifest"), getVendorManifestJson("MaskSalesmanManifest"),
getVendorManifestJson("Nova1999ConquestShopManifest"), getVendorManifestJson("Nova1999ConquestShopManifest"),
@ -51,7 +50,8 @@ const rawVendorManifests: IRawVendorManifest[] = [
]; ];
interface IGeneratableVendorInfo extends Omit<IVendorInfo, "ItemManifest" | "Expiry"> { interface IGeneratableVendorInfo extends Omit<IVendorInfo, "ItemManifest" | "Expiry"> {
cycleDuration?: number; cycleStart: number;
cycleDuration: number;
} }
const generatableVendors: IGeneratableVendorInfo[] = [ const generatableVendors: IGeneratableVendorInfo[] = [
@ -62,6 +62,16 @@ const generatableVendors: IGeneratableVendorInfo[] = [
RandomSeedType: "VRST_WEAPON", RandomSeedType: "VRST_WEAPON",
RequiredGoalTag: "", RequiredGoalTag: "",
WeaponUpgradeValueAttenuationExponent: 2.25, WeaponUpgradeValueAttenuationExponent: 2.25,
cycleStart: 1740960000_000,
cycleDuration: 4 * unixTimesInMs.day
},
{
_id: { $oid: "60ad3b6ec96976e97d227e19" },
TypeName: "/Lotus/Types/Game/VendorManifests/Hubs/PerrinSequenceWeaponVendorManifest",
PropertyTextHash: "34F8CF1DFF745F0D67433A5EF0A03E70",
RandomSeedType: "VRST_WEAPON",
WeaponUpgradeValueAttenuationExponent: 2.25,
cycleStart: 1744934400_000,
cycleDuration: 4 * unixTimesInMs.day cycleDuration: 4 * unixTimesInMs.day
} }
// { // {
@ -124,7 +134,7 @@ const preprocessVendorManifest = (originalManifest: IRawVendorManifest): IVendor
const refreshExpiry = (expiry: IMongoDate): number => { const refreshExpiry = (expiry: IMongoDate): number => {
const period = parseInt(expiry.$date.$numberLong); const period = parseInt(expiry.$date.$numberLong);
if (Date.now() >= period) { if (Date.now() >= period) {
const epoch = 1734307200 * 1000; // Monday (for weekly schedules) const epoch = 1734307200_000; // Monday (for weekly schedules)
const iteration = Math.trunc((Date.now() - epoch) / period); const iteration = Math.trunc((Date.now() - epoch) / period);
const start = epoch + iteration * period; const start = epoch + iteration * period;
const end = start + period; const end = start + period;
@ -135,11 +145,11 @@ const refreshExpiry = (expiry: IMongoDate): number => {
}; };
const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorManifestPreprocessed => { const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorManifestPreprocessed => {
const EPOCH = 1740960000 * 1000; // Monday; aligns with coda weapons 8 day cycle. const EPOCH = vendorInfo.cycleStart;
const manifest = ExportVendors[vendorInfo.TypeName]; const manifest = ExportVendors[vendorInfo.TypeName];
let binThisCycle; let binThisCycle;
if (manifest.isOneBinPerCycle) { if (manifest.isOneBinPerCycle) {
const cycleDuration = vendorInfo.cycleDuration!; // manifest.items[0].durationHours! * 3600_000; const cycleDuration = vendorInfo.cycleDuration; // manifest.items[0].durationHours! * 3600_000;
const cycleIndex = Math.trunc((Date.now() - EPOCH) / cycleDuration); const cycleIndex = Math.trunc((Date.now() - EPOCH) / cycleDuration);
binThisCycle = cycleIndex % 2; // Note: May want to auto-compute the bin size, but this is only used for coda weapons right now. binThisCycle = cycleIndex % 2; // Note: May want to auto-compute the bin size, but this is only used for coda weapons right now.
} }
@ -150,7 +160,7 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
if (manifest.isOneBinPerCycle && rawItem.bin != binThisCycle) { if (manifest.isOneBinPerCycle && rawItem.bin != binThisCycle) {
continue; continue;
} }
const cycleDuration = vendorInfo.cycleDuration!; // rawItem.durationHours! * 3600_000; const cycleDuration = vendorInfo.cycleDuration; // rawItem.durationHours! * 3600_000;
const cycleIndex = Math.trunc((Date.now() - EPOCH) / cycleDuration); const cycleIndex = Math.trunc((Date.now() - EPOCH) / cycleDuration);
const cycleStart = EPOCH + cycleIndex * cycleDuration; const cycleStart = EPOCH + cycleIndex * cycleDuration;
const cycleEnd = cycleStart + cycleDuration; const cycleEnd = cycleStart + cycleDuration;
@ -181,10 +191,11 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
items.push(item); items.push(item);
} }
} }
delete vendorInfo.cycleDuration; // eslint-disable-next-line @typescript-eslint/no-unused-vars
const { cycleStart, cycleDuration, ...clientVendorInfo } = vendorInfo;
return { return {
VendorInfo: { VendorInfo: {
...vendorInfo, ...clientVendorInfo,
ItemManifest: items, ItemManifest: items,
Expiry: { $date: { $numberLong: soonestOfferExpiry.toString() } } Expiry: { $date: { $numberLong: soonestOfferExpiry.toString() } }
} }

View File

@ -1,133 +0,0 @@
{
"VendorInfo": {
"_id": {
"$oid": "60ad3b6ec96976e97d227e19"
},
"TypeName": "/Lotus/Types/Game/VendorManifests/Hubs/PerrinSequenceWeaponVendorManifest",
"ItemManifest": [
{
"StoreItem": "/Lotus/StoreItems/Weapons/Corpus/BoardExec/Primary/CrpBEFerrox/CrpBEFerrox",
"ItemPrices": [
{
"ItemCount": 40,
"ItemType": "/Lotus/Types/Items/MiscItems/GranumBucks",
"ProductCategory": "MiscItems"
}
],
"Bin": "BIN_0",
"QuantityMultiplier": 1,
"Expiry": {
"$date": {
"$numberLong": "9999999000000"
}
},
"PurchaseQuantityLimit": 1,
"AllowMultipurchase": false,
"LocTagRandSeed": 4383829823946960400,
"Id": {
"$oid": "66fd60b20ba592c4c95e9488"
}
},
{
"StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Melee/CrpBriefcaseScythe/CrpBriefcaseScythe",
"ItemPrices": [
{
"ItemCount": 40,
"ItemType": "/Lotus/Types/Items/MiscItems/GranumBucks",
"ProductCategory": "MiscItems"
}
],
"Bin": "BIN_0",
"QuantityMultiplier": 1,
"Expiry": {
"$date": {
"$numberLong": "9999999000000"
}
},
"PurchaseQuantityLimit": 1,
"AllowMultipurchase": false,
"LocTagRandSeed": 7952272124248276000,
"Id": {
"$oid": "66fd60b20ba592c4c95e9489"
}
},
{
"StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Melee/CrpBriefcase2HKatana/CrpBriefcase2HKatana",
"ItemPrices": [
{
"ItemCount": 40,
"ItemType": "/Lotus/Types/Items/MiscItems/GranumBucks",
"ProductCategory": "MiscItems"
}
],
"Bin": "BIN_0",
"QuantityMultiplier": 1,
"Expiry": {
"$date": {
"$numberLong": "9999999000000"
}
},
"PurchaseQuantityLimit": 1,
"AllowMultipurchase": false,
"LocTagRandSeed": 465952672558014140,
"Id": {
"$oid": "66fd60b20ba592c4c95e948a"
}
},
{
"StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/CrpBigSlash/CrpBigSlash",
"ItemPrices": [
{
"ItemCount": 40,
"ItemType": "/Lotus/Types/Items/MiscItems/GranumBucks",
"ProductCategory": "MiscItems"
}
],
"Bin": "BIN_0",
"QuantityMultiplier": 1,
"Expiry": {
"$date": {
"$numberLong": "9999999000000"
}
},
"PurchaseQuantityLimit": 1,
"AllowMultipurchase": false,
"LocTagRandSeed": 8342430883077507000,
"Id": {
"$oid": "66fd60b20ba592c4c95e948b"
}
},
{
"StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Melee/ShieldAndSword/CrpHammerShield/CrpHammerShield",
"ItemPrices": [
{
"ItemCount": 40,
"ItemType": "/Lotus/Types/Items/MiscItems/GranumBucks",
"ProductCategory": "MiscItems"
}
],
"Bin": "BIN_0",
"QuantityMultiplier": 1,
"Expiry": {
"$date": {
"$numberLong": "9999999000000"
}
},
"PurchaseQuantityLimit": 1,
"AllowMultipurchase": false,
"LocTagRandSeed": 7441523153174502000,
"Id": {
"$oid": "66fd60b20ba592c4c95e948c"
}
}
],
"PropertyTextHash": "34F8CF1DFF745F0D67433A5EF0A03E70",
"RandomSeedType": "VRST_WEAPON",
"WeaponUpgradeValueAttenuationExponent": 2.25,
"Expiry": {
"$date": {
"$numberLong": "9999999000000"
}
}
}
}