返回提交历史
Modified
src/controllers/api/activateRandomModController.ts
+2
-8
Modified
src/controllers/api/completeRandomModChallengeController.ts
+2
-13
Modified
src/controllers/api/rerollRandomModController.ts
+44
-23
Modified
src/helpers/rivenFingerprintHelper.ts
+28
-1
Modified
src/services/missionInventoryUpdateService.ts
+6
-0
Modified
src/types/requestTypes.ts
+3
-1
XFEstudio/SpaceNinjaServer
feat: unveiling rivens by doing the challenge (#1031)
Closes #722 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1031
526ce152
代码差异
6 个文件
+85
-46
@@ -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"
@@ -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
@@ -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];
@@ -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
@@ -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;
@@ -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
};