diff --git a/src/controllers/api/nemesisController.ts b/src/controllers/api/nemesisController.ts index 2f6046043..10c28c037 100644 --- a/src/controllers/api/nemesisController.ts +++ b/src/controllers/api/nemesisController.ts @@ -1,17 +1,12 @@ +import { getInfNodes } from "@/src/helpers/nemesisHelpers"; import { getJSONfromString } from "@/src/helpers/stringHelpers"; import { freeUpSlot, getInventory } from "@/src/services/inventoryService"; import { getAccountIdForRequest } from "@/src/services/loginService"; import { SRng } from "@/src/services/rngService"; import { IMongoDate, IOid } from "@/src/types/commonTypes"; -import { - IInfNode, - IInnateDamageFingerprint, - InventorySlot, - TEquipmentKey -} from "@/src/types/inventoryTypes/inventoryTypes"; +import { IInnateDamageFingerprint, InventorySlot, TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes"; import { logger } from "@/src/utils/logger"; import { RequestHandler } from "express"; -import { ExportRegions } from "warframe-public-export-plus"; export const nemesisController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); @@ -55,49 +50,8 @@ export const nemesisController: RequestHandler = async (req, res) => { const body = getJSONfromString(String(req.body)); body.target.fp = BigInt(body.target.fp); - let infNodes: IInfNode[]; let weaponIdx = -1; - if (body.target.Faction == "FC_INFESTATION") { - infNodes = [ - { - Node: "SolNode852", - Influence: 1 - }, - { - Node: "SolNode850", - Influence: 1 - }, - { - Node: "SolNode851", - Influence: 1 - }, - { - Node: "SolNode853", - Influence: 1 - }, - { - Node: "SolNode854", - Influence: 1 - } - ]; - } else { - infNodes = []; - for (const [key, value] of Object.entries(ExportRegions)) { - if ( - value.systemIndex == 2 && // earth - value.nodeType != 3 && // not hub - value.nodeType != 7 && // not junction - value.missionIndex && // must have a mission type and not assassination - value.missionIndex != 28 && // not open world - value.missionIndex != 32 && // not railjack - value.missionIndex != 41 && // not saya's visions - value.name.indexOf("Archwing") == -1 - ) { - //console.log(dict_en[value.name]); - infNodes.push({ Node: key, Influence: 1 }); - } - } - + if (body.target.Faction != "FC_INFESTATION") { let weapons: readonly string[]; if (body.target.manifest == "/Lotus/Types/Game/Nemesis/KuvaLich/KuvaLichManifestVersionSix") { weapons = kuvaLichVersionSixWeapons; @@ -135,14 +89,16 @@ export const nemesisController: RequestHandler = async (req, res) => { k: false, Traded: false, d: new Date(), - InfNodes: infNodes, + InfNodes: getInfNodes(body.target.Faction, 0), GuessHistory: [], Hints: [], HintProgress: 0, Weakened: body.target.Weakened, PrevOwners: 0, HenchmenKilled: 0, - SecondInCommand: body.target.SecondInCommand + SecondInCommand: body.target.SecondInCommand, + MissionCount: 0, + LastEnc: 0 }; inventory.NemesisAbandonedRewards = []; // unclear if we need to do this since the client also submits this with missionInventoryUpdate await inventory.save(); diff --git a/src/helpers/nemesisHelpers.ts b/src/helpers/nemesisHelpers.ts new file mode 100644 index 000000000..9fea8880b --- /dev/null +++ b/src/helpers/nemesisHelpers.ts @@ -0,0 +1,32 @@ +import { ExportRegions } from "warframe-public-export-plus"; +import { IInfNode } from "@/src/types/inventoryTypes/inventoryTypes"; + +export const getInfNodes = (faction: string, rank: number): IInfNode[] => { + const infNodes = []; + const systemIndex = systemIndexes[faction][rank]; + for (const [key, value] of Object.entries(ExportRegions)) { + if ( + value.systemIndex === systemIndex && + value.nodeType != 3 && // not hub + value.nodeType != 7 && // not junction + value.missionIndex && // must have a mission type and not assassination + value.missionIndex != 28 && // not open world + value.missionIndex != 32 && // not railjack + value.missionIndex != 41 && // not saya's visions + value.missionIndex != 42 && // not face off + value.name.indexOf("1999NodeI") == -1 && // not stage defence + value.name.indexOf("1999NodeJ") == -1 && // not lich bounty + value.name.indexOf("Archwing") == -1 + ) { + //console.log(dict_en[value.name]); + infNodes.push({ Node: key, Influence: 1 }); + } + } + return infNodes; +}; + +const systemIndexes: Record = { + FC_GRINEER: [2, 3, 9, 11, 18], + FC_CORPUS: [1, 15, 4, 7, 8], + FC_INFESTATION: [23] +}; diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index cdfc4dca3..8e24b4c64 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -1090,7 +1090,9 @@ const nemesisSchema = new Schema( HenchmenKilled: Number, HintProgress: Number, Hints: [Number], - GuessHistory: [Number] + GuessHistory: [Number], + MissionCount: Number, + LastEnc: Number }, { _id: false } ); diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 04171dc69..44d0fdebe 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -42,6 +42,7 @@ import { createMessage } from "./inboxService"; import kuriaMessage50 from "@/static/fixed_responses/kuriaMessages/fiftyPercent.json"; import kuriaMessage75 from "@/static/fixed_responses/kuriaMessages/seventyFivePercent.json"; import kuriaMessage100 from "@/static/fixed_responses/kuriaMessages/oneHundredPercent.json"; +import { getInfNodes } from "@/src/helpers/nemesisHelpers"; const getRotations = (rotationCount: number): number[] => { if (rotationCount === 0) return [0]; @@ -347,6 +348,7 @@ interface AddMissionRewardsReturnType { export const addMissionRewards = async ( inventory: TInventoryDatabaseDocument, { + Nemesis: nemesis, RewardInfo: rewardInfo, LevelKeyName: levelKeyName, Missions: missions, @@ -462,6 +464,49 @@ export const addMissionRewards = async ( } } + if (inventory.Nemesis) { + if ( + nemesis || + (inventory.Nemesis.Faction == "FC_INFESTATION" && + inventory.Nemesis.InfNodes.find(obj => obj.Node == rewardInfo.node)) + ) { + inventoryChanges.Nemesis ??= {}; + const nodeIndex = inventory.Nemesis.InfNodes.findIndex(obj => obj.Node === rewardInfo.node); + if (nodeIndex !== -1) inventory.Nemesis.InfNodes.splice(nodeIndex, 1); + + if (inventory.Nemesis.InfNodes.length <= 0) { + if (inventory.Nemesis.Faction != "FC_INFESTATION") { + inventory.Nemesis.Rank = Math.min(inventory.Nemesis.Rank + 1, 4); + inventoryChanges.Nemesis.Rank = inventory.Nemesis.Rank; + } + inventory.Nemesis.InfNodes = getInfNodes(inventory.Nemesis.Faction, inventory.Nemesis.Rank); + } + + if (inventory.Nemesis.Faction == "FC_INFESTATION") { + inventoryChanges.Nemesis.HenchmenKilled ??= 0; + inventoryChanges.Nemesis.MissionCount ??= 0; + + inventory.Nemesis.HenchmenKilled += 5; + inventory.Nemesis.MissionCount += 1; + + inventoryChanges.Nemesis.HenchmenKilled += 5; + inventoryChanges.Nemesis.MissionCount += 1; + + if (inventory.Nemesis.HenchmenKilled >= 100) { + inventory.Nemesis.InfNodes = [ + { + Node: "CrewBattleNode559", + Influence: 1 + } + ]; + inventory.Nemesis.Weakened = true; + inventoryChanges.Nemesis.Weakened = true; + } + } + + inventoryChanges.Nemesis.InfNodes = inventory.Nemesis.InfNodes; + } + } return { inventoryChanges, MissionRewards, credits }; }; diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index fb0d3071c..59c1697af 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -814,6 +814,8 @@ export interface INemesisClient extends INemesisBaseClient { HintProgress: number; Hints: number[]; GuessHistory: number[]; + MissionCount: number; + LastEnc: number; } export interface INemesisDatabase extends Omit { diff --git a/src/types/purchaseTypes.ts b/src/types/purchaseTypes.ts index 35bb21239..c90e45887 100644 --- a/src/types/purchaseTypes.ts +++ b/src/types/purchaseTypes.ts @@ -3,6 +3,7 @@ import { IDroneClient, IInfestedFoundryClient, IMiscItem, + INemesisClient, ITypeCount, TEquipmentKey } from "./inventoryTypes/inventoryTypes"; @@ -41,6 +42,7 @@ export type IInventoryChanges = { Drones?: IDroneClient[]; MiscItems?: IMiscItem[]; EmailItems?: ITypeCount[]; + Nemesis?: Partial; } & Record< Exclude< string, diff --git a/src/types/requestTypes.ts b/src/types/requestTypes.ts index 36a55bfb9..f9df3ff88 100644 --- a/src/types/requestTypes.ts +++ b/src/types/requestTypes.ts @@ -109,6 +109,7 @@ export type IMissionInventoryUpdateRequest = { DROP_MOD: number[]; }[]; DeathMarks?: string[]; + Nemesis?: number; } & { [K in TEquipmentKey]?: IEquipmentClient[]; };