Merge branch 'main' of https://gitea.goetje-ing.de/ArchitectsOfTheBitburner/The_Bitburner_Scripts
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
import { getCracks, scanServerList, findBestTarget, crackingAndRooting, copyAndRunScript } from "/RamsesUtils.js";
|
import { getCracks, scanServerList, findBestTarget, crackingAndRooting, copyAndRunScript } from "/Library.js";
|
||||||
/** @param {NS} ns */
|
/** @param {NS} ns */
|
||||||
export async function main(ns) {
|
export async function main(ns) {
|
||||||
let cracks = {};
|
let cracks = {};
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { getGrowThreads } from "myLibrary.js";
|
import { getGrowThreads } from "Library.js";
|
||||||
|
|
||||||
/** @param {NS} ns */
|
/** @param {NS} ns */
|
||||||
export async function main(ns) {
|
export async function main(ns) {
|
||||||
|
|||||||
@@ -3,6 +3,12 @@ export async function main(ns) {
|
|||||||
ns.tprint("This is just a function library, it doesn't do anything.");
|
ns.tprint("This is just a function library, it doesn't do anything.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Custom color coding.
|
||||||
|
const cCyan = "\u001b[36m";
|
||||||
|
const cGreen = "\u001b[32m";
|
||||||
|
const cRed = "\u001b[31m";
|
||||||
|
const cReset = "\u001b[0m";
|
||||||
|
|
||||||
/** @param {NS} ns */
|
/** @param {NS} ns */
|
||||||
export function getCracks(ns) {
|
export function getCracks(ns) {
|
||||||
let cracks = {};
|
let cracks = {};
|
||||||
@@ -29,6 +35,7 @@ export function scanServerList(ns) {
|
|||||||
const home = "home";
|
const home = "home";
|
||||||
let serverList = {};
|
let serverList = {};
|
||||||
let unscanned = [];
|
let unscanned = [];
|
||||||
|
|
||||||
unscanned.push(home);
|
unscanned.push(home);
|
||||||
while (unscanned.length > 0) {
|
while (unscanned.length > 0) {
|
||||||
let currentServer = unscanned.pop();
|
let currentServer = unscanned.pop();
|
||||||
@@ -40,8 +47,10 @@ export function scanServerList(ns) {
|
|||||||
let rootAccess = ns.hasRootAccess(currentServer);
|
let rootAccess = ns.hasRootAccess(currentServer);
|
||||||
let serverMoney = ns.getServerMaxMoney(currentServer);
|
let serverMoney = ns.getServerMaxMoney(currentServer);
|
||||||
let serverFiles = ns.ls(currentServer);
|
let serverFiles = ns.ls(currentServer);
|
||||||
let skillFactor = (2.5 * minHackLevel * minSecLevel + 500) / (ns.getHackingLevel() + 50);
|
let serverStats = ns.getServer(currentServer);
|
||||||
let compareTimeFactor = serverMoney / skillFactor / 10e7;
|
let serverOrgs = serverStats.organizationName;
|
||||||
|
let serverCores = serverStats.cpuCores;
|
||||||
|
|
||||||
serverList[currentServer] =
|
serverList[currentServer] =
|
||||||
{
|
{
|
||||||
serverName: currentServer,
|
serverName: currentServer,
|
||||||
@@ -51,8 +60,9 @@ export function scanServerList(ns) {
|
|||||||
minPorts: minPorts,
|
minPorts: minPorts,
|
||||||
minHackLvl: minHackLevel,
|
minHackLvl: minHackLevel,
|
||||||
rootAccess: rootAccess,
|
rootAccess: rootAccess,
|
||||||
factorMoneyPerTime: compareTimeFactor,
|
|
||||||
openPorts: 0,
|
openPorts: 0,
|
||||||
|
serverOrgs: serverOrgs,
|
||||||
|
serverCores: serverCores,
|
||||||
serverFiles: serverFiles,
|
serverFiles: serverFiles,
|
||||||
};
|
};
|
||||||
let neighbours = ns.scan(currentServer);
|
let neighbours = ns.scan(currentServer);
|
||||||
@@ -72,25 +82,29 @@ export function scanServerList(ns) {
|
|||||||
export function findBestTarget(ns, maxSec, maxPorts, currentHackLevel, manualTargetOverride) {
|
export function findBestTarget(ns, maxSec, maxPorts, currentHackLevel, manualTargetOverride) {
|
||||||
if (!ns.fileExists("serverList.txt", "home")) scanServerList();
|
if (!ns.fileExists("serverList.txt", "home")) scanServerList();
|
||||||
let serverList = JSON.parse(ns.read("serverList.txt"));
|
let serverList = JSON.parse(ns.read("serverList.txt"));
|
||||||
let bestEntry = null;
|
let bestEntry = "";
|
||||||
let compareTime = 0;
|
if (manualTargetOverride.length > 0) {
|
||||||
|
bestEntry = manualTargetOverride;
|
||||||
|
} else {
|
||||||
|
bestEntry = null;
|
||||||
|
let nMaxMoneyPerChance = 0;
|
||||||
|
let nBestMoneyPerChance = 0;
|
||||||
for (const [name, entry] of Object.entries(serverList)) {
|
for (const [name, entry] of Object.entries(serverList)) {
|
||||||
if (entry.minSec <= maxSec && entry.minPorts <= maxPorts && entry.minHackLvl < currentHackLevel) {
|
if (entry.minSec <= maxSec && entry.minPorts <= maxPorts && entry.minHackLvl < currentHackLevel) {
|
||||||
if (entry.factorMoneyPerTime > compareTime) {
|
nMaxMoneyPerChance = (entry.maxMoney * ns.hackAnalyzeChance(name)) / entry.minSec;
|
||||||
compareTime = entry.factorMoneyPerTime;
|
if (nMaxMoneyPerChance > nBestMoneyPerChance) {
|
||||||
|
nBestMoneyPerChance = nMaxMoneyPerChance;
|
||||||
bestEntry = name;
|
bestEntry = name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (manualTargetOverride.length > 0) {
|
|
||||||
bestEntry = manualTargetOverride;
|
|
||||||
}
|
}
|
||||||
ns.write("bestTarget.txt", JSON.stringify(serverList[bestEntry]), "w");
|
ns.write("bestTarget.txt", JSON.stringify(serverList[bestEntry]), "w");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** @param {NS} ns */
|
/** @param {NS} ns */
|
||||||
export function crackingAndRooting(ns, cracks, funnyScript, copy) {
|
export function crackingAndRooting(ns, cracks) {
|
||||||
if (!ns.fileExists("serverList.txt", "home")) scanServerList();
|
if (!ns.fileExists("serverList.txt", "home")) scanServerList();
|
||||||
let serverList = JSON.parse(ns.read("serverList.txt"));
|
let serverList = JSON.parse(ns.read("serverList.txt"));
|
||||||
for (const [name, entry] of Object.entries(serverList)) {
|
for (const [name, entry] of Object.entries(serverList)) {
|
||||||
@@ -107,9 +121,6 @@ export function crackingAndRooting(ns, cracks, funnyScript, copy) {
|
|||||||
ns.nuke(name);
|
ns.nuke(name);
|
||||||
if (ns.hasRootAccess(name)) {
|
if (ns.hasRootAccess(name)) {
|
||||||
serverList[name].rootAccess = true;
|
serverList[name].rootAccess = true;
|
||||||
if (serverList[name].maxRam > 0 && copy === true) {
|
|
||||||
copyAndRunScript(ns, funnyScript, name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ns.write("serverList.txt", JSON.stringify(serverList), "w");
|
ns.write("serverList.txt", JSON.stringify(serverList), "w");
|
||||||
@@ -120,10 +131,7 @@ export function crackingAndRooting(ns, cracks, funnyScript, copy) {
|
|||||||
|
|
||||||
/** @param {NS} ns */
|
/** @param {NS} ns */
|
||||||
export function copyAndRunScript(ns, funnyScript, currentServer) {
|
export function copyAndRunScript(ns, funnyScript, currentServer) {
|
||||||
// change to run for one specific server with bestTarget from file
|
|
||||||
//let minRam = ns.getScriptRam(funnyScript);
|
|
||||||
let bestTarget = JSON.parse(ns.read("bestTarget.txt"));
|
let bestTarget = JSON.parse(ns.read("bestTarget.txt"));
|
||||||
|
|
||||||
let name = currentServer;
|
let name = currentServer;
|
||||||
let serverList = JSON.parse(ns.read("serverList.txt"));
|
let serverList = JSON.parse(ns.read("serverList.txt"));
|
||||||
ns.print(name);
|
ns.print(name);
|
||||||
@@ -133,7 +141,6 @@ export function copyAndRunScript(ns, funnyScript, currentServer) {
|
|||||||
} else {
|
} else {
|
||||||
ns.print("killed threads on: " + name + ns.scriptKill(funnyScript[0], name));
|
ns.print("killed threads on: " + name + ns.scriptKill(funnyScript[0], name));
|
||||||
};
|
};
|
||||||
//move script and run
|
|
||||||
if (serverList[name].maxRam > 0) {
|
if (serverList[name].maxRam > 0) {
|
||||||
ns.scp(funnyScript, name, "home");
|
ns.scp(funnyScript, name, "home");
|
||||||
let maxProcesses = 1;
|
let maxProcesses = 1;
|
||||||
@@ -142,30 +149,9 @@ export function copyAndRunScript(ns, funnyScript, currentServer) {
|
|||||||
} else {
|
} else {
|
||||||
maxProcesses = 1
|
maxProcesses = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
for (let n = 1; n <= maxProcesses; n++) {
|
for (let n = 1; n <= maxProcesses; n++) {
|
||||||
ns.exec(funnyScript[0], name, 1, bestTarget.serverName);
|
ns.exec(funnyScript[0], name, 1, bestTarget.serverName);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*let maxThreads = 0;
|
|
||||||
if (name === "home") {
|
|
||||||
maxThreads = Math.floor((serverList[name].maxRam - ns.getServerUsedRam(name) - 32) / minRam);
|
|
||||||
ns.print(name + " " + maxThreads);
|
|
||||||
} else {
|
|
||||||
ns.print(name);
|
|
||||||
maxThreads = Math.floor(serverList[name].maxRam / minRam);
|
|
||||||
ns.print(name + " " + maxThreads);
|
|
||||||
};
|
|
||||||
while (maxThreads > 0) {
|
|
||||||
let threadsToAssign = maxThreads < 500 ? maxThreads : 500;
|
|
||||||
if (ns.exec(funnyScript, name, threadsToAssign, bestTarget.serverName, serverList[bestTarget.serverName].minSec, serverList[bestTarget.serverName].maxMoney, JSON.stringify(serverList[bestTarget.serverName])) !== 0) {
|
|
||||||
ns.print("Executing script on: " + name + " with: " + threadsToAssign + " threads out of " + maxThreads + " total threads");
|
|
||||||
maxThreads = maxThreads - threadsToAssign;
|
|
||||||
} else {
|
|
||||||
ns.tprint("Error running script on: " + name);
|
|
||||||
maxThreads = -1;
|
|
||||||
};
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -185,8 +171,13 @@ export async function purchaseAndUpgradeServers(ns) {
|
|||||||
currentMoney = ns.getServerMoneyAvailable("home");
|
currentMoney = ns.getServerMoneyAvailable("home");
|
||||||
let targetRamInitial = 16;
|
let targetRamInitial = 16;
|
||||||
if (ns.getPurchasedServerCost(targetRamInitial) < currentMoney) {
|
if (ns.getPurchasedServerCost(targetRamInitial) < currentMoney) {
|
||||||
let hostname = ns.purchaseServer("pserv-" + purchasedServers.length, 16);
|
let sFrontZero = "0";
|
||||||
|
if (nServers >= 9) {
|
||||||
|
sFrontZero = "";
|
||||||
|
}
|
||||||
|
let hostname = ns.purchaseServer("pserv-" + sFrontZero + (aServers.length), targetRamInitial);
|
||||||
|
ns.tprint("Purchased " + cCyan + hostname + cReset);
|
||||||
|
ns.toast("Purchased " + hostname, "info", 10000);
|
||||||
count = listPurchasedServers(ns).length;
|
count = listPurchasedServers(ns).length;
|
||||||
serverList = JSON.parse(ns.read("serverList.txt"));
|
serverList = JSON.parse(ns.read("serverList.txt"));
|
||||||
serverList[hostname] = {
|
serverList[hostname] = {
|
||||||
@@ -197,7 +188,6 @@ export async function purchaseAndUpgradeServers(ns) {
|
|||||||
minPorts: 5,
|
minPorts: 5,
|
||||||
minHackLvl: 1,
|
minHackLvl: 1,
|
||||||
rootAccess: true,
|
rootAccess: true,
|
||||||
factorMoneyPerTime: 99999999,
|
|
||||||
openPorts: 0,
|
openPorts: 0,
|
||||||
};
|
};
|
||||||
ns.write("serverList.txt", JSON.stringify(serverList), "w");
|
ns.write("serverList.txt", JSON.stringify(serverList), "w");
|
||||||
@@ -206,20 +196,20 @@ export async function purchaseAndUpgradeServers(ns) {
|
|||||||
await ns.sleep(5000);
|
await ns.sleep(5000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let i = 5;
|
let i = 5;
|
||||||
while (i < 21) {
|
while (i < 21) {
|
||||||
let targetRam = 2 ** i;
|
let targetRam = 2 ** i;
|
||||||
purchasedServers = listPurchasedServers(ns);
|
purchasedServers = listPurchasedServers(ns);
|
||||||
for (let currentServer of purchasedServers) {
|
for (let currentServer of purchasedServers) {
|
||||||
currentMoney = ns.getServerMoneyAvailable("home");
|
currentMoney = ns.getServerMoneyAvailable("home");
|
||||||
|
|
||||||
if (ns.getServerMaxRam(currentServer) < targetRam && ns.getPurchasedServerUpgradeCost(currentServer, targetRam) < currentMoney) {
|
if (ns.getServerMaxRam(currentServer) < targetRam && ns.getPurchasedServerUpgradeCost(currentServer, targetRam) < currentMoney) {
|
||||||
if (ns.upgradePurchasedServer(currentServer, targetRam)) {
|
if (ns.upgradePurchasedServer(currentServer, targetRam)) {
|
||||||
ns.print(currentServer + " upgraded to " + targetRam + " GB RAM");
|
ns.print(currentServer + " upgraded to " + targetRam + " GB RAM");
|
||||||
serverList = JSON.parse(ns.read("serverList.txt"));
|
serverList = JSON.parse(ns.read("serverList.txt"));
|
||||||
serverList[currentServer].maxRam = targetRam;
|
serverList[currentServer].maxRam = targetRam;
|
||||||
ns.write("serverList.txt", JSON.stringify(serverList), "w");
|
ns.write("serverList.txt", JSON.stringify(serverList), "w");
|
||||||
|
ns.tprint(cCyan + "Server: " + currentServer + " upgraded to: " + targetRam.toLocaleString() + " GB" + cReset);
|
||||||
|
ns.toast("Server: " + currentServer + " upgraded to: " + targetRam.toLocaleString() + " GB", "info", 10000);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
await ns.sleep(5000);
|
await ns.sleep(5000);
|
||||||
@@ -237,42 +227,17 @@ function listPurchasedServers(ns) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** @param {NS} ns */
|
/** @param {NS} ns */
|
||||||
export async function runControllerOnPserv(ns) {
|
export function getSetting(ns, sSetting) {
|
||||||
let purchasedServers = listPurchasedServers(ns);
|
let oSettings = JSON.parse(ns.read("settings.txt"));
|
||||||
let nPID = 0;
|
let settingEntry = oSettings.setting[sSetting];
|
||||||
nPID = ns.exec("S2controller.js", "home");
|
//ns.tprint(oSettings.setting[sSetting])
|
||||||
ns.tprint("Started S2controller.js on " + "home" + " with PID " + nPID)
|
//ns.tprint("settingEntry = "+settingEntry);
|
||||||
for (let currentServer of purchasedServers) {
|
return settingEntry;
|
||||||
ns.scp(["S2tGrow.js", "S2tWeaken.js", "S2tHack.js", "S2controller.js", "S2utils.js"], currentServer, "home");
|
|
||||||
nPID = ns.exec("S2controller.js", currentServer);
|
|
||||||
if (nPID > 0) {
|
|
||||||
ns.tprint("Started S2controller.js on " + currentServer + " with PID " + nPID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param {NS} ns */
|
/** @param {NS} ns */
|
||||||
export async function backdoor(ns) {
|
export function getGrowThreads(ns, sTarget, nHackThreads, nCores) {
|
||||||
let serverList = JSON.parse(ns.read("serverList.txt"));
|
let nHackAmountPercent = ns.hackAnalyze(sTarget) * nHackThreads;
|
||||||
let lasthackingLevel = 0;
|
let nGrowthThreads = ns.growthAnalyze(sTarget, 1 + nHackAmountPercent, nCores);
|
||||||
let currentHackingLevel = 0;
|
return nGrowthThreads;
|
||||||
while (true) {
|
|
||||||
currentHackingLevel = ns.getHackingLevel();
|
|
||||||
if (currentHackingLevel > lasthackingLevel) {
|
|
||||||
lasthackingLevel = currentHackingLevel;
|
|
||||||
for (const [name, entry] of Object.entries(serverList)) {
|
|
||||||
if (entry.minHackLvl <= lasthackingLevel && entry.hasBackdoor !== true) {
|
|
||||||
ns.singularity.connect(name);
|
|
||||||
await ns.singularity.installBackdoor();
|
|
||||||
ns.singularity.connect("home");
|
|
||||||
serverList[name].hasBackdoor = true;
|
|
||||||
ns.tprint("Backdoor on: " + name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ns.write("serverList.txt", JSON.stringify(serverList), "w");
|
|
||||||
} else {
|
|
||||||
await ns.sleep(30000)
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,7 @@
|
|||||||
import { getCracks, scanServerList, findBestTarget, crackingAndRooting, copyAndRunScript, purchaseAndUpgradeServers } from "/RamsesUtils.js";
|
import { getCracks, scanServerList, findBestTarget, crackingAndRooting } from "/Library.js";
|
||||||
|
|
||||||
/** @param {NS} ns */
|
/** @param {NS} ns */
|
||||||
export async function main(ns) {
|
export async function main(ns) {
|
||||||
const funnyScript = ["batch.js", "Ramses-grow.js", "Ramses-weaken.js", "Ramses-hack.js"];
|
|
||||||
//write function to purchase scripts from tor network and rerun getCracks() then recrack and reroot
|
|
||||||
let cracks = {};
|
let cracks = {};
|
||||||
cracks = getCracks(ns);
|
cracks = getCracks(ns);
|
||||||
let maxPorts = Object.keys(cracks).length;
|
let maxPorts = Object.keys(cracks).length;
|
||||||
@@ -12,31 +10,10 @@ export async function main(ns) {
|
|||||||
if (ns.getHackingLevel() < 200) {
|
if (ns.getHackingLevel() < 200) {
|
||||||
manualTargetOverride = "n00dles";
|
manualTargetOverride = "n00dles";
|
||||||
};
|
};
|
||||||
|
|
||||||
findBestTarget(ns, 999, maxPorts, ns.getHackingLevel(), manualTargetOverride);
|
findBestTarget(ns, 999, maxPorts, ns.getHackingLevel(), manualTargetOverride);
|
||||||
let bestTarget = ns.read("bestTarget.txt")
|
let bestTarget = ns.read("bestTarget.txt")
|
||||||
|
|
||||||
ns.tprint("Best Target: " + bestTarget);
|
ns.tprint("Best Target: " + bestTarget);
|
||||||
ns.tprint(Object.keys(JSON.parse(ns.read("serverList.txt"))).length);
|
ns.tprint(Object.keys(JSON.parse(ns.read("serverList.txt"))).length);
|
||||||
crackingAndRooting(ns, cracks, funnyScript, true);
|
crackingAndRooting(ns, cracks);
|
||||||
ns.exec(funnyScript[0], "home", 1, JSON.parse(bestTarget).serverName, 500, true);
|
|
||||||
let reset = ns.args[0];
|
|
||||||
ns.print(reset);
|
|
||||||
if (reset === true) {
|
|
||||||
ns.tprint("reset === true")
|
|
||||||
findBestTarget(ns, 999, maxPorts, ns.getHackingLevel(), manualTargetOverride);
|
|
||||||
let serverList = JSON.parse(ns.read("serverList.txt"));
|
|
||||||
for (const [name, entry] of Object.entries(serverList)) {
|
|
||||||
|
|
||||||
copyAndRunScript(ns, funnyScript, name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*let serverListForFiles = JSON.parse(ns.read("serverList.txt"));
|
|
||||||
for (const [name2, entry2] of Object.entries(serverListForFiles)) {
|
|
||||||
ns.tprint(name2 + " Files: " + entry2.serverFiles)
|
|
||||||
}*/
|
|
||||||
//await ns.sleep(500000);
|
|
||||||
await purchaseAndUpgradeServers(ns);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { getGrowThreads } from "myLibrary.js";
|
import { getGrowThreads } from "Library.js";
|
||||||
|
|
||||||
/** @param {NS} ns */
|
/** @param {NS} ns */
|
||||||
export async function main(ns) {
|
export async function main(ns) {
|
||||||
|
|||||||
1
Ramses/home/bestTarget.txt
Normal file
1
Ramses/home/bestTarget.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"serverName":"omega-net","maxRam":32,"maxMoney":69174578,"minSec":10,"minPorts":2,"minHackLvl":202,"rootAccess":true,"openPorts":0,"serverOrgs":"Omega Software","serverCores":3,"serverFiles":["S2tGrow.js","S2tHack.js","S2tWeaken.js","S4tGrow.js","S4tHack.js","S4tWeaken.js","contract-909879.cct","the-new-god.lit"]}
|
||||||
6
Ramses/home/factionboost.js
Normal file
6
Ramses/home/factionboost.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/** @param {NS} ns */
|
||||||
|
export async function main(ns) {
|
||||||
|
while (true) {
|
||||||
|
await ns.share();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
// Custom color coding.
|
|
||||||
const cCyan = "\u001b[36m";
|
|
||||||
const cGreen = "\u001b[32m";
|
|
||||||
const cRed = "\u001b[31m";
|
|
||||||
const cReset = "\u001b[0m";
|
|
||||||
|
|
||||||
/** @param {NS} ns */
|
|
||||||
export async function main(ns) {
|
|
||||||
ns.print("This script does nothing on its own, it contains functions for other scripts to use");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @param {NS} ns */
|
|
||||||
export async function purchaseServers(ns) {
|
|
||||||
|
|
||||||
const ram = 64;
|
|
||||||
|
|
||||||
let aServers = listPurchasedServers(ns);
|
|
||||||
let nServers = aServers.length;
|
|
||||||
if (nServers >= ns.getPurchasedServerLimit()) {
|
|
||||||
return nServers;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ns.getServerMoneyAvailable("home") > ns.getPurchasedServerCost(ram)) {
|
|
||||||
let sFrontZero = "0";
|
|
||||||
if (nServers >= 9) {
|
|
||||||
sFrontZero = "";
|
|
||||||
}
|
|
||||||
let hostname = ns.purchaseServer("pserv-" + sFrontZero + (aServers.length + 1), ram);
|
|
||||||
|
|
||||||
ns.tprint("Purchased " + cCyan + hostname + cReset);
|
|
||||||
ns.toast("Purchased " + hostname, "info", 10000);
|
|
||||||
}
|
|
||||||
|
|
||||||
aServers = listPurchasedServers(ns);
|
|
||||||
return aServers.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @param {NS} ns */
|
|
||||||
export function listPurchasedServers(ns) {
|
|
||||||
return ns.getPurchasedServers();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @param {NS} ns */
|
|
||||||
export function getSetting(ns, sSetting) {
|
|
||||||
let oSettings = JSON.parse(ns.read("settings.txt"));
|
|
||||||
let settingEntry = oSettings.setting[sSetting];
|
|
||||||
//ns.tprint(oSettings.setting[sSetting])
|
|
||||||
//ns.tprint("settingEntry = "+settingEntry);
|
|
||||||
return settingEntry;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @param {NS} ns */
|
|
||||||
export function getGrowThreads(ns, sTarget, nHackThreads, nCores) {
|
|
||||||
let nHackAmountPercent = ns.hackAnalyze(sTarget) * nHackThreads;
|
|
||||||
let nGrowthThreads = ns.growthAnalyze(sTarget, 1 + nHackAmountPercent, nCores);
|
|
||||||
return nGrowthThreads;
|
|
||||||
}
|
|
||||||
1
Ramses/home/serverList.txt
Normal file
1
Ramses/home/serverList.txt
Normal file
File diff suppressed because one or more lines are too long
@@ -1,371 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
// Custom color coding.
|
|
||||||
const cCyan = "\u001b[36m";
|
|
||||||
const cGreen = "\u001b[32m";
|
|
||||||
const cRed = "\u001b[31m";
|
|
||||||
const cReset = "\u001b[0m";
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @param {NS} ns */
|
|
||||||
export async function main(ns) {
|
|
||||||
let reset = ns.args[0];
|
|
||||||
const bSilent = ns.args[1] === true ? true : false; // if true supress feedback
|
|
||||||
//ns.tprint("bSilent = " + bSilent);
|
|
||||||
//host and script info
|
|
||||||
const sThisRunner = ns.getHostname();
|
|
||||||
const sThisScript = ns.getScriptName();
|
|
||||||
const nThisPID = ns.pid;
|
|
||||||
|
|
||||||
//open log for this script
|
|
||||||
if (!bSilent) ns.tail(nThisPID, sThisRunner, ns.args);
|
|
||||||
|
|
||||||
const funnyScript = ["breach.js", "batch.js", "grow.js", "weaken.js", "hack.js"];
|
|
||||||
const sScript = "breach.js";
|
|
||||||
//write function to purchase scripts from tor network and rerun getCracks() then recrack and reroot
|
|
||||||
let cracks = {};
|
|
||||||
cracks = getCracks(ns);
|
|
||||||
let maxPorts = Object.keys(cracks).length;
|
|
||||||
scanServerList(ns, bSilent);
|
|
||||||
let manualTargetOverride = "";
|
|
||||||
let nHackingLevel = ns.getHackingLevel();
|
|
||||||
let nServerMaxSecurity = 100;
|
|
||||||
|
|
||||||
|
|
||||||
if (nHackingLevel < 10) {
|
|
||||||
manualTargetOverride = "n00dles";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//ns.tprint("find best target");
|
|
||||||
findBestTarget(ns, nServerMaxSecurity, maxPorts, ns.getHackingLevel(), manualTargetOverride);
|
|
||||||
//ns.tprint("Best Target found? ");
|
|
||||||
//let bestTarget = ns.read("bestTarget.txt");
|
|
||||||
//ns.tprint("Best Target: " + bestTarget);
|
|
||||||
//ns.tprint(Object.keys(JSON.parse(ns.read("serverList.txt"))).length);
|
|
||||||
crackingAndRooting(ns, cracks, funnyScript);
|
|
||||||
//ns.exec(funnyScript[0], "home", 1, JSON.parse(bestTarget).serverName);
|
|
||||||
//ns.print(reset);
|
|
||||||
if (reset === true) {
|
|
||||||
//ns.tprint("reset === true")
|
|
||||||
findBestTarget(ns, nServerMaxSecurity, maxPorts, ns.getHackingLevel(), manualTargetOverride);
|
|
||||||
let serverList = JSON.parse(ns.read("serverList.txt"));
|
|
||||||
for (const [name, entry] of Object.entries(serverList)) {
|
|
||||||
//copyAndRunSript(ns, funnyScript, name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*let serverListForFiles = JSON.parse(ns.read("serverList.txt"));
|
|
||||||
for (const [name2, entry2] of Object.entries(serverListForFiles)) {
|
|
||||||
ns.tprint(name2 + " Files: " + entry2.serverFiles)
|
|
||||||
}*/
|
|
||||||
//await ns.sleep(500000);
|
|
||||||
//await purchaseAndUpgradeServers(ns, funnyScript);
|
|
||||||
//await runScriptsFromServers(ns, sScript, JSON.parse(bestTarget).serverName);
|
|
||||||
let oBestTarget = JSON.parse(ns.read("bestTarget.txt"));
|
|
||||||
let sBestTarget = oBestTarget.serverName;
|
|
||||||
//ns.exec(sScript, "home", 1, sBestTarget);
|
|
||||||
|
|
||||||
/*
|
|
||||||
if(){
|
|
||||||
ns.exec(sScript,"home",1);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @param {NS} ns */
|
|
||||||
function crackingAndRooting(ns, cracks, funnyScript) {
|
|
||||||
let serverList = JSON.parse(ns.read("serverList.txt"));
|
|
||||||
for (const [name, entry] of Object.entries(serverList)) {
|
|
||||||
let cracked = false;
|
|
||||||
let openPorts = serverList[name].openPorts || 0;
|
|
||||||
if (entry.minPorts === 0 || (entry.minPorts > openPorts && entry.minPorts <= Object.keys(cracks).length)) {
|
|
||||||
for (let k = 0; k < entry.minPorts; k++) {
|
|
||||||
cracks[Object.keys(cracks)[k]](name);
|
|
||||||
serverList[name].openPorts = k;
|
|
||||||
}
|
|
||||||
cracked = true;
|
|
||||||
}
|
|
||||||
if (!ns.hasRootAccess(name) && cracked === true) {
|
|
||||||
ns.nuke(name);
|
|
||||||
if (ns.hasRootAccess(name)) {
|
|
||||||
serverList[name].rootAccess = true;
|
|
||||||
if (serverList[name].maxRam > 0) {
|
|
||||||
copyAndRunSript(ns, funnyScript, name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ns.write("serverList.txt", JSON.stringify(serverList), "w");
|
|
||||||
}
|
|
||||||
ns.tprint("Cracking and rooting done");
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @param {NS} ns */
|
|
||||||
async function purchaseAndUpgradeServers(ns, funnyScript) {
|
|
||||||
let maxPurchasedServers = ns.getPurchasedServerLimit();
|
|
||||||
let purchasedServers = [];
|
|
||||||
let count = listPurchasedServers(ns).length;
|
|
||||||
let currentMoney = 0;
|
|
||||||
let serverList = {};
|
|
||||||
while (count < maxPurchasedServers) {
|
|
||||||
purchasedServers = listPurchasedServers(ns);
|
|
||||||
currentMoney = ns.getServerMoneyAvailable("home");
|
|
||||||
let targetRamInitial = 16;
|
|
||||||
if (ns.getPurchasedServerCost(targetRamInitial) < currentMoney) {
|
|
||||||
let hostname = ns.purchaseServer("pserv-" + purchasedServers.length, 16);
|
|
||||||
count = listPurchasedServers(ns).length;
|
|
||||||
serverList = JSON.parse(ns.read("serverList.txt"));
|
|
||||||
serverList[hostname] = {
|
|
||||||
serverName: hostname,
|
|
||||||
maxRam: 16,
|
|
||||||
maxMoney: 0,
|
|
||||||
minSec: 0,
|
|
||||||
minPorts: 5,
|
|
||||||
minHackLvl: 1,
|
|
||||||
rootAccess: true,
|
|
||||||
factorMoneyPerTime: 99999999,
|
|
||||||
openPorts: 0,
|
|
||||||
};
|
|
||||||
ns.write("serverList.txt", JSON.stringify(serverList), "w");
|
|
||||||
copyAndRunSript(ns, funnyScript, hostname);
|
|
||||||
continue
|
|
||||||
} else {
|
|
||||||
await ns.sleep(5000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let i = 5;
|
|
||||||
while (i < 21) {
|
|
||||||
let targetRam = 2 ** i;
|
|
||||||
purchasedServers = listPurchasedServers(ns);
|
|
||||||
for (let currentServer of purchasedServers) {
|
|
||||||
currentMoney = ns.getServerMoneyAvailable("home");
|
|
||||||
if (ns.getPurchasedServerUpgradeCost(currentServer, targetRam) < currentMoney) {
|
|
||||||
if (ns.upgradePurchasedServer(currentServer, targetRam)) {
|
|
||||||
ns.print(currentServer + " upgraded to " + targetRam + " GB RAM");
|
|
||||||
copyAndRunSript(ns, funnyScript, currentServer);
|
|
||||||
serverList = JSON.parse(ns.read("serverList.txt"));
|
|
||||||
serverList[currentServer].maxRam = targetRam;
|
|
||||||
ns.write("serverList.txt", JSON.stringify(serverList), "w");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
await ns.sleep(5000);
|
|
||||||
continue
|
|
||||||
};
|
|
||||||
}
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
ns.tprint("Extiting purchaseServers script!")
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @param {NS} ns */
|
|
||||||
function listPurchasedServers(ns) {
|
|
||||||
return ns.getPurchasedServers();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @param {NS} ns */
|
|
||||||
function copyAndRunSript(ns, funnyScript, currentServer) {
|
|
||||||
// change to run for one specific server with bestTarget from file
|
|
||||||
//let minRam = ns.getScriptRam(funnyScript);
|
|
||||||
let bestTarget = JSON.parse(ns.read("bestTarget.txt"));
|
|
||||||
let name = currentServer;
|
|
||||||
let serverList = JSON.parse(ns.read("serverList.txt"));
|
|
||||||
ns.print(name);
|
|
||||||
if (serverList[name].rootAccess === true && serverList[bestTarget.serverName].rootAccess === true) {
|
|
||||||
if (name !== "home") {
|
|
||||||
ns.print("killed threads on: " + name + ns.killall(name, true));
|
|
||||||
} else {
|
|
||||||
ns.print("killed threads on: " + name + ns.scriptKill(funnyScript[0], name));
|
|
||||||
};
|
|
||||||
//move script and run
|
|
||||||
if (serverList[name].maxRam > 0) {
|
|
||||||
ns.scp(funnyScript, name, "home");
|
|
||||||
let maxProcesses = 1;
|
|
||||||
if (serverList[name].maxRam - 64 > 512) {
|
|
||||||
|
|
||||||
maxProcesses = Math.max(Math.floor((serverList[name].maxRam - 64) / 512), 1);
|
|
||||||
} else {
|
|
||||||
maxProcesses = 1
|
|
||||||
};
|
|
||||||
for (let n = 1; n <= maxProcesses; n++) {
|
|
||||||
ns.exec(funnyScript[0], name, 1, bestTarget.serverName);
|
|
||||||
}
|
|
||||||
/*let maxThreads = 0;
|
|
||||||
if (name === "home") {
|
|
||||||
maxThreads = Math.floor((serverList[name].maxRam - ns.getServerUsedRam(name) - 32) / minRam);
|
|
||||||
ns.print(name + " " + maxThreads);
|
|
||||||
} else {
|
|
||||||
ns.print(name);
|
|
||||||
maxThreads = Math.floor(serverList[name].maxRam / minRam);
|
|
||||||
ns.print(name + " " + maxThreads);
|
|
||||||
};
|
|
||||||
while (maxThreads > 0) {
|
|
||||||
let threadsToAssign = maxThreads < 500 ? maxThreads : 500;
|
|
||||||
if (ns.exec(funnyScript, name, threadsToAssign, bestTarget.serverName, serverList[bestTarget.serverName].minSec, serverList[bestTarget.serverName].maxMoney, JSON.stringify(serverList[bestTarget.serverName])) !== 0) {
|
|
||||||
ns.print("Executing script on: " + name + " with: " + threadsToAssign + " threads out of " + maxThreads + " total threads");
|
|
||||||
maxThreads = maxThreads - threadsToAssign;
|
|
||||||
} else {
|
|
||||||
ns.tprint("Error running script on: " + name);
|
|
||||||
maxThreads = -1;
|
|
||||||
};
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @param {NS} ns */
|
|
||||||
function getCracks(ns) {
|
|
||||||
let cracks = {};
|
|
||||||
if (ns.fileExists("BruteSSH.exe", "home")) {
|
|
||||||
cracks["BruteSSH.exe"] = ns.brutessh;
|
|
||||||
};
|
|
||||||
if (ns.fileExists("FTPCrack.exe", "home")) {
|
|
||||||
cracks["FTPCrack.exe"] = ns.ftpcrack;
|
|
||||||
};
|
|
||||||
if (ns.fileExists("relaySMTP.exe", "home")) {
|
|
||||||
cracks["relaySMTP.exe"] = ns.relaysmtp;
|
|
||||||
};
|
|
||||||
if (ns.fileExists("HTTPWorm.exe", "home")) {
|
|
||||||
cracks["HTTPWorm.exe"] = ns.httpworm;
|
|
||||||
};
|
|
||||||
if (ns.fileExists("SQLInject.exe", "home")) {
|
|
||||||
cracks["SQLInject.exe"] = ns.sqlinject;
|
|
||||||
};
|
|
||||||
return cracks;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @param {NS} ns */
|
|
||||||
function scanServerList(ns, bSilent) {
|
|
||||||
const home = "home";
|
|
||||||
let serverList = {};
|
|
||||||
let unscanned = [];
|
|
||||||
let nHackingLevel = ns.getHackingLevel();
|
|
||||||
let oServer;
|
|
||||||
unscanned.push(home);
|
|
||||||
while (unscanned.length > 0) {
|
|
||||||
let currentServer = unscanned.pop();
|
|
||||||
if (!serverList[currentServer]) {
|
|
||||||
let maxRam = ns.getServerMaxRam(currentServer);
|
|
||||||
let minPorts = ns.getServerNumPortsRequired(currentServer);
|
|
||||||
let minSecLevel = ns.getServerMinSecurityLevel(currentServer);
|
|
||||||
let minHackLevel = ns.getServerRequiredHackingLevel(currentServer);
|
|
||||||
let rootAccess = ns.hasRootAccess(currentServer);
|
|
||||||
let serverMoney = ns.getServerMaxMoney(currentServer);
|
|
||||||
let serverFiles = ns.ls(currentServer);
|
|
||||||
let skillFactor = (2.5 * minHackLevel * minSecLevel + 500) / (nHackingLevel + 50);
|
|
||||||
let compareTimeFactor = serverMoney / skillFactor / 10e7;
|
|
||||||
let nHackingChance = ns.hackAnalyzeChance(currentServer);
|
|
||||||
oServer = ns.getServer(currentServer);
|
|
||||||
let sOrg = oServer.organizationName;
|
|
||||||
let nCores = oServer.cpuCores;
|
|
||||||
if (minHackLevel <= nHackingLevel && !currentServer.includes("home") && !currentServer.includes("pserv") && serverMoney > 0 && !bSilent) {
|
|
||||||
//if (!currentServer.includes("home") && !currentServer.includes("pserv") && !bSilent) {
|
|
||||||
ns.tprint("Server : " + currentServer);
|
|
||||||
ns.tprint("sOrg : " + sOrg);
|
|
||||||
ns.tprint("Hacking : " + minHackLevel);
|
|
||||||
ns.tprint("RAM : " + maxRam);
|
|
||||||
ns.tprint("Cores : " + nCores);
|
|
||||||
ns.tprint("Money : " + Math.floor(serverMoney).toLocaleString());
|
|
||||||
ns.tprint("Hack chance : " + Math.floor(nHackingChance * 10000) / 100 + " %");
|
|
||||||
ns.tprint("Security : " + minSecLevel);
|
|
||||||
ns.tprint("--------------------------------------------------------------");
|
|
||||||
}
|
|
||||||
serverList[currentServer] =
|
|
||||||
{
|
|
||||||
serverName: currentServer,
|
|
||||||
maxRam: maxRam,
|
|
||||||
maxMoney: serverMoney,
|
|
||||||
minSec: minSecLevel,
|
|
||||||
minPorts: minPorts,
|
|
||||||
minHackLvl: minHackLevel,
|
|
||||||
rootAccess: rootAccess,
|
|
||||||
factorMoneyPerTime: compareTimeFactor,
|
|
||||||
openPorts: 0,
|
|
||||||
serverFiles: serverFiles,
|
|
||||||
hackingChance: nHackingChance
|
|
||||||
};
|
|
||||||
let neighbours = ns.scan(currentServer);
|
|
||||||
for (let i = 0; i < neighbours.length; i++) {
|
|
||||||
let neighbour = neighbours[i];
|
|
||||||
if (serverList[neighbour]) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
unscanned.push(neighbour);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ns.write("serverList.txt", JSON.stringify(serverList), "w");
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @param {NS} ns */
|
|
||||||
function findBestTarget(ns, maxSec, maxPorts, currentHackLevel, manualTargetOverride) {
|
|
||||||
//ns.tprint("start of findBestTarget ");
|
|
||||||
const bSilent = ns.args[1] === true ? true : false; // if true supress feedback
|
|
||||||
//ns.tprint("bSilent = " +bSilent);
|
|
||||||
let sCurrentBestTarget = JSON.parse(ns.read("bestTarget.txt"));
|
|
||||||
//let sCurrentBestTarget = "n00dles";
|
|
||||||
//ns.tprint("sCurrentBestTarget = " +JSON.stringify(sCurrentBestTarget));
|
|
||||||
//if (!bSilent) ns.tprint("sCurrentBestTarget = " + sCurrentBestTarget.serverName);
|
|
||||||
let serverList = JSON.parse(ns.read("serverList.txt"));
|
|
||||||
let bestEntry = null;
|
|
||||||
let compareTime = 0;
|
|
||||||
let nMaxMoneyPerChance = 0;
|
|
||||||
let nBestMoneyPerChance = 0;
|
|
||||||
//ns.tprint("before for loop ");
|
|
||||||
for (const [name, entry] of Object.entries(serverList)) {
|
|
||||||
if (entry.minSec <= maxSec && entry.minPorts <= maxPorts && entry.minHackLvl < currentHackLevel) {
|
|
||||||
nMaxMoneyPerChance = (entry.maxMoney * entry.hackingChance) / entry.minSec;
|
|
||||||
//ns.tprint("nMaxMoneyPerChance " + nMaxMoneyPerChance);
|
|
||||||
/*
|
|
||||||
if (entry.factorMoneyPerTime > compareTime) {
|
|
||||||
compareTime = entry.factorMoneyPerTime;
|
|
||||||
bestEntry = name;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
if (nMaxMoneyPerChance > nBestMoneyPerChance) {
|
|
||||||
nBestMoneyPerChance = nMaxMoneyPerChance;
|
|
||||||
bestEntry = name;
|
|
||||||
if (!bSilent) ns.tprint("bestEntry " + bestEntry);
|
|
||||||
if (!bSilent) ns.tprint("╚ value = " + Math.floor(nMaxMoneyPerChance));
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (manualTargetOverride.length > 0) {
|
|
||||||
bestEntry = manualTargetOverride;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sCurrentBestTarget.serverName === bestEntry) {
|
|
||||||
if (!bSilent) ns.tprint("Same target = " + bestEntry);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ns.tprint("New best target = " + cCyan + bestEntry + cReset);
|
|
||||||
}
|
|
||||||
ns.write("bestTarget.txt", JSON.stringify(serverList[bestEntry]), "w");
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @param {NS} ns */
|
|
||||||
async function runScriptsFromServers(ns, sScript, sTarget) {
|
|
||||||
let serverList = JSON.parse(ns.read("serverList.txt"));
|
|
||||||
let nScripts;
|
|
||||||
let nMaxRam = 0;
|
|
||||||
const nScriptRAM = ns.getScriptRam(sScript);
|
|
||||||
for (const [name, entry] of Object.entries(serverList)) {
|
|
||||||
//let rootAccess = ns.hasRootAccess(currentServer);
|
|
||||||
nMaxRam = ns.getServerMaxRam(entry.serverName);
|
|
||||||
nScripts = Math.floor(nMaxRam / nScriptRAM);
|
|
||||||
if (entry.maxRam >= 8 && serverList[name].rootAccess === true && !entry.serverName.includes("home") && !entry.serverName.includes("pserv")) {
|
|
||||||
//ns.killall(entry.serverName);
|
|
||||||
ns.scriptKill(sScript, entry.serverName);
|
|
||||||
ns.scp(sScript, entry.serverName);
|
|
||||||
while (nScripts > 0) {
|
|
||||||
ns.exec(sScript, entry.serverName, 1, sTarget);
|
|
||||||
nScripts--;
|
|
||||||
await ns.sleep(10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
import { listPurchasedServers, getSetting } from "myLibrary.js";
|
|
||||||
|
|
||||||
// Custom color coding.
|
|
||||||
const cCyan = "\u001b[36m";
|
|
||||||
const cGreen = "\u001b[32m";
|
|
||||||
const cRed = "\u001b[31m";
|
|
||||||
const cReset = "\u001b[0m";
|
|
||||||
|
|
||||||
/** @param {NS} ns */
|
|
||||||
export async function main(ns) {
|
|
||||||
ns.disableLog("ALL");
|
|
||||||
|
|
||||||
//host and script info
|
|
||||||
const sThisRunner = ns.getHostname();
|
|
||||||
|
|
||||||
//open log for this script
|
|
||||||
ns.tail(ns.pid, sThisRunner);
|
|
||||||
|
|
||||||
//const npServ = ["pserv-0", "pserv-1", "pserv-2", "pserv-3", "pserv-4", "pserv-5", "pserv-6", "pserv-7", "pserv-8", "pserv-9", "pserv-10", "pserv-11", "pserv-12", "pserv-13", "pserv-14", "pserv-15", "pserv-16", "pserv-17", "pserv-18", "pserv-19", "pserv-20", "pserv-21", "pserv-22", "pserv-23", "pserv-24"];
|
|
||||||
const npServ = listPurchasedServers(ns);
|
|
||||||
let nCurrentRAM = 4;
|
|
||||||
let nMyMoney = ns.getServerMoneyAvailable("home");
|
|
||||||
let bAutoUpgrade = getSetting(ns, "autoUpgrades");
|
|
||||||
while (bAutoUpgrade && nCurrentRAM < 2 ** 20) {
|
|
||||||
|
|
||||||
//for (let i = 0; i < npServ.length; i++) {
|
|
||||||
for (let i = 0; i < npServ.length && bAutoUpgrade; i++) {
|
|
||||||
ns.print("----------------------------------------------------------------------");
|
|
||||||
nMyMoney = ns.getServerMoneyAvailable("home");
|
|
||||||
|
|
||||||
let nNextRAM = nCurrentRAM * 2;
|
|
||||||
let nUpgradeCost = ns.getPurchasedServerUpgradeCost(npServ[i], nNextRAM);
|
|
||||||
|
|
||||||
ns.print("npServ = " + npServ[i]);
|
|
||||||
ns.print("nMyMoney = " + Math.ceil(nMyMoney).toLocaleString());
|
|
||||||
ns.print("nCurrentRAM = " + nCurrentRAM.toLocaleString());
|
|
||||||
ns.print("nNextRAM = " + nNextRAM);
|
|
||||||
ns.print("nUpgradeCost = " + Math.ceil(nUpgradeCost).toLocaleString());
|
|
||||||
|
|
||||||
while (bAutoUpgrade && nMyMoney < nUpgradeCost) {
|
|
||||||
ns.print("Money Treshold = " + Math.ceil(nMyMoney).toLocaleString() + " / " + Math.ceil(nUpgradeCost).toLocaleString());
|
|
||||||
await ns.sleep(1000);
|
|
||||||
bAutoUpgrade = getSetting(ns, "autoUpgrades");
|
|
||||||
if (bAutoUpgrade === false) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
nMyMoney = ns.getServerMoneyAvailable("home");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ns.upgradePurchasedServer(npServ[i], nNextRAM)) {
|
|
||||||
ns.print("Server: " + npServ[i] + " upgraded to: " + nNextRAM + "GB");
|
|
||||||
ns.tprint(cCyan + "Server: " + npServ[i] + " upgraded to: " + nNextRAM.toLocaleString() + " GB" + cReset);
|
|
||||||
ns.toast("Server: " + npServ[i] + " upgraded to: " + nNextRAM.toLocaleString() + " GB", "info", 10000);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ns.print("Server: " + npServ[i] + " could not be upgraded to : " + nNextRAM + "GB it is currently at: " + ns.getServerMaxRam(npServ[i]) + "GB");
|
|
||||||
}
|
|
||||||
bAutoUpgrade = getSetting(ns, "autoUpgrades");
|
|
||||||
if (bAutoUpgrade === false) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nCurrentRAM *= 2;
|
|
||||||
}
|
|
||||||
ns.print("----------------------------------------------------------------------");
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user