From d825b25c739ff2b6de10a014177ee2608da82caf Mon Sep 17 00:00:00 2001 From: Daniel Xie Date: Wed, 31 May 2017 12:37:32 -0500 Subject: [PATCH] Added functions for weakening server security and updated docuemtnation --- src/Augmentations.js | 2 +- src/Constants.js | 27 +++++++++---- src/NetscriptEvaluator.js | 80 +++++++++++++++++++++++++++++++++++++-- src/Script.js | 4 ++ src/Server.js | 4 +- src/Terminal.js | 2 +- 6 files changed, 105 insertions(+), 14 deletions(-) diff --git a/src/Augmentations.js b/src/Augmentations.js index 061108d27..f2f369dfc 100644 --- a/src/Augmentations.js +++ b/src/Augmentations.js @@ -1693,7 +1693,7 @@ applyAugmentation = function(aug, reapply=false) { Player.hacking_chance_mult *= 1.01; Player.hacking_speed_mult *= 0.99; Player.hacking_money_mult *= 1.01; - //Player.hacking_grow_mult *= 1.01; + Player.hacking_grow_mult *= 1.01; Player.hacking_mult *= 1.01; Player.strength_mult *= 1.01; diff --git a/src/Constants.js b/src/Constants.js index 74948b37f..a8b76fb24 100644 --- a/src/Constants.js +++ b/src/Constants.js @@ -42,6 +42,7 @@ CONSTANTS = { ScriptIfRamCost: 0.1, ScriptHackRamCost: 0.25, ScriptGrowRamCost: 0.25, + ScriptWeakenRamCost: 0.5, ScriptNukeRamCost: 0.05, ScriptBrutesshRamCost: 0.05, ScriptFtpcrackRamCost: 0.05, @@ -49,12 +50,13 @@ CONSTANTS = { ScriptHttpwormRamCost: 0.05, ScriptSqlinjectRamCost: 0.05, ScriptRunRamCost: 0.8, - ScriptExecRamCost: 1.0, + ScriptExecRamCost: 1.1, ScriptScpRamCost: 0.5, ScriptHasRootAccessRamCost: 0.05, ScriptGetHostnameRamCost: 0.1, ScriptGetHackingLevelRamCost: 0.1, ScriptGetServerMoneyRamCost: 0.1, + ScriptGetServerSecurityRamCost: 0.2, ScriptOperatorRamCost: 0.01, ScriptPurchaseHacknetRamCost: 1.5, ScriptHacknetNodesRamCost: 1.0, //Base cost for accessing hacknet nodes array @@ -63,8 +65,8 @@ CONSTANTS = { ScriptHNUpgCoreRamCost: 0.8, //Server constants - ServerGrowthRate: 1.0018, //Growth rate - ServerFortifyAmount: 0.001, //Amount by which server's security increases when its hacked + ServerGrowthRate: 1.0012, //Growth rate + ServerFortifyAmount: 0.002, //Amount by which server's security increases when its hacked ServerWeakenAmount: 0.1, //Amount by which server's security decreases when weakened //Maximum number of log entries for a script @@ -181,7 +183,7 @@ CONSTANTS = { TutorialHackingText: "In the year 2077, currency has become digital and decentralized. People and corporations " + "store their money on servers. By hacking these servers, you can steal their money and gain " + "experience.

" + - "Gaining root access
" + + "

Gaining root access


" + "The key to hacking a server is to gain root access to that server. This can be done using " + "the NUKE virus (NUKE.exe). You start the game with a copy of the NUKE virus on your home " + "computer. The NUKE virus attacks the target server's open ports using buffer overflow " + @@ -194,10 +196,10 @@ CONSTANTS = { "a seller.

" + "In order to determine how many ports need to be opened to successfully NUKE a server, connect to " + "that server and run the 'analyze' command. This will also show you which ports have already been " + - "opened.
" + + "opened.

" + "Once you have enough ports opened and have ran the NUKE virus to gain root access, the server " + "can then be hacked by simply calling the 'hack' command through terminal, or by using a script.

" + - "Hacking mechanics
" + + "

Hacking mechanics


" + "When you execute the hack command, either manually through the terminal or automatically through " + "a script, you attempt to hack the server. This action takes time. The more advanced a server's " + "security is, the more time it will take. Your hacking skill level also affects the hacking time, " + @@ -210,7 +212,18 @@ CONSTANTS = { "percentage is determined by the server's security and your hacking skill level. The amount of money " + "on a server is not limitless. So, if you constantly hack a server and deplete its money, then you will " + "encounter diminishing returns in your hacking (since you are only hacking a certain percentage). A server " + - "will regain money at a slow rate over time. ", + "will regain money at a slow rate over time.

" + + "

Server Security


" + + "Each server has a security level, which is denoted by a number between 1 and 100. A higher number means " + + "the server has stronger security. As mentioned above, a server's security level is an important factor " + + "to consider when hacking. You can check a server's security level using the 'analyze' command, although this " + + "only gives an estimate (with 5% uncertainty). You can also check a server's security in a script, using the " + + "getServerSecurityLevel(server) function in Netscript. See the Netscript documentation for more details. " + + "This function will give you an exact value for a server's security.

" + + "Whenever a server is hacked manually or through a script, its security level increases by a small amount. This will " + + "make it harder for you to hack the server, and decrease the amount of money you can steal. You can lower a " + + "server's security level in a script using the weaken(server) function in Netscript. See the Netscript " + + "documentation for more details", TutorialScriptsText: "Scripts can be used to automate the hacking process. Scripts must be written in the Netscript language. " + "Documentation about the Netscript language can be found in the 'Netscript Programming Language' " + diff --git a/src/NetscriptEvaluator.js b/src/NetscriptEvaluator.js index c3d851455..5d1325447 100644 --- a/src/NetscriptEvaluator.js +++ b/src/NetscriptEvaluator.js @@ -404,6 +404,52 @@ function evaluate(exp, workerScript) { }, function(e) { reject(e); }); + } else if (exp.func.value == "weaken") { + if (env.stopFlag) {reject(workerScript); return;} + if (exp.args.length != 1) { + reject("|" + workerScript.serverIp + "|" + workerScript.name + "|weaken() call has incorrect number of arguments. Takes 1 argument"); + return; + } + var ipPromise = evaluate(exp.args[0], workerScript); + ipPromise.then(function(ip) { + if (env.stopFlag) {reject(workerScript); return;} + var server = getServer(ip); + if (server == null) { + reject("|" + workerScript.serverIp + "|" + workerScript.name + "|Invalid IP or hostname passed into weaken() command"); + workerScript.scriptRef.log("Cannot weaken(). Invalid IP or hostname passed in: " + ip); + return; + } + + //No root access or skill level too low + if (server.hasAdminRights == false) { + workerScript.scriptRef.log("Cannot weaken this server (" + server.hostname + ") because user does not have root access"); + reject("|" + workerScript.serverIp + "|" + workerScript.name + "|Script crashed because it did not have root access to " + server.hostname); + return; + } + + var weakenTime = scriptCalculateWeakenTime(server); + console.log("Executing weaken() on server " + server.hostname + " in " + formatNumber(weakenTime/1000, 3) + " seconds") + workerScript.scriptRef.log("Executing weaken() on server " + server.hostname + " in " + formatNumber(weakenTime/1000, 3) + " seconds"); + + var p = new Promise(function(resolve, reject) { + if (env.stopFlag) {reject(workerScript); return;} + setTimeout(function() { + server.weaken(CONSTANTS.ServerWeakenAmount); + resolve(CONSTANTS.ServerWeakenAmount); + }, weakenTime); + }); + + p.then(function(amt) { + workerScript.scriptRef.log("Using weaken(), " + server.hostname + "'s security level was decreased by " + amt + ". Gained 5 hacking exp"); + Player.gainHackingExp(5); + workerScript.scriptRef.onlineExpGained += 5; + resolve("hackExecuted"); + }, function(e) { + reject(e); + }); + }, function(e) { + reject(e); + }); } else if (exp.func.value == "nuke") { if (exp.args.length != 1) { reject("|" + workerScript.serverIp + "|" + workerScript.name + "|nuke() call has incorrect number of arguments. Takes 1 argument"); @@ -840,15 +886,35 @@ function evaluate(exp, workerScript) { }, function(e) { reject(e); }); + } else if (exp.func.value == "getServerSecurityLevel") { + if (exp.args.length != 1) { + reject(makeRuntimeRejectMsg(workerScript, "getServerSecurityLevel() call has incorrect number of arguments. Takes 1 arguments")); + return; + } + var ipPromise = evaluate(exp.args[0], workerScript); + ipPromise.then(function(ip) { + setTimeout(function() { + var server = getServer(ip); + if (server == null) { + reject(makeRuntimeRejectMsg(workerScript, "Invalid IP or hostname passed into getServerSecurityLevel() command")); + workerScript.scriptRef.log("Cannot getServerSecurityLevel(). Invalid IP or hostname passed in: " + ip); + return; + } + workerScript.scriptRef.log("getServerSecurityLevel() returned " + formatNumber(server.hackDifficulty, 3)); + resolve(server.hackDifficulty); + }, CONSTANTS.CodeInstructionRunTime); + }, function(e) { + reject(e); + }); } else if (exp.func.value == "purchaseHacknetNode") { if (exp.args.length != 0) { - reject("|"+workerScript.serverIp+"|"+workerScript.name+"|purchaseHacknetNode() call has incorrect number of arguments. Takes 0 arguments"); + reject(makeRuntimeRejectMsg(workerScript, "purchaseHacknetNode() call has incorrect number of arguments. Takes 0 arguments")); return; } setTimeout(function() { var cost = getCostOfNextHacknetNode(); if (isNaN(cost)) { - reject("|"+workerScript.serverIp+"|"+workerScript.name+"|Could not calculate cost in purchaseHacknetNode(). This is a bug please report to game dev"); + reject(makeRuntimeRejectMsg(workerScript, "Could not calculate cost in purchaseHacknetNode(). This is a bug please report to game dev")); return; } if (cost > Player.money) { @@ -1304,10 +1370,18 @@ function scriptCalculatePercentMoneyHacked(server) { return percentMoneyHacked; } -//Amount of time to execute grow() +//Amount of time to execute grow() in milliseconds function scriptCalculateGrowTime(server) { var difficultyMult = server.requiredHackingSkill * server.hackDifficulty; var skillFactor = (2.5 * difficultyMult + 500) / (Player.hacking_skill + 50); var growTime = skillFactor * Player.hacking_speed_mult * 16; //This is in seconds return growTime * 1000; +} + +//Amount of time to execute weaken() in milliseconds +function scriptCalculateWeakenTime(server) { + var difficultyMult = server.requiredHackingSkill * server.hackDifficulty; + var skillFactor = (2.5 * difficultyMult + 500) / (Player.hacking_skill + 50); + var weakenTime = skillFactor * Player.hacking_speed_mult * 100; //This is in seconds + return weakenTime * 1000; } \ No newline at end of file diff --git a/src/Script.js b/src/Script.js index 3bdd42e1b..95b86816e 100644 --- a/src/Script.js +++ b/src/Script.js @@ -175,6 +175,7 @@ Script.prototype.updateRamUsage = function() { var ifCount = numOccurrences(codeCopy, "if("); var hackCount = numOccurrences(codeCopy, "hack("); var growCount = numOccurrences(codeCopy, "grow("); + var weakenCount = numOccurrences(codeCopy, "weaken("); var nukeCount = numOccurrences(codeCopy, "nuke("); var brutesshCount = numOccurrences(codeCopy, "brutessh("); var ftpcrackCount = numOccurrences(codeCopy, "ftpcrack("); @@ -188,6 +189,7 @@ Script.prototype.updateRamUsage = function() { var getHostnameCount = numOccurrences(codeCopy, "getHostname("); var getHackingLevelCount = numOccurrences(codeCopy, "getHackingLevel("); var getServerMoneyAvailableCount = numOccurrences(codeCopy, "getServerMoneyAvailable("); + var getServerSecurityCount = numOccurrences(codeCopy, "getServerSecurityLevel("); var numOperators = numNetscriptOperators(codeCopy); var purchaseHacknetCount = numOccurrences(codeCopy, "purchaseHacknetNode("); var hacknetnodesArrayCount = numOccurrences(codeCopy, "hacknetnodes["); @@ -201,6 +203,7 @@ Script.prototype.updateRamUsage = function() { (ifCount * CONSTANTS.ScriptIfRamCost) + (hackCount * CONSTANTS.ScriptHackRamCost) + (growCount * CONSTANTS.ScriptGrowRamCost) + + (weakenCount * CONSTANTS.ScriptWeakenRamCost) + (nukeCount * CONSTANTS.ScriptNukeRamCost) + (brutesshCount * CONSTANTS.ScriptBrutesshRamCost) + (ftpcrackCount * CONSTANTS.ScriptFtpcrackRamCost) + @@ -214,6 +217,7 @@ Script.prototype.updateRamUsage = function() { (getHostnameCount * CONSTANTS.ScriptGetHostnameRamCost) + (getHackingLevelCount * CONSTANTS.ScriptGetHackingLevelRamCost) + (getServerMoneyAvailableCount * CONSTANTS.ScriptGetServerMoneyRamCost) + + (getServerSecurityCount * CONSTANTS.ScriptGetServerSecurityRamCost) + (numOperators * CONSTANTS.ScriptOperatorRamCost) + (purchaseHacknetCount * CONSTANTS.ScriptPurchaseHacknetRamCost) + (hacknetnodesArrayCount * CONSTANTS.ScriptHacknetNodesRamCost) + diff --git a/src/Server.js b/src/Server.js index e5ada5f7d..cc3775a9d 100644 --- a/src/Server.js +++ b/src/Server.js @@ -662,7 +662,7 @@ processServerGrowth = function(numCycles) { var numServerGrowthCyclesAdjusted = numServerGrowthCycles * serverGrowthPercentage; //Apply serverGrowth for the calculated number of growth cycles - var serverGrowth = Math.pow(CONSTANTS.ServerGrowthRate, numServerGrowthCyclesAdjusted) * Player.hacking_grow_mult; + var serverGrowth = Math.pow(CONSTANTS.ServerGrowthRate, numServerGrowthCyclesAdjusted * Player.hacking_grow_mult) ; if (serverGrowth < 1) { console.log("WARN: serverGrowth calculated to be less than 1"); serverGrowth = 1; @@ -685,7 +685,7 @@ processSingleServerGrowth = function(server, numCycles) { var numServerGrowthCyclesAdjusted = numServerGrowthCycles * serverGrowthPercentage; //Apply serverGrowth for the calculated number of growth cycles - var serverGrowth = Math.pow(CONSTANTS.ServerGrowthRate, numServerGrowthCyclesAdjusted) * Player.hacking_grow_mult; + var serverGrowth = Math.pow(CONSTANTS.ServerGrowthRate, numServerGrowthCyclesAdjusted * Player.hacking_grow_mult) ; if (serverGrowth < 1) { console.log("WARN: serverGrowth calculated to be less than 1"); serverGrowth = 1; diff --git a/src/Terminal.js b/src/Terminal.js index 6d9d92889..c51f2cf90 100644 --- a/src/Terminal.js +++ b/src/Terminal.js @@ -319,7 +319,7 @@ var Terminal = { else {rootAccess = "NO";} post("Root Access: " + rootAccess); post("Required hacking skill: " + Player.getCurrentServer().requiredHackingSkill); - post("Estimated server security level(1-100): " + formatNumber(addOffset(Player.getCurrentServer().hackDifficulty, 5), 0)); + post("Estimated server security level(1-100): " + formatNumber(addOffset(Player.getCurrentServer().hackDifficulty, 5), 3)); post("Estimated chance to hack: " + formatNumber(addOffset(Player.calculateHackingChance() * 100, 5), 2) + "%"); post("Estimated time to hack: " + formatNumber(addOffset(Player.calculateHackingTime(), 5), 3) + " seconds"); post("Estimated total money available on server: $" + formatNumber(addOffset(Player.getCurrentServer().moneyAvailable, 5), 2));