feat: clearing lich infuance (#1270)

Reviewed-on: OpenWF/SpaceNinjaServer#1270
Reviewed-by: Sainan <sainan@calamity.inc>
Co-authored-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
Co-committed-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
This commit is contained in:
AMelonInsideLemon 2025-03-22 06:08:00 -07:00 committed by Sainan
parent beb02bffb0
commit c6a2785175
7 changed files with 92 additions and 52 deletions

View File

@ -1,17 +1,12 @@
import { getInfNodes } from "@/src/helpers/nemesisHelpers";
import { getJSONfromString } from "@/src/helpers/stringHelpers"; import { getJSONfromString } from "@/src/helpers/stringHelpers";
import { freeUpSlot, getInventory } from "@/src/services/inventoryService"; import { freeUpSlot, getInventory } from "@/src/services/inventoryService";
import { getAccountIdForRequest } from "@/src/services/loginService"; import { getAccountIdForRequest } from "@/src/services/loginService";
import { SRng } from "@/src/services/rngService"; import { SRng } from "@/src/services/rngService";
import { IMongoDate, IOid } from "@/src/types/commonTypes"; import { IMongoDate, IOid } from "@/src/types/commonTypes";
import { import { IInnateDamageFingerprint, InventorySlot, TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes";
IInfNode,
IInnateDamageFingerprint,
InventorySlot,
TEquipmentKey
} from "@/src/types/inventoryTypes/inventoryTypes";
import { logger } from "@/src/utils/logger"; import { logger } from "@/src/utils/logger";
import { RequestHandler } from "express"; import { RequestHandler } from "express";
import { ExportRegions } from "warframe-public-export-plus";
export const nemesisController: RequestHandler = async (req, res) => { export const nemesisController: RequestHandler = async (req, res) => {
const accountId = await getAccountIdForRequest(req); const accountId = await getAccountIdForRequest(req);
@ -55,49 +50,8 @@ export const nemesisController: RequestHandler = async (req, res) => {
const body = getJSONfromString<INemesisStartRequest>(String(req.body)); const body = getJSONfromString<INemesisStartRequest>(String(req.body));
body.target.fp = BigInt(body.target.fp); body.target.fp = BigInt(body.target.fp);
let infNodes: IInfNode[];
let weaponIdx = -1; let weaponIdx = -1;
if (body.target.Faction == "FC_INFESTATION") { 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 });
}
}
let weapons: readonly string[]; let weapons: readonly string[];
if (body.target.manifest == "/Lotus/Types/Game/Nemesis/KuvaLich/KuvaLichManifestVersionSix") { if (body.target.manifest == "/Lotus/Types/Game/Nemesis/KuvaLich/KuvaLichManifestVersionSix") {
weapons = kuvaLichVersionSixWeapons; weapons = kuvaLichVersionSixWeapons;
@ -135,14 +89,16 @@ export const nemesisController: RequestHandler = async (req, res) => {
k: false, k: false,
Traded: false, Traded: false,
d: new Date(), d: new Date(),
InfNodes: infNodes, InfNodes: getInfNodes(body.target.Faction, 0),
GuessHistory: [], GuessHistory: [],
Hints: [], Hints: [],
HintProgress: 0, HintProgress: 0,
Weakened: body.target.Weakened, Weakened: body.target.Weakened,
PrevOwners: 0, PrevOwners: 0,
HenchmenKilled: 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 inventory.NemesisAbandonedRewards = []; // unclear if we need to do this since the client also submits this with missionInventoryUpdate
await inventory.save(); await inventory.save();

View File

@ -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<string, number[]> = {
FC_GRINEER: [2, 3, 9, 11, 18],
FC_CORPUS: [1, 15, 4, 7, 8],
FC_INFESTATION: [23]
};

View File

@ -1090,7 +1090,9 @@ const nemesisSchema = new Schema<INemesisDatabase>(
HenchmenKilled: Number, HenchmenKilled: Number,
HintProgress: Number, HintProgress: Number,
Hints: [Number], Hints: [Number],
GuessHistory: [Number] GuessHistory: [Number],
MissionCount: Number,
LastEnc: Number
}, },
{ _id: false } { _id: false }
); );

View File

@ -42,6 +42,7 @@ import { createMessage } from "./inboxService";
import kuriaMessage50 from "@/static/fixed_responses/kuriaMessages/fiftyPercent.json"; import kuriaMessage50 from "@/static/fixed_responses/kuriaMessages/fiftyPercent.json";
import kuriaMessage75 from "@/static/fixed_responses/kuriaMessages/seventyFivePercent.json"; import kuriaMessage75 from "@/static/fixed_responses/kuriaMessages/seventyFivePercent.json";
import kuriaMessage100 from "@/static/fixed_responses/kuriaMessages/oneHundredPercent.json"; import kuriaMessage100 from "@/static/fixed_responses/kuriaMessages/oneHundredPercent.json";
import { getInfNodes } from "@/src/helpers/nemesisHelpers";
const getRotations = (rotationCount: number): number[] => { const getRotations = (rotationCount: number): number[] => {
if (rotationCount === 0) return [0]; if (rotationCount === 0) return [0];
@ -347,6 +348,7 @@ interface AddMissionRewardsReturnType {
export const addMissionRewards = async ( export const addMissionRewards = async (
inventory: TInventoryDatabaseDocument, inventory: TInventoryDatabaseDocument,
{ {
Nemesis: nemesis,
RewardInfo: rewardInfo, RewardInfo: rewardInfo,
LevelKeyName: levelKeyName, LevelKeyName: levelKeyName,
Missions: missions, 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 }; return { inventoryChanges, MissionRewards, credits };
}; };

View File

@ -814,6 +814,8 @@ export interface INemesisClient extends INemesisBaseClient {
HintProgress: number; HintProgress: number;
Hints: number[]; Hints: number[];
GuessHistory: number[]; GuessHistory: number[];
MissionCount: number;
LastEnc: number;
} }
export interface INemesisDatabase extends Omit<INemesisClient, "d"> { export interface INemesisDatabase extends Omit<INemesisClient, "d"> {

View File

@ -3,6 +3,7 @@ import {
IDroneClient, IDroneClient,
IInfestedFoundryClient, IInfestedFoundryClient,
IMiscItem, IMiscItem,
INemesisClient,
ITypeCount, ITypeCount,
TEquipmentKey TEquipmentKey
} from "./inventoryTypes/inventoryTypes"; } from "./inventoryTypes/inventoryTypes";
@ -41,6 +42,7 @@ export type IInventoryChanges = {
Drones?: IDroneClient[]; Drones?: IDroneClient[];
MiscItems?: IMiscItem[]; MiscItems?: IMiscItem[];
EmailItems?: ITypeCount[]; EmailItems?: ITypeCount[];
Nemesis?: Partial<INemesisClient>;
} & Record< } & Record<
Exclude< Exclude<
string, string,

View File

@ -109,6 +109,7 @@ export type IMissionInventoryUpdateRequest = {
DROP_MOD: number[]; DROP_MOD: number[];
}[]; }[];
DeathMarks?: string[]; DeathMarks?: string[];
Nemesis?: number;
} & { } & {
[K in TEquipmentKey]?: IEquipmentClient[]; [K in TEquipmentKey]?: IEquipmentClient[];
}; };