diff --git a/servers/home/utils.ts b/servers/home/utils.ts index f11068f..85d3e4b 100644 --- a/servers/home/utils.ts +++ b/servers/home/utils.ts @@ -28,6 +28,21 @@ export function recursiveScan(ns: NS) { return allServers } +/** + * Recursively scans all servers connected to the current server for the set of all levels that hackable servers require + * @param ns + * @returns A set of every hacking level required to hack a new server + */ +export function recursiveHackingRequired(ns: NS) { + let servers = recursiveScan(ns) + let levels: number[] = [] + for (let server of servers) { + levels.push(ns.getServerRequiredHackingLevel(server)) + } + // remove duplicates + return [...new Set(levels)] +} + /** * Removes files passed in from all servers * @param ns Global NS object diff --git a/servers/home/watcher.ts b/servers/home/watcher.ts index 44b33a3..69dd334 100644 --- a/servers/home/watcher.ts +++ b/servers/home/watcher.ts @@ -1,16 +1,20 @@ +import { recursiveHackingRequired } from "./utils" + export async function main(ns: NS) { ns.run('hackallservers.js') - let hackingLevel = ns.getHackingLevel() - while (hackingLevel < 9999) { - let oldHackingLevel = hackingLevel + let levels = recursiveHackingRequired(ns) + let hackingLevel: number + do { hackingLevel = ns.getHackingLevel() - if (oldHackingLevel !== hackingLevel) { - ns.tprint(`Hacking level increased from ${oldHackingLevel} to ${hackingLevel}`) + if (levels.includes(hackingLevel)) { + // remove the level from the list, so we don't try to hack it again + levels.splice(levels.indexOf(hackingLevel), 1) + ns.tprint(`Hacking level increased to ${hackingLevel}`) ns.run('killall.js') await ns.sleep(1000) // 1 second ns.run('hackallservers.js') } // Wait 1 second before checking again await ns.sleep(1000) - } + } while (hackingLevel < 9999) }