From c13be616b15cf7a92fede71e4593dd285fb94b9a Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Sat, 12 Apr 2025 21:44:27 +0200 Subject: [PATCH 1/3] feat: bounty item reward Re #388 same as before I think this only missing `Field Bounties` and `Arcana Isolation Vault` --- src/services/missionInventoryUpdateService.ts | 147 +++++++++++++++++- 1 file changed, 139 insertions(+), 8 deletions(-) diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index e6492a6e..4b1db960 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -747,7 +747,7 @@ export const addMissionRewards = async ( const endlessJob = syndicateEntry.Jobs.find(j => j.endless); if (endlessJob) { const index = rewardInfo.JobStage % endlessJob.xpAmounts.length; - const excess = Math.floor(rewardInfo.JobStage / endlessJob.xpAmounts.length); + const excess = Math.floor(rewardInfo.JobStage / (endlessJob.xpAmounts.length - 1)); medallionAmount = Math.floor(endlessJob.xpAmounts[index] * (1 + 0.15000001 * excess)); } } @@ -922,15 +922,146 @@ function getRandomMissionDrops(RewardInfo: IRewardInfo, tierOverride: number | u let rotations: number[] = []; if (RewardInfo.jobId) { - if (RewardInfo.JobTier! >= 0) { - const id = RewardInfo.jobId.split("_")[3]; - const syndicateInfo = getWorldState().SyndicateMissions.find(x => x._id.$oid == id); - if (syndicateInfo) { - const jobInfo = syndicateInfo.Jobs![RewardInfo.JobTier!]; - rewardManifests = [jobInfo.rewards]; - rotations = [RewardInfo.JobStage!]; + if (RewardInfo.JobStage! >= 0) { + const [jobType, tierStr, hubNode, syndicateId, locationTag] = RewardInfo.jobId.split("_"); + const tier = Number(tierStr); + let isEndlessJob = false; + if (syndicateId) { + const worldState = getWorldState(); + let syndicateEntry = worldState.SyndicateMissions.find(m => m._id.$oid === syndicateId); + if (!syndicateEntry) syndicateEntry = worldState.SyndicateMissions.find(m => m.Tag === syndicateId); + + if (syndicateEntry && syndicateEntry.Jobs) { + let job = syndicateEntry.Jobs[tier]; + + if (syndicateEntry.Tag === "EntratiSyndicate") { + const vault = syndicateEntry.Jobs.find(j => j.locationTag === locationTag); + if (vault) job = vault; + // if ( + // [ + // "DeimosRuinsExterminateBounty", + // "DeimosRuinsEscortBounty", + // "DeimosRuinsMistBounty", + // "DeimosRuinsPurifyBounty", + // "DeimosRuinsSacBounty" + // ].some(ending => jobType.endsWith(ending)) + // ) { + // job.rewards = "TODO"; // Droptable for Arcana Isolation Vault + // } + if ( + [ + "DeimosEndlessAreaDefenseBounty", + "DeimosEndlessExcavateBounty", + "DeimosEndlessPurifyBounty" + ].some(ending => jobType.endsWith(ending)) + ) { + const endlessJob = syndicateEntry.Jobs.find(j => j.endless); + if (endlessJob) { + isEndlessJob = true; + job = endlessJob; + const excess = Math.floor(RewardInfo.JobStage! / (job.xpAmounts.length - 1)); + + const rotationIndexes = [0, 0, 1, 2]; + const rotationIndex = rotationIndexes[excess % rotationIndexes.length]; + const dropTable = [ + "/Lotus/Types/Game/MissionDecks/DeimosMissionRewards/TierBTableARewards", + "/Lotus/Types/Game/MissionDecks/DeimosMissionRewards/TierBTableBRewards", + "/Lotus/Types/Game/MissionDecks/DeimosMissionRewards/TierBTableCRewards" + ]; + job.rewards = dropTable[rotationIndex]; + } + } + } else if (syndicateEntry.Tag === "SolarisSyndicate") { + if (jobType.endsWith("Heists/HeistProfitTakerBountyOne") && RewardInfo.JobStage == 2) { + job = { + rewards: + "/Lotus/Types/Game/MissionDecks/HeistJobMissionRewards/HeistTierATableARewards", + masteryReq: 0, + minEnemyLevel: 40, + maxEnemyLevel: 60, + xpAmounts: [1000] + }; + RewardInfo.Q = false; // Just in case + } else { + const tierMap = { + Two: "B", + Three: "C", + Four: "D" + }; + + for (const [key, tier] of Object.entries(tierMap)) { + if (jobType.endsWith(`Heists/HeistProfitTakerBounty${key}`)) { + job = { + rewards: `/Lotus/Types/Game/MissionDecks/HeistJobMissionRewards/HeistTier${tier}TableARewards`, + masteryReq: 0, + minEnemyLevel: 40, + maxEnemyLevel: 60, + xpAmounts: [1000] + }; + RewardInfo.Q = false; // Just in case + break; + } + } + } + } + rewardManifests.push(job.rewards); + rotations.push(RewardInfo.JobStage! % (job.xpAmounts.length - 1)); + if ( + RewardInfo.Q && + (RewardInfo.JobStage === job.xpAmounts.length - 1 || job.isVault) && + !isEndlessJob + ) { + rewardManifests.push(job.rewards); + rotations.push(ExportRewards[job.rewards].length - 1); + } + } } } + } else if (RewardInfo.challengeMissionId) { + const rewardTables: Record = { + EntratiLabSyndicate: "/Lotus/Types/Game/MissionDecks/EntratiLabJobMissionReward/", + ZarimanSyndicate: "/Lotus/Types/Game/MissionDecks/ZarimanJobMissionRewards/", + HexSyndicate: "/Lotus/Types/Game/MissionDecks/1999MissionRewards/" + }; + + const tierSuffixes: Record = { + EntratiLabSyndicate: [ + "TierATableRewards", + "TierBTableRewards", + "TierCTableRewards", + "TierDTableRewards", + "TierETableRewards" + ], + ZarimanSyndicate: [ + "TierATableRewards", + "TierBTableRewards", + "TierCTableRewards", + "TierDTableRewards", + "TierETableRewards" + ], + HexSyndicate: [ + "TierABountyRewards", + "TierBBountyRewards", + "TierCBountyRewards", + "TierDBountyRewards", + "TierEBountyRewards", + "TierFBountyRewards", + "InfestedLichBountyRewards" + ] + }; + + const [syndicateTag, tierStr] = RewardInfo.challengeMissionId.split("_"); + const tier = Number(tierStr); + + const rewardTable = rewardTables[syndicateTag]; + const tierSuffix = tierSuffixes[syndicateTag][tier]; + + if (rewardTable && tierSuffix) { + rewardManifests.push(rewardTable + tierSuffix); + rotations.push(0); + } else { + logger.error(`Unknown syndicate or tier: ${syndicateTag} , ${tier}`); + } } else if (RewardInfo.VaultsCracked) { // For Spy missions, e.g. 3 vaults cracked = A, B, C for (let i = 0; i != RewardInfo.VaultsCracked; ++i) { -- 2.47.2 From 4d337074cb37d7a86707e1fdaa4723c7fddfeb4c Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Sat, 12 Apr 2025 21:49:02 +0200 Subject: [PATCH 2/3] Update missionInventoryUpdateService.ts --- src/services/missionInventoryUpdateService.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 4b1db960..288d5b6e 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -923,6 +923,7 @@ function getRandomMissionDrops(RewardInfo: IRewardInfo, tierOverride: number | u let rotations: number[] = []; if (RewardInfo.jobId) { if (RewardInfo.JobStage! >= 0) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars const [jobType, tierStr, hubNode, syndicateId, locationTag] = RewardInfo.jobId.split("_"); const tier = Number(tierStr); let isEndlessJob = false; @@ -1004,8 +1005,8 @@ function getRandomMissionDrops(RewardInfo: IRewardInfo, tierOverride: number | u } } } - rewardManifests.push(job.rewards); - rotations.push(RewardInfo.JobStage! % (job.xpAmounts.length - 1)); + rewardManifests = [job.rewards]; + rotations = [RewardInfo.JobStage! % (job.xpAmounts.length - 1)]; if ( RewardInfo.Q && (RewardInfo.JobStage === job.xpAmounts.length - 1 || job.isVault) && @@ -1057,8 +1058,8 @@ function getRandomMissionDrops(RewardInfo: IRewardInfo, tierOverride: number | u const tierSuffix = tierSuffixes[syndicateTag][tier]; if (rewardTable && tierSuffix) { - rewardManifests.push(rewardTable + tierSuffix); - rotations.push(0); + rewardManifests = [rewardTable + tierSuffix]; + rotations = [0]; } else { logger.error(`Unknown syndicate or tier: ${syndicateTag} , ${tier}`); } -- 2.47.2 From 3a20c1c8001a59d106f7346a55e9b0f11dbf9dce Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Sat, 12 Apr 2025 23:32:08 +0200 Subject: [PATCH 3/3] Update missionInventoryUpdateService.ts --- src/services/missionInventoryUpdateService.ts | 51 ++++++++----------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 288d5b6e..78f6129b 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -1019,49 +1019,42 @@ function getRandomMissionDrops(RewardInfo: IRewardInfo, tierOverride: number | u } } } else if (RewardInfo.challengeMissionId) { - const rewardTables: Record = { - EntratiLabSyndicate: "/Lotus/Types/Game/MissionDecks/EntratiLabJobMissionReward/", - ZarimanSyndicate: "/Lotus/Types/Game/MissionDecks/ZarimanJobMissionRewards/", - HexSyndicate: "/Lotus/Types/Game/MissionDecks/1999MissionRewards/" - }; - - const tierSuffixes: Record = { + const rewardTables: Record = { EntratiLabSyndicate: [ - "TierATableRewards", - "TierBTableRewards", - "TierCTableRewards", - "TierDTableRewards", - "TierETableRewards" + "/Lotus/Types/Game/MissionDecks/EntratiLabJobMissionReward/TierATableRewards", + "/Lotus/Types/Game/MissionDecks/EntratiLabJobMissionReward/TierBTableRewards", + "/Lotus/Types/Game/MissionDecks/EntratiLabJobMissionReward/TierCTableRewards", + "/Lotus/Types/Game/MissionDecks/EntratiLabJobMissionReward/TierDTableRewards", + "/Lotus/Types/Game/MissionDecks/EntratiLabJobMissionReward/TierETableRewards" ], ZarimanSyndicate: [ - "TierATableRewards", - "TierBTableRewards", - "TierCTableRewards", - "TierDTableRewards", - "TierETableRewards" + "/Lotus/Types/Game/MissionDecks/ZarimanJobMissionRewards/TierATableRewards", + "/Lotus/Types/Game/MissionDecks/ZarimanJobMissionRewards/TierBTableRewards", + "/Lotus/Types/Game/MissionDecks/ZarimanJobMissionRewards/TierCTableRewards", + "/Lotus/Types/Game/MissionDecks/ZarimanJobMissionRewards/TierDTableRewards", + "/Lotus/Types/Game/MissionDecks/ZarimanJobMissionRewards/TierETableRewards" ], HexSyndicate: [ - "TierABountyRewards", - "TierBBountyRewards", - "TierCBountyRewards", - "TierDBountyRewards", - "TierEBountyRewards", - "TierFBountyRewards", - "InfestedLichBountyRewards" + "/Lotus/Types/Game/MissionDecks/1999MissionRewards/TierABountyRewards", + "/Lotus/Types/Game/MissionDecks/1999MissionRewards/TierBBountyRewards", + "/Lotus/Types/Game/MissionDecks/1999MissionRewards/TierCBountyRewards", + "/Lotus/Types/Game/MissionDecks/1999MissionRewards/TierDBountyRewards", + "/Lotus/Types/Game/MissionDecks/1999MissionRewards/TierEBountyRewards", + "/Lotus/Types/Game/MissionDecks/1999MissionRewards/TierFBountyRewards", + "/Lotus/Types/Game/MissionDecks/1999MissionRewards/InfestedLichBountyRewards" ] }; const [syndicateTag, tierStr] = RewardInfo.challengeMissionId.split("_"); const tier = Number(tierStr); - const rewardTable = rewardTables[syndicateTag]; - const tierSuffix = tierSuffixes[syndicateTag][tier]; + const rewardTable = rewardTables[syndicateTag][tier]; - if (rewardTable && tierSuffix) { - rewardManifests = [rewardTable + tierSuffix]; + if (rewardTable) { + rewardManifests = [rewardTable]; rotations = [0]; } else { - logger.error(`Unknown syndicate or tier: ${syndicateTag} , ${tier}`); + logger.error(`Unknown syndicate or tier: ${RewardInfo.challengeMissionId}`); } } else if (RewardInfo.VaultsCracked) { // For Spy missions, e.g. 3 vaults cracked = A, B, C -- 2.47.2