2016-11-17 23:25:40 +01:00
/ * E v a l u a t o r
* Evaluates the Abstract Syntax Tree for Netscript
* generated by the Parser class
* /
2016-11-30 00:07:24 +01:00
// Evaluator should return a Promise, so that any call to evaluate() can just
//wait for that promise to finish before continuing
function evaluate ( exp , workerScript ) {
2017-06-05 06:48:37 +02:00
return new Promise ( function ( resolve , reject ) {
2016-11-30 00:07:24 +01:00
var env = workerScript . env ;
2017-06-05 06:48:37 +02:00
if ( env . stopFlag ) { return reject ( workerScript ) ; }
2017-05-01 07:39:48 +02:00
if ( exp == null ) {
2017-06-05 06:48:37 +02:00
return reject ( makeRuntimeRejectMsg ( workerScript , "Error: NULL expression" ) ) ;
2017-05-01 07:39:48 +02:00
}
2017-06-05 06:48:37 +02:00
setTimeout ( function ( ) {
if ( env . stopFlag ) { return reject ( workerScript ) ; }
switch ( exp . type ) {
case "num" :
case "str" :
case "bool" :
resolve ( exp . value ) ;
break ;
case "var" :
2017-05-25 14:18:34 +02:00
if ( exp . value == "hacknetnodes" ) {
2017-06-05 06:48:37 +02:00
var pEvaluateHacknetNode = evaluateHacknetNode ( exp , workerScript ) ;
pEvaluateHacknetNode . then ( function ( res ) {
resolve ( res ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
2017-05-25 14:18:34 +02:00
return ;
2017-06-17 04:53:57 +02:00
} else if ( exp . value == "args" ) {
if ( exp . index ) {
var iPromise = evaluate ( exp . index . value , workerScript ) ;
iPromise . then ( function ( i ) {
if ( isNaN ( i ) ) {
reject ( makeRuntimeRejectMsg ( workerScript , "Invalid access to args array. Index is not a number: " + i ) ) ;
} else if ( i >= workerScript . args . length || i < 0 ) {
reject ( makeRuntimeRejectMsg ( workerScript , "Out of bounds: Invalid index in [] operator" ) ) ;
} else {
resolve ( workerScript . args [ i ] ) ;
}
} , function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . op && exp . op . type == "var" && exp . op . value == "length" ) {
resolve ( workerScript . args . length ) ;
} else {
reject ( makeRuntimeRejectMsg ( workerScript , "Invalid access to args array" ) ) ;
}
return ;
2017-06-11 00:44:33 +02:00
} else if ( exp . value == "array" ) {
//A raw array. This will be called under something like this:
// x = Array[1, 2, 3];
if ( exp . array && exp . array instanceof Array ) {
resolve ( exp . array ) ;
} else {
reject ( makeRuntimeRejectMsg ( workerScript , "Invalid array instantiation" ) ) ;
}
return ;
2017-05-25 14:18:34 +02:00
}
2017-06-05 06:48:37 +02:00
try {
2017-06-11 00:44:33 +02:00
var res = env . get ( exp . value ) ;
2017-06-15 03:19:52 +02:00
if ( res . constructor === Array || res instanceof Array ) {
var evalArrayPromise = netscriptArray ( exp , workerScript ) ;
evalArrayPromise . then ( function ( res ) {
resolve ( res ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
2017-06-11 00:44:33 +02:00
} else {
resolve ( res ) ;
}
2017-06-05 06:48:37 +02:00
} catch ( e ) {
2017-06-11 00:44:33 +02:00
reject ( "|" + workerScript . serverIp + "|" + workerScript . name + "|" + e . toString ( ) ) ;
2017-06-05 06:48:37 +02:00
}
break ;
//Can currently only assign to "var"s
case "assign" :
var p = netscriptAssign ( exp , workerScript ) ;
p . then ( function ( res ) {
resolve ( res ) ;
} ) . catch ( function ( e ) {
reject ( e ) ;
} ) ;
break ;
case "binary" :
var p = netscriptBinary ( exp , workerScript ) ;
p . then ( function ( res ) {
resolve ( res ) ;
} ) . catch ( function ( e ) {
reject ( e ) ;
} ) ;
break ;
case "if" :
2017-05-11 06:20:17 +02:00
var numConds = exp . cond . length ;
var numThens = exp . then . length ;
if ( numConds == 0 || numThens == 0 || numConds != numThens ) {
reject ( "|" + workerScript . serverIp + "|" + workerScript . name + "|Number of conds and thens in if structure don't match (or there are none)" ) ;
}
2017-05-12 06:59:07 +02:00
var evalIfPromise = evaluateIf ( exp , workerScript , 0 ) ;
evalIfPromise . then ( function ( res ) {
if ( res ) {
//One of the if/elif statements evaluated to true
resolve ( "if statement done" ) ;
} else {
//None of the if/elif statements were true. Evaluate else if there is one
if ( exp . else ) {
var elseEval = evaluate ( exp . else , workerScript ) ;
elseEval . then ( function ( res ) {
resolve ( "if statement done with else" ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
} else {
resolve ( "if statement done" ) ;
}
}
} , function ( e ) {
reject ( e ) ;
} ) ;
2017-06-05 06:48:37 +02:00
break ;
case "for" :
var pInit = evaluate ( exp . init , workerScript ) ;
pInit . then ( function ( expInit ) {
return evaluateFor ( exp , workerScript ) ;
} ) . then ( function ( forLoopRes ) {
resolve ( "forLoopDone" ) ;
} ) . catch ( function ( e ) {
reject ( e ) ;
} ) ;
break ;
case "while" :
var pEvaluateWhile = evaluateWhile ( exp , workerScript ) ;
pEvaluateWhile . then ( function ( whileLoopRes ) {
resolve ( whileLoopRes ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
break ;
case "prog" :
var evaluateProgPromise = evaluateProg ( exp , workerScript , 0 ) ;
evaluateProgPromise . then ( function ( w ) {
resolve ( workerScript ) ;
} , function ( e ) {
2017-06-07 23:18:21 +02:00
if ( typeof e === 'string' || e instanceof String ) {
workerScript . errorMessage = e ;
reject ( workerScript ) ;
} else if ( e instanceof WorkerScript ) {
reject ( e ) ;
} else {
reject ( workerScript ) ;
}
2017-06-05 06:48:37 +02:00
} ) ;
break ;
case "call" :
if ( exp . func . value == "hack" ) {
var p = netscriptHack ( exp , workerScript ) ;
p . then ( function ( res ) {
resolve ( res ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . func . value == "sleep" ) {
if ( exp . args . length != 1 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "sleep() call has incorrect number of arguments. Takes 1 argument." ) ) ;
}
var sleepTimePromise = evaluate ( exp . args [ 0 ] , workerScript ) ;
sleepTimePromise . then ( function ( sleepTime ) {
workerScript . scriptRef . log ( "Sleeping for " + sleepTime + " milliseconds" ) ;
2017-06-05 19:50:32 +02:00
return netscriptDelay ( sleepTime ) . then ( function ( ) {
2017-06-05 06:48:37 +02:00
return Promise . resolve ( true ) ;
2017-06-05 19:50:32 +02:00
} ) ;
2017-06-05 06:48:37 +02:00
} ) . then ( function ( res ) {
resolve ( true ) ;
} ) . catch ( function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . func . value == "print" ) {
if ( exp . args . length != 1 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "print() call has incorrect number of arguments. Takes 1 argument" ) ) ;
}
var evaluatePromise = evaluate ( exp . args [ 0 ] , workerScript ) ;
evaluatePromise . then ( function ( res ) {
workerScript . scriptRef . log ( res . toString ( ) ) ;
resolve ( true ) ;
} ) . catch ( function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . func . value == "grow" ) {
var p = netscriptGrow ( exp , workerScript ) ;
p . then ( function ( res ) {
resolve ( res ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . func . value == "weaken" ) {
var p = netscriptWeaken ( exp , workerScript ) ;
p . then ( function ( res ) {
resolve ( res ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . func . value == "nuke" ) {
var p = netscriptRunProgram ( exp , workerScript , Programs . NukeProgram ) ;
p . then ( function ( res ) {
resolve ( res ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . func . value == "brutessh" ) {
var p = netscriptRunProgram ( exp , workerScript , Programs . BruteSSHProgram ) ;
p . then ( function ( res ) {
resolve ( res ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . func . value == "ftpcrack" ) {
var p = netscriptRunProgram ( exp , workerScript , Programs . FTPCrackProgram ) ;
p . then ( function ( res ) {
resolve ( res ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . func . value == "relaysmtp" ) {
var p = netscriptRunProgram ( exp , workerScript , Programs . RelaySMTPProgram ) ;
p . then ( function ( res ) {
resolve ( res ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . func . value == "httpworm" ) {
var p = netscriptRunProgram ( exp , workerScript , Programs . HTTPWormProgram ) ;
p . then ( function ( res ) {
resolve ( res ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . func . value == "sqlinject" ) {
var p = netscriptRunProgram ( exp , workerScript , Programs . SQLInjectProgram ) ;
p . then ( function ( res ) {
resolve ( res ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . func . value == "hasRootAccess" ) {
if ( env . stopFlag ) { return reject ( workerScript ) ; }
if ( exp . args . length != 1 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "hasRootAccess() call has incorrect number of arguments. Takes 1 argument" ) ) ;
}
var ipPromise = evaluate ( exp . args [ 0 ] , workerScript ) ;
ipPromise . then ( function ( ip ) {
if ( env . stopFlag ) { return reject ( workerScript ) ; }
var server = getServer ( ip ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "hasRootAccess() failed. Invalid IP or hostname passed in: " + ip ) ;
return reject ( makeRuntimeRejectMsg ( workerScript , "Invalid IP or hostname passed into hasRootAccess() command" ) ) ;
2017-05-11 06:20:17 +02:00
}
2017-06-05 06:48:37 +02:00
workerScript . scriptRef . log ( "hasRootAccess() returned " + server . hasAdminRights ) ;
resolve ( server . hasAdminRights ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . func . value == "run" ) {
2017-06-17 04:53:57 +02:00
if ( exp . args . length < 1 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "run() call has incorrect number of arguments. Usage: run(scriptname, [numThreads], [arg1], [arg2]...)" ) ) ;
2017-06-05 06:48:37 +02:00
}
2017-06-11 05:45:06 +02:00
var argPromises = exp . args . map ( function ( arg ) {
return evaluate ( arg , workerScript ) ;
} ) ;
Promise . all ( argPromises ) . then ( function ( args ) {
2017-06-05 06:48:37 +02:00
if ( env . stopFlag ) { return reject ( workerScript ) ; }
2017-06-11 05:45:06 +02:00
var scriptname = args [ 0 ] ;
var threads = 1 ;
2017-06-17 04:53:57 +02:00
if ( exp . args . length >= 2 ) {
2017-06-11 05:45:06 +02:00
threads = args [ 1 ] ;
}
2017-06-17 04:53:57 +02:00
var argsForNewScript = [ ] ;
for ( var i = 2 ; i < exp . args . length ; ++ i ) {
argsForNewScript . push ( args [ i ] ) ;
}
2017-06-11 05:45:06 +02:00
if ( isNaN ( threads ) || threads < 1 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "Invalid argument for thread count passed into run(). Must be numeric and greater than 0" ) ) ;
}
2017-06-05 06:48:37 +02:00
var scriptServer = getServer ( workerScript . serverIp ) ;
if ( scriptServer == null ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "Could not find server. This is a bug in the game. Report to game dev" ) ) ;
2017-05-11 06:20:17 +02:00
}
2017-06-05 06:48:37 +02:00
2017-06-17 04:53:57 +02:00
var runScriptPromise = runScriptFromScript ( scriptServer , scriptname , argsForNewScript , workerScript , threads ) ;
2017-06-11 00:44:33 +02:00
return runScriptPromise ;
2017-06-05 06:48:37 +02:00
} ) . then ( function ( res ) {
resolve ( res ) ;
} ) . catch ( function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . func . value == "exec" ) {
2017-06-17 04:53:57 +02:00
if ( exp . args . length < 2 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "exec() call has incorrect number of arguments. Usage: exec(scriptname, server, [numThreads], [arg1], [arg2]...)" ) ) ;
2017-06-05 06:48:37 +02:00
}
var argPromises = exp . args . map ( function ( arg ) {
return evaluate ( arg , workerScript ) ;
} ) ;
Promise . all ( argPromises ) . then ( function ( args ) {
if ( env . stopFlag ) { return reject ( workerScript ) ; }
2017-06-11 05:45:06 +02:00
var threads = 1 ;
2017-06-17 04:53:57 +02:00
if ( exp . args . length >= 3 ) {
2017-06-11 05:45:06 +02:00
threads = args [ 2 ] ;
}
2017-06-17 04:53:57 +02:00
var argsForNewScript = [ ] ;
for ( var i = 3 ; i < exp . args . length ; ++ i ) {
argsForNewScript . push ( args [ i ] ) ;
}
2017-06-11 05:45:06 +02:00
if ( isNaN ( threads ) || threads < 1 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "Invalid argument for thread count passed into exec(). Must be numeric and greater than 0" ) ) ;
}
2017-06-05 06:48:37 +02:00
var server = getServer ( args [ 1 ] ) ;
if ( server == null ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "Invalid hostname/ip passed into exec() command: " + args [ 1 ] ) ) ;
2017-05-11 06:20:17 +02:00
}
2017-06-05 06:48:37 +02:00
2017-06-17 04:53:57 +02:00
return runScriptFromScript ( server , args [ 0 ] , argsForNewScript , workerScript , threads ) ;
2017-06-05 06:48:37 +02:00
} ) . then ( function ( res ) {
resolve ( res ) ;
} ) . catch ( function ( e ) {
reject ( e ) ;
} ) ;
2017-06-05 19:59:30 +02:00
} else if ( exp . func . value == "kill" ) {
2017-06-17 04:53:57 +02:00
if ( exp . args . length < 2 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "kill() call has incorrect number of arguments. Usage: kill(scriptname, server, [arg1], [arg2]...)" ) ) ;
2017-06-06 03:34:00 +02:00
}
var argPromises = exp . args . map ( function ( arg ) {
return evaluate ( arg , workerScript ) ;
} ) ;
2017-06-17 04:53:57 +02:00
2017-06-06 03:34:00 +02:00
Promise . all ( argPromises ) . then ( function ( args ) {
if ( env . stopFlag ) { return reject ( workerScript ) ; }
2017-06-17 04:53:57 +02:00
var filename = args [ 0 ] ;
var server = getServer ( args [ 1 ] ) ;
2017-06-06 03:34:00 +02:00
if ( server == null ) {
workerScript . scriptRef . log ( "kill() failed. Invalid IP or hostname passed in: " + ip ) ;
return reject ( makeRuntimeRejectMsg ( workerScript , "Invalid IP or hostname passed into kill() command" ) ) ;
}
2017-06-17 04:53:57 +02:00
var argsForKillTarget = [ ] ;
for ( var i = 2 ; i < exp . args . length ; ++ i ) {
argsForKillTarget . push ( args [ i ] ) ;
}
var runningScriptObj = findRunningScript ( filename , argsForKillTarget , server ) ;
if ( runningScriptObj == null ) {
workerScript . scriptRef . log ( "kill() failed. No such script " + filename + " on " + server . hostname + " with args: " + printArray ( argsForKillTarget ) ) ;
return Promise . resolve ( false ) ;
}
var res = killWorkerScript ( runningScriptObj , server . ip ) ;
2017-06-07 06:09:53 +02:00
if ( res ) {
2017-06-17 04:53:57 +02:00
workerScript . scriptRef . log ( "Killing " + filename + " on " + server . hostname + " with args: " + printArray ( argsForKillTarget ) + ". May take up to a few minutes for the scripts to die..." ) ;
2017-06-07 06:09:53 +02:00
return Promise . resolve ( true ) ;
} else {
2017-06-17 04:53:57 +02:00
workerScript . scriptRef . log ( "kill() failed. No such script " + filename + " on " + server . hostname + " with args: " + printArray ( argsForKillTarget ) ) ;
2017-06-07 06:09:53 +02:00
return Promise . resolve ( false ) ;
2017-06-06 03:34:00 +02:00
}
2017-06-07 06:09:53 +02:00
} ) . then ( function ( res ) {
resolve ( res ) ;
2017-06-06 03:34:00 +02:00
} ) . catch ( function ( e ) {
reject ( e ) ;
} ) ;
2017-06-05 19:59:30 +02:00
} else if ( exp . func . value == "killall" ) {
2017-06-06 03:34:00 +02:00
if ( exp . args . length != 1 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "killall() call has incorrect number of arguments. Takes 1 argument" ) ) ;
}
var ipPromise = evaluate ( exp . args [ 0 ] , workerScript ) ;
ipPromise . then ( function ( ip ) {
if ( env . stopFlag ) { return reject ( workerScript ) ; }
var server = getServer ( ip ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "killall() failed. Invalid IP or hostname passed in: " + ip ) ;
return reject ( makeRuntimeRejectMsg ( workerScript , "Invalid IP or hostname passed into killall() command" ) ) ;
}
2017-06-17 04:53:57 +02:00
for ( var i = server . runningScripts . length - 1 ; i >= 0 ; -- i ) {
2017-06-06 03:34:00 +02:00
killWorkerScript ( server . runningScripts [ i ] , server . ip ) ;
}
2017-06-17 04:53:57 +02:00
workerScript . scriptRef . log ( "killall(): Killing all scripts on " + server . hostname + ". May take a few minutes for the scripts to die" ) ;
2017-06-06 03:34:00 +02:00
resolve ( true ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
2017-06-05 06:48:37 +02:00
} else if ( exp . func . value == "scp" ) {
if ( exp . args . length != 2 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "scp() call has incorrect number of arguments. Takes 2 arguments" ) ) ;
}
var argPromises = exp . args . map ( function ( arg ) {
return evaluate ( arg , workerScript ) ;
} ) ;
Promise . all ( argPromises ) . then ( function ( args ) {
if ( env . stopFlag ) { return reject ( workerScript ) ; }
var scriptname = args [ 0 ] ;
var ip = args [ 1 ] ;
var destServer = getServer ( ip ) ;
if ( destServer == null ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "Invalid hostname/ip passed into scp() command: " + ip ) ) ;
2017-05-23 20:17:37 +02:00
}
2017-06-05 06:48:37 +02:00
var currServ = getServer ( workerScript . serverIp ) ;
if ( currServ == null ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "Could not find server ip for this script. This is a bug please contact game developer" ) ) ;
2017-05-15 08:35:09 +02:00
}
2017-06-05 06:48:37 +02:00
var sourceScript = null ;
for ( var i = 0 ; i < currServ . scripts . length ; ++ i ) {
if ( scriptname == currServ . scripts [ i ] . filename ) {
sourceScript = currServ . scripts [ i ] ;
break ;
2017-05-15 08:35:09 +02:00
}
2017-05-31 18:33:54 +02:00
}
2017-06-05 06:48:37 +02:00
if ( sourceScript == null ) {
workerScript . scriptRef . log ( scriptname + " does not exist. scp() failed" ) ;
2017-06-07 06:09:53 +02:00
return Promise . resolve ( false ) ;
2017-05-30 03:25:52 +02:00
}
2017-06-05 06:48:37 +02:00
//Overwrite script if it already exists
for ( var i = 0 ; i < destServer . scripts . length ; ++ i ) {
if ( scriptname == destServer . scripts [ i ] . filename ) {
workerScript . scriptRef . log ( "WARNING: " + scriptname + " already exists on " + destServer . hostname + " and it will be overwritten." ) ;
workerScript . scriptRef . log ( scriptname + " overwritten on " + destServer . hostname ) ;
var oldScript = destServer . scripts [ i ] ;
oldScript . code = sourceScript . code ;
oldScript . ramUsage = sourceScript . ramUsage ;
2017-06-07 06:09:53 +02:00
return Promise . resolve ( true ) ;
2017-05-30 00:37:38 +02:00
}
2017-05-15 08:35:09 +02:00
}
2017-06-05 06:48:37 +02:00
//Create new script if it does not already exist
var newScript = new Script ( ) ;
newScript . filename = scriptname ;
newScript . code = sourceScript . code ;
newScript . ramUsage = sourceScript . ramUsage ;
newScript . server = destServer . ip ;
destServer . scripts . push ( newScript ) ;
workerScript . scriptRef . log ( scriptname + " copied over to " + destServer . hostname ) ;
2017-06-07 06:09:53 +02:00
return Promise . resolve ( true ) ;
return ;
} ) . then ( function ( res ) {
resolve ( res ) ;
2017-06-05 06:48:37 +02:00
} ) . catch ( function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . func . value == "getHostname" ) {
if ( exp . args . length != 0 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "getHostname() call has incorrect number of arguments. Takes 0 arguments" ) ) ;
}
var scriptServer = getServer ( workerScript . serverIp ) ;
if ( scriptServer == null ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "Could not find server. This is a bug in the game. Report to game dev" ) ) ;
}
resolve ( scriptServer . hostname ) ;
} else if ( exp . func . value == "getHackingLevel" ) {
if ( exp . args . length != 0 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "getHackingLevel() call has incorrect number of arguments. Takes 0 arguments" ) ) ;
}
Player . updateSkillLevels ( ) ;
workerScript . scriptRef . log ( "getHackingLevel() returned " + Player . hacking _skill ) ;
resolve ( Player . hacking _skill ) ;
} else if ( exp . func . value == "getServerMoneyAvailable" ) {
if ( exp . args . length != 1 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "getServerMoneyAvailable() call has incorrect number of arguments. Takes 1 arguments" ) ) ;
}
var ipPromise = evaluate ( exp . args [ 0 ] , workerScript ) ;
ipPromise . then ( function ( ip ) {
var server = getServer ( ip ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "Cannot getServerMoneyAvailable(). Invalid IP or hostname passed in: " + ip ) ;
return reject ( makeRuntimeRejectMsg ( workerScript , "Invalid IP or hostname passed into getServerMoneyAvailable() command" ) ) ;
2017-05-31 19:37:32 +02:00
}
2017-06-05 06:48:37 +02:00
workerScript . scriptRef . log ( "getServerMoneyAvailable() returned " + formatNumber ( server . moneyAvailable , 2 ) + " for " + server . hostname ) ;
resolve ( server . moneyAvailable ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . func . value == "getServerSecurityLevel" ) {
if ( exp . args . length != 1 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "getServerSecurityLevel() call has incorrect number of arguments. Takes 1 arguments" ) ) ;
}
var ipPromise = evaluate ( exp . args [ 0 ] , workerScript ) ;
ipPromise . then ( function ( ip ) {
var server = getServer ( ip ) ;
if ( server == null ) {
2017-06-05 17:31:46 +02:00
workerScript . scriptRef . log ( "getServerSecurityLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
2017-06-05 06:48:37 +02:00
return reject ( makeRuntimeRejectMsg ( workerScript , "Invalid IP or hostname passed into getServerSecurityLevel() command" ) ) ; ;
2017-05-20 11:27:42 +02:00
}
2017-06-05 06:48:37 +02:00
workerScript . scriptRef . log ( "getServerSecurityLevel() returned " + formatNumber ( server . hackDifficulty , 3 ) + " for " + server . hostname ) ;
resolve ( server . hackDifficulty ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
2017-06-05 17:31:46 +02:00
} else if ( exp . func . value == "getServerRequiredHackingLevel" ) {
if ( exp . args . length != 1 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "getServerRequiredHackingLevel() call has incorrect number of arguments. Takes 1 argument" ) ) ;
}
var ipPromise = evaluate ( exp . args [ 0 ] , workerScript ) ;
ipPromise . then ( function ( ip ) {
var server = getServer ( ip ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "getServerRequiredHackingLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
return reject ( makeRuntimeRejectMsg ( workerScript , "Invalid IP or hostname passed into getServerRequiredHackingLevel() command" ) ) ;
}
2017-06-07 06:09:53 +02:00
workerScript . scriptRef . log ( "getServerRequiredHackingLevel returned " + formatNumber ( server . requiredHackingSkill , 0 ) + " for " + server . hostname ) ;
2017-06-05 17:31:46 +02:00
resolve ( server . requiredHackingSkill ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . func . value == "fileExists" ) {
if ( exp . args . length != 1 && exp . args . length != 2 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "fileExists() 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 ] ;
2017-06-07 04:33:50 +02:00
if ( exp . args . length == 1 ) {
2017-06-05 17:31:46 +02:00
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 ( "fileExists() failed. Invalid IP or hostname passed in: " + ip ) ;
return reject ( makeRuntimeRejectMsg ( workerScript , "Invalid IP or hostname passed into fileExists() command" ) ) ;
}
for ( var i = 0 ; i < server . scripts . length ; ++ i ) {
if ( filename == server . scripts [ i ] . filename ) {
return resolve ( true ) ;
}
}
if ( Player . hasProgram ( filename ) ) {
return resolve ( true ) ;
}
2017-06-05 19:50:32 +02:00
return resolve ( false ) ;
} ) . catch ( function ( e ) {
reject ( e ) ;
} ) ;
} else if ( exp . func . value == "isRunning" ) {
2017-06-17 04:53:57 +02:00
if ( exp . args . length < 2 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "isRunning() call has incorrect number of arguments. Usage: isRunning(scriptname, server, [arg1], [arg2]...)" ) ) ;
2017-06-05 19:50:32 +02:00
}
var argPromises = exp . args . map ( function ( arg ) {
return evaluate ( arg , workerScript ) ;
} ) ;
var filename = "" ;
2017-06-17 04:53:57 +02:00
var argsForTargetScript = [ ] ;
2017-06-05 19:50:32 +02:00
Promise . all ( argPromises ) . then ( function ( args ) {
if ( env . stopFlag ) { return reject ( workerScript ) ; }
filename = args [ 0 ] ;
2017-06-17 04:53:57 +02:00
var ip = args [ 1 ] ;
for ( var i = 2 ; i < args . length ; ++ i ) {
argsForTargetScript . push ( args [ i ] ) ;
2017-06-05 19:50:32 +02:00
}
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" ) ) ;
}
2017-06-17 04:53:57 +02:00
var runningScriptObj = findRunningScript ( filename , argsForTargetScript , server ) ;
if ( runningScriptObj != null ) {
return resolve ( true ) ;
2017-06-05 19:50:32 +02:00
}
return resolve ( false ) ;
2017-06-05 17:31:46 +02:00
} ) . catch ( function ( e ) {
reject ( e ) ;
} ) ;
2017-06-05 06:48:37 +02:00
} else if ( exp . func . value == "purchaseHacknetNode" ) {
if ( exp . args . length != 0 ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "purchaseHacknetNode() call has incorrect number of arguments. Takes 0 arguments" ) ) ;
}
var cost = getCostOfNextHacknetNode ( ) ;
if ( isNaN ( cost ) ) {
return reject ( makeRuntimeRejectMsg ( workerScript , "Could not calculate cost in purchaseHacknetNode(). This is a bug please report to game dev" ) ) ;
}
if ( cost > Player . money ) {
workerScript . scriptRef . log ( "Could not afford to purchase new Hacknet Node" ) ;
return resolve ( false ) ;
}
//Auto generate a name for the node for now...TODO
var numOwned = Player . hacknetNodes . length ;
var name = "hacknet-node-" + numOwned ;
var node = new HacknetNode ( name ) ;
node . updateMoneyGainRate ( ) ;
Player . loseMoney ( cost ) ;
Player . hacknetNodes . push ( node ) ;
displayHacknetNodesContent ( ) ;
workerScript . scriptRef . log ( "Purchased new Hacknet Node with name: " + name ) ;
resolve ( numOwned ) ;
} else {
reject ( makeRuntimeRejectMsg ( workerScript , "Invalid function: " + exp . func . value ) ) ;
}
break ;
default :
reject ( makeRuntimeRejectMsg ( workerScript , "Unrecognized token: " + exp . type + ". This is a bug please report to game developer" ) ) ;
break ;
} //End switch
} , CONSTANTS . CodeInstructionRunTime ) ; //End setTimeout, the Netscript operation run time
} ) ; // End Promise
2016-11-17 23:25:40 +01:00
}
2017-05-12 06:59:07 +02:00
//Returns true if any of the if statements evaluated, false otherwise. Therefore, the else statement
//should evaluate if this returns false
function evaluateIf ( exp , workerScript , i ) {
var env = workerScript . env ;
return new Promise ( function ( resolve , reject ) {
if ( i >= exp . cond . length ) {
//Catch out of bounds errors
resolve ( false ) ;
} else {
var cond = evaluate ( exp . cond [ i ] , workerScript ) ;
cond . then ( function ( condRes ) {
if ( condRes ) {
var evalThen = evaluate ( exp . then [ i ] , workerScript ) ;
evalThen . then ( function ( res ) {
resolve ( true ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
} else {
//If this if statement isnt true, go on the next elif, or recursively resolve
if ( i == exp . cond . length - 1 ) {
resolve ( false ) ;
} else {
var recursiveCall = evaluateIf ( exp , workerScript , i + 1 ) ;
recursiveCall . then ( function ( res ) {
resolve ( res ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
}
}
} , function ( e ) {
reject ( e ) ;
} ) ;
}
} ) ;
}
2016-11-30 00:07:24 +01:00
//Evaluate the looping part of a for loop (Initialization block is NOT done in here)
function evaluateFor ( exp , workerScript ) {
2016-12-15 23:22:42 +01:00
var env = workerScript . env ;
2016-11-30 00:07:24 +01:00
return new Promise ( function ( resolve , reject ) {
2017-05-30 15:57:24 +02:00
if ( env . stopFlag ) { reject ( workerScript ) ; return ; }
2016-12-15 23:22:42 +01:00
2016-11-30 00:07:24 +01:00
var pCond = new Promise ( function ( resolve , reject ) {
setTimeout ( function ( ) {
var evaluatePromise = evaluate ( exp . cond , workerScript ) ;
evaluatePromise . then ( function ( resCond ) {
resolve ( resCond ) ;
2016-12-15 23:22:42 +01:00
} , function ( e ) {
reject ( e ) ;
2016-11-30 00:07:24 +01:00
} ) ;
} , CONSTANTS . CodeInstructionRunTime ) ;
} ) ;
pCond . then ( function ( resCond ) {
if ( resCond ) {
//Run the for loop code
var pCode = new Promise ( function ( resolve , reject ) {
setTimeout ( function ( ) {
var evaluatePromise = evaluate ( exp . code , workerScript ) ;
evaluatePromise . then ( function ( resCode ) {
resolve ( resCode ) ;
2016-12-15 23:22:42 +01:00
} , function ( e ) {
reject ( e ) ;
2016-11-30 00:07:24 +01:00
} ) ;
} , CONSTANTS . CodeInstructionRunTime ) ;
} ) ;
//After the code executes make a recursive call
pCode . then ( function ( resCode ) {
var pPostLoop = new Promise ( function ( resolve , reject ) {
setTimeout ( function ( ) {
var evaluatePromise = evaluate ( exp . postloop , workerScript ) ;
evaluatePromise . then ( function ( foo ) {
resolve ( "postLoopFinished" ) ;
2016-12-15 23:22:42 +01:00
} , function ( e ) {
reject ( e ) ;
2016-11-30 00:07:24 +01:00
} ) ;
} , CONSTANTS . CodeInstructionRunTime ) ;
} ) ;
pPostLoop . then ( function ( resPostloop ) {
var recursiveCall = evaluateFor ( exp , workerScript ) ;
recursiveCall . then ( function ( foo ) {
resolve ( "endForLoop" ) ;
2016-12-15 23:22:42 +01:00
} , function ( e ) {
reject ( e ) ;
2016-11-30 00:07:24 +01:00
} ) ;
2016-12-15 23:22:42 +01:00
} , function ( e ) {
reject ( e ) ;
2016-11-30 00:07:24 +01:00
} ) ;
2016-12-15 23:22:42 +01:00
} , function ( e ) {
reject ( e ) ;
2016-11-30 00:07:24 +01:00
} ) ;
} else {
resolve ( "endForLoop" ) ; //Doesn't need to resolve to any particular value
}
2016-12-15 23:22:42 +01:00
} , function ( e ) {
reject ( e ) ;
2016-11-30 00:07:24 +01:00
} ) ;
} ) ;
}
function evaluateWhile ( exp , workerScript ) {
2016-12-15 23:22:42 +01:00
var env = workerScript . env ;
2016-11-30 00:07:24 +01:00
return new Promise ( function ( resolve , reject ) {
2017-05-30 15:57:24 +02:00
if ( env . stopFlag ) { reject ( workerScript ) ; return ; }
2016-12-15 23:22:42 +01:00
2016-11-30 00:07:24 +01:00
var pCond = new Promise ( function ( resolve , reject ) {
setTimeout ( function ( ) {
var evaluatePromise = evaluate ( exp . cond , workerScript ) ;
evaluatePromise . then ( function ( resCond ) {
resolve ( resCond ) ;
2016-12-15 23:22:42 +01:00
} , function ( e ) {
reject ( e ) ;
2016-11-30 00:07:24 +01:00
} ) ;
} , CONSTANTS . CodeInstructionRunTime ) ;
} ) ;
pCond . then ( function ( resCond ) {
if ( resCond ) {
//Run the while loop code
var pCode = new Promise ( function ( resolve , reject ) {
setTimeout ( function ( ) {
var evaluatePromise = evaluate ( exp . code , workerScript ) ;
evaluatePromise . then ( function ( resCode ) {
resolve ( resCode ) ;
2016-12-15 23:22:42 +01:00
} , function ( e ) {
reject ( e ) ;
2016-11-30 00:07:24 +01:00
} ) ;
} , CONSTANTS . CodeInstructionRunTime ) ;
} ) ;
//After the code executes make a recursive call
pCode . then ( function ( resCode ) {
var recursiveCall = evaluateWhile ( exp , workerScript ) ;
recursiveCall . then ( function ( foo ) {
resolve ( "endWhileLoop" ) ;
2016-12-15 23:22:42 +01:00
} , function ( e ) {
reject ( e ) ;
2016-11-30 00:07:24 +01:00
} ) ;
2016-12-15 23:22:42 +01:00
} , function ( e ) {
reject ( e ) ;
2016-11-30 00:07:24 +01:00
} ) ;
} else {
resolve ( "endWhileLoop" ) ; //Doesn't need to resolve to any particular value
}
2016-12-15 23:22:42 +01:00
} , function ( e ) {
reject ( e ) ;
2016-11-30 00:07:24 +01:00
} ) ;
} ) ;
}
2017-05-25 14:18:34 +02:00
function evaluateHacknetNode ( exp , workerScript ) {
var env = workerScript . env ;
return new Promise ( function ( resolve , reject ) {
setTimeout ( function ( ) {
if ( exp . index == null ) {
2017-06-15 03:19:52 +02:00
if ( ( exp . op . type == "call" && exp . op . func . value == "length" ) ||
2017-05-25 14:18:34 +02:00
( exp . op . type == "var" && exp . op . value == "length" ) ) {
resolve ( Player . hacknetNodes . length ) ;
workerScript . scriptRef . log ( "hacknetnodes.length returned " + Player . hacknetNodes . length ) ;
return ;
} else {
workerScript . scriptRef . log ( "Invalid/null index for hacknetnodes" ) ;
reject ( makeRuntimeRejectMsg ( workerScript , "Invalid/null index. hacknetnodes array must be accessed with an index" ) ) ;
return ;
}
}
var indexPromise = evaluate ( exp . index . value , workerScript ) ;
indexPromise . then ( function ( index ) {
if ( isNaN ( index ) || index >= Player . hacknetNodes . length || index < 0 ) {
workerScript . scriptRef . log ( "Invalid index value for hacknetnodes[]" ) ;
reject ( makeRuntimeRejectMsg ( workerScript , "Invalid index value for hacknetnodes[]." ) ) ;
return ;
}
var nodeObj = Player . hacknetNodes [ index ] ;
if ( exp . op == null ) {
reject ( makeRuntimeRejectMsg ( workerScript , "No operator or property called for hacknetnodes. Usage: hacknetnodes[i].property/operator" ) ) ;
return ;
} else if ( exp . op . type == "var" ) {
//Get properties: level, ram, cores
switch ( exp . op . value ) {
case "level" :
resolve ( nodeObj . level ) ;
break ;
case "ram" :
resolve ( nodeObj . ram ) ;
break ;
case "cores" :
resolve ( nodeObj . numCores ) ;
break ;
default :
reject ( makeRuntimeRejectMsg ( workerScript , "Unrecognized property for Hacknet Node. Valid properties: ram, cores, level" ) ) ;
break ;
}
} else if ( exp . op . type == "call" ) {
switch ( exp . op . func . value ) {
case "upgradeLevel" :
if ( exp . op . args . length == 1 ) {
var argPromise = evaluate ( exp . op . args [ 0 ] , workerScript ) ;
argPromise . then ( function ( arg ) {
2017-05-25 16:50:58 +02:00
if ( isNaN ( arg ) || arg < 0 ) {
reject ( makeRuntimeRejectMsg ( workerScript , "Invalid argument passed into upgradeLevel()" ) ) ;
2017-05-25 14:18:34 +02:00
return ;
}
2017-06-06 23:22:57 +02:00
arg = Math . round ( arg ) ;
2017-05-25 14:18:34 +02:00
var res = nodeObj . purchaseLevelUpgrade ( arg ) ;
if ( res ) {
2017-05-25 16:50:58 +02:00
workerScript . scriptRef . log ( "Upgraded " + nodeObj . name + " " + arg + " times to level " + nodeObj . level ) ;
2017-05-25 14:18:34 +02:00
}
resolve ( res ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
} else {
var res = nodeObj . purchaseLevelUpgrade ( 1 ) ;
if ( res ) {
workerScript . scriptRef . log ( "Upgraded " + nodeObj . name + " once to level " + nodeObj . level ) ;
}
resolve ( res ) ;
}
break ;
case "upgradeRam" :
var res = nodeObj . purchaseRamUpgrade ( ) ;
if ( res ) {
workerScript . scriptRef . log ( "Upgraded " + nodeObj . name + "'s RAM to " + nodeObj . ram + "GB" ) ;
}
resolve ( res ) ;
break ;
case "upgradeCore" :
var res = nodeObj . purchaseCoreUpgrade ( ) ;
if ( res ) {
workerScript . scriptRef . log ( "Upgraded " + nodeObj . name + "'s number of cores to " + nodeObj . numCores ) ;
}
resolve ( res ) ;
break ;
default :
reject ( makeRuntimeRejectMsg ( workerScript , "Unrecognized function/operator for hacknet node. Valid functions: upgradeLevel(n), upgradeRam(), upgradeCore()" ) ) ;
break ;
}
} else {
reject ( makeRuntimeRejectMsg ( workerScript , "Unrecognized operation for hacknet node" ) ) ;
return ;
}
} , function ( e ) {
reject ( e ) ;
} ) ;
} , CONSTANTS . CodeInstructionRunTime ) ;
} , function ( e ) {
reject ( e ) ;
} ) ;
}
2016-11-30 00:07:24 +01:00
function evaluateProg ( exp , workerScript , index ) {
2016-12-15 23:22:42 +01:00
var env = workerScript . env ;
2016-11-30 00:07:24 +01:00
return new Promise ( function ( resolve , reject ) {
2017-05-30 15:57:24 +02:00
if ( env . stopFlag ) { reject ( workerScript ) ; return ; }
2016-12-15 23:22:42 +01:00
2016-11-30 00:07:24 +01:00
if ( index >= exp . prog . length ) {
resolve ( "progFinished" ) ;
} else {
//Evaluate this line of code in the prog
var code = new Promise ( function ( resolve , reject ) {
setTimeout ( function ( ) {
var evaluatePromise = evaluate ( exp . prog [ index ] , workerScript ) ;
evaluatePromise . then ( function ( evalRes ) {
resolve ( evalRes ) ;
2016-12-15 23:22:42 +01:00
} , function ( e ) {
reject ( e ) ;
2016-11-30 00:07:24 +01:00
} ) ;
} , CONSTANTS . CodeInstructionRunTime ) ;
} ) ;
//After the code finishes evaluating, evaluate the next line recursively
code . then ( function ( codeRes ) {
var nextLine = evaluateProg ( exp , workerScript , index + 1 ) ;
nextLine . then ( function ( nextLineRes ) {
2016-12-06 17:59:20 +01:00
resolve ( workerScript ) ;
2016-12-15 23:22:42 +01:00
} , function ( e ) {
reject ( e ) ;
2016-11-30 00:07:24 +01:00
} ) ;
2016-12-15 23:22:42 +01:00
} , function ( e ) {
reject ( e ) ;
2016-11-30 00:07:24 +01:00
} ) ;
}
} ) ;
}
2017-06-05 06:48:37 +02:00
function netscriptDelay ( time ) {
return new Promise ( function ( resolve ) {
setTimeout ( resolve , time ) ;
} ) ;
}
2017-05-25 14:18:34 +02:00
function makeRuntimeRejectMsg ( workerScript , msg ) {
return "|" + workerScript . serverIp + "|" + workerScript . name + "|" + msg ;
}
2016-11-17 23:25:40 +01:00
function apply _op ( op , a , b ) {
function num ( x ) {
if ( typeof x != "number" )
throw new Error ( "Expected number but got " + x ) ;
return x ;
}
function div ( x ) {
if ( num ( x ) == 0 )
throw new Error ( "Divide by zero" ) ;
return x ;
}
switch ( op ) {
2017-05-23 20:17:37 +02:00
case "+" : return a + b ;
2016-11-17 23:25:40 +01:00
case "-" : return num ( a ) - num ( b ) ;
case "*" : return num ( a ) * num ( b ) ;
case "/" : return num ( a ) / div ( b ) ;
case "%" : return num ( a ) % div ( b ) ;
case "&&" : return a !== false && b ;
case "||" : return a !== false ? a : b ;
case "<" : return num ( a ) < num ( b ) ;
case ">" : return num ( a ) > num ( b ) ;
case "<=" : return num ( a ) <= num ( b ) ;
case ">=" : return num ( a ) >= num ( b ) ;
case "==" : return a === b ;
case "!=" : return a !== b ;
}
throw new Error ( "Can't apply operator " + op ) ;
2017-05-15 08:35:09 +02:00
}
//Run a script from inside a script using run() command
2017-06-17 04:53:57 +02:00
function runScriptFromScript ( server , scriptname , args , workerScript , threads = 1 ) {
2017-05-15 08:35:09 +02:00
return new Promise ( function ( resolve , reject ) {
2017-05-15 17:13:21 +02:00
var env = workerScript . env ;
2017-05-30 15:57:24 +02:00
if ( env . stopFlag ) { reject ( workerScript ) ; return ; }
2017-05-15 08:35:09 +02:00
setTimeout ( function ( ) {
//Check if the script is already running
2017-06-17 04:53:57 +02:00
var runningScriptObj = findRunningScript ( scriptname , args , server ) ;
if ( runningScriptObj != null ) {
workerScript . scriptRef . log ( scriptname + " is already running on " + server . hostname ) ;
return resolve ( false ) ;
2017-05-15 08:35:09 +02:00
}
//Check if the script exists and if it does run it
for ( var i = 0 ; i < server . scripts . length ; ++ i ) {
if ( server . scripts [ i ] . filename == scriptname ) {
//Check for admin rights and that there is enough RAM availble to run
2017-06-17 04:53:57 +02:00
var script = server . scripts [ i ] ;
var ramUsage = script . ramUsage ;
2017-06-18 11:31:14 +02:00
ramUsage = ramUsage * threads * Math . pow ( 1.01 , threads - 1 ) ;
2017-05-15 08:35:09 +02:00
var ramAvailable = server . maxRam - server . ramUsed ;
if ( server . hasAdminRights == false ) {
2017-05-31 18:33:54 +02:00
workerScript . scriptRef . log ( "Cannot run script " + scriptname + " on " + server . hostname + " because you do not have root access!" ) ;
2017-06-17 04:53:57 +02:00
return resolve ( false ) ;
2017-05-15 08:35:09 +02:00
} else if ( ramUsage > ramAvailable ) {
2017-06-11 05:45:06 +02:00
workerScript . scriptRef . log ( "Cannot run script " + scriptname + "(t=" + threads + ") on " + server . hostname + " because there is not enough available RAM!" ) ;
2017-06-17 04:53:57 +02:00
return resolve ( false ) ;
2017-05-15 08:35:09 +02:00
} else {
//Able to run script
2017-06-17 04:53:57 +02:00
workerScript . scriptRef . log ( "Running script: " + scriptname + " on " + server . hostname + " with " + threads + " threads and args: " + printArray ( args ) + ". May take a few seconds to start up..." ) ;
var runningScriptObj = new RunningScript ( script , args ) ;
runningScriptObj . threads = threads ;
server . runningScripts . push ( runningScriptObj ) ; //Push onto runningScripts
addWorkerScript ( runningScriptObj , server ) ;
return resolve ( true ) ;
2017-05-15 08:35:09 +02:00
}
}
}
workerScript . scriptRef . log ( "Could not find script " + scriptname + " on " + server . hostname ) ;
resolve ( false ) ;
} , CONSTANTS . CodeInstructionRunTime ) ;
} ) ;
}
2016-12-14 00:52:32 +01:00
2017-05-01 07:39:48 +02:00
function isScriptErrorMessage ( msg ) {
splitMsg = msg . split ( "|" ) ;
if ( splitMsg . length != 4 ) {
return false ;
}
var ip = splitMsg [ 1 ] ;
if ( ! isValidIPAddress ( ip ) ) {
return false ;
}
return true ;
}
2016-12-14 00:52:32 +01:00
//The same as Player's calculateHackingChance() function but takes in the server as an argument
function scriptCalculateHackingChance ( server ) {
var difficultyMult = ( 100 - server . hackDifficulty ) / 100 ;
2017-05-24 15:49:52 +02:00
var skillMult = ( 2 * Player . hacking _skill ) ;
2016-12-14 00:52:32 +01:00
var skillChance = ( skillMult - server . requiredHackingSkill ) / skillMult ;
2017-05-24 15:49:52 +02:00
var chance = skillChance * difficultyMult * Player . hacking _chance _mult ;
2017-04-17 14:26:54 +02:00
if ( chance < 0 ) { return 0 ; }
else { return chance ; }
2016-12-14 00:52:32 +01:00
}
//The same as Player's calculateHackingTime() function but takes in the server as an argument
function scriptCalculateHackingTime ( server ) {
var difficultyMult = server . requiredHackingSkill * server . hackDifficulty ;
2017-05-03 06:38:58 +02:00
var skillFactor = ( 2.5 * difficultyMult + 500 ) / ( Player . hacking _skill + 50 ) ;
2017-06-18 06:36:16 +02:00
var hackingTime = 5 * skillFactor / Player . hacking _speed _mult ; //This is in seconds
2016-12-14 21:29:40 +01:00
return hackingTime ;
2016-12-14 00:52:32 +01:00
}
//The same as Player's calculateExpGain() function but takes in the server as an argument
function scriptCalculateExpGain ( server ) {
2017-06-15 03:19:52 +02:00
if ( server . baseDifficulty == null ) {
server . baseDifficulty = server . hackDifficulty ;
}
2017-06-18 06:36:16 +02:00
return ( server . baseDifficulty * Player . hacking _exp _mult * 0.5 + 1 ) ;
2016-12-14 00:52:32 +01:00
}
//The same as Player's calculatePercentMoneyHacked() function but takes in the server as an argument
function scriptCalculatePercentMoneyHacked ( server ) {
var difficultyMult = ( 100 - server . hackDifficulty ) / 100 ;
var skillMult = ( Player . hacking _skill - ( server . requiredHackingSkill - 1 ) ) / Player . hacking _skill ;
2017-06-05 10:08:04 +02:00
var percentMoneyHacked = difficultyMult * skillMult * Player . hacking _money _mult / 200 ;
2017-04-18 06:32:17 +02:00
if ( percentMoneyHacked < 0 ) { return 0 ; }
if ( percentMoneyHacked > 1 ) { return 1 ; }
2016-12-14 00:52:32 +01:00
return percentMoneyHacked ;
2017-05-24 15:49:52 +02:00
}
2017-05-31 19:37:32 +02:00
//Amount of time to execute grow() in milliseconds
2017-05-24 15:49:52 +02:00
function scriptCalculateGrowTime ( server ) {
var difficultyMult = server . requiredHackingSkill * server . hackDifficulty ;
var skillFactor = ( 2.5 * difficultyMult + 500 ) / ( Player . hacking _skill + 50 ) ;
2017-06-06 03:34:00 +02:00
var growTime = skillFactor * Player . hacking _speed _mult * 16 ; //This is in seconds
2017-05-24 15:49:52 +02:00
return growTime * 1000 ;
2017-05-31 19:37:32 +02:00
}
//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 ) ;
2017-06-06 03:34:00 +02:00
var weakenTime = skillFactor * Player . hacking _speed _mult * 40 ; //This is in seconds
2017-05-31 19:37:32 +02:00
return weakenTime * 1000 ;
2017-05-15 08:35:09 +02:00
}