feat: bounty rewards #1549
@ -55,7 +55,8 @@ export const missionInventoryUpdateController: RequestHandler = async (req, res)
 | 
				
			|||||||
    const inventory = await getInventory(accountId);
 | 
					    const inventory = await getInventory(accountId);
 | 
				
			||||||
    const inventoryUpdates = await addMissionInventoryUpdates(inventory, missionReport);
 | 
					    const inventoryUpdates = await addMissionInventoryUpdates(inventory, missionReport);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (missionReport.MissionStatus !== "GS_SUCCESS") {
 | 
					    // skip mission rewards if not GS_SUCCESS and not a bounty (by presence of jobId, as there's a reward every stage but only the last stage has GS_SUCCESS)
 | 
				
			||||||
 | 
					    if (missionReport.MissionStatus !== "GS_SUCCESS" && !missionReport.RewardInfo?.jobId) {
 | 
				
			||||||
        await inventory.save();
 | 
					        await inventory.save();
 | 
				
			||||||
        const inventoryResponse = await getInventoryResponse(inventory, true);
 | 
					        const inventoryResponse = await getInventoryResponse(inventory, true);
 | 
				
			||||||
        res.json({
 | 
					        res.json({
 | 
				
			||||||
 | 
				
			|||||||
@ -50,6 +50,7 @@ import conservationAnimals from "@/static/fixed_responses/conservationAnimals.js
 | 
				
			|||||||
import { getInfNodes } from "@/src/helpers/nemesisHelpers";
 | 
					import { getInfNodes } from "@/src/helpers/nemesisHelpers";
 | 
				
			||||||
import { Loadout } from "../models/inventoryModels/loadoutModel";
 | 
					import { Loadout } from "../models/inventoryModels/loadoutModel";
 | 
				
			||||||
import { ILoadoutConfigDatabase } from "../types/saveLoadoutTypes";
 | 
					import { ILoadoutConfigDatabase } from "../types/saveLoadoutTypes";
 | 
				
			||||||
 | 
					import { getWorldState } from "./worldStateService";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const getRotations = (rotationCount: number, tierOverride: number | undefined): number[] => {
 | 
					const getRotations = (rotationCount: number, tierOverride: number | undefined): number[] => {
 | 
				
			||||||
    if (rotationCount === 0) return [0];
 | 
					    if (rotationCount === 0) return [0];
 | 
				
			||||||
@ -806,13 +807,23 @@ function getRandomMissionDrops(RewardInfo: IRewardInfo, tierOverride: number | u
 | 
				
			|||||||
    const drops: IMissionReward[] = [];
 | 
					    const drops: IMissionReward[] = [];
 | 
				
			||||||
    if (RewardInfo.node in ExportRegions) {
 | 
					    if (RewardInfo.node in ExportRegions) {
 | 
				
			||||||
        const region = ExportRegions[RewardInfo.node];
 | 
					        const region = ExportRegions[RewardInfo.node];
 | 
				
			||||||
        const rewardManifests: string[] =
 | 
					        let rewardManifests: string[] =
 | 
				
			||||||
            RewardInfo.periodicMissionTag == "EliteAlert" || RewardInfo.periodicMissionTag == "EliteAlertB"
 | 
					            RewardInfo.periodicMissionTag == "EliteAlert" || RewardInfo.periodicMissionTag == "EliteAlertB"
 | 
				
			||||||
                ? ["/Lotus/Types/Game/MissionDecks/EliteAlertMissionRewards/EliteAlertMissionRewards"]
 | 
					                ? ["/Lotus/Types/Game/MissionDecks/EliteAlertMissionRewards/EliteAlertMissionRewards"]
 | 
				
			||||||
                : region.rewardManifests;
 | 
					                : region.rewardManifests;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let rotations: number[] = [];
 | 
					        let rotations: number[] = [];
 | 
				
			||||||
        if (RewardInfo.VaultsCracked) {
 | 
					        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!];
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else if (RewardInfo.VaultsCracked) {
 | 
				
			||||||
            // For Spy missions, e.g. 3 vaults cracked = A, B, C
 | 
					            // For Spy missions, e.g. 3 vaults cracked = A, B, C
 | 
				
			||||||
            for (let i = 0; i != RewardInfo.VaultsCracked; ++i) {
 | 
					            for (let i = 0; i != RewardInfo.VaultsCracked; ++i) {
 | 
				
			||||||
                rotations.push(i);
 | 
					                rotations.push(i);
 | 
				
			||||||
@ -821,6 +832,7 @@ function getRandomMissionDrops(RewardInfo: IRewardInfo, tierOverride: number | u
 | 
				
			|||||||
            const rotationCount = RewardInfo.rewardQualifications?.length || 0;
 | 
					            const rotationCount = RewardInfo.rewardQualifications?.length || 0;
 | 
				
			||||||
            rotations = getRotations(rotationCount, tierOverride);
 | 
					            rotations = getRotations(rotationCount, tierOverride);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        logger.debug(`generating random mission rewards`, { rewardManifests, rotations });
 | 
				
			||||||
        rewardManifests
 | 
					        rewardManifests
 | 
				
			||||||
            .map(name => ExportRewards[name])
 | 
					            .map(name => ExportRewards[name])
 | 
				
			||||||
            .forEach(table => {
 | 
					            .forEach(table => {
 | 
				
			||||||
 | 
				
			|||||||
@ -145,9 +145,9 @@ export interface IRewardInfo {
 | 
				
			|||||||
    periodicMissionTag?: string;
 | 
					    periodicMissionTag?: string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // for bounties, only EOM_AFK and node are given from above, plus:
 | 
					    // for bounties, only EOM_AFK and node are given from above, plus:
 | 
				
			||||||
    JobTier?: string;
 | 
					    JobTier?: number;
 | 
				
			||||||
    jobId?: string;
 | 
					    jobId?: string;
 | 
				
			||||||
    JobStage?: string;
 | 
					    JobStage?: number;
 | 
				
			||||||
    Q?: boolean; // always false?
 | 
					    Q?: boolean; // always false?
 | 
				
			||||||
    CheckpointCounter?: number; // starts at 1, is incremented with each job stage upload, and does not reset when starting a new job
 | 
					    CheckpointCounter?: number; // starts at 1, is incremented with each job stage upload, and does not reset when starting a new job
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -5,7 +5,7 @@ export interface IWorldState {
 | 
				
			|||||||
    BuildLabel: string;
 | 
					    BuildLabel: string;
 | 
				
			||||||
    Time: number;
 | 
					    Time: number;
 | 
				
			||||||
    Goals: IGoal[];
 | 
					    Goals: IGoal[];
 | 
				
			||||||
    SyndicateMissions: ISyndicateMission[];
 | 
					    SyndicateMissions: ISyndicateMissionInfo[];
 | 
				
			||||||
    GlobalUpgrades: IGlobalUpgrade[];
 | 
					    GlobalUpgrades: IGlobalUpgrade[];
 | 
				
			||||||
    Sorties: ISortie[];
 | 
					    Sorties: ISortie[];
 | 
				
			||||||
    LiteSorties: ILiteSortie[];
 | 
					    LiteSorties: ILiteSortie[];
 | 
				
			||||||
@ -39,13 +39,24 @@ export interface IGoal {
 | 
				
			|||||||
    Node: string;
 | 
					    Node: string;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface ISyndicateMission {
 | 
					export interface ISyndicateMissionInfo {
 | 
				
			||||||
    _id: IOid;
 | 
					    _id: IOid;
 | 
				
			||||||
    Activation: IMongoDate;
 | 
					    Activation: IMongoDate;
 | 
				
			||||||
    Expiry: IMongoDate;
 | 
					    Expiry: IMongoDate;
 | 
				
			||||||
    Tag: string;
 | 
					    Tag: string;
 | 
				
			||||||
    Seed: number;
 | 
					    Seed: number;
 | 
				
			||||||
    Nodes: string[];
 | 
					    Nodes: string[];
 | 
				
			||||||
 | 
					    Jobs?: {
 | 
				
			||||||
 | 
					        jobType?: string;
 | 
				
			||||||
 | 
					        rewards: string;
 | 
				
			||||||
 | 
					        masteryReq: number;
 | 
				
			||||||
 | 
					        minEnemyLevel: number;
 | 
				
			||||||
 | 
					        maxEnemyLevel: number;
 | 
				
			||||||
 | 
					        xpAmounts: number[];
 | 
				
			||||||
 | 
					        endless?: boolean;
 | 
				
			||||||
 | 
					        locationTag?: string;
 | 
				
			||||||
 | 
					        isVault?: boolean;
 | 
				
			||||||
 | 
					    }[];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface IGlobalUpgrade {
 | 
					export interface IGlobalUpgrade {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user