Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /** buildServerInfo()
- * @param {NS} ns NS2 namespace
- * @param {string[]} callScript ["weakenScript", "growScript", "hackScript"]
- * @returns {Array[]} []["serverName", ram, freeRam]
- */
- function buildServerInfo(ns, callScript) {
- var servers = [];
- // Purchased servers
- var serversPurch = ns.getPurchasedServers();
- for (var i = 0; i < serversPurch.length; i++) {
- var serverName = serversPurch[i];
- var ram = ns.getServerMaxRam(serverName);
- if (ram < 64) {
- ns.tprint(serverName + " RAM too low, need 64 GB minimum.");
- } else {
- ns.scp(callScript[0], serverName);
- ns.scp(callScript[1], serverName);
- ns.scp(callScript[2], serverName);
- servers[servers.length] = [serverName, ram, ram];
- }
- }
- // Home
- var homeRam = 512;
- servers[servers.length] = [ns.getHostname(), homeRam, homeRam];
- return servers;
- }
- /** monitorMoney()
- * @param {NS} ns NS2 namespace
- * @param {number} moneyMax maximum money of target
- * @param {number} moneyAvail money available on target
- * @param {string} target server to display values for
- */
- function monitorMoney(ns, moneyMax, moneyAvail, target) {
- ns.tprint(target + ": Money=" + ns.formatPercent(moneyAvail / moneyMax, 3));
- }
- /** waitOnJob()
- * @param {NS} ns NS2 namespace
- * @param {number} delay time to wait (ms)
- * @param {Array[]} servers []["scriptName", "serverName", bound, "target"]
- * @param {number} timeExec maximum time needed for exec() to complete (ms)
- */
- async function waitOnJob(ns, delay, servers, timeExec) {
- await ns.sleep(delay);
- for (var i = 0; i < servers.length; i++) {
- while (ns.isRunning(servers[i][0], servers[i][1], servers[i][2], servers[i][3])) {
- await ns.sleep(timeExec);
- }
- }
- }
- /** performJob()
- * @param {NS} ns NS2 namespace
- * @param {Array[]} servers []["scriptName", "serverName", numThreads, "target"]
- * @param {number} timeExec maximum time needed for exec() to complete (ms)
- * @param {number} timeDelay maximum sleep time until weaken, grow, or hack (ms)
- * @returns {Array[]} []["scriptName", "serverName", bound, "target"]
- */
- async function performJob(ns, servers, timeExec, timeDelay) {
- var retServers = [];
- var delta = 0;
- for (var i = 0; i < servers.length; i++) {
- var start = Date.now();
- if (servers[i][2] > 0) {
- ns.exec(servers[i][0], servers[i][1], servers[i][2], start + timeDelay, servers[i][3]);
- var elapsedTime = Date.now() - start;
- delta = timeExec - elapsedTime;
- if ((i != servers.length - 1) && (delta > 0)) {
- await ns.sleep(delta);
- }
- }
- retServers[retServers.length] = [servers[i][0], servers[i][1], start + timeDelay, servers[i][3]];
- }
- if (delta < 0) { delta = 0; }
- await ns.sleep(timeDelay + delta);
- return retServers;
- }
- /** calculateJob()
- * @param {string[]} callScript ["weakenScript", "growScript", "hackScript"]
- * @param {number[]} callRam [weakenRam, growRam, hackRam]
- * @param {Array[]} servers []["serverName", ram, freeRam]
- * @param {number} numCalls number of calls
- * @param {number} mode modes are 0:weaken, 1:grow, 2:hack
- * @param {string} target server to pull money from
- * @returns {Array[][]} [numCalls, totalFree, []["scriptName", "serverName", numThreads, "target"]]
- */
- function calculateJob(callScript, callRam, servers, numCalls, mode, target) {
- var retCalls = 0;
- var retServers = [];
- var fractionalJob = 0;
- var totalFree = 0;
- // Calculate free RAM on all servers
- for (var i = 0; i < servers.length; i++) {
- totalFree += servers[i][2];
- }
- var retFree = totalFree;
- // Calculate RAM being requested
- var totalRequested = numCalls * callRam[mode];
- if (totalRequested >= totalFree) {
- // Use all available RAM
- for (var i = 0; i < servers.length; i++) {
- var numThreads = servers[i][2] / callRam[mode];
- var numThreadsFloor = Math.floor(numThreads);
- // add the fractional job
- fractionalJob += numThreads - numThreadsFloor;
- numThreads = numThreadsFloor;
- retServers[retServers.length] = [callScript[mode], servers[i][0], numThreads, target];
- retCalls += numThreads;
- servers[i][2] = 0;
- }
- retFree = 0;
- } else {
- // Use (totalRequested / totalFree) part of ram on each server
- for (var i = 0; i < servers.length; i++) {
- var numThreads = (totalRequested / totalFree) * servers[i][2] / callRam[mode];
- var numThreadsFloor = Math.floor(numThreads);
- // add the fractional job
- fractionalJob += numThreads - numThreadsFloor;
- numThreads = numThreadsFloor;
- retServers[retServers.length] = [callScript[mode], servers[i][0], numThreads, target];
- if (numThreads > 0) {
- retCalls += numThreads;
- retFree -= numThreads * callRam[mode];
- servers[i][2] -= numThreads * callRam[mode];
- }
- }
- }
- // Assign the fractional job. This will increase the number of threads, but
- // will not decrease free RAM on the host because RAM was reserved for this.
- fractionalJob = Math.round(fractionalJob);
- retCalls += fractionalJob;
- for (var i = 0; i < fractionalJob; i++) {
- retServers[i][2]++;
- }
- return [retCalls, retFree, retServers];
- }
- /** getStdDev()
- * @param {Array[]} servers []["serverName", ram, freeRam]
- * @returns {number} standard deviation of free RAM on hosts
- */
- function getStdDev(servers) {
- var meanRam = 0, sdRam = 0;
- for (var i = 0; i < servers.length; i++) {
- meanRam += servers[i][2];
- }
- meanRam /= servers.length;
- for (var i = 0; i < servers.length; i++) {
- sdRam += (servers[i][2] - meanRam) ** 2;
- }
- sdRam = Math.sqrt(sdRam / servers.length);
- return sdRam;
- }
- /** getHostMult() Gets host thread multiplier for hacking money from max to 60%.
- * @param {Array[]} servers []["serverName", ram, freeRam]
- * @returns {number} host thread multiplier
- */
- function getHostMult(servers) {
- var retval;
- if (servers.length >= 3) {
- retval = 0.175 + (servers.length - 3) * 0.015;
- } else if (servers.length == 2) {
- retval = 0.125;
- } else {
- return 0;
- }
- retval -= getStdDev(servers) * 0.000225;
- if (retval < 0) { retval = 0; }
- return retval;
- }
- /** setFreeRam()
- * @param {number} numJobs number of concurrent jobs
- * @param {Array[]} servers []["serverName", ram, freeRam]
- * @param {number} scriptRam max RAM needed for host script
- */
- function setFreeRam(numJobs, servers, scriptRam) {
- // Reserve (numJobs * scriptRam) RAM from each host.
- for (var i = 0; i < servers.length; i++) {
- servers[i][2] = servers[i][1] - numJobs * scriptRam;
- }
- }
- /** printTotalIncome()
- * @param {NS} ns NS2 namespace
- * @param {number} totalIncome total $ produced
- * @param {number} startTime manager start time
- * @param {string} target server to pull money from
- */
- function printTotalIncome(ns, totalIncome, startTime, target) {
- ns.tprint(target + ": Total=$" + ns.formatNumber(totalIncome, 3, 1000, true) +
- " Per second=$" + ns.formatNumber(totalIncome / ((Date.now() - startTime) / 1000), 3, 1000, true));
- }
- /**
- * @param {NS} ns NS2 namespace
- * @version 1.1
- */
- export async function main(ns) {
- if (ns.args.length < 1) {
- ns.tprint("Usage: " + ns.getScriptName() + " <target>");
- ns.exit();
- }
- var target = ns.args[0]; // server to pull money from
- ns.disableLog("ALL");
- // Check for running script
- var callScript = ["hm-weaken.js", "hm-grow.js", "hm-hack.js"];
- if (ns.scriptRunning(callScript[0], ns.getHostname()) ||
- ns.scriptRunning(callScript[1], ns.getHostname()) ||
- ns.scriptRunning(callScript[2], ns.getHostname())) {
- ns.tprint("Host script already running.");
- }
- // Get root access on the target
- if (ns.fileExists("BruteSSH.exe", "home")) { ns.brutessh(target); }
- if (ns.fileExists("FTPCrack.exe", "home")) { ns.ftpcrack(target); }
- if (ns.fileExists("relaySMTP.exe", "home")) { ns.relaysmtp(target); }
- if (ns.fileExists("HTTPWorm.exe", "home")) { ns.httpworm(target); }
- ns.nuke(target);
- var bFormulas = ns.fileExists("Formulas.exe", "home");
- if (bFormulas) { ns.tprint("Using Formulas.exe."); }
- var callRam = [ns.getScriptRam(callScript[0]), ns.getScriptRam(callScript[1]), ns.getScriptRam(callScript[2])];
- var moneyMax = ns.getServerMaxMoney(target);
- var threshMoney = moneyMax * 0.75; // money threshold
- var secLevelMin = ns.getServerMinSecurityLevel(target);
- var threshSec = secLevelMin + 3.25; // security threshold
- var moneyAvail = ns.getServerMoneyAvailable(target);
- var secLevel = ns.getServerSecurityLevel(target);
- // maximum time needed for exec() to complete (ms)
- var timeExec = 25;
- // maximum sleep time until weaken, grow, or hack (ms)
- var timeDelay;
- // total $ produced
- var totalIncome = 0;
- // hacking skill multiplier uses result of hacking money from max to 60%.
- var skillM = (ns.getServerRequiredHackingLevel(target) / ns.getHackingLevel() - 1 / 3) * 0.67;
- // If not using formulas:
- // Part per hack value. (Normalize for security level below threshold).
- var pphCurrent = -1;
- // Part per hack values for security level below/above threshold.
- var pphSecLow = -1, pphSecHigh = -1;
- // Part per grow values. (SL/SH for security level below/above threshold).
- var ppg60to85SL = -1, ppg60to100SL = -1, ppg75to100SL = -1;
- var ppg60to85SH = -1, ppg60to100SH = -1, ppg75to100SH = -1;
- // Multipliers used to normalize part per hack and part per grow.
- var pphNorm = 0.043, ppg60Norm = 0.15, ppg100Norm = 0.15;
- // Build array of server information
- var servers = buildServerInfo(ns, callScript);
- ns.tprint("Managing " + servers.length + " servers.");
- // host thread multiplier for hacking money from max to 60%
- var hostM;
- // Display estimated RAM needed and total RAM.
- {
- setFreeRam(3, servers, Math.max.apply(null, callRam));
- hostM = getHostMult(servers);
- // calculate number of hack calls
- var partPerHack, mockTarget, norm = 1;
- if (bFormulas) {
- mockTarget = ns.getServer(target);
- mockTarget.hackDifficulty = secLevelMin + 1;
- partPerHack = ns.formulas.hacking.hackPercent(mockTarget, ns.getPlayer());
- } else {
- partPerHack = ns.hackAnalyze(target);
- if (secLevel > threshSec) { norm += pphNorm; }
- partPerHack *= norm;
- }
- var partToHack = 0.4 * (skillM + hostM + 1);
- var numHack1 = Math.ceil(partToHack / (partPerHack + Number.EPSILON));
- // calculate number of grow calls
- var numGrow;
- if (bFormulas) {
- mockTarget.hackDifficulty += numHack1 * 0.002;
- mockTarget.moneyAvailable = 0.6 * moneyMax;
- numGrow = ns.formulas.hacking.growThreads(mockTarget, ns.getPlayer(), moneyMax);
- } else {
- if (moneyAvail >= threshMoney) { norm -= ppg60Norm; }
- numGrow = ns.growthAnalyze(target, norm / 0.6);
- }
- // calculate number of hack calls
- if (bFormulas) {
- mockTarget.hackDifficulty += numGrow * 0.004;
- partPerHack = ns.formulas.hacking.hackPercent(mockTarget, ns.getPlayer());
- } else {
- partPerHack = ns.hackAnalyze(target);
- if (secLevel <= threshSec) { partPerHack /= pphNorm + 1; }
- }
- var numHack2 = Math.ceil(partToHack / partPerHack);
- var neededRam = numHack1 * callRam[2] + numGrow * callRam[1] + numHack2 * callRam[2];
- ns.tprint("Estimated RAM needed for hack, grow, hack #2: "
- + ns.formatRam(neededRam, 1));
- // calculate total RAM on all servers
- var totalRam = 0;
- for (var i = 0; i < servers.length; i++) {
- totalRam += servers[i][1];
- }
- ns.tprint("Total host RAM: " + ns.formatRam(totalRam, 1));
- }
- var startTime = Date.now();
- while (true) {
- var timeWeaken = ns.getWeakenTime(target);
- var timeGrow = ns.getGrowTime(target);
- var timeHack = ns.getHackTime(target);
- // time between end of one job and the previous (ms)
- var timeDistance = timeHack / 50;
- if (timeDistance < 200) { // set to minimum
- timeDistance = 200;
- }
- var bSecHigh = secLevel > threshSec;
- var bMoneyLow = moneyAvail < threshMoney;
- if (!bFormulas) {
- pphCurrent = ns.hackAnalyze(target);
- // Get multiplier to normalize part per hack.
- if (secLevel >= secLevelMin && secLevel <= secLevelMin + 1.25) {
- pphSecLow = pphCurrent;
- } else if (secLevel > threshSec && secLevel <= threshSec + 1.5) {
- pphSecHigh = pphCurrent;
- }
- if (pphSecLow != -1 && pphSecHigh != -1) {
- pphNorm = (pphSecLow - pphSecHigh) / pphSecHigh;
- }
- // Get part per grow value(s).
- if ((0.594 < moneyAvail / moneyMax) && (moneyAvail / moneyMax < 0.606)) {
- var numGrow = ns.growthAnalyze(target, moneyMax / moneyAvail);
- var ppgTo100 = ((moneyMax - moneyAvail) / moneyMax) / numGrow;
- numGrow = ns.growthAnalyze(target, 0.85 * moneyMax / moneyAvail);
- var ppgTo85 = (0.85 - (moneyAvail / moneyMax)) / numGrow;
- if (secLevel >= secLevelMin && secLevel <= secLevelMin + 1.25) {
- ppg60to100SL = ppgTo100;
- ppg60to85SL = ppgTo85;
- } else if (secLevel > threshSec && secLevel <= threshSec + 1.5) {
- ppg60to100SH = ppgTo100;
- ppg60to85SH = ppgTo85;
- }
- } else if (moneyAvail / moneyMax > 0.994) {
- var numGrow = ns.growthAnalyze(target, 1.33 * moneyMax / moneyAvail);
- var ppgTo100 = (1.33 - (moneyAvail / moneyMax)) / numGrow;
- if (secLevel >= secLevelMin && secLevel <= secLevelMin + 1.25) {
- ppg75to100SL = ppgTo100;
- } else if (secLevel > threshSec && secLevel <= threshSec + 1.5) {
- ppg75to100SH = ppgTo100;
- }
- }
- // Get multiplier to normalize part per grow.
- if (ppg60to100SL != -1 && ppg60to100SH != -1) {
- ppg60Norm = (ppg60to100SL - ppg60to100SH) / ppg60to100SH;
- if (ppg75to100SL == -1 || ppg75to100SH == -1) { // use ppg60Norm as estimate
- ppg100Norm = ppg60Norm;
- }
- }
- if (ppg75to100SL != -1 && ppg75to100SH != -1) {
- ppg100Norm = (ppg75to100SL - ppg75to100SH) / ppg75to100SH;
- if (ppg60to100SL == -1 || ppg60to100SH == -1) { // use ppg100Norm as estimate
- ppg60Norm = ppg100Norm;
- }
- }
- // Normalize part per hack value.
- if (bSecHigh) { pphCurrent *= pphNorm + 1; }
- }
- ns.tprint(target + ": Money=" + ns.formatPercent(moneyAvail / moneyMax, 3) +
- " secMin=" + secLevelMin + " Sec=" + ns.formatNumber(secLevel, 3));
- if (bSecHigh && bMoneyLow) {
- setFreeRam(3, servers, Math.max.apply(null, callRam));
- hostM = getHostMult(servers);
- ns.tprint(target + ": weaken[, grow, weaken #2]");
- var doOptional = false, resCG = null, resCW2 = null;
- // calculate number of grow calls
- var numGrow;
- if (bFormulas) {
- var mockTarget = ns.getServer(target);
- mockTarget.hackDifficulty = secLevelMin;
- numGrow = ns.formulas.hacking.growThreads(mockTarget, ns.getPlayer(), moneyMax);
- } else {
- numGrow = Math.ceil(ns.growthAnalyze(target, moneyMax / (ppg60Norm * 0.5 + 1) / (moneyAvail + Number.EPSILON)));
- }
- // calculate number of weaken calls
- var numWeaken1 = Math.ceil((secLevel - secLevelMin) / 0.05);
- var numWeaken2 = Math.ceil((numGrow * 0.004) / 0.05);
- // calculate weaken job
- var resCW1 = calculateJob(callScript, callRam, servers, numWeaken1, 0, target);
- // Was enough free RAM found to weaken secLevel to min, and
- // is there enough free RAM to perform a second weaken?
- if ((resCW1[0] >= numWeaken1) && (resCW1[1] >= servers.length * callRam[0])) {
- // calculate weaken #2 job
- resCW2 = calculateJob(callScript, callRam, servers, numWeaken2, 0, target);
- // Were enough weaken threads calculated to balance the grow threads and
- // is there enough free RAM to perform grow?
- if ((resCW2[0] >= numWeaken2) && (resCW2[1] >= servers.length * callRam[1])) {
- doOptional = true;
- // calculate grow job
- resCG = calculateJob(callScript, callRam, servers, numGrow, 1, target);
- }
- }
- if (doOptional) {
- timeDelay = Math.ceil((resCW1[0] + resCG[0]) / 2.5);
- if (timeDistance < timeExec * servers.length + timeDelay) {
- timeDistance = timeExec * servers.length + timeDelay;
- }
- // weaken
- await performJob(ns, resCW1[2], timeExec, timeDelay);
- await ns.sleep(2 * timeDistance);
- // weaken #2
- var resPW2 = await performJob(ns, resCW2[2], timeExec, timeDelay);
- await ns.sleep(timeWeaken - timeDistance - timeGrow - (timeExec * servers.length + timeDelay));
- // grow
- await performJob(ns, resCG[2], timeExec, timeDelay);
- // wait on weaken #2
- await waitOnJob(ns, timeGrow + timeDistance, resPW2, timeExec);
- moneyAvail = ns.getServerMoneyAvailable(target);
- } else {
- timeDelay = Math.ceil(resCW1[0] / 2);
- if (timeDistance < timeExec * servers.length + timeDelay) {
- timeDistance = timeExec * servers.length + timeDelay;
- }
- // weaken
- var resPW1 = await performJob(ns, resCW1[2], timeExec, timeDelay);
- // wait on weaken
- await waitOnJob(ns, timeWeaken, resPW1, timeExec);
- }
- } else if (!bSecHigh && bMoneyLow) {
- setFreeRam(3, servers, Math.max.apply(null, callRam));
- hostM = getHostMult(servers);
- ns.tprint(target + ": grow[, hack, grow #2]");
- var doOptional = false, resCG2 = null, resCH = null;
- // calculate number of calls for first grow
- var numGrow1 = Math.ceil(ns.growthAnalyze(target, moneyMax / (moneyAvail + Number.EPSILON)));
- // calculate number of hack calls
- var partPerHack;
- if (bFormulas) {
- var mockTarget = ns.getServer(target);
- mockTarget.hackDifficulty += numGrow1 * 0.004;
- partPerHack = ns.formulas.hacking.hackPercent(mockTarget, ns.getPlayer());
- } else {
- partPerHack = pphCurrent;
- if (threshSec < secLevel + numGrow1 * 0.004) {
- partPerHack /= pphNorm + 1;
- }
- }
- var partToHack = 0.25 * (skillM + hostM * 0.6 + 1);
- var numHack = Math.ceil(partToHack / (partPerHack + Number.EPSILON));
- // calculate number of grow calls needed after hack
- var numGrow2;
- if (bFormulas) {
- var mockTarget = ns.getServer(target);
- mockTarget.moneyAvailable = 0.75 * moneyMax;
- mockTarget.hackDifficulty += numHack * 0.002 + numGrow1 * 0.004;
- numGrow2 = ns.formulas.hacking.growThreads(mockTarget, ns.getPlayer(), moneyMax);
- } else {
- var norm = pphNorm + 1;
- if (threshSec < secLevel + numHack * 0.002 + numGrow1 * 0.004) {
- if (ppg75to100SH != -1) {
- numGrow2 = Math.ceil(0.33 * norm / ppg75to100SH);
- } else {
- norm += ppg100Norm;
- if (ppg75to100SL != -1) {
- numGrow2 = Math.ceil(0.33 * norm / ppg75to100SL);
- } else {
- numGrow2 = Math.ceil(ns.growthAnalyze(target, 1.33 * moneyMax * norm / (moneyAvail + Number.EPSILON))) - numGrow1;
- }
- }
- } else {
- if (ppg75to100SL != -1) {
- numGrow2 = Math.ceil(0.33 * norm / ppg75to100SL);
- } else if (ppg75to100SH != -1) {
- norm -= ppg100Norm / 2;
- numGrow2 = Math.ceil(0.33 * norm / ppg75to100SH);
- } else {
- numGrow2 = Math.ceil(ns.growthAnalyze(target, 1.33 * moneyMax * norm / (moneyAvail + Number.EPSILON))) - numGrow1;
- }
- }
- }
- // calculate grow job
- var resCG1 = calculateJob(callScript, callRam, servers, numGrow1, 1, target);
- // Was enough free RAM found to grow money to max, and
- // is there enough free RAM to perform a second grow?
- if ((resCG1[0] >= numGrow1) && (resCG1[1] >= servers.length * callRam[1])) {
- // calculate grow #2 job
- resCG2 = calculateJob(callScript, callRam, servers, numGrow2, 1, target);
- // Was enough free RAM found to grow money back to max after hack, and
- // is there enough free RAM to perform hack?
- if ((resCG2[0] >= numGrow2) && (resCG2[1] >= servers.length * callRam[2])) {
- // calculate hack job
- resCH = calculateJob(callScript, callRam, servers, numHack, 2, target);
- // Is there enough free RAM to hack money to 75% of max?
- if (resCH[0] >= numHack) {
- doOptional = true;
- }
- }
- }
- timeDelay = Math.ceil(resCG1[0] / 2);
- if (timeDistance < timeExec * servers.length + timeDelay) {
- timeDistance = timeExec * servers.length + timeDelay;
- }
- if (doOptional) {
- // grow
- var resPG1 = await performJob(ns, resCG1[2], timeExec, timeDelay);
- await ns.sleep(2 * timeDistance);
- // grow #2
- var resPG2 = await performJob(ns, resCG2[2], timeExec, timeDelay);
- await ns.sleep(timeGrow - timeDistance - timeHack - (timeExec * servers.length + timeDelay));
- // hack
- var resPH = await performJob(ns, resCH[2], timeExec, timeDelay);
- // wait on grow
- await waitOnJob(ns, timeHack - timeDistance, resPG1, timeExec);
- var prevMoneyAvail = ns.getServerMoneyAvailable(target);
- monitorMoney(ns, moneyMax, prevMoneyAvail, target);
- // wait on hack
- await waitOnJob(ns, timeDistance, resPH, timeExec);
- // calculate income
- moneyAvail = ns.getServerMoneyAvailable(target);
- totalIncome += prevMoneyAvail - moneyAvail;
- printTotalIncome(ns, totalIncome, startTime, target);
- monitorMoney(ns, moneyMax, moneyAvail, target);
- // wait on grow #2
- await waitOnJob(ns, timeDistance, resPG2, timeExec);
- } else {
- // grow
- var resPG1 = await performJob(ns, resCG1[2], timeExec, timeDelay);
- // wait on grow
- await waitOnJob(ns, timeGrow, resPG1, timeExec);
- }
- moneyAvail = ns.getServerMoneyAvailable(target);
- } else if (bSecHigh && !bMoneyLow) {
- // If not using formulas, run [hack, ]weaken until a value for ppg60to100SL has been
- // obtained, then run [hack, [grow, ]]weaken.
- if (bFormulas || ppg60to100SL != -1) {
- setFreeRam(3, servers, Math.max.apply(null, callRam));
- ns.tprint(target + ": [hack, [grow, ]]weaken");
- } else {
- setFreeRam(2, servers, Math.max.apply(null, callRam));
- ns.tprint(target + ": [hack, ]weaken");
- }
- hostM = getHostMult(servers);
- var doOptionalH = false, doOptionalG = false, resCH = null, resCG = null;
- var prevMoneyAvail = moneyAvail;
- // calculate number of hack calls
- var partToHack = ((moneyAvail / moneyMax) - 0.6) * (skillM + hostM + pphNorm * 0.5 + 1);
- var partPerHack;
- if (bFormulas) {
- partPerHack = ns.formulas.hacking.hackPercent(ns.getServer(target), ns.getPlayer());
- } else {
- partPerHack = pphCurrent / (pphNorm + 1);
- }
- var numHack = Math.ceil(partToHack / partPerHack);
- // calculate number of weaken calls
- var numWeaken = Math.ceil((secLevel - secLevelMin + (numHack * 0.002)) / 0.05);
- // calculate weaken job
- var resCW = calculateJob(callScript, callRam, servers, numWeaken, 0, target);
- // is there enough free RAM to run hack?
- if (resCW[1] >= servers.length * callRam[2]) {
- doOptionalH = true;
- // calculate hack job
- resCH = calculateJob(callScript, callRam, servers, numHack, 2, target);
- // Is it time to [grow], and was enough free RAM found to hack money to 60%, and
- // is there enough free RAM to perform grow?
- if ((bFormulas || ppg60to100SL != -1) && (resCH[0] >= numHack)
- && (resCH[1] >= servers.length * callRam[1])) {
- // calculate number of grow calls
- var numGrow;
- if (bFormulas) {
- var mockTarget = ns.getServer(target);
- mockTarget.moneyAvailable = 0.6 * moneyMax;
- mockTarget.hackDifficulty += numHack * 0.002;
- numGrow = ns.formulas.hacking.growThreads(mockTarget, ns.getPlayer(), 0.85 * moneyMax);
- } else {
- if (ppg60to85SH != -1) {
- numGrow = Math.ceil(0.25 / ppg60to85SH);
- } else if (ppg60to85SL != -1) {
- numGrow = Math.ceil(0.25 * (ppg60Norm + 1) / ppg60to85SL);
- } else {
- numGrow = Math.ceil(ns.growthAnalyze(target, 0.85 / 0.6));
- }
- }
- // calculate grow job
- resCG = calculateJob(callScript, callRam, servers, numGrow, 1, target);
- // Was enough free RAM found to grow money from 60% to 85%, and
- // is there enough free RAM to perform weaken?
- if ((resCG[0] >= numGrow) && (resCG[1] >= servers.length * callRam[0])) {
- // calculate number of additional weaken calls
- var numWeaken2 = Math.ceil((numGrow * 0.004) / 0.05);
- // calculate additional weaken
- var resCW2 = calculateJob(callScript, callRam, servers, numWeaken2, 0, target);
- // Were enough weaken threads calculated to balance the grow threads?
- if (resCW2[0] >= numWeaken2) {
- doOptionalG = true;
- // add additonal weaken threads
- for (var i = 0; i < resCW[2].length; i++) {
- resCW[2][i][2] += resCW2[2][i][2];
- }
- }
- }
- }
- }
- if (doOptionalG && doOptionalH) {
- timeDelay = Math.ceil((resCG[0] + resCH[0]) / 4);
- if (timeDistance < timeExec * servers.length + timeDelay) {
- timeDistance = timeExec * servers.length + timeDelay;
- }
- // weaken
- var resPW = await performJob(ns, resCW[2], timeExec, timeDelay);
- await ns.sleep(timeWeaken - timeDistance - timeGrow - (timeExec * servers.length + timeDelay));
- // grow
- await performJob(ns, resCG[2], timeExec, timeDelay);
- await ns.sleep(timeGrow - timeDistance - timeHack - (timeExec * servers.length + timeDelay));
- // hack
- var resPH = await performJob(ns, resCH[2], timeExec, timeDelay);
- // wait on hack
- await waitOnJob(ns, timeHack, resPH, timeExec);
- // calculate income
- moneyAvail = ns.getServerMoneyAvailable(target);
- totalIncome += prevMoneyAvail - moneyAvail;
- printTotalIncome(ns, totalIncome, startTime, target);
- monitorMoney(ns, moneyMax, moneyAvail, target);
- // wait on weaken
- await waitOnJob(ns, 2 * timeDistance, resPW, timeExec);
- moneyAvail = ns.getServerMoneyAvailable(target);
- } else if (doOptionalH) {
- timeDelay = Math.ceil(resCH[0] / 2);
- if (timeDistance < timeExec * servers.length + timeDelay) {
- timeDistance = timeExec * servers.length + timeDelay;
- }
- // weaken
- var resPW = await performJob(ns, resCW[2], timeExec, timeDelay);
- await ns.sleep(timeWeaken - timeDistance - timeHack - (timeExec * servers.length + timeDelay));
- // hack
- await performJob(ns, resCH[2], timeExec, timeDelay);
- // wait on weaken
- await waitOnJob(ns, timeHack + timeDistance, resPW, timeExec);
- // calculate income
- moneyAvail = ns.getServerMoneyAvailable(target);
- totalIncome += prevMoneyAvail - moneyAvail;
- printTotalIncome(ns, totalIncome, startTime, target);
- } else {
- timeDelay = Math.ceil(resCW[0] / 2);
- if (timeDistance < timeExec * servers.length + timeDelay) {
- timeDistance = timeExec * servers.length + timeDelay;
- }
- // weaken
- var resPW = await performJob(ns, resCW[2], timeExec, timeDelay);
- // wait on weaken
- await waitOnJob(ns, timeWeaken, resPW, timeExec);
- }
- } else {
- setFreeRam(3, servers, Math.max.apply(null, callRam));
- hostM = getHostMult(servers);
- ns.tprint(target + ": hack[, grow, hack #2]");
- var doOptional = false;
- var resCG = null, resCH2 = null;
- var prevMoneyAvail = moneyAvail;
- // calculate number of hack calls
- var partToHack = ((moneyAvail / moneyMax) - 0.6) * (skillM + hostM + 1);
- var partPerHack;
- if (bFormulas) {
- partPerHack = ns.formulas.hacking.hackPercent(ns.getServer(target), ns.getPlayer());
- } else {
- partPerHack = pphCurrent;
- }
- var numHack1 = Math.ceil(partToHack / partPerHack);
- // calculate hack job
- var resCH = calculateJob(callScript, callRam, servers, numHack1, 2, target);
- // Was enough free RAM found to hack money to 60%, and
- // is there enough free RAM to perform grow?
- if ((resCH[0] >= numHack1) && (resCH[1] >= servers.length * callRam[1])) {
- // calculate number of grow calls
- var numGrow;
- if (bFormulas) {
- var mockTarget = ns.getServer(target);
- mockTarget.moneyAvailable = 0.6 * moneyMax;
- mockTarget.hackDifficulty += numHack1 * 0.002;
- numGrow = ns.formulas.hacking.growThreads(mockTarget, ns.getPlayer(), moneyMax);
- } else {
- var norm = pphNorm + 1;
- if (threshSec < secLevel + numHack1 * 0.002) {
- if (ppg60to100SH != -1) {
- numGrow = Math.ceil(0.4 * norm / ppg60to100SH);
- } else {
- norm += ppg60Norm;
- if (ppg60to100SL != -1) {
- numGrow = Math.ceil(0.4 * norm / ppg60to100SL);
- } else {
- numGrow = Math.ceil(ns.growthAnalyze(target, norm / 0.6));
- }
- }
- } else {
- if (ppg60to100SL != -1) {
- numGrow = Math.ceil(0.4 * norm / ppg60to100SL);
- } else if (ppg60to100SH != -1) {
- norm -= ppg60Norm;
- numGrow = Math.ceil(0.4 * norm / ppg60to100SH);
- } else {
- numGrow = Math.ceil(ns.growthAnalyze(target, norm / 0.6));
- }
- }
- }
- // calculate grow job
- resCG = calculateJob(callScript, callRam, servers, numGrow, 1, target);
- // Was enough free RAM found to grow money back to max after hack, and
- // is there enough free RAM to perform a second hack?
- if ((resCG[0] >= numGrow) && (resCG[1] >= servers.length * callRam[2])) {
- // calculate number of hack calls
- partToHack = 0.4 * (skillM + hostM + 1);
- if (bFormulas) {
- var mockTarget = ns.getServer(target);
- mockTarget.hackDifficulty += numHack1 * 0.002 + numGrow * 0.004;
- partPerHack = ns.formulas.hacking.hackPercent(mockTarget, ns.getPlayer());
- } else {
- var norm = pphNorm * 0.5 + 1;
- if (threshSec < secLevel + numHack1 * 0.002 + numGrow * 0.004) {
- norm += pphNorm * 0.5;
- }
- partPerHack /= norm;
- }
- var numHack2 = Math.ceil(partToHack / partPerHack);
- // calculate second hack job
- resCH2 = calculateJob(callScript, callRam, servers, numHack2, 2, target);
- if (resCH2[0] >= numHack2) {
- doOptional = true;
- }
- }
- }
- if (doOptional) {
- timeDelay = Math.ceil((resCH[0] + resCG[0]) / 2.5);
- if (timeDistance < timeExec * servers.length + timeDelay) {
- timeDistance = timeExec * servers.length + timeDelay;
- }
- // grow
- var resPG = await performJob(ns, resCG[2], timeExec, timeDelay);
- await ns.sleep(timeGrow - timeHack - timeDistance - (timeExec * servers.length + timeDelay));
- // hack
- var resPH = await performJob(ns, resCH[2], timeExec, timeDelay);
- await ns.sleep(2 * timeDistance);
- // hack #2
- var resPH2 = await performJob(ns, resCH2[2], timeExec, timeDelay);
- // wait on hack
- await waitOnJob(ns, timeHack - 2 * timeDistance - (timeExec * servers.length + timeDelay), resPH, timeExec);
- moneyAvail = ns.getServerMoneyAvailable(target);
- totalIncome += prevMoneyAvail - moneyAvail;
- monitorMoney(ns, moneyMax, moneyAvail, target);
- // wait on grow
- await waitOnJob(ns, timeDistance, resPG, timeExec);
- moneyAvail = ns.getServerMoneyAvailable(target);
- monitorMoney(ns, moneyMax, moneyAvail, target);
- prevMoneyAvail = moneyAvail;
- // wait on hack #2
- await waitOnJob(ns, timeDistance, resPH2, timeExec);
- moneyAvail = ns.getServerMoneyAvailable(target);
- // adjust hacking skill multiplier, if needed
- if (moneyAvail / moneyMax < 0.595) {
- skillM -= 0.004;
- } else if (moneyAvail / moneyMax > 0.605) {
- skillM += 0.004;
- }
- } else {
- timeDelay = Math.ceil(resCH[0] / 2);
- if (timeDistance < timeExec * servers.length + timeDelay) {
- timeDistance = timeExec * servers.length + timeDelay;
- }
- // hack
- var resPH = await performJob(ns, resCH[2], timeExec, timeDelay);
- // wait on hack
- await waitOnJob(ns, timeHack, resPH, timeExec);
- moneyAvail = ns.getServerMoneyAvailable(target);
- // Was money at max, and was enough free RAM found to hack money to 60%?
- if ((resCH[0] >= numHack1) && (prevMoneyAvail / moneyMax > 0.997)) {
- // adjust hacking skill multiplier, if needed
- if (moneyAvail / moneyMax < 0.595) {
- skillM -= 0.004;
- } else if (moneyAvail / moneyMax > 0.605) {
- skillM += 0.004;
- }
- }
- }
- // calculate income
- totalIncome += prevMoneyAvail - moneyAvail;
- printTotalIncome(ns, totalIncome, startTime, target);
- }
- secLevel = ns.getServerSecurityLevel(target);
- }
- }
Advertisement
Comments
-
- Bug fixed in 1.1:
- - If only running hack job, skillM is adjusted even if money was not max or free RAM was not found to hack money to 60%.
Add Comment
Please, Sign In to add comment
Advertisement