feat: valence fusion (#1251)
All checks were successful
Build / build (20) (push) Successful in 38s
Build / build (18) (push) Successful in 1m8s
Build / build (22) (push) Successful in 1m5s
Build Docker image / docker (push) Successful in 31s

Reviewed-on: #1251
This commit is contained in:
Sainan 2025-03-20 15:27:37 -07:00
parent 9d90a3ca26
commit 9b16dc2c6a
4 changed files with 61 additions and 31 deletions

View File

@ -1,16 +1,56 @@
import { getJSONfromString } from "@/src/helpers/stringHelpers"; import { getJSONfromString } from "@/src/helpers/stringHelpers";
import { 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 } from "@/src/types/commonTypes"; import { IMongoDate, IOid } from "@/src/types/commonTypes";
import { IInfNode } from "@/src/types/inventoryTypes/inventoryTypes"; import {
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"; import { ExportRegions } from "warframe-public-export-plus";
export const nemesisController: RequestHandler = async (req, res) => { export const nemesisController: RequestHandler = async (req, res) => {
if ((req.query.mode as string) == "s") {
const accountId = await getAccountIdForRequest(req); const accountId = await getAccountIdForRequest(req);
if ((req.query.mode as string) == "f") {
const body = getJSONfromString<IValenceFusionRequest>(String(req.body));
const inventory = await getInventory(accountId, body.Category + " WeaponBin");
const destWeapon = inventory[body.Category].id(body.DestWeapon.$oid)!;
const sourceWeapon = inventory[body.Category].id(body.SourceWeapon.$oid)!;
const destFingerprint = JSON.parse(destWeapon.UpgradeFingerprint!) as IInnateDamageFingerprint;
const sourceFingerprint = JSON.parse(sourceWeapon.UpgradeFingerprint!) as IInnateDamageFingerprint;
// Upgrade destination damage type if desireed
if (body.UseSourceDmgType) {
destFingerprint.buffs[0].Tag = sourceFingerprint.buffs[0].Tag;
}
// Upgrade destination damage value
const destDamage = 0.25 + (destFingerprint.buffs[0].Value / 0x3fffffff) * (0.6 - 0.25);
const sourceDamage = 0.25 + (sourceFingerprint.buffs[0].Value / 0x3fffffff) * (0.6 - 0.25);
let newDamage = Math.max(destDamage, sourceDamage) * 1.1;
if (newDamage >= 0.58) {
newDamage = 0.6;
}
destFingerprint.buffs[0].Value = Math.trunc(((newDamage - 0.25) / (0.6 - 0.25)) * 0x3fffffff);
// Commit fingerprint
destWeapon.UpgradeFingerprint = JSON.stringify(destFingerprint);
// Remove source weapon
inventory[body.Category].pull({ _id: body.SourceWeapon.$oid });
freeUpSlot(inventory, InventorySlot.WEAPONS);
await inventory.save();
res.json({
InventoryChanges: {
[body.Category]: [destWeapon.toJSON()]
}
});
} else if ((req.query.mode as string) == "s") {
const inventory = await getInventory(accountId, "Nemesis NemesisAbandonedRewards"); const inventory = await getInventory(accountId, "Nemesis NemesisAbandonedRewards");
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);
@ -116,7 +156,14 @@ export const nemesisController: RequestHandler = async (req, res) => {
} }
}; };
export interface INemesisStartRequest { interface IValenceFusionRequest {
DestWeapon: IOid;
SourceWeapon: IOid;
Category: TEquipmentKey;
UseSourceDmgType: boolean;
}
interface INemesisStartRequest {
target: { target: {
fp: number | bigint; fp: number | bigint;
manifest: string; manifest: string;

View File

@ -1,7 +1,7 @@
import { getInventory } from "@/src/services/inventoryService"; import { getInventory } from "@/src/services/inventoryService";
import { getAccountIdForRequest } from "@/src/services/loginService"; import { getAccountIdForRequest } from "@/src/services/loginService";
import { IOid } from "@/src/types/commonTypes"; import { IOid } from "@/src/types/commonTypes";
import { TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes"; import { IInnateDamageFingerprint, TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes";
import { RequestHandler } from "express"; import { RequestHandler } from "express";
export const valenceSwapController: RequestHandler = async (req, res) => { export const valenceSwapController: RequestHandler = async (req, res) => {
@ -27,11 +27,3 @@ interface IValenceSwapRequest {
WeaponCategory: TEquipmentKey; WeaponCategory: TEquipmentKey;
NewValenceUpgradeTag: string; NewValenceUpgradeTag: string;
} }
interface IInnateDamageFingerprint {
compat: string;
buffs: {
Tag: string;
Value: number;
}[];
}

View File

@ -21,11 +21,11 @@ export interface IUnveiledRivenFingerprint {
lvlReq: number; lvlReq: number;
rerolls?: number; rerolls?: number;
pol: string; pol: string;
buffs: IRivenStat[]; buffs: IFingerprintStat[];
curses: IRivenStat[]; curses: IFingerprintStat[];
} }
interface IRivenStat { export interface IFingerprintStat {
Tag: string; Tag: string;
Value: number; Value: number;
} }

View File

@ -2,7 +2,6 @@
import { Types } from "mongoose"; import { Types } from "mongoose";
import { IOid, IMongoDate } from "../commonTypes"; import { IOid, IMongoDate } from "../commonTypes";
import { import {
ArtifactPolarity,
IColor, IColor,
IItemConfig, IItemConfig,
IOperatorConfigClient, IOperatorConfigClient,
@ -11,6 +10,7 @@ import {
IEquipmentClient, IEquipmentClient,
IOperatorConfigDatabase IOperatorConfigDatabase
} from "@/src/types/inventoryTypes/commonInventoryTypes"; } from "@/src/types/inventoryTypes/commonInventoryTypes";
import { IFingerprintStat, RivenFingerprint } from "@/src/helpers/rivenHelper";
export type InventoryDatabaseEquipment = { export type InventoryDatabaseEquipment = {
[_ in TEquipmentKey]: IEquipmentDatabase[]; [_ in TEquipmentKey]: IEquipmentDatabase[];
@ -869,23 +869,14 @@ export interface IGetting {
} }
export interface IRandomUpgrade { export interface IRandomUpgrade {
UpgradeFingerprint: IUpgradeFingerprint; UpgradeFingerprint: RivenFingerprint;
ItemType: string; ItemType: string;
ItemId: IOid; ItemId: IOid;
} }
export interface IUpgradeFingerprint { export interface IInnateDamageFingerprint {
compat: string; compat: string;
lim: number; buffs: IFingerprintStat[];
lvlReq: number;
pol: ArtifactPolarity;
buffs: IBuff[];
curses: IBuff[];
}
export interface IBuff {
Tag: string;
Value: number;
} }
export enum GettingSlotOrderInfo { export enum GettingSlotOrderInfo {