Added threading capabilities when running manually. Need to add for run(0 and exec() in netscript. Also fixed some bugs

This commit is contained in:
Daniel Xie 2017-06-10 20:46:02 -05:00
parent 60207b8e04
commit c55b677bc2
8 changed files with 84 additions and 41 deletions

@ -190,8 +190,7 @@ function createActiveScriptsText(workerscript, item) {
var itemText = document.createElement("p"); var itemText = document.createElement("p");
//Server ip/hostname //Server ip/hostname
var hostname = workerscript.getServer().hostname; var serverIpHostname = "Threads: " + workerscript.scriptRef.threads;
var serverIpHostname = "Server: " + hostname + "(" + workerscript.serverIp + ")";
//Online //Online
var onlineTotalMoneyMade = "Total online production: $" + formatNumber(workerscript.scriptRef.onlineMoneyMade, 2); var onlineTotalMoneyMade = "Total online production: $" + formatNumber(workerscript.scriptRef.onlineMoneyMade, 2);

@ -1476,7 +1476,6 @@ applyAugmentation = function(aug, reapply=false) {
Player.defense_mult *= 1.8; Player.defense_mult *= 1.8;
break; break;
case AugmentationNames.CombatRib1: case AugmentationNames.CombatRib1:
//Str and Defense 5%
Player.strength_mult *= 1.15; Player.strength_mult *= 1.15;
Player.defense_mult *= 1.15; Player.defense_mult *= 1.15;
break; break;

@ -6,6 +6,8 @@
//wait for that promise to finish before continuing //wait for that promise to finish before continuing
function evaluate(exp, workerScript) { function evaluate(exp, workerScript) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
var threads = workerScript.scriptRef.threads;
if (isNaN(threads) || threads < 1) {threads = 1;}
var env = workerScript.env; var env = workerScript.env;
if (env.stopFlag) {return reject(workerScript);} if (env.stopFlag) {return reject(workerScript);}
if (exp == null) { if (exp == null) {
@ -48,7 +50,6 @@ function evaluate(exp, workerScript) {
//Do array stuff here //Do array stuff here
var iPromise = evaluate(exp.index.value, workerScript); var iPromise = evaluate(exp.index.value, workerScript);
iPromise.then(function(i) { iPromise.then(function(i) {
console.log("Index resolved with value: " + i);
if (i >= res.length || i < 0) { if (i >= res.length || i < 0) {
return reject(makeRuntimeRejectMsg(workerScript, "Out of bounds: Invalid index in [] operator")); return reject(makeRuntimeRejectMsg(workerScript, "Out of bounds: Invalid index in [] operator"));
} else { } else {

@ -43,6 +43,8 @@ function netscriptBinary(exp, workerScript) {
function netscriptHack(exp, workerScript) { function netscriptHack(exp, workerScript) {
var env = workerScript.env; var env = workerScript.env;
if (env.stopFlag) {return Promise.reject(workerScript);} if (env.stopFlag) {return Promise.reject(workerScript);}
var threads = workerScript.scriptRef.threads;
if (isNaN(threads) || threads < 1) {threads = 1;}
if (exp.args.length != 1) { if (exp.args.length != 1) {
return Promise.reject(makeRuntimeRejectMsg(workerScript, "Hack() call has incorrect number of arguments. Takes 1 argument")); return Promise.reject(makeRuntimeRejectMsg(workerScript, "Hack() call has incorrect number of arguments. Takes 1 argument"));
@ -69,19 +71,19 @@ function netscriptHack(exp, workerScript) {
return Promise.reject(makeRuntimeRejectMsg(workerScript, "Script crashed because player's hacking skill is not high enough to hack " + server.hostname)); return Promise.reject(makeRuntimeRejectMsg(workerScript, "Script crashed because player's hacking skill is not high enough to hack " + server.hostname));
} }
workerScript.scriptRef.log("Attempting to hack " + ip + " in " + hackingTime.toFixed(3) + " seconds"); workerScript.scriptRef.log("Attempting to hack " + ip + " in " + hackingTime.toFixed(3) + " seconds (t=" + threads + ")");
return Promise.resolve([server, hackingTime]); return Promise.resolve([server, hackingTime]);
}).then(function([server, hackingTime]) { }).then(function([server, hackingTime]) {
console.log("Hacking " + server.hostname + " after " + hackingTime.toString() + " seconds."); console.log("Hacking " + server.hostname + " after " + hackingTime.toString() + " seconds (t=" + threads + ")");
return netscriptDelay(hackingTime* 1000).then(function() { return netscriptDelay(hackingTime* 1000).then(function() {
if (env.stopFlag) {return Promise.reject(workerScript);} if (env.stopFlag) {return Promise.reject(workerScript);}
var hackChance = scriptCalculateHackingChance(server); var hackChance = scriptCalculateHackingChance(server);
var rand = Math.random(); var rand = Math.random();
var expGainedOnSuccess = scriptCalculateExpGain(server); var expGainedOnSuccess = scriptCalculateExpGain(server) * threads;
var expGainedOnFailure = (expGainedOnSuccess / 4); var expGainedOnFailure = (expGainedOnSuccess / 4);
if (rand < hackChance) { //Success! if (rand < hackChance) { //Success!
var moneyGained = scriptCalculatePercentMoneyHacked(server); var moneyGained = scriptCalculatePercentMoneyHacked(server);
moneyGained = Math.floor(server.moneyAvailable * moneyGained); moneyGained = Math.floor(server.moneyAvailable * moneyGained) * threads;
//Safety check //Safety check
if (moneyGained <= 0) {moneyGained = 0;} if (moneyGained <= 0) {moneyGained = 0;}
@ -89,21 +91,19 @@ function netscriptHack(exp, workerScript) {
server.moneyAvailable -= moneyGained; server.moneyAvailable -= moneyGained;
Player.gainMoney(moneyGained); Player.gainMoney(moneyGained);
workerScript.scriptRef.onlineMoneyMade += moneyGained; workerScript.scriptRef.onlineMoneyMade += moneyGained;
workerScript.scriptRef.recordHack(server.ip, moneyGained); workerScript.scriptRef.recordHack(server.ip, moneyGained, threads);
Player.gainHackingExp(expGainedOnSuccess); Player.gainHackingExp(expGainedOnSuccess);
workerScript.scriptRef.onlineExpGained += expGainedOnSuccess; workerScript.scriptRef.onlineExpGained += expGainedOnSuccess;
console.log("Script successfully hacked " + server.hostname + " for $" + formatNumber(moneyGained, 2) + " and " + formatNumber(expGainedOnSuccess, 4) + " exp"); console.log("Script successfully hacked " + server.hostname + " for $" + formatNumber(moneyGained, 2) + " and " + formatNumber(expGainedOnSuccess, 4) + " exp");
workerScript.scriptRef.log("Script SUCCESSFULLY hacked " + server.hostname + " for $" + formatNumber(moneyGained, 2) + " and " + formatNumber(expGainedOnSuccess, 4) + " exp"); workerScript.scriptRef.log("Script SUCCESSFULLY hacked " + server.hostname + " for $" + formatNumber(moneyGained, 2) + " and " + formatNumber(expGainedOnSuccess, 4) + " exp (t=" + threads + ")");
server.fortify(CONSTANTS.ServerFortifyAmount); server.fortify(CONSTANTS.ServerFortifyAmount * threads);
return Promise.resolve(true); return Promise.resolve(true);
} else { } else {
//Player only gains 25% exp for failure? TODO Can change this later to balance //Player only gains 25% exp for failure? TODO Can change this later to balance
Player.gainHackingExp(expGainedOnFailure); Player.gainHackingExp(expGainedOnFailure);
workerScript.scriptRef.onlineExpGained += expGainedOnFailure; workerScript.scriptRef.onlineExpGained += expGainedOnFailure;
console.log("Script unsuccessful to hack " + server.hostname + ". Gained " + formatNumber(expGainedOnFailure, 4) + " exp"); console.log("Script unsuccessful to hack " + server.hostname + ". Gained " + formatNumber(expGainedOnFailure, 4) + " exp");
workerScript.scriptRef.log("Script FAILED to hack " + server.hostname + ". Gained " + formatNumber(expGainedOnFailure, 4) + " exp"); workerScript.scriptRef.log("Script FAILED to hack " + server.hostname + ". Gained " + formatNumber(expGainedOnFailure, 4) + " exp (t=" + threads + ")");
return Promise.resolve(false); return Promise.resolve(false);
} }
}); });
@ -117,6 +117,8 @@ function netscriptHack(exp, workerScript) {
function netscriptGrow(exp, workerScript) { function netscriptGrow(exp, workerScript) {
var env = workerScript.env; var env = workerScript.env;
if (env.stopFlag) {return Promise.reject(workerScript);} if (env.stopFlag) {return Promise.reject(workerScript);}
var threads = workerScript.scriptRef.threads;
if (isNaN(threads) || threads < 1) {threads = 1;}
if (exp.args.length != 1) { if (exp.args.length != 1) {
return Promise.reject(makeRuntimeRejectMsg(workerScript, "grow() call has incorrect number of arguments. Takes 1 argument")); return Promise.reject(makeRuntimeRejectMsg(workerScript, "grow() call has incorrect number of arguments. Takes 1 argument"));
} }
@ -137,20 +139,20 @@ function netscriptGrow(exp, workerScript) {
var growTime = scriptCalculateGrowTime(server); var growTime = scriptCalculateGrowTime(server);
console.log("Executing grow() on server " + server.hostname + " in " + formatNumber(growTime/1000, 3) + " seconds") console.log("Executing grow() on server " + server.hostname + " in " + formatNumber(growTime/1000, 3) + " seconds")
workerScript.scriptRef.log("Executing grow() on server " + server.hostname + " in " + formatNumber(growTime/1000, 3) + " seconds"); workerScript.scriptRef.log("Executing grow() on server " + server.hostname + " in " + formatNumber(growTime/1000, 3) + " seconds (t=" + threads + ")");
return Promise.resolve([server, growTime]); return Promise.resolve([server, growTime]);
}).then(function([server, growTime]) { }).then(function([server, growTime]) {
if (env.stopFlag) {return Promise.reject(workerScript);} if (env.stopFlag) {return Promise.reject(workerScript);}
return netscriptDelay(growTime).then(function() { return netscriptDelay(growTime).then(function() {
if (env.stopFlag) {return Promise.reject(workerScript);} if (env.stopFlag) {return Promise.reject(workerScript);}
server.moneyAvailable += 1; //It can be grown even if it has no money server.moneyAvailable += (1 * threads); //It can be grown even if it has no money
var growthPercentage = processSingleServerGrowth(server, 450); var growthPercentage = processSingleServerGrowth(server, 450 * threads);
workerScript.scriptRef.recordGrow(server.ip); workerScript.scriptRef.recordGrow(server.ip, threads);
var expGain = 0.5 * Player.hacking_exp_mult; var expGain = 0.5 * Player.hacking_exp_mult * threads;
workerScript.scriptRef.log("Available money on " + server.hostname + " grown by " workerScript.scriptRef.log("Available money on " + server.hostname + " grown by "
+ formatNumber(growthPercentage*100 - 100, 6) + "%. Gained " + + formatNumber(growthPercentage*100 - 100, 6) + "%. Gained " +
formatNumber(expGain, 4) + " hacking exp"); formatNumber(expGain, 4) + " hacking exp (t=" + threads +")");
workerScript.scriptRef.onlineExpGained += expGain; workerScript.scriptRef.onlineExpGained += expGain;
Player.gainHackingExp(expGain); Player.gainHackingExp(expGain);
return Promise.resolve(growthPercentage); return Promise.resolve(growthPercentage);
@ -165,6 +167,8 @@ function netscriptGrow(exp, workerScript) {
function netscriptWeaken(exp, workerScript) { function netscriptWeaken(exp, workerScript) {
var env = workerScript.env; var env = workerScript.env;
if (env.stopFlag) {return Promise.reject(workerScript);} if (env.stopFlag) {return Promise.reject(workerScript);}
var threads = workerScript.scriptRef.threads;
if (isNaN(threads) || threads < 1) {threads = 1;}
if (exp.args.length != 1) { if (exp.args.length != 1) {
return Promise.reject(makeRuntimeRejectMsg(workerScript, "weaken() call has incorrect number of arguments. Takes 1 argument")); return Promise.reject(makeRuntimeRejectMsg(workerScript, "weaken() call has incorrect number of arguments. Takes 1 argument"));
} }
@ -185,21 +189,22 @@ function netscriptWeaken(exp, workerScript) {
var weakenTime = scriptCalculateWeakenTime(server); var weakenTime = scriptCalculateWeakenTime(server);
console.log("Executing weaken() on server " + server.hostname + " in " + formatNumber(weakenTime/1000, 3) + " seconds") 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"); workerScript.scriptRef.log("Executing weaken() on server " + server.hostname + " in " +
formatNumber(weakenTime/1000, 3) + " seconds (t=" + threads + ")");
return Promise.resolve([server, weakenTime]); return Promise.resolve([server, weakenTime]);
}).then(function([server, weakenTime]) { }).then(function([server, weakenTime]) {
if (env.stopFlag) {return Promise.reject(workerScript);} if (env.stopFlag) {return Promise.reject(workerScript);}
return netscriptDelay(weakenTime).then(function() { return netscriptDelay(weakenTime).then(function() {
if (env.stopFlag) {return Promise.reject(workerScript);} if (env.stopFlag) {return Promise.reject(workerScript);}
server.weaken(CONSTANTS.ServerWeakenAmount); server.weaken(CONSTANTS.ServerWeakenAmount * threads);
workerScript.scriptRef.recordWeaken(server.ip); workerScript.scriptRef.recordWeaken(server.ip, threads);
var expGain = 3 * Player.hacking_exp_mult; var expGain = 3 * Player.hacking_exp_mult * threads;
workerScript.scriptRef.log("Server security level on " + server.hostname + " weakened to " + server.hackDifficulty + workerScript.scriptRef.log("Server security level on " + server.hostname + " weakened to " + server.hackDifficulty +
". Gained " + formatNumber(expGain, 4) + " hacking exp"); ". Gained " + formatNumber(expGain, 4) + " hacking exp (t=" + threads + ")");
workerScript.scriptRef.onlineExpGained += expGain; workerScript.scriptRef.onlineExpGained += expGain;
Player.gainHackingExp(expGain); Player.gainHackingExp(expGain);
return Promise.resolve(CONSTANTS.ServerWeakenAmount); return Promise.resolve(CONSTANTS.ServerWeakenAmount * threads);
}); });
}).then(function(res) { }).then(function(res) {
return Promise.resolve(res); return Promise.resolve(res);

@ -165,14 +165,15 @@ function addWorkerScript(script, server) {
var filename = script.filename; var filename = script.filename;
//Update server's ram usage //Update server's ram usage
server.ramUsed += script.ramUsage; var ramUsage = script.ramUsage * script.threads * Math.pow(1.02, script.threads-1);
server.ramUsed += ramUsage;
//Create the WorkerScript //Create the WorkerScript
var s = new WorkerScript(script); var s = new WorkerScript(script);
s.name = filename; s.name = filename;
s.code = script.code; s.code = script.code;
s.serverIp = server.ip; s.serverIp = server.ip;
s.ramUsage = script.ramUsage; s.ramUsage = ramUsage;
//Add the WorkerScript to the Active Scripts list //Add the WorkerScript to the Active Scripts list
addActiveScriptsItem(s); addActiveScriptsItem(s);

@ -126,6 +126,8 @@ function Script() {
this.numTimesHackMap = new AllServersMap(); this.numTimesHackMap = new AllServersMap();
this.numTimesGrowMap = new AllServersMap(); this.numTimesGrowMap = new AllServersMap();
this.numTimesWeakenMap = new AllServersMap(); this.numTimesWeakenMap = new AllServersMap();
this.threads = 1;
}; };
//Get the script data from the Script Editor and save it to the object //Get the script data from the Script Editor and save it to the object
@ -291,7 +293,7 @@ Script.prototype.displayLog = function() {
} }
//Update the moneyStolen and numTimesHack maps when hacking //Update the moneyStolen and numTimesHack maps when hacking
Script.prototype.recordHack = function(serverIp, moneyGained) { Script.prototype.recordHack = function(serverIp, moneyGained, n=1) {
if (this.moneyStolenMap == null) { if (this.moneyStolenMap == null) {
this.moneyStolenMap = new AllServersMap(); this.moneyStolenMap = new AllServersMap();
} }
@ -299,23 +301,23 @@ Script.prototype.recordHack = function(serverIp, moneyGained) {
this.numTimesHackMap = new AllServersMap(); this.numTimesHackMap = new AllServersMap();
} }
this.moneyStolenMap[serverIp] += moneyGained; this.moneyStolenMap[serverIp] += moneyGained;
this.numTimesHackMap[serverIp] += 1; this.numTimesHackMap[serverIp] += n;
} }
//Update the grow map when calling grow() //Update the grow map when calling grow()
Script.prototype.recordGrow = function(serverIp) { Script.prototype.recordGrow = function(serverIp, n=1) {
if (this.numTimesGrowMap == null) { if (this.numTimesGrowMap == null) {
this.numTimesGrowMap = new AllServersMap(); this.numTimesGrowMap = new AllServersMap();
} }
this.numTimesGrowMap[serverIp] += 1; this.numTimesGrowMap[serverIp] += n;
} }
//Update the weaken map when calling weaken() { //Update the weaken map when calling weaken() {
Script.prototype.recordWeaken = function(serverIp) { Script.prototype.recordWeaken = function(serverIp, n=1) {
if (this.numTimesWeakenMap == null) { if (this.numTimesWeakenMap == null) {
this.numTimesWeakenMap = new AllServersMap(); this.numTimesWeakenMap = new AllServersMap();
} }
this.numTimesWeakenMap[serverIp] += 1; this.numTimesWeakenMap[serverIp] += n;
} }
Script.prototype.toJSON = function() { Script.prototype.toJSON = function() {

@ -464,8 +464,8 @@ initForeignServers = function() {
AddToAllServers(HongFangTeaHouseServer); AddToAllServers(HongFangTeaHouseServer);
var HaraKiriSushiBarServer = new Server(); var HaraKiriSushiBarServer = new Server();
HaraKiriSushiBarServer.setHackingParameters(40, 3500000, 15, 40);
HaraKiriSushiBarServer.init(createRandomIp(), "harakiri-sushi", "HaraKiri Sushi Bar Network", true, false, false, false, 4); HaraKiriSushiBarServer.init(createRandomIp(), "harakiri-sushi", "HaraKiri Sushi Bar Network", true, false, false, false, 4);
HaraKiriSushiBarServer.setHackingParameters(40, 3500000, 15, 40);
HaraKiriSushiBarServer.setPortProperties(0); HaraKiriSushiBarServer.setPortProperties(0);
AddToAllServers(HaraKiriSushiBarServer); AddToAllServers(HaraKiriSushiBarServer);
@ -527,7 +527,7 @@ initForeignServers = function() {
SpecialServerIps.addIp(SpecialServerNames.BitRunnersServer, BitRunnersServer.ip); SpecialServerIps.addIp(SpecialServerNames.BitRunnersServer, BitRunnersServer.ip);
var TheBlackHandServer = new Server(); var TheBlackHandServer = new Server();
TheBlackHandServer.init(createRandomIp(), "I.I.I.I", "I.I.I.I", true, false, false, false, false, 0); TheBlackHandServer.init(createRandomIp(), "I.I.I.I", "I.I.I.I", true, false, false, false, 0);
TheBlackHandServer.setHackingParameters(getRandomInt(303, 325), 0, 0, 0); TheBlackHandServer.setHackingParameters(getRandomInt(303, 325), 0, 0, 0);
TheBlackHandServer.setPortProperties(3); TheBlackHandServer.setPortProperties(3);
AddToAllServers(TheBlackHandServer); AddToAllServers(TheBlackHandServer);

@ -733,10 +733,28 @@ var Terminal = {
post("Incorrect usage of mem command. usage: mem [scriptname]"); return; post("Incorrect usage of mem command. usage: mem [scriptname]"); return;
} }
var scriptName = commandArray[1]; var scriptName = commandArray[1];
var numThreads = 1;
if (scriptName.indexOf(" -t ") != -1) {
var results = scriptName.split(" ");
if (results.length != 3) {
post("Invalid use of run command. Usage: mem [script] [-t] [number threads]");
return;
}
numThreads = Math.round(Number(results[2]));
if (isNaN(numThreads) || numThreads < 1) {
post("Invalid number of threads specified. Number of threads must be greater than 1");
return;
}
scriptName = results[0];
}
var currServ = Player.getCurrentServer(); var currServ = Player.getCurrentServer();
for (var i = 0; i < currServ.scripts.length; ++i) { for (var i = 0; i < currServ.scripts.length; ++i) {
if (scriptName == currServ.scripts[i].filename) { if (scriptName == currServ.scripts[i].filename) {
post("This script requires " + formatNumber(currServ.scripts[i].ramUsage, 2) + "GB of RAM to run"); var scriptBaseRamUsage = currServ.scripts[i].ramUsage;
var ramUsage = scriptBaseRamUsage * numThreads * Math.pow(1.02, numThreads-1);
post("This script requires " + formatNumber(ramUsage, 2) + "GB of RAM to run for " + numThreads + " thread(s)");
return; return;
} }
} }
@ -1143,23 +1161,41 @@ var Terminal = {
} }
} }
var numThreads = 1;
//Get the number of threads
if (scriptName.indexOf(" -t ") != -1) {
var results = scriptName.split(" ");
if (results.length != 3) {
post("Invalid use of run command. Usage: run [script] [-t] [number threads]");
return;
}
numThreads = Math.round(Number(results[2]));
if (isNaN(numThreads) || numThreads < 1) {
post("Invalid number of threads specified. Number of threads must be greater than 0");
return;
}
scriptName = results[0];
}
//Check if the script exists and if it does run it //Check if the script exists and if it does run it
for (var i = 0; i < server.scripts.length; i++) { for (var i = 0; i < server.scripts.length; i++) {
if (server.scripts[i].filename == scriptName) { if (server.scripts[i].filename == scriptName) {
//Check for admin rights and that there is enough RAM availble to run //Check for admin rights and that there is enough RAM availble to run
var ramUsage = server.scripts[i].ramUsage; var script = server.scripts[i];
script.threads = numThreads;
var ramUsage = script.ramUsage * numThreads * Math.pow(1.02, numThreads-1);
var ramAvailable = server.maxRam - server.ramUsed; var ramAvailable = server.maxRam - server.ramUsed;
if (server.hasAdminRights == false) { if (server.hasAdminRights == false) {
post("Need root access to run script"); post("Need root access to run script");
return; return;
} else if (ramUsage > ramAvailable){ } else if (ramUsage > ramAvailable){
post("This machine does not have enough RAM to run this script. Script requires " + ramUsage + "GB of RAM"); post("This machine does not have enough RAM to run this script with " +
script.threads + " threads. Script requires " + ramUsage + "GB of RAM");
return; return;
}else { }else {
//Able to run script //Able to run script
post("Running script. May take a few seconds to start up the process..."); post("Running script with " + script.threads + " thread(s). May take a few seconds to start up the process...");
var script = server.scripts[i];
server.runningScripts.push(script.filename); //Push onto runningScripts server.runningScripts.push(script.filename); //Push onto runningScripts
addWorkerScript(script, server); addWorkerScript(script, server);
return; return;