Compare commits
10 Commits
d27934ab55
...
9ff1202a8f
Author | SHA1 | Date | |
---|---|---|---|
9ff1202a8f | |||
bb9e0211cc | |||
a14337be03 | |||
b0226d21cb | |||
4f1f9592b0 | |||
764cdd1ab8 | |||
0ba641a2ac | |||
eb7b51852b | |||
a3be376489 | |||
d94cd38120 |
@ -34,4 +34,5 @@ SpaceNinjaServer requires a `config.json`. To set it up, you can copy the [confi
|
||||
- `RadioLegion2Syndicate` for The Emissary
|
||||
- `RadioLegionIntermissionSyndicate` for Intermission I
|
||||
- `RadioLegionSyndicate` for The Wolf of Saturn Six
|
||||
- `allTheFissures` can be set to `normal` or `hard` to enable all fissures either in normal or steel path, respectively.
|
||||
- `worldState.circuitGameModes` can be provided with an array of valid game modes (`Survival`, `VoidFlood`, `Excavation`, `Defense`, `Exterminate`, `Assassination`, `Alchemy`)
|
||||
|
@ -39,6 +39,7 @@
|
||||
"noArgonCrystalDecay": false,
|
||||
"noMasteryRankUpCooldown": false,
|
||||
"noVendorPurchaseLimits": false,
|
||||
"noDarvoDealPurchaseLimit": false,
|
||||
"noDeathMarks": false,
|
||||
"noKimCooldowns": false,
|
||||
"fullyStockedVendors": false,
|
||||
@ -74,7 +75,9 @@
|
||||
"vallisOverride": "",
|
||||
"duviriOverride": "",
|
||||
"nightwaveOverride": "",
|
||||
"circuitGameModes": null
|
||||
"allTheFissures": "",
|
||||
"circuitGameModes": null,
|
||||
"darvoStockMultiplier": 1
|
||||
},
|
||||
"dev": {
|
||||
"keepVendorsExpired": false
|
||||
|
12
package-lock.json
generated
12
package-lock.json
generated
@ -14,6 +14,7 @@
|
||||
"@types/websocket": "^1.0.10",
|
||||
"@types/ws": "^8.18.1",
|
||||
"@typescript/native-preview": "^7.0.0-dev.20250625.1",
|
||||
"chokidar": "^4.0.3",
|
||||
"crc-32": "^1.2.2",
|
||||
"express": "^5",
|
||||
"json-with-bigint": "^3.4.4",
|
||||
@ -22,7 +23,7 @@
|
||||
"ncp": "^2.0.0",
|
||||
"typescript": "^5.5",
|
||||
"undici": "^7.10.0",
|
||||
"warframe-public-export-plus": "^0.5.71",
|
||||
"warframe-public-export-plus": "^0.5.72",
|
||||
"warframe-riven-info": "^0.1.2",
|
||||
"winston": "^3.17.0",
|
||||
"winston-daily-rotate-file": "^5.0.0",
|
||||
@ -31,7 +32,6 @@
|
||||
"devDependencies": {
|
||||
"@typescript-eslint/eslint-plugin": "^8.28.0",
|
||||
"@typescript-eslint/parser": "^8.28.0",
|
||||
"chokidar": "^4.0.3",
|
||||
"eslint": "^8",
|
||||
"eslint-plugin-prettier": "^5.2.5",
|
||||
"prettier": "^3.5.3",
|
||||
@ -997,7 +997,6 @@
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
|
||||
"integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"readdirp": "^4.0.1"
|
||||
@ -2803,7 +2802,6 @@
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
|
||||
"integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 14.18.0"
|
||||
@ -3388,9 +3386,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/warframe-public-export-plus": {
|
||||
"version": "0.5.71",
|
||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.71.tgz",
|
||||
"integrity": "sha512-TCS2wPRsBzuURJlIMDhygAHaLsKVZ7dGuC73WZ/iMyn3gKVwA98nnaIj24D+UceWS08fwq4ilWAfUzHJd6X29A=="
|
||||
"version": "0.5.72",
|
||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.72.tgz",
|
||||
"integrity": "sha512-oOZgtU6L0MGcPRKfA6+bonu+Db1kie1lVdLmA7/DbheTPweNkBEx3Hx3Seib+hEaFW+nLj3T5GtmGxGcFHCHfg=="
|
||||
},
|
||||
"node_modules/warframe-riven-info": {
|
||||
"version": "0.1.2",
|
||||
|
@ -28,6 +28,7 @@
|
||||
"@types/websocket": "^1.0.10",
|
||||
"@types/ws": "^8.18.1",
|
||||
"@typescript/native-preview": "^7.0.0-dev.20250625.1",
|
||||
"chokidar": "^4.0.3",
|
||||
"crc-32": "^1.2.2",
|
||||
"express": "^5",
|
||||
"json-with-bigint": "^3.4.4",
|
||||
@ -36,7 +37,7 @@
|
||||
"ncp": "^2.0.0",
|
||||
"typescript": "^5.5",
|
||||
"undici": "^7.10.0",
|
||||
"warframe-public-export-plus": "^0.5.71",
|
||||
"warframe-public-export-plus": "^0.5.72",
|
||||
"warframe-riven-info": "^0.1.2",
|
||||
"winston": "^3.17.0",
|
||||
"winston-daily-rotate-file": "^5.0.0",
|
||||
@ -45,7 +46,6 @@
|
||||
"devDependencies": {
|
||||
"@typescript-eslint/eslint-plugin": "^8.28.0",
|
||||
"@typescript-eslint/parser": "^8.28.0",
|
||||
"chokidar": "^4.0.3",
|
||||
"eslint": "^8",
|
||||
"eslint-plugin-prettier": "^5.2.5",
|
||||
"prettier": "^3.5.3",
|
||||
|
@ -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 {
|
||||
|
@ -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: 0 });
|
||||
|
||||
export const DailyDeal = model<IDailyDealDatabase>("DailyDeal", dailyDealSchema);
|
||||
|
@ -46,6 +46,7 @@ export interface IConfig {
|
||||
noArgonCrystalDecay?: boolean;
|
||||
noMasteryRankUpCooldown?: boolean;
|
||||
noVendorPurchaseLimits?: boolean;
|
||||
noDarvoDealPurchaseLimit?: boolean;
|
||||
noDeathMarks?: boolean;
|
||||
noKimCooldowns?: boolean;
|
||||
fullyStockedVendors?: boolean;
|
||||
@ -81,7 +82,9 @@ export interface IConfig {
|
||||
vallisOverride?: string;
|
||||
duviriOverride?: string;
|
||||
nightwaveOverride?: string;
|
||||
allTheFissures?: string;
|
||||
circuitGameModes?: string[];
|
||||
darvoStockMultiplier?: number;
|
||||
};
|
||||
dev?: {
|
||||
keepVendorsExpired?: boolean;
|
||||
|
@ -1,4 +1,4 @@
|
||||
import fs from "fs";
|
||||
import chokidar from "chokidar";
|
||||
import fsPromises from "fs/promises";
|
||||
import { logger } from "../utils/logger";
|
||||
import { config, configPath, loadConfig } from "./configService";
|
||||
@ -6,12 +6,7 @@ import { getWebPorts, sendWsBroadcast, startWebServer, stopWebServer } from "./w
|
||||
import { Inbox } from "../models/inboxModel";
|
||||
|
||||
let amnesia = false;
|
||||
fs.watchFile(configPath, (now, then) => {
|
||||
// https://github.com/oven-sh/bun/issues/20542
|
||||
if (process.versions.bun && now.mtimeMs == then.mtimeMs) {
|
||||
return;
|
||||
}
|
||||
|
||||
chokidar.watch(configPath).on("change", () => {
|
||||
if (amnesia) {
|
||||
amnesia = false;
|
||||
} else {
|
||||
|
@ -499,6 +499,7 @@ export const addItem = async (
|
||||
// - Blueprints for Ancient Protector Specter, Shield Osprey Specter, etc. have num=1 despite giving their purchaseQuantity.
|
||||
if (!exactQuantity) {
|
||||
quantity *= ExportGear[typeName].purchaseQuantity ?? 1;
|
||||
logger.debug(`non-exact acquisition of ${typeName}; factored quantity is ${quantity}`);
|
||||
}
|
||||
const consumablesChanges = [
|
||||
{
|
||||
|
@ -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.noDarvoDealPurchaseLimit) {
|
||||
inventory.UsedDailyDeals.push(purchaseParams.StoreItem);
|
||||
purchaseResponse.DailyDealUsed = purchaseParams.StoreItem;
|
||||
}
|
||||
};
|
||||
|
||||
export const handleBundleAcqusition = async (
|
||||
storeItemName: string,
|
||||
inventory: TInventoryDatabaseDocument,
|
||||
@ -371,18 +398,28 @@ export const handleStoreItemAcquisition = async (
|
||||
} else {
|
||||
const storeCategory = getStoreItemCategory(storeItemName);
|
||||
const internalName = fromStoreItem(storeItemName);
|
||||
logger.debug(`store category ${storeCategory}`);
|
||||
if (!ignorePurchaseQuantity) {
|
||||
if (internalName in ExportGear) {
|
||||
quantity *= ExportGear[internalName].purchaseQuantity || 1;
|
||||
logger.debug(`factored quantity is ${quantity}`);
|
||||
} else if (internalName in ExportResources) {
|
||||
quantity *= ExportResources[internalName].purchaseQuantity || 1;
|
||||
logger.debug(`factored quantity is ${quantity}`);
|
||||
}
|
||||
}
|
||||
logger.debug(`store category ${storeCategory}`);
|
||||
switch (storeCategory) {
|
||||
default: {
|
||||
purchaseResponse = {
|
||||
InventoryChanges: await addItem(inventory, internalName, quantity, premiumPurchase, seed)
|
||||
InventoryChanges: await addItem(
|
||||
inventory,
|
||||
internalName,
|
||||
quantity,
|
||||
premiumPurchase,
|
||||
seed,
|
||||
undefined,
|
||||
true
|
||||
)
|
||||
};
|
||||
break;
|
||||
}
|
||||
@ -524,7 +561,9 @@ const handleTypesPurchase = async (
|
||||
logger.debug(`type category ${typeCategory}`);
|
||||
switch (typeCategory) {
|
||||
default:
|
||||
return { InventoryChanges: await addItem(inventory, typesName, quantity, premiumPurchase, seed) };
|
||||
return {
|
||||
InventoryChanges: await addItem(inventory, typesName, quantity, premiumPurchase, seed, undefined, true)
|
||||
};
|
||||
case "BoosterPacks":
|
||||
return handleBoosterPackPurchase(typesName, inventory, quantity);
|
||||
case "SlotItems":
|
||||
|
@ -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,
|
||||
@ -1524,6 +1526,25 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
|
||||
};
|
||||
|
||||
export const populateFissures = async (worldState: IWorldState): Promise<void> => {
|
||||
if (config.worldState?.allTheFissures) {
|
||||
let i = 0;
|
||||
for (const [tier, nodes] of Object.entries(fissureMissions)) {
|
||||
for (const node of nodes) {
|
||||
const meta = ExportRegions[node];
|
||||
worldState.ActiveMissions.push({
|
||||
_id: { $oid: (i++).toString().padStart(8, "0") + "8e0c70ba050f1eb7" },
|
||||
Region: meta.systemIndex + 1,
|
||||
Seed: 1337,
|
||||
Activation: { $date: { $numberLong: "1000000000000" } },
|
||||
Expiry: { $date: { $numberLong: "2000000000000" } },
|
||||
Node: node,
|
||||
MissionType: eMissionType[meta.missionIndex].tag,
|
||||
Modifier: tier,
|
||||
Hard: config.worldState.allTheFissures == "hard"
|
||||
});
|
||||
}
|
||||
}
|
||||
} else {
|
||||
const fissures = await Fissure.find({});
|
||||
for (const fissure of fissures) {
|
||||
const meta = ExportRegions[fissure.Node];
|
||||
@ -1539,6 +1560,23 @@ export const populateFissures = async (worldState: IWorldState): Promise<void> =
|
||||
Hard: fissure.Hard
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export const populateDailyDeal = async (worldState: IWorldState): Promise<void> => {
|
||||
const dailyDeals = await DailyDeal.find({});
|
||||
for (const dailyDeal of dailyDeals) {
|
||||
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 => {
|
||||
@ -1669,7 +1707,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>();
|
||||
@ -1722,3 +1760,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;
|
||||
|
@ -45,5 +45,6 @@
|
||||
"/Lotus/Weapons/Tenno/Zariman/Melee/Tonfas/ZarimanTonfaWeapon",
|
||||
"/Lotus/Weapons/Tenno/Zariman/Pistols/HeavyPistol/ZarimanHeavyPistol",
|
||||
"/Lotus/Weapons/Thanotech/EntFistIncarnon/EntFistIncarnon",
|
||||
"/Lotus/Weapons/Thanotech/EntratiWristGun/EntratiWristGunWeapon"
|
||||
"/Lotus/Weapons/Thanotech/EntratiWristGun/EntratiWristGunWeapon",
|
||||
"/Lotus/Weapons/Tenno/Zariman/Melee/HeavyScythe/ZarimanHeavyScythe/ZarimanHeavyScytheWeapon"
|
||||
]
|
||||
|
137
static/fixed_responses/worldState/darvoDeals.json
Normal file
137
static/fixed_responses/worldState/darvoDeals.json
Normal file
@ -0,0 +1,137 @@
|
||||
[
|
||||
{ "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": [
|
||||
{
|
||||
|
@ -692,6 +692,10 @@
|
||||
<input class="form-check-input" type="checkbox" id="noVendorPurchaseLimits" />
|
||||
<label class="form-check-label" for="noVendorPurchaseLimits" data-loc="cheats_noVendorPurchaseLimits"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="noDarvoDealPurchaseLimit" />
|
||||
<label class="form-check-label" for="noDarvoDealPurchaseLimit" data-loc="cheats_noDarvoDealPurchaseLimit"></label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" id="noDeathMarks" />
|
||||
<label class="form-check-label" for="noDeathMarks" data-loc="cheats_noDeathMarks"></label>
|
||||
|
@ -248,7 +248,8 @@ const permanentEvolutionWeapons = new Set([
|
||||
"/Lotus/Weapons/Tenno/Zariman/Melee/Tonfas/ZarimanTonfaWeapon",
|
||||
"/Lotus/Weapons/Tenno/Zariman/Pistols/HeavyPistol/ZarimanHeavyPistol",
|
||||
"/Lotus/Weapons/Thanotech/EntFistIncarnon/EntFistIncarnon",
|
||||
"/Lotus/Weapons/Thanotech/EntratiWristGun/EntratiWristGunWeapon"
|
||||
"/Lotus/Weapons/Thanotech/EntratiWristGun/EntratiWristGunWeapon",
|
||||
"/Lotus/Weapons/Tenno/Zariman/Melee/HeavyScythe/ZarimanHeavyScythe/ZarimanHeavyScytheWeapon"
|
||||
]);
|
||||
|
||||
let uniqueLevelCaps = {};
|
||||
|
@ -156,6 +156,7 @@ dict = {
|
||||
cheats_noArgonCrystalDecay: `Argon-Kristalle verschwinden niemals`,
|
||||
cheats_noMasteryRankUpCooldown: `Keine Wartezeit beim Meisterschaftsrangaufstieg`,
|
||||
cheats_noVendorPurchaseLimits: `Keine Kaufbeschränkungen bei Händlern`,
|
||||
cheats_noDarvoDealPurchaseLimit: `[UNTRANSLATED] No Darvo Deal Purchase Limit`,
|
||||
cheats_noDeathMarks: `Keine Todesmarkierungen`,
|
||||
cheats_noKimCooldowns: `Keine Wartezeit bei KIM`,
|
||||
cheats_fullyStockedVendors: `[UNTRANSLATED] Fully Stocked Vendors`,
|
||||
|
@ -155,6 +155,7 @@ dict = {
|
||||
cheats_noArgonCrystalDecay: `No Argon Crystal Decay`,
|
||||
cheats_noMasteryRankUpCooldown: `No Mastery Rank Up Cooldown`,
|
||||
cheats_noVendorPurchaseLimits: `No Vendor Purchase Limits`,
|
||||
cheats_noDarvoDealPurchaseLimit: `No Darvo Deal Purchase Limit`,
|
||||
cheats_noDeathMarks: `No Death Marks`,
|
||||
cheats_noKimCooldowns: `No KIM Cooldowns`,
|
||||
cheats_fullyStockedVendors: `Fully Stocked Vendors`,
|
||||
|
@ -156,6 +156,7 @@ dict = {
|
||||
cheats_noArgonCrystalDecay: `Sin descomposición de cristal de Argón`,
|
||||
cheats_noMasteryRankUpCooldown: `Sin tiempo de espera para rango de maestría`,
|
||||
cheats_noVendorPurchaseLimits: `Sin límite de compras de vendedores`,
|
||||
cheats_noDarvoDealPurchaseLimit: `[UNTRANSLATED] No Darvo Deal Purchase Limit`,
|
||||
cheats_noDeathMarks: `Sin marcas de muerte`,
|
||||
cheats_noKimCooldowns: `Sin tiempo de espera para conversaciones KIM`,
|
||||
cheats_fullyStockedVendors: `Vendedores con stock completo`,
|
||||
|
@ -156,6 +156,7 @@ dict = {
|
||||
cheats_noArgonCrystalDecay: `Aucune désintégration des Cristaux d'Argon`,
|
||||
cheats_noMasteryRankUpCooldown: `Aucune attente pour la montée de rang de maîtrise`,
|
||||
cheats_noVendorPurchaseLimits: `Aucune limite d'achat chez les PNJ`,
|
||||
cheats_noDarvoDealPurchaseLimit: `[UNTRANSLATED] No Darvo Deal Purchase Limit`,
|
||||
cheats_noDeathMarks: `Aucune marque d'assassin`,
|
||||
cheats_noKimCooldowns: `Aucun cooldown sur le KIM`,
|
||||
cheats_fullyStockedVendors: `Les vendeurs ont un stock à 100%`,
|
||||
|
@ -156,6 +156,7 @@ dict = {
|
||||
cheats_noArgonCrystalDecay: `Без распада аргоновых кристаллов`,
|
||||
cheats_noMasteryRankUpCooldown: `Повышение ранга мастерства без кулдауна`,
|
||||
cheats_noVendorPurchaseLimits: `Отсутствие лимитов на покупки у вендоров`,
|
||||
cheats_noDarvoDealPurchaseLimit: `[UNTRANSLATED] No Darvo Deal Purchase Limit`,
|
||||
cheats_noDeathMarks: `Без меток сметри`,
|
||||
cheats_noKimCooldowns: `Чаты KIM без кулдауна`,
|
||||
cheats_fullyStockedVendors: `[UNTRANSLATED] Fully Stocked Vendors`,
|
||||
|
@ -74,9 +74,9 @@ dict = {
|
||||
inventory_longGuns: `主要武器`,
|
||||
inventory_pistols: `次要武器`,
|
||||
inventory_melee: `近战武器`,
|
||||
inventory_spaceSuits: `Archwings`,
|
||||
inventory_spaceGuns: `Archwing主武器`,
|
||||
inventory_spaceMelee: `Archwing近战武器`,
|
||||
inventory_spaceSuits: `载具`,
|
||||
inventory_spaceGuns: `载具主武器`,
|
||||
inventory_spaceMelee: `载具近战武器`,
|
||||
inventory_mechSuits: `殁世机甲`,
|
||||
inventory_sentinels: `守护`,
|
||||
inventory_sentinelWeapons: `守护武器`,
|
||||
@ -88,15 +88,15 @@ dict = {
|
||||
inventory_Boosters: `加成器`,
|
||||
inventory_bulkAddSuits: `添加缺失战甲`,
|
||||
inventory_bulkAddWeapons: `添加缺失武器`,
|
||||
inventory_bulkAddSpaceSuits: `添加缺失Archwing`,
|
||||
inventory_bulkAddSpaceWeapons: `添加缺失Archwing武器`,
|
||||
inventory_bulkAddSpaceSuits: `添加缺失载具`,
|
||||
inventory_bulkAddSpaceWeapons: `添加缺失载具武器`,
|
||||
inventory_bulkAddSentinels: `添加缺失守护`,
|
||||
inventory_bulkAddSentinelWeapons: `添加缺失守护武器`,
|
||||
inventory_bulkAddEvolutionProgress: `添加缺失的灵化之源`,
|
||||
inventory_bulkRankUpSuits: `所有战甲升满级`,
|
||||
inventory_bulkRankUpWeapons: `所有武器升满级`,
|
||||
inventory_bulkRankUpSpaceSuits: `所有Archwing升满级`,
|
||||
inventory_bulkRankUpSpaceWeapons: `所有Archwing武器升满级`,
|
||||
inventory_bulkRankUpSpaceSuits: `所有载具升满级`,
|
||||
inventory_bulkRankUpSpaceWeapons: `所有载具武器升满级`,
|
||||
inventory_bulkRankUpSentinels: `所有守护升满级`,
|
||||
inventory_bulkRankUpSentinelWeapons: `所有守护武器升满级`,
|
||||
inventory_bulkRankUpEvolutionProgress: `所有灵化之源最大等级`,
|
||||
@ -156,6 +156,7 @@ dict = {
|
||||
cheats_noArgonCrystalDecay: `氩结晶无衰变`,
|
||||
cheats_noMasteryRankUpCooldown: `段位考核无冷却时间`,
|
||||
cheats_noVendorPurchaseLimits: `商城或商人无购买限制`,
|
||||
cheats_noDarvoDealPurchaseLimit: `[UNTRANSLATED] No Darvo Deal Purchase Limit`,
|
||||
cheats_noDeathMarks: `无死亡标记(不会被 Stalker/Grustrag 三霸/Zanuka 猎人等标记)`,
|
||||
cheats_noKimCooldowns: `即时通无冷却时间`,
|
||||
cheats_fullyStockedVendors: `商人贩卖所有商品`,
|
||||
@ -181,7 +182,7 @@ dict = {
|
||||
cheats_account: `账户`,
|
||||
cheats_unlockAllFocusSchools: `解锁所有专精学派`,
|
||||
cheats_helminthUnlockAll: `完全升级Helminth`,
|
||||
cheats_addMissingSubsumedAbilities: `[UNTRANSLATED] Add Missing Subsumed Abilities`,
|
||||
cheats_addMissingSubsumedAbilities: `添加Helminth未汲取的战甲技能`,
|
||||
cheats_intrinsicsUnlockAll: `所有内源之力最大等级`,
|
||||
cheats_changeSupportedSyndicate: `支持的集团`,
|
||||
cheats_changeButton: `更改`,
|
||||
|
Loading…
x
Reference in New Issue
Block a user