feat: unveiling rivens by doing the challenge #1031
@ -1,4 +1,5 @@
 | 
				
			|||||||
import { toOid } from "@/src/helpers/inventoryHelpers";
 | 
					import { toOid } from "@/src/helpers/inventoryHelpers";
 | 
				
			||||||
 | 
					import { IRivenChallenge } from "@/src/helpers/rivenFingerprintHelper";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
				
			||||||
import { addMods, getInventory } from "@/src/services/inventoryService";
 | 
					import { addMods, getInventory } from "@/src/services/inventoryService";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
				
			||||||
@ -19,7 +20,7 @@ export const activateRandomModController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
    ]);
 | 
					    ]);
 | 
				
			||||||
    const rivenType = getRandomElement(rivenRawToRealWeighted[request.ItemType]);
 | 
					    const rivenType = getRandomElement(rivenRawToRealWeighted[request.ItemType]);
 | 
				
			||||||
    const challenge = getRandomElement(ExportUpgrades[rivenType].availableChallenges!);
 | 
					    const challenge = getRandomElement(ExportUpgrades[rivenType].availableChallenges!);
 | 
				
			||||||
    const fingerprintChallenge: IRandomModChallenge = {
 | 
					    const fingerprintChallenge: IRivenChallenge = {
 | 
				
			||||||
        Type: challenge.fullName,
 | 
					        Type: challenge.fullName,
 | 
				
			||||||
        Progress: 0,
 | 
					        Progress: 0,
 | 
				
			||||||
        Required: getRandomInt(challenge.countRange[0], challenge.countRange[1])
 | 
					        Required: getRandomInt(challenge.countRange[0], challenge.countRange[1])
 | 
				
			||||||
@ -62,13 +63,6 @@ interface IActiveRandomModRequest {
 | 
				
			|||||||
    ItemType: string;
 | 
					    ItemType: string;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface IRandomModChallenge {
 | 
					 | 
				
			||||||
    Type: string;
 | 
					 | 
				
			||||||
    Progress: number;
 | 
					 | 
				
			||||||
    Required: number;
 | 
					 | 
				
			||||||
    Complication?: string;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const rivenRawToRealWeighted: Record<string, string[]> = {
 | 
					const rivenRawToRealWeighted: Record<string, string[]> = {
 | 
				
			||||||
    "/Lotus/Upgrades/Mods/Randomized/RawArchgunRandomMod": [
 | 
					    "/Lotus/Upgrades/Mods/Randomized/RawArchgunRandomMod": [
 | 
				
			||||||
        "/Lotus/Upgrades/Mods/Randomized/LotusArchgunRandomModRare"
 | 
					        "/Lotus/Upgrades/Mods/Randomized/LotusArchgunRandomModRare"
 | 
				
			||||||
 | 
				
			|||||||
@ -4,8 +4,7 @@ import { addMiscItems, getInventory, updateCurrency } from "@/src/services/inven
 | 
				
			|||||||
import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
					import { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
				
			||||||
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
				
			||||||
import { IUnveiledRivenFingerprint, randomiseRivenStats } from "@/src/helpers/rivenFingerprintHelper";
 | 
					import { createUnveiledRivenFingerprint } from "@/src/helpers/rivenFingerprintHelper";
 | 
				
			||||||
import { getRandomElement, getRandomInt } from "@/src/services/rngService";
 | 
					 | 
				
			||||||
import { ExportUpgrades } from "warframe-public-export-plus";
 | 
					import { ExportUpgrades } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const completeRandomModChallengeController: RequestHandler = async (req, res) => {
 | 
					export const completeRandomModChallengeController: RequestHandler = async (req, res) => {
 | 
				
			||||||
@ -31,17 +30,7 @@ export const completeRandomModChallengeController: RequestHandler = async (req,
 | 
				
			|||||||
    // Update riven fingerprint to a randomised unveiled state
 | 
					    // Update riven fingerprint to a randomised unveiled state
 | 
				
			||||||
    const upgrade = inventory.Upgrades.id(request.ItemId)!;
 | 
					    const upgrade = inventory.Upgrades.id(request.ItemId)!;
 | 
				
			||||||
    const meta = ExportUpgrades[upgrade.ItemType];
 | 
					    const meta = ExportUpgrades[upgrade.ItemType];
 | 
				
			||||||
    const fingerprint: IUnveiledRivenFingerprint = {
 | 
					    upgrade.UpgradeFingerprint = JSON.stringify(createUnveiledRivenFingerprint(meta));
 | 
				
			||||||
        compat: getRandomElement(meta.compatibleItems!),
 | 
					 | 
				
			||||||
        lim: 0,
 | 
					 | 
				
			||||||
        lvl: 0,
 | 
					 | 
				
			||||||
        lvlReq: getRandomInt(8, 16),
 | 
					 | 
				
			||||||
        pol: getRandomElement(["AP_ATTACK", "AP_DEFENSE", "AP_TACTIC"]),
 | 
					 | 
				
			||||||
        buffs: [],
 | 
					 | 
				
			||||||
        curses: []
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    randomiseRivenStats(meta, fingerprint);
 | 
					 | 
				
			||||||
    upgrade.UpgradeFingerprint = JSON.stringify(fingerprint);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    await inventory.save();
 | 
					    await inventory.save();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -2,19 +2,32 @@ import { RequestHandler } from "express";
 | 
				
			|||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
				
			||||||
import { addMiscItems, getInventory } from "@/src/services/inventoryService";
 | 
					import { addMiscItems, getInventory } from "@/src/services/inventoryService";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
				
			||||||
import { IUnveiledRivenFingerprint, randomiseRivenStats } from "@/src/helpers/rivenFingerprintHelper";
 | 
					import {
 | 
				
			||||||
 | 
					    createUnveiledRivenFingerprint,
 | 
				
			||||||
 | 
					    randomiseRivenStats,
 | 
				
			||||||
 | 
					    RivenFingerprint
 | 
				
			||||||
 | 
					} from "@/src/helpers/rivenFingerprintHelper";
 | 
				
			||||||
import { ExportUpgrades } from "warframe-public-export-plus";
 | 
					import { ExportUpgrades } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					import { IOid } from "@/src/types/commonTypes";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const rerollRandomModController: RequestHandler = async (req, res) => {
 | 
					export const rerollRandomModController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = await getAccountIdForRequest(req);
 | 
					    const accountId = await getAccountIdForRequest(req);
 | 
				
			||||||
    const request = getJSONfromString<RerollRandomModRequest>(String(req.body));
 | 
					    const request = getJSONfromString<RerollRandomModRequest>(String(req.body));
 | 
				
			||||||
    if ("ItemIds" in request) {
 | 
					    if ("ItemIds" in request) {
 | 
				
			||||||
        const inventory = await getInventory(accountId, "Upgrades MiscItems");
 | 
					        const inventory = await getInventory(accountId, "Upgrades MiscItems");
 | 
				
			||||||
        const upgrade = inventory.Upgrades.id(request.ItemIds[0])!;
 | 
					        const changes: IChange[] = [];
 | 
				
			||||||
        const fingerprint = JSON.parse(upgrade.UpgradeFingerprint!) as IUnveiledRivenFingerprint;
 | 
					        let totalKuvaCost = 0;
 | 
				
			||||||
 | 
					        request.ItemIds.forEach(itemId => {
 | 
				
			||||||
 | 
					            const upgrade = inventory.Upgrades.id(itemId)!;
 | 
				
			||||||
 | 
					            const fingerprint = JSON.parse(upgrade.UpgradeFingerprint!) as RivenFingerprint;
 | 
				
			||||||
 | 
					            if ("challenge" in fingerprint) {
 | 
				
			||||||
 | 
					                upgrade.UpgradeFingerprint = JSON.stringify(
 | 
				
			||||||
 | 
					                    createUnveiledRivenFingerprint(ExportUpgrades[upgrade.ItemType])
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
                fingerprint.rerolls ??= 0;
 | 
					                fingerprint.rerolls ??= 0;
 | 
				
			||||||
                const kuvaCost = fingerprint.rerolls < rerollCosts.length ? rerollCosts[fingerprint.rerolls] : 3500;
 | 
					                const kuvaCost = fingerprint.rerolls < rerollCosts.length ? rerollCosts[fingerprint.rerolls] : 3500;
 | 
				
			||||||
 | 
					                totalKuvaCost += kuvaCost;
 | 
				
			||||||
                addMiscItems(inventory, [
 | 
					                addMiscItems(inventory, [
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        ItemType: "/Lotus/Types/Items/MiscItems/Kuva",
 | 
					                        ItemType: "/Lotus/Types/Items/MiscItems/Kuva",
 | 
				
			||||||
@ -27,18 +40,20 @@ export const rerollRandomModController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                randomiseRivenStats(ExportUpgrades[upgrade.ItemType], fingerprint);
 | 
					                randomiseRivenStats(ExportUpgrades[upgrade.ItemType], fingerprint);
 | 
				
			||||||
                upgrade.PendingRerollFingerprint = JSON.stringify(fingerprint);
 | 
					                upgrade.PendingRerollFingerprint = JSON.stringify(fingerprint);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            changes.push({
 | 
				
			||||||
 | 
					                ItemId: { $oid: request.ItemIds[0] },
 | 
				
			||||||
 | 
					                UpgradeFingerprint: upgrade.UpgradeFingerprint,
 | 
				
			||||||
 | 
					                PendingRerollFingerprint: upgrade.PendingRerollFingerprint
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        await inventory.save();
 | 
					        await inventory.save();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        res.json({
 | 
					        res.json({
 | 
				
			||||||
            changes: [
 | 
					            changes: changes,
 | 
				
			||||||
                {
 | 
					            cost: totalKuvaCost
 | 
				
			||||||
                    ItemId: { $oid: request.ItemIds[0] },
 | 
					 | 
				
			||||||
                    UpgradeFingerprint: upgrade.UpgradeFingerprint,
 | 
					 | 
				
			||||||
                    PendingRerollFingerprint: upgrade.PendingRerollFingerprint
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            ],
 | 
					 | 
				
			||||||
            cost: kuvaCost
 | 
					 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        const inventory = await getInventory(accountId, "Upgrades");
 | 
					        const inventory = await getInventory(accountId, "Upgrades");
 | 
				
			||||||
@ -63,4 +78,10 @@ interface AwDangitRequest {
 | 
				
			|||||||
    CommitReroll: boolean;
 | 
					    CommitReroll: boolean;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface IChange {
 | 
				
			||||||
 | 
					    ItemId: IOid;
 | 
				
			||||||
 | 
					    UpgradeFingerprint?: string;
 | 
				
			||||||
 | 
					    PendingRerollFingerprint?: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const rerollCosts = [900, 1000, 1200, 1400, 1700, 2000, 2350, 2750, 3150];
 | 
					const rerollCosts = [900, 1000, 1200, 1400, 1700, 2000, 2350, 2750, 3150];
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,18 @@
 | 
				
			|||||||
import { IUpgrade } from "warframe-public-export-plus";
 | 
					import { IUpgrade } from "warframe-public-export-plus";
 | 
				
			||||||
import { getRandomElement } from "../services/rngService";
 | 
					import { getRandomElement, getRandomInt } from "../services/rngService";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export type RivenFingerprint = IVeiledRivenFingerprint | IUnveiledRivenFingerprint;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface IVeiledRivenFingerprint {
 | 
				
			||||||
 | 
					    challenge: IRivenChallenge;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface IRivenChallenge {
 | 
				
			||||||
 | 
					    Type: string;
 | 
				
			||||||
 | 
					    Progress: number;
 | 
				
			||||||
 | 
					    Required: number;
 | 
				
			||||||
 | 
					    Complication?: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface IUnveiledRivenFingerprint {
 | 
					export interface IUnveiledRivenFingerprint {
 | 
				
			||||||
    compat: string;
 | 
					    compat: string;
 | 
				
			||||||
@ -17,6 +30,20 @@ interface IRivenStat {
 | 
				
			|||||||
    Value: number;
 | 
					    Value: number;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const createUnveiledRivenFingerprint = (meta: IUpgrade): IUnveiledRivenFingerprint => {
 | 
				
			||||||
 | 
					    const fingerprint: IUnveiledRivenFingerprint = {
 | 
				
			||||||
 | 
					        compat: getRandomElement(meta.compatibleItems!),
 | 
				
			||||||
 | 
					        lim: 0,
 | 
				
			||||||
 | 
					        lvl: 0,
 | 
				
			||||||
 | 
					        lvlReq: getRandomInt(8, 16),
 | 
				
			||||||
 | 
					        pol: getRandomElement(["AP_ATTACK", "AP_DEFENSE", "AP_TACTIC"]),
 | 
				
			||||||
 | 
					        buffs: [],
 | 
				
			||||||
 | 
					        curses: []
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    randomiseRivenStats(meta, fingerprint);
 | 
				
			||||||
 | 
					    return fingerprint;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const randomiseRivenStats = (meta: IUpgrade, fingerprint: IUnveiledRivenFingerprint): void => {
 | 
					export const randomiseRivenStats = (meta: IUpgrade, fingerprint: IUnveiledRivenFingerprint): void => {
 | 
				
			||||||
    fingerprint.buffs = [];
 | 
					    fingerprint.buffs = [];
 | 
				
			||||||
    const numBuffs = 2 + Math.trunc(Math.random() * 2); // 2 or 3
 | 
					    const numBuffs = 2 + Math.trunc(Math.random() * 2); // 2 or 3
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user