bitburner-src/src/Hacking.ts

91 lines
3.7 KiB
TypeScript
Raw Normal View History

import { BitNodeMultipliers } from "./BitNode/BitNodeMultipliers";
import { Person as IPerson } from "@nsdefs";
import { calculateIntelligenceBonus } from "./PersonObjects/formulas/intelligence";
import { Server as IServer } from "@nsdefs";
/** Returns the chance the person has to successfully hack a server */
export function calculateHackingChance(server: IServer, person: IPerson): number {
const hackDifficulty = server.hackDifficulty ?? 100;
const requiredHackingSkill = server.requiredHackingSkill ?? 1e9;
// Unrooted or unhackable server
if (!server.hasAdminRights || hackDifficulty >= 100) return 0;
2021-09-05 01:09:30 +02:00
const hackFactor = 1.75;
const difficultyMult = (100 - hackDifficulty) / 100;
2022-09-06 15:07:12 +02:00
const skillMult = hackFactor * person.skills.hacking;
const skillChance = (skillMult - requiredHackingSkill) / skillMult;
2021-09-05 01:09:30 +02:00
const chance =
skillChance *
difficultyMult *
2022-09-06 15:07:12 +02:00
person.mults.hacking_chance *
calculateIntelligenceBonus(person.skills.intelligence, 1);
return Math.min(1, Math.max(chance, 0));
}
/**
2022-09-06 15:07:12 +02:00
* Returns the amount of hacking experience the person will gain upon
* successfully hacking a server
*/
export function calculateHackingExpGain(server: IServer, person: IPerson): number {
const baseDifficulty = server.baseDifficulty;
if (!baseDifficulty) return 0;
2021-09-05 01:09:30 +02:00
const baseExpGain = 3;
const diffFactor = 0.3;
let expGain = baseExpGain;
expGain += baseDifficulty * diffFactor;
2022-09-06 15:07:12 +02:00
return expGain * person.mults.hacking_exp * BitNodeMultipliers.HackExpGain;
}
/**
* Returns the percentage of money that will be stolen from a server if
* it is successfully hacked (returns the decimal form, not the actual percent value)
*/
export function calculatePercentMoneyHacked(server: IServer, person: IPerson): number {
const hackDifficulty = server.hackDifficulty ?? 100;
if (hackDifficulty >= 100) return 0;
const requiredHackingSkill = server.requiredHackingSkill ?? 1e9;
2021-09-05 01:09:30 +02:00
// Adjust if needed for balancing. This is the divisor for the final calculation
const balanceFactor = 240;
const difficultyMult = (100 - hackDifficulty) / 100;
const skillMult = (person.skills.hacking - (requiredHackingSkill - 1)) / person.skills.hacking;
2022-04-07 01:30:08 +02:00
const percentMoneyHacked =
2022-09-06 15:07:12 +02:00
(difficultyMult * skillMult * person.mults.hacking_money * BitNodeMultipliers.ScriptHackMoney) / balanceFactor;
return Math.min(1, Math.max(percentMoneyHacked, 0));
}
/** Returns time it takes to complete a hack on a server, in seconds */
export function calculateHackingTime(server: IServer, person: IPerson): number {
const hackDifficulty = server.hackDifficulty;
const requiredHackingSkill = server.requiredHackingSkill;
if (!hackDifficulty || !requiredHackingSkill) return Infinity;
const difficultyMult = requiredHackingSkill * hackDifficulty;
2021-09-05 01:09:30 +02:00
const baseDiff = 500;
const baseSkill = 50;
const diffFactor = 2.5;
let skillFactor = diffFactor * difficultyMult + baseDiff;
2022-09-06 15:07:12 +02:00
skillFactor /= person.skills.hacking + baseSkill;
2021-09-05 01:09:30 +02:00
const hackTimeMultiplier = 5;
const hackingTime =
(hackTimeMultiplier * skillFactor) /
2022-09-06 15:07:12 +02:00
(person.mults.hacking_speed * calculateIntelligenceBonus(person.skills.intelligence, 1));
2021-09-05 01:09:30 +02:00
return hackingTime;
}
/** Returns time it takes to complete a grow operation on a server, in seconds */
export function calculateGrowTime(server: IServer, person: IPerson): number {
2021-09-05 01:09:30 +02:00
const growTimeMultiplier = 3.2; // Relative to hacking time. 16/5 = 3.2
2022-09-06 15:07:12 +02:00
return growTimeMultiplier * calculateHackingTime(server, person);
}
/** Returns time it takes to complete a weaken operation on a server, in seconds */
export function calculateWeakenTime(server: IServer, person: IPerson): number {
2021-09-05 01:09:30 +02:00
const weakenTimeMultiplier = 4; // Relative to hacking time
2022-09-06 15:07:12 +02:00
return weakenTimeMultiplier * calculateHackingTime(server, person);
}