mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2026-04-26 03:00:56 +02:00
106 lines
3.8 KiB
TypeScript
106 lines
3.8 KiB
TypeScript
import { Player } from "@player";
|
|
import { addClue } from "./effects";
|
|
import { formatNumber, formatRam } from "../../ui/formatNumber";
|
|
import { logger } from "./offlineServerHandling";
|
|
import type { NetscriptContext } from "../../Netscript/APIWrapper";
|
|
import type { DarknetServer } from "../../Server/DarknetServer";
|
|
import { addCacheToServer } from "./cacheFiles";
|
|
import { DarknetState } from "../models/DarknetState";
|
|
import { getAllMovableDarknetServers } from "../utils/darknetNetworkUtils";
|
|
import { CompletedProgramName } from "@enums";
|
|
import type { DarknetServerData, Person as IPerson } from "@nsdefs";
|
|
import { clampNumber } from "../../utils/helpers/clampNumber";
|
|
import { ResponseCodeEnum } from "../Enums";
|
|
import { isLabyrinthServer } from "./labyrinth";
|
|
import { roundToTwo } from "../../utils/helpers/roundToTwo";
|
|
|
|
/*
|
|
* Handles the effects of removing some blocked RAM from a Darknet server.
|
|
*/
|
|
export const handleRamBlockRemoved = (ctx: NetscriptContext, server: DarknetServer) => {
|
|
const threads = ctx.workerScript.scriptRef.threads;
|
|
const difficulty = server.difficulty + 1;
|
|
|
|
const ramBlockRemoved = getRamBlockRemoved(server, threads);
|
|
server.blockedRam = roundToTwo(server.blockedRam - ramBlockRemoved);
|
|
server.updateRamUsed(server.ramUsed - ramBlockRemoved);
|
|
|
|
if (server.blockedRam <= 0) {
|
|
handleRamBlockClearedRewards(server);
|
|
}
|
|
const xpGained = Player.mults.charisma_exp * threads * 10 * 1.1 ** difficulty;
|
|
Player.gainCharismaExp(xpGained);
|
|
|
|
const result = `Liberated ${formatRam(
|
|
ramBlockRemoved,
|
|
4,
|
|
)} of RAM from the server owner's processes. (Gained ${formatNumber(xpGained, 1)} cha xp.)`;
|
|
logger(ctx)(result);
|
|
return {
|
|
success: true,
|
|
code: ResponseCodeEnum.Success,
|
|
message: result,
|
|
};
|
|
};
|
|
|
|
/*
|
|
* Handles the rewards for fully clearing a Darknet server's RAM block.
|
|
*/
|
|
export const handleRamBlockClearedRewards = (server: DarknetServer) => {
|
|
if (!isLabyrinthServer(server.hostname)) {
|
|
addCacheToServer(server, false);
|
|
}
|
|
if (Math.random() < 0.3) {
|
|
addClue(server);
|
|
}
|
|
|
|
const stormSeedChance = 0.15;
|
|
const timeSinceLastStorm = Date.now() - DarknetState.lastStormTime.getTime();
|
|
const stormFileExists = getAllMovableDarknetServers().some((s) =>
|
|
s.programs.includes(CompletedProgramName.stormSeed),
|
|
);
|
|
if (timeSinceLastStorm > 30 * 60 * 1000 && !stormFileExists && Math.random() < stormSeedChance) {
|
|
server.programs.push(CompletedProgramName.stormSeed);
|
|
}
|
|
};
|
|
|
|
/*
|
|
* Calculates the amount of RAM block that is removed from a Darknet server, based on the number of threads and the player's charisma.
|
|
*/
|
|
export const getRamBlockRemoved = (darknetServerData: DarknetServerData, threads = 1, player: IPerson = Player) => {
|
|
const difficulty = darknetServerData.difficulty;
|
|
const remainingRamBlock = darknetServerData.blockedRam;
|
|
const charismaFactor = 1 + player.skills.charisma / 100;
|
|
const difficultyFactor = 2 * 0.92 ** (difficulty + 1);
|
|
const baseAmount = 0.02;
|
|
return roundToTwo(clampNumber(baseAmount * difficultyFactor * threads * charismaFactor, 0, remainingRamBlock));
|
|
};
|
|
|
|
/*
|
|
* Sets the RAM used on all Darknet servers to account for any changes in their RAM blocks.
|
|
*/
|
|
export const applyRamBlocks = () => {
|
|
const servers = getAllMovableDarknetServers();
|
|
for (const server of servers) {
|
|
server.updateRamUsed(server.blockedRam);
|
|
}
|
|
};
|
|
|
|
/*
|
|
* Determines a random amount of blocked RAM to assign to a Darknet server, based on its maximum RAM.
|
|
*/
|
|
export const getRamBlock = (maxRam: number): number => {
|
|
if (maxRam === 16) {
|
|
return [0, 1, 2][Math.floor(Math.random() * 2)];
|
|
}
|
|
if (maxRam <= 32) {
|
|
return [0, 2, 4][Math.floor(Math.random() * 2)];
|
|
}
|
|
|
|
if (maxRam <= 64) {
|
|
return [16, 32, maxRam - 8][Math.floor(Math.random() * 3)];
|
|
}
|
|
|
|
return roundToTwo([maxRam, maxRam - 8, maxRam - 64, maxRam / 2][Math.floor(Math.random() * 4)]);
|
|
};
|