feat: autogenerate railjack crew member vendor (#2170)
Reviewed-on: #2170 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
b98a88b700
commit
9731004de6
@ -20,7 +20,6 @@ import DeimosPetVendorManifest from "@/static/fixed_responses/getVendorInfo/Deim
|
|||||||
import DuviriAcrithisVendorManifest from "@/static/fixed_responses/getVendorInfo/DuviriAcrithisVendorManifest.json";
|
import DuviriAcrithisVendorManifest from "@/static/fixed_responses/getVendorInfo/DuviriAcrithisVendorManifest.json";
|
||||||
import EntratiLabsEntratiLabsCommisionsManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabsCommisionsManifest.json";
|
import EntratiLabsEntratiLabsCommisionsManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabsCommisionsManifest.json";
|
||||||
import EntratiLabsEntratiLabVendorManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabVendorManifest.json";
|
import EntratiLabsEntratiLabVendorManifest from "@/static/fixed_responses/getVendorInfo/EntratiLabsEntratiLabVendorManifest.json";
|
||||||
import HubsRailjackCrewMemberVendorManifest from "@/static/fixed_responses/getVendorInfo/HubsRailjackCrewMemberVendorManifest.json";
|
|
||||||
import MaskSalesmanManifest from "@/static/fixed_responses/getVendorInfo/MaskSalesmanManifest.json";
|
import MaskSalesmanManifest from "@/static/fixed_responses/getVendorInfo/MaskSalesmanManifest.json";
|
||||||
import Nova1999ConquestShopManifest from "@/static/fixed_responses/getVendorInfo/Nova1999ConquestShopManifest.json";
|
import Nova1999ConquestShopManifest from "@/static/fixed_responses/getVendorInfo/Nova1999ConquestShopManifest.json";
|
||||||
import OstronPetVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronPetVendorManifest.json";
|
import OstronPetVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronPetVendorManifest.json";
|
||||||
@ -42,7 +41,6 @@ const rawVendorManifests: IVendorManifest[] = [
|
|||||||
DuviriAcrithisVendorManifest,
|
DuviriAcrithisVendorManifest,
|
||||||
EntratiLabsEntratiLabsCommisionsManifest,
|
EntratiLabsEntratiLabsCommisionsManifest,
|
||||||
EntratiLabsEntratiLabVendorManifest,
|
EntratiLabsEntratiLabVendorManifest,
|
||||||
HubsRailjackCrewMemberVendorManifest,
|
|
||||||
MaskSalesmanManifest,
|
MaskSalesmanManifest,
|
||||||
Nova1999ConquestShopManifest,
|
Nova1999ConquestShopManifest,
|
||||||
OstronPetVendorManifest,
|
OstronPetVendorManifest,
|
||||||
@ -273,20 +271,39 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
|
|||||||
const offersToAdd: IVendorOffer[] = [];
|
const offersToAdd: IVendorOffer[] = [];
|
||||||
if (!manifest.isOneBinPerCycle) {
|
if (!manifest.isOneBinPerCycle) {
|
||||||
const remainingItemCapacity: Record<string, number> = {};
|
const remainingItemCapacity: Record<string, number> = {};
|
||||||
|
const missingItemsPerBin: Record<number, number> = {};
|
||||||
|
let numOffersThatNeedToMatchABin = 0;
|
||||||
|
if (manifest.numItemsPerBin) {
|
||||||
|
for (let bin = 0; bin != manifest.numItemsPerBin.length; ++bin) {
|
||||||
|
missingItemsPerBin[bin] = manifest.numItemsPerBin[bin];
|
||||||
|
numOffersThatNeedToMatchABin += manifest.numItemsPerBin[bin];
|
||||||
|
}
|
||||||
|
}
|
||||||
for (const item of manifest.items) {
|
for (const item of manifest.items) {
|
||||||
remainingItemCapacity[item.storeItem] = 1 + item.duplicates;
|
remainingItemCapacity[item.storeItem] = 1 + item.duplicates;
|
||||||
}
|
}
|
||||||
for (const offer of info.ItemManifest) {
|
for (const offer of info.ItemManifest) {
|
||||||
remainingItemCapacity[offer.StoreItem] -= 1;
|
remainingItemCapacity[offer.StoreItem] -= 1;
|
||||||
|
const bin = parseInt(offer.Bin.substring(4));
|
||||||
|
if (missingItemsPerBin[bin]) {
|
||||||
|
missingItemsPerBin[bin] -= 1;
|
||||||
|
numOffersThatNeedToMatchABin -= 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (manifest.numItems && manifest.items.length != manifest.numItems.minValue) {
|
if (manifest.numItems && manifest.items.length != manifest.numItems.minValue) {
|
||||||
const numItemsTarget = rng.randomInt(manifest.numItems.minValue, manifest.numItems.maxValue);
|
const numItemsTarget = rng.randomInt(manifest.numItems.minValue, manifest.numItems.maxValue);
|
||||||
while (info.ItemManifest.length + offersToAdd.length < numItemsTarget) {
|
while (info.ItemManifest.length + offersToAdd.length < numItemsTarget) {
|
||||||
// TODO: Consider per-bin item limits
|
|
||||||
// TODO: Consider item probability weightings
|
// TODO: Consider item probability weightings
|
||||||
const item = rng.randomElement(manifest.items)!;
|
const item = rng.randomElement(manifest.items)!;
|
||||||
if (remainingItemCapacity[item.storeItem] != 0) {
|
if (
|
||||||
|
remainingItemCapacity[item.storeItem] != 0 &&
|
||||||
|
(numOffersThatNeedToMatchABin == 0 || missingItemsPerBin[item.bin])
|
||||||
|
) {
|
||||||
remainingItemCapacity[item.storeItem] -= 1;
|
remainingItemCapacity[item.storeItem] -= 1;
|
||||||
|
if (missingItemsPerBin[item.bin]) {
|
||||||
|
missingItemsPerBin[item.bin] -= 1;
|
||||||
|
numOffersThatNeedToMatchABin -= 1;
|
||||||
|
}
|
||||||
offersToAdd.push(item);
|
offersToAdd.push(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -383,6 +400,12 @@ const generateVendorManifest = (vendorInfo: IGeneratableVendorInfo): IVendorMani
|
|||||||
info.ItemManifest.push(item);
|
info.ItemManifest.push(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
info.ItemManifest.sort((a, b) => {
|
||||||
|
const aBin = parseInt(a.Bin.substring(4));
|
||||||
|
const bBin = parseInt(b.Bin.substring(4));
|
||||||
|
return aBin == bBin ? 0 : aBin < bBin ? +1 : -1;
|
||||||
|
});
|
||||||
|
|
||||||
// Update vendor expiry
|
// Update vendor expiry
|
||||||
let soonestOfferExpiry: number = Number.MAX_SAFE_INTEGER;
|
let soonestOfferExpiry: number = Number.MAX_SAFE_INTEGER;
|
||||||
for (const offer of info.ItemManifest) {
|
for (const offer of info.ItemManifest) {
|
||||||
@ -424,4 +447,17 @@ if (isDev) {
|
|||||||
) {
|
) {
|
||||||
logger.warn(`self test failed for /Lotus/Types/Game/VendorManifests/Hubs/IronwakeDondaVendorManifest`);
|
logger.warn(`self test failed for /Lotus/Types/Game/VendorManifests/Hubs/IronwakeDondaVendorManifest`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const cms = getVendorManifestByTypeName("/Lotus/Types/Game/VendorManifests/Hubs/RailjackCrewMemberVendorManifest")!
|
||||||
|
.VendorInfo.ItemManifest;
|
||||||
|
if (
|
||||||
|
cms.length != 9 ||
|
||||||
|
cms[0].Bin != "BIN_2" ||
|
||||||
|
cms[8].Bin != "BIN_0" ||
|
||||||
|
cms.reduce((a, x) => a + (x.Bin == "BIN_2" ? 1 : 0), 0) < 2 ||
|
||||||
|
cms.reduce((a, x) => a + (x.Bin == "BIN_1" ? 1 : 0), 0) < 2 ||
|
||||||
|
cms.reduce((a, x) => a + (x.Bin == "BIN_0" ? 1 : 0), 0) < 4
|
||||||
|
) {
|
||||||
|
logger.warn(`self test failed for /Lotus/Types/Game/VendorManifests/Hubs/RailjackCrewMemberVendorManifest`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,244 +0,0 @@
|
|||||||
{
|
|
||||||
"VendorInfo": {
|
|
||||||
"_id": {
|
|
||||||
"$oid": "5fb70313c96976e97d6be787"
|
|
||||||
},
|
|
||||||
"TypeName": "/Lotus/Types/Game/VendorManifests/Hubs/RailjackCrewMemberVendorManifest",
|
|
||||||
"ItemManifest": [
|
|
||||||
{
|
|
||||||
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/SteelMeridianCrewMemberGeneratorStrong",
|
|
||||||
"ItemPrices": [
|
|
||||||
{
|
|
||||||
"ItemType": "/Lotus/Types/Items/RailjackMiscItems/IsosRailjackItem",
|
|
||||||
"ItemCount": 2220,
|
|
||||||
"ProductCategory": "MiscItems"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"RegularPrice": [2180000, 2180000],
|
|
||||||
"Bin": "BIN_2",
|
|
||||||
"QuantityMultiplier": 1,
|
|
||||||
"Expiry": {
|
|
||||||
"$date": {
|
|
||||||
"$numberLong": "9999999000000"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"PurchaseQuantityLimit": 1,
|
|
||||||
"Affiliation": "SteelMeridianSyndicate",
|
|
||||||
"MinAffiliationRank": 0,
|
|
||||||
"ReductionPerPositiveRank": 0.1,
|
|
||||||
"IncreasePerNegativeRank": 0.5,
|
|
||||||
"AllowMultipurchase": false,
|
|
||||||
"LocTagRandSeed": 4185144421,
|
|
||||||
"Id": {
|
|
||||||
"$oid": "670daf92d21f34757a5e73da"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/NewLokaCrewMemberGeneratorStrong",
|
|
||||||
"ItemPrices": [
|
|
||||||
{
|
|
||||||
"ItemType": "/Lotus/Types/Items/RailjackMiscItems/IsosRailjackItem",
|
|
||||||
"ItemCount": 2130,
|
|
||||||
"ProductCategory": "MiscItems"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"RegularPrice": [1890000, 1890000],
|
|
||||||
"Bin": "BIN_2",
|
|
||||||
"QuantityMultiplier": 1,
|
|
||||||
"Expiry": {
|
|
||||||
"$date": {
|
|
||||||
"$numberLong": "9999999000000"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"PurchaseQuantityLimit": 1,
|
|
||||||
"Affiliation": "NewLokaSyndicate",
|
|
||||||
"MinAffiliationRank": 0,
|
|
||||||
"ReductionPerPositiveRank": 0.1,
|
|
||||||
"IncreasePerNegativeRank": 0.5,
|
|
||||||
"AllowMultipurchase": false,
|
|
||||||
"LocTagRandSeed": 496053258,
|
|
||||||
"Id": {
|
|
||||||
"$oid": "670daf92d21f34757a5e73db"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/SteelMeridianCrewMemberGeneratorMediumVersionTwo",
|
|
||||||
"ItemPrices": [
|
|
||||||
{
|
|
||||||
"ItemType": "/Lotus/Types/Items/RailjackMiscItems/IsosRailjackItem",
|
|
||||||
"ItemCount": 440,
|
|
||||||
"ProductCategory": "MiscItems"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"Bin": "BIN_1",
|
|
||||||
"QuantityMultiplier": 1,
|
|
||||||
"Expiry": {
|
|
||||||
"$date": {
|
|
||||||
"$numberLong": "9999999000000"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"PurchaseQuantityLimit": 1,
|
|
||||||
"Affiliation": "SteelMeridianSyndicate",
|
|
||||||
"MinAffiliationRank": 0,
|
|
||||||
"ReductionPerPositiveRank": 0.1,
|
|
||||||
"IncreasePerNegativeRank": 0.5,
|
|
||||||
"AllowMultipurchase": false,
|
|
||||||
"LocTagRandSeed": 2078883475,
|
|
||||||
"Id": {
|
|
||||||
"$oid": "670daf92d21f34757a5e73dc"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/NewLokaCrewMemberGeneratorMediumVersionTwo",
|
|
||||||
"ItemPrices": [
|
|
||||||
{
|
|
||||||
"ItemType": "/Lotus/Types/Items/RailjackMiscItems/AsteriteRailjackItem",
|
|
||||||
"ItemCount": 730,
|
|
||||||
"ProductCategory": "MiscItems"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"Bin": "BIN_1",
|
|
||||||
"QuantityMultiplier": 1,
|
|
||||||
"Expiry": {
|
|
||||||
"$date": {
|
|
||||||
"$numberLong": "9999999000000"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"PurchaseQuantityLimit": 1,
|
|
||||||
"Affiliation": "NewLokaSyndicate",
|
|
||||||
"MinAffiliationRank": 0,
|
|
||||||
"ReductionPerPositiveRank": 0.1,
|
|
||||||
"IncreasePerNegativeRank": 0.5,
|
|
||||||
"AllowMultipurchase": false,
|
|
||||||
"LocTagRandSeed": 3890380934,
|
|
||||||
"Id": {
|
|
||||||
"$oid": "670daf92d21f34757a5e73dd"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/CephalonSudaCrewMemberGeneratorMediumVersionTwo",
|
|
||||||
"ItemPrices": [
|
|
||||||
{
|
|
||||||
"ItemType": "/Lotus/Types/Items/RailjackMiscItems/AsteriteRailjackItem",
|
|
||||||
"ItemCount": 720,
|
|
||||||
"ProductCategory": "MiscItems"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"Bin": "BIN_1",
|
|
||||||
"QuantityMultiplier": 1,
|
|
||||||
"Expiry": {
|
|
||||||
"$date": {
|
|
||||||
"$numberLong": "9999999000000"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"PurchaseQuantityLimit": 1,
|
|
||||||
"Affiliation": "CephalonSudaSyndicate",
|
|
||||||
"MinAffiliationRank": 0,
|
|
||||||
"ReductionPerPositiveRank": 0.1,
|
|
||||||
"IncreasePerNegativeRank": 0.5,
|
|
||||||
"AllowMultipurchase": false,
|
|
||||||
"LocTagRandSeed": 3425148044,
|
|
||||||
"Id": {
|
|
||||||
"$oid": "670daf92d21f34757a5e73de"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/ArbitersCrewMemberGeneratorMediumVersionTwo",
|
|
||||||
"ItemPrices": [
|
|
||||||
{
|
|
||||||
"ItemType": "/Lotus/Types/Items/RailjackMiscItems/CubicsRailjackItem",
|
|
||||||
"ItemCount": 6500,
|
|
||||||
"ProductCategory": "MiscItems"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"Bin": "BIN_1",
|
|
||||||
"QuantityMultiplier": 1,
|
|
||||||
"Expiry": {
|
|
||||||
"$date": {
|
|
||||||
"$numberLong": "9999999000000"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"PurchaseQuantityLimit": 1,
|
|
||||||
"Affiliation": "ArbitersSyndicate",
|
|
||||||
"MinAffiliationRank": 0,
|
|
||||||
"ReductionPerPositiveRank": 0.1,
|
|
||||||
"IncreasePerNegativeRank": 0.5,
|
|
||||||
"AllowMultipurchase": false,
|
|
||||||
"LocTagRandSeed": 2472754512,
|
|
||||||
"Id": {
|
|
||||||
"$oid": "670daf92d21f34757a5e73df"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/PerrinCrewMemberGeneratorVersionTwo",
|
|
||||||
"RegularPrice": [105000, 105000],
|
|
||||||
"Bin": "BIN_0",
|
|
||||||
"QuantityMultiplier": 1,
|
|
||||||
"Expiry": {
|
|
||||||
"$date": {
|
|
||||||
"$numberLong": "9999999000000"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"PurchaseQuantityLimit": 1,
|
|
||||||
"Affiliation": "PerrinSyndicate",
|
|
||||||
"MinAffiliationRank": 0,
|
|
||||||
"ReductionPerPositiveRank": 0.1,
|
|
||||||
"IncreasePerNegativeRank": 0.5,
|
|
||||||
"AllowMultipurchase": false,
|
|
||||||
"LocTagRandSeed": 966238763,
|
|
||||||
"Id": {
|
|
||||||
"$oid": "670daf92d21f34757a5e73e0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/NewLokaCrewMemberGeneratorVersionTwo",
|
|
||||||
"RegularPrice": [120000, 120000],
|
|
||||||
"Bin": "BIN_0",
|
|
||||||
"QuantityMultiplier": 1,
|
|
||||||
"Expiry": {
|
|
||||||
"$date": {
|
|
||||||
"$numberLong": "9999999000000"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"PurchaseQuantityLimit": 1,
|
|
||||||
"Affiliation": "NewLokaSyndicate",
|
|
||||||
"MinAffiliationRank": 0,
|
|
||||||
"ReductionPerPositiveRank": 0.1,
|
|
||||||
"IncreasePerNegativeRank": 0.5,
|
|
||||||
"AllowMultipurchase": false,
|
|
||||||
"LocTagRandSeed": 356717213,
|
|
||||||
"Id": {
|
|
||||||
"$oid": "670daf92d21f34757a5e73e1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"StoreItem": "/Lotus/StoreItems/Types/Game/CrewShip/CrewMember/ArbitersCrewMemberGeneratorVersionTwo",
|
|
||||||
"RegularPrice": [120000, 120000],
|
|
||||||
"Bin": "BIN_0",
|
|
||||||
"QuantityMultiplier": 1,
|
|
||||||
"Expiry": {
|
|
||||||
"$date": {
|
|
||||||
"$numberLong": "9999999000000"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"PurchaseQuantityLimit": 1,
|
|
||||||
"Affiliation": "ArbitersSyndicate",
|
|
||||||
"MinAffiliationRank": 0,
|
|
||||||
"ReductionPerPositiveRank": 0.1,
|
|
||||||
"IncreasePerNegativeRank": 0.5,
|
|
||||||
"AllowMultipurchase": false,
|
|
||||||
"LocTagRandSeed": 1969797050,
|
|
||||||
"Id": {
|
|
||||||
"$oid": "670daf92d21f34757a5e73e2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"PropertyTextHash": "BE543CCC0A4F50A1D80CD2B523796EAE",
|
|
||||||
"RandomSeedType": "VRST_FLAVOUR_TEXT",
|
|
||||||
"Expiry": {
|
|
||||||
"$date": {
|
|
||||||
"$numberLong": "9999999000000"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user