forked from OpenWF/SpaceNinjaServer
		
	feat: darvo deal (#2261)
Closes #2260 Reviewed-on: OpenWF/SpaceNinjaServer#2261 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
							
								
									a9359bd989
								
							
						
					
					
						commit
						ef3d3b92c7
					
				@ -75,7 +75,8 @@
 | 
			
		||||
    "duviriOverride": "",
 | 
			
		||||
    "nightwaveOverride": "",
 | 
			
		||||
    "allTheFissures": "",
 | 
			
		||||
    "circuitGameModes": null
 | 
			
		||||
    "circuitGameModes": null,
 | 
			
		||||
    "darvoStockMultiplier": 1
 | 
			
		||||
  },
 | 
			
		||||
  "dev": {
 | 
			
		||||
    "keepVendorsExpired": false
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,10 @@
 | 
			
		||||
import { DailyDeal } from "@/src/models/worldStateModel";
 | 
			
		||||
import { RequestHandler } from "express";
 | 
			
		||||
 | 
			
		||||
export const getDailyDealStockLevelsController: RequestHandler = (req, res) => {
 | 
			
		||||
export const getDailyDealStockLevelsController: RequestHandler = async (req, res) => {
 | 
			
		||||
    const dailyDeal = (await DailyDeal.findOne({ StoreItem: req.query.productName }, "AmountSold"))!;
 | 
			
		||||
    res.json({
 | 
			
		||||
        StoreItem: req.query.productName,
 | 
			
		||||
        AmountSold: 0
 | 
			
		||||
        AmountSold: dailyDeal.AmountSold
 | 
			
		||||
    });
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -9,15 +9,26 @@ import {
 | 
			
		||||
    updateCurrency
 | 
			
		||||
} from "@/src/services/inventoryService";
 | 
			
		||||
import { getAccountForRequest, getSuffixedName } from "@/src/services/loginService";
 | 
			
		||||
import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
 | 
			
		||||
import { handleDailyDealPurchase, handleStoreItemAcquisition } from "@/src/services/purchaseService";
 | 
			
		||||
import { IOid } from "@/src/types/commonTypes";
 | 
			
		||||
import { IInventoryChanges, IPurchaseParams, PurchaseSource } from "@/src/types/purchaseTypes";
 | 
			
		||||
import { IPurchaseParams, IPurchaseResponse, PurchaseSource } from "@/src/types/purchaseTypes";
 | 
			
		||||
import { RequestHandler } from "express";
 | 
			
		||||
import { ExportBundles, ExportFlavour } from "warframe-public-export-plus";
 | 
			
		||||
 | 
			
		||||
const checkPurchaseParams = (params: IPurchaseParams): boolean => {
 | 
			
		||||
    switch (params.Source) {
 | 
			
		||||
        case PurchaseSource.Market:
 | 
			
		||||
            return params.UsePremium;
 | 
			
		||||
 | 
			
		||||
        case PurchaseSource.DailyDeal:
 | 
			
		||||
            return true;
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const giftingController: RequestHandler = async (req, res) => {
 | 
			
		||||
    const data = getJSONfromString<IGiftingRequest>(String(req.body));
 | 
			
		||||
    if (data.PurchaseParams.Source != PurchaseSource.Market || !data.PurchaseParams.UsePremium) {
 | 
			
		||||
    if (!checkPurchaseParams(data.PurchaseParams)) {
 | 
			
		||||
        throw new Error(`unexpected purchase params in gifting request: ${String(req.body)}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -58,16 +69,19 @@ export const giftingController: RequestHandler = async (req, res) => {
 | 
			
		||||
    }
 | 
			
		||||
    senderInventory.GiftsRemaining -= 1;
 | 
			
		||||
 | 
			
		||||
    const inventoryChanges: IInventoryChanges = updateCurrency(
 | 
			
		||||
        senderInventory,
 | 
			
		||||
        data.PurchaseParams.ExpectedPrice,
 | 
			
		||||
        true
 | 
			
		||||
    );
 | 
			
		||||
    const response: IPurchaseResponse = {
 | 
			
		||||
        InventoryChanges: {}
 | 
			
		||||
    };
 | 
			
		||||
    if (data.PurchaseParams.Source == PurchaseSource.DailyDeal) {
 | 
			
		||||
        await handleDailyDealPurchase(senderInventory, data.PurchaseParams, response);
 | 
			
		||||
    } else {
 | 
			
		||||
        updateCurrency(senderInventory, data.PurchaseParams.ExpectedPrice, true, response.InventoryChanges);
 | 
			
		||||
    }
 | 
			
		||||
    if (data.PurchaseParams.StoreItem in ExportBundles) {
 | 
			
		||||
        const bundle = ExportBundles[data.PurchaseParams.StoreItem];
 | 
			
		||||
        if (bundle.giftingBonus) {
 | 
			
		||||
            combineInventoryChanges(
 | 
			
		||||
                inventoryChanges,
 | 
			
		||||
                response.InventoryChanges,
 | 
			
		||||
                (await handleStoreItemAcquisition(bundle.giftingBonus, senderInventory)).InventoryChanges
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
@ -99,9 +113,7 @@ export const giftingController: RequestHandler = async (req, res) => {
 | 
			
		||||
        }
 | 
			
		||||
    ]);
 | 
			
		||||
 | 
			
		||||
    res.json({
 | 
			
		||||
        InventoryChanges: inventoryChanges
 | 
			
		||||
    });
 | 
			
		||||
    res.json(response);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
interface IGiftingRequest {
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,8 @@ import { IPersonalRoomsClient } from "@/src/types/personalRoomsTypes";
 | 
			
		||||
import { Ship } from "@/src/models/shipModel";
 | 
			
		||||
import { toLegacyOid, toOid, version_compare } from "@/src/helpers/inventoryHelpers";
 | 
			
		||||
import { Inbox } from "@/src/models/inboxModel";
 | 
			
		||||
import { unixTimesInMs } from "@/src/constants/timeConstants";
 | 
			
		||||
import { DailyDeal } from "@/src/models/worldStateModel";
 | 
			
		||||
 | 
			
		||||
export const inventoryController: RequestHandler = async (request, response) => {
 | 
			
		||||
    const account = await getAccountForRequest(request);
 | 
			
		||||
@ -37,6 +39,8 @@ export const inventoryController: RequestHandler = async (request, response) =>
 | 
			
		||||
 | 
			
		||||
    // Handle daily reset
 | 
			
		||||
    if (!inventory.NextRefill || Date.now() >= inventory.NextRefill.getTime()) {
 | 
			
		||||
        const today = Math.trunc(Date.now() / 86400000);
 | 
			
		||||
 | 
			
		||||
        for (const key of allDailyAffiliationKeys) {
 | 
			
		||||
            inventory[key] = 16000 + inventory.PlayerLevel * 500;
 | 
			
		||||
        }
 | 
			
		||||
@ -47,12 +51,12 @@ export const inventoryController: RequestHandler = async (request, response) =>
 | 
			
		||||
        inventory.LibraryAvailableDailyTaskInfo = createLibraryDailyTask();
 | 
			
		||||
 | 
			
		||||
        if (inventory.NextRefill) {
 | 
			
		||||
            const lastLoginDay = Math.trunc(inventory.NextRefill.getTime() / 86400000) - 1;
 | 
			
		||||
            const daysPassed = today - lastLoginDay;
 | 
			
		||||
 | 
			
		||||
            if (config.noArgonCrystalDecay) {
 | 
			
		||||
                inventory.FoundToday = undefined;
 | 
			
		||||
            } else {
 | 
			
		||||
                const lastLoginDay = Math.trunc(inventory.NextRefill.getTime() / 86400000) - 1;
 | 
			
		||||
                const today = Math.trunc(Date.now() / 86400000);
 | 
			
		||||
                const daysPassed = today - lastLoginDay;
 | 
			
		||||
                for (let i = 0; i != daysPassed; ++i) {
 | 
			
		||||
                    const numArgonCrystals =
 | 
			
		||||
                        inventory.MiscItems.find(x => x.ItemType == "/Lotus/Types/Items/MiscItems/ArgonCrystal")
 | 
			
		||||
@ -84,11 +88,29 @@ export const inventoryController: RequestHandler = async (request, response) =>
 | 
			
		||||
                    inventory.FoundToday = undefined;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (inventory.UsedDailyDeals.length != 0) {
 | 
			
		||||
                if (daysPassed == 1) {
 | 
			
		||||
                    const todayAt0Utc = today * 86400000;
 | 
			
		||||
                    const darvoIndex = Math.trunc((todayAt0Utc - 25200000) / (26 * unixTimesInMs.hour));
 | 
			
		||||
                    const darvoStart = darvoIndex * (26 * unixTimesInMs.hour) + 25200000;
 | 
			
		||||
                    const darvoOid =
 | 
			
		||||
                        ((darvoStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "adc51a72f7324d95";
 | 
			
		||||
                    const deal = await DailyDeal.findById(darvoOid);
 | 
			
		||||
                    if (deal) {
 | 
			
		||||
                        inventory.UsedDailyDeals = inventory.UsedDailyDeals.filter(x => x == deal.StoreItem); // keep only the deal that came into this new day with us
 | 
			
		||||
                    } else {
 | 
			
		||||
                        inventory.UsedDailyDeals = [];
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    inventory.UsedDailyDeals = [];
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        cleanupInventory(inventory);
 | 
			
		||||
 | 
			
		||||
        inventory.NextRefill = new Date((Math.trunc(Date.now() / 86400000) + 1) * 86400000);
 | 
			
		||||
        inventory.NextRefill = new Date((today + 1) * 86400000); // tomorrow at 0 UTC
 | 
			
		||||
        //await inventory.save();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,15 +1,19 @@
 | 
			
		||||
import { RequestHandler } from "express";
 | 
			
		||||
import { getWorldState, populateFissures } from "@/src/services/worldStateService";
 | 
			
		||||
import { getWorldState, populateDailyDeal, populateFissures } from "@/src/services/worldStateService";
 | 
			
		||||
import { version_compare } from "@/src/helpers/inventoryHelpers";
 | 
			
		||||
 | 
			
		||||
export const worldStateController: RequestHandler = async (req, res) => {
 | 
			
		||||
    const buildLabel = req.query.buildLabel as string | undefined;
 | 
			
		||||
    const worldState = getWorldState(buildLabel);
 | 
			
		||||
 | 
			
		||||
    const populatePromises = [populateDailyDeal(worldState)];
 | 
			
		||||
 | 
			
		||||
    // Omitting void fissures for versions prior to Dante Unbound to avoid script errors.
 | 
			
		||||
    if (!buildLabel || version_compare(buildLabel, "2024.03.24.20.00") >= 0) {
 | 
			
		||||
        await populateFissures(worldState);
 | 
			
		||||
        populatePromises.push(populateFissures(worldState));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    await Promise.all(populatePromises);
 | 
			
		||||
 | 
			
		||||
    res.json(worldState);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -1625,6 +1625,9 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
 | 
			
		||||
        PendingSpectreLoadouts: { type: [spectreLoadoutsSchema], default: undefined },
 | 
			
		||||
        SpectreLoadouts: { type: [spectreLoadoutsSchema], default: undefined },
 | 
			
		||||
 | 
			
		||||
        //Darvo Deal
 | 
			
		||||
        UsedDailyDeals: [String],
 | 
			
		||||
 | 
			
		||||
        //New Quest Email
 | 
			
		||||
        EmailItems: [typeCountSchema],
 | 
			
		||||
 | 
			
		||||
@ -1741,7 +1744,6 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
 | 
			
		||||
        //ChallengeInstanceStates: [Schema.Types.Mixed],
 | 
			
		||||
        RecentVendorPurchases: { type: [recentVendorPurchaseSchema], default: undefined },
 | 
			
		||||
        //Robotics: [Schema.Types.Mixed],
 | 
			
		||||
        //UsedDailyDeals: [Schema.Types.Mixed],
 | 
			
		||||
        CollectibleSeries: { type: [collectibleEntrySchema], default: undefined },
 | 
			
		||||
        HasResetAccount: { type: Boolean, default: false },
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
import { IFissureDatabase } from "@/src/types/worldStateTypes";
 | 
			
		||||
import { IDailyDealDatabase, IFissureDatabase } from "@/src/types/worldStateTypes";
 | 
			
		||||
import { model, Schema } from "mongoose";
 | 
			
		||||
 | 
			
		||||
const fissureSchema = new Schema<IFissureDatabase>({
 | 
			
		||||
@ -12,3 +12,19 @@ const fissureSchema = new Schema<IFissureDatabase>({
 | 
			
		||||
fissureSchema.index({ Expiry: 1 }, { expireAfterSeconds: 0 }); // With this, MongoDB will automatically delete expired entries.
 | 
			
		||||
 | 
			
		||||
export const Fissure = model<IFissureDatabase>("Fissure", fissureSchema);
 | 
			
		||||
 | 
			
		||||
const dailyDealSchema = new Schema<IDailyDealDatabase>({
 | 
			
		||||
    StoreItem: { type: String, required: true },
 | 
			
		||||
    Activation: { type: Date, required: true },
 | 
			
		||||
    Expiry: { type: Date, required: true },
 | 
			
		||||
    Discount: { type: Number, required: true },
 | 
			
		||||
    OriginalPrice: { type: Number, required: true },
 | 
			
		||||
    SalePrice: { type: Number, required: true },
 | 
			
		||||
    AmountTotal: { type: Number, required: true },
 | 
			
		||||
    AmountSold: { type: Number, required: true }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
dailyDealSchema.index({ StoreItem: 1 }, { unique: true });
 | 
			
		||||
dailyDealSchema.index({ Expiry: 1 }, { expireAfterSeconds: 86400 });
 | 
			
		||||
 | 
			
		||||
export const DailyDeal = model<IDailyDealDatabase>("DailyDeal", dailyDealSchema);
 | 
			
		||||
 | 
			
		||||
@ -83,6 +83,7 @@ export interface IConfig {
 | 
			
		||||
        nightwaveOverride?: string;
 | 
			
		||||
        allTheFissures?: string;
 | 
			
		||||
        circuitGameModes?: string[];
 | 
			
		||||
        darvoStockMultiplier?: number;
 | 
			
		||||
    };
 | 
			
		||||
    dev?: {
 | 
			
		||||
        keepVendorsExpired?: boolean;
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,8 @@ import {
 | 
			
		||||
    IPurchaseResponse,
 | 
			
		||||
    SlotPurchase,
 | 
			
		||||
    IInventoryChanges,
 | 
			
		||||
    PurchaseSource
 | 
			
		||||
    PurchaseSource,
 | 
			
		||||
    IPurchaseParams
 | 
			
		||||
} from "@/src/types/purchaseTypes";
 | 
			
		||||
import { logger } from "@/src/utils/logger";
 | 
			
		||||
import { getWorldState } from "./worldStateService";
 | 
			
		||||
@ -35,6 +36,7 @@ import {
 | 
			
		||||
import { config } from "./configService";
 | 
			
		||||
import { TInventoryDatabaseDocument } from "../models/inventoryModels/inventoryModel";
 | 
			
		||||
import { fromStoreItem, toStoreItem } from "./itemDataService";
 | 
			
		||||
import { DailyDeal } from "../models/worldStateModel";
 | 
			
		||||
 | 
			
		||||
export const getStoreItemCategory = (storeItem: string): string => {
 | 
			
		||||
    const storeItemString = getSubstringFromKeyword(storeItem, "StoreItems/");
 | 
			
		||||
@ -240,6 +242,12 @@ export const handlePurchase = async (
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        case PurchaseSource.DailyDeal:
 | 
			
		||||
            if (purchaseRequest.PurchaseParams.ExpectedPrice) {
 | 
			
		||||
                throw new Error(`daily deal purchase should not have an expected price`);
 | 
			
		||||
            }
 | 
			
		||||
            await handleDailyDealPurchase(inventory, purchaseRequest.PurchaseParams, purchaseResponse);
 | 
			
		||||
            break;
 | 
			
		||||
        case PurchaseSource.Vendor:
 | 
			
		||||
            if (purchaseRequest.PurchaseParams.SourceId! in ExportVendors) {
 | 
			
		||||
                const vendor = ExportVendors[purchaseRequest.PurchaseParams.SourceId!];
 | 
			
		||||
@ -328,6 +336,25 @@ const handleItemPrices = (
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const handleDailyDealPurchase = async (
 | 
			
		||||
    inventory: TInventoryDatabaseDocument,
 | 
			
		||||
    purchaseParams: IPurchaseParams,
 | 
			
		||||
    purchaseResponse: IPurchaseResponse
 | 
			
		||||
): Promise<void> => {
 | 
			
		||||
    const dailyDeal = (await DailyDeal.findOne({ StoreItem: purchaseParams.StoreItem }))!;
 | 
			
		||||
    dailyDeal.AmountSold += 1;
 | 
			
		||||
    await dailyDeal.save();
 | 
			
		||||
 | 
			
		||||
    if (!config.dontSubtractPurchasePlatinumCost) {
 | 
			
		||||
        updateCurrency(inventory, dailyDeal.SalePrice, true, purchaseResponse.InventoryChanges);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!config.noVendorPurchaseLimits) {
 | 
			
		||||
        inventory.UsedDailyDeals.push(purchaseParams.StoreItem);
 | 
			
		||||
        purchaseResponse.DailyDealUsed = purchaseParams.StoreItem;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const handleBundleAcqusition = async (
 | 
			
		||||
    storeItemName: string,
 | 
			
		||||
    inventory: TInventoryDatabaseDocument,
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,7 @@ import fissureMissions from "@/static/fixed_responses/worldState/fissureMissions
 | 
			
		||||
import sortieTilesets from "@/static/fixed_responses/worldState/sortieTilesets.json";
 | 
			
		||||
import sortieTilesetMissions from "@/static/fixed_responses/worldState/sortieTilesetMissions.json";
 | 
			
		||||
import syndicateMissions from "@/static/fixed_responses/worldState/syndicateMissions.json";
 | 
			
		||||
import darvoDeals from "@/static/fixed_responses/worldState/darvoDeals.json";
 | 
			
		||||
import { buildConfig } from "@/src/services/buildConfigService";
 | 
			
		||||
import { unixTimesInMs } from "@/src/constants/timeConstants";
 | 
			
		||||
import { config } from "@/src/services/configService";
 | 
			
		||||
@ -27,7 +28,7 @@ import {
 | 
			
		||||
} from "../types/worldStateTypes";
 | 
			
		||||
import { toMongoDate, toOid, version_compare } from "../helpers/inventoryHelpers";
 | 
			
		||||
import { logger } from "../utils/logger";
 | 
			
		||||
import { Fissure } from "../models/worldStateModel";
 | 
			
		||||
import { DailyDeal, Fissure } from "../models/worldStateModel";
 | 
			
		||||
 | 
			
		||||
const sortieBosses = [
 | 
			
		||||
    "SORTIE_BOSS_HYENA",
 | 
			
		||||
@ -1122,6 +1123,7 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
 | 
			
		||||
        GlobalUpgrades: [],
 | 
			
		||||
        VoidTraders: [],
 | 
			
		||||
        VoidStorms: [],
 | 
			
		||||
        DailyDeals: [],
 | 
			
		||||
        EndlessXpChoices: [],
 | 
			
		||||
        KnownCalendarSeasons: [],
 | 
			
		||||
        ...staticWorldState,
 | 
			
		||||
@ -1561,6 +1563,24 @@ export const populateFissures = async (worldState: IWorldState): Promise<void> =
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const populateDailyDeal = async (worldState: IWorldState): Promise<void> => {
 | 
			
		||||
    const dailyDeals = await DailyDeal.find({});
 | 
			
		||||
    for (const dailyDeal of dailyDeals) {
 | 
			
		||||
        if (dailyDeal.Expiry.getTime() > Date.now()) {
 | 
			
		||||
            worldState.DailyDeals.push({
 | 
			
		||||
                StoreItem: dailyDeal.StoreItem,
 | 
			
		||||
                Activation: toMongoDate(dailyDeal.Activation),
 | 
			
		||||
                Expiry: toMongoDate(dailyDeal.Expiry),
 | 
			
		||||
                Discount: dailyDeal.Discount,
 | 
			
		||||
                OriginalPrice: dailyDeal.OriginalPrice,
 | 
			
		||||
                SalePrice: dailyDeal.SalePrice,
 | 
			
		||||
                AmountTotal: Math.round(dailyDeal.AmountTotal * (config.worldState?.darvoStockMultiplier ?? 1)),
 | 
			
		||||
                AmountSold: dailyDeal.AmountSold
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const idToBountyCycle = (id: string): number => {
 | 
			
		||||
    return Math.trunc((parseInt(id.substring(0, 8), 16) * 1000) / 9000_000);
 | 
			
		||||
};
 | 
			
		||||
@ -1689,7 +1709,7 @@ const nightwaveTagToSeason: Record<string, number> = {
 | 
			
		||||
    RadioLegionSyndicate: 0 // The Wolf of Saturn Six
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const updateWorldStateCollections = async (): Promise<void> => {
 | 
			
		||||
const updateFissures = async (): Promise<void> => {
 | 
			
		||||
    const fissures = await Fissure.find();
 | 
			
		||||
 | 
			
		||||
    const activeNodes = new Set<string>();
 | 
			
		||||
@ -1742,3 +1762,38 @@ export const updateWorldStateCollections = async (): Promise<void> => {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const updateDailyDeal = async (): Promise<void> => {
 | 
			
		||||
    let darvoIndex = Math.trunc((Date.now() - 25200000) / (26 * unixTimesInMs.hour));
 | 
			
		||||
    let darvoEnd;
 | 
			
		||||
    do {
 | 
			
		||||
        const darvoStart = darvoIndex * (26 * unixTimesInMs.hour) + 25200000;
 | 
			
		||||
        darvoEnd = darvoStart + 26 * unixTimesInMs.hour;
 | 
			
		||||
        const darvoOid = ((darvoStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "adc51a72f7324d95";
 | 
			
		||||
        if (!(await DailyDeal.findById(darvoOid))) {
 | 
			
		||||
            const seed = new SRng(darvoIndex).randomInt(0, 100_000);
 | 
			
		||||
            const rng = new SRng(seed);
 | 
			
		||||
            let deal;
 | 
			
		||||
            do {
 | 
			
		||||
                deal = rng.randomReward(darvoDeals)!; // Using an actual sampling collected over roughly a year because I can't extrapolate an algorithm from it with enough certainty.
 | 
			
		||||
                //const [storeItem, meta] = rng.randomElement(Object.entries(darvoDeals))!;
 | 
			
		||||
                //const discount = Math.min(rng.randomInt(1, 9) * 10, (meta as { MaxDiscount?: number }).MaxDiscount ?? 1);
 | 
			
		||||
            } while (await DailyDeal.exists({ StoreItem: deal.StoreItem }));
 | 
			
		||||
            await DailyDeal.insertOne({
 | 
			
		||||
                _id: darvoOid,
 | 
			
		||||
                StoreItem: deal.StoreItem,
 | 
			
		||||
                Activation: new Date(darvoStart),
 | 
			
		||||
                Expiry: new Date(darvoEnd),
 | 
			
		||||
                Discount: deal.Discount,
 | 
			
		||||
                OriginalPrice: deal.OriginalPrice,
 | 
			
		||||
                SalePrice: deal.SalePrice, //Math.trunc(deal.OriginalPrice * (1 - discount))
 | 
			
		||||
                AmountTotal: deal.AmountTotal,
 | 
			
		||||
                AmountSold: 0
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    } while (darvoEnd < Date.now() + 6 * unixTimesInMs.minute && ++darvoIndex);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const updateWorldStateCollections = async (): Promise<void> => {
 | 
			
		||||
    await Promise.all([updateFissures(), updateDailyDeal()]);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -287,6 +287,7 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
 | 
			
		||||
    ArchwingEnabled?: boolean;
 | 
			
		||||
    PendingSpectreLoadouts?: ISpectreLoadout[];
 | 
			
		||||
    SpectreLoadouts?: ISpectreLoadout[];
 | 
			
		||||
    UsedDailyDeals: string[];
 | 
			
		||||
    EmailItems: ITypeCount[];
 | 
			
		||||
    CompletedSyndicates: string[];
 | 
			
		||||
    FocusXP?: IFocusXP;
 | 
			
		||||
@ -351,7 +352,6 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
 | 
			
		||||
    //LeagueTickets: any[];
 | 
			
		||||
    //Quests: any[];
 | 
			
		||||
    //Robotics: any[];
 | 
			
		||||
    //UsedDailyDeals: any[];
 | 
			
		||||
    LibraryPersonalTarget?: string;
 | 
			
		||||
    LibraryPersonalProgress: ILibraryPersonalProgress[];
 | 
			
		||||
    CollectibleSeries?: ICollectibleEntry[];
 | 
			
		||||
 | 
			
		||||
@ -105,6 +105,7 @@ export interface IPurchaseResponse {
 | 
			
		||||
    Standing?: IAffiliationMods[];
 | 
			
		||||
    FreeFavorsUsed?: IAffiliationMods[];
 | 
			
		||||
    BoosterPackItems?: string;
 | 
			
		||||
    DailyDealUsed?: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type IBinChanges = {
 | 
			
		||||
 | 
			
		||||
@ -15,6 +15,7 @@ export interface IWorldState {
 | 
			
		||||
    NodeOverrides: INodeOverride[];
 | 
			
		||||
    VoidTraders: IVoidTrader[];
 | 
			
		||||
    VoidStorms: IVoidStorm[];
 | 
			
		||||
    DailyDeals: IDailyDeal[];
 | 
			
		||||
    PVPChallengeInstances: IPVPChallengeInstance[];
 | 
			
		||||
    EndlessXpChoices: IEndlessXpChoice[];
 | 
			
		||||
    SeasonInfo?: {
 | 
			
		||||
@ -169,6 +170,28 @@ export interface IVoidStorm {
 | 
			
		||||
    ActiveMissionTier: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface IDailyDeal {
 | 
			
		||||
    StoreItem: string;
 | 
			
		||||
    Activation: IMongoDate;
 | 
			
		||||
    Expiry: IMongoDate;
 | 
			
		||||
    Discount: number;
 | 
			
		||||
    OriginalPrice: number;
 | 
			
		||||
    SalePrice: number;
 | 
			
		||||
    AmountTotal: number;
 | 
			
		||||
    AmountSold: number;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface IDailyDealDatabase {
 | 
			
		||||
    StoreItem: string;
 | 
			
		||||
    Activation: Date;
 | 
			
		||||
    Expiry: Date;
 | 
			
		||||
    Discount: number;
 | 
			
		||||
    OriginalPrice: number;
 | 
			
		||||
    SalePrice: number;
 | 
			
		||||
    AmountTotal: number;
 | 
			
		||||
    AmountSold: number;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface IPVPChallengeInstance {
 | 
			
		||||
    _id: IOid;
 | 
			
		||||
    challengeTypeRefID: string;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										158
									
								
								static/fixed_responses/worldState/darvoDeals.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								static/fixed_responses/worldState/darvoDeals.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,158 @@
 | 
			
		||||
[
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Powersuits/Archwing/DemolitionJetPack/DemolitionJetPack", "Discount": 60, "OriginalPrice": 275, "SalePrice": 110, "AmountTotal": 300, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Powersuits/Bard/Bard", "Discount": 30, "OriginalPrice": 225, "SalePrice": 157, "AmountTotal": 100, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Powersuits/Ember/Ember", "Discount": 30, "OriginalPrice": 225, "SalePrice": 157, "AmountTotal": 100, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Powersuits/Ember/Ember", "Discount": 60, "OriginalPrice": 225, "SalePrice": 90, "AmountTotal": 100, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Powersuits/Magician/Magician", "Discount": 20, "OriginalPrice": 200, "SalePrice": 160, "AmountTotal": 200, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Powersuits/Magician/Magician", "Discount": 30, "OriginalPrice": 200, "SalePrice": 140, "AmountTotal": 200, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Powersuits/Magician/Magician", "Discount": 40, "OriginalPrice": 200, "SalePrice": 120, "AmountTotal": 200, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Powersuits/Magician/Magician", "Discount": 50, "OriginalPrice": 200, "SalePrice": 100, "AmountTotal": 200, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Powersuits/Sandman/Sandman", "Discount": 20, "OriginalPrice": 225, "SalePrice": 180, "AmountTotal": 100, "probability": 4 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Powersuits/Sandman/Sandman", "Discount": 30, "OriginalPrice": 225, "SalePrice": 157, "AmountTotal": 100, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Powersuits/Trapper/Trapper", "Discount": 40, "OriginalPrice": 300, "SalePrice": 180, "AmountTotal": 150, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Powersuits/Trapper/Trapper", "Discount": 50, "OriginalPrice": 300, "SalePrice": 150, "AmountTotal": 100, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Game/CatbrowPet/CatbrowGeneticSignature", "Discount": 20, "OriginalPrice": 5, "SalePrice": 4, "AmountTotal": 500, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Game/CatbrowPet/CatbrowGeneticSignature", "Discount": 30, "OriginalPrice": 5, "SalePrice": 3, "AmountTotal": 415, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Game/KubrowPet/Eggs/KubrowEgg", "Discount": 50, "OriginalPrice": 10, "SalePrice": 5, "AmountTotal": 100, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Game/KubrowPet/Eggs/KubrowEgg", "Discount": 60, "OriginalPrice": 10, "SalePrice": 4, "AmountTotal": 100, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/Forma", "Discount": 30, "OriginalPrice": 20, "SalePrice": 14, "AmountTotal": 150, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/Forma", "Discount": 45, "OriginalPrice": 20, "SalePrice": 11, "AmountTotal": 150, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/OrokinReactor", "Discount": 40, "OriginalPrice": 20, "SalePrice": 12, "AmountTotal": 100, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Items/Research/BioComponent", "Discount": 10, "OriginalPrice": 10, "SalePrice": 9, "AmountTotal": 200, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Items/Research/BioComponent", "Discount": 20, "OriginalPrice": 10, "SalePrice": 8, "AmountTotal": 165, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Items/Research/BioComponent", "Discount": 30, "OriginalPrice": 10, "SalePrice": 7, "AmountTotal": 135, "probability": 5 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Items/Research/BioComponent", "Discount": 40, "OriginalPrice": 10, "SalePrice": 6, "AmountTotal": 100, "probability": 5 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Items/Research/ChemComponent", "Discount": 10, "OriginalPrice": 10, "SalePrice": 9, "AmountTotal": 200, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Items/Research/ChemComponent", "Discount": 20, "OriginalPrice": 10, "SalePrice": 8, "AmountTotal": 165, "probability": 5 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Items/Research/ChemComponent", "Discount": 30, "OriginalPrice": 10, "SalePrice": 7, "AmountTotal": 135, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Items/Research/EnergyComponent", "Discount": 10, "OriginalPrice": 10, "SalePrice": 9, "AmountTotal": 200, "probability": 5 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Items/Research/EnergyComponent", "Discount": 20, "OriginalPrice": 10, "SalePrice": 8, "AmountTotal": 165, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Items/Research/EnergyComponent", "Discount": 30, "OriginalPrice": 10, "SalePrice": 7, "AmountTotal": 135, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Types/Items/Research/EnergyComponent", "Discount": 40, "OriginalPrice": 10, "SalePrice": 6, "AmountTotal": 100, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/AttackLensGreater", "Discount": 10, "OriginalPrice": 40, "SalePrice": 36, "AmountTotal": 150, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/AttackLensGreater", "Discount": 20, "OriginalPrice": 40, "SalePrice": 32, "AmountTotal": 125, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/AttackLensGreater", "Discount": 40, "OriginalPrice": 40, "SalePrice": 24, "AmountTotal": 75, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/DefenseLensGreater", "Discount": 10, "OriginalPrice": 40, "SalePrice": 36, "AmountTotal": 150, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/DefenseLensGreater", "Discount": 40, "OriginalPrice": 40, "SalePrice": 24, "AmountTotal": 75, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/DefenseLensGreater", "Discount": 50, "OriginalPrice": 40, "SalePrice": 20, "AmountTotal": 50, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/PowerLensGreater", "Discount": 50, "OriginalPrice": 40, "SalePrice": 20, "AmountTotal": 50, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/TacticLensGreater", "Discount": 10, "OriginalPrice": 40, "SalePrice": 36, "AmountTotal": 150, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/TacticLensGreater", "Discount": 20, "OriginalPrice": 40, "SalePrice": 32, "AmountTotal": 125, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/TacticLensGreater", "Discount": 30, "OriginalPrice": 40, "SalePrice": 28, "AmountTotal": 100, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/TacticLensGreater", "Discount": 40, "OriginalPrice": 40, "SalePrice": 24, "AmountTotal": 75, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/TacticLensGreater", "Discount": 50, "OriginalPrice": 40, "SalePrice": 20, "AmountTotal": 50, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/WardLensGreater", "Discount": 40, "OriginalPrice": 40, "SalePrice": 24, "AmountTotal": 75, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Bow/Longbow/CrpBow", "Discount": 20, "OriginalPrice": 235, "SalePrice": 188, "AmountTotal": 300, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Bow/Longbow/CrpBow", "Discount": 30, "OriginalPrice": 235, "SalePrice": 164, "AmountTotal": 250, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Bow/Longbow/CrpBow", "Discount": 50, "OriginalPrice": 235, "SalePrice": 117, "AmountTotal": 150, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Bow/Longbow/CrpBow", "Discount": 60, "OriginalPrice": 235, "SalePrice": 94, "AmountTotal": 100, "probability": 5 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Melee/KickAndPunch/KickPunchWeapon", "Discount": 20, "OriginalPrice": 125, "SalePrice": 100, "AmountTotal": 100, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Melee/KickAndPunch/KickPunchWeapon", "Discount": 30, "OriginalPrice": 125, "SalePrice": 87, "AmountTotal": 90, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Melee/KickAndPunch/KickPunchWeapon", "Discount": 60, "OriginalPrice": 125, "SalePrice": 50, "AmountTotal": 65, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Pistols/CorpusMinigun/CorpusMinigun", "Discount": 30, "OriginalPrice": 175, "SalePrice": 122, "AmountTotal": 100, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Pistols/CorpusMinigun/CorpusMinigun", "Discount": 40, "OriginalPrice": 175, "SalePrice": 105, "AmountTotal": 90, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Pistols/CorpusMinigun/CorpusMinigun", "Discount": 50, "OriginalPrice": 175, "SalePrice": 87, "AmountTotal": 80, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Pistols/CorpusMinigun/CorpusMinigun", "Discount": 60, "OriginalPrice": 175, "SalePrice": 70, "AmountTotal": 70, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Corpus/Pistols/CorpusMinigun/CorpusMinigun", "Discount": 70, "OriginalPrice": 175, "SalePrice": 52, "AmountTotal": 60, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/GrineerPistol/GrineerLightPistol", "Discount": 10, "OriginalPrice": 75, "SalePrice": 67, "AmountTotal": 100, "probability": 6 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/GrineerPistol/GrineerLightPistol", "Discount": 20, "OriginalPrice": 75, "SalePrice": 60, "AmountTotal": 100, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/GrineerPistol/GrineerLightPistol", "Discount": 30, "OriginalPrice": 75, "SalePrice": 52, "AmountTotal": 100, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/LongGuns/BurstRifle/GrnBurstRifle", "Discount": 30, "OriginalPrice": 225, "SalePrice": 157, "AmountTotal": 500, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/LongGuns/BurstRifle/GrnBurstRifle", "Discount": 40, "OriginalPrice": 225, "SalePrice": 135, "AmountTotal": 500, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/LongGuns/BurstRifle/GrnBurstRifle", "Discount": 60, "OriginalPrice": 225, "SalePrice": 90, "AmountTotal": 500, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/LongGuns/GrnSpark/GrnSparkRifle", "Discount": 20, "OriginalPrice": 150, "SalePrice": 120, "AmountTotal": 300, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/LongGuns/GrnSpark/GrnSparkRifle", "Discount": 30, "OriginalPrice": 150, "SalePrice": 105, "AmountTotal": 250, "probability": 4 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/LongGuns/GrnSpark/GrnSparkRifle", "Discount": 50, "OriginalPrice": 150, "SalePrice": 75, "AmountTotal": 150, "probability": 4 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/Melee/GrineerMachetteAndCleaver/DualCleaverWeapon", "Discount": 30, "OriginalPrice": 225, "SalePrice": 157, "AmountTotal": 200, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/Melee/GrineerMachetteAndCleaver/DualCleaverWeapon", "Discount": 40, "OriginalPrice": 225, "SalePrice": 135, "AmountTotal": 175, "probability": 4 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/Melee/GrineerMachetteAndCleaver/DualCleaverWeapon", "Discount": 50, "OriginalPrice": 225, "SalePrice": 112, "AmountTotal": 150, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/Melee/GrineerMachetteAndCleaver/DualCleaverWeapon", "Discount": 60, "OriginalPrice": 225, "SalePrice": 90, "AmountTotal": 125, "probability": 5 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Grineer/Melee/GrineerMachetteAndCleaver/DualCleaverWeapon", "Discount": 70, "OriginalPrice": 225, "SalePrice": 67, "AmountTotal": 100, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Infested/Melee/Swords/Mire/MireSword", "Discount": 10, "OriginalPrice": 150, "SalePrice": 135, "AmountTotal": 300, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Infested/Melee/Swords/Mire/MireSword", "Discount": 20, "OriginalPrice": 150, "SalePrice": 120, "AmountTotal": 270, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Infested/Melee/Swords/Mire/MireSword", "Discount": 30, "OriginalPrice": 150, "SalePrice": 105, "AmountTotal": 240, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Infested/Melee/Swords/Mire/MireSword", "Discount": 40, "OriginalPrice": 150, "SalePrice": 90, "AmountTotal": 205, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Infested/Melee/Swords/Mire/MireSword", "Discount": 60, "OriginalPrice": 150, "SalePrice": 60, "AmountTotal": 145, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Infested/Melee/Swords/Mire/MireSword", "Discount": 80, "OriginalPrice": 150, "SalePrice": 30, "AmountTotal": 80, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Akimbo/AkimboShotGun", "Discount": 20, "OriginalPrice": 225, "SalePrice": 180, "AmountTotal": 200, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Akimbo/AkimboShotGun", "Discount": 40, "OriginalPrice": 225, "SalePrice": 135, "AmountTotal": 165, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Akimbo/AkimboShotGun", "Discount": 50, "OriginalPrice": 225, "SalePrice": 112, "AmountTotal": 150, "probability": 5 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Dagger/Dagger", "Discount": 30, "OriginalPrice": 75, "SalePrice": 52, "AmountTotal": 350, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Dagger/Dagger", "Discount": 40, "OriginalPrice": 75, "SalePrice": 45, "AmountTotal": 300, "probability": 7 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Dagger/Dagger", "Discount": 50, "OriginalPrice": 75, "SalePrice": 37, "AmountTotal": 250, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Dagger/Dagger", "Discount": 60, "OriginalPrice": 75, "SalePrice": 30, "AmountTotal": 200, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/DualShortSword/DualHeatSwords", "Discount": 30, "OriginalPrice": 175, "SalePrice": 122, "AmountTotal": 200, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/DualShortSword/DualHeatSwords", "Discount": 70, "OriginalPrice": 175, "SalePrice": 52, "AmountTotal": 200, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Fist/Fist", "Discount": 10, "OriginalPrice": 125, "SalePrice": 112, "AmountTotal": 500, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Fist/Fist", "Discount": 20, "OriginalPrice": 125, "SalePrice": 100, "AmountTotal": 250, "probability": 6 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Gauntlet/Gauntlet", "Discount": 20, "OriginalPrice": 125, "SalePrice": 100, "AmountTotal": 100, "probability": 5 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Gauntlet/Gauntlet", "Discount": 30, "OriginalPrice": 125, "SalePrice": 87, "AmountTotal": 125, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Gauntlet/Gauntlet", "Discount": 40, "OriginalPrice": 125, "SalePrice": 75, "AmountTotal": 150, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Glaives/Boomerang/BoomerangWeapon", "Discount": 30, "OriginalPrice": 150, "SalePrice": 105, "AmountTotal": 300, "probability": 4 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Glaives/Boomerang/BoomerangWeapon", "Discount": 40, "OriginalPrice": 150, "SalePrice": 90, "AmountTotal": 250, "probability": 4 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Glaives/Boomerang/BoomerangWeapon", "Discount": 50, "OriginalPrice": 150, "SalePrice": 75, "AmountTotal": 200, "probability": 5 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Hammer/IceHammer/IceHammer", "Discount": 20, "OriginalPrice": 165, "SalePrice": 132, "AmountTotal": 300, "probability": 4 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Hammer/IceHammer/IceHammer", "Discount": 30, "OriginalPrice": 165, "SalePrice": 115, "AmountTotal": 250, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Hammer/IceHammer/IceHammer", "Discount": 40, "OriginalPrice": 165, "SalePrice": 99, "AmountTotal": 200, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Hammer/IceHammer/IceHammer", "Discount": 50, "OriginalPrice": 165, "SalePrice": 82, "AmountTotal": 150, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Hammer/IceHammer/IceHammer", "Discount": 60, "OriginalPrice": 165, "SalePrice": 66, "AmountTotal": 100, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/LongSword/LongSword", "Discount": 50, "OriginalPrice": 150, "SalePrice": 75, "AmountTotal": 300, "probability": 4 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/LongSword/LongSword", "Discount": 60, "OriginalPrice": 150, "SalePrice": 60, "AmountTotal": 265, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/LongSword/LongSword", "Discount": 70, "OriginalPrice": 150, "SalePrice": 45, "AmountTotal": 225, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/LongSword/LongSword", "Discount": 90, "OriginalPrice": 150, "SalePrice": 15, "AmountTotal": 150, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Scythe/EtherScytheWeapon", "Discount": 40, "OriginalPrice": 230, "SalePrice": 138, "AmountTotal": 250, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Scythe/EtherScytheWeapon", "Discount": 60, "OriginalPrice": 230, "SalePrice": 92, "AmountTotal": 150, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/GreatSword/TennoGreatSword", "Discount": 20, "OriginalPrice": 175, "SalePrice": 140, "AmountTotal": 100, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/GreatSword/TennoGreatSword", "Discount": 30, "OriginalPrice": 175, "SalePrice": 122, "AmountTotal": 100, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/GreatSword/TennoGreatSword", "Discount": 40, "OriginalPrice": 175, "SalePrice": 105, "AmountTotal": 100, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/GreatSword/TennoGreatSword", "Discount": 90, "OriginalPrice": 175, "SalePrice": 17, "AmountTotal": 100, "probability": 1 },
 | 
			
		||||
  {
 | 
			
		||||
    "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/SwordsAndBoards/MeleeContestWinnerOne/TennoSwordShield",
 | 
			
		||||
    "Discount": 30,
 | 
			
		||||
    "OriginalPrice": 150,
 | 
			
		||||
    "SalePrice": 105,
 | 
			
		||||
    "AmountTotal": 100,
 | 
			
		||||
    "probability": 1
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/SwordsAndBoards/MeleeContestWinnerOne/TennoSwordShield",
 | 
			
		||||
    "Discount": 70,
 | 
			
		||||
    "OriginalPrice": 150,
 | 
			
		||||
    "SalePrice": 45,
 | 
			
		||||
    "AmountTotal": 100,
 | 
			
		||||
    "probability": 1
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Melee/SwordsAndBoards/MeleeContestWinnerOne/TennoSwordShield",
 | 
			
		||||
    "Discount": 90,
 | 
			
		||||
    "OriginalPrice": 150,
 | 
			
		||||
    "SalePrice": 15,
 | 
			
		||||
    "AmountTotal": 100,
 | 
			
		||||
    "probability": 1
 | 
			
		||||
  },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/CrossBow", "Discount": 30, "OriginalPrice": 175, "SalePrice": 122, "AmountTotal": 300, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/CrossBow", "Discount": 40, "OriginalPrice": 175, "SalePrice": 105, "AmountTotal": 250, "probability": 6 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/CrossBow", "Discount": 50, "OriginalPrice": 175, "SalePrice": 87, "AmountTotal": 200, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/CrossBow", "Discount": 60, "OriginalPrice": 175, "SalePrice": 70, "AmountTotal": 150, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/HandShotGun", "Discount": 20, "OriginalPrice": 190, "SalePrice": 152, "AmountTotal": 300, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/HandShotGun", "Discount": 30, "OriginalPrice": 190, "SalePrice": 133, "AmountTotal": 200, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/HandShotGun", "Discount": 40, "OriginalPrice": 190, "SalePrice": 114, "AmountTotal": 100, "probability": 5 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/RevolverPistol", "Discount": 20, "OriginalPrice": 190, "SalePrice": 152, "AmountTotal": 200, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/RevolverPistol", "Discount": 30, "OriginalPrice": 190, "SalePrice": 133, "AmountTotal": 150, "probability": 4 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/RevolverPistol", "Discount": 40, "OriginalPrice": 190, "SalePrice": 114, "AmountTotal": 100, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistol/RevolverPistol", "Discount": 50, "OriginalPrice": 190, "SalePrice": 95, "AmountTotal": 50, "probability": 4 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistols/TnBardPistol/TnBardPistolGun", "Discount": 20, "OriginalPrice": 190, "SalePrice": 152, "AmountTotal": 300, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistols/TnBardPistol/TnBardPistolGun", "Discount": 30, "OriginalPrice": 190, "SalePrice": 133, "AmountTotal": 250, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistols/TnBardPistol/TnBardPistolGun", "Discount": 40, "OriginalPrice": 190, "SalePrice": 114, "AmountTotal": 200, "probability": 2 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistols/TnBardPistol/TnBardPistolGun", "Discount": 50, "OriginalPrice": 190, "SalePrice": 95, "AmountTotal": 150, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Pistols/TnBardPistol/TnBardPistolGun", "Discount": 60, "OriginalPrice": 190, "SalePrice": 76, "AmountTotal": 100, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Rifle/TennoSniperRifle", "Discount": 10, "OriginalPrice": 250, "SalePrice": 225, "AmountTotal": 100, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Rifle/TennoSniperRifle", "Discount": 30, "OriginalPrice": 250, "SalePrice": 175, "AmountTotal": 100, "probability": 3 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Rifle/TennoSniperRifle", "Discount": 50, "OriginalPrice": 250, "SalePrice": 125, "AmountTotal": 100, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Shotgun/QuadShotgun", "Discount": 50, "OriginalPrice": 225, "SalePrice": 112, "AmountTotal": 100, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/Shotgun/QuadShotgun", "Discount": 70, "OriginalPrice": 225, "SalePrice": 67, "AmountTotal": 100, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/ThrowingWeapons/Kunai", "Discount": 10, "OriginalPrice": 175, "SalePrice": 157, "AmountTotal": 100, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/ThrowingWeapons/Kunai", "Discount": 20, "OriginalPrice": 175, "SalePrice": 140, "AmountTotal": 100, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/ThrowingWeapons/Kunai", "Discount": 30, "OriginalPrice": 175, "SalePrice": 122, "AmountTotal": 100, "probability": 1 },
 | 
			
		||||
  { "StoreItem": "/Lotus/StoreItems/Weapons/Tenno/ThrowingWeapons/Kunai", "Discount": 40, "OriginalPrice": 175, "SalePrice": 105, "AmountTotal": 100, "probability": 2 }
 | 
			
		||||
]
 | 
			
		||||
@ -510,18 +510,6 @@
 | 
			
		||||
  "PrimeAccessAvailability": { "State": "PRIME1" },
 | 
			
		||||
  "PrimeVaultAvailabilities": [false, false, false, false, false],
 | 
			
		||||
  "PrimeTokenAvailability": true,
 | 
			
		||||
  "DailyDeals": [
 | 
			
		||||
    {
 | 
			
		||||
      "StoreItem": "/Lotus/StoreItems/Upgrades/Focus/PowerLensGreater",
 | 
			
		||||
      "Activation": { "$date": { "$numberLong": "1715058000000" } },
 | 
			
		||||
      "Expiry": { "$date": { "$numberLong": "2000000000000" } },
 | 
			
		||||
      "Discount": 50,
 | 
			
		||||
      "OriginalPrice": 40,
 | 
			
		||||
      "SalePrice": 20,
 | 
			
		||||
      "AmountTotal": 50,
 | 
			
		||||
      "AmountSold": 0
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "LibraryInfo": { "LastCompletedTargetType": "/Lotus/Types/Game/Library/Targets/Research7Target" },
 | 
			
		||||
  "PVPChallengeInstances": [
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
@ -899,6 +899,13 @@
 | 
			
		||||
                                        <button class="btn btn-primary" type="submit" data-loc="cheats_save"></button>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </form>
 | 
			
		||||
                                <form class="form-group mt-2" onsubmit="doSaveConfigFloat('worldState.darvoStockMultiplier'); return false;">
 | 
			
		||||
                                    <label class="form-label" for="worldState.circuitGameModes" data-loc="worldState_darvoStockMultiplier"></label>
 | 
			
		||||
                                    <div class="input-group">
 | 
			
		||||
                                        <input id="worldState.darvoStockMultiplier" class="form-control" type="number" step="0.01" placeholder="1" />
 | 
			
		||||
                                        <button class="btn btn-primary" type="submit" data-loc="cheats_save"></button>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                </form>
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
 | 
			
		||||
@ -1892,6 +1892,16 @@ function doSaveConfigInt(id) {
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function doSaveConfigFloat(id) {
 | 
			
		||||
    $.post({
 | 
			
		||||
        url: "/custom/setConfig?" + window.authz + "&wsid=" + wsid,
 | 
			
		||||
        contentType: "application/json",
 | 
			
		||||
        data: JSON.stringify({
 | 
			
		||||
            [id]: parseFloat(document.getElementById(id).value)
 | 
			
		||||
        })
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function doSaveConfigStringArray(id) {
 | 
			
		||||
    $.post({
 | 
			
		||||
        url: "/custom/setConfig?" + window.authz + "&wsid=" + wsid,
 | 
			
		||||
@ -1928,8 +1938,6 @@ single.getRoute("/webui/cheats").on("beforeload", function () {
 | 
			
		||||
                        if (x != null) {
 | 
			
		||||
                            if (x.type == "checkbox") {
 | 
			
		||||
                                x.checked = value;
 | 
			
		||||
                            } else if (x.type == "number") {
 | 
			
		||||
                                x.setAttribute("value", value);
 | 
			
		||||
                            } else if (x.classList.contains("tags-input")) {
 | 
			
		||||
                                x.value = value.join(", ");
 | 
			
		||||
                                x.oninput();
 | 
			
		||||
 | 
			
		||||
@ -231,6 +231,7 @@ dict = {
 | 
			
		||||
    worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
 | 
			
		||||
    worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
 | 
			
		||||
    worldState_theCircuitOverride: `[UNTRANSLATED] The Circuit Override`,
 | 
			
		||||
    worldState_darvoStockMultiplier: `[UNTRANSLATED] Darvo Stock Multiplier`,
 | 
			
		||||
 | 
			
		||||
    import_importNote: `Du kannst hier eine vollständige oder teilweise Inventarantwort (Client-Darstellung) einfügen. Alle Felder, die vom Importer unterstützt werden, <b>werden in deinem Account überschrieben</b>.`,
 | 
			
		||||
    import_submit: `Absenden`,
 | 
			
		||||
 | 
			
		||||
@ -230,6 +230,7 @@ dict = {
 | 
			
		||||
    worldState_allAtOnceNormal: `All At Once, Normal`,
 | 
			
		||||
    worldState_allAtOnceSteelPath: `All At Once, Steel Path`,
 | 
			
		||||
    worldState_theCircuitOverride: `The Circuit Override`,
 | 
			
		||||
    worldState_darvoStockMultiplier: `Darvo Stock Multiplier`,
 | 
			
		||||
 | 
			
		||||
    import_importNote: `You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer <b>will be overwritten</b> in your account.`,
 | 
			
		||||
    import_submit: `Submit`,
 | 
			
		||||
 | 
			
		||||
@ -231,6 +231,7 @@ dict = {
 | 
			
		||||
    worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
 | 
			
		||||
    worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
 | 
			
		||||
    worldState_theCircuitOverride: `[UNTRANSLATED] The Circuit Override`,
 | 
			
		||||
    worldState_darvoStockMultiplier: `[UNTRANSLATED] Darvo Stock Multiplier`,
 | 
			
		||||
 | 
			
		||||
    import_importNote: `Puedes proporcionar una respuesta de inventario completa o parcial (representación del cliente) aquí. Todos los campos compatibles con el importador <b>serán sobrescritos</b> en tu cuenta.`,
 | 
			
		||||
    import_submit: `Enviar`,
 | 
			
		||||
 | 
			
		||||
@ -231,6 +231,7 @@ dict = {
 | 
			
		||||
    worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
 | 
			
		||||
    worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
 | 
			
		||||
    worldState_theCircuitOverride: `[UNTRANSLATED] The Circuit Override`,
 | 
			
		||||
    worldState_darvoStockMultiplier: `[UNTRANSLATED] Darvo Stock Multiplier`,
 | 
			
		||||
 | 
			
		||||
    import_importNote: `Import manuel. Toutes les modifcations supportées par l'inventaire <b>écraseront celles présentes dans la base de données</b>.`,
 | 
			
		||||
    import_submit: `Soumettre`,
 | 
			
		||||
 | 
			
		||||
@ -231,6 +231,7 @@ dict = {
 | 
			
		||||
    worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
 | 
			
		||||
    worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
 | 
			
		||||
    worldState_theCircuitOverride: `[UNTRANSLATED] The Circuit Override`,
 | 
			
		||||
    worldState_darvoStockMultiplier: `[UNTRANSLATED] Darvo Stock Multiplier`,
 | 
			
		||||
 | 
			
		||||
    import_importNote: `Вы можете загрузить полный или частичный ответ инвентаря (клиентское представление) здесь. Все поддерживаемые поля <b>будут перезаписаны</b> в вашем аккаунте.`,
 | 
			
		||||
    import_submit: `Отправить`,
 | 
			
		||||
 | 
			
		||||
@ -231,6 +231,7 @@ dict = {
 | 
			
		||||
    worldState_allAtOnceNormal: `全部开启(普通)`,
 | 
			
		||||
    worldState_allAtOnceSteelPath: `全部开启(钢铁之路)`,
 | 
			
		||||
    worldState_theCircuitOverride: `[UNTRANSLATED] The Circuit Override`,
 | 
			
		||||
    worldState_darvoStockMultiplier: `[UNTRANSLATED] Darvo Stock Multiplier`,
 | 
			
		||||
 | 
			
		||||
    import_importNote: `您可以在此处提供完整或部分库存响应(客户端表示)。支持的所有字段<b>将被覆盖</b>到您的账户中。`,
 | 
			
		||||
    import_submit: `提交`,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user