feat: tutorial and natural new player experience #983
							
								
								
									
										6
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										6
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@ -4093,9 +4093,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/warframe-public-export-plus": {
 | 
					    "node_modules/warframe-public-export-plus": {
 | 
				
			||||||
      "version": "0.5.30",
 | 
					      "version": "0.5.32",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.30.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.32.tgz",
 | 
				
			||||||
      "integrity": "sha512-vzs+naEqp3iFZTbgIky4jiNbjNIovuR4oSimrFiuyIbrnfTlfXFzDfzT0hG2rgS8yEXBAbOcv2Zfm3fmWuZ0Kg=="
 | 
					      "integrity": "sha512-jO9i2Gzz9DWibiHlEO17D975ajs6KrTay8cS5I0GkUUe1XWVU8mML4b+IYCHzM4FWq1t6p2YPCGznQfknqvorg=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/warframe-riven-info": {
 | 
					    "node_modules/warframe-riven-info": {
 | 
				
			||||||
      "version": "0.1.2",
 | 
					      "version": "0.1.2",
 | 
				
			||||||
 | 
				
			|||||||
@ -1 +1,127 @@
 | 
				
			|||||||
export const giveStartingGearController = async () => {};
 | 
					import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
				
			||||||
 | 
					import { InventoryDocumentProps } from "@/src/models/inventoryModels/inventoryModel";
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					    addEquipment,
 | 
				
			||||||
 | 
					    addItem,
 | 
				
			||||||
 | 
					    combineInventoryChanges,
 | 
				
			||||||
 | 
					    getInventory,
 | 
				
			||||||
 | 
					    updateSlots
 | 
				
			||||||
 | 
					} from "@/src/services/inventoryService";
 | 
				
			||||||
 | 
					import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
				
			||||||
 | 
					import { IInventoryClient, IInventoryDatabase, InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
				
			||||||
 | 
					import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
				
			||||||
 | 
					import { RequestHandler } from "express";
 | 
				
			||||||
 | 
					import { HydratedDocument } from "mongoose";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type TPartialStartingGear = Pick<IInventoryClient, "LongGuns" | "Suits" | "Pistols" | "Melee">;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const giveStartingGearController: RequestHandler = async (req, res) => {
 | 
				
			||||||
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
 | 
					    const startingGear = getJSONfromString<TPartialStartingGear>(String(req.body));
 | 
				
			||||||
 | 
					    const inventory = await getInventory(accountId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const inventoryChanges = await addStartingGear(inventory, startingGear);
 | 
				
			||||||
 | 
					    await inventory.save();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    res.send(inventoryChanges);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//TODO: RawUpgrades might need to return a LastAdded
 | 
				
			||||||
 | 
					const awakeningRewards = [
 | 
				
			||||||
 | 
					    "/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem1",
 | 
				
			||||||
 | 
					    "/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem2",
 | 
				
			||||||
 | 
					    "/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem3",
 | 
				
			||||||
 | 
					    "/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem4",
 | 
				
			||||||
 | 
					    "/Lotus/Types/Restoratives/LisetAutoHack",
 | 
				
			||||||
 | 
					    "/Lotus/Upgrades/Mods/Warframe/AvatarShieldMaxMod"
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const addStartingGear = async (
 | 
				
			||||||
 | 
					    inventory: HydratedDocument<IInventoryDatabase, InventoryDocumentProps>,
 | 
				
			||||||
 | 
					    startingGear: TPartialStartingGear | undefined = undefined
 | 
				
			||||||
 | 
					) => {
 | 
				
			||||||
 | 
					    const { LongGuns, Pistols, Suits, Melee } = startingGear || {
 | 
				
			||||||
 | 
					        LongGuns: [{ ItemType: "/Lotus/Weapons/Tenno/Rifle/Rifle" }],
 | 
				
			||||||
 | 
					        Pistols: [{ ItemType: "/Lotus/Weapons/Tenno/Pistol/Pistol" }],
 | 
				
			||||||
 | 
					        Suits: [{ ItemType: "/Lotus/Powersuits/Excalibur/Excalibur" }],
 | 
				
			||||||
 | 
					        Melee: [{ ItemType: "/Lotus/Weapons/Tenno/Melee/LongSword/LongSword" }]
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //TODO: properly merge weapon bin changes it is currently static here
 | 
				
			||||||
 | 
					    const inventoryChanges: IInventoryChanges = {};
 | 
				
			||||||
 | 
					    addEquipment(inventory, "LongGuns", LongGuns[0].ItemType, undefined, inventoryChanges);
 | 
				
			||||||
 | 
					    addEquipment(inventory, "Pistols", Pistols[0].ItemType, undefined, inventoryChanges);
 | 
				
			||||||
 | 
					    addEquipment(inventory, "Melee", Melee[0].ItemType, undefined, inventoryChanges);
 | 
				
			||||||
 | 
					    addEquipment(inventory, "Suits", Suits[0].ItemType, undefined, inventoryChanges, { Configs: Suits[0].Configs });
 | 
				
			||||||
 | 
					    addEquipment(
 | 
				
			||||||
 | 
					        inventory,
 | 
				
			||||||
 | 
					        "DataKnives",
 | 
				
			||||||
 | 
					        "/Lotus/Weapons/Tenno/HackingDevices/TnHackingDevice/TnHackingDeviceWeapon",
 | 
				
			||||||
 | 
					        undefined,
 | 
				
			||||||
 | 
					        inventoryChanges,
 | 
				
			||||||
 | 
					        { XP: 450_000 }
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					    addEquipment(
 | 
				
			||||||
 | 
					        inventory,
 | 
				
			||||||
 | 
					        "Scoops",
 | 
				
			||||||
 | 
					        "/Lotus/Weapons/Tenno/Speedball/SpeedballWeaponTest",
 | 
				
			||||||
 | 
					        undefined,
 | 
				
			||||||
 | 
					        inventoryChanges
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    updateSlots(inventory, InventorySlot.SUITS, 0, 1);
 | 
				
			||||||
 | 
					    updateSlots(inventory, InventorySlot.WEAPONS, 0, 3);
 | 
				
			||||||
 | 
					    inventoryChanges.SuitBin = { count: 1, platinum: 0, Slots: -1 };
 | 
				
			||||||
 | 
					    inventoryChanges.WeaponBin = { count: 3, platinum: 0, Slots: -3 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await addItem(inventory, "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain");
 | 
				
			||||||
 | 
					    inventory.ActiveQuest = "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    inventory.PremiumCredits = 50;
 | 
				
			||||||
 | 
					    inventory.PremiumCreditsFree = 50;
 | 
				
			||||||
 | 
					    inventoryChanges.PremiumCredits = 50;
 | 
				
			||||||
 | 
					    inventoryChanges.PremiumCreditsFree = 50;
 | 
				
			||||||
 | 
					    inventory.RegularCredits = 3000;
 | 
				
			||||||
 | 
					    inventoryChanges.RegularCredits = 3000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (const item of awakeningRewards) {
 | 
				
			||||||
 | 
					        const inventoryDelta = await addItem(inventory, item);
 | 
				
			||||||
 | 
					        combineInventoryChanges(inventoryChanges, inventoryDelta.InventoryChanges);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // currentloadoutids
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //     "LoadOutPresets": {
 | 
				
			||||||
 | 
					    //     "NORMAL": [
 | 
				
			||||||
 | 
					    //       {
 | 
				
			||||||
 | 
					    //         "s": {
 | 
				
			||||||
 | 
					    //           "ItemId": { "$oid": "67b73fbfb56b4b84d70433c2" },
 | 
				
			||||||
 | 
					    //           "mod": 0,
 | 
				
			||||||
 | 
					    //           "cus": 0
 | 
				
			||||||
 | 
					    //         },
 | 
				
			||||||
 | 
					    //         "p": {
 | 
				
			||||||
 | 
					    //           "ItemId": { "$oid": "67b73fbfb56b4b84d70433c5" },
 | 
				
			||||||
 | 
					    //           "mod": 0,
 | 
				
			||||||
 | 
					    //           "cus": 0
 | 
				
			||||||
 | 
					    //         },
 | 
				
			||||||
 | 
					    //         "l": {
 | 
				
			||||||
 | 
					    //           "ItemId": { "$oid": "67b73fbfb56b4b84d70433c4" },
 | 
				
			||||||
 | 
					    //           "mod": 0,
 | 
				
			||||||
 | 
					    //           "cus": 0
 | 
				
			||||||
 | 
					    //         },
 | 
				
			||||||
 | 
					    //         "m": {
 | 
				
			||||||
 | 
					    //           "ItemId": { "$oid": "67b73fbfb56b4b84d70433c6" },
 | 
				
			||||||
 | 
					    //           "mod": 0,
 | 
				
			||||||
 | 
					    //           "cus": 0
 | 
				
			||||||
 | 
					    //         },
 | 
				
			||||||
 | 
					    //         "ItemId": { "$oid": "67b73fbfb56b4b84d70433c7" }
 | 
				
			||||||
 | 
					    //       }
 | 
				
			||||||
 | 
					    //     ]
 | 
				
			||||||
 | 
					    //   },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    inventory.PlayedParkourTutorial = true;
 | 
				
			||||||
 | 
					    inventory.ReceivedStartingGear = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //originally ship is returned
 | 
				
			||||||
 | 
					    //also weaponskins
 | 
				
			||||||
 | 
					    return inventoryChanges;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -23,7 +23,8 @@ import {
 | 
				
			|||||||
    IInventoryDatabase,
 | 
					    IInventoryDatabase,
 | 
				
			||||||
    IKubrowPetEggDatabase,
 | 
					    IKubrowPetEggDatabase,
 | 
				
			||||||
    IKubrowPetEggClient,
 | 
					    IKubrowPetEggClient,
 | 
				
			||||||
    ILibraryAvailableDailyTaskInfo
 | 
					    ILibraryAvailableDailyTaskInfo,
 | 
				
			||||||
 | 
					    ICalendarProgress
 | 
				
			||||||
} from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					} from "@/src/types/inventoryTypes/inventoryTypes";
 | 
				
			||||||
import { IGenericUpdate } from "../types/genericUpdate";
 | 
					import { IGenericUpdate } from "../types/genericUpdate";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
@ -33,7 +34,7 @@ import {
 | 
				
			|||||||
} from "../types/requestTypes";
 | 
					} from "../types/requestTypes";
 | 
				
			||||||
import { logger } from "@/src/utils/logger";
 | 
					import { logger } from "@/src/utils/logger";
 | 
				
			||||||
import { getExalted, getKeyChainItems } from "@/src/services/itemDataService";
 | 
					import { getExalted, getKeyChainItems } from "@/src/services/itemDataService";
 | 
				
			||||||
import { IEquipmentClient, IItemConfig } from "../types/inventoryTypes/commonInventoryTypes";
 | 
					import { IEquipmentClient, IEquipmentDatabase, IItemConfig } from "../types/inventoryTypes/commonInventoryTypes";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    ExportArcanes,
 | 
					    ExportArcanes,
 | 
				
			||||||
    ExportCustoms,
 | 
					    ExportCustoms,
 | 
				
			||||||
@ -53,6 +54,8 @@ import { creditBundles, fusionBundles } from "@/src/services/missionInventoryUpd
 | 
				
			|||||||
import { IKeyChainRequest } from "@/src/controllers/api/giveKeyChainTriggeredItemsController";
 | 
					import { IKeyChainRequest } from "@/src/controllers/api/giveKeyChainTriggeredItemsController";
 | 
				
			||||||
import { toOid } from "../helpers/inventoryHelpers";
 | 
					import { toOid } from "../helpers/inventoryHelpers";
 | 
				
			||||||
import { generateRewardSeed } from "@/src/controllers/api/getNewRewardSeedController";
 | 
					import { generateRewardSeed } from "@/src/controllers/api/getNewRewardSeedController";
 | 
				
			||||||
 | 
					import { addStartingGear } from "@/src/controllers/api/giveStartingGearController";
 | 
				
			||||||
 | 
					import { completeQuest } from "@/src/services/questService";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const createInventory = async (
 | 
					export const createInventory = async (
 | 
				
			||||||
    accountOwnerId: Types.ObjectId,
 | 
					    accountOwnerId: Types.ObjectId,
 | 
				
			||||||
@ -68,68 +71,17 @@ export const createInventory = async (
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        inventory.LibraryAvailableDailyTaskInfo = createLibraryAvailableDailyTaskInfo();
 | 
					        inventory.LibraryAvailableDailyTaskInfo = createLibraryAvailableDailyTaskInfo();
 | 
				
			||||||
 | 
					        inventory.CalendarProgress = createCalendar();
 | 
				
			||||||
        inventory.RewardSeed = generateRewardSeed();
 | 
					        inventory.RewardSeed = generateRewardSeed();
 | 
				
			||||||
        //await addItem(inventory, "/Lotus/Types/Friendly/PlayerControllable/Weapons/DuviriDualSwords"); TODO: can enable this once driter melees have been added to export
 | 
					        inventory.DuviriInfo = {
 | 
				
			||||||
 | 
					            Seed: generateRewardSeed(),
 | 
				
			||||||
 | 
					            NumCompletions: 0
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        await addItem(inventory, "/Lotus/Types/Friendly/PlayerControllable/Weapons/DuviriDualSwords");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (config.skipTutorial) {
 | 
					        if (config.skipTutorial) {
 | 
				
			||||||
            const defaultEquipment = [
 | 
					            await addStartingGear(inventory);
 | 
				
			||||||
                // Awakening rewards
 | 
					            await completeQuest(inventory, "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain");
 | 
				
			||||||
                { ItemCount: 1, ItemType: "/Lotus/Powersuits/Excalibur/Excalibur" },
 | 
					 | 
				
			||||||
                { ItemCount: 1, ItemType: "/Lotus/Weapons/Tenno/Melee/LongSword/LongSword" },
 | 
					 | 
				
			||||||
                { ItemCount: 1, ItemType: "/Lotus/Weapons/Tenno/Pistol/Pistol" },
 | 
					 | 
				
			||||||
                { ItemCount: 1, ItemType: "/Lotus/Weapons/Tenno/Rifle/Rifle" },
 | 
					 | 
				
			||||||
                { ItemCount: 1, ItemType: "/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem1" },
 | 
					 | 
				
			||||||
                { ItemCount: 1, ItemType: "/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem2" },
 | 
					 | 
				
			||||||
                { ItemCount: 1, ItemType: "/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem3" },
 | 
					 | 
				
			||||||
                { ItemCount: 1, ItemType: "/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem4" },
 | 
					 | 
				
			||||||
                { ItemCount: 1, ItemType: "/Lotus/Types/Restoratives/LisetAutoHack" }
 | 
					 | 
				
			||||||
            ];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // const vorsPrizeRewards = [
 | 
					 | 
				
			||||||
            //     // Vor's Prize rewards
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Upgrades/Mods/Warframe/AvatarHealthMaxMod" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Upgrades/Mods/Warframe/AvatarShieldMaxMod" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Upgrades/Mods/Warframe/AvatarAbilityRangeMod" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Upgrades/Mods/Warframe/AvatarAbilityStrengthMod" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Upgrades/Mods/Warframe/AvatarAbilityDurationMod" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Upgrades/Mods/Warframe/AvatarPickupBonusMod" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Upgrades/Mods/Warframe/AvatarPowerMaxMod" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Upgrades/Mods/Warframe/AvatarEnemyRadarMod" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Upgrades/Mods/Melee/WeaponFireRateMod" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Upgrades/Mods/Melee/WeaponMeleeDamageMod" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Upgrades/Mods/Rifle/WeaponFactionDamageCorpus" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Upgrades/Mods/Rifle/WeaponFactionDamageGrineer" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Upgrades/Mods/Rifle/WeaponDamageAmountMod" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Upgrades/Mods/Pistol/WeaponFireDamageMod" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Upgrades/Mods/Pistol/WeaponElectricityDamageMod" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Upgrades/Mods/Pistol/WeaponDamageAmountMod" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Types/Recipes/Weapons/BurstonRifleBlueprint" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 1, ItemType: "/Lotus/Types/Items/MiscItems/Morphic" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 400, ItemType: "/Lotus/Types/Items/MiscItems/PolymerBundle" },
 | 
					 | 
				
			||||||
            //     { ItemCount: 150, ItemType: "/Lotus/Types/Items/MiscItems/AlloyPlate" }
 | 
					 | 
				
			||||||
            // ];
 | 
					 | 
				
			||||||
            for (const equipment of defaultEquipment) {
 | 
					 | 
				
			||||||
                await addItem(inventory, equipment.ItemType, equipment.ItemCount);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Missing in Public Export
 | 
					 | 
				
			||||||
            inventory.Horses.push({
 | 
					 | 
				
			||||||
                ItemType: "/Lotus/Types/NeutralCreatures/ErsatzHorse/ErsatzHorsePowerSuit"
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
            inventory.DataKnives.push({
 | 
					 | 
				
			||||||
                ItemType: "/Lotus/Weapons/Tenno/HackingDevices/TnHackingDevice/TnHackingDeviceWeapon",
 | 
					 | 
				
			||||||
                XP: 450000
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
            inventory.Scoops.push({
 | 
					 | 
				
			||||||
                ItemType: "/Lotus/Weapons/Tenno/Speedball/SpeedballWeaponTest"
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
            inventory.DrifterMelee.push({
 | 
					 | 
				
			||||||
                ItemType: "/Lotus/Types/Friendly/PlayerControllable/Weapons/DuviriDualSwords"
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            inventory.QuestKeys.push({
 | 
					 | 
				
			||||||
                ItemType: "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain"
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            const completedMissions = ["SolNode27", "SolNode89", "SolNode63", "SolNode85", "SolNode15", "SolNode79"];
 | 
					            const completedMissions = ["SolNode27", "SolNode89", "SolNode63", "SolNode85", "SolNode15", "SolNode79"];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -139,9 +91,6 @@ export const createInventory = async (
 | 
				
			|||||||
                    Tag: tag
 | 
					                    Tag: tag
 | 
				
			||||||
                }))
 | 
					                }))
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
 | 
					 | 
				
			||||||
            inventory.RegularCredits = 25000;
 | 
					 | 
				
			||||||
            inventory.FusionPoints = 180;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        await inventory.save();
 | 
					        await inventory.save();
 | 
				
			||||||
@ -156,6 +105,7 @@ export const createInventory = async (
 | 
				
			|||||||
 * @param InventoryChanges - will hold the combined changes
 | 
					 * @param InventoryChanges - will hold the combined changes
 | 
				
			||||||
 * @param delta - inventory changes to be added
 | 
					 * @param delta - inventory changes to be added
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					//TODO: this fails silently when providing an incorrect object to delta
 | 
				
			||||||
export const combineInventoryChanges = (InventoryChanges: IInventoryChanges, delta: IInventoryChanges): void => {
 | 
					export const combineInventoryChanges = (InventoryChanges: IInventoryChanges, delta: IInventoryChanges): void => {
 | 
				
			||||||
    for (const key in delta) {
 | 
					    for (const key in delta) {
 | 
				
			||||||
        if (!(key in InventoryChanges)) {
 | 
					        if (!(key in InventoryChanges)) {
 | 
				
			||||||
@ -596,7 +546,8 @@ export const addSentinelWeapon = (
 | 
				
			|||||||
export const addPowerSuit = (
 | 
					export const addPowerSuit = (
 | 
				
			||||||
    inventory: TInventoryDatabaseDocument,
 | 
					    inventory: TInventoryDatabaseDocument,
 | 
				
			||||||
    powersuitName: string,
 | 
					    powersuitName: string,
 | 
				
			||||||
    inventoryChanges: IInventoryChanges = {}
 | 
					    inventoryChanges: IInventoryChanges = {},
 | 
				
			||||||
 | 
					    configs: IItemConfig[] = []
 | 
				
			||||||
): IInventoryChanges => {
 | 
					): IInventoryChanges => {
 | 
				
			||||||
    const specialItems = getExalted(powersuitName);
 | 
					    const specialItems = getExalted(powersuitName);
 | 
				
			||||||
    if (specialItems) {
 | 
					    if (specialItems) {
 | 
				
			||||||
@ -604,7 +555,7 @@ export const addPowerSuit = (
 | 
				
			|||||||
            addSpecialItem(inventory, specialItem, inventoryChanges);
 | 
					            addSpecialItem(inventory, specialItem, inventoryChanges);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    const suitIndex = inventory.Suits.push({ ItemType: powersuitName, Configs: [], UpgradeVer: 101, XP: 0 }) - 1;
 | 
					    const suitIndex = inventory.Suits.push({ ItemType: powersuitName, Configs: configs, UpgradeVer: 101, XP: 0 }) - 1;
 | 
				
			||||||
    inventoryChanges.Suits ??= [];
 | 
					    inventoryChanges.Suits ??= [];
 | 
				
			||||||
    inventoryChanges.Suits.push(inventory.Suits[suitIndex].toJSON<IEquipmentClient>());
 | 
					    inventoryChanges.Suits.push(inventory.Suits[suitIndex].toJSON<IEquipmentClient>());
 | 
				
			||||||
    return inventoryChanges;
 | 
					    return inventoryChanges;
 | 
				
			||||||
@ -785,15 +736,19 @@ export const addEquipment = (
 | 
				
			|||||||
    category: TEquipmentKey,
 | 
					    category: TEquipmentKey,
 | 
				
			||||||
    type: string,
 | 
					    type: string,
 | 
				
			||||||
    modularParts: string[] | undefined = undefined,
 | 
					    modularParts: string[] | undefined = undefined,
 | 
				
			||||||
    inventoryChanges: IInventoryChanges = {}
 | 
					    inventoryChanges: IInventoryChanges = {},
 | 
				
			||||||
 | 
					    defaultOverwrites: Partial<IEquipmentDatabase> | undefined = undefined
 | 
				
			||||||
): IInventoryChanges => {
 | 
					): IInventoryChanges => {
 | 
				
			||||||
    const index =
 | 
					    const equipment = Object.assign(
 | 
				
			||||||
        inventory[category].push({
 | 
					        {
 | 
				
			||||||
            ItemType: type,
 | 
					            ItemType: type,
 | 
				
			||||||
            Configs: [],
 | 
					            Configs: [],
 | 
				
			||||||
            XP: 0,
 | 
					            XP: 0,
 | 
				
			||||||
            ModularParts: modularParts
 | 
					            ModularParts: modularParts
 | 
				
			||||||
        }) - 1;
 | 
					        },
 | 
				
			||||||
 | 
					        defaultOverwrites
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					    const index = inventory[category].push(equipment) - 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    inventoryChanges[category] ??= [];
 | 
					    inventoryChanges[category] ??= [];
 | 
				
			||||||
    inventoryChanges[category].push(inventory[category][index].toJSON<IEquipmentClient>());
 | 
					    inventoryChanges[category].push(inventory[category][index].toJSON<IEquipmentClient>());
 | 
				
			||||||
@ -1190,3 +1145,17 @@ const createLibraryAvailableDailyTaskInfo = (): ILibraryAvailableDailyTaskInfo =
 | 
				
			|||||||
        RewardStanding: 7500
 | 
					        RewardStanding: 7500
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const createCalendar = (): ICalendarProgress => {
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					        Version: 19,
 | 
				
			||||||
 | 
					        Iteration: 2,
 | 
				
			||||||
 | 
					        YearProgress: { Upgrades: [] },
 | 
				
			||||||
 | 
					        SeasonProgress: {
 | 
				
			||||||
 | 
					            SeasonType: "CST_SPRING",
 | 
				
			||||||
 | 
					            LastCompletedDayIdx: -1,
 | 
				
			||||||
 | 
					            LastCompletedChallengeDayIdx: -1,
 | 
				
			||||||
 | 
					            ActivatedChallenges: []
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user