Compare commits
	
		
			4 Commits
		
	
	
		
			7bc5065251
			...
			e345fc35b6
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e345fc35b6 | |||
| f5335704b4 | |||
| 79c5f7a67a | |||
| e97b107853 | 
@ -13,11 +13,6 @@
 | 
				
			|||||||
  "skipTutorial": false,
 | 
					  "skipTutorial": false,
 | 
				
			||||||
  "skipAllDialogue": false,
 | 
					  "skipAllDialogue": false,
 | 
				
			||||||
  "unlockAllScans": false,
 | 
					  "unlockAllScans": false,
 | 
				
			||||||
  "infiniteCredits": false,
 | 
					 | 
				
			||||||
  "infinitePlatinum": false,
 | 
					 | 
				
			||||||
  "infiniteEndo": false,
 | 
					 | 
				
			||||||
  "infiniteRegalAya": false,
 | 
					 | 
				
			||||||
  "infiniteHelminthMaterials": false,
 | 
					 | 
				
			||||||
  "claimingBlueprintRefundsIngredients": false,
 | 
					  "claimingBlueprintRefundsIngredients": false,
 | 
				
			||||||
  "dontSubtractPurchaseCreditCost": false,
 | 
					  "dontSubtractPurchaseCreditCost": false,
 | 
				
			||||||
  "dontSubtractPurchasePlatinumCost": false,
 | 
					  "dontSubtractPurchasePlatinumCost": false,
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,6 @@ import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import { RequestHandler } from "express";
 | 
				
			||||||
import { IInventoryClient, IUpgradeClient } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import { IInventoryClient, IUpgradeClient } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
				
			||||||
import { addMods, getInventory } from "@/src/services/inventoryService";
 | 
					import { addMods, getInventory } from "@/src/services/inventoryService";
 | 
				
			||||||
import { config } from "@/src/services/configService";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const artifactsController: RequestHandler = async (req, res) => {
 | 
					export const artifactsController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
@ -34,10 +33,10 @@ export const artifactsController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
        addMods(inventory, [{ ItemType, ItemCount: -1 }]);
 | 
					        addMods(inventory, [{ ItemType, ItemCount: -1 }]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!config.infiniteCredits) {
 | 
					    if (!inventory.infiniteCredits) {
 | 
				
			||||||
        inventory.RegularCredits -= Cost;
 | 
					        inventory.RegularCredits -= Cost;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (!config.infiniteEndo) {
 | 
					    if (!inventory.infiniteEndo) {
 | 
				
			||||||
        inventory.FusionPoints -= FusionPointCost;
 | 
					        inventory.FusionPoints -= FusionPointCost;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,4 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import { RequestHandler } from "express";
 | 
				
			||||||
import { config } from "@/src/services/configService";
 | 
					 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
				
			||||||
import { getInventory } from "@/src/services/inventoryService";
 | 
					import { getInventory } from "@/src/services/inventoryService";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -9,7 +8,7 @@ export const creditsController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            getAccountIdForRequest(req),
 | 
					            getAccountIdForRequest(req),
 | 
				
			||||||
            getInventory(
 | 
					            getInventory(
 | 
				
			||||||
                req.query.accountId as string,
 | 
					                req.query.accountId as string,
 | 
				
			||||||
                "RegularCredits TradesRemaining PremiumCreditsFree PremiumCredits"
 | 
					                "RegularCredits TradesRemaining PremiumCreditsFree PremiumCredits infiniteCredits infinitePlatinum"
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        ])
 | 
					        ])
 | 
				
			||||||
    )[1];
 | 
					    )[1];
 | 
				
			||||||
@ -21,10 +20,10 @@ export const creditsController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
        PremiumCredits: inventory.PremiumCredits
 | 
					        PremiumCredits: inventory.PremiumCredits
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (config.infiniteCredits) {
 | 
					    if (inventory.infiniteCredits) {
 | 
				
			||||||
        response.RegularCredits = 999999999;
 | 
					        response.RegularCredits = 999999999;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (config.infinitePlatinum) {
 | 
					    if (inventory.infinitePlatinum) {
 | 
				
			||||||
        response.PremiumCreditsFree = 0;
 | 
					        response.PremiumCreditsFree = 0;
 | 
				
			||||||
        response.PremiumCredits = 999999999;
 | 
					        response.PremiumCredits = 999999999;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -15,7 +15,6 @@ import { getRecipe } from "@/src/services/itemDataService";
 | 
				
			|||||||
import { toMongoDate, version_compare } from "@/src/helpers/inventoryHelpers";
 | 
					import { toMongoDate, version_compare } from "@/src/helpers/inventoryHelpers";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { logger } from "@/src/utils/logger";
 | 
				
			||||||
import { colorToShard } from "@/src/helpers/shardHelper";
 | 
					import { colorToShard } from "@/src/helpers/shardHelper";
 | 
				
			||||||
import { config } from "@/src/services/configService";
 | 
					 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    addInfestedFoundryXP,
 | 
					    addInfestedFoundryXP,
 | 
				
			||||||
    applyCheatsToInfestedFoundry,
 | 
					    applyCheatsToInfestedFoundry,
 | 
				
			||||||
@ -73,7 +72,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
                addMiscItems(inventory, miscItemChanges);
 | 
					                addMiscItems(inventory, miscItemChanges);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // consume resources
 | 
					                // consume resources
 | 
				
			||||||
                if (!config.infiniteHelminthMaterials) {
 | 
					                if (!inventory.infiniteHelminthMaterials) {
 | 
				
			||||||
                    let type: string;
 | 
					                    let type: string;
 | 
				
			||||||
                    let count: number;
 | 
					                    let count: number;
 | 
				
			||||||
                    if (account.BuildLabel && version_compare(account.BuildLabel, "2025.05.20.10.18") < 0) {
 | 
					                    if (account.BuildLabel && version_compare(account.BuildLabel, "2025.05.20.10.18") < 0) {
 | 
				
			||||||
@ -99,7 +98,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            await inventory.save();
 | 
					            await inventory.save();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
 | 
					            const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
 | 
				
			||||||
            applyCheatsToInfestedFoundry(infestedFoundry);
 | 
					            applyCheatsToInfestedFoundry(inventory, infestedFoundry);
 | 
				
			||||||
            res.json({
 | 
					            res.json({
 | 
				
			||||||
                InventoryChanges: {
 | 
					                InventoryChanges: {
 | 
				
			||||||
                    MiscItems: miscItemChanges,
 | 
					                    MiscItems: miscItemChanges,
 | 
				
			||||||
@ -129,13 +128,14 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
        case "c": {
 | 
					        case "c": {
 | 
				
			||||||
            // consume items
 | 
					            // consume items
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (config.infiniteHelminthMaterials) {
 | 
					            const inventory = await getInventory(account._id.toString());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (inventory.infiniteHelminthMaterials) {
 | 
				
			||||||
                res.status(400).end();
 | 
					                res.status(400).end();
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            const request = getJSONfromString<IHelminthFeedRequest>(String(req.body));
 | 
					            const request = getJSONfromString<IHelminthFeedRequest>(String(req.body));
 | 
				
			||||||
            const inventory = await getInventory(account._id.toString());
 | 
					 | 
				
			||||||
            inventory.InfestedFoundry ??= {};
 | 
					            inventory.InfestedFoundry ??= {};
 | 
				
			||||||
            inventory.InfestedFoundry.Resources ??= [];
 | 
					            inventory.InfestedFoundry.Resources ??= [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -240,7 +240,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            await inventory.save();
 | 
					            await inventory.save();
 | 
				
			||||||
            const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
 | 
					            const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
 | 
				
			||||||
            applyCheatsToInfestedFoundry(infestedFoundry);
 | 
					            applyCheatsToInfestedFoundry(inventory, infestedFoundry);
 | 
				
			||||||
            res.json({
 | 
					            res.json({
 | 
				
			||||||
                InventoryChanges: {
 | 
					                InventoryChanges: {
 | 
				
			||||||
                    InfestedFoundry: infestedFoundry
 | 
					                    InfestedFoundry: infestedFoundry
 | 
				
			||||||
@ -254,7 +254,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            const request = getJSONfromString<IHelminthSubsumeRequest>(String(req.body));
 | 
					            const request = getJSONfromString<IHelminthSubsumeRequest>(String(req.body));
 | 
				
			||||||
            const inventory = await getInventory(account._id.toString());
 | 
					            const inventory = await getInventory(account._id.toString());
 | 
				
			||||||
            const recipe = getRecipe(request.Recipe)!;
 | 
					            const recipe = getRecipe(request.Recipe)!;
 | 
				
			||||||
            if (!config.infiniteHelminthMaterials) {
 | 
					            if (!inventory.infiniteHelminthMaterials) {
 | 
				
			||||||
                for (const ingredient of recipe.secretIngredients!) {
 | 
					                for (const ingredient of recipe.secretIngredients!) {
 | 
				
			||||||
                    const resource = inventory.InfestedFoundry!.Resources!.find(x => x.ItemType == ingredient.ItemType);
 | 
					                    const resource = inventory.InfestedFoundry!.Resources!.find(x => x.ItemType == ingredient.ItemType);
 | 
				
			||||||
                    if (resource) {
 | 
					                    if (resource) {
 | 
				
			||||||
@ -280,7 +280,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            freeUpSlot(inventory, InventorySlot.SUITS);
 | 
					            freeUpSlot(inventory, InventorySlot.SUITS);
 | 
				
			||||||
            await inventory.save();
 | 
					            await inventory.save();
 | 
				
			||||||
            const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
 | 
					            const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
 | 
				
			||||||
            applyCheatsToInfestedFoundry(infestedFoundry);
 | 
					            applyCheatsToInfestedFoundry(inventory, infestedFoundry);
 | 
				
			||||||
            res.json({
 | 
					            res.json({
 | 
				
			||||||
                InventoryChanges: {
 | 
					                InventoryChanges: {
 | 
				
			||||||
                    Recipes: recipeChanges,
 | 
					                    Recipes: recipeChanges,
 | 
				
			||||||
@ -307,7 +307,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            const recipeChanges = handleSubsumeCompletion(inventory);
 | 
					            const recipeChanges = handleSubsumeCompletion(inventory);
 | 
				
			||||||
            await inventory.save();
 | 
					            await inventory.save();
 | 
				
			||||||
            const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
 | 
					            const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
 | 
				
			||||||
            applyCheatsToInfestedFoundry(infestedFoundry);
 | 
					            applyCheatsToInfestedFoundry(inventory, infestedFoundry);
 | 
				
			||||||
            res.json({
 | 
					            res.json({
 | 
				
			||||||
                InventoryChanges: {
 | 
					                InventoryChanges: {
 | 
				
			||||||
                    ...currencyChanges,
 | 
					                    ...currencyChanges,
 | 
				
			||||||
@ -328,7 +328,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            suit.UpgradesExpiry = upgradesExpiry;
 | 
					            suit.UpgradesExpiry = upgradesExpiry;
 | 
				
			||||||
            const recipeChanges = addInfestedFoundryXP(inventory.InfestedFoundry!, 4800_00);
 | 
					            const recipeChanges = addInfestedFoundryXP(inventory.InfestedFoundry!, 4800_00);
 | 
				
			||||||
            addRecipes(inventory, recipeChanges);
 | 
					            addRecipes(inventory, recipeChanges);
 | 
				
			||||||
            if (!config.infiniteHelminthMaterials) {
 | 
					            if (!inventory.infiniteHelminthMaterials) {
 | 
				
			||||||
                for (let i = 0; i != request.ResourceTypes.length; ++i) {
 | 
					                for (let i = 0; i != request.ResourceTypes.length; ++i) {
 | 
				
			||||||
                    inventory.InfestedFoundry!.Resources!.find(x => x.ItemType == request.ResourceTypes[i])!.Count -=
 | 
					                    inventory.InfestedFoundry!.Resources!.find(x => x.ItemType == request.ResourceTypes[i])!.Count -=
 | 
				
			||||||
                        request.ResourceCosts[i];
 | 
					                        request.ResourceCosts[i];
 | 
				
			||||||
@ -338,7 +338,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            inventory.InfestedFoundry!.InvigorationsApplied += 1;
 | 
					            inventory.InfestedFoundry!.InvigorationsApplied += 1;
 | 
				
			||||||
            await inventory.save();
 | 
					            await inventory.save();
 | 
				
			||||||
            const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
 | 
					            const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
 | 
				
			||||||
            applyCheatsToInfestedFoundry(infestedFoundry);
 | 
					            applyCheatsToInfestedFoundry(inventory, infestedFoundry);
 | 
				
			||||||
            res.json({
 | 
					            res.json({
 | 
				
			||||||
                SuitId: request.SuitId,
 | 
					                SuitId: request.SuitId,
 | 
				
			||||||
                OffensiveUpgrade: request.OffensiveUpgradeType,
 | 
					                OffensiveUpgrade: request.OffensiveUpgradeType,
 | 
				
			||||||
 | 
				
			|||||||
@ -295,17 +295,17 @@ export const getInventoryResponse = async (
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (config.infiniteCredits) {
 | 
					    if (inventory.infiniteCredits) {
 | 
				
			||||||
        inventoryResponse.RegularCredits = 999999999;
 | 
					        inventoryResponse.RegularCredits = 999999999;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (config.infinitePlatinum) {
 | 
					    if (inventory.infinitePlatinum) {
 | 
				
			||||||
        inventoryResponse.PremiumCreditsFree = 0;
 | 
					        inventoryResponse.PremiumCreditsFree = 0;
 | 
				
			||||||
        inventoryResponse.PremiumCredits = 999999999;
 | 
					        inventoryResponse.PremiumCredits = 999999999;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (config.infiniteEndo) {
 | 
					    if (inventory.infiniteEndo) {
 | 
				
			||||||
        inventoryResponse.FusionPoints = 999999999;
 | 
					        inventoryResponse.FusionPoints = 999999999;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (config.infiniteRegalAya) {
 | 
					    if (inventory.infiniteRegalAya) {
 | 
				
			||||||
        inventoryResponse.PrimeTokens = 999999999;
 | 
					        inventoryResponse.PrimeTokens = 999999999;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -450,7 +450,7 @@ export const getInventoryResponse = async (
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (inventoryResponse.InfestedFoundry) {
 | 
					    if (inventoryResponse.InfestedFoundry) {
 | 
				
			||||||
        applyCheatsToInfestedFoundry(inventoryResponse.InfestedFoundry);
 | 
					        applyCheatsToInfestedFoundry(inventory, inventoryResponse.InfestedFoundry);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Set 2FA enabled so trading post can be used
 | 
					    // Set 2FA enabled so trading post can be used
 | 
				
			||||||
 | 
				
			|||||||
@ -7,7 +7,6 @@ import { addMiscItems, addRecipes, getInventory, updateCurrency } from "@/src/se
 | 
				
			|||||||
import { getRecipeByResult } from "@/src/services/itemDataService";
 | 
					import { getRecipeByResult } from "@/src/services/itemDataService";
 | 
				
			||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
					import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
				
			||||||
import { addInfestedFoundryXP, applyCheatsToInfestedFoundry } from "@/src/services/infestedFoundryService";
 | 
					import { addInfestedFoundryXP, applyCheatsToInfestedFoundry } from "@/src/services/infestedFoundryService";
 | 
				
			||||||
import { config } from "@/src/services/configService";
 | 
					 | 
				
			||||||
import { sendWsBroadcastTo } from "@/src/services/wsService";
 | 
					import { sendWsBroadcastTo } from "@/src/services/wsService";
 | 
				
			||||||
import { EquipmentFeatures, IEquipmentDatabase } from "@/src/types/equipmentTypes";
 | 
					import { EquipmentFeatures, IEquipmentDatabase } from "@/src/types/equipmentTypes";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -52,7 +51,7 @@ export const upgradesController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
                const recipe = getRecipeByResult(operation.UpgradeRequirement)!;
 | 
					                const recipe = getRecipeByResult(operation.UpgradeRequirement)!;
 | 
				
			||||||
                for (const ingredient of recipe.ingredients) {
 | 
					                for (const ingredient of recipe.ingredients) {
 | 
				
			||||||
                    totalPercentagePointsConsumed += ingredient.ItemCount / 10;
 | 
					                    totalPercentagePointsConsumed += ingredient.ItemCount / 10;
 | 
				
			||||||
                    if (!config.infiniteHelminthMaterials) {
 | 
					                    if (!inventory.infiniteHelminthMaterials) {
 | 
				
			||||||
                        inventory.InfestedFoundry!.Resources!.find(x => x.ItemType == ingredient.ItemType)!.Count -=
 | 
					                        inventory.InfestedFoundry!.Resources!.find(x => x.ItemType == ingredient.ItemType)!.Count -=
 | 
				
			||||||
                            ingredient.ItemCount;
 | 
					                            ingredient.ItemCount;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@ -69,7 +68,7 @@ export const upgradesController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            inventoryChanges.Recipes = recipeChanges;
 | 
					            inventoryChanges.Recipes = recipeChanges;
 | 
				
			||||||
            inventoryChanges.InfestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry;
 | 
					            inventoryChanges.InfestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry;
 | 
				
			||||||
            applyCheatsToInfestedFoundry(inventoryChanges.InfestedFoundry!);
 | 
					            applyCheatsToInfestedFoundry(inventory, inventoryChanges.InfestedFoundry!);
 | 
				
			||||||
        } else
 | 
					        } else
 | 
				
			||||||
            switch (operation.UpgradeRequirement) {
 | 
					            switch (operation.UpgradeRequirement) {
 | 
				
			||||||
                case "/Lotus/Types/Items/MiscItems/OrokinReactor":
 | 
					                case "/Lotus/Types/Items/MiscItems/OrokinReactor":
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										18
									
								
								src/controllers/custom/setAccountCheatController.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/controllers/custom/setAccountCheatController.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					import { getInventory } from "@/src/services/inventoryService";
 | 
				
			||||||
 | 
					import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
				
			||||||
 | 
					import { IAccountCheats } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
				
			||||||
 | 
					import { RequestHandler } from "express";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const setAccountCheatController: RequestHandler = async (req, res) => {
 | 
				
			||||||
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
					    const payload = req.body as ISetAccountCheatRequest;
 | 
				
			||||||
 | 
					    const inventory = await getInventory(accountId, payload.key);
 | 
				
			||||||
 | 
					    inventory[payload.key] = payload.value;
 | 
				
			||||||
 | 
					    await inventory.save();
 | 
				
			||||||
 | 
					    res.end();
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface ISetAccountCheatRequest {
 | 
				
			||||||
 | 
					    key: keyof IAccountCheats;
 | 
				
			||||||
 | 
					    value: boolean;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -22,8 +22,11 @@ export interface INemesisManifest {
 | 
				
			|||||||
    ephemeraTypes?: Record<TInnateDamageTag, string>;
 | 
					    ephemeraTypes?: Record<TInnateDamageTag, string>;
 | 
				
			||||||
    firstKillReward: string;
 | 
					    firstKillReward: string;
 | 
				
			||||||
    firstConvertReward: string;
 | 
					    firstConvertReward: string;
 | 
				
			||||||
    messageTitle: string;
 | 
					    killMessageSubject: string;
 | 
				
			||||||
    messageBody: string;
 | 
					    killMessageBody: string;
 | 
				
			||||||
 | 
					    convertMessageSubject: string;
 | 
				
			||||||
 | 
					    convertMessageBody: string;
 | 
				
			||||||
 | 
					    convertMessageIcon: string;
 | 
				
			||||||
    minBuild: string;
 | 
					    minBuild: string;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -57,8 +60,11 @@ class KuvaLichManifest implements INemesisManifest {
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
    firstKillReward = "/Lotus/StoreItems/Upgrades/Skins/Clan/LichKillerBadgeItem";
 | 
					    firstKillReward = "/Lotus/StoreItems/Upgrades/Skins/Clan/LichKillerBadgeItem";
 | 
				
			||||||
    firstConvertReward = "/Lotus/StoreItems/Upgrades/Skins/Sigils/KuvaLichSigil";
 | 
					    firstConvertReward = "/Lotus/StoreItems/Upgrades/Skins/Sigils/KuvaLichSigil";
 | 
				
			||||||
    messageTitle = "/Lotus/Language/Inbox/VanquishKuvaMsgTitle";
 | 
					    killMessageSubject = "/Lotus/Language/Inbox/VanquishKuvaMsgTitle";
 | 
				
			||||||
    messageBody = "/Lotus/Language/Inbox/VanquishLichMsgBody";
 | 
					    killMessageBody = "/Lotus/Language/Inbox/VanquishLichMsgBody";
 | 
				
			||||||
 | 
					    convertMessageSubject = "/Lotus/Language/Kingpins/InboxKuvaConvertedSubject";
 | 
				
			||||||
 | 
					    convertMessageBody = "/Lotus/Language/Kingpins/InboxKuvaConvertedBody";
 | 
				
			||||||
 | 
					    convertMessageIcon = "/Lotus/Interface/Graphics/WorldStatePanel/Grineer.png";
 | 
				
			||||||
    minBuild = "2019.10.31.22.42"; // 26.0.0
 | 
					    minBuild = "2019.10.31.22.42"; // 26.0.0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -131,8 +137,11 @@ class LawyerManifest implements INemesisManifest {
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
    firstKillReward = "/Lotus/StoreItems/Upgrades/Skins/Clan/CorpusLichBadgeItem";
 | 
					    firstKillReward = "/Lotus/StoreItems/Upgrades/Skins/Clan/CorpusLichBadgeItem";
 | 
				
			||||||
    firstConvertReward = "/Lotus/StoreItems/Upgrades/Skins/Sigils/CorpusLichSigil";
 | 
					    firstConvertReward = "/Lotus/StoreItems/Upgrades/Skins/Sigils/CorpusLichSigil";
 | 
				
			||||||
    messageTitle = "/Lotus/Language/Inbox/VanquishLawyerMsgTitle";
 | 
					    killMessageSubject = "/Lotus/Language/Inbox/VanquishLawyerMsgTitle";
 | 
				
			||||||
    messageBody = "/Lotus/Language/Inbox/VanquishLichMsgBody";
 | 
					    killMessageBody = "/Lotus/Language/Inbox/VanquishLichMsgBody";
 | 
				
			||||||
 | 
					    convertMessageSubject = "/Lotus/Language/Kingpins/InboxSisterConvertedSubject";
 | 
				
			||||||
 | 
					    convertMessageBody = "/Lotus/Language/Kingpins/InboxSisterConvertedBody";
 | 
				
			||||||
 | 
					    convertMessageIcon = "/Lotus/Interface/Graphics/WorldStatePanel/Corpus.png";
 | 
				
			||||||
    minBuild = "2021.07.05.17.03"; // 30.5.0
 | 
					    minBuild = "2021.07.05.17.03"; // 30.5.0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -166,8 +175,11 @@ class InfestedLichManfest implements INemesisManifest {
 | 
				
			|||||||
    ephemeraChance = 0;
 | 
					    ephemeraChance = 0;
 | 
				
			||||||
    firstKillReward = "/Lotus/StoreItems/Upgrades/Skins/Sigils/InfLichVanquishedSigil";
 | 
					    firstKillReward = "/Lotus/StoreItems/Upgrades/Skins/Sigils/InfLichVanquishedSigil";
 | 
				
			||||||
    firstConvertReward = "/Lotus/StoreItems/Upgrades/Skins/Sigils/InfLichConvertedSigil";
 | 
					    firstConvertReward = "/Lotus/StoreItems/Upgrades/Skins/Sigils/InfLichConvertedSigil";
 | 
				
			||||||
    messageTitle = "/Lotus/Language/Inbox/VanquishBandMsgTitle";
 | 
					    killMessageSubject = "/Lotus/Language/Inbox/VanquishBandMsgTitle";
 | 
				
			||||||
    messageBody = "/Lotus/Language/Inbox/VanquishBandMsgBody";
 | 
					    killMessageBody = "/Lotus/Language/Inbox/VanquishBandMsgBody";
 | 
				
			||||||
 | 
					    convertMessageSubject = "/Lotus/Language/Kingpins/InboxBandConvertedSubject";
 | 
				
			||||||
 | 
					    convertMessageBody = "/Lotus/Language/Kingpins/InboxBandConvertedBody";
 | 
				
			||||||
 | 
					    convertMessageIcon = "/Lotus/Interface/Graphics/WorldStatePanel/Infested.png";
 | 
				
			||||||
    minBuild = "2025.03.18.09.51"; // 38.5.0
 | 
					    minBuild = "2025.03.18.09.51"; // 38.5.0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,17 @@
 | 
				
			|||||||
import { slotPurchaseNameToSlotName } from "@/src/services/purchaseService";
 | 
					import { SlotPurchase, SlotPurchaseName } from "@/src/types/purchaseTypes";
 | 
				
			||||||
import { SlotPurchaseName } from "@/src/types/purchaseTypes";
 | 
					
 | 
				
			||||||
 | 
					export const slotPurchaseNameToSlotName: SlotPurchase = {
 | 
				
			||||||
 | 
					    SuitSlotItem: { name: "SuitBin", purchaseQuantity: 1 },
 | 
				
			||||||
 | 
					    TwoSentinelSlotItem: { name: "SentinelBin", purchaseQuantity: 2 },
 | 
				
			||||||
 | 
					    TwoWeaponSlotItem: { name: "WeaponBin", purchaseQuantity: 2 },
 | 
				
			||||||
 | 
					    SpaceSuitSlotItem: { name: "SpaceSuitBin", purchaseQuantity: 1 },
 | 
				
			||||||
 | 
					    TwoSpaceWeaponSlotItem: { name: "SpaceWeaponBin", purchaseQuantity: 2 },
 | 
				
			||||||
 | 
					    MechSlotItem: { name: "MechBin", purchaseQuantity: 1 },
 | 
				
			||||||
 | 
					    TwoOperatorWeaponSlotItem: { name: "OperatorAmpBin", purchaseQuantity: 2 },
 | 
				
			||||||
 | 
					    RandomModSlotItem: { name: "RandomModBin", purchaseQuantity: 3 },
 | 
				
			||||||
 | 
					    TwoCrewShipSalvageSlotItem: { name: "CrewShipSalvageBin", purchaseQuantity: 2 },
 | 
				
			||||||
 | 
					    CrewMemberSlotItem: { name: "CrewMemberBin", purchaseQuantity: 1 }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const isSlotPurchaseName = (slotPurchaseName: string): slotPurchaseName is SlotPurchaseName => {
 | 
					export const isSlotPurchaseName = (slotPurchaseName: string): slotPurchaseName is SlotPurchaseName => {
 | 
				
			||||||
    return slotPurchaseName in slotPurchaseNameToSlotName;
 | 
					    return slotPurchaseName in slotPurchaseNameToSlotName;
 | 
				
			||||||
 | 
				
			|||||||
@ -1425,6 +1425,14 @@ const hubNpcCustomizationSchema = new Schema<IHubNpcCustomization>(
 | 
				
			|||||||
const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
 | 
					const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        accountOwnerId: Schema.Types.ObjectId,
 | 
					        accountOwnerId: Schema.Types.ObjectId,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // SNS account cheats
 | 
				
			||||||
 | 
					        infiniteCredits: Boolean,
 | 
				
			||||||
 | 
					        infinitePlatinum: Boolean,
 | 
				
			||||||
 | 
					        infiniteEndo: Boolean,
 | 
				
			||||||
 | 
					        infiniteRegalAya: Boolean,
 | 
				
			||||||
 | 
					        infiniteHelminthMaterials: Boolean,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        SubscribedToEmails: { type: Number, default: 0 },
 | 
					        SubscribedToEmails: { type: Number, default: 0 },
 | 
				
			||||||
        SubscribedToEmailsPersonalized: { type: Number, default: 0 },
 | 
					        SubscribedToEmailsPersonalized: { type: Number, default: 0 },
 | 
				
			||||||
        RewardSeed: BigInt,
 | 
					        RewardSeed: BigInt,
 | 
				
			||||||
 | 
				
			|||||||
@ -28,6 +28,7 @@ import { setBoosterController } from "@/src/controllers/custom/setBoosterControl
 | 
				
			|||||||
import { updateFingerprintController } from "@/src/controllers/custom/updateFingerprintController";
 | 
					import { updateFingerprintController } from "@/src/controllers/custom/updateFingerprintController";
 | 
				
			||||||
import { changeModularPartsController } from "@/src/controllers/custom/changeModularPartsController";
 | 
					import { changeModularPartsController } from "@/src/controllers/custom/changeModularPartsController";
 | 
				
			||||||
import { editSuitInvigorationUpgradeController } from "@/src/controllers/custom/editSuitInvigorationUpgradeController";
 | 
					import { editSuitInvigorationUpgradeController } from "@/src/controllers/custom/editSuitInvigorationUpgradeController";
 | 
				
			||||||
 | 
					import { setAccountCheatController } from "@/src/controllers/custom/setAccountCheatController";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { getConfigController, setConfigController } from "@/src/controllers/custom/configController";
 | 
					import { getConfigController, setConfigController } from "@/src/controllers/custom/configController";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -61,6 +62,7 @@ customRouter.post("/setBooster", setBoosterController);
 | 
				
			|||||||
customRouter.post("/updateFingerprint", updateFingerprintController);
 | 
					customRouter.post("/updateFingerprint", updateFingerprintController);
 | 
				
			||||||
customRouter.post("/changeModularParts", changeModularPartsController);
 | 
					customRouter.post("/changeModularParts", changeModularPartsController);
 | 
				
			||||||
customRouter.post("/editSuitInvigorationUpgrade", editSuitInvigorationUpgradeController);
 | 
					customRouter.post("/editSuitInvigorationUpgrade", editSuitInvigorationUpgradeController);
 | 
				
			||||||
 | 
					customRouter.post("/setAccountCheat", setAccountCheatController);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
customRouter.post("/getConfig", getConfigController);
 | 
					customRouter.post("/getConfig", getConfigController);
 | 
				
			||||||
customRouter.post("/setConfig", setConfigController);
 | 
					customRouter.post("/setConfig", setConfigController);
 | 
				
			||||||
 | 
				
			|||||||
@ -20,11 +20,6 @@ export interface IConfig {
 | 
				
			|||||||
    skipTutorial?: boolean;
 | 
					    skipTutorial?: boolean;
 | 
				
			||||||
    skipAllDialogue?: boolean;
 | 
					    skipAllDialogue?: boolean;
 | 
				
			||||||
    unlockAllScans?: boolean;
 | 
					    unlockAllScans?: boolean;
 | 
				
			||||||
    infiniteCredits?: boolean;
 | 
					 | 
				
			||||||
    infinitePlatinum?: boolean;
 | 
					 | 
				
			||||||
    infiniteEndo?: boolean;
 | 
					 | 
				
			||||||
    infiniteRegalAya?: boolean;
 | 
					 | 
				
			||||||
    infiniteHelminthMaterials?: boolean;
 | 
					 | 
				
			||||||
    claimingBlueprintRefundsIngredients?: boolean;
 | 
					    claimingBlueprintRefundsIngredients?: boolean;
 | 
				
			||||||
    dontSubtractPurchaseCreditCost?: boolean;
 | 
					    dontSubtractPurchaseCreditCost?: boolean;
 | 
				
			||||||
    dontSubtractPurchasePlatinumCost?: boolean;
 | 
					    dontSubtractPurchasePlatinumCost?: boolean;
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,11 @@
 | 
				
			|||||||
import { ExportRecipes } from "warframe-public-export-plus";
 | 
					import { ExportRecipes } from "warframe-public-export-plus";
 | 
				
			||||||
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
 | 
					import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
 | 
				
			||||||
import { IInfestedFoundryClient, IInfestedFoundryDatabase } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import {
 | 
				
			||||||
 | 
					    IAccountCheats,
 | 
				
			||||||
 | 
					    IInfestedFoundryClient,
 | 
				
			||||||
 | 
					    IInfestedFoundryDatabase
 | 
				
			||||||
 | 
					} from "@/src/types/inventoryTypes/inventoryTypes";
 | 
				
			||||||
import { addRecipes } from "@/src/services/inventoryService";
 | 
					import { addRecipes } from "@/src/services/inventoryService";
 | 
				
			||||||
import { config } from "@/src/services/configService";
 | 
					 | 
				
			||||||
import { ITypeCount } from "@/src/types/commonTypes";
 | 
					import { ITypeCount } from "@/src/types/commonTypes";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const addInfestedFoundryXP = (infestedFoundry: IInfestedFoundryDatabase, delta: number): ITypeCount[] => {
 | 
					export const addInfestedFoundryXP = (infestedFoundry: IInfestedFoundryDatabase, delta: number): ITypeCount[] => {
 | 
				
			||||||
@ -97,8 +100,8 @@ export const handleSubsumeCompletion = (inventory: TInventoryDatabaseDocument):
 | 
				
			|||||||
    return recipeChanges;
 | 
					    return recipeChanges;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const applyCheatsToInfestedFoundry = (infestedFoundry: IInfestedFoundryClient): void => {
 | 
					export const applyCheatsToInfestedFoundry = (cheats: IAccountCheats, infestedFoundry: IInfestedFoundryClient): void => {
 | 
				
			||||||
    if (config.infiniteHelminthMaterials) {
 | 
					    if (cheats.infiniteHelminthMaterials) {
 | 
				
			||||||
        infestedFoundry.Resources = [
 | 
					        infestedFoundry.Resources = [
 | 
				
			||||||
            { ItemType: "/Lotus/Types/Items/InfestedFoundry/HelminthCalx", Count: 1000 },
 | 
					            { ItemType: "/Lotus/Types/Items/InfestedFoundry/HelminthCalx", Count: 1000 },
 | 
				
			||||||
            { ItemType: "/Lotus/Types/Items/InfestedFoundry/HelminthBiotics", Count: 1000 },
 | 
					            { ItemType: "/Lotus/Types/Items/InfestedFoundry/HelminthBiotics", Count: 1000 },
 | 
				
			||||||
 | 
				
			|||||||
@ -1201,8 +1201,8 @@ export const updateSlots = (
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const isCurrencyTracked = (usePremium: boolean): boolean => {
 | 
					const isCurrencyTracked = (inventory: TInventoryDatabaseDocument, usePremium: boolean): boolean => {
 | 
				
			||||||
    return usePremium ? !config.infinitePlatinum : !config.infiniteCredits;
 | 
					    return usePremium ? !inventory.infinitePlatinum : !inventory.infiniteCredits;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const updateCurrency = (
 | 
					export const updateCurrency = (
 | 
				
			||||||
@ -1211,7 +1211,7 @@ export const updateCurrency = (
 | 
				
			|||||||
    usePremium: boolean,
 | 
					    usePremium: boolean,
 | 
				
			||||||
    inventoryChanges: IInventoryChanges = {}
 | 
					    inventoryChanges: IInventoryChanges = {}
 | 
				
			||||||
): IInventoryChanges => {
 | 
					): IInventoryChanges => {
 | 
				
			||||||
    if (price != 0 && isCurrencyTracked(usePremium)) {
 | 
					    if (price != 0 && isCurrencyTracked(inventory, usePremium)) {
 | 
				
			||||||
        if (usePremium) {
 | 
					        if (usePremium) {
 | 
				
			||||||
            if (inventory.PremiumCreditsFree > 0) {
 | 
					            if (inventory.PremiumCreditsFree > 0) {
 | 
				
			||||||
                const premiumCreditsFreeDelta = Math.min(price, inventory.PremiumCreditsFree) * -1;
 | 
					                const premiumCreditsFreeDelta = Math.min(price, inventory.PremiumCreditsFree) * -1;
 | 
				
			||||||
 | 
				
			|||||||
@ -841,26 +841,24 @@ export const addMissionInventoryUpdates = async (
 | 
				
			|||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if (value.killed) {
 | 
					                    await createMessage(inventory.accountOwnerId, [
 | 
				
			||||||
                        await createMessage(inventory.accountOwnerId, [
 | 
					                        {
 | 
				
			||||||
                            {
 | 
					                            sndr: value.killed ? "/Lotus/Language/Bosses/Ordis" : value.nemesisName,
 | 
				
			||||||
                                sndr: "/Lotus/Language/Bosses/Ordis",
 | 
					                            msg: value.killed ? manifest.killMessageBody : manifest.convertMessageBody,
 | 
				
			||||||
                                msg: manifest.messageBody,
 | 
					                            arg: [
 | 
				
			||||||
                                arg: [
 | 
					                                {
 | 
				
			||||||
                                    {
 | 
					                                    Key: "LICH_NAME",
 | 
				
			||||||
                                        Key: "LICH_NAME",
 | 
					                                    Tag: value.nemesisName
 | 
				
			||||||
                                        Tag: value.nemesisName
 | 
					                                }
 | 
				
			||||||
                                    }
 | 
					                            ],
 | 
				
			||||||
                                ],
 | 
					                            att: att,
 | 
				
			||||||
                                att: att,
 | 
					                            countedAtt: countedAtt,
 | 
				
			||||||
                                countedAtt: countedAtt,
 | 
					                            attVisualOnly: true,
 | 
				
			||||||
                                attVisualOnly: true,
 | 
					                            sub: value.killed ? manifest.killMessageSubject : manifest.convertMessageSubject,
 | 
				
			||||||
                                sub: manifest.messageTitle,
 | 
					                            icon: value.killed ? "/Lotus/Interface/Icons/Npcs/Ordis.png" : manifest.convertMessageIcon,
 | 
				
			||||||
                                icon: "/Lotus/Interface/Icons/Npcs/Ordis.png",
 | 
					                            highPriority: true
 | 
				
			||||||
                                highPriority: true
 | 
					                        }
 | 
				
			||||||
                            }
 | 
					                    ]);
 | 
				
			||||||
                        ]);
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    inventory.Nemesis = undefined;
 | 
					                    inventory.Nemesis = undefined;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
import { parseSlotPurchaseName } from "@/src/helpers/purchaseHelpers";
 | 
					import { parseSlotPurchaseName, slotPurchaseNameToSlotName } from "@/src/helpers/purchaseHelpers";
 | 
				
			||||||
import { getSubstringFromKeyword } from "@/src/helpers/stringHelpers";
 | 
					import { getSubstringFromKeyword } from "@/src/helpers/stringHelpers";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    addBooster,
 | 
					    addBooster,
 | 
				
			||||||
@ -14,7 +14,6 @@ import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
				
			|||||||
import {
 | 
					import {
 | 
				
			||||||
    IPurchaseRequest,
 | 
					    IPurchaseRequest,
 | 
				
			||||||
    IPurchaseResponse,
 | 
					    IPurchaseResponse,
 | 
				
			||||||
    SlotPurchase,
 | 
					 | 
				
			||||||
    IInventoryChanges,
 | 
					    IInventoryChanges,
 | 
				
			||||||
    PurchaseSource,
 | 
					    PurchaseSource,
 | 
				
			||||||
    IPurchaseParams
 | 
					    IPurchaseParams
 | 
				
			||||||
@ -328,7 +327,7 @@ export const handlePurchase = async (
 | 
				
			|||||||
                        purchaseResponse.InventoryChanges.MiscItems ??= [];
 | 
					                        purchaseResponse.InventoryChanges.MiscItems ??= [];
 | 
				
			||||||
                        purchaseResponse.InventoryChanges.MiscItems.push(invItem);
 | 
					                        purchaseResponse.InventoryChanges.MiscItems.push(invItem);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                } else if (!config.infiniteRegalAya) {
 | 
					                } else if (!inventory.infiniteRegalAya) {
 | 
				
			||||||
                    inventory.PrimeTokens -= offer.PrimePrice! * purchaseRequest.PurchaseParams.Quantity;
 | 
					                    inventory.PrimeTokens -= offer.PrimePrice! * purchaseRequest.PurchaseParams.Quantity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    purchaseResponse.InventoryChanges.PrimeTokens ??= 0;
 | 
					                    purchaseResponse.InventoryChanges.PrimeTokens ??= 0;
 | 
				
			||||||
@ -472,19 +471,6 @@ export const handleStoreItemAcquisition = async (
 | 
				
			|||||||
    return purchaseResponse;
 | 
					    return purchaseResponse;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const slotPurchaseNameToSlotName: SlotPurchase = {
 | 
					 | 
				
			||||||
    SuitSlotItem: { name: "SuitBin", purchaseQuantity: 1 },
 | 
					 | 
				
			||||||
    TwoSentinelSlotItem: { name: "SentinelBin", purchaseQuantity: 2 },
 | 
					 | 
				
			||||||
    TwoWeaponSlotItem: { name: "WeaponBin", purchaseQuantity: 2 },
 | 
					 | 
				
			||||||
    SpaceSuitSlotItem: { name: "SpaceSuitBin", purchaseQuantity: 1 },
 | 
					 | 
				
			||||||
    TwoSpaceWeaponSlotItem: { name: "SpaceWeaponBin", purchaseQuantity: 2 },
 | 
					 | 
				
			||||||
    MechSlotItem: { name: "MechBin", purchaseQuantity: 1 },
 | 
					 | 
				
			||||||
    TwoOperatorWeaponSlotItem: { name: "OperatorAmpBin", purchaseQuantity: 2 },
 | 
					 | 
				
			||||||
    RandomModSlotItem: { name: "RandomModBin", purchaseQuantity: 3 },
 | 
					 | 
				
			||||||
    TwoCrewShipSalvageSlotItem: { name: "CrewShipSalvageBin", purchaseQuantity: 2 },
 | 
					 | 
				
			||||||
    CrewMemberSlotItem: { name: "CrewMemberBin", purchaseQuantity: 1 }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// // extra = everything above the base +2 slots (depending on slot type)
 | 
					// // extra = everything above the base +2 slots (depending on slot type)
 | 
				
			||||||
// // new slot above base = extra + 1 and slots +1
 | 
					// // new slot above base = extra + 1 and slots +1
 | 
				
			||||||
// // new frame = slots -1
 | 
					// // new frame = slots -1
 | 
				
			||||||
 | 
				
			|||||||
@ -19,6 +19,15 @@ export type InventoryDatabaseEquipment = {
 | 
				
			|||||||
    [_ in TEquipmentKey]: IEquipmentDatabase[];
 | 
					    [_ in TEquipmentKey]: IEquipmentDatabase[];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Fields specific to SNS
 | 
				
			||||||
 | 
					export interface IAccountCheats {
 | 
				
			||||||
 | 
					    infiniteCredits?: boolean;
 | 
				
			||||||
 | 
					    infinitePlatinum?: boolean;
 | 
				
			||||||
 | 
					    infiniteEndo?: boolean;
 | 
				
			||||||
 | 
					    infiniteRegalAya?: boolean;
 | 
				
			||||||
 | 
					    infiniteHelminthMaterials?: boolean;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface IInventoryDatabase
 | 
					export interface IInventoryDatabase
 | 
				
			||||||
    extends Omit<
 | 
					    extends Omit<
 | 
				
			||||||
            IInventoryClient,
 | 
					            IInventoryClient,
 | 
				
			||||||
@ -61,7 +70,8 @@ export interface IInventoryDatabase
 | 
				
			|||||||
            | "PersonalGoalProgress"
 | 
					            | "PersonalGoalProgress"
 | 
				
			||||||
            | TEquipmentKey
 | 
					            | TEquipmentKey
 | 
				
			||||||
        >,
 | 
					        >,
 | 
				
			||||||
        InventoryDatabaseEquipment {
 | 
					        InventoryDatabaseEquipment,
 | 
				
			||||||
 | 
					        IAccountCheats {
 | 
				
			||||||
    accountOwnerId: Types.ObjectId;
 | 
					    accountOwnerId: Types.ObjectId;
 | 
				
			||||||
    Created: Date;
 | 
					    Created: Date;
 | 
				
			||||||
    TrainingDate: Date;
 | 
					    TrainingDate: Date;
 | 
				
			||||||
 | 
				
			|||||||
@ -663,26 +663,6 @@
 | 
				
			|||||||
                                        <input class="form-check-input" type="checkbox" id="unlockAllScans" />
 | 
					                                        <input class="form-check-input" type="checkbox" id="unlockAllScans" />
 | 
				
			||||||
                                        <label class="form-check-label" for="unlockAllScans" data-loc="cheats_unlockAllScans"></label>
 | 
					                                        <label class="form-check-label" for="unlockAllScans" data-loc="cheats_unlockAllScans"></label>
 | 
				
			||||||
                                    </div>
 | 
					                                    </div>
 | 
				
			||||||
                                    <div class="form-check">
 | 
					 | 
				
			||||||
                                        <input class="form-check-input" type="checkbox" id="infiniteCredits" />
 | 
					 | 
				
			||||||
                                        <label class="form-check-label" for="infiniteCredits" data-loc="cheats_infiniteCredits"></label>
 | 
					 | 
				
			||||||
                                    </div>
 | 
					 | 
				
			||||||
                                    <div class="form-check">
 | 
					 | 
				
			||||||
                                        <input class="form-check-input" type="checkbox" id="infinitePlatinum" />
 | 
					 | 
				
			||||||
                                        <label class="form-check-label" for="infinitePlatinum" data-loc="cheats_infinitePlatinum"></label>
 | 
					 | 
				
			||||||
                                    </div>
 | 
					 | 
				
			||||||
                                    <div class="form-check">
 | 
					 | 
				
			||||||
                                        <input class="form-check-input" type="checkbox" id="infiniteEndo" />
 | 
					 | 
				
			||||||
                                        <label class="form-check-label" for="infiniteEndo" data-loc="cheats_infiniteEndo"></label>
 | 
					 | 
				
			||||||
                                    </div>
 | 
					 | 
				
			||||||
                                    <div class="form-check">
 | 
					 | 
				
			||||||
                                        <input class="form-check-input" type="checkbox" id="infiniteRegalAya" />
 | 
					 | 
				
			||||||
                                        <label class="form-check-label" for="infiniteRegalAya" data-loc="cheats_infiniteRegalAya"></label>
 | 
					 | 
				
			||||||
                                    </div>
 | 
					 | 
				
			||||||
                                    <div class="form-check">
 | 
					 | 
				
			||||||
                                        <input class="form-check-input" type="checkbox" id="infiniteHelminthMaterials" />
 | 
					 | 
				
			||||||
                                        <label class="form-check-label" for="infiniteHelminthMaterials" data-loc="cheats_infiniteHelminthMaterials"></label>
 | 
					 | 
				
			||||||
                                    </div>
 | 
					 | 
				
			||||||
                                    <div class="form-check">
 | 
					                                    <div class="form-check">
 | 
				
			||||||
                                        <input class="form-check-input" type="checkbox" id="claimingBlueprintRefundsIngredients" />
 | 
					                                        <input class="form-check-input" type="checkbox" id="claimingBlueprintRefundsIngredients" />
 | 
				
			||||||
                                        <label class="form-check-label" for="claimingBlueprintRefundsIngredients" data-loc="cheats_claimingBlueprintRefundsIngredients"></label>
 | 
					                                        <label class="form-check-label" for="claimingBlueprintRefundsIngredients" data-loc="cheats_claimingBlueprintRefundsIngredients"></label>
 | 
				
			||||||
@ -891,8 +871,28 @@
 | 
				
			|||||||
                    <div class="col-md-6">
 | 
					                    <div class="col-md-6">
 | 
				
			||||||
                        <div class="card mb-3">
 | 
					                        <div class="card mb-3">
 | 
				
			||||||
                            <h5 class="card-header" data-loc="cheats_account"></h5>
 | 
					                            <h5 class="card-header" data-loc="cheats_account"></h5>
 | 
				
			||||||
                            <div class="card-body">
 | 
					                            <div class="card-body" id="account-cheats">
 | 
				
			||||||
                                <div class="mb-2 d-flex flex-wrap gap-2">
 | 
					                                <div class="form-check">
 | 
				
			||||||
 | 
					                                    <input class="form-check-input" type="checkbox" id="infiniteCredits" />
 | 
				
			||||||
 | 
					                                    <label class="form-check-label" for="infiniteCredits" data-loc="cheats_infiniteCredits"></label>
 | 
				
			||||||
 | 
					                                </div>
 | 
				
			||||||
 | 
					                                <div class="form-check">
 | 
				
			||||||
 | 
					                                    <input class="form-check-input" type="checkbox" id="infinitePlatinum" />
 | 
				
			||||||
 | 
					                                    <label class="form-check-label" for="infinitePlatinum" data-loc="cheats_infinitePlatinum"></label>
 | 
				
			||||||
 | 
					                                </div>
 | 
				
			||||||
 | 
					                                <div class="form-check">
 | 
				
			||||||
 | 
					                                    <input class="form-check-input" type="checkbox" id="infiniteEndo" />
 | 
				
			||||||
 | 
					                                    <label class="form-check-label" for="infiniteEndo" data-loc="cheats_infiniteEndo"></label>
 | 
				
			||||||
 | 
					                                </div>
 | 
				
			||||||
 | 
					                                <div class="form-check">
 | 
				
			||||||
 | 
					                                    <input class="form-check-input" type="checkbox" id="infiniteRegalAya" />
 | 
				
			||||||
 | 
					                                    <label class="form-check-label" for="infiniteRegalAya" data-loc="cheats_infiniteRegalAya"></label>
 | 
				
			||||||
 | 
					                                </div>
 | 
				
			||||||
 | 
					                                <div class="form-check">
 | 
				
			||||||
 | 
					                                    <input class="form-check-input" type="checkbox" id="infiniteHelminthMaterials" />
 | 
				
			||||||
 | 
					                                    <label class="form-check-label" for="infiniteHelminthMaterials" data-loc="cheats_infiniteHelminthMaterials"></label>
 | 
				
			||||||
 | 
					                                </div>
 | 
				
			||||||
 | 
					                                <div class="mt-2 mb-2 d-flex flex-wrap gap-2">
 | 
				
			||||||
                                    <button class="btn btn-primary" onclick="debounce(doUnlockAllMissions);" data-loc="cheats_unlockAllMissions"></button>
 | 
					                                    <button class="btn btn-primary" onclick="debounce(doUnlockAllMissions);" data-loc="cheats_unlockAllMissions"></button>
 | 
				
			||||||
                                    <button class="btn btn-primary" onclick="debounce(markAllAsRead);" data-loc="cheats_markAllAsRead"></button>
 | 
					                                    <button class="btn btn-primary" onclick="debounce(markAllAsRead);" data-loc="cheats_markAllAsRead"></button>
 | 
				
			||||||
                                    <button class="btn btn-primary" onclick="doUnlockAllFocusSchools();" data-loc="cheats_unlockAllFocusSchools"></button>
 | 
					                                    <button class="btn btn-primary" onclick="doUnlockAllFocusSchools();" data-loc="cheats_unlockAllFocusSchools"></button>
 | 
				
			||||||
 | 
				
			|||||||
@ -605,6 +605,8 @@ function fetchItemList() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
fetchItemList();
 | 
					fetchItemList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const accountCheats = document.querySelectorAll("#account-cheats input[id]");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Assumes that caller revalidates authz
 | 
					// Assumes that caller revalidates authz
 | 
				
			||||||
function updateInventory() {
 | 
					function updateInventory() {
 | 
				
			||||||
    const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
 | 
					    const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
 | 
				
			||||||
@ -1473,6 +1475,10 @@ function updateInventory() {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                document.getElementById("Boosters-list").appendChild(tr);
 | 
					                document.getElementById("Boosters-list").appendChild(tr);
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for (const elm of accountCheats) {
 | 
				
			||||||
 | 
					                elm.checked = !!data[elm.id];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -2109,6 +2115,8 @@ function doAcquireModMax() {
 | 
				
			|||||||
    alert("doAcquireModMax: " + uniqueName);
 | 
					    alert("doAcquireModMax: " + uniqueName);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Cheats route
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const uiConfigs = [...$(".config-form input[id], .config-form select[id]")].map(x => x.id);
 | 
					const uiConfigs = [...$(".config-form input[id], .config-form select[id]")].map(x => x.id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
for (const id of uiConfigs) {
 | 
					for (const id of uiConfigs) {
 | 
				
			||||||
@ -2193,8 +2201,6 @@ function doSaveConfigStringArray(id) {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Cheats route
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
single.getRoute("/webui/cheats").on("beforeload", function () {
 | 
					single.getRoute("/webui/cheats").on("beforeload", function () {
 | 
				
			||||||
    let interval;
 | 
					    let interval;
 | 
				
			||||||
    interval = setInterval(() => {
 | 
					    interval = setInterval(() => {
 | 
				
			||||||
@ -2306,6 +2312,23 @@ function doIntrinsicsUnlockAll() {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					document.querySelectorAll("#account-cheats input[type=checkbox]").forEach(elm => {
 | 
				
			||||||
 | 
					    elm.onchange = function () {
 | 
				
			||||||
 | 
					        revalidateAuthz().then(() => {
 | 
				
			||||||
 | 
					            $.post({
 | 
				
			||||||
 | 
					                url: "/custom/setAccountCheat?" + window.authz /*+ "&wsid=" + wsid*/,
 | 
				
			||||||
 | 
					                contentType: "application/json",
 | 
				
			||||||
 | 
					                data: JSON.stringify({
 | 
				
			||||||
 | 
					                    key: elm.id,
 | 
				
			||||||
 | 
					                    value: elm.checked
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Mods route
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function doAddAllMods() {
 | 
					function doAddAllMods() {
 | 
				
			||||||
    let modsAll = new Set();
 | 
					    let modsAll = new Set();
 | 
				
			||||||
    for (const child of document.getElementById("datalist-mods").children) {
 | 
					    for (const child of document.getElementById("datalist-mods").children) {
 | 
				
			||||||
 | 
				
			|||||||
@ -36,7 +36,7 @@ dict = {
 | 
				
			|||||||
    code_succRemoved: `Eliminado exitosamente.`,
 | 
					    code_succRemoved: `Eliminado exitosamente.`,
 | 
				
			||||||
    code_buffsNumber: `Cantidad de mejoras`,
 | 
					    code_buffsNumber: `Cantidad de mejoras`,
 | 
				
			||||||
    code_cursesNumber: `Cantidad de maldiciones`,
 | 
					    code_cursesNumber: `Cantidad de maldiciones`,
 | 
				
			||||||
    code_rerollsNumber: `Cantidad de reintentos`,
 | 
					    code_rerollsNumber: `Cantidad de rerolls`,
 | 
				
			||||||
    code_viewStats: `Ver estadísticas`,
 | 
					    code_viewStats: `Ver estadísticas`,
 | 
				
			||||||
    code_rank: `Rango`,
 | 
					    code_rank: `Rango`,
 | 
				
			||||||
    code_rankUp: `Subir de rango`,
 | 
					    code_rankUp: `Subir de rango`,
 | 
				
			||||||
@ -121,11 +121,11 @@ dict = {
 | 
				
			|||||||
    currency_PrimeTokens: `Aya Real`,
 | 
					    currency_PrimeTokens: `Aya Real`,
 | 
				
			||||||
    currency_owned: `Tienes |COUNT|.`,
 | 
					    currency_owned: `Tienes |COUNT|.`,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    detailedView_archonShardsLabel: `Ranuras de Fragmento de Archón`,
 | 
					    detailedView_archonShardsLabel: `Ranuras de Fragmento de Arconte`,
 | 
				
			||||||
    detailedView_archonShardsDescription: `Puedes usar estas ranuras ilimitadas para aplicar una amplia variedad de mejoras`,
 | 
					    detailedView_archonShardsDescription: `Puedes usar estas ranuras ilimitadas para aplicar una amplia variedad de mejoras`,
 | 
				
			||||||
    detailedView_archonShardsDescription2: `Ten en cuenta que cada fragmento de archón tarda un poco en aplicarse al cargar`,
 | 
					    detailedView_archonShardsDescription2: `Ten en cuenta que cada fragmento de arconte tarda un poco en aplicarse al cargar`,
 | 
				
			||||||
    detailedView_valenceBonusLabel: `Bônus de Valência`,
 | 
					    detailedView_valenceBonusLabel: `Bonus de Valéncia`,
 | 
				
			||||||
    detailedView_valenceBonusDescription: `Puedes establecer o quitar el bono de valencia de tu arma.`,
 | 
					    detailedView_valenceBonusDescription: `Puedes establecer o quitar el bonus de valencia de tu arma.`,
 | 
				
			||||||
    detailedView_modularPartsLabel: `Cambiar partes modulares`,
 | 
					    detailedView_modularPartsLabel: `Cambiar partes modulares`,
 | 
				
			||||||
    detailedView_suitInvigorationLabel: `Vigorización de Warframe`,
 | 
					    detailedView_suitInvigorationLabel: `Vigorización de Warframe`,
 | 
				
			||||||
    detailedView_loadoutLabel: `Equipamientos`,
 | 
					    detailedView_loadoutLabel: `Equipamientos`,
 | 
				
			||||||
@ -156,7 +156,7 @@ dict = {
 | 
				
			|||||||
    invigorations_defensiveLabel: `Mejora Defensiva`,
 | 
					    invigorations_defensiveLabel: `Mejora Defensiva`,
 | 
				
			||||||
    invigorations_expiryLabel: `Caducidad de Mejoras (opcional)`,
 | 
					    invigorations_expiryLabel: `Caducidad de Mejoras (opcional)`,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    abilityOverride_label: `Anulación de Habilidad`,
 | 
					    abilityOverride_label: `Intercambio de Habilidad`,
 | 
				
			||||||
    abilityOverride_onSlot: `en el espacio`,
 | 
					    abilityOverride_onSlot: `en el espacio`,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    mods_addRiven: `Agregar Agrietado`,
 | 
					    mods_addRiven: `Agregar Agrietado`,
 | 
				
			||||||
@ -180,18 +180,18 @@ dict = {
 | 
				
			|||||||
    cheats_infiniteEndo: `Endo infinito`,
 | 
					    cheats_infiniteEndo: `Endo infinito`,
 | 
				
			||||||
    cheats_infiniteRegalAya: `Aya Real infinita`,
 | 
					    cheats_infiniteRegalAya: `Aya Real infinita`,
 | 
				
			||||||
    cheats_infiniteHelminthMaterials: `Materiales Helminto infinitos`,
 | 
					    cheats_infiniteHelminthMaterials: `Materiales Helminto infinitos`,
 | 
				
			||||||
    cheats_claimingBlueprintRefundsIngredients: `Reclamar ingredientes devueltos por planos`,
 | 
					    cheats_claimingBlueprintRefundsIngredients: `Reclamar planos devuelve los ingredientes`,
 | 
				
			||||||
    cheats_dontSubtractPurchaseCreditCost: `No restar costo en créditos de la compra`,
 | 
					    cheats_dontSubtractPurchaseCreditCost: `No restar costo en créditos al comprar`,
 | 
				
			||||||
    cheats_dontSubtractPurchasePlatinumCost: `No restar costo en platino de la compra`,
 | 
					    cheats_dontSubtractPurchasePlatinumCost: `No restar costo en platino al comprar`,
 | 
				
			||||||
    cheats_dontSubtractPurchaseItemCost: `No restar costo de ítem en la compra`,
 | 
					    cheats_dontSubtractPurchaseItemCost: `No restar costo de ítem al comprar`,
 | 
				
			||||||
    cheats_dontSubtractPurchaseStandingCost: `No restar costo en reputación de la compra`,
 | 
					    cheats_dontSubtractPurchaseStandingCost: `No restar costo en reputación al comprar`,
 | 
				
			||||||
    cheats_dontSubtractVoidTraces: `No descontar vestigios del Vacío`,
 | 
					    cheats_dontSubtractVoidTraces: `No descontar vestigios del Vacío`,
 | 
				
			||||||
    cheats_dontSubtractConsumables: `No restar consumibles`,
 | 
					    cheats_dontSubtractConsumables: `No restar consumibles`,
 | 
				
			||||||
    cheats_unlockAllShipFeatures: `Desbloquear todas las funciones de nave`,
 | 
					    cheats_unlockAllShipFeatures: `Desbloquear todas las funciones de nave`,
 | 
				
			||||||
    cheats_unlockAllShipDecorations: `Desbloquear todas las decoraciones de nave`,
 | 
					    cheats_unlockAllShipDecorations: `Desbloquear todas las decoraciones de nave`,
 | 
				
			||||||
    cheats_unlockAllFlavourItems: `Desbloquear todos los <abbr title="Conjuntos de animaciones, glifos, paletas, etc.">ítems estéticos</abbr>`,
 | 
					    cheats_unlockAllFlavourItems: `Desbloquear todos los <abbr title="Conjuntos de animaciones, glifos, paletas, etc.">ítems estéticos</abbr>`,
 | 
				
			||||||
    cheats_unlockAllSkins: `Desbloquear todas las apariencias`,
 | 
					    cheats_unlockAllSkins: `Desbloquear todas las skins`,
 | 
				
			||||||
    cheats_unlockAllCapturaScenes: `Desbloquear todas las escenas Captura`,
 | 
					    cheats_unlockAllCapturaScenes: `Desbloquear todas las escenas de Captura`,
 | 
				
			||||||
    cheats_unlockAllDecoRecipes: `Desbloquear todas las recetas decorativas del dojo`,
 | 
					    cheats_unlockAllDecoRecipes: `Desbloquear todas las recetas decorativas del dojo`,
 | 
				
			||||||
    cheats_universalPolarityEverywhere: `Polaridad universal en todas partes`,
 | 
					    cheats_universalPolarityEverywhere: `Polaridad universal en todas partes`,
 | 
				
			||||||
    cheats_unlockDoubleCapacityPotatoesEverywhere: `Patatas en todas partes`,
 | 
					    cheats_unlockDoubleCapacityPotatoesEverywhere: `Patatas en todas partes`,
 | 
				
			||||||
@ -208,7 +208,7 @@ dict = {
 | 
				
			|||||||
    cheats_baroAlwaysAvailable: `Baro siempre disponible`,
 | 
					    cheats_baroAlwaysAvailable: `Baro siempre disponible`,
 | 
				
			||||||
    cheats_baroFullyStocked: `Baro con stock completo`,
 | 
					    cheats_baroFullyStocked: `Baro con stock completo`,
 | 
				
			||||||
    cheats_syndicateMissionsRepeatable: `Misiones de sindicato rejugables`,
 | 
					    cheats_syndicateMissionsRepeatable: `Misiones de sindicato rejugables`,
 | 
				
			||||||
    cheats_unlockAllProfitTakerStages: `Deslobquea todas las etapas del Roba-ganancias`,
 | 
					    cheats_unlockAllProfitTakerStages: `Desbloquea todas las etapas del Roba-ganancias`,
 | 
				
			||||||
    cheats_instantFinishRivenChallenge: `Terminar desafío de agrietado inmediatamente`,
 | 
					    cheats_instantFinishRivenChallenge: `Terminar desafío de agrietado inmediatamente`,
 | 
				
			||||||
    cheats_instantResourceExtractorDrones: `Drones de extracción de recursos instantáneos`,
 | 
					    cheats_instantResourceExtractorDrones: `Drones de extracción de recursos instantáneos`,
 | 
				
			||||||
    cheats_noResourceExtractorDronesDamage: `Sin daño a los drones extractores de recursos`,
 | 
					    cheats_noResourceExtractorDronesDamage: `Sin daño a los drones extractores de recursos`,
 | 
				
			||||||
@ -249,17 +249,17 @@ dict = {
 | 
				
			|||||||
    worldState_ghoulEmergence: `Purga de Gules`,
 | 
					    worldState_ghoulEmergence: `Purga de Gules`,
 | 
				
			||||||
    worldState_plagueStar: `Estrella Infestada`,
 | 
					    worldState_plagueStar: `Estrella Infestada`,
 | 
				
			||||||
    worldState_dogDays: `Canícula`,
 | 
					    worldState_dogDays: `Canícula`,
 | 
				
			||||||
    worldState_dogDaysRewards: `[UNTRANSLATED] Dog Days Rewards`,
 | 
					    worldState_dogDaysRewards: `Recompensas de Canícula`,
 | 
				
			||||||
    worldState_wolfHunt: `Cacería del Lobo (2025)`,
 | 
					    worldState_wolfHunt: `Cacería del Lobo (2025)`,
 | 
				
			||||||
    worldState_longShadow: `Sombra Prolongada`,
 | 
					    worldState_longShadow: `Sombra Prolongada`,
 | 
				
			||||||
    worldState_hallowedFlame: `Llama Sagrada`,
 | 
					    worldState_hallowedFlame: `Llama Sagrada`,
 | 
				
			||||||
    worldState_hallowedNightmares: `Pesadillas sagradas`,
 | 
					    worldState_hallowedNightmares: `Pesadillas Sagradas`,
 | 
				
			||||||
    worldState_hallowedNightmaresRewards: `[UNTRANSLATED] Hallowed Nightmares Rewards`,
 | 
					    worldState_hallowedNightmaresRewards: `Recompensas de Pesadillas Sagradas`,
 | 
				
			||||||
    worldState_proxyRebellion: `Rebelión Proxy`,
 | 
					    worldState_proxyRebellion: `Rebelión Proxy`,
 | 
				
			||||||
    worldState_proxyRebellionRewards: `[UNTRANSLATED] Proxy Rebellion Rewards`,
 | 
					    worldState_proxyRebellionRewards: `Recompensas de Rebelión Proxy`,
 | 
				
			||||||
    worldState_from_year: `[UNTRANSLATED] from |YEAR|`,
 | 
					    worldState_from_year: `de |YEAR|`,
 | 
				
			||||||
    worldState_pre_year: `[UNTRANSLATED] pre |YEAR|`,
 | 
					    worldState_pre_year: `antes de |YEAR|`,
 | 
				
			||||||
    worldState_incompatibleWith: `[UNTRANSLATED] Incompatible with:`,
 | 
					    worldState_incompatibleWith: `No compatible con:`,
 | 
				
			||||||
    enabled: `Activado`,
 | 
					    enabled: `Activado`,
 | 
				
			||||||
    disabled: `Desactivado`,
 | 
					    disabled: `Desactivado`,
 | 
				
			||||||
    worldState_we1: `Semana 1`,
 | 
					    worldState_we1: `Semana 1`,
 | 
				
			||||||
@ -318,7 +318,7 @@ dict = {
 | 
				
			|||||||
    upgrade_WarframeBlastProc: `+|VAL| de escudos al matar con daño de explosión`,
 | 
					    upgrade_WarframeBlastProc: `+|VAL| de escudos al matar con daño de explosión`,
 | 
				
			||||||
    upgrade_WarframeCastingSpeed: `+|VAL|% de velocidad de lanzamiento de habilidades`,
 | 
					    upgrade_WarframeCastingSpeed: `+|VAL|% de velocidad de lanzamiento de habilidades`,
 | 
				
			||||||
    upgrade_WarframeCorrosiveDamageBoost: `+|VAL|% de daño de habilidades a enemigos con estado corrosivo`,
 | 
					    upgrade_WarframeCorrosiveDamageBoost: `+|VAL|% de daño de habilidades a enemigos con estado corrosivo`,
 | 
				
			||||||
    upgrade_WarframeCorrosiveStack: `Aumenta los acumuladores máximos de estado corrosivo en +|VAL|`,
 | 
					    upgrade_WarframeCorrosiveStack: `Aumenta los stacks máximos de estado corrosivo en +|VAL|`,
 | 
				
			||||||
    upgrade_WarframeCritDamageBoost: `+|VAL|% de daño crítico cuerpo a cuerpo (se duplica con más de 500 de energía)`,
 | 
					    upgrade_WarframeCritDamageBoost: `+|VAL|% de daño crítico cuerpo a cuerpo (se duplica con más de 500 de energía)`,
 | 
				
			||||||
    upgrade_WarframeElectricDamage: `+|VAL1|% de daño eléctrico en armas primarias (+|VAL2|% por fragmento adicional)`,
 | 
					    upgrade_WarframeElectricDamage: `+|VAL1|% de daño eléctrico en armas primarias (+|VAL2|% por fragmento adicional)`,
 | 
				
			||||||
    upgrade_WarframeElectricDamageBoost: `+|VAL|% de daño de habilidades a enemigos con estado eléctrico`,
 | 
					    upgrade_WarframeElectricDamageBoost: `+|VAL|% de daño de habilidades a enemigos con estado eléctrico`,
 | 
				
			||||||
@ -342,30 +342,30 @@ dict = {
 | 
				
			|||||||
    upgrade_AvatarLootRadar: `+7m de radar de botín`,
 | 
					    upgrade_AvatarLootRadar: `+7m de radar de botín`,
 | 
				
			||||||
    upgrade_WeaponAmmoMax: `+15% de munición máxima`,
 | 
					    upgrade_WeaponAmmoMax: `+15% de munición máxima`,
 | 
				
			||||||
    upgrade_EnemyArmorReductionAura: `-3% de armadura enemiga`,
 | 
					    upgrade_EnemyArmorReductionAura: `-3% de armadura enemiga`,
 | 
				
			||||||
    upgrade_OnExecutionAmmo: `Recarga al 100% el cargador primario y secundario tras ejecución (Misericordia)`,
 | 
					    upgrade_OnExecutionAmmo: `Recarga al 100% el cargador primario y secundario tras ejecución (Mercy)`,
 | 
				
			||||||
    upgrade_OnExecutionHealthDrop: `100% de probabilidad de soltar un orbe de salud tras ejecución (Misericordia)`,
 | 
					    upgrade_OnExecutionHealthDrop: `100% de probabilidad de soltar un orbe de salud tras ejecución (Mercy)`,
 | 
				
			||||||
    upgrade_OnExecutionEnergyDrop: `50% de probabilidad de soltar un orbe de energía tras ejecución (Misericordia)`,
 | 
					    upgrade_OnExecutionEnergyDrop: `50% de probabilidad de soltar un orbe de energía tras ejecución (Mercy)`,
 | 
				
			||||||
    upgrade_OnFailHackReset: `+50% de probabilidad de reintento al fallar un hackeo`,
 | 
					    upgrade_OnFailHackReset: `+50% de probabilidad de reintento al fallar un hackeo`,
 | 
				
			||||||
    upgrade_DamageReductionOnHack: `75% de reducción de daño al hackear`,
 | 
					    upgrade_DamageReductionOnHack: `75% de reducción de daño al hackear`,
 | 
				
			||||||
    upgrade_OnExecutionReviveCompanion: `Las ejecuciones reducen el tiempo de recuperación del compañero en 15s`,
 | 
					    upgrade_OnExecutionReviveCompanion: `Las ejecuciones reducen el tiempo de recuperación del compañero en 15s`,
 | 
				
			||||||
    upgrade_OnExecutionParkourSpeed: `+60% de velocidad de parkour durante 15s tras una ejecución`,
 | 
					    upgrade_OnExecutionParkourSpeed: `+60% de velocidad de parkour durante 15s tras una ejecución (Mercy)`,
 | 
				
			||||||
    upgrade_AvatarTimeLimitIncrease: `+8s para hackear`,
 | 
					    upgrade_AvatarTimeLimitIncrease: `+8s para hackear`,
 | 
				
			||||||
    upgrade_ElectrifyOnHack: `Electrocuta a los enemigos en un radio de 20m al hackear`,
 | 
					    upgrade_ElectrifyOnHack: `Electrocuta a los enemigos en un radio de 20m al hackear`,
 | 
				
			||||||
    upgrade_OnExecutionTerrify: `50% de probabilidad de que enemigos en un radio de 15m entren en pánico por 8s tras una ejecución`,
 | 
					    upgrade_OnExecutionTerrify: `50% de probabilidad de que enemigos en un radio de 15m entren en pánico por 8s tras una ejecución (Mercy)`,
 | 
				
			||||||
    upgrade_OnHackLockers: `Desbloquea 5 casilleros en un radio de 20m tras hackear`,
 | 
					    upgrade_OnHackLockers: `Desbloquea 5 casilleros en un radio de 20m tras hackear`,
 | 
				
			||||||
    upgrade_OnExecutionBlind: `Ciega a los enemigos en un radio de 18m tras una ejecución`,
 | 
					    upgrade_OnExecutionBlind: `Ciega a los enemigos en un radio de 18m tras una ejecución (Mercy)`,
 | 
				
			||||||
    upgrade_OnExecutionDrainPower: `La próxima habilidad usada gana +50% de fuerza al realizar un remate (Mercy)`,
 | 
					    upgrade_OnExecutionDrainPower: `La próxima habilidad usada gana +50% de fuerza al realizar tras una ejecución (Mercy)`,
 | 
				
			||||||
    upgrade_OnHackSprintSpeed: `+75% de velocidad de carrera durante 15s después de hackear`,
 | 
					    upgrade_OnHackSprintSpeed: `+75% de velocidad de carrera durante 15s después de hackear`,
 | 
				
			||||||
    upgrade_SwiftExecute: `+50% de velocidad al ejecutar remates (Mercy)`,
 | 
					    upgrade_SwiftExecute: `+50% de velocidad al ejecutar remates (Mercy)`,
 | 
				
			||||||
    upgrade_OnHackInvis: `Invisible durante 15 segundos después de hackear`,
 | 
					    upgrade_OnHackInvis: `Invisible durante 15 segundos después de hackear`,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    damageType_Electricity: `Eletricidade`,
 | 
					    damageType_Electricity: `Eletricidad`,
 | 
				
			||||||
    damageType_Fire: `Ígneo`,
 | 
					    damageType_Fire: `Calor`,
 | 
				
			||||||
    damageType_Freeze: `Glacial`,
 | 
					    damageType_Freeze: `Frío`,
 | 
				
			||||||
    damageType_Impact: `Colisivo`,
 | 
					    damageType_Impact: `Impacto`,
 | 
				
			||||||
    damageType_Magnetic: `Magnético`,
 | 
					    damageType_Magnetic: `Magnético`,
 | 
				
			||||||
    damageType_Poison: `Tóxico`,
 | 
					    damageType_Poison: `Tóxico`,
 | 
				
			||||||
    damageType_Radiation: `Radioativo`,
 | 
					    damageType_Radiation: `Radiactivo`,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    theme_dark: `Tema Oscuro`,
 | 
					    theme_dark: `Tema Oscuro`,
 | 
				
			||||||
    theme_light: `Tema Claro`,
 | 
					    theme_light: `Tema Claro`,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user