feat: rewards for overriden enemy caches #2919

Merged
Sainan merged 4 commits from AMelonInsideLemon/SpaceNinjaServer:enemyCacheOverride into main 2025-10-21 00:43:16 -07:00
6 changed files with 85 additions and 17 deletions

8
package-lock.json generated
View File

@ -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",

View File

@ -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",

View File

@ -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);

View File

@ -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",

View File

@ -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);

View File

@ -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
} }