merge upstream
This commit is contained in:
		
						commit
						93c8e2be5e
					
				@ -18,7 +18,6 @@
 | 
			
		||||
  "unlockAllSkins": false,
 | 
			
		||||
  "unlockAllCapturaScenes": false,
 | 
			
		||||
  "fullyStockedVendors": false,
 | 
			
		||||
  "unlockAllProfitTakerStages": false,
 | 
			
		||||
  "skipClanKeyCrafting": false,
 | 
			
		||||
  "noDojoRoomBuildStage": false,
 | 
			
		||||
  "noDecoBuildStage": false,
 | 
			
		||||
 | 
			
		||||
@ -31,7 +31,7 @@ fs.readdirSync("../static/webui/translations").forEach(file => {
 | 
			
		||||
            const strings = extractStrings(line);
 | 
			
		||||
            if (Object.keys(strings).length > 0) {
 | 
			
		||||
                Object.entries(strings).forEach(([key, value]) => {
 | 
			
		||||
                    if (targetStrings.hasOwnProperty(key) && !targetStrings[key].startsWith("[UNTRANSLATED] ")) {
 | 
			
		||||
                    if (targetStrings.hasOwnProperty(key) && !targetStrings[key].startsWith("[UNTRANSLATED]")) {
 | 
			
		||||
                        fs.writeSync(fileHandle, `    ${key}: \`${targetStrings[key]}\`,\n`);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        fs.writeSync(fileHandle, `    ${key}: \`[UNTRANSLATED] ${value}\`,\n`);
 | 
			
		||||
 | 
			
		||||
@ -486,19 +486,6 @@ export const getInventoryResponse = async (
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (config.unlockAllProfitTakerStages) {
 | 
			
		||||
        inventoryResponse.CompletedJobChains ??= [];
 | 
			
		||||
        const EudicoHeists = inventoryResponse.CompletedJobChains.find(x => x.LocationTag == "EudicoHeists");
 | 
			
		||||
        if (EudicoHeists) {
 | 
			
		||||
            EudicoHeists.Jobs = allEudicoHeistJobs;
 | 
			
		||||
        } else {
 | 
			
		||||
            inventoryResponse.CompletedJobChains.push({
 | 
			
		||||
                LocationTag: "EudicoHeists",
 | 
			
		||||
                Jobs: allEudicoHeistJobs
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (config.unlockAllSimarisResearchEntries) {
 | 
			
		||||
        inventoryResponse.LibraryPersonalTarget = undefined;
 | 
			
		||||
        inventoryResponse.LibraryPersonalProgress = [
 | 
			
		||||
@ -515,13 +502,6 @@ export const getInventoryResponse = async (
 | 
			
		||||
    return inventoryResponse;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const allEudicoHeistJobs = [
 | 
			
		||||
    "/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyOne",
 | 
			
		||||
    "/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyTwo",
 | 
			
		||||
    "/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyThree",
 | 
			
		||||
    "/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyFour"
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
const getExpRequiredForMr = (rank: number): number => {
 | 
			
		||||
    if (rank <= 30) {
 | 
			
		||||
        return 2500 * rank * rank;
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,24 @@
 | 
			
		||||
import { getInventory } from "../../services/inventoryService.ts";
 | 
			
		||||
import { getAccountIdForRequest } from "../../services/loginService.ts";
 | 
			
		||||
import type { RequestHandler } from "express";
 | 
			
		||||
 | 
			
		||||
const allEudicoHeistJobs = [
 | 
			
		||||
    "/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyOne",
 | 
			
		||||
    "/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyTwo",
 | 
			
		||||
    "/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyThree",
 | 
			
		||||
    "/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyFour"
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
export const unlockAllProfitTakerStagesController: RequestHandler = async (req, res) => {
 | 
			
		||||
    const accountId = await getAccountIdForRequest(req);
 | 
			
		||||
    const inventory = await getInventory(accountId, "CompletedJobChains");
 | 
			
		||||
    inventory.CompletedJobChains ??= [];
 | 
			
		||||
    const chain = inventory.CompletedJobChains.find(x => x.LocationTag == "EudicoHeists");
 | 
			
		||||
    if (chain) {
 | 
			
		||||
        chain.Jobs = allEudicoHeistJobs;
 | 
			
		||||
    } else {
 | 
			
		||||
        inventory.CompletedJobChains.push({ LocationTag: "EudicoHeists", Jobs: allEudicoHeistJobs });
 | 
			
		||||
    }
 | 
			
		||||
    await inventory.save();
 | 
			
		||||
    res.end();
 | 
			
		||||
};
 | 
			
		||||
@ -1435,6 +1435,7 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
 | 
			
		||||
        dontSubtractPurchaseStandingCost: Boolean,
 | 
			
		||||
        dontSubtractVoidTraces: Boolean,
 | 
			
		||||
        dontSubtractConsumables: Boolean,
 | 
			
		||||
        finishInvasionsInOneMission: Boolean,
 | 
			
		||||
        infiniteCredits: Boolean,
 | 
			
		||||
        infinitePlatinum: Boolean,
 | 
			
		||||
        infiniteEndo: Boolean,
 | 
			
		||||
 | 
			
		||||
@ -14,6 +14,7 @@ import { addMissingMaxRankModsController } from "../controllers/custom/addMissin
 | 
			
		||||
import { webuiFileChangeDetectedController } from "../controllers/custom/webuiFileChangeDetectedController.ts";
 | 
			
		||||
import { completeAllMissionsController } from "../controllers/custom/completeAllMissionsController.ts";
 | 
			
		||||
import { addMissingHelminthBlueprintsController } from "../controllers/custom/addMissingHelminthBlueprintsController.ts";
 | 
			
		||||
import { unlockAllProfitTakerStagesController } from "../controllers/custom/unlockAllProfitTakerStagesController.ts";
 | 
			
		||||
 | 
			
		||||
import { abilityOverrideController } from "../controllers/custom/abilityOverrideController.ts";
 | 
			
		||||
import { createAccountController } from "../controllers/custom/createAccountController.ts";
 | 
			
		||||
@ -48,6 +49,7 @@ customRouter.get("/addMissingMaxRankMods", addMissingMaxRankModsController);
 | 
			
		||||
customRouter.get("/webuiFileChangeDetected", webuiFileChangeDetectedController);
 | 
			
		||||
customRouter.get("/completeAllMissions", completeAllMissionsController);
 | 
			
		||||
customRouter.get("/addMissingHelminthBlueprints", addMissingHelminthBlueprintsController);
 | 
			
		||||
customRouter.get("/unlockAllProfitTakerStages", unlockAllProfitTakerStagesController);
 | 
			
		||||
 | 
			
		||||
customRouter.post("/abilityOverride", abilityOverrideController);
 | 
			
		||||
customRouter.post("/createAccount", createAccountController);
 | 
			
		||||
 | 
			
		||||
@ -26,7 +26,6 @@ export interface IConfig extends IConfigRemovedOptions {
 | 
			
		||||
    unlockAllCapturaScenes?: boolean;
 | 
			
		||||
    unlockAllDecoRecipes?: boolean;
 | 
			
		||||
    fullyStockedVendors?: boolean;
 | 
			
		||||
    unlockAllProfitTakerStages?: boolean;
 | 
			
		||||
    skipClanKeyCrafting?: boolean;
 | 
			
		||||
    noDojoRoomBuildStage?: boolean;
 | 
			
		||||
    noDojoDecoBuildStage?: boolean;
 | 
			
		||||
@ -105,6 +104,7 @@ export const configRemovedOptionsKeys = [
 | 
			
		||||
    "unlockDoubleCapacityPotatoesEverywhere",
 | 
			
		||||
    "unlockExilusEverywhere",
 | 
			
		||||
    "unlockArcanesEverywhere",
 | 
			
		||||
    "unlockAllProfitTakerStages",
 | 
			
		||||
    "noDailyStandingLimits",
 | 
			
		||||
    "noDailyFocusLimit",
 | 
			
		||||
    "noArgonCrystalDecay",
 | 
			
		||||
 | 
			
		||||
@ -775,6 +775,11 @@ export const addMissionInventoryUpdates = async (
 | 
			
		||||
            }
 | 
			
		||||
            case "InvasionProgress": {
 | 
			
		||||
                for (const clientProgress of value) {
 | 
			
		||||
                    if (inventory.finishInvasionsInOneMission) {
 | 
			
		||||
                        clientProgress.Delta *= 3;
 | 
			
		||||
                        clientProgress.AttackerScore *= 3;
 | 
			
		||||
                        clientProgress.DefenderScore *= 3;
 | 
			
		||||
                    }
 | 
			
		||||
                    const dbProgress = inventory.QualifyingInvasions.find(x =>
 | 
			
		||||
                        x.invasionId.equals(clientProgress._id.$oid)
 | 
			
		||||
                    );
 | 
			
		||||
@ -1832,6 +1837,10 @@ function getRandomMissionDrops(
 | 
			
		||||
                    ItemCount: 10
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
            drops.push({
 | 
			
		||||
                StoreItem: "/Lotus/StoreItems/Types/Gameplay/Duviri/Resource/DuviriDragonDropItem",
 | 
			
		||||
                ItemCount: 10
 | 
			
		||||
            });
 | 
			
		||||
            rewardManifests = ["/Lotus/Types/Game/MissionDecks/DuviriEncounterRewards/DuviriMurmurFinalChestRewards"];
 | 
			
		||||
        } else if (RewardInfo.T == 19) {
 | 
			
		||||
            if (config.worldState?.eightClaw) {
 | 
			
		||||
@ -1840,6 +1849,10 @@ function getRandomMissionDrops(
 | 
			
		||||
                    ItemCount: 15
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
            drops.push({
 | 
			
		||||
                StoreItem: "/Lotus/StoreItems/Types/Gameplay/Duviri/Resource/DuviriDragonDropItem",
 | 
			
		||||
                ItemCount: 15
 | 
			
		||||
            });
 | 
			
		||||
            rewardManifests = [
 | 
			
		||||
                "/Lotus/Types/Game/MissionDecks/DuviriEncounterRewards/DuviriMurmurFinalSteelChestRewards"
 | 
			
		||||
            ];
 | 
			
		||||
 | 
			
		||||
@ -2630,84 +2630,92 @@ export const getWorldState = (buildLabel?: string): IWorldState => {
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const thermiaFracturesCycleDay = day % 32;
 | 
			
		||||
    const isThermiaFracturesActive = thermiaFracturesCycleDay < 14;
 | 
			
		||||
    // Thermia Fractures activates for 14 days, with alternating 4 and 3-day breaks
 | 
			
		||||
    const thermiaFracturesCycleDay = day % 35;
 | 
			
		||||
    const isThermiaFracturesActive =
 | 
			
		||||
        thermiaFracturesCycleDay < 14 || (thermiaFracturesCycleDay >= 18 && thermiaFracturesCycleDay < 32);
 | 
			
		||||
    const activeThermiaFracturesCycleDay =
 | 
			
		||||
        thermiaFracturesCycleDay - (thermiaFracturesCycleDay < 14 ? 0 : thermiaFracturesCycleDay < 18 ? 14 : 32);
 | 
			
		||||
 | 
			
		||||
    if (config.worldState?.thermiaFracturesOverride ?? isThermiaFracturesActive) {
 | 
			
		||||
        const activeStartDay = day - thermiaFracturesCycleDay;
 | 
			
		||||
        const activeStartDay = day - activeThermiaFracturesCycleDay;
 | 
			
		||||
 | 
			
		||||
        const count = config.worldState?.thermiaFracturesProgressOverride ?? 0;
 | 
			
		||||
        const activation = config.worldState?.thermiaFracturesOverride ? 1740416400000 : getSortieTime(activeStartDay);
 | 
			
		||||
        const expiry = config.worldState?.thermiaFracturesOverride ? 2000000000000 : getSortieTime(activeStartDay + 14);
 | 
			
		||||
 | 
			
		||||
        worldState.Goals.push({
 | 
			
		||||
            _id: { $oid: "5c7cb0d00000000000000000" },
 | 
			
		||||
            Activation: { $date: { $numberLong: activation.toString() } },
 | 
			
		||||
            Expiry: { $date: { $numberLong: expiry.toString() } },
 | 
			
		||||
            Node: "SolNode129",
 | 
			
		||||
            ScoreVar: "FissuresClosed",
 | 
			
		||||
            ScoreLocTag: "/Lotus/Language/G1Quests/HeatFissuresEventScore",
 | 
			
		||||
            Count: count,
 | 
			
		||||
            HealthPct: count / 100,
 | 
			
		||||
            Regions: [1],
 | 
			
		||||
            Desc: "/Lotus/Language/G1Quests/HeatFissuresEventName",
 | 
			
		||||
            ToolTip: "/Lotus/Language/G1Quests/HeatFissuresEventDesc",
 | 
			
		||||
            OptionalInMission: true,
 | 
			
		||||
            Tag: "HeatFissure",
 | 
			
		||||
            UpgradeIds: [{ $oid: "5c81cefa4c4566791728eaa7" }, { $oid: "5c81cefa4c4566791728eaa6" }],
 | 
			
		||||
            Personal: true,
 | 
			
		||||
            Community: true,
 | 
			
		||||
            Goal: 100,
 | 
			
		||||
            Reward: {
 | 
			
		||||
                items: ["/Lotus/StoreItems/Weapons/Corpus/LongGuns/CrpBFG/Vandal/VandalCrpBFG"]
 | 
			
		||||
            },
 | 
			
		||||
            InterimGoals: [5, 25, 50, 75],
 | 
			
		||||
            InterimRewards: [
 | 
			
		||||
                { items: ["/Lotus/StoreItems/Upgrades/Skins/Clan/OrbBadgeItem"] },
 | 
			
		||||
                {
 | 
			
		||||
                    items: [
 | 
			
		||||
                        "/Lotus/StoreItems/Upgrades/Mods/DualSource/Shotgun/ShotgunMedicMod",
 | 
			
		||||
                        "/Lotus/StoreItems/Upgrades/Mods/DualSource/Rifle/SerratedRushMod"
 | 
			
		||||
                    ]
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    items: [
 | 
			
		||||
                        "/Lotus/StoreItems/Upgrades/Mods/DualSource/Pistol/MultishotDodgeMod",
 | 
			
		||||
                        "/Lotus/StoreItems/Upgrades/Mods/DualSource/Melee/CritDamageChargeSpeedMod"
 | 
			
		||||
                    ]
 | 
			
		||||
                },
 | 
			
		||||
                { items: ["/Lotus/StoreItems/Upgrades/Skins/Sigils/OrbSigil"] }
 | 
			
		||||
            ]
 | 
			
		||||
        });
 | 
			
		||||
        worldState.NodeOverrides.push({
 | 
			
		||||
            _id: { $oid: "5c7cb0d00000000000000000" },
 | 
			
		||||
            Activation: { $date: { $numberLong: activation.toString() } },
 | 
			
		||||
            Expiry: { $date: { $numberLong: expiry.toString() } },
 | 
			
		||||
            Node: "SolNode129",
 | 
			
		||||
            Faction: "FC_CORPUS",
 | 
			
		||||
            CustomNpcEncounters: ["/Lotus/Types/Gameplay/Venus/Encounters/Heists/ExploiterHeistFissure"]
 | 
			
		||||
        });
 | 
			
		||||
        if (count >= 35) {
 | 
			
		||||
            worldState.GlobalUpgrades.push({
 | 
			
		||||
                _id: { $oid: "5c81cefa4c4566791728eaa6" },
 | 
			
		||||
        // If we push it, the game may show the event even tho it's not activated yet (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2721)
 | 
			
		||||
        if (timeMs >= activation) {
 | 
			
		||||
            worldState.Goals.push({
 | 
			
		||||
                _id: { $oid: "5c7cb0d00000000000000000" },
 | 
			
		||||
                Activation: { $date: { $numberLong: activation.toString() } },
 | 
			
		||||
                ExpiryDate: { $date: { $numberLong: expiry.toString() } },
 | 
			
		||||
                UpgradeType: "GAMEPLAY_MONEY_REWARD_AMOUNT",
 | 
			
		||||
                OperationType: "MULTIPLY",
 | 
			
		||||
                Value: 2,
 | 
			
		||||
                Nodes: ["SolNode129"]
 | 
			
		||||
                Expiry: { $date: { $numberLong: expiry.toString() } },
 | 
			
		||||
                Node: "SolNode129",
 | 
			
		||||
                ScoreVar: "FissuresClosed",
 | 
			
		||||
                ScoreLocTag: "/Lotus/Language/G1Quests/HeatFissuresEventScore",
 | 
			
		||||
                Count: count,
 | 
			
		||||
                HealthPct: count / 100,
 | 
			
		||||
                Regions: [1],
 | 
			
		||||
                Desc: "/Lotus/Language/G1Quests/HeatFissuresEventName",
 | 
			
		||||
                ToolTip: "/Lotus/Language/G1Quests/HeatFissuresEventDesc",
 | 
			
		||||
                OptionalInMission: true,
 | 
			
		||||
                Tag: "HeatFissure",
 | 
			
		||||
                UpgradeIds: [{ $oid: "5c81cefa4c4566791728eaa7" }, { $oid: "5c81cefa4c4566791728eaa6" }],
 | 
			
		||||
                Personal: true,
 | 
			
		||||
                Community: true,
 | 
			
		||||
                Goal: 100,
 | 
			
		||||
                Reward: {
 | 
			
		||||
                    items: ["/Lotus/StoreItems/Weapons/Corpus/LongGuns/CrpBFG/Vandal/VandalCrpBFG"]
 | 
			
		||||
                },
 | 
			
		||||
                InterimGoals: [5, 25, 50, 75],
 | 
			
		||||
                InterimRewards: [
 | 
			
		||||
                    { items: ["/Lotus/StoreItems/Upgrades/Skins/Clan/OrbBadgeItem"] },
 | 
			
		||||
                    {
 | 
			
		||||
                        items: [
 | 
			
		||||
                            "/Lotus/StoreItems/Upgrades/Mods/DualSource/Shotgun/ShotgunMedicMod",
 | 
			
		||||
                            "/Lotus/StoreItems/Upgrades/Mods/DualSource/Rifle/SerratedRushMod"
 | 
			
		||||
                        ]
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        items: [
 | 
			
		||||
                            "/Lotus/StoreItems/Upgrades/Mods/DualSource/Pistol/MultishotDodgeMod",
 | 
			
		||||
                            "/Lotus/StoreItems/Upgrades/Mods/DualSource/Melee/CritDamageChargeSpeedMod"
 | 
			
		||||
                        ]
 | 
			
		||||
                    },
 | 
			
		||||
                    { items: ["/Lotus/StoreItems/Upgrades/Skins/Sigils/OrbSigil"] }
 | 
			
		||||
                ]
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        // Not sure about that
 | 
			
		||||
        if (count == 100) {
 | 
			
		||||
            worldState.GlobalUpgrades.push({
 | 
			
		||||
                _id: { $oid: "5c81cefa4c4566791728eaa7" },
 | 
			
		||||
            worldState.NodeOverrides.push({
 | 
			
		||||
                _id: { $oid: "5c7cb0d00000000000000000" },
 | 
			
		||||
                Activation: { $date: { $numberLong: activation.toString() } },
 | 
			
		||||
                ExpiryDate: { $date: { $numberLong: expiry.toString() } },
 | 
			
		||||
                UpgradeType: "GAMEPLAY_PICKUP_AMOUNT",
 | 
			
		||||
                OperationType: "MULTIPLY",
 | 
			
		||||
                Value: 2,
 | 
			
		||||
                Nodes: ["SolNode129"]
 | 
			
		||||
                Expiry: { $date: { $numberLong: expiry.toString() } },
 | 
			
		||||
                Node: "SolNode129",
 | 
			
		||||
                Faction: "FC_CORPUS",
 | 
			
		||||
                CustomNpcEncounters: ["/Lotus/Types/Gameplay/Venus/Encounters/Heists/ExploiterHeistFissure"]
 | 
			
		||||
            });
 | 
			
		||||
            if (count >= 35) {
 | 
			
		||||
                worldState.GlobalUpgrades.push({
 | 
			
		||||
                    _id: { $oid: "5c81cefa4c4566791728eaa6" },
 | 
			
		||||
                    Activation: { $date: { $numberLong: activation.toString() } },
 | 
			
		||||
                    ExpiryDate: { $date: { $numberLong: expiry.toString() } },
 | 
			
		||||
                    UpgradeType: "GAMEPLAY_MONEY_REWARD_AMOUNT",
 | 
			
		||||
                    OperationType: "MULTIPLY",
 | 
			
		||||
                    Value: 2,
 | 
			
		||||
                    Nodes: ["SolNode129"]
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
            // Not sure about that
 | 
			
		||||
            if (count == 100) {
 | 
			
		||||
                worldState.GlobalUpgrades.push({
 | 
			
		||||
                    _id: { $oid: "5c81cefa4c4566791728eaa7" },
 | 
			
		||||
                    Activation: { $date: { $numberLong: activation.toString() } },
 | 
			
		||||
                    ExpiryDate: { $date: { $numberLong: expiry.toString() } },
 | 
			
		||||
                    UpgradeType: "GAMEPLAY_PICKUP_AMOUNT",
 | 
			
		||||
                    OperationType: "MULTIPLY",
 | 
			
		||||
                    Value: 2,
 | 
			
		||||
                    Nodes: ["SolNode129"]
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -28,6 +28,7 @@ export interface IAccountCheats {
 | 
			
		||||
    dontSubtractPurchaseStandingCost?: boolean;
 | 
			
		||||
    dontSubtractVoidTraces?: boolean;
 | 
			
		||||
    dontSubtractConsumables?: boolean;
 | 
			
		||||
    finishInvasionsInOneMission?: boolean;
 | 
			
		||||
    infiniteCredits?: boolean;
 | 
			
		||||
    infinitePlatinum?: boolean;
 | 
			
		||||
    infiniteEndo?: boolean;
 | 
			
		||||
 | 
			
		||||
@ -783,6 +783,10 @@
 | 
			
		||||
                                    <input class="form-check-input" type="checkbox" id="disableDailyTribute" />
 | 
			
		||||
                                    <label class="form-check-label" for="disableDailyTribute" data-loc="cheats_disableDailyTribute"></label>
 | 
			
		||||
                                </div>
 | 
			
		||||
                                <div class="form-check">
 | 
			
		||||
                                    <input class="form-check-input" type="checkbox" id="finishInvasionsInOneMission" />
 | 
			
		||||
                                    <label class="form-check-label" for="finishInvasionsInOneMission" data-loc="cheats_finishInvasionsInOneMission"></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(markAllAsRead);" data-loc="cheats_markAllAsRead"></button>
 | 
			
		||||
@ -791,6 +795,7 @@
 | 
			
		||||
                                    <button class="btn btn-primary" onclick="debounce(addMissingHelminthRecipes);" data-loc="cheats_addMissingSubsumedAbilities"></button>
 | 
			
		||||
                                    <button class="btn btn-primary" onclick="doIntrinsicsUnlockAll();" data-loc="cheats_intrinsicsUnlockAll"></button>
 | 
			
		||||
                                    <button class="btn btn-primary" onclick="debounce(doMaxPlexus);" data-loc="inventory_maxPlexus"></button>
 | 
			
		||||
                                    <button class="btn btn-primary" onclick="debounce(doUnlockAllProfitTakerStages);" data-loc="cheats_unlockAllProfitTakerStages"></button>
 | 
			
		||||
                                </div>
 | 
			
		||||
                                <form class="mt-2" onsubmit="doChangeSupportedSyndicate(); return false;">
 | 
			
		||||
                                    <label class="form-label" for="changeSyndicate" data-loc="cheats_changeSupportedSyndicate"></label>
 | 
			
		||||
@ -846,10 +851,6 @@
 | 
			
		||||
                                        <input class="form-check-input" type="checkbox" id="fullyStockedVendors" />
 | 
			
		||||
                                        <label class="form-check-label" for="fullyStockedVendors" data-loc="cheats_fullyStockedVendors"></label>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                    <div class="form-check">
 | 
			
		||||
                                        <input class="form-check-input" type="checkbox" id="unlockAllProfitTakerStages" />
 | 
			
		||||
                                        <label class="form-check-label" for="unlockAllProfitTakerStages" data-loc="cheats_unlockAllProfitTakerStages"></label>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                    <div class="form-check">
 | 
			
		||||
                                        <input class="form-check-input" type="checkbox" id="skipClanKeyCrafting" />
 | 
			
		||||
                                        <label class="form-check-label" for="skipClanKeyCrafting" data-loc="cheats_skipClanKeyCrafting"></label>
 | 
			
		||||
 | 
			
		||||
@ -2719,6 +2719,12 @@ async function doUnlockAllMissions() {
 | 
			
		||||
    toast(loc("cheats_unlockAllMissions_ok"));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function doUnlockAllProfitTakerStages() {
 | 
			
		||||
    await revalidateAuthz();
 | 
			
		||||
    await fetch("/custom/unlockAllProfitTakerStages?" + window.authz);
 | 
			
		||||
    toast(loc("cheats_unlockSucc"));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const importSamples = {
 | 
			
		||||
    maxFocus: {
 | 
			
		||||
        FocusUpgrades: [
 | 
			
		||||
 | 
			
		||||
@ -210,6 +210,7 @@ dict = {
 | 
			
		||||
    cheats_baroFullyStocked: `Baro hat volles Inventar`,
 | 
			
		||||
    cheats_syndicateMissionsRepeatable: `Syndikat-Missionen wiederholbar`,
 | 
			
		||||
    cheats_unlockAllProfitTakerStages: `Alle Profiteintreiber-Phasen freischalten`,
 | 
			
		||||
    cheats_unlockSucc: `[UNTRANSLATED] Successfully unlocked.`,
 | 
			
		||||
    cheats_instantFinishRivenChallenge: `Riven-Mod Herausforderung sofort abschließen`,
 | 
			
		||||
    cheats_instantResourceExtractorDrones: `Sofortige Ressourcen-Extraktor-Drohnen`,
 | 
			
		||||
    cheats_noResourceExtractorDronesDamage: `Kein Schaden für Ressourcen-Extraktor-Drohnen`,
 | 
			
		||||
@ -238,6 +239,7 @@ dict = {
 | 
			
		||||
    cheats_changeSupportedSyndicate: `Unterstütztes Syndikat`,
 | 
			
		||||
    cheats_changeButton: `Ändern`,
 | 
			
		||||
    cheats_markAllAsRead: `Posteingang als gelesen markieren`,
 | 
			
		||||
    cheats_finishInvasionsInOneMission: `[UNTRANSLATED] Finish Invasions in One Mission`,
 | 
			
		||||
 | 
			
		||||
    worldState: `Weltstatus`,
 | 
			
		||||
    worldState_creditBoost: `Event Booster: Credit`,
 | 
			
		||||
 | 
			
		||||
@ -209,6 +209,7 @@ dict = {
 | 
			
		||||
    cheats_baroFullyStocked: `Baro Fully Stocked`,
 | 
			
		||||
    cheats_syndicateMissionsRepeatable: `Syndicate Missions Repeatable`,
 | 
			
		||||
    cheats_unlockAllProfitTakerStages: `Unlock All Profit Taker Stages`,
 | 
			
		||||
    cheats_unlockSucc: `Successfully unlocked.`,
 | 
			
		||||
    cheats_instantFinishRivenChallenge: `Instant Finish Riven Challenge`,
 | 
			
		||||
    cheats_instantResourceExtractorDrones: `Instant Resource Extractor Drones`,
 | 
			
		||||
    cheats_noResourceExtractorDronesDamage: `No Resource Extractor Drones Damage`,
 | 
			
		||||
@ -237,6 +238,7 @@ dict = {
 | 
			
		||||
    cheats_changeSupportedSyndicate: `Supported syndicate`,
 | 
			
		||||
    cheats_changeButton: `Change`,
 | 
			
		||||
    cheats_markAllAsRead: `Mark Inbox As Read`,
 | 
			
		||||
    cheats_finishInvasionsInOneMission: `Finish Invasions in One Mission`,
 | 
			
		||||
 | 
			
		||||
    worldState: `World State`,
 | 
			
		||||
    worldState_creditBoost: `Credit Boost`,
 | 
			
		||||
 | 
			
		||||
@ -210,6 +210,7 @@ dict = {
 | 
			
		||||
    cheats_baroFullyStocked: `Baro con stock completo`,
 | 
			
		||||
    cheats_syndicateMissionsRepeatable: `Misiones de sindicato rejugables`,
 | 
			
		||||
    cheats_unlockAllProfitTakerStages: `Desbloquea todas las etapas del Roba-ganancias`,
 | 
			
		||||
    cheats_unlockSucc: `[UNTRANSLATED] Successfully unlocked.`,
 | 
			
		||||
    cheats_instantFinishRivenChallenge: `Terminar desafío de agrietado inmediatamente`,
 | 
			
		||||
    cheats_instantResourceExtractorDrones: `Drones de extracción de recursos instantáneos`,
 | 
			
		||||
    cheats_noResourceExtractorDronesDamage: `Sin daño a los drones extractores de recursos`,
 | 
			
		||||
@ -238,6 +239,7 @@ dict = {
 | 
			
		||||
    cheats_changeSupportedSyndicate: `Sindicatos disponibles`,
 | 
			
		||||
    cheats_changeButton: `Cambiar`,
 | 
			
		||||
    cheats_markAllAsRead: `Marcar bandeja de entrada como leída`,
 | 
			
		||||
    cheats_finishInvasionsInOneMission: `[UNTRANSLATED] Finish Invasions in One Mission`,
 | 
			
		||||
 | 
			
		||||
    worldState: `Estado del mundo`,
 | 
			
		||||
    worldState_creditBoost: `Potenciador de Créditos`,
 | 
			
		||||
 | 
			
		||||
@ -210,6 +210,7 @@ dict = {
 | 
			
		||||
    cheats_baroFullyStocked: `Stock de Baro au max`,
 | 
			
		||||
    cheats_syndicateMissionsRepeatable: `Mission syndicat répétables`,
 | 
			
		||||
    cheats_unlockAllProfitTakerStages: `Débloquer toutes les étapes du Preneur de Profit`,
 | 
			
		||||
    cheats_unlockSucc: `[UNTRANSLATED] Successfully unlocked.`,
 | 
			
		||||
    cheats_instantFinishRivenChallenge: `Débloquer le challenge Riven instantanément`,
 | 
			
		||||
    cheats_instantResourceExtractorDrones: `Ressources de drones d'extraction instantannées`,
 | 
			
		||||
    cheats_noResourceExtractorDronesDamage: `Aucun dégâts aux drones d'extraction de resources`,
 | 
			
		||||
@ -238,6 +239,7 @@ dict = {
 | 
			
		||||
    cheats_changeSupportedSyndicate: `Allégeance`,
 | 
			
		||||
    cheats_changeButton: `Changer`,
 | 
			
		||||
    cheats_markAllAsRead: `Marquer la boîte de réception comme lue`,
 | 
			
		||||
    cheats_finishInvasionsInOneMission: `[UNTRANSLATED] Finish Invasions in One Mission`,
 | 
			
		||||
 | 
			
		||||
    worldState: `Carte Solaire`,
 | 
			
		||||
    worldState_creditBoost: `Booster de Crédit`,
 | 
			
		||||
 | 
			
		||||
@ -210,6 +210,7 @@ dict = {
 | 
			
		||||
    cheats_baroFullyStocked: `Баро полностью укомплектован`,
 | 
			
		||||
    cheats_syndicateMissionsRepeatable: `Повторять миссии синдиката`,
 | 
			
		||||
    cheats_unlockAllProfitTakerStages: `Разблокировать все этапы Сферы извлечения прибыли`,
 | 
			
		||||
    cheats_unlockSucc: `[UNTRANSLATED] Successfully unlocked.`,
 | 
			
		||||
    cheats_instantFinishRivenChallenge: `Мгновенное завершение испытания мода Разлома`,
 | 
			
		||||
    cheats_instantResourceExtractorDrones: `Мгновенно добывающие Дроны-сборщики`,
 | 
			
		||||
    cheats_noResourceExtractorDronesDamage: `Без урона по Дронам-сборщикам`,
 | 
			
		||||
@ -238,6 +239,7 @@ dict = {
 | 
			
		||||
    cheats_changeSupportedSyndicate: `Поддерживаемый синдикат`,
 | 
			
		||||
    cheats_changeButton: `Изменить`,
 | 
			
		||||
    cheats_markAllAsRead: `Пометить все входящие как прочитанные`,
 | 
			
		||||
    cheats_finishInvasionsInOneMission: `[UNTRANSLATED] Finish Invasions in One Mission`,
 | 
			
		||||
 | 
			
		||||
    worldState: `Состояние мира`,
 | 
			
		||||
    worldState_creditBoost: `Глобальный бустер Кредитов`,
 | 
			
		||||
 | 
			
		||||
@ -210,6 +210,7 @@ dict = {
 | 
			
		||||
    cheats_baroFullyStocked: `Баро повністю укомплектований`,
 | 
			
		||||
    cheats_syndicateMissionsRepeatable: `Повторювати місії синдиката`,
 | 
			
		||||
    cheats_unlockAllProfitTakerStages: `Розблокувати всі етапи Привласнювачки`,
 | 
			
		||||
    cheats_unlockSucc: `[UNTRANSLATED] Successfully unlocked.`,
 | 
			
		||||
    cheats_instantFinishRivenChallenge: `Миттєве завершення випробування модифікатора Розколу`,
 | 
			
		||||
    cheats_instantResourceExtractorDrones: `Миттєво добуваючі Дрони-видобувачі`,
 | 
			
		||||
    cheats_noResourceExtractorDronesDamage: `Без шкоди по Дронам-видобувачам`,
 | 
			
		||||
@ -238,6 +239,7 @@ dict = {
 | 
			
		||||
    cheats_changeSupportedSyndicate: `Підтримуваний синдикат`,
 | 
			
		||||
    cheats_changeButton: `Змінити`,
 | 
			
		||||
    cheats_markAllAsRead: `Помітити всі вхідні як прочитані`,
 | 
			
		||||
    cheats_finishInvasionsInOneMission: `[UNTRANSLATED] Finish Invasions in One Mission`,
 | 
			
		||||
 | 
			
		||||
    worldState: `Стан світу`,
 | 
			
		||||
    worldState_creditBoost: `Глобальне посилення Кредитів`,
 | 
			
		||||
 | 
			
		||||
@ -210,6 +210,7 @@ dict = {
 | 
			
		||||
    cheats_baroFullyStocked: `虚空商人贩卖所有商品`,
 | 
			
		||||
    cheats_syndicateMissionsRepeatable: `集团任务可重复完成`,
 | 
			
		||||
    cheats_unlockAllProfitTakerStages: `解锁利润收割者圆蛛所有阶段`,
 | 
			
		||||
    cheats_unlockSucc: `[UNTRANSLATED] Successfully unlocked.`,
 | 
			
		||||
    cheats_instantFinishRivenChallenge: `立即完成裂罅挑战`,
 | 
			
		||||
    cheats_instantResourceExtractorDrones: `资源无人机即时完成`,
 | 
			
		||||
    cheats_noResourceExtractorDronesDamage: `资源无人机不会损毁`,
 | 
			
		||||
@ -238,6 +239,7 @@ dict = {
 | 
			
		||||
    cheats_changeSupportedSyndicate: `支持的集团`,
 | 
			
		||||
    cheats_changeButton: `更改`,
 | 
			
		||||
    cheats_markAllAsRead: `收件箱全部标记为已读`,
 | 
			
		||||
    cheats_finishInvasionsInOneMission: `一场任务完成整场入侵`,
 | 
			
		||||
 | 
			
		||||
    worldState: `世界状态配置`,
 | 
			
		||||
    worldState_creditBoost: `现金加成`,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user