forked from OpenWF/SpaceNinjaServer
feat: unveiling rivens by doing the challenge (#1031)
Closes #722 Reviewed-on: OpenWF/SpaceNinjaServer#1031
This commit is contained in:
parent
9267c9929e
commit
526ce1529b
@ -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
|
||||||
|
@ -201,6 +201,12 @@ export const addMissionInventoryUpdates = (
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
case "Upgrades":
|
||||||
|
value.forEach(clientUpgrade => {
|
||||||
|
const upgrade = inventory.Upgrades.id(clientUpgrade.ItemId.$oid)!;
|
||||||
|
upgrade.UpgradeFingerprint = clientUpgrade.UpgradeFingerprint; // primitive way to copy over the riven challenge progress
|
||||||
|
});
|
||||||
|
break;
|
||||||
case "SyndicateId": {
|
case "SyndicateId": {
|
||||||
inventory.CompletedSyndicates.push(value);
|
inventory.CompletedSyndicates.push(value);
|
||||||
break;
|
break;
|
||||||
|
@ -14,7 +14,8 @@ import {
|
|||||||
ICustomMarkers,
|
ICustomMarkers,
|
||||||
IPlayerSkills,
|
IPlayerSkills,
|
||||||
IQuestKeyDatabase,
|
IQuestKeyDatabase,
|
||||||
ILoreFragmentScan
|
ILoreFragmentScan,
|
||||||
|
IUpgradeClient
|
||||||
} from "./inventoryTypes/inventoryTypes";
|
} from "./inventoryTypes/inventoryTypes";
|
||||||
|
|
||||||
export interface IThemeUpdateRequest {
|
export interface IThemeUpdateRequest {
|
||||||
@ -98,6 +99,7 @@ export type IMissionInventoryUpdateRequest = {
|
|||||||
CodexScanCount: number;
|
CodexScanCount: number;
|
||||||
Standing: number;
|
Standing: number;
|
||||||
}[];
|
}[];
|
||||||
|
Upgrades?: IUpgradeClient[]; // riven challenge progress
|
||||||
} & {
|
} & {
|
||||||
[K in TEquipmentKey]?: IEquipmentClient[];
|
[K in TEquipmentKey]?: IEquipmentClient[];
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user