diff --git a/README.md b/README.md
index 8e016b850..b10681ed3 100644
--- a/README.md
+++ b/README.md
@@ -6,14 +6,13 @@ TESTING TODO:
hack() seems to be working
Sleep() seems to be working
- Creating the foreign server network doesn't seem to be (Fixed it I think? Confirm later)
+ Creating the foreign server network doesn't seem to be working
+ --Seems to be fixed
Script RAM Usage and corresponding terminal commands
If a server has no more money available it cannot be hacked anymore
Should work automatically...because your money gained percentage will be multiplied by 0
When the game is loaded re-load all of the scripts in runningScripts
- - Does not seem to work. Although the addWorkerScript() function itself seems to work
- - LOoks like its because AllServer is an object, so AllServers.length does not work. Have
- to make a custom AllServers.size() function or something oogle it im too tired right now
+ - Seems to be working
Tasks TODO:
Script offline progress
If a script has bad syntax...it fucks everything up when you try to run it so fix that
@@ -23,4 +22,7 @@ Tasks TODO:
Update skill level on cycle
Parse script firs tot see if there are any syntax errors, and tell user if there are (when user calls "run")
Tutorial and help
- Server growth
\ No newline at end of file
+ Server growth
+ Companies
+ Factions
+ Update CONSTANTS.HelpText
\ No newline at end of file
diff --git a/index.html b/index.html
index 4d67dda07..22aa62308 100644
--- a/index.html
+++ b/index.html
@@ -14,6 +14,7 @@
+
diff --git a/src/Constants.js b/src/Constants.js
index b96fa8a52..ca9b76de0 100644
--- a/src/Constants.js
+++ b/src/Constants.js
@@ -5,6 +5,9 @@ CONSTANTS = {
//Time (ms) it takes to run one operation in Netscript.
CodeInstructionRunTime: 1500,
+
+ //Time (seconds) it takes to run one operation in Netscript OFFLINE
+ CodeOfflineExecutionTime: 10,
//Text that is displayed when the 'help' command is ran in Terminal
HelpText: "analyze Get statistics and information about current machine\n" +
diff --git a/src/Netscript/NetscriptWorker.js b/src/Netscript/NetscriptWorker.js
index 3e4c6e0e9..a75eb9bf5 100644
--- a/src/Netscript/NetscriptWorker.js
+++ b/src/Netscript/NetscriptWorker.js
@@ -85,9 +85,6 @@ function killWorkerScript(scriptName, serverIp) {
function addWorkerScript(script, server) {
var filename = script.filename;
- //Add script onto server's runningScripts
- server.runningScripts.push(filename);
-
//Update server's ram usage
server.ramUsed += script.ramUsage;
@@ -98,6 +95,7 @@ function addWorkerScript(script, server) {
s.serverIp = server.ip;
workerScripts.push(s);
console.log("Pushed script onto workerScripts");
+ return;
}
runScriptsLoop();
\ No newline at end of file
diff --git a/src/Player.js b/src/Player.js
index b479a455a..11f501f07 100644
--- a/src/Player.js
+++ b/src/Player.js
@@ -55,12 +55,12 @@ function PlayerObject() {
this.total_money = 0;
this.lifetime_money = 0;
- //Starting (home) computer
+ //IP Address of Starting (home) computer
this.homeComputer = null;
//Servers
- this.currentServer = null; //Server currently being accessed through terminal
- this.discoveredServers = []; //Secret servers not in the network that you have discovered
+ this.currentServer = null; //IP address of Server currently being accessed through terminal
+ this.discoveredServers = []; //IP addresses of secret servers not in the network that you have discovered
this.purchasedServers = [];
//Achievements and achievement progress
diff --git a/src/Script.js b/src/Script.js
index da05b5e98..c2c318c9f 100644
--- a/src/Script.js
+++ b/src/Script.js
@@ -100,10 +100,11 @@ Script.prototype.saveScript = function() {
//TODO Calculate/update number of instructions, ram usage, execution time, etc.
this.updateNumInstructions();
this.updateRamUsage();
+ this.updateExecutionTime();
}
}
-//Calculates the number of instructions, which is just determined by number of semicolons)
+//Calculates the number of instructions, which is just determined by number of semicolons
Script.prototype.updateNumInstructions = function() {
var numSemicolons = this.code.split(";").length - 1;
this.numInstructions = numSemicolons;
@@ -111,11 +112,65 @@ Script.prototype.updateNumInstructions = function() {
//Updates how much RAM the script uses when it is running.
//Right now, it is determined solely by the number of instructions
-//Ideally, I would want it to be based on instructions (e.g. hack() costs a lot but others dont)
+//Ideally, I would want it to be based on type of instructions as well
+// (e.g. hack() costs a lot but others dont)
Script.prototype.updateRamUsage = function() {
this.ramUsage = this.numInstructions * .2;
}
+//Calculate the execution time of the script. This is used to calculate how much a script
+//generates when the user is offline
+//This is calculated based on the number of instructions and any calls to hack().
+//Every instruction takes a flat time of X seconds (defined in Constants.js)
+//Every hack instructions takes an ADDITIONAl time of however long it takes to hack that server
+Script.prototype.updateExecutionTime = function() {
+ /*
+ var executionTime = 0;
+
+ //Ever instruction takes CONSTANTS.CodeOfflineExecutionTime seconds
+ console.log("numInstructions: " + this.numInstructions.toString());
+ executionTime += (this.numInstrutions * CONSTANTS.CodeOfflineExecutionTime);
+ console.log("ExecutionTime after taking into account instructions: " + executionTime.toString());
+
+ //Search the code's text for every occurrence of hack()
+ hackIndices = getIndicesOf('hack("', this.code, true);
+ for (var i = 0; i < hackIndices.length; ++i) {
+ //Get the full hack() call substring
+ var startIndex = hackIndices[i];
+ console.log("startIndex: " + startIndex.toString());
+ var endIndex = startIndex;
+
+ while (this.code.substr(endIndex, 2) != ");") {
+ console.log("endIndex: " + endIndex.toString());
+ ++endIndex;
+ if (endIndex == this.code.length - 1) {
+ //Bad code...
+ console.log("Could not find ending to hack call");
+ return;
+ }
+ }
+ ++endIndex; // This puts endIndex at the semicolon
+
+ var hackCall = this.code.substring(startIndex, endIndex);
+ console.log("hackCall: " + hackCall);
+ var argument = hackCall.match(/"([^']+)"/)[1]; //Extract the argument, which must be btw 2 quotes
+
+ //Check if its an ip or a hostname. Then get the server and calculate hack time accordingly
+ var server = null;
+ if (isValidIPAddress(argument)) {
+ server = AllServers[argument];
+ } else {
+ server = GetServerByHostname(argument);
+ }
+ console.log("Server hostname: " + server.hostname);
+ executionTime += scriptCalculateHackingTime(server);
+ }
+
+ this.executionTimeMillis = executionTime * 1000;
+ console.log("Script calculated to have an offline execution time of " + executionTime.toString() + "seconds");
+ */
+}
+
Script.prototype.toJSON = function() {
return Generic_toJSON("Script", this);
}
@@ -129,15 +184,18 @@ Reviver.constructors.Script = Script;
//Called when the game is loaded. Loads all running scripts (from all servers)
//into worker scripts so that they will start running
-function loadAllRunningScripts() {
+loadAllRunningScripts = function() {
var count = 0;
- console.log("AllServers.length: " + AllServers.length);
- for (var i = 0; i < AllServers.length; i++) {
- var server = AllServers[i];
- console.log("Loading scripts from server " + server.hostname);
- for (var j = 0; j < server.runningScripts.length; j++) {
- count++;
- addWorkerScript(server.runningScripts[j], server);
+ for (var property in AllServers) {
+ if (AllServers.hasOwnProperty(property)) {
+ var server = AllServers[property];
+ for (var j = 0; j < server.runningScripts.length; ++j) {
+ count++;
+ //runningScripts array contains only names, so find the actual script object
+ var script = server.getScript(server.runningScripts[j]);
+ if (script == null) {continue;}
+ addWorkerScript(script, server);
+ }
}
}
console.log("Loaded " + count.toString() + " running scripts");
diff --git a/src/Server.js b/src/Server.js
index 7149fd06a..96ae729f6 100644
--- a/src/Server.js
+++ b/src/Server.js
@@ -89,6 +89,17 @@ Server.prototype.getServerOnNetwork = function(i) {
return AllServers[this.serversOnNetwork[i]];
}
+//Given the name of the script, returns the corresponding
+//script object on the server (if it exists)
+Server.prototype.getScript = function(scriptName) {
+ for (var i = 0; i < this.scripts.length; i++) {
+ if (this.scripts[i].filename == scriptName) {
+ return this.scripts[i];
+ }
+ }
+ return null;
+}
+
//Functions for loading and saving a Server
Server.prototype.toJSON = function() {
return Generic_toJSON("Server", this);
@@ -102,7 +113,7 @@ Reviver.constructors.Server = Server;
-world_daemon: new Server(), //Final server for 2nd tier prestige. Discover that the world is a simulation
+//world_daemon: new Server(), //Final server for 2nd tier prestige. Discover that the world is a simulation
/* Initialization */
@@ -599,6 +610,14 @@ initForeignServers = function() {
//List of all servers that exist in the game, indexed by their ip
AllServers = {};
+SizeOfAllServers = function() {
+ var size = 0, key;
+ for (key in AllServers) {
+ if (AllServers.hasOwnProperty(key)) size++;
+ }
+ return size;
+}
+
//Add a server onto the map of all servers in the game
AddToAllServers = function(server) {
var serverIp = server.ip;
@@ -612,6 +631,19 @@ AddToAllServers = function(server) {
AllServers[serverIp] = server;
}
+//Returns server object with corresponding hostname
+// Relatively slow, would rather not use this a lot
+GetServerByHostname = function(hostname) {
+ for (var ip in AllServers) {
+ if (AllServers.hasOwnProperty(ip)) {
+ if (AllServers[ip].hostname == hostname) {
+ return AllServers[i];
+ }
+ }
+ }
+ return null;
+}
+
//Debugging tool
PrintAllServers = function() {
for (var ip in AllServers) {
diff --git a/src/Terminal.js b/src/Terminal.js
index e92157061..f82ffb541 100644
--- a/src/Terminal.js
+++ b/src/Terminal.js
@@ -257,7 +257,11 @@ var Terminal = {
}
break;
case "help":
- //TODO
+ if (commandArray.length != 1) {
+ post("Incorrect usage of help command. Usage: help"); return;
+ }
+
+ post(CONSTANTS.HelpText);
break;
case "home":
//TODO return to home computer
@@ -510,6 +514,7 @@ var Terminal = {
}else {
//Able to run script
var script = server.scripts[i];
+ server.runningScripts.push(script.filename); //Push onto runningScripts
addWorkerScript(script, server);
return;
}
diff --git a/src/engine.js b/src/engine.js
index 237db5e24..1ae63dd06 100644
--- a/src/engine.js
+++ b/src/engine.js
@@ -247,7 +247,9 @@ var Engine = {
console.log("Loaded game from save");
Companies.init();
CompanyPositions.init();
+ console.log("Calling loadAllRunningScripts()");
loadAllRunningScripts();
+ console.log("Finished calling loadAllRunningScripts()");
} else {
//No save found, start new game
console.log("Initializing new game");