XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFESpaceNinjaServer

feat: unveiling rivens by doing the challenge (#1031)

Closes #722 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1031

526ce152
Sainan <sainan@calamity.inc>
提交于

代码差异

6 个文件 +85 -46
Modified src/controllers/api/activateRandomModController.ts +2 -8
@@ -1,4 +1,5 @@
1 1 import { toOid } from "@/src/helpers/inventoryHelpers";
2 import { IRivenChallenge } from "@/src/helpers/rivenFingerprintHelper";
2 3 import { getJSONfromString } from "@/src/helpers/stringHelpers";
3 4 import { addMods, getInventory } from "@/src/services/inventoryService";
4 5 import { getAccountIdForRequest } from "@/src/services/loginService";
@@ -19,7 +20,7 @@ export const activateRandomModController: RequestHandler = async (req, res) => {
19 20 ]);
20 21 const rivenType = getRandomElement(rivenRawToRealWeighted[request.ItemType]);
21 22 const challenge = getRandomElement(ExportUpgrades[rivenType].availableChallenges!);
22 const fingerprintChallenge: IRandomModChallenge = {
23 const fingerprintChallenge: IRivenChallenge = {
23 24 Type: challenge.fullName,
24 25 Progress: 0,
25 26 Required: getRandomInt(challenge.countRange[0], challenge.countRange[1])
@@ -62,13 +63,6 @@ interface IActiveRandomModRequest {
62 63 ItemType: string;
63 64 }
64 65
65 interface IRandomModChallenge {
66 Type: string;
67 Progress: number;
68 Required: number;
69 Complication?: string;
70 }
71
72 66 const rivenRawToRealWeighted: Record<string, string[]> = {
73 67 "/Lotus/Upgrades/Mods/Randomized/RawArchgunRandomMod": [
74 68 "/Lotus/Upgrades/Mods/Randomized/LotusArchgunRandomModRare"
Modified src/controllers/api/completeRandomModChallengeController.ts +2 -13
@@ -4,8 +4,7 @@ import { addMiscItems, getInventory, updateCurrency } from "@/src/services/inven
4 4 import { IInventoryChanges } from "@/src/types/purchaseTypes";
5 5 import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
6 6 import { getJSONfromString } from "@/src/helpers/stringHelpers";
7 import { IUnveiledRivenFingerprint, randomiseRivenStats } from "@/src/helpers/rivenFingerprintHelper";
8 import { getRandomElement, getRandomInt } from "@/src/services/rngService";
7 import { createUnveiledRivenFingerprint } from "@/src/helpers/rivenFingerprintHelper";
9 8 import { ExportUpgrades } from "warframe-public-export-plus";
10 9
11 10 export const completeRandomModChallengeController: RequestHandler = async (req, res) => {
@@ -31,17 +30,7 @@ export const completeRandomModChallengeController: RequestHandler = async (req,
31 30 // Update riven fingerprint to a randomised unveiled state
32 31 const upgrade = inventory.Upgrades.id(request.ItemId)!;
33 32 const meta = ExportUpgrades[upgrade.ItemType];
34 const fingerprint: IUnveiledRivenFingerprint = {
35 compat: getRandomElement(meta.compatibleItems!),
36 lim: 0,
37 lvl: 0,
38 lvlReq: getRandomInt(8, 16),
39 pol: getRandomElement(["AP_ATTACK", "AP_DEFENSE", "AP_TACTIC"]),
40 buffs: [],
41 curses: []
42 };
43 randomiseRivenStats(meta, fingerprint);
44 upgrade.UpgradeFingerprint = JSON.stringify(fingerprint);
33 upgrade.UpgradeFingerprint = JSON.stringify(createUnveiledRivenFingerprint(meta));
45 34
46 35 await inventory.save();
47 36
Modified src/controllers/api/rerollRandomModController.ts +44 -23
@@ -2,43 +2,58 @@ import { RequestHandler } from "express";
2 2 import { getAccountIdForRequest } from "@/src/services/loginService";
3 3 import { addMiscItems, getInventory } from "@/src/services/inventoryService";
4 4 import { getJSONfromString } from "@/src/helpers/stringHelpers";
5 import { IUnveiledRivenFingerprint, randomiseRivenStats } from "@/src/helpers/rivenFingerprintHelper";
5 import {
6 createUnveiledRivenFingerprint,
7 randomiseRivenStats,
8 RivenFingerprint
9 } from "@/src/helpers/rivenFingerprintHelper";
6 10 import { ExportUpgrades } from "warframe-public-export-plus";
11 import { IOid } from "@/src/types/commonTypes";
7 12
8 13 export const rerollRandomModController: RequestHandler = async (req, res) => {
9 14 const accountId = await getAccountIdForRequest(req);
10 15 const request = getJSONfromString<RerollRandomModRequest>(String(req.body));
11 16 if ("ItemIds" in request) {
12 17 const inventory = await getInventory(accountId, "Upgrades MiscItems");
13 const upgrade = inventory.Upgrades.id(request.ItemIds[0])!;
14 const fingerprint = JSON.parse(upgrade.UpgradeFingerprint!) as IUnveiledRivenFingerprint;
18 const changes: IChange[] = [];
19 let totalKuvaCost = 0;
20 request.ItemIds.forEach(itemId => {
21 const upgrade = inventory.Upgrades.id(itemId)!;
22 const fingerprint = JSON.parse(upgrade.UpgradeFingerprint!) as RivenFingerprint;
23 if ("challenge" in fingerprint) {
24 upgrade.UpgradeFingerprint = JSON.stringify(
25 createUnveiledRivenFingerprint(ExportUpgrades[upgrade.ItemType])
26 );
27 } else {
28 fingerprint.rerolls ??= 0;
29 const kuvaCost = fingerprint.rerolls < rerollCosts.length ? rerollCosts[fingerprint.rerolls] : 3500;
30 totalKuvaCost += kuvaCost;
31 addMiscItems(inventory, [
32 {
33 ItemType: "/Lotus/Types/Items/MiscItems/Kuva",
34 ItemCount: kuvaCost * -1
35 }
36 ]);
15 37
16 fingerprint.rerolls ??= 0;
17 const kuvaCost = fingerprint.rerolls < rerollCosts.length ? rerollCosts[fingerprint.rerolls] : 3500;
18 addMiscItems(inventory, [
19 {
20 ItemType: "/Lotus/Types/Items/MiscItems/Kuva",
21 ItemCount: kuvaCost * -1
22 }
23 ]);
38 fingerprint.rerolls++;
39 upgrade.UpgradeFingerprint = JSON.stringify(fingerprint);
24 40
25 fingerprint.rerolls++;
26 upgrade.UpgradeFingerprint = JSON.stringify(fingerprint);
41 randomiseRivenStats(ExportUpgrades[upgrade.ItemType], fingerprint);
42 upgrade.PendingRerollFingerprint = JSON.stringify(fingerprint);
43 }
27 44
28 randomiseRivenStats(ExportUpgrades[upgrade.ItemType], fingerprint);
29 upgrade.PendingRerollFingerprint = JSON.stringify(fingerprint);
45 changes.push({
46 ItemId: { $oid: request.ItemIds[0] },
47 UpgradeFingerprint: upgrade.UpgradeFingerprint,
48 PendingRerollFingerprint: upgrade.PendingRerollFingerprint
49 });
50 });
30 51
31 52 await inventory.save();
32 53
33 54 res.json({
34 changes: [
35 {
36 ItemId: { $oid: request.ItemIds[0] },
37 UpgradeFingerprint: upgrade.UpgradeFingerprint,
38 PendingRerollFingerprint: upgrade.PendingRerollFingerprint
39 }
40 ],
41 cost: kuvaCost
55 changes: changes,
56 cost: totalKuvaCost
42 57 });
43 58 } else {
44 59 const inventory = await getInventory(accountId, "Upgrades");
@@ -63,4 +78,10 @@ interface AwDangitRequest {
63 78 CommitReroll: boolean;
64 79 }
65 80
81 interface IChange {
82 ItemId: IOid;
83 UpgradeFingerprint?: string;
84 PendingRerollFingerprint?: string;
85 }
86
66 87 const rerollCosts = [900, 1000, 1200, 1400, 1700, 2000, 2350, 2750, 3150];
Modified src/helpers/rivenFingerprintHelper.ts +28 -1
@@ -1,5 +1,18 @@
1 1 import { IUpgrade } from "warframe-public-export-plus";
2 import { getRandomElement } from "../services/rngService";
2 import { getRandomElement, getRandomInt } from "../services/rngService";
3
4 export type RivenFingerprint = IVeiledRivenFingerprint | IUnveiledRivenFingerprint;
5
6 export interface IVeiledRivenFingerprint {
7 challenge: IRivenChallenge;
8 }
9
10 export interface IRivenChallenge {
11 Type: string;
12 Progress: number;
13 Required: number;
14 Complication?: string;
15 }
3 16
4 17 export interface IUnveiledRivenFingerprint {
5 18 compat: string;
@@ -17,6 +30,20 @@ interface IRivenStat {
17 30 Value: number;
18 31 }
19 32
33 export const createUnveiledRivenFingerprint = (meta: IUpgrade): IUnveiledRivenFingerprint => {
34 const fingerprint: IUnveiledRivenFingerprint = {
35 compat: getRandomElement(meta.compatibleItems!),
36 lim: 0,
37 lvl: 0,
38 lvlReq: getRandomInt(8, 16),
39 pol: getRandomElement(["AP_ATTACK", "AP_DEFENSE", "AP_TACTIC"]),
40 buffs: [],
41 curses: []
42 };
43 randomiseRivenStats(meta, fingerprint);
44 return fingerprint;
45 };
46
20 47 export const randomiseRivenStats = (meta: IUpgrade, fingerprint: IUnveiledRivenFingerprint): void => {
21 48 fingerprint.buffs = [];
22 49 const numBuffs = 2 + Math.trunc(Math.random() * 2); // 2 or 3
Modified src/services/missionInventoryUpdateService.ts +6 -0
@@ -201,6 +201,12 @@ export const addMissionInventoryUpdates = (
201 201 }
202 202 });
203 203 break;
204 case "Upgrades":
205 value.forEach(clientUpgrade => {
206 const upgrade = inventory.Upgrades.id(clientUpgrade.ItemId.$oid)!;
207 upgrade.UpgradeFingerprint = clientUpgrade.UpgradeFingerprint; // primitive way to copy over the riven challenge progress
208 });
209 break;
204 210 case "SyndicateId": {
205 211 inventory.CompletedSyndicates.push(value);
206 212 break;
Modified src/types/requestTypes.ts +3 -1
@@ -14,7 +14,8 @@ import {
14 14 ICustomMarkers,
15 15 IPlayerSkills,
16 16 IQuestKeyDatabase,
17 ILoreFragmentScan
17 ILoreFragmentScan,
18 IUpgradeClient
18 19 } from "./inventoryTypes/inventoryTypes";
19 20
20 21 export interface IThemeUpdateRequest {
@@ -98,6 +99,7 @@ export type IMissionInventoryUpdateRequest = {
98 99 CodexScanCount: number;
99 100 Standing: number;
100 101 }[];
102 Upgrades?: IUpgradeClient[]; // riven challenge progress
101 103 } & {
102 104 [K in TEquipmentKey]?: IEquipmentClient[];
103 105 };