From 261dbd5fdf532c1d438fd057915be068e9103a00 Mon Sep 17 00:00:00 2001 From: VampireKitten Date: Wed, 13 Aug 2025 07:13:26 -0700 Subject: [PATCH] feat: railjack abandoned caches (#2611) Closes #2602 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2611 Reviewed-by: Sainan <63328889+sainan@users.noreply.github.com> Co-authored-by: VampireKitten Co-committed-by: VampireKitten --- src/services/missionInventoryUpdateService.ts | 30 +++++++++++++++++++ src/types/requestTypes.ts | 2 ++ 2 files changed, 32 insertions(+) diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 907ddc70..7e946df2 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -2000,6 +2000,36 @@ function getRandomMissionDrops( } }); + // Railjack Abandoned Cache Rewards, Rotation A (Mandatory Objectives) + if (RewardInfo.POICompletions) { + if (region.cacheRewardManifest) { + const deck = ExportRewards[region.cacheRewardManifest]; + for (let cache = 0; cache != RewardInfo.POICompletions; ++cache) { + const drop = getRandomRewardByChance(deck[0]); + if (drop) { + drops.push({ StoreItem: drop.type, ItemCount: drop.itemCount, FromEnemyCache: true }); + } + } + } else { + logger.error(`POI completed, but there was no cache reward manifest at ${RewardInfo.node}`); + } + } + + // Railjack Abandoned Cache Rewards, Rotation B (Optional Objectives) + if (RewardInfo.LootDungeonCompletions) { + if (region.cacheRewardManifest) { + const deck = ExportRewards[region.cacheRewardManifest]; + for (let cache = 0; cache != RewardInfo.LootDungeonCompletions; ++cache) { + const drop = getRandomRewardByChance(deck[1]); + if (drop) { + drops.push({ StoreItem: drop.type, ItemCount: drop.itemCount, FromEnemyCache: true }); + } + } + } else { + logger.error(`Loot dungeon completed, but there was no cache reward manifest at ${RewardInfo.node}`); + } + } + if (region.cacheRewardManifest && RewardInfo.EnemyCachesFound) { const deck = ExportRewards[region.cacheRewardManifest]; for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) { diff --git a/src/types/requestTypes.ts b/src/types/requestTypes.ts index 05adf925..d272f6cf 100644 --- a/src/types/requestTypes.ts +++ b/src/types/requestTypes.ts @@ -187,6 +187,8 @@ export interface IRewardInfo { rewardQualifications?: string; // did a Survival for 5 minutes and this was "1" rewardTierOverrides?: number[]; // Disruption PurgatoryRewardQualifications?: string; + POICompletions?: number; + LootDungeonCompletions?: number; rewardSeed?: number | bigint; periodicMissionTag?: string; T?: number; // Duviri