diff --git a/src/Constants.js b/src/Constants.js index b4307cca3..8d713fbe4 100644 --- a/src/Constants.js +++ b/src/Constants.js @@ -54,9 +54,12 @@ CONSTANTS = { ScriptScpRamCost: 0.5, ScriptHasRootAccessRamCost: 0.05, ScriptGetHostnameRamCost: 0.1, - ScriptGetHackingLevelRamCost: 0.1, + ScriptGetHackingLevelRamCost: 0.05, ScriptGetServerMoneyRamCost: 0.1, - ScriptGetServerSecurityRamCost: 0.2, + ScriptGetServerSecurityRamCost: 0.1, + ScriptGetServerReqdHackRamCost: 0.1, + ScriptFileExistsRamCost: 0.1, + ScriptIsRunningRamCost: 0.1, ScriptOperatorRamCost: 0.01, ScriptPurchaseHacknetRamCost: 1.5, ScriptHacknetNodesRamCost: 1.0, //Base cost for accessing hacknet nodes array @@ -349,11 +352,19 @@ CONSTANTS = { "The first argument must be a string with the name of the file. A file can either be a script or a program. A script name is case-sensitive, but a " + "program is not. For example, fileExists('brutessh.exe') will work fine, even though the actual program is named BruteSSH.exe.

" + "The second argument is a string with the hostname or IP of the server on which to search for the program. This second argument is optional. " + - "If it is not specified, then the function will search through the current server for the file.
" + + "If it is omitted, then the function will search through the current server (the server running the script that calls this function) for the file.
" + "Example: fileExists('foo.script', 'foodnstuff');
" + "Example: fileExists('ftpcrack.exe');

" + "The first example above will return true if the script named 'foo.script' exists on the 'foodnstuff' server, and false otherwise. The second example above will " + - "return true if the current server (the server on which the script is running) contains the FTPCrack.exe program, and false otherwise.

" + + "return true if the current server (the server on which this function runs) contains the FTPCrack.exe program, and false otherwise.

" + + "isRunning(filename, [hostname/ip])
Returns a boolean (true or false) indicating whether the specified script is running on a server. " + + "The first argument must be a string with the name of the script. The script name is case sensitive. The second argument is a string with the " + + "hostname or IP of the target server. The function will check whether the script is running on that target server. The second argument is optional. " + + "If it is omitted, then the function will check if the script is running on the current server (the server running the script that calls this function).
" + + "Example: isRunning('foo.script', 'foodnstuff');
" + + "Example: isRunning('foo.script');

" + + "The first example above will return true if there is a script called 'foo.script' is running on the 'foodnstuff' server, and false otherwise. The second " + + "example above will return true if there is a script called 'foo.script' running on the current server, and false otherwise.

" + "purchaseHacknetNode()
Purchases a new Hacknet Node. Returns a number with the index of the Hacknet Node. This index is equivalent to the number " + "at the end of the Hacknet Node's name (e.g The Hacknet Node named 'hacknet-node-4' will have an index of 4). If the player cannot afford to purchase " + "a new Hacknet Node then the function will return false. Does NOT work offline

" + diff --git a/src/NetscriptEvaluator.js b/src/NetscriptEvaluator.js index 7d40e3ebf..2100db5cc 100644 --- a/src/NetscriptEvaluator.js +++ b/src/NetscriptEvaluator.js @@ -123,9 +123,9 @@ function evaluate(exp, workerScript) { var sleepTimePromise = evaluate(exp.args[0], workerScript); sleepTimePromise.then(function(sleepTime) { workerScript.scriptRef.log("Sleeping for " + sleepTime + " milliseconds"); - setTimeout(function() { + return netscriptDelay(sleepTime).then(function() { return Promise.resolve(true); - }, sleepTime); + }); }).then(function(res) { resolve(true); }).catch(function(e) { @@ -412,7 +412,41 @@ function evaluate(exp, workerScript) { if (Player.hasProgram(filename)) { return resolve(true); } - return reject(false); + return resolve(false); + }).catch(function(e) { + reject(e); + }); + } else if (exp.func.value == "isRunning") { + if (exp.args.length != 1 && exp.args.length != 2) { + return reject(makeRuntimeRejectMsg(workerScript, "isRunning() call has incorrect number of arguments. Takes 1 or 2 arguments")); + } + var argPromises = exp.args.map(function(arg) { + return evaluate(arg, workerScript); + }); + + var filename = ""; + Promise.all(argPromises).then(function(args) { + if (env.stopFlag) {return reject(workerScript);} + filename = args[0]; + if (exp.args.length == 2) { + return Promise.resolve(workerScript.serverIp); + } else { + return evaluate(exp.args[1], workerScript); + } + }).then(function(ip) { + var server = getServer(ip); + if (server == null) { + workerScript.scriptRef.log("isRunning() failed. Invalid IP or hostname passed in: " + ip); + return reject(makeRuntimeRejectMsg(workerScript, "Invalid IP or hostname passed into isRunning() command")); + } + + for (var i = 0; i < server.runningScripts.length; ++i) { + if (filename == server.runningScripts[i]) { + return resolve(true); + } + } + + return resolve(false); }).catch(function(e) { reject(e); }); diff --git a/src/Script.js b/src/Script.js index eb96aae70..84c785732 100644 --- a/src/Script.js +++ b/src/Script.js @@ -228,6 +228,9 @@ Script.prototype.updateRamUsage = function() { var getHackingLevelCount = numOccurrences(codeCopy, "getHackingLevel("); var getServerMoneyAvailableCount = numOccurrences(codeCopy, "getServerMoneyAvailable("); var getServerSecurityCount = numOccurrences(codeCopy, "getServerSecurityLevel("); + var getServerReqdHackingCount = numOccurrences(codeCopy, "getServerRequiredHackingLevel("); + var fileExistsCount = numOccurrences(codeCopy, "fileExists("); + var isRunningCount = numOccurrences(codeCopy, "isRunning("); var numOperators = numNetscriptOperators(codeCopy); var purchaseHacknetCount = numOccurrences(codeCopy, "purchaseHacknetNode("); var hacknetnodesArrayCount = numOccurrences(codeCopy, "hacknetnodes["); @@ -256,6 +259,9 @@ Script.prototype.updateRamUsage = function() { (getHackingLevelCount * CONSTANTS.ScriptGetHackingLevelRamCost) + (getServerMoneyAvailableCount * CONSTANTS.ScriptGetServerMoneyRamCost) + (getServerSecurityCount * CONSTANTS.ScriptGetServerSecurityRamCost) + + (getServerReqdHackingCount * CONSTANTS.ScriptGetServerReqdHackRamCost) + + (fileExistsCount * CONSTANTS.ScriptFileExistsRamCost) + + (isRunningCount * CONSTANTS.ScriptIsRunningRamCost) + (numOperators * CONSTANTS.ScriptOperatorRamCost) + (purchaseHacknetCount * CONSTANTS.ScriptPurchaseHacknetRamCost) + (hacknetnodesArrayCount * CONSTANTS.ScriptHacknetNodesRamCost) +