From 356541ffe02d7f96992bb59c4f30407803ad86e5 Mon Sep 17 00:00:00 2001 From: Sainan Date: Sat, 22 Mar 2025 14:27:30 +0100 Subject: [PATCH] feat: nemesis mode p --- src/controllers/api/nemesisController.ts | 27 +++++++++++++++++++++++- src/helpers/nemesisHelpers.ts | 12 +++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/controllers/api/nemesisController.ts b/src/controllers/api/nemesisController.ts index 10c28c03..626105aa 100644 --- a/src/controllers/api/nemesisController.ts +++ b/src/controllers/api/nemesisController.ts @@ -1,4 +1,4 @@ -import { getInfNodes } from "@/src/helpers/nemesisHelpers"; +import { getInfNodes, getNemesisPasscode } from "@/src/helpers/nemesisHelpers"; import { getJSONfromString } from "@/src/helpers/stringHelpers"; import { freeUpSlot, getInventory } from "@/src/services/inventoryService"; import { getAccountIdForRequest } from "@/src/services/loginService"; @@ -45,6 +45,26 @@ export const nemesisController: RequestHandler = async (req, res) => { [body.Category]: [destWeapon.toJSON()] } }); + } else if ((req.query.mode as string) == "p") { + const inventory = await getInventory(accountId, "Nemesis"); + const body = getJSONfromString(String(req.body)); + const passcode = getNemesisPasscode(inventory.Nemesis!.fp, inventory.Nemesis!.Faction); + let guessResult = 0; + if (inventory.Nemesis!.Faction == "FC_INFESTATION") { + for (let i = 0; i != 3; ++i) { + if (body.guess[i] == passcode[0]) { + guessResult = 1 + i; + break; + } + } + } else { + for (let i = 0; i != 3; ++i) { + if (body.guess[i] == passcode[i]) { + ++guessResult; + } + } + } + res.json({ GuessResult: guessResult }); } else if ((req.query.mode as string) == "s") { const inventory = await getInventory(accountId, "Nemesis NemesisAbandonedRewards"); const body = getJSONfromString(String(req.body)); @@ -148,6 +168,11 @@ interface INemesisStartRequest { }; } +interface INemesisPrespawnCheckRequest { + guess: number[]; // .length == 3 + potency?: number[]; +} + const kuvaLichVersionSixWeapons = [ "/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Drakgoon/KuvaDrakgoon", "/Lotus/Weapons/Grineer/KuvaLich/LongGuns/Karak/KuvaKarak", diff --git a/src/helpers/nemesisHelpers.ts b/src/helpers/nemesisHelpers.ts index 9fea8880..839e0675 100644 --- a/src/helpers/nemesisHelpers.ts +++ b/src/helpers/nemesisHelpers.ts @@ -1,5 +1,6 @@ import { ExportRegions } from "warframe-public-export-plus"; import { IInfNode } from "@/src/types/inventoryTypes/inventoryTypes"; +import { SRng } from "@/src/services/rngService"; export const getInfNodes = (faction: string, rank: number): IInfNode[] => { const infNodes = []; @@ -30,3 +31,14 @@ const systemIndexes: Record = { FC_CORPUS: [1, 15, 4, 7, 8], FC_INFESTATION: [23] }; + +// Get a parazon 'passcode' based on the nemesis fingerprint so it's always the same for the same nemesis. +export const getNemesisPasscode = (fp: bigint, faction: string): number[] => { + const rng = new SRng(fp); + const passcode = [rng.randomInt(0, 7)]; + if (faction != "FC_INFESTATION") { + passcode.push(rng.randomInt(0, 7)); + passcode.push(rng.randomInt(0, 7)); + } + return passcode; +};