feat: rewards for overriden enemy caches #2919
							
								
								
									
										8
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@ -18,7 +18,7 @@
 | 
				
			|||||||
        "morgan": "^1.10.0",
 | 
					        "morgan": "^1.10.0",
 | 
				
			||||||
        "ncp": "^2.0.0",
 | 
					        "ncp": "^2.0.0",
 | 
				
			||||||
        "undici": "^7.10.0",
 | 
					        "undici": "^7.10.0",
 | 
				
			||||||
        "warframe-public-export-plus": "^0.5.91",
 | 
					        "warframe-public-export-plus": "^0.5.92",
 | 
				
			||||||
        "warframe-riven-info": "^0.1.2",
 | 
					        "warframe-riven-info": "^0.1.2",
 | 
				
			||||||
        "winston": "^3.17.0",
 | 
					        "winston": "^3.17.0",
 | 
				
			||||||
        "winston-daily-rotate-file": "^5.0.0",
 | 
					        "winston-daily-rotate-file": "^5.0.0",
 | 
				
			||||||
@ -5534,9 +5534,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/warframe-public-export-plus": {
 | 
					    "node_modules/warframe-public-export-plus": {
 | 
				
			||||||
      "version": "0.5.91",
 | 
					      "version": "0.5.92",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.91.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.92.tgz",
 | 
				
			||||||
      "integrity": "sha512-xp8rq/dvFC6+urb6vVFRtAmm1v0iE/ZALI3uVGBpblsVB/PWmGxjBBp8l00dCZs67JsqEKcrCcogKwtKTwDc1w=="
 | 
					      "integrity": "sha512-5O5VtyVXxKtl5QdpzoVyKov5GX6t3z/U5tqPq73kjoSyA5NQT2V9sWsZK4ASyY8Edv9hNsdwlZdsdP8QmYbubg=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/warframe-riven-info": {
 | 
					    "node_modules/warframe-riven-info": {
 | 
				
			||||||
      "version": "0.1.2",
 | 
					      "version": "0.1.2",
 | 
				
			||||||
 | 
				
			|||||||
@ -36,7 +36,7 @@
 | 
				
			|||||||
    "morgan": "^1.10.0",
 | 
					    "morgan": "^1.10.0",
 | 
				
			||||||
    "ncp": "^2.0.0",
 | 
					    "ncp": "^2.0.0",
 | 
				
			||||||
    "undici": "^7.10.0",
 | 
					    "undici": "^7.10.0",
 | 
				
			||||||
    "warframe-public-export-plus": "^0.5.91",
 | 
					    "warframe-public-export-plus": "^0.5.92",
 | 
				
			||||||
    "warframe-riven-info": "^0.1.2",
 | 
					    "warframe-riven-info": "^0.1.2",
 | 
				
			||||||
    "winston": "^3.17.0",
 | 
					    "winston": "^3.17.0",
 | 
				
			||||||
    "winston-daily-rotate-file": "^5.0.0",
 | 
					    "winston-daily-rotate-file": "^5.0.0",
 | 
				
			||||||
 | 
				
			|||||||
@ -117,6 +117,7 @@ export const createInventory = async (
 | 
				
			|||||||
            inventory.PlayedParkourTutorial = true;
 | 
					            inventory.PlayedParkourTutorial = true;
 | 
				
			||||||
            await addStartingGear(inventory);
 | 
					            await addStartingGear(inventory);
 | 
				
			||||||
            await completeQuest(inventory, "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain");
 | 
					            await completeQuest(inventory, "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain");
 | 
				
			||||||
 | 
					            await completeQuest(inventory, "/Lotus/Types/Keys/ModQuest/ModQuestKeyChain");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            const completedMissions = ["SolNode27", "SolNode89", "SolNode63", "SolNode85", "SolNode15", "SolNode79"];
 | 
					            const completedMissions = ["SolNode27", "SolNode89", "SolNode63", "SolNode85", "SolNode15", "SolNode79"];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -134,16 +135,6 @@ export const createInventory = async (
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//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 (
 | 
					export const addStartingGear = async (
 | 
				
			||||||
    inventory: TInventoryDatabaseDocument,
 | 
					    inventory: TInventoryDatabaseDocument,
 | 
				
			||||||
    startingGear?: TPartialStartingGear
 | 
					    startingGear?: TPartialStartingGear
 | 
				
			||||||
@ -196,6 +187,14 @@ export const addStartingGear = async (
 | 
				
			|||||||
    inventory.RegularCredits = 3000;
 | 
					    inventory.RegularCredits = 3000;
 | 
				
			||||||
    inventoryChanges.RegularCredits = 3000;
 | 
					    inventoryChanges.RegularCredits = 3000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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"
 | 
				
			||||||
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (const item of awakeningRewards) {
 | 
					    for (const item of awakeningRewards) {
 | 
				
			||||||
        const inventoryDelta = await addItem(inventory, item);
 | 
					        const inventoryDelta = await addItem(inventory, item);
 | 
				
			||||||
        combineInventoryChanges(inventoryChanges, inventoryDelta);
 | 
					        combineInventoryChanges(inventoryChanges, inventoryDelta);
 | 
				
			||||||
 | 
				
			|||||||
@ -65,7 +65,7 @@ export const createPersonalRooms = async (accountId: Types.ObjectId, shipId: Typ
 | 
				
			|||||||
        activeShipId: shipId
 | 
					        activeShipId: shipId
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    if (config.skipTutorial) {
 | 
					    if (config.skipTutorial) {
 | 
				
			||||||
        // unlocked during Vor's Prize
 | 
					        // unlocked during Vor's Prize and The Teacher quests
 | 
				
			||||||
        const defaultFeatures = [
 | 
					        const defaultFeatures = [
 | 
				
			||||||
            "/Lotus/Types/Items/ShipFeatureItems/MercuryNavigationFeatureItem",
 | 
					            "/Lotus/Types/Items/ShipFeatureItems/MercuryNavigationFeatureItem",
 | 
				
			||||||
            "/Lotus/Types/Items/ShipFeatureItems/ArsenalFeatureItem",
 | 
					            "/Lotus/Types/Items/ShipFeatureItems/ArsenalFeatureItem",
 | 
				
			||||||
 | 
				
			|||||||
@ -8,6 +8,7 @@ import {
 | 
				
			|||||||
    ExportAnimals,
 | 
					    ExportAnimals,
 | 
				
			||||||
    ExportEnemies,
 | 
					    ExportEnemies,
 | 
				
			||||||
    ExportFusionBundles,
 | 
					    ExportFusionBundles,
 | 
				
			||||||
 | 
					    ExportKeys,
 | 
				
			||||||
    ExportRegions,
 | 
					    ExportRegions,
 | 
				
			||||||
    ExportRelics,
 | 
					    ExportRelics,
 | 
				
			||||||
    ExportRewards
 | 
					    ExportRewards
 | 
				
			||||||
@ -1141,6 +1142,7 @@ export const addMissionRewards = async (
 | 
				
			|||||||
    const MissionRewards: IMissionReward[] = getRandomMissionDrops(
 | 
					    const MissionRewards: IMissionReward[] = getRandomMissionDrops(
 | 
				
			||||||
        inventory,
 | 
					        inventory,
 | 
				
			||||||
        rewardInfo,
 | 
					        rewardInfo,
 | 
				
			||||||
 | 
					        levelKeyName,
 | 
				
			||||||
        missions,
 | 
					        missions,
 | 
				
			||||||
        wagerTier,
 | 
					        wagerTier,
 | 
				
			||||||
        firstCompletion
 | 
					        firstCompletion
 | 
				
			||||||
@ -1756,6 +1758,7 @@ function getLevelCreditRewards(node: IRegion): number {
 | 
				
			|||||||
function getRandomMissionDrops(
 | 
					function getRandomMissionDrops(
 | 
				
			||||||
    inventory: TInventoryDatabaseDocument,
 | 
					    inventory: TInventoryDatabaseDocument,
 | 
				
			||||||
    RewardInfo: IRewardInfo,
 | 
					    RewardInfo: IRewardInfo,
 | 
				
			||||||
 | 
					    levelKeyName: string | undefined,
 | 
				
			||||||
    mission: IMission | undefined,
 | 
					    mission: IMission | undefined,
 | 
				
			||||||
    tierOverride: number | undefined,
 | 
					    tierOverride: number | undefined,
 | 
				
			||||||
    firstCompletion: boolean
 | 
					    firstCompletion: boolean
 | 
				
			||||||
@ -2193,7 +2196,7 @@ function getRandomMissionDrops(
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (region.cacheRewardManifest && RewardInfo.EnemyCachesFound) {
 | 
					        if (region.cacheRewardManifest && RewardInfo.EnemyCachesFound && !RewardInfo.goalId) {
 | 
				
			||||||
            const deck = ExportRewards[region.cacheRewardManifest];
 | 
					            const deck = ExportRewards[region.cacheRewardManifest];
 | 
				
			||||||
            for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
 | 
					            for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
 | 
				
			||||||
                const drop = getRandomRewardByChance(deck[rotation]);
 | 
					                const drop = getRandomRewardByChance(deck[rotation]);
 | 
				
			||||||
@ -2259,6 +2262,71 @@ function getRandomMissionDrops(
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (RewardInfo.EnemyCachesFound) {
 | 
				
			||||||
 | 
					        if (RewardInfo.goalId) {
 | 
				
			||||||
 | 
					            const goal = getWorldState().Goals.find(x => x._id.$oid == RewardInfo.goalId);
 | 
				
			||||||
 | 
					            if (goal) {
 | 
				
			||||||
 | 
					                let currentMissionKey: string | undefined;
 | 
				
			||||||
 | 
					                if (RewardInfo.node == goal.Node) {
 | 
				
			||||||
 | 
					                    currentMissionKey = goal.MissionKeyName;
 | 
				
			||||||
 | 
					                } else if (goal.ConcurrentNodes && goal.ConcurrentMissionKeyNames) {
 | 
				
			||||||
 | 
					                    for (let i = 0; i < goal.ConcurrentNodes.length; i++) {
 | 
				
			||||||
 | 
					                        if (RewardInfo.node == goal.ConcurrentNodes[i]) {
 | 
				
			||||||
 | 
					                            currentMissionKey = goal.ConcurrentMissionKeyNames[i];
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (currentMissionKey) {
 | 
				
			||||||
 | 
					                    const keyMeta = ExportKeys[currentMissionKey];
 | 
				
			||||||
 | 
					                    if (keyMeta.cacheRewardManifest) {
 | 
				
			||||||
 | 
					                        const deck = ExportRewards[keyMeta.cacheRewardManifest];
 | 
				
			||||||
 | 
					                        for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
 | 
				
			||||||
 | 
					                            const drop = getRandomRewardByChance(deck[rotation]);
 | 
				
			||||||
 | 
					                            if (drop) {
 | 
				
			||||||
 | 
					                                drops.push({
 | 
				
			||||||
 | 
					                                    StoreItem: drop.type,
 | 
				
			||||||
 | 
					                                    ItemCount: drop.itemCount,
 | 
				
			||||||
 | 
					                                    FromEnemyCache: true
 | 
				
			||||||
 | 
					                                });
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else if (RewardInfo.alertId) {
 | 
				
			||||||
 | 
					            const alert = getWorldState().Alerts.find(x => x._id.$oid == RewardInfo.alertId);
 | 
				
			||||||
 | 
					            if (alert && alert.MissionInfo.enemyCacheOverride) {
 | 
				
			||||||
 | 
					                const deck = ExportRewards[alert.MissionInfo.enemyCacheOverride];
 | 
				
			||||||
 | 
					                for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
 | 
				
			||||||
 | 
					                    const drop = getRandomRewardByChance(deck[rotation]);
 | 
				
			||||||
 | 
					                    if (drop) {
 | 
				
			||||||
 | 
					                        drops.push({
 | 
				
			||||||
 | 
					                            StoreItem: drop.type,
 | 
				
			||||||
 | 
					                            ItemCount: drop.itemCount,
 | 
				
			||||||
 | 
					                            FromEnemyCache: true
 | 
				
			||||||
 | 
					                        });
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else if (levelKeyName) {
 | 
				
			||||||
 | 
					            const keyMeta = ExportKeys[levelKeyName];
 | 
				
			||||||
 | 
					            if (keyMeta.cacheRewardManifest) {
 | 
				
			||||||
 | 
					                const deck = ExportRewards[keyMeta.cacheRewardManifest];
 | 
				
			||||||
 | 
					                for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
 | 
				
			||||||
 | 
					                    const drop = getRandomRewardByChance(deck[rotation]);
 | 
				
			||||||
 | 
					                    if (drop) {
 | 
				
			||||||
 | 
					                        drops.push({
 | 
				
			||||||
 | 
					                            StoreItem: drop.type,
 | 
				
			||||||
 | 
					                            ItemCount: drop.itemCount,
 | 
				
			||||||
 | 
					                            FromEnemyCache: true
 | 
				
			||||||
 | 
					                        });
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (inventory.missionsCanGiveAllRelics) {
 | 
					    if (inventory.missionsCanGiveAllRelics) {
 | 
				
			||||||
        for (const drop of drops) {
 | 
					        for (const drop of drops) {
 | 
				
			||||||
            const itemType = fromStoreItem(drop.StoreItem);
 | 
					            const itemType = fromStoreItem(drop.StoreItem);
 | 
				
			||||||
 | 
				
			|||||||
@ -58,6 +58,7 @@ export interface IAlertMissionInfo {
 | 
				
			|||||||
    maxEnemyLevel?: number;
 | 
					    maxEnemyLevel?: number;
 | 
				
			||||||
    maxWaveNum?: number;
 | 
					    maxWaveNum?: number;
 | 
				
			||||||
    descText?: string;
 | 
					    descText?: string;
 | 
				
			||||||
 | 
					    enemyCacheOverride?: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    maxRotations?: number; // SNS specific field
 | 
					    maxRotations?: number; // SNS specific field
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user