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 { getInventory } from "@/src/services/inventoryService";
import { freeUpSlot, getInventory } from "@/src/services/inventoryService";
import { getAccountIdForRequest } from "@/src/services/loginService";
import { SRng } from "@/src/services/rngService";
import { IMongoDate } from "@/src/types/commonTypes";
import { IInfNode } from "@/src/types/inventoryTypes/inventoryTypes";
import { IMongoDate, IOid } from "@/src/types/commonTypes";
import {
IInfNode,
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) => {
if ((req.query.mode as string) == "s") {
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 body = getJSONfromString<INemesisStartRequest>(String(req.body));
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: {
fp: number | bigint;
manifest: string;

View File

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

View File

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

View File

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