feat: activate riven mod (get a random challenge)
This commit is contained in:
parent
06bc0123ba
commit
8a9b106a55
8
package-lock.json
generated
8
package-lock.json
generated
@ -12,7 +12,7 @@
|
|||||||
"copyfiles": "^2.4.1",
|
"copyfiles": "^2.4.1",
|
||||||
"express": "^5",
|
"express": "^5",
|
||||||
"mongoose": "^8.9.2",
|
"mongoose": "^8.9.2",
|
||||||
"warframe-public-export-plus": "^0.5.19",
|
"warframe-public-export-plus": "^0.5.21",
|
||||||
"warframe-riven-info": "^0.1.2",
|
"warframe-riven-info": "^0.1.2",
|
||||||
"winston": "^3.17.0",
|
"winston": "^3.17.0",
|
||||||
"winston-daily-rotate-file": "^5.0.0"
|
"winston-daily-rotate-file": "^5.0.0"
|
||||||
@ -3778,9 +3778,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/warframe-public-export-plus": {
|
"node_modules/warframe-public-export-plus": {
|
||||||
"version": "0.5.19",
|
"version": "0.5.21",
|
||||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.19.tgz",
|
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.21.tgz",
|
||||||
"integrity": "sha512-ERCPAe4ojJXts6tyNPBvNsFcgAwJuV3M04iDfXhudJfpJrg0qseDO4AExjSyFo+WUvKoWROMCy9dCRzxIbNATw=="
|
"integrity": "sha512-06k63L99wfX+lPx7ReYzGiMK/7NtNEiO97r+kemrtn4QIEKCfvBvmKiJcYbkSo79x35CQ+6FQfMtDilf6DGz6Q=="
|
||||||
},
|
},
|
||||||
"node_modules/warframe-riven-info": {
|
"node_modules/warframe-riven-info": {
|
||||||
"version": "0.1.2",
|
"version": "0.1.2",
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
"copyfiles": "^2.4.1",
|
"copyfiles": "^2.4.1",
|
||||||
"express": "^5",
|
"express": "^5",
|
||||||
"mongoose": "^8.9.2",
|
"mongoose": "^8.9.2",
|
||||||
"warframe-public-export-plus": "^0.5.19",
|
"warframe-public-export-plus": "^0.5.21",
|
||||||
"warframe-riven-info": "^0.1.2",
|
"warframe-riven-info": "^0.1.2",
|
||||||
"winston": "^3.17.0",
|
"winston": "^3.17.0",
|
||||||
"winston-daily-rotate-file": "^5.0.0"
|
"winston-daily-rotate-file": "^5.0.0"
|
||||||
|
98
src/controllers/api/activateRandomModController.ts
Normal file
98
src/controllers/api/activateRandomModController.ts
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||||
|
import { addMods, getInventory } from "@/src/services/inventoryService";
|
||||||
|
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||||
|
import { getRandomElement, getRandomInt, getRandomReward, IRngResult } from "@/src/services/rngService";
|
||||||
|
import { logger } from "@/src/utils/logger";
|
||||||
|
import { RequestHandler } from "express";
|
||||||
|
import { ExportUpgrades } from "warframe-public-export-plus";
|
||||||
|
|
||||||
|
export const activateRandomModController: RequestHandler = async (req, res) => {
|
||||||
|
const accountId = await getAccountIdForRequest(req);
|
||||||
|
const inventory = await getInventory(accountId);
|
||||||
|
const request = getJSONfromString(String(req.body)) as IActiveRandomModRequest;
|
||||||
|
addMods(inventory, [
|
||||||
|
{
|
||||||
|
ItemType: request.ItemType,
|
||||||
|
ItemCount: -1
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
const rivenType = getRandomElement(rivenRawToRealWeighted[request.ItemType]);
|
||||||
|
const challenge = getRandomElement(ExportUpgrades[rivenType].availableChallenges!);
|
||||||
|
const fingerprintChallenge: IRandomModChallenge = {
|
||||||
|
Type: challenge.fullName,
|
||||||
|
Progress: 0,
|
||||||
|
Required: getRandomInt(challenge.countRange[0], challenge.countRange[1])
|
||||||
|
};
|
||||||
|
if (Math.random() < challenge.complicationChance) {
|
||||||
|
const complicationsAsRngResults: IRngResult[] = [];
|
||||||
|
for (const complication of challenge.complications) {
|
||||||
|
complicationsAsRngResults.push({
|
||||||
|
type: complication.fullName,
|
||||||
|
itemCount: 1,
|
||||||
|
probability: complication.weight
|
||||||
|
});
|
||||||
|
}
|
||||||
|
fingerprintChallenge.Complication = getRandomReward(complicationsAsRngResults)!.type;
|
||||||
|
logger.debug(
|
||||||
|
`riven rolled challenge ${fingerprintChallenge.Type} with complication ${fingerprintChallenge.Complication}`
|
||||||
|
);
|
||||||
|
const complication = challenge.complications.find(x => x.fullName == fingerprintChallenge.Complication)!;
|
||||||
|
fingerprintChallenge.Required *= complication.countMultiplier;
|
||||||
|
} else {
|
||||||
|
logger.debug(`riven rolled challenge ${fingerprintChallenge.Type}`);
|
||||||
|
}
|
||||||
|
const upgradeIndex =
|
||||||
|
inventory.Upgrades.push({
|
||||||
|
ItemType: rivenType,
|
||||||
|
UpgradeFingerprint: JSON.stringify({ challenge: fingerprintChallenge })
|
||||||
|
}) - 1;
|
||||||
|
await inventory.save();
|
||||||
|
res.json({
|
||||||
|
NewMod: inventory.Upgrades[upgradeIndex].toJSON()
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
interface IActiveRandomModRequest {
|
||||||
|
ItemType: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IRandomModChallenge {
|
||||||
|
Type: string;
|
||||||
|
Progress: number;
|
||||||
|
Required: number;
|
||||||
|
Complication?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rivenRawToRealWeighted: Record<string, string[]> = {
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/RawArchgunRandomMod": [
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/LotusArchgunRandomModRare"
|
||||||
|
],
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/RawMeleeRandomMod": [
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/PlayerMeleeWeaponRandomModRare"
|
||||||
|
],
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/RawModularMeleeRandomMod": [
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/LotusModularMeleeRandomModRare"
|
||||||
|
],
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/RawModularPistolRandomMod": [
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/LotusModularPistolRandomModRare"
|
||||||
|
],
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/RawPistolRandomMod": ["/Lotus/Upgrades/Mods/Randomized/LotusPistolRandomModRare"],
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/RawRifleRandomMod": ["/Lotus/Upgrades/Mods/Randomized/LotusRifleRandomModRare"],
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/RawShotgunRandomMod": [
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/LotusShotgunRandomModRare"
|
||||||
|
],
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/RawSentinelWeaponRandomMod": [
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/LotusRifleRandomModRare",
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/LotusRifleRandomModRare",
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/LotusRifleRandomModRare",
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/LotusRifleRandomModRare",
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/LotusRifleRandomModRare",
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/LotusRifleRandomModRare",
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/LotusRifleRandomModRare",
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/LotusRifleRandomModRare",
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/LotusRifleRandomModRare",
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/LotusShotgunRandomModRare",
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/LotusPistolRandomModRare",
|
||||||
|
"/Lotus/Upgrades/Mods/Randomized/PlayerMeleeWeaponRandomModRare"
|
||||||
|
]
|
||||||
|
};
|
@ -1,4 +1,5 @@
|
|||||||
import express from "express";
|
import express from "express";
|
||||||
|
import { activateRandomModController } from "@/src/controllers/api/activateRandomModController";
|
||||||
import { addFriendImageController } from "@/src/controllers/api/addFriendImageController";
|
import { addFriendImageController } from "@/src/controllers/api/addFriendImageController";
|
||||||
import { arcaneCommonController } from "@/src/controllers/api/arcaneCommonController";
|
import { arcaneCommonController } from "@/src/controllers/api/arcaneCommonController";
|
||||||
import { artifactsController } from "../controllers/api/artifactsController";
|
import { artifactsController } from "../controllers/api/artifactsController";
|
||||||
@ -107,6 +108,7 @@ apiRouter.get("/surveys.php", surveysController);
|
|||||||
apiRouter.get("/updateSession.php", updateSessionGetController);
|
apiRouter.get("/updateSession.php", updateSessionGetController);
|
||||||
|
|
||||||
// post
|
// post
|
||||||
|
apiRouter.post("/activateRandomMod.php", activateRandomModController);
|
||||||
apiRouter.post("/addFriendImage.php", addFriendImageController);
|
apiRouter.post("/addFriendImage.php", addFriendImageController);
|
||||||
apiRouter.post("/arcaneCommon.php", arcaneCommonController);
|
apiRouter.post("/arcaneCommon.php", arcaneCommonController);
|
||||||
apiRouter.post("/artifacts.php", artifactsController);
|
apiRouter.post("/artifacts.php", artifactsController);
|
||||||
|
@ -6,6 +6,18 @@ export interface IRngResult {
|
|||||||
probability: number;
|
probability: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const getRandomElement = <T>(arr: T[]): T => {
|
||||||
|
return arr[Math.floor(Math.random() * arr.length)];
|
||||||
|
};
|
||||||
|
|
||||||
|
// Returns a random integer between min (inclusive) and max (inclusive).
|
||||||
|
// https://stackoverflow.com/a/1527820
|
||||||
|
export const getRandomInt = (min: number, max: number): number => {
|
||||||
|
min = Math.ceil(min);
|
||||||
|
max = Math.floor(max);
|
||||||
|
return Math.floor(Math.random() * (max - min + 1)) + min;
|
||||||
|
};
|
||||||
|
|
||||||
export const getRandomReward = (pool: IRngResult[]): IRngResult | undefined => {
|
export const getRandomReward = (pool: IRngResult[]): IRngResult | undefined => {
|
||||||
if (pool.length == 0) return;
|
if (pool.length == 0) return;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user