From c0fe71ca3bbcc295f3ec6f1ff87343b36bce5a9a Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Thu, 17 Apr 2025 03:30:22 +0200 Subject: [PATCH] feat: sortie reward --- src/models/inventoryModels/inventoryModel.ts | 29 +++++++++++++++++-- src/services/missionInventoryUpdateService.ts | 14 +++++++++ src/types/inventoryTypes/inventoryTypes.ts | 13 +++++++-- src/types/requestTypes.ts | 3 ++ 4 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index 97a0022e..dcd59ff7 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -86,7 +86,9 @@ import { IWeeklyMission, ILockedWeaponGroupDatabase, IPersonalTechProjectDatabase, - IPersonalTechProjectClient + IPersonalTechProjectClient, + ILastSortieRewardDatabase, + ILastSortieRewardClient } from "../../types/inventoryTypes/inventoryTypes"; import { IOid } from "../../types/commonTypes"; import { @@ -1202,6 +1204,28 @@ const alignmentSchema = new Schema( { _id: false } ); +const lastSortieRewardSchema = new Schema( + { + SortieId: Schema.Types.ObjectId, + StoreItem: String, + Manifest: String + }, + { _id: false } +); + +lastSortieRewardSchema.set("toJSON", { + virtuals: true, + transform(_doc, obj) { + const db = obj as ILastSortieRewardDatabase; + const client = obj as ILastSortieRewardClient; + + client.SortieId = toOid(db.SortieId); + + delete obj._id; + delete obj.__v; + } +}); + const lockedWeaponGroupSchema = new Schema( { s: Schema.Types.ObjectId, @@ -1419,7 +1443,8 @@ const inventorySchema = new Schema( //https://warframe.fandom.com/wiki/Sortie CompletedSorties: [String], - LastSortieReward: [Schema.Types.Mixed], + LastSortieReward: { type: [lastSortieRewardSchema], default: undefined }, + LastLiteSortieReward: { type: [lastSortieRewardSchema], default: undefined }, // Resource Extractor Drones Drones: [droneSchema], diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 0b452ccc..d829a0cb 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -581,6 +581,16 @@ export const addMissionRewards = async ( const AffiliationMods: IAffiliationMods[] = []; let SyndicateXPItemReward; + if (rewardInfo.sortieTag == "Final") { + inventory.LastSortieReward = [ + { + SortieId: new Types.ObjectId(rewardInfo.sortieId!.split("_")[1]), + StoreItem: MissionRewards[0].StoreItem, + Manifest: "/Lotus/Types/Game/MissionDecks/SortieRewards" + } + ]; + } + let missionCompletionCredits = 0; //inventory change is what the client has not rewarded itself, also the client needs to know the credit changes for display if (levelKeyName) { @@ -940,6 +950,10 @@ function getLevelCreditRewards(node: IRegion): number { function getRandomMissionDrops(RewardInfo: IRewardInfo, tierOverride: number | undefined): IMissionReward[] { const drops: IMissionReward[] = []; + if (RewardInfo.sortieTag == "Final") { + const drop = getRandomRewardByChance(ExportRewards["/Lotus/Types/Game/MissionDecks/SortieRewards"][0])!; + drops.push({ StoreItem: drop.type, ItemCount: drop.itemCount }); + } if (RewardInfo.periodicMissionTag?.startsWith("HardDaily")) { drops.push({ StoreItem: "/Lotus/StoreItems/Types/Items/MiscItems/SteelEssence", diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index d6e2ab34..ef90dbf5 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -47,6 +47,8 @@ export interface IInventoryDatabase | "BrandedSuits" | "LockedWeaponGroup" | "PersonalTechProjects" + | "LastSortieReward" + | "LastLiteSortieReward" | TEquipmentKey >, InventoryDatabaseEquipment { @@ -79,6 +81,8 @@ export interface IInventoryDatabase BrandedSuits?: Types.ObjectId[]; LockedWeaponGroup?: ILockedWeaponGroupDatabase; PersonalTechProjects: IPersonalTechProjectDatabase[]; + LastSortieReward?: ILastSortieRewardDatabase[]; + LastLiteSortieReward?: ILastSortieRewardDatabase[]; } export interface IQuestKeyDatabase { @@ -277,7 +281,8 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu Wishlist: string[]; Alignment?: IAlignment; CompletedSorties: string[]; - LastSortieReward: ILastSortieReward[]; + LastSortieReward?: ILastSortieRewardClient[]; + LastLiteSortieReward?: ILastSortieRewardClient[]; Drones: IDroneClient[]; StepSequencers: IStepSequencer[]; ActiveAvatarImageType: string; @@ -724,12 +729,16 @@ export enum Status { StatusStasis = "STATUS_STASIS" } -export interface ILastSortieReward { +export interface ILastSortieRewardClient { SortieId: IOid; StoreItem: string; Manifest: string; } +export interface ILastSortieRewardDatabase extends Omit { + SortieId: Types.ObjectId; +} + export interface ILibraryDailyTaskInfo { EnemyTypes: string[]; EnemyLocTag: string; diff --git a/src/types/requestTypes.ts b/src/types/requestTypes.ts index fff164a8..9441f632 100644 --- a/src/types/requestTypes.ts +++ b/src/types/requestTypes.ts @@ -129,6 +129,9 @@ export type IMissionInventoryUpdateRequest = { export interface IRewardInfo { node: string; + sortieId?: string; + sortieTag?: string; + sortiePrereqs?: string[]; VaultsCracked?: number; // for Spy missions rewardTier?: number; nightmareMode?: boolean;