merge upstream
This commit is contained in:
		
						commit
						2c38939290
					
				@ -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`)
 | 
			
		||||
 | 
			
		||||
@ -74,6 +74,7 @@
 | 
			
		||||
    "vallisOverride": "",
 | 
			
		||||
    "duviriOverride": "",
 | 
			
		||||
    "nightwaveOverride": "",
 | 
			
		||||
    "allTheFissures": "",
 | 
			
		||||
    "circuitGameModes": null
 | 
			
		||||
  },
 | 
			
		||||
  "dev": {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										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,7 +1,7 @@
 | 
			
		||||
import { RequestHandler } from "express";
 | 
			
		||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
			
		||||
import { getAccountForRequest } from "@/src/services/loginService";
 | 
			
		||||
import { addChallenges, getInventory } from "@/src/services/inventoryService";
 | 
			
		||||
import { addCalendarProgress, addChallenges, getInventory } from "@/src/services/inventoryService";
 | 
			
		||||
import { IChallengeProgress, ISeasonChallenge } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
			
		||||
import { IAffiliationMods } from "@/src/types/purchaseTypes";
 | 
			
		||||
import { getEntriesUnsafe } from "@/src/utils/ts-utils";
 | 
			
		||||
@ -25,13 +25,17 @@ export const updateChallengeProgressController: RequestHandler = async (req, res
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
    for (const [key, value] of getEntriesUnsafe(challenges)) {
 | 
			
		||||
        if (value === undefined) {
 | 
			
		||||
            logger.error(`Challenge progress update key ${key} has no value`);
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        switch (key) {
 | 
			
		||||
            case "ChallengesFixVersion":
 | 
			
		||||
                inventory.ChallengesFixVersion = value;
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case "SeasonChallengeHistory":
 | 
			
		||||
                value!.forEach(({ challenge, id }) => {
 | 
			
		||||
                value.forEach(({ challenge, id }) => {
 | 
			
		||||
                    const itemIndex = inventory.SeasonChallengeHistory.findIndex(i => i.challenge === challenge);
 | 
			
		||||
                    if (itemIndex !== -1) {
 | 
			
		||||
                        inventory.SeasonChallengeHistory[itemIndex].id = id;
 | 
			
		||||
@ -41,6 +45,10 @@ export const updateChallengeProgressController: RequestHandler = async (req, res
 | 
			
		||||
                });
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case "CalendarProgress":
 | 
			
		||||
                addCalendarProgress(inventory, value);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case "ChallengeProgress":
 | 
			
		||||
            case "SeasonChallengeCompletions":
 | 
			
		||||
            case "ChallengePTS":
 | 
			
		||||
@ -63,5 +71,6 @@ interface IUpdateChallengeProgressRequest {
 | 
			
		||||
    ChallengeProgress?: IChallengeProgress[];
 | 
			
		||||
    SeasonChallengeHistory?: ISeasonChallenge[];
 | 
			
		||||
    SeasonChallengeCompletions?: ISeasonChallenge[];
 | 
			
		||||
    CalendarProgress?: { challenge: string }[];
 | 
			
		||||
    crossPlaySetting?: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										42
									
								
								src/controllers/custom/configController.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/controllers/custom/configController.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,42 @@
 | 
			
		||||
import { RequestHandler } from "express";
 | 
			
		||||
import { config } from "@/src/services/configService";
 | 
			
		||||
import { getAccountForRequest, isAdministrator } from "@/src/services/loginService";
 | 
			
		||||
import { saveConfig } from "@/src/services/configWatcherService";
 | 
			
		||||
 | 
			
		||||
export const getConfigController: RequestHandler = async (req, res) => {
 | 
			
		||||
    const account = await getAccountForRequest(req);
 | 
			
		||||
    if (isAdministrator(account)) {
 | 
			
		||||
        const responseData: Record<string, boolean | string | number | null> = {};
 | 
			
		||||
        for (const id of req.body as string[]) {
 | 
			
		||||
            const [obj, idx] = configIdToIndexable(id);
 | 
			
		||||
            responseData[id] = obj[idx] ?? null;
 | 
			
		||||
        }
 | 
			
		||||
        res.json(responseData);
 | 
			
		||||
    } else {
 | 
			
		||||
        res.status(401).end();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const setConfigController: RequestHandler = async (req, res) => {
 | 
			
		||||
    const account = await getAccountForRequest(req);
 | 
			
		||||
    if (isAdministrator(account)) {
 | 
			
		||||
        for (const [id, value] of Object.entries(req.body as Record<string, boolean | string | number>)) {
 | 
			
		||||
            const [obj, idx] = configIdToIndexable(id);
 | 
			
		||||
            obj[idx] = value;
 | 
			
		||||
        }
 | 
			
		||||
        await saveConfig();
 | 
			
		||||
        res.end();
 | 
			
		||||
    } else {
 | 
			
		||||
        res.status(401).end();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const configIdToIndexable = (id: string): [Record<string, boolean | string | number | undefined>, string] => {
 | 
			
		||||
    let obj = config as unknown as Record<string, never>;
 | 
			
		||||
    const arr = id.split(".");
 | 
			
		||||
    while (arr.length > 1) {
 | 
			
		||||
        obj = obj[arr[0]];
 | 
			
		||||
        arr.splice(0, 1);
 | 
			
		||||
    }
 | 
			
		||||
    return [obj, arr[0]];
 | 
			
		||||
};
 | 
			
		||||
@ -1,14 +0,0 @@
 | 
			
		||||
import { RequestHandler } from "express";
 | 
			
		||||
import { config } from "@/src/services/configService";
 | 
			
		||||
import { getAccountForRequest, isAdministrator } from "@/src/services/loginService";
 | 
			
		||||
 | 
			
		||||
const getConfigDataController: RequestHandler = async (req, res) => {
 | 
			
		||||
    const account = await getAccountForRequest(req);
 | 
			
		||||
    if (isAdministrator(account)) {
 | 
			
		||||
        res.json(config);
 | 
			
		||||
    } else {
 | 
			
		||||
        res.status(401).end();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export { getConfigDataController };
 | 
			
		||||
@ -1,21 +0,0 @@
 | 
			
		||||
import { RequestHandler } from "express";
 | 
			
		||||
import { saveConfig } from "@/src/services/configWatcherService";
 | 
			
		||||
import { getAccountForRequest, isAdministrator } from "@/src/services/loginService";
 | 
			
		||||
import { config, IConfig } from "@/src/services/configService";
 | 
			
		||||
 | 
			
		||||
export const updateConfigDataController: RequestHandler = async (req, res) => {
 | 
			
		||||
    const account = await getAccountForRequest(req);
 | 
			
		||||
    if (isAdministrator(account)) {
 | 
			
		||||
        const data = req.body as IUpdateConfigDataRequest;
 | 
			
		||||
        config[data.key] = data.value;
 | 
			
		||||
        await saveConfig();
 | 
			
		||||
        res.end();
 | 
			
		||||
    } else {
 | 
			
		||||
        res.status(401).end();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
interface IUpdateConfigDataRequest {
 | 
			
		||||
    key: keyof IConfig;
 | 
			
		||||
    value: never;
 | 
			
		||||
}
 | 
			
		||||
@ -25,8 +25,7 @@ import { manageQuestsController } from "@/src/controllers/custom/manageQuestsCon
 | 
			
		||||
import { setEvolutionProgressController } from "@/src/controllers/custom/setEvolutionProgressController";
 | 
			
		||||
import { setBoosterController } from "@/src/controllers/custom/setBoosterController";
 | 
			
		||||
 | 
			
		||||
import { getConfigDataController } from "@/src/controllers/custom/getConfigDataController";
 | 
			
		||||
import { updateConfigDataController } from "@/src/controllers/custom/updateConfigDataController";
 | 
			
		||||
import { getConfigController, setConfigController } from "@/src/controllers/custom/configController";
 | 
			
		||||
 | 
			
		||||
const customRouter = express.Router();
 | 
			
		||||
 | 
			
		||||
@ -55,7 +54,7 @@ customRouter.post("/manageQuests", manageQuestsController);
 | 
			
		||||
customRouter.post("/setEvolutionProgress", setEvolutionProgressController);
 | 
			
		||||
customRouter.post("/setBooster", setBoosterController);
 | 
			
		||||
 | 
			
		||||
customRouter.get("/config", getConfigDataController);
 | 
			
		||||
customRouter.post("/config", updateConfigDataController);
 | 
			
		||||
customRouter.post("/getConfig", getConfigController);
 | 
			
		||||
customRouter.post("/setConfig", setConfigController);
 | 
			
		||||
 | 
			
		||||
export { customRouter };
 | 
			
		||||
 | 
			
		||||
@ -81,6 +81,7 @@ export interface IConfig {
 | 
			
		||||
        vallisOverride?: string;
 | 
			
		||||
        duviriOverride?: string;
 | 
			
		||||
        nightwaveOverride?: string;
 | 
			
		||||
        allTheFissures?: string;
 | 
			
		||||
        circuitGameModes?: string[];
 | 
			
		||||
    };
 | 
			
		||||
    dev?: {
 | 
			
		||||
 | 
			
		||||
@ -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 = [
 | 
			
		||||
            {
 | 
			
		||||
@ -1831,6 +1832,15 @@ export const addChallenges = (
 | 
			
		||||
    return affiliationMods;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const addCalendarProgress = (inventory: TInventoryDatabaseDocument, value: { challenge: string }[]): void => {
 | 
			
		||||
    const calendarProgress = getCalendarProgress(inventory);
 | 
			
		||||
    const currentSeason = getWorldState().KnownCalendarSeasons[0];
 | 
			
		||||
    calendarProgress.SeasonProgress.LastCompletedChallengeDayIdx = currentSeason.Days.findIndex(
 | 
			
		||||
        day => day.events.length != 0 && day.events[0].challenge == value[value.length - 1].challenge
 | 
			
		||||
    );
 | 
			
		||||
    checkCalendarChallengeCompletion(calendarProgress, currentSeason);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const addMissionComplete = (inventory: TInventoryDatabaseDocument, { Tag, Completes, Tier }: IMission): void => {
 | 
			
		||||
    const { Missions } = inventory;
 | 
			
		||||
    const itemIndex = Missions.findIndex(item => item.Tag === Tag);
 | 
			
		||||
 | 
			
		||||
@ -144,7 +144,8 @@ export const claimLoginReward = async (
 | 
			
		||||
        case "RT_STORE_ITEM":
 | 
			
		||||
        case "RT_RECIPE":
 | 
			
		||||
        case "RT_RANDOM_RECIPE":
 | 
			
		||||
            return (await handleStoreItemAcquisition(reward.StoreItemType, inventory, reward.Amount)).InventoryChanges;
 | 
			
		||||
            return (await handleStoreItemAcquisition(reward.StoreItemType, inventory, reward.Amount, undefined, true))
 | 
			
		||||
                .InventoryChanges;
 | 
			
		||||
 | 
			
		||||
        case "RT_CREDITS":
 | 
			
		||||
            return updateCurrency(inventory, -reward.Amount, false);
 | 
			
		||||
 | 
			
		||||
@ -14,6 +14,7 @@ import { IRngResult, SRng, getRandomElement, getRandomReward } from "@/src/servi
 | 
			
		||||
import { equipmentKeys, IMission, ITypeCount, TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
			
		||||
import {
 | 
			
		||||
    addBooster,
 | 
			
		||||
    addCalendarProgress,
 | 
			
		||||
    addChallenges,
 | 
			
		||||
    addConsumables,
 | 
			
		||||
    addCrewShipAmmo,
 | 
			
		||||
@ -33,10 +34,8 @@ import {
 | 
			
		||||
    addSkin,
 | 
			
		||||
    addStanding,
 | 
			
		||||
    applyClientEquipmentUpdates,
 | 
			
		||||
    checkCalendarChallengeCompletion,
 | 
			
		||||
    combineInventoryChanges,
 | 
			
		||||
    generateRewardSeed,
 | 
			
		||||
    getCalendarProgress,
 | 
			
		||||
    getDialogue,
 | 
			
		||||
    giveNemesisPetRecipe,
 | 
			
		||||
    giveNemesisWeaponRecipe,
 | 
			
		||||
@ -235,7 +234,7 @@ export const addMissionInventoryUpdates = async (
 | 
			
		||||
    }
 | 
			
		||||
    for (const [key, value] of getEntriesUnsafe(inventoryUpdates)) {
 | 
			
		||||
        if (value === undefined) {
 | 
			
		||||
            logger.error(`Inventory update key ${key} has no value `);
 | 
			
		||||
            logger.error(`Inventory update key ${key} has no value`);
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        switch (key) {
 | 
			
		||||
@ -671,12 +670,7 @@ export const addMissionInventoryUpdates = async (
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            case "CalendarProgress": {
 | 
			
		||||
                const calendarProgress = getCalendarProgress(inventory);
 | 
			
		||||
                const currentSeason = getWorldState().KnownCalendarSeasons[0];
 | 
			
		||||
                calendarProgress.SeasonProgress.LastCompletedChallengeDayIdx = currentSeason.Days.findIndex(
 | 
			
		||||
                    x => x.events[0].challenge == value[value.length - 1].challenge
 | 
			
		||||
                );
 | 
			
		||||
                checkCalendarChallengeCompletion(calendarProgress, currentSeason);
 | 
			
		||||
                addCalendarProgress(inventory, value);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            case "duviriCaveOffers": {
 | 
			
		||||
 | 
			
		||||
@ -371,18 +371,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 +534,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":
 | 
			
		||||
 | 
			
		||||
@ -149,7 +149,8 @@ export const handleInventoryItemConfigChange = async (
 | 
			
		||||
                    } else {
 | 
			
		||||
                        const inventoryItem = inventory.WeaponSkins.id(itemId);
 | 
			
		||||
                        if (!inventoryItem) {
 | 
			
		||||
                            throw new Error(`inventory item WeaponSkins not found with id ${itemId}`);
 | 
			
		||||
                            logger.warn(`inventory item WeaponSkins not found with id ${itemId}`);
 | 
			
		||||
                            continue;
 | 
			
		||||
                        }
 | 
			
		||||
                        if ("Favorite" in itemConfigEntries) {
 | 
			
		||||
                            inventoryItem.Favorite = itemConfigEntries.Favorite;
 | 
			
		||||
@ -177,7 +178,8 @@ export const handleInventoryItemConfigChange = async (
 | 
			
		||||
                        const inventoryItem = inventory[equipmentName].id(itemId);
 | 
			
		||||
 | 
			
		||||
                        if (!inventoryItem) {
 | 
			
		||||
                            throw new Error(`inventory item ${equipmentName} not found with id ${itemId}`);
 | 
			
		||||
                            logger.warn(`inventory item ${equipmentName} not found with id ${itemId}`);
 | 
			
		||||
                            continue;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        for (const [configId, config] of Object.entries(itemConfigEntries)) {
 | 
			
		||||
 | 
			
		||||
@ -1524,20 +1524,40 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const populateFissures = async (worldState: IWorldState): Promise<void> => {
 | 
			
		||||
    const fissures = await Fissure.find({});
 | 
			
		||||
    for (const fissure of fissures) {
 | 
			
		||||
        const meta = ExportRegions[fissure.Node];
 | 
			
		||||
        worldState.ActiveMissions.push({
 | 
			
		||||
            _id: toOid(fissure._id),
 | 
			
		||||
            Region: meta.systemIndex + 1,
 | 
			
		||||
            Seed: 1337,
 | 
			
		||||
            Activation: toMongoDate(fissure.Activation),
 | 
			
		||||
            Expiry: toMongoDate(fissure.Expiry),
 | 
			
		||||
            Node: fissure.Node,
 | 
			
		||||
            MissionType: eMissionType[meta.missionIndex].tag,
 | 
			
		||||
            Modifier: fissure.Modifier,
 | 
			
		||||
            Hard: fissure.Hard
 | 
			
		||||
        });
 | 
			
		||||
    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];
 | 
			
		||||
            worldState.ActiveMissions.push({
 | 
			
		||||
                _id: toOid(fissure._id),
 | 
			
		||||
                Region: meta.systemIndex + 1,
 | 
			
		||||
                Seed: 1337,
 | 
			
		||||
                Activation: toMongoDate(fissure.Activation),
 | 
			
		||||
                Expiry: toMongoDate(fissure.Expiry),
 | 
			
		||||
                Node: fissure.Node,
 | 
			
		||||
                MissionType: eMissionType[meta.missionIndex].tag,
 | 
			
		||||
                Modifier: fissure.Modifier,
 | 
			
		||||
                Hard: fissure.Hard
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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"
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
@ -568,10 +568,10 @@
 | 
			
		||||
                        <div class="card mb-3">
 | 
			
		||||
                            <h5 class="card-header" data-loc="cheats_server"></h5>
 | 
			
		||||
                            <div class="card-body">
 | 
			
		||||
                                <div id="server-settings-no-perms" class="d-none">
 | 
			
		||||
                                <div class="d-none config-admin-hide">
 | 
			
		||||
                                    <p class="card-text" data-loc="cheats_administratorRequirement"></p>
 | 
			
		||||
                                </div>
 | 
			
		||||
                                <div id="server-settings" class="d-none">
 | 
			
		||||
                                <div class="d-none config-admin-show config-form">
 | 
			
		||||
                                    <div class="form-check">
 | 
			
		||||
                                        <input class="form-check-input" type="checkbox" id="skipTutorial" />
 | 
			
		||||
                                        <label class="form-check-label" for="skipTutorial" data-loc="cheats_skipTutorial"></label>
 | 
			
		||||
@ -807,6 +807,93 @@
 | 
			
		||||
                                </form>
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </div>
 | 
			
		||||
                        <div class="card mb-3 d-none config-admin-show config-form">
 | 
			
		||||
                            <h5 class="card-header" data-loc="worldState"></h5>
 | 
			
		||||
                            <div class="card-body">
 | 
			
		||||
                                <div class="form-check">
 | 
			
		||||
                                    <input class="form-check-input" type="checkbox" id="worldState.creditBoost" />
 | 
			
		||||
                                    <label class="form-check-label" for="worldState.creditBoost" data-loc="worldState_creditBoost"></label>
 | 
			
		||||
                                </div>
 | 
			
		||||
                                <div class="form-check">
 | 
			
		||||
                                    <input class="form-check-input" type="checkbox" id="worldState.affinityBoost" />
 | 
			
		||||
                                    <label class="form-check-label" for="worldState.affinityBoost" data-loc="worldState_affinityBoost"></label>
 | 
			
		||||
                                </div>
 | 
			
		||||
                                <div class="form-check">
 | 
			
		||||
                                    <input class="form-check-input" type="checkbox" id="worldState.resourceBoost" />
 | 
			
		||||
                                    <label class="form-check-label" for="worldState.resourceBoost" data-loc="worldState_resourceBoost"></label>
 | 
			
		||||
                                </div>
 | 
			
		||||
                                <div class="form-check">
 | 
			
		||||
                                    <input class="form-check-input" type="checkbox" id="worldState.starDays" />
 | 
			
		||||
                                    <label class="form-check-label" for="worldState.starDays" data-loc="worldState_starDays"></label>
 | 
			
		||||
                                </div>
 | 
			
		||||
                                <div class="form-group mt-2">
 | 
			
		||||
                                    <label class="form-label" for="changeSyndicate" data-loc="worldState_galleonOfGhouls"></label>
 | 
			
		||||
                                    <select class="form-control" id="worldState.galleonOfGhouls">
 | 
			
		||||
                                        <option value="0" data-loc="disabled"></option>
 | 
			
		||||
                                        <option value="1" data-loc="worldState_we1"></option>
 | 
			
		||||
                                        <option value="2" data-loc="worldState_we2"></option>
 | 
			
		||||
                                        <option value="3" data-loc="worldState_we3"></option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                </div>
 | 
			
		||||
                                <div class="form-group mt-2">
 | 
			
		||||
                                    <label class="form-label" for="changeSyndicate" data-loc="worldState_eidolonOverride"></label>
 | 
			
		||||
                                    <select class="form-control" id="worldState.eidolonOverride">
 | 
			
		||||
                                        <option value="" data-loc="disabled"></option>
 | 
			
		||||
                                        <option value="day" data-loc="worldState_day"></option>
 | 
			
		||||
                                        <option value="night" data-loc="worldState_night"></option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                </div>
 | 
			
		||||
                                <div class="form-group mt-2">
 | 
			
		||||
                                    <label class="form-label" for="changeSyndicate" data-loc="worldState_vallisOverride"></label>
 | 
			
		||||
                                    <select class="form-control" id="worldState.vallisOverride">
 | 
			
		||||
                                        <option value="" data-loc="disabled"></option>
 | 
			
		||||
                                        <option value="warm" data-loc="worldState_warm"></option>
 | 
			
		||||
                                        <option value="cold" data-loc="worldState_cold"></option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                </div>
 | 
			
		||||
                                <div class="form-group mt-2">
 | 
			
		||||
                                    <label class="form-label" for="changeSyndicate" data-loc="worldState_duviriOverride"></label>
 | 
			
		||||
                                    <select class="form-control" id="worldState.duviriOverride">
 | 
			
		||||
                                        <option value="" data-loc="disabled"></option>
 | 
			
		||||
                                        <option value="joy" data-loc="worldState_joy"></option>
 | 
			
		||||
                                        <option value="anger" data-loc="worldState_anger"></option>
 | 
			
		||||
                                        <option value="envy" data-loc="worldState_envy"></option>
 | 
			
		||||
                                        <option value="sorrow" data-loc="worldState_sorrow"></option>
 | 
			
		||||
                                        <option value="fear" data-loc="worldState_fear"></option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                </div>
 | 
			
		||||
                                <div class="form-group mt-2">
 | 
			
		||||
                                    <label class="form-label" for="changeSyndicate" data-loc="worldState_nightwaveOverride"></label>
 | 
			
		||||
                                    <select class="form-control" id="worldState.nightwaveOverride">
 | 
			
		||||
                                        <option value="" data-loc="disabled"></option>
 | 
			
		||||
                                        <option value="RadioLegionIntermission13Syndicate" data-loc="worldState_RadioLegionIntermission13Syndicate"></option>
 | 
			
		||||
                                        <option value="RadioLegionIntermission12Syndicate" data-loc="worldState_RadioLegionIntermission12Syndicate"></option>
 | 
			
		||||
                                        <option value="RadioLegionIntermission11Syndicate" data-loc="worldState_RadioLegionIntermission11Syndicate"></option>
 | 
			
		||||
                                        <option value="RadioLegionIntermission10Syndicate" data-loc="worldState_RadioLegionIntermission10Syndicate"></option>
 | 
			
		||||
                                        <option value="RadioLegionIntermission9Syndicate" data-loc="worldState_RadioLegionIntermission9Syndicate"></option>
 | 
			
		||||
                                        <option value="RadioLegionIntermission8Syndicate" data-loc="worldState_RadioLegionIntermission8Syndicate"></option>
 | 
			
		||||
                                        <option value="RadioLegionIntermission7Syndicate" data-loc="worldState_RadioLegionIntermission7Syndicate"></option>
 | 
			
		||||
                                        <option value="RadioLegionIntermission6Syndicate" data-loc="worldState_RadioLegionIntermission6Syndicate"></option>
 | 
			
		||||
                                        <option value="RadioLegionIntermission5Syndicate" data-loc="worldState_RadioLegionIntermission5Syndicate"></option>
 | 
			
		||||
                                        <option value="RadioLegionIntermission4Syndicate" data-loc="worldState_RadioLegionIntermission4Syndicate"></option>
 | 
			
		||||
                                        <option value="RadioLegionIntermission3Syndicate" data-loc="worldState_RadioLegionIntermission3Syndicate"></option>
 | 
			
		||||
                                        <option value="RadioLegion3Syndicate" data-loc="worldState_RadioLegion3Syndicate"></option>
 | 
			
		||||
                                        <option value="RadioLegionIntermission2Syndicate" data-loc="worldState_RadioLegionIntermission2Syndicate"></option>
 | 
			
		||||
                                        <option value="RadioLegion2Syndicate" data-loc="worldState_RadioLegion2Syndicate"></option>
 | 
			
		||||
                                        <option value="RadioLegionIntermissionSyndicate" data-loc="worldState_RadioLegionIntermissionSyndicate"></option>
 | 
			
		||||
                                        <option value="RadioLegionSyndicate" data-loc="worldState_RadioLegionSyndicate"></option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                </div>
 | 
			
		||||
                                <div class="form-group mt-2">
 | 
			
		||||
                                    <label class="form-label" for="changeSyndicate" data-loc="worldState_fissures"></label>
 | 
			
		||||
                                    <select class="form-control" id="worldState.allTheFissures">
 | 
			
		||||
                                        <option value="" data-loc="normal"></option>
 | 
			
		||||
                                        <option value="normal" data-loc="worldState_allAtOnceNormal"></option>
 | 
			
		||||
                                        <option value="hard" data-loc="worldState_allAtOnceSteelPath"></option>
 | 
			
		||||
                                    </select>
 | 
			
		||||
                                </div>
 | 
			
		||||
                            </div>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
@ -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 = {};
 | 
			
		||||
@ -1846,16 +1847,28 @@ function doAcquireMod() {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const uiConfigs = [...$("#server-settings input[id]")].map(x => x.id);
 | 
			
		||||
const uiConfigs = [...$(".config-form input[id], .config-form select[id]")].map(x => x.id);
 | 
			
		||||
 | 
			
		||||
for (const id of uiConfigs) {
 | 
			
		||||
    const elm = document.getElementById(id);
 | 
			
		||||
    if (elm.type == "checkbox") {
 | 
			
		||||
    if (elm.tagName == "SELECT") {
 | 
			
		||||
        elm.onchange = function () {
 | 
			
		||||
            let value = this.value;
 | 
			
		||||
            if (!isNaN(parseInt(value))) {
 | 
			
		||||
                value = parseInt(value);
 | 
			
		||||
            }
 | 
			
		||||
            $.post({
 | 
			
		||||
                url: "/custom/setConfig?" + window.authz,
 | 
			
		||||
                contentType: "application/json",
 | 
			
		||||
                data: JSON.stringify({ [id]: value })
 | 
			
		||||
            });
 | 
			
		||||
        };
 | 
			
		||||
    } else if (elm.type == "checkbox") {
 | 
			
		||||
        elm.onchange = function () {
 | 
			
		||||
            $.post({
 | 
			
		||||
                url: "/custom/config?" + window.authz,
 | 
			
		||||
                url: "/custom/setConfig?" + window.authz,
 | 
			
		||||
                contentType: "application/json",
 | 
			
		||||
                data: JSON.stringify({ key: id, value: this.checked })
 | 
			
		||||
                data: JSON.stringify({ [id]: this.checked })
 | 
			
		||||
            }).then(() => {
 | 
			
		||||
                if (["infiniteCredits", "infinitePlatinum", "infiniteEndo", "infiniteRegalAya"].indexOf(id) != -1) {
 | 
			
		||||
                    updateInventory();
 | 
			
		||||
@ -1868,9 +1881,9 @@ for (const id of uiConfigs) {
 | 
			
		||||
function doSaveConfig(id) {
 | 
			
		||||
    const elm = document.getElementById(id);
 | 
			
		||||
    $.post({
 | 
			
		||||
        url: "/custom/config?" + window.authz,
 | 
			
		||||
        url: "/custom/setConfig?" + window.authz,
 | 
			
		||||
        contentType: "application/json",
 | 
			
		||||
        data: JSON.stringify({ key: id, value: parseInt(elm.value) })
 | 
			
		||||
        data: JSON.stringify({ [id]: parseInt(elm.value) })
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1881,26 +1894,29 @@ single.getRoute("/webui/cheats").on("beforeload", function () {
 | 
			
		||||
    interval = setInterval(() => {
 | 
			
		||||
        if (window.authz) {
 | 
			
		||||
            clearInterval(interval);
 | 
			
		||||
            fetch("/custom/config?" + window.authz).then(async res => {
 | 
			
		||||
                if (res.status == 200) {
 | 
			
		||||
            $.post({
 | 
			
		||||
                url: "/custom/getConfig?" + window.authz,
 | 
			
		||||
                contentType: "application/json",
 | 
			
		||||
                data: JSON.stringify(uiConfigs)
 | 
			
		||||
            })
 | 
			
		||||
                .done(json => {
 | 
			
		||||
                    //window.is_admin = true;
 | 
			
		||||
                    $("#server-settings-no-perms").addClass("d-none");
 | 
			
		||||
                    $("#server-settings").removeClass("d-none");
 | 
			
		||||
                    res.json().then(json =>
 | 
			
		||||
                        Object.entries(json).forEach(entry => {
 | 
			
		||||
                            const [key, value] = entry;
 | 
			
		||||
                            var x = document.getElementById(`${key}`);
 | 
			
		||||
                            if (x != null) {
 | 
			
		||||
                                if (x.type == "checkbox") {
 | 
			
		||||
                                    x.checked = value;
 | 
			
		||||
                                } else if (x.type == "number") {
 | 
			
		||||
                                    x.setAttribute("value", `${value}`);
 | 
			
		||||
                                }
 | 
			
		||||
                    $(".config-admin-hide").addClass("d-none");
 | 
			
		||||
                    $(".config-admin-show").removeClass("d-none");
 | 
			
		||||
                    Object.entries(json).forEach(entry => {
 | 
			
		||||
                        const [key, value] = entry;
 | 
			
		||||
                        var x = document.getElementById(`${key}`);
 | 
			
		||||
                        if (x != null) {
 | 
			
		||||
                            if (x.type == "checkbox") {
 | 
			
		||||
                                x.checked = value;
 | 
			
		||||
                            } else if (x.type == "number") {
 | 
			
		||||
                                x.setAttribute("value", `${value}`);
 | 
			
		||||
                            }
 | 
			
		||||
                        })
 | 
			
		||||
                    );
 | 
			
		||||
                } else {
 | 
			
		||||
                    if ((await res.text()) == "Log-in expired") {
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
                })
 | 
			
		||||
                .fail(res => {
 | 
			
		||||
                    if (res.responseText == "Log-in expired") {
 | 
			
		||||
                        revalidateAuthz().then(() => {
 | 
			
		||||
                            if (single.getCurrentPath() == "/webui/cheats") {
 | 
			
		||||
                                single.loadRoute("/webui/cheats");
 | 
			
		||||
@ -1908,11 +1924,10 @@ single.getRoute("/webui/cheats").on("beforeload", function () {
 | 
			
		||||
                        });
 | 
			
		||||
                    } else {
 | 
			
		||||
                        //window.is_admin = false;
 | 
			
		||||
                        $("#server-settings-no-perms").removeClass("d-none");
 | 
			
		||||
                        $("#server-settings").addClass("d-none");
 | 
			
		||||
                        $(".config-admin-hide").removeClass("d-none");
 | 
			
		||||
                        $(".config-admin-show").addClass("d-none");
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
                });
 | 
			
		||||
        }
 | 
			
		||||
    }, 10);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -186,6 +186,51 @@ dict = {
 | 
			
		||||
    cheats_changeSupportedSyndicate: `Unterstütztes Syndikat`,
 | 
			
		||||
    cheats_changeButton: `Ändern`,
 | 
			
		||||
    cheats_none: `Keines`,
 | 
			
		||||
 | 
			
		||||
    worldState: `[UNTRANSLATED] World State`,
 | 
			
		||||
    worldState_creditBoost: `[UNTRANSLATED] Credit Boost`,
 | 
			
		||||
    worldState_affinityBoost: `[UNTRANSLATED] Affinity Boost`,
 | 
			
		||||
    worldState_resourceBoost: `[UNTRANSLATED] Resource Boost`,
 | 
			
		||||
    worldState_starDays: `[UNTRANSLATED] Star Days`,
 | 
			
		||||
    worldState_galleonOfGhouls: `[UNTRANSLATED] Galleon of Ghouls`,
 | 
			
		||||
    disabled: `[UNTRANSLATED] Disabled`,
 | 
			
		||||
    worldState_we1: `[UNTRANSLATED] Weekend 1`,
 | 
			
		||||
    worldState_we2: `[UNTRANSLATED] Weekend 2`,
 | 
			
		||||
    worldState_we3: `[UNTRANSLATED] Weekend 3`,
 | 
			
		||||
    worldState_eidolonOverride: `[UNTRANSLATED] Eidolon Override`,
 | 
			
		||||
    worldState_day: `[UNTRANSLATED] Day`,
 | 
			
		||||
    worldState_night: `[UNTRANSLATED] Night`,
 | 
			
		||||
    worldState_vallisOverride: `[UNTRANSLATED] Orb Vallis Override`,
 | 
			
		||||
    worldState_warm: `[UNTRANSLATED] Warm`,
 | 
			
		||||
    worldState_cold: `[UNTRANSLATED] Cold`,
 | 
			
		||||
    worldState_duviriOverride: `[UNTRANSLATED] Duviri Override`,
 | 
			
		||||
    worldState_joy: `[UNTRANSLATED] Joy`,
 | 
			
		||||
    worldState_anger: `[UNTRANSLATED] Anger`,
 | 
			
		||||
    worldState_envy: `[UNTRANSLATED] Envy`,
 | 
			
		||||
    worldState_sorrow: `[UNTRANSLATED] Sorrow`,
 | 
			
		||||
    worldState_fear: `[UNTRANSLATED] Fear`,
 | 
			
		||||
    worldState_nightwaveOverride: `[UNTRANSLATED] Nightwave Override`,
 | 
			
		||||
    worldState_RadioLegionIntermission13Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 9`,
 | 
			
		||||
    worldState_RadioLegionIntermission12Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 8`,
 | 
			
		||||
    worldState_RadioLegionIntermission11Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 7`,
 | 
			
		||||
    worldState_RadioLegionIntermission10Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 6`,
 | 
			
		||||
    worldState_RadioLegionIntermission9Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 5`,
 | 
			
		||||
    worldState_RadioLegionIntermission8Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 4`,
 | 
			
		||||
    worldState_RadioLegionIntermission7Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 3`,
 | 
			
		||||
    worldState_RadioLegionIntermission6Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 2`,
 | 
			
		||||
    worldState_RadioLegionIntermission5Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 1`,
 | 
			
		||||
    worldState_RadioLegionIntermission4Syndicate: `[UNTRANSLATED] Nora's Choice`,
 | 
			
		||||
    worldState_RadioLegionIntermission3Syndicate: `[UNTRANSLATED] Intermission III`,
 | 
			
		||||
    worldState_RadioLegion3Syndicate: `[UNTRANSLATED] Glassmaker`,
 | 
			
		||||
    worldState_RadioLegionIntermission2Syndicate: `[UNTRANSLATED] Intermission II`,
 | 
			
		||||
    worldState_RadioLegion2Syndicate: `[UNTRANSLATED] The Emissary`,
 | 
			
		||||
    worldState_RadioLegionIntermissionSyndicate: `[UNTRANSLATED] Intermission I`,
 | 
			
		||||
    worldState_RadioLegionSyndicate: `[UNTRANSLATED] The Wolf of Saturn Six`,
 | 
			
		||||
    worldState_fissures: `[UNTRANSLATED] Fissures`,
 | 
			
		||||
    normal: `[UNTRANSLATED] Normal`,
 | 
			
		||||
    worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
 | 
			
		||||
    worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
 | 
			
		||||
 | 
			
		||||
    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`,
 | 
			
		||||
    import_samples: `[UNTRANSLATED] Samples:`,
 | 
			
		||||
 | 
			
		||||
@ -185,6 +185,51 @@ dict = {
 | 
			
		||||
    cheats_changeSupportedSyndicate: `Supported syndicate`,
 | 
			
		||||
    cheats_changeButton: `Change`,
 | 
			
		||||
    cheats_none: `None`,
 | 
			
		||||
 | 
			
		||||
    worldState: `World State`,
 | 
			
		||||
    worldState_creditBoost: `Credit Boost`,
 | 
			
		||||
    worldState_affinityBoost: `Affinity Boost`,
 | 
			
		||||
    worldState_resourceBoost: `Resource Boost`,
 | 
			
		||||
    worldState_starDays: `Star Days`,
 | 
			
		||||
    worldState_galleonOfGhouls: `Galleon of Ghouls`,
 | 
			
		||||
    disabled: `Disabled`,
 | 
			
		||||
    worldState_we1: `Weekend 1`,
 | 
			
		||||
    worldState_we2: `Weekend 2`,
 | 
			
		||||
    worldState_we3: `Weekend 3`,
 | 
			
		||||
    worldState_eidolonOverride: `Eidolon Override`,
 | 
			
		||||
    worldState_day: `Day`,
 | 
			
		||||
    worldState_night: `Night`,
 | 
			
		||||
    worldState_vallisOverride: `Orb Vallis Override`,
 | 
			
		||||
    worldState_warm: `Warm`,
 | 
			
		||||
    worldState_cold: `Cold`,
 | 
			
		||||
    worldState_duviriOverride: `Duviri Override`,
 | 
			
		||||
    worldState_joy: `Joy`,
 | 
			
		||||
    worldState_anger: `Anger`,
 | 
			
		||||
    worldState_envy: `Envy`,
 | 
			
		||||
    worldState_sorrow: `Sorrow`,
 | 
			
		||||
    worldState_fear: `Fear`,
 | 
			
		||||
    worldState_nightwaveOverride: `Nightwave Override`,
 | 
			
		||||
    worldState_RadioLegionIntermission13Syndicate: `Nora's Mix Vol. 9`,
 | 
			
		||||
    worldState_RadioLegionIntermission12Syndicate: `Nora's Mix Vol. 8`,
 | 
			
		||||
    worldState_RadioLegionIntermission11Syndicate: `Nora's Mix Vol. 7`,
 | 
			
		||||
    worldState_RadioLegionIntermission10Syndicate: `Nora's Mix Vol. 6`,
 | 
			
		||||
    worldState_RadioLegionIntermission9Syndicate: `Nora's Mix Vol. 5`,
 | 
			
		||||
    worldState_RadioLegionIntermission8Syndicate: `Nora's Mix Vol. 4`,
 | 
			
		||||
    worldState_RadioLegionIntermission7Syndicate: `Nora's Mix Vol. 3`,
 | 
			
		||||
    worldState_RadioLegionIntermission6Syndicate: `Nora's Mix Vol. 2`,
 | 
			
		||||
    worldState_RadioLegionIntermission5Syndicate: `Nora's Mix Vol. 1`,
 | 
			
		||||
    worldState_RadioLegionIntermission4Syndicate: `Nora's Choice`,
 | 
			
		||||
    worldState_RadioLegionIntermission3Syndicate: `Intermission III`,
 | 
			
		||||
    worldState_RadioLegion3Syndicate: `Glassmaker`,
 | 
			
		||||
    worldState_RadioLegionIntermission2Syndicate: `Intermission II`,
 | 
			
		||||
    worldState_RadioLegion2Syndicate: `The Emissary`,
 | 
			
		||||
    worldState_RadioLegionIntermissionSyndicate: `Intermission I`,
 | 
			
		||||
    worldState_RadioLegionSyndicate: `The Wolf of Saturn Six`,
 | 
			
		||||
    worldState_fissures: `Fissures`,
 | 
			
		||||
    normal: `Normal`,
 | 
			
		||||
    worldState_allAtOnceNormal: `All At Once, Normal`,
 | 
			
		||||
    worldState_allAtOnceSteelPath: `All At Once, Steel Path`,
 | 
			
		||||
 | 
			
		||||
    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`,
 | 
			
		||||
    import_samples: `Samples:`,
 | 
			
		||||
 | 
			
		||||
@ -186,6 +186,51 @@ dict = {
 | 
			
		||||
    cheats_changeSupportedSyndicate: `Sindicatos disponibles`,
 | 
			
		||||
    cheats_changeButton: `Cambiar`,
 | 
			
		||||
    cheats_none: `Ninguno`,
 | 
			
		||||
 | 
			
		||||
    worldState: `[UNTRANSLATED] World State`,
 | 
			
		||||
    worldState_creditBoost: `[UNTRANSLATED] Credit Boost`,
 | 
			
		||||
    worldState_affinityBoost: `[UNTRANSLATED] Affinity Boost`,
 | 
			
		||||
    worldState_resourceBoost: `[UNTRANSLATED] Resource Boost`,
 | 
			
		||||
    worldState_starDays: `[UNTRANSLATED] Star Days`,
 | 
			
		||||
    worldState_galleonOfGhouls: `[UNTRANSLATED] Galleon of Ghouls`,
 | 
			
		||||
    disabled: `[UNTRANSLATED] Disabled`,
 | 
			
		||||
    worldState_we1: `[UNTRANSLATED] Weekend 1`,
 | 
			
		||||
    worldState_we2: `[UNTRANSLATED] Weekend 2`,
 | 
			
		||||
    worldState_we3: `[UNTRANSLATED] Weekend 3`,
 | 
			
		||||
    worldState_eidolonOverride: `[UNTRANSLATED] Eidolon Override`,
 | 
			
		||||
    worldState_day: `[UNTRANSLATED] Day`,
 | 
			
		||||
    worldState_night: `[UNTRANSLATED] Night`,
 | 
			
		||||
    worldState_vallisOverride: `[UNTRANSLATED] Orb Vallis Override`,
 | 
			
		||||
    worldState_warm: `[UNTRANSLATED] Warm`,
 | 
			
		||||
    worldState_cold: `[UNTRANSLATED] Cold`,
 | 
			
		||||
    worldState_duviriOverride: `[UNTRANSLATED] Duviri Override`,
 | 
			
		||||
    worldState_joy: `[UNTRANSLATED] Joy`,
 | 
			
		||||
    worldState_anger: `[UNTRANSLATED] Anger`,
 | 
			
		||||
    worldState_envy: `[UNTRANSLATED] Envy`,
 | 
			
		||||
    worldState_sorrow: `[UNTRANSLATED] Sorrow`,
 | 
			
		||||
    worldState_fear: `[UNTRANSLATED] Fear`,
 | 
			
		||||
    worldState_nightwaveOverride: `[UNTRANSLATED] Nightwave Override`,
 | 
			
		||||
    worldState_RadioLegionIntermission13Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 9`,
 | 
			
		||||
    worldState_RadioLegionIntermission12Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 8`,
 | 
			
		||||
    worldState_RadioLegionIntermission11Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 7`,
 | 
			
		||||
    worldState_RadioLegionIntermission10Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 6`,
 | 
			
		||||
    worldState_RadioLegionIntermission9Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 5`,
 | 
			
		||||
    worldState_RadioLegionIntermission8Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 4`,
 | 
			
		||||
    worldState_RadioLegionIntermission7Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 3`,
 | 
			
		||||
    worldState_RadioLegionIntermission6Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 2`,
 | 
			
		||||
    worldState_RadioLegionIntermission5Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 1`,
 | 
			
		||||
    worldState_RadioLegionIntermission4Syndicate: `[UNTRANSLATED] Nora's Choice`,
 | 
			
		||||
    worldState_RadioLegionIntermission3Syndicate: `[UNTRANSLATED] Intermission III`,
 | 
			
		||||
    worldState_RadioLegion3Syndicate: `[UNTRANSLATED] Glassmaker`,
 | 
			
		||||
    worldState_RadioLegionIntermission2Syndicate: `[UNTRANSLATED] Intermission II`,
 | 
			
		||||
    worldState_RadioLegion2Syndicate: `[UNTRANSLATED] The Emissary`,
 | 
			
		||||
    worldState_RadioLegionIntermissionSyndicate: `[UNTRANSLATED] Intermission I`,
 | 
			
		||||
    worldState_RadioLegionSyndicate: `[UNTRANSLATED] The Wolf of Saturn Six`,
 | 
			
		||||
    worldState_fissures: `[UNTRANSLATED] Fissures`,
 | 
			
		||||
    normal: `[UNTRANSLATED] Normal`,
 | 
			
		||||
    worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
 | 
			
		||||
    worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
 | 
			
		||||
 | 
			
		||||
    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`,
 | 
			
		||||
    import_samples: `Muestras:`,
 | 
			
		||||
 | 
			
		||||
@ -186,6 +186,51 @@ dict = {
 | 
			
		||||
    cheats_changeSupportedSyndicate: `Allégeance`,
 | 
			
		||||
    cheats_changeButton: `Changer`,
 | 
			
		||||
    cheats_none: `Aucun`,
 | 
			
		||||
 | 
			
		||||
    worldState: `[UNTRANSLATED] World State`,
 | 
			
		||||
    worldState_creditBoost: `[UNTRANSLATED] Credit Boost`,
 | 
			
		||||
    worldState_affinityBoost: `[UNTRANSLATED] Affinity Boost`,
 | 
			
		||||
    worldState_resourceBoost: `[UNTRANSLATED] Resource Boost`,
 | 
			
		||||
    worldState_starDays: `[UNTRANSLATED] Star Days`,
 | 
			
		||||
    worldState_galleonOfGhouls: `[UNTRANSLATED] Galleon of Ghouls`,
 | 
			
		||||
    disabled: `[UNTRANSLATED] Disabled`,
 | 
			
		||||
    worldState_we1: `[UNTRANSLATED] Weekend 1`,
 | 
			
		||||
    worldState_we2: `[UNTRANSLATED] Weekend 2`,
 | 
			
		||||
    worldState_we3: `[UNTRANSLATED] Weekend 3`,
 | 
			
		||||
    worldState_eidolonOverride: `[UNTRANSLATED] Eidolon Override`,
 | 
			
		||||
    worldState_day: `[UNTRANSLATED] Day`,
 | 
			
		||||
    worldState_night: `[UNTRANSLATED] Night`,
 | 
			
		||||
    worldState_vallisOverride: `[UNTRANSLATED] Orb Vallis Override`,
 | 
			
		||||
    worldState_warm: `[UNTRANSLATED] Warm`,
 | 
			
		||||
    worldState_cold: `[UNTRANSLATED] Cold`,
 | 
			
		||||
    worldState_duviriOverride: `[UNTRANSLATED] Duviri Override`,
 | 
			
		||||
    worldState_joy: `[UNTRANSLATED] Joy`,
 | 
			
		||||
    worldState_anger: `[UNTRANSLATED] Anger`,
 | 
			
		||||
    worldState_envy: `[UNTRANSLATED] Envy`,
 | 
			
		||||
    worldState_sorrow: `[UNTRANSLATED] Sorrow`,
 | 
			
		||||
    worldState_fear: `[UNTRANSLATED] Fear`,
 | 
			
		||||
    worldState_nightwaveOverride: `[UNTRANSLATED] Nightwave Override`,
 | 
			
		||||
    worldState_RadioLegionIntermission13Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 9`,
 | 
			
		||||
    worldState_RadioLegionIntermission12Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 8`,
 | 
			
		||||
    worldState_RadioLegionIntermission11Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 7`,
 | 
			
		||||
    worldState_RadioLegionIntermission10Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 6`,
 | 
			
		||||
    worldState_RadioLegionIntermission9Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 5`,
 | 
			
		||||
    worldState_RadioLegionIntermission8Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 4`,
 | 
			
		||||
    worldState_RadioLegionIntermission7Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 3`,
 | 
			
		||||
    worldState_RadioLegionIntermission6Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 2`,
 | 
			
		||||
    worldState_RadioLegionIntermission5Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 1`,
 | 
			
		||||
    worldState_RadioLegionIntermission4Syndicate: `[UNTRANSLATED] Nora's Choice`,
 | 
			
		||||
    worldState_RadioLegionIntermission3Syndicate: `[UNTRANSLATED] Intermission III`,
 | 
			
		||||
    worldState_RadioLegion3Syndicate: `[UNTRANSLATED] Glassmaker`,
 | 
			
		||||
    worldState_RadioLegionIntermission2Syndicate: `[UNTRANSLATED] Intermission II`,
 | 
			
		||||
    worldState_RadioLegion2Syndicate: `[UNTRANSLATED] The Emissary`,
 | 
			
		||||
    worldState_RadioLegionIntermissionSyndicate: `[UNTRANSLATED] Intermission I`,
 | 
			
		||||
    worldState_RadioLegionSyndicate: `[UNTRANSLATED] The Wolf of Saturn Six`,
 | 
			
		||||
    worldState_fissures: `[UNTRANSLATED] Fissures`,
 | 
			
		||||
    normal: `[UNTRANSLATED] Normal`,
 | 
			
		||||
    worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
 | 
			
		||||
    worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
 | 
			
		||||
 | 
			
		||||
    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`,
 | 
			
		||||
    import_samples: `Echantillons :`,
 | 
			
		||||
 | 
			
		||||
@ -186,6 +186,51 @@ dict = {
 | 
			
		||||
    cheats_changeSupportedSyndicate: `Поддерживаемый синдикат`,
 | 
			
		||||
    cheats_changeButton: `Изменить`,
 | 
			
		||||
    cheats_none: `Отсутствует`,
 | 
			
		||||
 | 
			
		||||
    worldState: `[UNTRANSLATED] World State`,
 | 
			
		||||
    worldState_creditBoost: `[UNTRANSLATED] Credit Boost`,
 | 
			
		||||
    worldState_affinityBoost: `[UNTRANSLATED] Affinity Boost`,
 | 
			
		||||
    worldState_resourceBoost: `[UNTRANSLATED] Resource Boost`,
 | 
			
		||||
    worldState_starDays: `[UNTRANSLATED] Star Days`,
 | 
			
		||||
    worldState_galleonOfGhouls: `[UNTRANSLATED] Galleon of Ghouls`,
 | 
			
		||||
    disabled: `[UNTRANSLATED] Disabled`,
 | 
			
		||||
    worldState_we1: `[UNTRANSLATED] Weekend 1`,
 | 
			
		||||
    worldState_we2: `[UNTRANSLATED] Weekend 2`,
 | 
			
		||||
    worldState_we3: `[UNTRANSLATED] Weekend 3`,
 | 
			
		||||
    worldState_eidolonOverride: `[UNTRANSLATED] Eidolon Override`,
 | 
			
		||||
    worldState_day: `[UNTRANSLATED] Day`,
 | 
			
		||||
    worldState_night: `[UNTRANSLATED] Night`,
 | 
			
		||||
    worldState_vallisOverride: `[UNTRANSLATED] Orb Vallis Override`,
 | 
			
		||||
    worldState_warm: `[UNTRANSLATED] Warm`,
 | 
			
		||||
    worldState_cold: `[UNTRANSLATED] Cold`,
 | 
			
		||||
    worldState_duviriOverride: `[UNTRANSLATED] Duviri Override`,
 | 
			
		||||
    worldState_joy: `[UNTRANSLATED] Joy`,
 | 
			
		||||
    worldState_anger: `[UNTRANSLATED] Anger`,
 | 
			
		||||
    worldState_envy: `[UNTRANSLATED] Envy`,
 | 
			
		||||
    worldState_sorrow: `[UNTRANSLATED] Sorrow`,
 | 
			
		||||
    worldState_fear: `[UNTRANSLATED] Fear`,
 | 
			
		||||
    worldState_nightwaveOverride: `[UNTRANSLATED] Nightwave Override`,
 | 
			
		||||
    worldState_RadioLegionIntermission13Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 9`,
 | 
			
		||||
    worldState_RadioLegionIntermission12Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 8`,
 | 
			
		||||
    worldState_RadioLegionIntermission11Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 7`,
 | 
			
		||||
    worldState_RadioLegionIntermission10Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 6`,
 | 
			
		||||
    worldState_RadioLegionIntermission9Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 5`,
 | 
			
		||||
    worldState_RadioLegionIntermission8Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 4`,
 | 
			
		||||
    worldState_RadioLegionIntermission7Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 3`,
 | 
			
		||||
    worldState_RadioLegionIntermission6Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 2`,
 | 
			
		||||
    worldState_RadioLegionIntermission5Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 1`,
 | 
			
		||||
    worldState_RadioLegionIntermission4Syndicate: `[UNTRANSLATED] Nora's Choice`,
 | 
			
		||||
    worldState_RadioLegionIntermission3Syndicate: `[UNTRANSLATED] Intermission III`,
 | 
			
		||||
    worldState_RadioLegion3Syndicate: `[UNTRANSLATED] Glassmaker`,
 | 
			
		||||
    worldState_RadioLegionIntermission2Syndicate: `[UNTRANSLATED] Intermission II`,
 | 
			
		||||
    worldState_RadioLegion2Syndicate: `[UNTRANSLATED] The Emissary`,
 | 
			
		||||
    worldState_RadioLegionIntermissionSyndicate: `[UNTRANSLATED] Intermission I`,
 | 
			
		||||
    worldState_RadioLegionSyndicate: `[UNTRANSLATED] The Wolf of Saturn Six`,
 | 
			
		||||
    worldState_fissures: `[UNTRANSLATED] Fissures`,
 | 
			
		||||
    normal: `[UNTRANSLATED] Normal`,
 | 
			
		||||
    worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
 | 
			
		||||
    worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
 | 
			
		||||
 | 
			
		||||
    import_importNote: `Вы можете загрузить полный или частичный ответ инвентаря (клиентское представление) здесь. Все поддерживаемые поля <b>будут перезаписаны</b> в вашем аккаунте.`,
 | 
			
		||||
    import_submit: `Отправить`,
 | 
			
		||||
    import_samples: `[UNTRANSLATED] Samples:`,
 | 
			
		||||
 | 
			
		||||
@ -186,6 +186,51 @@ dict = {
 | 
			
		||||
    cheats_changeSupportedSyndicate: `支持的集团`,
 | 
			
		||||
    cheats_changeButton: `更改`,
 | 
			
		||||
    cheats_none: `无`,
 | 
			
		||||
 | 
			
		||||
    worldState: `[UNTRANSLATED] World State`,
 | 
			
		||||
    worldState_creditBoost: `[UNTRANSLATED] Credit Boost`,
 | 
			
		||||
    worldState_affinityBoost: `[UNTRANSLATED] Affinity Boost`,
 | 
			
		||||
    worldState_resourceBoost: `[UNTRANSLATED] Resource Boost`,
 | 
			
		||||
    worldState_starDays: `[UNTRANSLATED] Star Days`,
 | 
			
		||||
    worldState_galleonOfGhouls: `[UNTRANSLATED] Galleon of Ghouls`,
 | 
			
		||||
    disabled: `[UNTRANSLATED] Disabled`,
 | 
			
		||||
    worldState_we1: `[UNTRANSLATED] Weekend 1`,
 | 
			
		||||
    worldState_we2: `[UNTRANSLATED] Weekend 2`,
 | 
			
		||||
    worldState_we3: `[UNTRANSLATED] Weekend 3`,
 | 
			
		||||
    worldState_eidolonOverride: `[UNTRANSLATED] Eidolon Override`,
 | 
			
		||||
    worldState_day: `[UNTRANSLATED] Day`,
 | 
			
		||||
    worldState_night: `[UNTRANSLATED] Night`,
 | 
			
		||||
    worldState_vallisOverride: `[UNTRANSLATED] Orb Vallis Override`,
 | 
			
		||||
    worldState_warm: `[UNTRANSLATED] Warm`,
 | 
			
		||||
    worldState_cold: `[UNTRANSLATED] Cold`,
 | 
			
		||||
    worldState_duviriOverride: `[UNTRANSLATED] Duviri Override`,
 | 
			
		||||
    worldState_joy: `[UNTRANSLATED] Joy`,
 | 
			
		||||
    worldState_anger: `[UNTRANSLATED] Anger`,
 | 
			
		||||
    worldState_envy: `[UNTRANSLATED] Envy`,
 | 
			
		||||
    worldState_sorrow: `[UNTRANSLATED] Sorrow`,
 | 
			
		||||
    worldState_fear: `[UNTRANSLATED] Fear`,
 | 
			
		||||
    worldState_nightwaveOverride: `[UNTRANSLATED] Nightwave Override`,
 | 
			
		||||
    worldState_RadioLegionIntermission13Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 9`,
 | 
			
		||||
    worldState_RadioLegionIntermission12Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 8`,
 | 
			
		||||
    worldState_RadioLegionIntermission11Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 7`,
 | 
			
		||||
    worldState_RadioLegionIntermission10Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 6`,
 | 
			
		||||
    worldState_RadioLegionIntermission9Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 5`,
 | 
			
		||||
    worldState_RadioLegionIntermission8Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 4`,
 | 
			
		||||
    worldState_RadioLegionIntermission7Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 3`,
 | 
			
		||||
    worldState_RadioLegionIntermission6Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 2`,
 | 
			
		||||
    worldState_RadioLegionIntermission5Syndicate: `[UNTRANSLATED] Nora's Mix Vol. 1`,
 | 
			
		||||
    worldState_RadioLegionIntermission4Syndicate: `[UNTRANSLATED] Nora's Choice`,
 | 
			
		||||
    worldState_RadioLegionIntermission3Syndicate: `[UNTRANSLATED] Intermission III`,
 | 
			
		||||
    worldState_RadioLegion3Syndicate: `[UNTRANSLATED] Glassmaker`,
 | 
			
		||||
    worldState_RadioLegionIntermission2Syndicate: `[UNTRANSLATED] Intermission II`,
 | 
			
		||||
    worldState_RadioLegion2Syndicate: `[UNTRANSLATED] The Emissary`,
 | 
			
		||||
    worldState_RadioLegionIntermissionSyndicate: `[UNTRANSLATED] Intermission I`,
 | 
			
		||||
    worldState_RadioLegionSyndicate: `[UNTRANSLATED] The Wolf of Saturn Six`,
 | 
			
		||||
    worldState_fissures: `[UNTRANSLATED] Fissures`,
 | 
			
		||||
    normal: `[UNTRANSLATED] Normal`,
 | 
			
		||||
    worldState_allAtOnceNormal: `[UNTRANSLATED] All At Once, Normal`,
 | 
			
		||||
    worldState_allAtOnceSteelPath: `[UNTRANSLATED] All At Once, Steel Path`,
 | 
			
		||||
 | 
			
		||||
    import_importNote: `您可以在此处提供完整或部分库存响应(客户端表示)。支持的所有字段<b>将被覆盖</b>到您的账户中。`,
 | 
			
		||||
    import_submit: `提交`,
 | 
			
		||||
    import_samples: `示例:`,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user