XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 0 Star 0
UTF-8
import type { RequestHandler } from "express";
import { getAccountIdForRequest } from "../../services/loginService.ts";
import { combineInventoryChanges, getInventory } from "../../services/inventoryService.ts";
import { getJSONfromString } from "../../helpers/stringHelpers.ts";
import type {
    IEndlessXpReward,
    IInventoryClient,
    TEndlessXpCategory
} from "../../types/inventoryTypes/inventoryTypes.ts";
import { logger } from "../../utils/logger.ts";
import type { ICountedStoreItem } from "warframe-public-export-plus";
import { ExportRewards } from "warframe-public-export-plus";
import { getRandomElement } from "../../services/rngService.ts";
import { handleStoreItemAcquisition } from "../../services/purchaseService.ts";
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";

export const endlessXpController: RequestHandler = async (req, res) => {
    const accountId = await getAccountIdForRequest(req);
    const payload = getJSONfromString<IEndlessXpRequest>(String(req.body));
    if (payload.Mode == "r") {
        const inventory = await getInventory(accountId, "EndlessXP");
        inventory.EndlessXP ??= [];
        let entry = inventory.EndlessXP.find(x => x.Category == payload.Category);
        if (!entry) {
            entry = {
                Category: payload.Category,
                Earn: 0,
                Claim: 0,
                Choices: payload.Choices,
                PendingRewards: []
            };
            inventory.EndlessXP.push(entry);
        }

        const weekStart = 1734307200_000 + Math.trunc((Date.now() - 1734307200_000) / 604800000) * 604800000;
        const weekEnd = weekStart + 604800000;

        entry.Earn = 0;
        entry.Claim = 0;
        entry.BonusAvailable = new Date(weekStart);
        entry.Expiry = new Date(weekEnd);
        entry.Choices = payload.Choices;
        entry.PendingRewards =
            payload.Category == "EXC_HARD"
                ? generateHardModeRewards(payload.Choices)
                : generateNormalModeRewards(payload.Choices);

        await inventory.save();
        res.json({
            NewProgress: inventory.toJSON<IInventoryClient>().EndlessXP!.find(x => x.Category == payload.Category)!
        });
    } else if (payload.Mode == "c") {
        const inventory = await getInventory(accountId, undefined);
        const entry = inventory.EndlessXP!.find(x => x.Category == payload.Category)!;
        const inventoryChanges: IInventoryChanges = {};
        for (const reward of entry.PendingRewards) {
            if (entry.Claim < reward.RequiredTotalXp && reward.RequiredTotalXp <= entry.Earn) {
                combineInventoryChanges(
                    inventoryChanges,
                    (
                        await handleStoreItemAcquisition(
                            reward.Rewards[0].StoreItem,
                            inventory,
                            reward.Rewards[0].ItemCount
                        )
                    ).InventoryChanges
                );
            }
        }
        entry.Claim = entry.Earn;
        await inventory.save();
        res.json({
            InventoryChanges: inventoryChanges,
            ClaimedXp: entry.Claim
        });
    } else {
        logger.debug(`data provided to ${req.path}: ${String(req.body)}`);
        throw new Error(`unexpected endlessXp mode: ${payload.Mode}`);
    }
};

type IEndlessXpRequest =
    | {
          Mode: "r";
          Category: TEndlessXpCategory;
          Choices: string[];
      }
    | {
          Mode: "c" | "something else";
          Category: TEndlessXpCategory;
      };

const generateRandomRewards = (deckName: string): ICountedStoreItem[] => {
    const reward = getRandomElement(ExportRewards[deckName][0])!;
    return [
        {
            StoreItem: reward.type,
            ItemCount: reward.itemCount
        }
    ];
};

const normalModeChosenRewards: Record<string, string[]> = {
    Excalibur: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/ExcaliburHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/ExcaliburChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Excalibur/RadialJavelinAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/ExcaliburSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/ExcaliburBlueprint"
    ],
    Trinity: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrinityHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrinityChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Trinity/EnergyVampireAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrinitySystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrinityBlueprint"
    ],
    Ember: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/EmberHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/EmberChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Ember/WorldOnFireAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/EmberSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/EmberBlueprint"
    ],
    Loki: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/LOKIHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/LOKIChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Loki/InvisibilityAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/LOKISystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/LOKIBlueprint"
    ],
    Mag: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/MagHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/MagChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Mag/CrushAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/MagSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/MagBlueprint"
    ],
    Rhino: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/RhinoHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/RhinoChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Rhino/RhinoChargeAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/RhinoSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/RhinoBlueprint"
    ],
    Ash: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/AshHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/AshChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Ninja/GlaiveAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/AshSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/AshBlueprint"
    ],
    Frost: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/FrostHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/FrostChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Frost/IceShieldAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/FrostSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/FrostBlueprint"
    ],
    Nyx: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/NyxHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/NyxChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Jade/SelfBulletAttractorAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/NyxSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/NyxBlueprint"
    ],
    Saryn: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/SarynHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/SarynChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Saryn/PoisonAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/SarynSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/SarynBlueprint"
    ],
    Vauban: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrapperHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrapperChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Trapper/LevTrapAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrapperSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrapperBlueprint"
    ],
    Nova: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/NovaHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/NovaChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/AntiMatter/MolecularPrimeAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/NovaSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/NovaBlueprint"
    ],
    Nekros: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/NecroHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/NecroChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Necro/CloneTheDeadAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/NecroSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/NecroBlueprint"
    ],
    Valkyr: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/BerserkerHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/BerserkerChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Berserker/IntimidateAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/BerserkerSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/BerserkerBlueprint"
    ],
    Oberon: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/PaladinHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/PaladinChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Paladin/RegenerationAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/PaladinSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/PaladinBlueprint"
    ],
    Hydroid: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/HydroidHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/HydroidChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Pirate/CannonBarrageAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/HydroidSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/HydroidBlueprint"
    ],
    Mirage: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/HarlequinHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/HarlequinChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Harlequin/LightAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/HarlequinSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/HarlequinBlueprint"
    ],
    Limbo: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/MagicianHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/MagicianChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Magician/TearInSpaceAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/MagicianSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/MagicianBlueprint"
    ],
    Mesa: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/GunslingerHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/GunslingerChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Cowgirl/GunFuPvPAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/GunslingerSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/GunslingerBlueprint"
    ],
    Chroma: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/ChromaHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/ChromaChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Dragon/DragonLuckAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/ChromaSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/ChromaBlueprint"
    ],
    Atlas: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/BrawlerHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/BrawlerChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Brawler/BrawlerPassiveAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/BrawlerSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/BrawlerBlueprint"
    ],
    Ivara: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/RangerHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/RangerChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Ranger/RangerStealAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/RangerSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/RangerBlueprint"
    ],
    Inaros: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/MummyHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/MummyChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Sandman/SandmanSwarmAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/MummySystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/MummyBlueprint"
    ],
    Titania: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/FairyHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/FairyChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Fairy/FairyFlightAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/FairySystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/FairyBlueprint"
    ],
    Nidus: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/NidusHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/NidusChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Infestation/InfestPodsAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/NidusSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/NidusBlueprint"
    ],
    Octavia: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/OctaviaHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/OctaviaChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Bard/BardCharmAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/OctaviaSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/OctaviaBlueprint"
    ],
    Harrow: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/PriestHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/PriestChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Priest/PriestPactAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/PriestSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/PriestBlueprint"
    ],
    Gara: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/GlassHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/GlassChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Glass/GlassFragmentAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/GlassSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/GlassBlueprint"
    ],
    Khora: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/KhoraHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/KhoraChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Khora/KhoraCrackAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/KhoraSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/KhoraBlueprint"
    ],
    Revenant: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/RevenantHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/RevenantChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Revenant/RevenantMarkAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/RevenantSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/RevenantBlueprint"
    ],
    Garuda: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/GarudaHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/GarudaChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Garuda/GarudaUnstoppableAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/GarudaSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/GarudaBlueprint"
    ],
    Baruuk: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/PacifistHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/PacifistChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/Pacifist/PacifistFistAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/PacifistSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/PacifistBlueprint"
    ],
    Hildryn: [
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/IronframeHelmetBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/IronframeChassisBlueprint",
        "/Lotus/StoreItems/Powersuits/IronFrame/IronFrameStripAugmentCard",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/IronframeSystemsBlueprint",
        "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/IronframeBlueprint"
    ]
};

const generateNormalModeRewards = (choices: string[]): IEndlessXpReward[] => {
    const choiceRewards = normalModeChosenRewards[choices[0]];
    return [
        {
            RequiredTotalXp: 190,
            Rewards: generateRandomRewards(
                "/Lotus/Types/Game/MissionDecks/DuviriEndlessCircuitRewards/DuviriEndlessNormalSilverRewards"
            )
        },
        {
            RequiredTotalXp: 400,
            Rewards: [
                {
                    StoreItem: choiceRewards[0],
                    ItemCount: 1
                }
            ]
        },
        {
            RequiredTotalXp: 630,
            Rewards: generateRandomRewards(
                "/Lotus/Types/Game/MissionDecks/DuviriEndlessCircuitRewards/DuviriEndlessNormalSilverRewards"
            )
        },
        {
            RequiredTotalXp: 890,
            Rewards: generateRandomRewards(
                "/Lotus/Types/Game/MissionDecks/DuviriEndlessCircuitRewards/DuviriEndlessNormalMODRewards"
            )
        },
        {
            RequiredTotalXp: 1190,
            Rewards: [
                {
                    StoreItem: choiceRewards[1],
                    ItemCount: 1
                }
            ]
        },
        {
            RequiredTotalXp: 1540,
            Rewards: generateRandomRewards(
                "/Lotus/Types/Game/MissionDecks/DuviriEndlessCircuitRewards/DuviriEndlessNormalGoldRewards"
            )
        },
        {
            RequiredTotalXp: 1950,
            Rewards: [
                {
                    StoreItem: choiceRewards[2],
                    ItemCount: 1
                }
            ]
        },
        {
            RequiredTotalXp: 2430,
            Rewards: [
                {
                    StoreItem: choiceRewards[3],
                    ItemCount: 1
                }
            ]
        },
        {
            RequiredTotalXp: 2990,
            Rewards: generateRandomRewards(
                "/Lotus/Types/Game/MissionDecks/DuviriEndlessCircuitRewards/DuviriEndlessNormalArcaneRewards"
            )
        },
        {
            RequiredTotalXp: 3640,
            Rewards: [
                {
                    StoreItem: choiceRewards[4],
                    ItemCount: 1
                }
            ]
        }
    ];
};

const hardModeChosenRewards: Record<string, string> = {
    Braton: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Primary/BratonIncarnonUnlocker",
    Lato: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Secondary/LatoIncarnonUnlocker",
    Skana: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Melee/SkanaIncarnonUnlocker",
    Paris: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Primary/ParisIncarnonUnlocker",
    Kunai: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Secondary/KunaiIncarnonUnlocker",
    Boar: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Primary/BoarIncarnonUnlocker",
    Gammacor: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Secondary/GammacorIncarnonUnlocker",
    Anku: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Melee/AnkuIncarnonUnlocker",
    Gorgon: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Primary/GorgonIncarnonUnlocker",
    Angstrum: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Secondary/AngstrumIncarnonUnlocker",
    Bo: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Melee/BoIncarnonUnlocker",
    Latron: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Primary/LatronIncarnonUnlocker",
    Furis: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Secondary/FurisIncarnonUnlocker",
    Furax: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Melee/FuraxIncarnonUnlocker",
    Strun: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Primary/StrunIncarnonUnlocker",
    Lex: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Secondary/LexIncarnonUnlocker",
    Magistar: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Melee/MagistarIncarnonUnlocker",
    Boltor: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Primary/BoltorIncarnonUnlocker",
    Bronco: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Secondary/BroncoIncarnonUnlocker",
    CeramicDagger: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Melee/CeramicDaggerIncarnonUnlocker",
    Torid: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Primary/ToridIncarnonUnlocker",
    DualToxocyst: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Secondary/DualToxocystIncarnonUnlocker",
    DualIchor: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Melee/DualIchorIncarnonUnlocker",
    Miter: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Primary/MiterIncarnonUnlocker",
    Atomos: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Secondary/AtomosIncarnonUnlocker",
    AckAndBrunt: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Melee/AckAndBruntIncarnonUnlocker",
    Soma: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Primary/SomaIncarnonUnlocker",
    Vasto: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Secondary/VastoIncarnonUnlocker",
    NamiSolo: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Melee/NamiSoloIncarnonUnlocker",
    Burston: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Primary/BurstonIncarnonUnlocker",
    Zylok: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Secondary/ZylokIncarnonUnlocker",
    Sibear: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Melee/SibearIncarnonUnlocker",
    Dread: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Primary/DreadIncarnonUnlocker",
    Despair: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Secondary/DespairIncarnonUnlocker",
    Hate: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Melee/HateIncarnonUnlocker",
    Dera: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Primary/DeraIncarnonUnlocker",
    Cestra: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Secondary/CestraIncarnonUnlocker",
    Okina: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Melee/OkinaIncarnonUnlocker",
    Sybaris: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Primary/SybarisIncarnonUnlocker",
    Sicarus: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Secondary/SicarusIncarnonUnlocker",
    Vectis: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Primary/VectisIncarnonUnlocker",
    Stug: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Secondary/StugIncarnonUnlocker",
    Ballistica: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Secondary/BallisticaIncarnonUnlocker",
    Destreza: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Melee/DestrezaIncarnonUnlocker",
    Obex: "/Lotus/StoreItems/Types/Items/MiscItems/IncarnonAdapters/Melee/ObexIncarnonUnlocker",
    RivenPrimary: "/Lotus/StoreItems/Upgrades/Mods/Randomized/RawRifleRandomMod",
    RivenSecondary: "/Lotus/StoreItems/Upgrades/Mods/Randomized/RawPistolRandomMod",
    RivenMelee: "/Lotus/StoreItems/Upgrades/Mods/Randomized/RawMeleeRandomMod",
    Kuva: "/Lotus/Types/Game/DuviriEndless/CircuitSteelPathBIGKuvaReward"
};

const generateHardModeRewards = (choices: string[]): IEndlessXpReward[] => {
    return [
        {
            RequiredTotalXp: 285,
            Rewards: generateRandomRewards(
                "/Lotus/Types/Game/MissionDecks/DuviriEndlessCircuitRewards/DuviriEndlessSteelPathSilverRewards"
            )
        },
        {
            RequiredTotalXp: 600,
            Rewards: generateRandomRewards(
                "/Lotus/Types/Game/MissionDecks/DuviriEndlessCircuitRewards/DuviriEndlessSteelPathArcaneRewards"
            )
        },
        {
            RequiredTotalXp: 945,
            Rewards: generateRandomRewards(
                "/Lotus/Types/Game/MissionDecks/DuviriEndlessCircuitRewards/DuviriEndlessSteelPathSilverRewards"
            )
        },
        {
            RequiredTotalXp: 1335,
            Rewards: generateRandomRewards(
                "/Lotus/Types/Game/MissionDecks/DuviriEndlessCircuitRewards/DuviriEndlessSteelPathSilverRewards"
            )
        },
        {
            RequiredTotalXp: 1785,
            Rewards: [
                {
                    StoreItem: hardModeChosenRewards[choices[0]],
                    ItemCount: 1
                }
            ]
        },
        {
            RequiredTotalXp: 2310,
            Rewards: generateRandomRewards(
                "/Lotus/Types/Game/MissionDecks/DuviriEndlessCircuitRewards/DuviriEndlessSteelPathGoldRewards"
            )
        },
        {
            RequiredTotalXp: 2925,
            Rewards: generateRandomRewards(
                "/Lotus/Types/Game/MissionDecks/DuviriEndlessCircuitRewards/DuviriEndlessSteelPathGoldRewards"
            )
        },
        {
            RequiredTotalXp: 3645,
            Rewards: generateRandomRewards(
                "/Lotus/Types/Game/MissionDecks/DuviriEndlessCircuitRewards/DuviriEndlessSteelPathArcaneRewards"
            )
        },
        {
            RequiredTotalXp: 4485,
            Rewards: generateRandomRewards(
                "/Lotus/Types/Game/MissionDecks/DuviriEndlessCircuitRewards/DuviriEndlessSteelPathSteelEssenceRewards"
            )
        },
        {
            RequiredTotalXp: 5460,
            Rewards: [
                {
                    StoreItem: hardModeChosenRewards[choices[1]],
                    ItemCount: 1
                }
            ]
        }
    ];
};