Compare commits

..

2 Commits

Author SHA1 Message Date
Philipp
e1175b9a4f Merge branch 'main' of https://gitea.goetje-ing.de/ArchitectsOfTheBitburner/The_Bitburner_Scripts 2024-10-13 23:21:39 +02:00
Philipp
481373deb9 sync 2024-10-13 23:21:32 +02:00
2 changed files with 63 additions and 55 deletions

View File

@@ -84,7 +84,6 @@ export async function main(ns) {
nListenPID = ns.run("/corp/GetOfficeData.js", 1, sDivisionName, sCity); nListenPID = ns.run("/corp/GetOfficeData.js", 1, sDivisionName, sCity);
await ns.nextPortWrite(nListenPID); await ns.nextPortWrite(nListenPID);
oOfficeData = ns.readPort(nListenPID); oOfficeData = ns.readPort(nListenPID);
ns.tprint(oOfficeData);
nListenPID = ns.run("/corp/HireWorkers.js", 1, sDivisionName, sCity, JSON.stringify(oOfficeData)); nListenPID = ns.run("/corp/HireWorkers.js", 1, sDivisionName, sCity, JSON.stringify(oOfficeData));
await ns.nextPortWrite(nListenPID); await ns.nextPortWrite(nListenPID);
} }
@@ -92,19 +91,15 @@ export async function main(ns) {
break; break;
case 50: case 50:
let aCurrentGoods = [ let aCurrentGoods = [
{"sMaterialName":"Food","yAmount":"MAX","yPrice":"MP"}, { "sMaterialName": "Food", "yAmount": "MAX", "yPrice": "MP-1" },
{"sMaterialName":"Plants","yAmount":"MAX","yPrice":"MP"} { "sMaterialName": "Plants", "yAmount": "MAX", "yPrice": "MP-1" }
] ]
aCurrentGoods.forEach(async (entry) =>{
for (let sCity of aCitites) { for (let sCity of aCitites) {
forEach aCurrentGoods.forEach(async (entry) => {
nListenPID = ns.run("/corp/SetSalePrices.js", 1, sDivisionName, sCity, oCurrentGoods); nListenPID = ns.run("/corp/SetSalePrices.js", 1, sDivisionName, sCity, JSON.stringify(entry));
await ns.nextPortWrite(nListenPID); await ns.nextPortWrite(nListenPID);
oOfficeData = ns.readPort(nListenPID); })
ns.tprint(oOfficeData); }
nListenPID = ns.run("/corp/HireWorkers.js", 1, sDivisionName, sCity, JSON.stringify(oOfficeData));
await ns.nextPortWrite(nListenPID);
}})
oCorpStatus.nStep = 200; oCorpStatus.nStep = 200;
break; break;
case 60: case 60:

View File

@@ -33,13 +33,13 @@ export function getCracks(ns) {
/** @param {NS} ns */ /** @param {NS} ns */
export function scanServerList(ns) { 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();
if (!serverList.some(obj => obj["serverName"] === currentServer)) { if (!serverList[currentServer]) {
let maxRam = ns.getServerMaxRam(currentServer); let maxRam = ns.getServerMaxRam(currentServer);
let minPorts = ns.getServerNumPortsRequired(currentServer); let minPorts = ns.getServerNumPortsRequired(currentServer);
let minSecLevel = ns.getServerMinSecurityLevel(currentServer); let minSecLevel = ns.getServerMinSecurityLevel(currentServer);
@@ -51,7 +51,8 @@ export function scanServerList(ns) {
let serverOrgs = serverStats.organizationName; let serverOrgs = serverStats.organizationName;
let serverCores = serverStats.cpuCores; let serverCores = serverStats.cpuCores;
serverList.push({ serverList[currentServer] =
{
serverName: currentServer, serverName: currentServer,
maxRam: maxRam, maxRam: maxRam,
maxMoney: serverMoney, maxMoney: serverMoney,
@@ -63,11 +64,11 @@ export function scanServerList(ns) {
serverOrgs: serverOrgs, serverOrgs: serverOrgs,
serverCores: serverCores, serverCores: serverCores,
serverFiles: serverFiles, serverFiles: serverFiles,
}); };
let neighbours = ns.scan(currentServer); let neighbours = ns.scan(currentServer);
for (let i = 0; i < neighbours.length; i++) { for (let i = 0; i < neighbours.length; i++) {
let neighbour = neighbours[i]; let neighbour = neighbours[i];
if (serverList.some(obj => obj["serverName"] === neighbour)) { if (serverList[neighbour]) {
continue continue
} }
unscanned.push(neighbour); unscanned.push(neighbour);
@@ -88,17 +89,17 @@ export function findBestTarget(ns, maxSec, maxPorts, currentHackLevel, manualTar
bestEntry = null; bestEntry = null;
let nMaxMoneyPerChance = 0; let nMaxMoneyPerChance = 0;
let nBestMoneyPerChance = 0; let nBestMoneyPerChance = 0;
serverList.forEach((entry)=> { 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) {
nMaxMoneyPerChance = (entry.maxMoney * ns.hackAnalyzeChance(entry.serverName)) / entry.minSec; nMaxMoneyPerChance = (entry.maxMoney * ns.hackAnalyzeChance(name)) / entry.minSec;
if (nMaxMoneyPerChance > nBestMoneyPerChance) { if (nMaxMoneyPerChance > nBestMoneyPerChance) {
nBestMoneyPerChance = nMaxMoneyPerChance; nBestMoneyPerChance = nMaxMoneyPerChance;
bestEntry = entry.serverName; bestEntry = name;
} }
} }
}) }
} }
ns.write("bestTarget.txt", JSON.stringify(serverList.find((entry) => entry.serverName === bestEntry)), "w"); ns.write("bestTarget.txt", JSON.stringify(serverList[bestEntry]), "w");
} }
@@ -106,25 +107,24 @@ export function findBestTarget(ns, maxSec, maxPorts, currentHackLevel, manualTar
export function crackingAndRooting(ns, cracks) { 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"));
let newServerList = serverList.map((entry) => { for (const [name, entry] of Object.entries(serverList)) {
let cracked = false; let cracked = false;
let openPorts = entry.openPorts || 0; let openPorts = serverList[name].openPorts || 0;
if (entry.minPorts === 0 || (entry.minPorts > openPorts && entry.minPorts <= Object.keys(cracks).length)) { if (entry.minPorts === 0 || (entry.minPorts > openPorts && entry.minPorts <= Object.keys(cracks).length)) {
for (let k = 0; k < entry.minPorts; k++) { for (let k = 0; k < entry.minPorts; k++) {
cracks[Object.keys(cracks)[k]](entry.serverName); cracks[Object.keys(cracks)[k]](name);
entry.openPorts = k; serverList[name].openPorts = k;
} }
cracked = true; cracked = true;
} }
if (!ns.hasRootAccess(entry.serverName) && cracked === true) { if (!ns.hasRootAccess(name) && cracked === true) {
ns.nuke(entry.serverName); ns.nuke(name);
if (ns.hasRootAccess(entry.serverName)) { if (ns.hasRootAccess(name)) {
entry.rootAccess = true; serverList[name].rootAccess = true;
} }
} }
return entry ns.write("serverList.txt", JSON.stringify(serverList), "w");
}) }
ns.write("serverList.txt", JSON.stringify(newServerList), "w");
ns.tprint("Cracking and rooting done"); ns.tprint("Cracking and rooting done");
} }
@@ -132,26 +132,25 @@ export function crackingAndRooting(ns, cracks) {
/** @param {NS} ns */ /** @param {NS} ns */
export function copyAndRunScript(ns, funnyScript, currentServer) { export function copyAndRunScript(ns, funnyScript, currentServer) {
let bestTarget = JSON.parse(ns.read("bestTarget.txt")); let bestTarget = JSON.parse(ns.read("bestTarget.txt"));
let name = currentServer;
let serverList = JSON.parse(ns.read("serverList.txt")); let serverList = JSON.parse(ns.read("serverList.txt"));
let bestEntry = serverList.find((entry) => entry.serverName === bestTarget.serverName) ns.print(name);
let currentEntry = serverList.find((entry) => entry.serverName === currentServer) if (serverList[name].rootAccess === true && serverList[bestTarget.serverName].rootAccess === true) {
if (name !== "home") {
if (currentEntry.rootAccess === true && bestEntry.rootAccess === true) { ns.print("killed threads on: " + name + ns.killall(name, true));
if (currentEntry.serverName !== "home") {
ns.print("killed threads on: " + currentEntry.serverName + ns.killall(currentEntry.serverName, true));
} else { } else {
ns.print("killed threads on: " + currentEntry.serverName + ns.scriptKill(funnyScript[0], currentEntry.serverName)); ns.print("killed threads on: " + name + ns.scriptKill(funnyScript[0], name));
}; };
if (currentEntry.maxRam > 0) { if (serverList[name].maxRam > 0) {
ns.scp(funnyScript, currentEntry.serverName, "home"); ns.scp(funnyScript, name, "home");
let maxProcesses = 1; let maxProcesses = 1;
if (currentEntry.maxRam >= 8) { if (serverList[name].maxRam >= 8) {
maxProcesses = Math.max(Math.floor((currentEntry.maxRam) / 8), 1); maxProcesses = Math.max(Math.floor((serverList[name].maxRam) / 8), 1);
} else { } else {
maxProcesses = 1 maxProcesses = 1
}; };
for (let n = 1; n <= maxProcesses; n++) { for (let n = 1; n <= maxProcesses; n++) {
ns.exec(funnyScript[0], currentEntry.serverName, 1, bestTarget.serverName); ns.exec(funnyScript[0], name, 1, bestTarget.serverName);
} }
} }
} }
@@ -166,7 +165,7 @@ export async function purchaseAndUpgradeServers(ns) {
let purchasedServers = []; let purchasedServers = [];
let pServcount = listPurchasedServers(ns).length; let pServcount = listPurchasedServers(ns).length;
let currentMoney = 0; let currentMoney = 0;
let serverList = []; let serverList = {};
while (pServcount < maxPurchasedServers) { while (pServcount < maxPurchasedServers) {
purchasedServers = listPurchasedServers(ns); purchasedServers = listPurchasedServers(ns);
currentMoney = ns.getServerMoneyAvailable("home"); currentMoney = ns.getServerMoneyAvailable("home");
@@ -181,7 +180,7 @@ export async function purchaseAndUpgradeServers(ns) {
ns.toast("Purchased " + hostname, "info", 10000); ns.toast("Purchased " + hostname, "info", 10000);
pServcount = listPurchasedServers(ns).length; pServcount = listPurchasedServers(ns).length;
serverList = JSON.parse(ns.read("serverList.txt")); serverList = JSON.parse(ns.read("serverList.txt"));
serverList.push({ serverList[hostname] = {
serverName: hostname, serverName: hostname,
maxRam: 16, maxRam: 16,
maxMoney: 0, maxMoney: 0,
@@ -190,7 +189,7 @@ export async function purchaseAndUpgradeServers(ns) {
minHackLvl: 1, minHackLvl: 1,
rootAccess: true, rootAccess: true,
openPorts: 0, openPorts: 0,
}); };
ns.write("serverList.txt", JSON.stringify(serverList), "w"); ns.write("serverList.txt", JSON.stringify(serverList), "w");
continue continue
} else { } else {
@@ -203,20 +202,19 @@ export async function purchaseAndUpgradeServers(ns) {
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){ if (ns.getServerMaxRam(currentServer) < targetRam && ns.getPurchasedServerUpgradeCost(currentServer, targetRam) < currentMoney) {
if (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"));
let newServerList = serverList.map((entry) => { if (entry.serverName === currentServer){ entry.maxRam = targetRam} return entry}); serverList[currentServer].maxRam = targetRam;
ns.write("serverList.txt", JSON.stringify(newServerList), "w"); ns.write("serverList.txt", JSON.stringify(serverList), "w");
ns.tprint(cCyan + "Server: " + currentServer + " upgraded to: " + targetRam.toLocaleString() + " GB" + cReset); ns.tprint(cCyan + "Server: " + currentServer + " upgraded to: " + targetRam.toLocaleString() + " GB" + cReset);
ns.toast("Server: " + currentServer + " upgraded to: " + targetRam.toLocaleString() + " GB", "info", 10000); ns.toast("Server: " + currentServer + " upgraded to: " + targetRam.toLocaleString() + " GB", "info", 10000);
} }
} else { } else {
await ns.sleep(5000); await ns.sleep(5000);
continue continue
}}; };
} }
++i; ++i;
} }
@@ -262,6 +260,8 @@ export function listWorkServers(ns) {
const sFileName = "serverList.txt"; const sFileName = "serverList.txt";
if (!ns.fileExists(sFileName, "home")) { ns.print(`ERROR ${sFileName} does not exist.`); return false; }; if (!ns.fileExists(sFileName, "home")) { ns.print(`ERROR ${sFileName} does not exist.`); return false; };
let serverList = JSON.parse(ns.read(sFileName)); let serverList = JSON.parse(ns.read(sFileName));
//ns.tprint(serverList);
//const oList = sortDataByNestedKey(serverList, 'serverCores');
let nTotalWorkerRAM = 0; let nTotalWorkerRAM = 0;
let nTotalFreeRAM = 0; let nTotalFreeRAM = 0;
@@ -273,7 +273,7 @@ export function listWorkServers(ns) {
ns.printRaw("┏━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┓"); ns.printRaw("┏━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┓");
ns.printRaw("┃ Server ┃ Free / Max RAM ┃ Cores ┃"); ns.printRaw("┃ Server ┃ Free / Max RAM ┃ Cores ┃");
ns.printRaw("┣━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━┫"); ns.printRaw("┣━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━┫");
serverList.forEach((entry) => { for (const [name, entry] of Object.entries(serverList)) {
if (entry.rootAccess && entry.maxRam >= 1) { if (entry.rootAccess && entry.maxRam >= 1) {
let sServerName = entry.serverName.padEnd(nServerColumnWidth, ' '); let sServerName = entry.serverName.padEnd(nServerColumnWidth, ' ');
let nFreeRAM = entry.maxRam - ns.getServerUsedRam(entry.serverName); let nFreeRAM = entry.maxRam - ns.getServerUsedRam(entry.serverName);
@@ -284,7 +284,20 @@ export function listWorkServers(ns) {
nTotalWorkerRAM += entry.maxRam; nTotalWorkerRAM += entry.maxRam;
nTotalFreeRAM += nFreeRAM; nTotalFreeRAM += nFreeRAM;
} }
}); }
ns.printRaw("┗━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━┛"); ns.printRaw("┗━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━┛");
ns.printRaw(`Total Free: ${nTotalFreeRAM.toLocaleString()} / ${nTotalWorkerRAM.toLocaleString()} GB`); ns.printRaw(`Total Free: ${nTotalFreeRAM.toLocaleString()} / ${nTotalWorkerRAM.toLocaleString()} GB`);
} }
function sortDataByNestedKey(data, key) {
return data.sort((a, b) => {
const aValue = Object.values(a)[0][key];
const bValue = Object.values(b)[0][key];
if (typeof aValue === 'string') {
return aValue.localeCompare(bValue);
} else {
return aValue - bValue;
}
});
}