2017-10-12 22:10:34 +02:00
var sprintf = require ( 'sprintf-js' ) . sprintf ,
vsprintf = require ( 'sprintf-js' ) . vsprintf
2017-09-12 01:14:51 +02:00
import { updateActiveScriptsItems } from "./ActiveScriptsUI.js" ;
2017-08-30 19:44:29 +02:00
import { Augmentations , Augmentation ,
2017-09-08 21:16:48 +02:00
augmentationExists , installAugmentations ,
AugmentationNames } from "./Augmentations.js" ;
2017-09-19 20:38:03 +02:00
import { BitNodeMultipliers } from "./BitNode.js" ;
2017-10-12 04:00:22 +02:00
import { commitShopliftCrime , commitRobStoreCrime , commitMugCrime ,
commitLarcenyCrime , commitDealDrugsCrime , commitBondForgeryCrime ,
commitTraffickArmsCrime ,
commitHomicideCrime , commitGrandTheftAutoCrime , commitKidnapCrime ,
2017-10-15 03:55:41 +02:00
commitAssassinationCrime , commitHeistCrime , determineCrimeSuccess ,
determineCrimeChanceShoplift , determineCrimeChanceRobStore ,
determineCrimeChanceMug , determineCrimeChanceLarceny ,
determineCrimeChanceDealDrugs , determineCrimeChanceBondForgery ,
determineCrimeChanceTraffickArms ,
determineCrimeChanceHomicide , determineCrimeChanceGrandTheftAuto ,
determineCrimeChanceKidnap , determineCrimeChanceAssassination ,
determineCrimeChanceHeist } from "./Crimes.js" ;
2018-05-23 02:09:04 +02:00
import { Bladeburner } from "./Bladeburner.js" ;
2017-08-30 19:44:29 +02:00
import { Companies , Company , CompanyPosition ,
2017-08-30 20:36:59 +02:00
CompanyPositions , companyExists } from "./Company.js" ;
2017-08-30 19:44:29 +02:00
import { CONSTANTS } from "./Constants.js" ;
import { Programs } from "./CreateProgram.js" ;
import { parseDarkwebItemPrice , DarkWebItems } from "./DarkWeb.js" ;
2017-08-31 19:19:28 +02:00
import { Engine } from "./engine.js" ;
2017-08-30 19:44:29 +02:00
import { Factions , Faction , joinFaction ,
factionExists , purchaseAugmentation } from "./Faction.js" ;
import { getCostOfNextHacknetNode ,
purchaseHacknet } from "./HacknetNode.js" ;
import { Locations } from "./Location.js" ;
2017-09-07 07:45:14 +02:00
import { Message , Messages } from "./Message.js" ;
2017-11-01 23:56:30 +01:00
import { inMission } from "./Missions.js" ;
2017-08-30 19:44:29 +02:00
import { Player } from "./Player.js" ;
2018-05-06 00:13:35 +02:00
import { Script , findRunningScript , RunningScript ,
isScriptFilename } from "./Script.js" ;
2017-08-30 19:44:29 +02:00
import { Server , getServer , AddToAllServers ,
AllServers , processSingleServerGrowth ,
GetServerByHostname } from "./Server.js" ;
import { Settings } from "./Settings.js" ;
import { SpecialServerIps } from "./SpecialServerIps.js" ;
import { StockMarket , StockSymbols , SymbolToStockMap , initStockSymbols ,
initStockMarket , initSymbolToStockMap , stockMarketCycle , buyStock ,
sellStock , updateStockPrices , displayStockMarketContent ,
updateStockTicker , updateStockPlayerPosition ,
2017-10-25 21:47:47 +02:00
Stock , shortStock , sellShort , OrderTypes ,
PositionTypes , placeOrder , cancelOrder } from "./StockMarket.js" ;
2017-09-01 16:12:40 +02:00
import { post } from "./Terminal.js" ;
2017-10-12 04:00:22 +02:00
import { TextFile , getTextFile , createTextFile } from "./TextFile.js" ;
2017-08-30 19:44:29 +02:00
import { WorkerScript , workerScripts ,
killWorkerScript , NetscriptPorts } from "./NetscriptWorker.js" ;
import { makeRuntimeRejectMsg , netscriptDelay , runScriptFromScript ,
scriptCalculateHackingChance , scriptCalculateHackingTime ,
scriptCalculateExpGain , scriptCalculatePercentMoneyHacked ,
scriptCalculateGrowTime , scriptCalculateWeakenTime } from "./NetscriptEvaluator.js" ;
import { Environment } from "./NetscriptEnvironment.js" ;
2018-03-03 22:05:33 +01:00
import { NetscriptPort } from "./NetscriptPort.js" ;
2017-08-30 19:44:29 +02:00
2018-05-30 19:41:17 +02:00
import Decimal from "decimal.js" ;
2017-09-15 16:06:59 +02:00
import { dialogBoxCreate } from "../utils/DialogBox.js" ;
2017-08-30 19:44:29 +02:00
import { printArray , powerOfTwo } from "../utils/HelperFunctions.js" ;
import { createRandomIp } from "../utils/IPAddress.js" ;
2017-09-15 16:06:59 +02:00
import { formatNumber , isString , isHTML } from "../utils/StringHelperFunctions.js" ;
2017-11-01 23:56:30 +01:00
import { yesNoBoxClose , yesNoBoxGetYesButton ,
yesNoBoxGetNoButton , yesNoBoxCreate ,
yesNoBoxOpen } from "../utils/YesNoBox.js" ;
2017-08-21 18:59:06 +02:00
2018-05-23 02:09:04 +02:00
var hasCorporationSF = false , //Source-File 3
hasSingularitySF = false , //Source-File 4
hasAISF = false , //Source-File 5
hasBladeburnerSF = false , //Source-File 6
hasBladeburner2079SF = false , //Source-File 7
hasWallStreetSF = false , //Source-File 8
hasBn11SF = false ; //Source-File 11
2018-05-02 19:38:11 +02:00
2018-05-23 02:09:04 +02:00
var singularitySFLvl = 1 , wallStreetSFLvl = 1 ;
2018-05-02 19:38:11 +02:00
2018-05-06 05:59:55 +02:00
var possibleLogs = {
ALL : true ,
scan : true ,
hack : true ,
sleep : true ,
disableLog : true ,
enableLog : true ,
grow : true ,
weaken : true ,
nuke : true ,
brutessh : true ,
ftpcrack : true ,
relaysmtp : true ,
httpworm : true ,
sqlinject : true ,
spawn : true ,
kill : true ,
killall : true ,
scp : true ,
getHackingLevel : true ,
getServerMoneyAvailable : true ,
getServerSecurityLevel : true ,
getServerBaseSecurityLevel : true ,
getServerMinSecurityLevel : true ,
getServerRequiredHackingLevel : true ,
getServerMaxMoney : true ,
getServerGrowth : true ,
getServerNumPortsRequired : true ,
getServerRam : true ,
buyStock : true ,
sellStock : true ,
purchaseServer : true ,
deleteServer : true ,
universityCourse : true ,
gymWorkout : true ,
travelToCity : true ,
purchaseTor : true ,
purchaseProgram : true ,
stopAction : true ,
upgradeHomeRam : true ,
workForCompany : true ,
applyToCompany : true ,
joinFaction : true ,
workForFaction : true ,
createProgram : true ,
commitCrime : true ,
shortStock : true ,
sellShort : true ,
}
2018-01-20 05:47:57 +01:00
2017-10-10 06:56:48 +02:00
//Used to check and set flags for every Source File, despite the name of the function
2017-08-30 19:44:29 +02:00
function initSingularitySFFlags ( ) {
for ( var i = 0 ; i < Player . sourceFiles . length ; ++ i ) {
2018-05-23 02:09:04 +02:00
if ( Player . sourceFiles [ i ] . n === 3 ) { hasCorporationSF = true ; }
2017-08-30 19:44:29 +02:00
if ( Player . sourceFiles [ i ] . n === 4 ) {
hasSingularitySF = true ;
singularitySFLvl = Player . sourceFiles [ i ] . lvl ;
}
2018-05-23 02:09:04 +02:00
if ( Player . sourceFiles [ i ] . n === 5 ) { hasAISF = true ; }
if ( Player . sourceFiles [ i ] . n === 6 ) { hasBladeburnerSF = true ; }
if ( Player . sourceFiles [ i ] . n === 7 ) { hasBladeburner2079SF = true ; }
2017-10-20 23:59:54 +02:00
if ( Player . sourceFiles [ i ] . n === 8 ) {
hasWallStreetSF = true ;
wallStreetSFLvl = Player . sourceFiles [ i ] . lvl ;
}
2018-05-23 02:09:04 +02:00
if ( Player . sourceFiles [ i ] . n === 11 ) { hasBn11SF = true ; }
2017-08-30 19:44:29 +02:00
}
}
2017-06-28 11:47:42 +02:00
function NetscriptFunctions ( workerScript ) {
return {
2017-09-12 01:31:42 +02:00
Math : Math ,
2017-09-26 04:44:33 +02:00
Date : Date ,
2018-03-03 22:05:33 +01:00
Number : Number ,
2018-06-03 03:37:56 +02:00
hacknetnodes : Player . hacknetNodeWrappers ,
2017-10-12 22:10:34 +02:00
sprintf : sprintf ,
vsprintf : vsprintf ,
2017-09-19 20:38:03 +02:00
scan : function ( ip = workerScript . serverIp , hostnames = true ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . scan ) {
return 0 ;
} else {
workerScript . loadedFns . scan = true ;
return CONSTANTS . ScriptScanRamCost ;
}
}
2017-06-28 11:47:42 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
throw makeRuntimeRejectMsg ( workerScript , 'Invalid IP or hostname passed into scan() command' ) ;
}
var out = [ ] ;
for ( var i = 0 ; i < server . serversOnNetwork . length ; i ++ ) {
2017-09-19 20:38:03 +02:00
var entry ;
if ( hostnames ) {
entry = server . getServerOnNetwork ( i ) . hostname ;
} else {
entry = server . getServerOnNetwork ( i ) . ip ;
}
2017-06-28 11:47:42 +02:00
if ( entry == null ) {
continue ;
2017-06-11 08:52:52 +02:00
}
2017-06-28 11:47:42 +02:00
out . push ( entry ) ;
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . scan == null ) {
workerScript . scriptRef . log ( 'scan() returned ' + server . serversOnNetwork . length + ' connections for ' + server . hostname ) ;
}
2017-06-28 11:47:42 +02:00
return out ;
} ,
hack : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . hack ) {
return 0 ;
} else {
workerScript . loadedFns . hack = true ;
return CONSTANTS . ScriptHackRamCost ;
}
}
2017-06-28 11:47:42 +02:00
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Hack() call has incorrect number of arguments. Takes 1 argument" ) ;
}
var threads = workerScript . scriptRef . threads ;
if ( isNaN ( threads ) || threads < 1 ) { threads = 1 ; }
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "hack() error. Invalid IP or hostname passed in: " + ip + ". Stopping..." ) ;
throw makeRuntimeRejectMsg ( workerScript , "hack() error. Invalid IP or hostname passed in: " + ip + ". Stopping..." ) ;
2017-06-05 06:48:37 +02:00
}
2017-07-25 03:06:40 +02:00
//Calculate the hacking time
2017-06-28 11:47:42 +02:00
var hackingTime = scriptCalculateHackingTime ( server ) ; //This is in seconds
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
//No root access or skill level too low
if ( server . hasAdminRights == false ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot hack this server (" + server . hostname + ") because user does not have root access" ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot hack this server (" + server . hostname + ") because user does not have root access" ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
if ( server . requiredHackingSkill > Player . hacking _skill ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot hack this server (" + server . hostname + ") because user's hacking skill is not high enough" ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot hack this server (" + server . hostname + ") because user's hacking skill is not high enough" ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . hack == null ) {
workerScript . scriptRef . log ( "Attempting to hack " + ip + " in " + hackingTime . toFixed ( 3 ) + " seconds (t=" + threads + ")" ) ;
}
2017-09-15 16:06:59 +02:00
return netscriptDelay ( hackingTime * 1000 , workerScript ) . then ( function ( ) {
2017-06-28 11:47:42 +02:00
if ( workerScript . env . stopFlag ) { return Promise . reject ( workerScript ) ; }
var hackChance = scriptCalculateHackingChance ( server ) ;
var rand = Math . random ( ) ;
var expGainedOnSuccess = scriptCalculateExpGain ( server ) * threads ;
var expGainedOnFailure = ( expGainedOnSuccess / 4 ) ;
2018-05-23 02:09:04 +02:00
if ( rand < hackChance ) { //Success!
2017-06-28 11:47:42 +02:00
var moneyGained = scriptCalculatePercentMoneyHacked ( server ) ;
moneyGained = Math . floor ( server . moneyAvailable * moneyGained ) * threads ;
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
//Over-the-top safety checks
if ( moneyGained <= 0 ) {
moneyGained = 0 ;
expGainedOnSuccess = expGainedOnFailure ;
2017-06-15 03:19:52 +02:00
}
2017-06-28 11:47:42 +02:00
if ( moneyGained > server . moneyAvailable ) { moneyGained = server . moneyAvailable ; }
server . moneyAvailable -= moneyGained ;
if ( server . moneyAvailable < 0 ) { server . moneyAvailable = 0 ; }
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
Player . gainMoney ( moneyGained ) ;
workerScript . scriptRef . onlineMoneyMade += moneyGained ;
2017-09-26 04:44:33 +02:00
Player . scriptProdSinceLastAug += moneyGained ;
2017-06-28 11:47:42 +02:00
workerScript . scriptRef . recordHack ( server . ip , moneyGained , threads ) ;
Player . gainHackingExp ( expGainedOnSuccess ) ;
workerScript . scriptRef . onlineExpGained += expGainedOnSuccess ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . hack == null ) {
workerScript . scriptRef . log ( "Script SUCCESSFULLY hacked " + server . hostname + " for $" + formatNumber ( moneyGained , 2 ) + " and " + formatNumber ( expGainedOnSuccess , 4 ) + " exp (t=" + threads + ")" ) ;
}
2017-06-28 11:47:42 +02:00
server . fortify ( CONSTANTS . ServerFortifyAmount * threads ) ;
2018-02-24 23:55:06 +01:00
return Promise . resolve ( moneyGained ) ;
2017-07-25 03:06:40 +02:00
} else {
2018-02-24 23:55:06 +01:00
//Player only gains 25% exp for failure?
2017-06-28 11:47:42 +02:00
Player . gainHackingExp ( expGainedOnFailure ) ;
workerScript . scriptRef . onlineExpGained += expGainedOnFailure ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . hack == null ) {
workerScript . scriptRef . log ( "Script FAILED to hack " + server . hostname + ". Gained " + formatNumber ( expGainedOnFailure , 4 ) + " exp (t=" + threads + ")" ) ;
}
return Promise . resolve ( 0 ) ;
2017-06-15 03:19:52 +02:00
}
2017-06-28 11:47:42 +02:00
} ) ;
} ,
2018-02-24 23:55:06 +01:00
sleep : function ( time ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) { return 0 ; }
2017-06-28 11:47:42 +02:00
if ( time === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "sleep() call has incorrect number of arguments. Takes 1 argument" ) ;
2017-06-15 03:19:52 +02:00
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . sleep == null ) {
2017-07-22 00:54:55 +02:00
workerScript . scriptRef . log ( "Sleeping for " + time + " milliseconds" ) ;
}
2017-09-15 16:06:59 +02:00
return netscriptDelay ( time , workerScript ) . then ( function ( ) {
2017-06-28 11:47:42 +02:00
return Promise . resolve ( true ) ;
} ) ;
} ,
grow : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . grow ) {
return 0 ;
} else {
workerScript . loadedFns . grow = true ;
return CONSTANTS . ScriptGrowRamCost ;
}
}
2017-06-28 11:47:42 +02:00
var threads = workerScript . scriptRef . threads ;
if ( isNaN ( threads ) || threads < 1 ) { threads = 1 ; }
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "grow() call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot grow(). Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot grow(). Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
//No root access or skill level too low
if ( server . hasAdminRights == false ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot grow this server (" + server . hostname + ") because user does not have root access" ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot grow this server (" + server . hostname + ") because user does not have root access" ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
var growTime = scriptCalculateGrowTime ( server ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . grow == null ) {
workerScript . scriptRef . log ( "Executing grow() on server " + server . hostname + " in " + formatNumber ( growTime / 1000 , 3 ) + " seconds (t=" + threads + ")" ) ;
}
2017-09-15 16:06:59 +02:00
return netscriptDelay ( growTime , workerScript ) . then ( function ( ) {
2017-06-28 11:47:42 +02:00
if ( workerScript . env . stopFlag ) { return Promise . reject ( workerScript ) ; }
server . moneyAvailable += ( 1 * threads ) ; //It can be grown even if it has no money
var growthPercentage = processSingleServerGrowth ( server , 450 * threads ) ;
workerScript . scriptRef . recordGrow ( server . ip , threads ) ;
var expGain = scriptCalculateExpGain ( server ) * threads ;
if ( growthPercentage == 1 ) {
expGain = 0 ;
2017-06-11 22:28:20 +02:00
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . grow == null ) {
workerScript . scriptRef . log ( "Available money on " + server . hostname + " grown by " +
formatNumber ( growthPercentage * 100 - 100 , 6 ) + "%. Gained " +
formatNumber ( expGain , 4 ) + " hacking exp (t=" + threads + ")" ) ;
}
2017-06-28 11:47:42 +02:00
workerScript . scriptRef . onlineExpGained += expGain ;
2017-07-25 03:06:40 +02:00
Player . gainHackingExp ( expGain ) ;
2017-06-28 11:47:42 +02:00
return Promise . resolve ( growthPercentage ) ;
2017-07-25 03:06:40 +02:00
} ) ;
2017-06-28 11:47:42 +02:00
} ,
weaken : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . weaken ) {
return 0 ;
} else {
workerScript . loadedFns . weaken = true ;
return CONSTANTS . ScriptWeakenRamCost ;
}
}
2017-06-28 11:47:42 +02:00
var threads = workerScript . scriptRef . threads ;
if ( isNaN ( threads ) || threads < 1 ) { threads = 1 ; }
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "weaken() call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot weaken(). Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot weaken(). Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
//No root access or skill level too low
if ( server . hasAdminRights == false ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Cannot weaken this server (" + server . hostname + ") because user does not have root access" ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot weaken this server (" + server . hostname + ") because user does not have root access" ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
var weakenTime = scriptCalculateWeakenTime ( server ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . weaken == null ) {
workerScript . scriptRef . log ( "Executing weaken() on server " + server . hostname + " in " +
formatNumber ( weakenTime / 1000 , 3 ) + " seconds (t=" + threads + ")" ) ;
}
2017-09-15 16:06:59 +02:00
return netscriptDelay ( weakenTime , workerScript ) . then ( function ( ) {
2017-06-28 11:47:42 +02:00
if ( workerScript . env . stopFlag ) { return Promise . reject ( workerScript ) ; }
server . weaken ( CONSTANTS . ServerWeakenAmount * threads ) ;
workerScript . scriptRef . recordWeaken ( server . ip , threads ) ;
var expGain = scriptCalculateExpGain ( server ) * threads ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . weaken == null ) {
workerScript . scriptRef . log ( "Server security level on " + server . hostname + " weakened to " + server . hackDifficulty +
". Gained " + formatNumber ( expGain , 4 ) + " hacking exp (t=" + threads + ")" ) ;
}
2017-06-28 11:47:42 +02:00
workerScript . scriptRef . onlineExpGained += expGain ;
2017-07-25 03:06:40 +02:00
Player . gainHackingExp ( expGain ) ;
2017-06-28 11:47:42 +02:00
return Promise . resolve ( CONSTANTS . ServerWeakenAmount * threads ) ;
2017-07-25 03:06:40 +02:00
} ) ;
2017-06-28 11:47:42 +02:00
} ,
print : function ( args ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) { return 0 ; }
2017-06-28 11:47:42 +02:00
if ( args === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "print() call has incorrect number of arguments. Takes 1 argument" ) ;
}
workerScript . scriptRef . log ( args . toString ( ) ) ;
} ,
2017-09-01 16:12:40 +02:00
tprint : function ( args ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) { return 0 ; }
2017-10-26 00:05:12 +02:00
if ( args === undefined || args == null ) {
2017-09-01 16:12:40 +02:00
throw makeRuntimeRejectMsg ( workerScript , "tprint() call has incorrect number of arguments. Takes 1 argument" ) ;
}
2017-09-15 16:06:59 +02:00
var x = args . toString ( ) ;
if ( isHTML ( x ) ) {
Player . takeDamage ( 1 ) ;
dialogBoxCreate ( "You suddenly feel a sharp shooting pain through your body as an angry voice in your head exclaims: <br><br>" +
"DON'T USE TPRINT() TO OUTPUT HTML ELEMENTS TO YOUR TERMINAL!!!!<br><br>" +
"(You lost 1 HP)" ) ;
return ;
}
2017-09-01 16:12:40 +02:00
post ( workerScript . scriptRef . filename + ": " + args . toString ( ) ) ;
} ,
2017-07-22 00:54:55 +02:00
clearLog : function ( ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) { return 0 ; }
2017-07-22 00:54:55 +02:00
workerScript . scriptRef . clearLog ( ) ;
} ,
2018-02-24 23:55:06 +01:00
disableLog : function ( fn ) {
if ( workerScript . checkingRam ) { return 0 ; }
2018-05-06 05:59:55 +02:00
if ( possibleLogs [ fn ] === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Invalid argument to disableLog: " + fn ) ;
}
2018-02-24 23:55:06 +01:00
workerScript . disableLogs [ fn ] = true ;
2018-05-06 05:59:55 +02:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . disableLog == null ) {
workerScript . scriptRef . log ( "Disabled logging for " + fn ) ;
}
2018-02-24 23:55:06 +01:00
} ,
enableLog : function ( fn ) {
if ( workerScript . checkingRam ) { return 0 ; }
2018-05-06 05:59:55 +02:00
if ( possibleLogs [ fn ] === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Invalid argument to enableLog: " + fn ) ;
}
2018-02-24 23:55:06 +01:00
delete workerScript . disableLogs [ fn ] ;
2018-05-06 05:59:55 +02:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . enableLog == null ) {
workerScript . scriptRef . log ( "Enabled logging for " + fn ) ;
}
2018-02-24 23:55:06 +01:00
} ,
2017-06-28 11:47:42 +02:00
nuke : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . nuke ) {
return 0 ;
} else {
workerScript . loadedFns . nuke = true ;
return CONSTANTS . ScriptPortProgramRamCost ;
}
}
2017-06-28 11:47:42 +02:00
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Program call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-08-01 21:03:45 +02:00
workerScript . scriptRef . log ( "Cannot call nuke(). Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot call nuke(). Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-22 00:54:55 +02:00
if ( ! Player . hasProgram ( Programs . NukeProgram ) ) {
throw makeRuntimeRejectMsg ( workerScript , "You do not have the NUKE.exe virus!" ) ;
}
2017-06-28 11:47:42 +02:00
if ( server . openPortCount < server . numOpenPortsRequired ) {
throw makeRuntimeRejectMsg ( workerScript , "Not enough ports opened to use NUKE.exe virus" ) ;
}
if ( server . hasAdminRights ) {
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . nuke == null ) {
workerScript . scriptRef . log ( "Already have root access to " + server . hostname ) ;
}
2017-06-28 11:47:42 +02:00
} else {
server . hasAdminRights = true ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . nuke == null ) {
workerScript . scriptRef . log ( "Executed NUKE.exe virus on " + server . hostname + " to gain root access" ) ;
}
2017-06-28 11:47:42 +02:00
}
return true ;
} ,
brutessh : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . brutessh ) {
return 0 ;
} else {
workerScript . loadedFns . brutessh = true ;
return CONSTANTS . ScriptPortProgramRamCost ;
}
}
2017-06-28 11:47:42 +02:00
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Program call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-08-01 21:03:45 +02:00
workerScript . scriptRef . log ( "Cannot call brutessh(). Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot call brutessh(). Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-22 00:54:55 +02:00
if ( ! Player . hasProgram ( Programs . BruteSSHProgram ) ) {
2017-08-30 19:44:29 +02:00
workerScript . scriptRef . log ( "You do not have the BruteSSH.exe program!" ) ;
2017-07-22 00:54:55 +02:00
throw makeRuntimeRejectMsg ( workerScript , "You do not have the BruteSSH.exe program!" ) ;
}
2017-06-28 11:47:42 +02:00
if ( ! server . sshPortOpen ) {
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . brutessh == null ) {
workerScript . scriptRef . log ( "Executed BruteSSH.exe on " + server . hostname + " to open SSH port (22)" ) ;
}
2017-07-25 03:06:40 +02:00
server . sshPortOpen = true ;
2017-06-28 11:47:42 +02:00
++ server . openPortCount ;
} else {
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . brutessh == null ) {
workerScript . scriptRef . log ( "SSH Port (22) already opened on " + server . hostname ) ;
}
2017-06-28 11:47:42 +02:00
}
return true ;
} ,
ftpcrack : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . ftpcrack ) {
return 0 ;
} else {
workerScript . loadedFns . ftpcrack = true ;
return CONSTANTS . ScriptPortProgramRamCost ;
}
}
2017-06-28 11:47:42 +02:00
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Program call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-08-01 21:03:45 +02:00
workerScript . scriptRef . log ( "Cannot call ftpcrack(). Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot call ftpcrack(). Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-22 00:54:55 +02:00
if ( ! Player . hasProgram ( Programs . FTPCrackProgram ) ) {
throw makeRuntimeRejectMsg ( workerScript , "You do not have the FTPCrack.exe program!" ) ;
}
2017-06-28 11:47:42 +02:00
if ( ! server . ftpPortOpen ) {
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . ftpcrack == null ) {
workerScript . scriptRef . log ( "Executed FTPCrack.exe on " + server . hostname + " to open FTP port (21)" ) ;
}
2017-07-25 03:06:40 +02:00
server . ftpPortOpen = true ;
2017-06-28 11:47:42 +02:00
++ server . openPortCount ;
} else {
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . ftpcrack == null ) {
workerScript . scriptRef . log ( "FTP Port (21) already opened on " + server . hostname ) ;
}
2017-06-28 11:47:42 +02:00
}
return true ;
} ,
relaysmtp : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . relaysmtp ) {
return 0 ;
} else {
workerScript . loadedFns . relaysmtp = true ;
return CONSTANTS . ScriptPortProgramRamCost ;
}
}
2017-06-28 11:47:42 +02:00
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Program call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-08-01 21:03:45 +02:00
workerScript . scriptRef . log ( "Cannot call relaysmtp(). Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot call relaysmtp(). Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-22 00:54:55 +02:00
if ( ! Player . hasProgram ( Programs . RelaySMTPProgram ) ) {
throw makeRuntimeRejectMsg ( workerScript , "You do not have the relaySMTP.exe program!" ) ;
}
2017-06-28 11:47:42 +02:00
if ( ! server . smtpPortOpen ) {
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . relaysmtp == null ) {
workerScript . scriptRef . log ( "Executed relaySMTP.exe on " + server . hostname + " to open SMTP port (25)" ) ;
}
2017-07-25 03:06:40 +02:00
server . smtpPortOpen = true ;
2017-06-28 11:47:42 +02:00
++ server . openPortCount ;
} else {
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . relaysmtp == null ) {
workerScript . scriptRef . log ( "SMTP Port (25) already opened on " + server . hostname ) ;
}
2017-06-28 11:47:42 +02:00
}
return true ;
} ,
httpworm : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . httpworm ) {
return 0 ;
} else {
workerScript . loadedFns . httpworm = true ;
return CONSTANTS . ScriptPortProgramRamCost ;
}
}
2017-06-28 11:47:42 +02:00
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Program call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-08-01 21:03:45 +02:00
workerScript . scriptRef . log ( "Cannot call httpworm(). Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot call httpworm(). Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-22 00:54:55 +02:00
if ( ! Player . hasProgram ( Programs . HTTPWormProgram ) ) {
throw makeRuntimeRejectMsg ( workerScript , "You do not have the HTTPWorm.exe program!" ) ;
}
2017-06-28 11:47:42 +02:00
if ( ! server . httpPortOpen ) {
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . httpworm == null ) {
workerScript . scriptRef . log ( "Executed HTTPWorm.exe on " + server . hostname + " to open HTTP port (80)" ) ;
}
2017-07-25 03:06:40 +02:00
server . httpPortOpen = true ;
2017-06-28 11:47:42 +02:00
++ server . openPortCount ;
} else {
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . httpworm == null ) {
workerScript . scriptRef . log ( "HTTP Port (80) already opened on " + server . hostname ) ;
}
2017-06-28 11:47:42 +02:00
}
return true ;
} ,
sqlinject : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . sqlinject ) {
return 0 ;
} else {
workerScript . loadedFns . sqlinject = true ;
return CONSTANTS . ScriptPortProgramRamCost ;
}
}
2017-06-28 11:47:42 +02:00
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Program call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-08-01 21:03:45 +02:00
workerScript . scriptRef . log ( "Cannot call sqlinject(). Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "Cannot call sqlinject(). Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-22 00:54:55 +02:00
if ( ! Player . hasProgram ( Programs . SQLInjectProgram ) ) {
throw makeRuntimeRejectMsg ( workerScript , "You do not have the SQLInject.exe program!" ) ;
}
2017-06-28 11:47:42 +02:00
if ( ! server . sqlPortOpen ) {
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . sqlinject == null ) {
workerScript . scriptRef . log ( "Executed SQLInject.exe on " + server . hostname + " to open SQL port (1433)" ) ;
}
2017-07-25 03:06:40 +02:00
server . sqlPortOpen = true ;
2017-06-28 11:47:42 +02:00
++ server . openPortCount ;
} else {
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . sqlinject == null ) {
workerScript . scriptRef . log ( "SQL Port (1433) already opened on " + server . hostname ) ;
}
2017-06-28 11:47:42 +02:00
}
return true ;
} ,
2017-07-13 18:54:29 +02:00
run : function ( scriptname , threads = 1 ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . run ) {
return 0 ;
} else {
workerScript . loadedFns . run = true ;
return CONSTANTS . ScriptRunRamCost ;
}
}
2017-06-28 11:47:42 +02:00
if ( scriptname === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "run() call has incorrect number of arguments. Usage: run(scriptname, [numThreads], [arg1], [arg2]...)" ) ;
}
if ( isNaN ( threads ) || threads < 1 ) {
throw makeRuntimeRejectMsg ( workerScript , "Invalid argument for thread count passed into run(). Must be numeric and greater than 0" ) ;
}
2017-07-13 18:54:29 +02:00
var argsForNewScript = [ ] ;
for ( var i = 2 ; i < arguments . length ; ++ i ) {
argsForNewScript . push ( arguments [ i ] ) ;
}
2017-06-28 11:47:42 +02:00
var scriptServer = getServer ( workerScript . serverIp ) ;
if ( scriptServer == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Could not find server. This is a bug in the game. Report to game dev" ) ;
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
return runScriptFromScript ( scriptServer , scriptname , argsForNewScript , workerScript , threads ) ;
} ,
2018-01-27 07:52:39 +01:00
exec : function ( scriptname , ip , threads = 1 ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . exec ) {
return 0 ;
} else {
workerScript . loadedFns . exec = true ;
return CONSTANTS . ScriptExecRamCost ;
}
}
2017-06-28 11:47:42 +02:00
if ( scriptname === undefined || ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "exec() call has incorrect number of arguments. Usage: exec(scriptname, server, [numThreads], [arg1], [arg2]...)" ) ;
}
if ( isNaN ( threads ) || threads < 1 ) {
throw makeRuntimeRejectMsg ( workerScript , "Invalid argument for thread count passed into exec(). Must be numeric and greater than 0" ) ;
}
2017-07-13 18:54:29 +02:00
var argsForNewScript = [ ] ;
for ( var i = 3 ; i < arguments . length ; ++ i ) {
argsForNewScript . push ( arguments [ i ] ) ;
}
2017-06-28 11:47:42 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
2017-08-13 07:01:33 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Invalid hostname/ip passed into exec() command: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
return runScriptFromScript ( server , scriptname , argsForNewScript , workerScript , threads ) ;
} ,
2018-02-15 05:26:43 +01:00
spawn : function ( scriptname , threads ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . spawn ) {
return 0 ;
} else {
workerScript . loadedFns . spawn = true ;
return CONSTANTS . ScriptSpawnRamCost ;
}
}
2018-03-03 22:05:33 +01:00
if ( scriptname == null || threads == null ) {
2018-02-15 05:26:43 +01:00
throw makeRuntimeRejectMsg ( workerScript , "Invalid scriptname or numThreads argument passed to spawn()" ) ;
}
setTimeout ( ( ) => {
NetscriptFunctions ( workerScript ) . run . apply ( this , arguments ) ;
} , 20000 ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . spawn == null ) {
workerScript . scriptRef . log ( "spawn() will execute " + scriptname + " in 20 seconds" ) ;
}
2018-02-15 05:26:43 +01:00
NetscriptFunctions ( workerScript ) . exit ( ) ;
} ,
2018-01-27 07:52:39 +01:00
kill : function ( filename , ip ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . kill ) {
return 0 ;
} else {
workerScript . loadedFns . kill = true ;
return CONSTANTS . ScriptKillRamCost ;
}
}
2017-06-28 11:47:42 +02:00
if ( filename === undefined || ip === undefined ) {
2017-07-25 03:06:40 +02:00
throw makeRuntimeRejectMsg ( workerScript , "kill() call has incorrect number of arguments. Usage: kill(scriptname, server, [arg1], [arg2]...)" ) ;
2017-06-28 11:47:42 +02:00
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "kill() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "kill() failed. Invalid IP or hostname passed in: " + ip ) ;
}
var argsForKillTarget = [ ] ;
for ( var i = 2 ; i < arguments . length ; ++ i ) {
argsForKillTarget . push ( arguments [ i ] ) ;
2017-06-28 11:47:42 +02:00
}
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 false ;
}
var res = killWorkerScript ( runningScriptObj , server . ip ) ;
if ( res ) {
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . kill == null ) {
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-28 11:47:42 +02:00
return true ;
} else {
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . kill == null ) {
workerScript . scriptRef . log ( "kill() failed. No such script " + filename + " on " + server . hostname + " with args: " + printArray ( argsForKillTarget ) ) ;
}
2017-06-28 11:47:42 +02:00
return false ;
}
} ,
2018-03-03 22:05:33 +01:00
killall : function ( ip = workerScript . serverIp ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . killall ) {
return 0 ;
} else {
workerScript . loadedFns . killall = true ;
return CONSTANTS . ScriptKillRamCost ;
}
}
2017-06-28 11:47:42 +02:00
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "killall() call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "killall() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "killall() failed. Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2018-02-24 23:55:06 +01:00
var scriptsRunning = ( server . runningScripts . length > 0 ) ;
2017-06-28 11:47:42 +02:00
for ( var i = server . runningScripts . length - 1 ; i >= 0 ; -- i ) {
killWorkerScript ( server . runningScripts [ i ] , server . ip ) ;
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . killall == null ) {
workerScript . scriptRef . log ( "killall(): Killing all scripts on " + server . hostname + ". May take a few minutes for the scripts to die" ) ;
}
return scriptsRunning ;
2017-06-28 11:47:42 +02:00
} ,
2017-12-07 04:45:47 +01:00
exit : function ( ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . exit ) {
return 0 ;
} else {
workerScript . loadedFns . exit = true ;
return CONSTANTS . ScriptKillRamCost ;
}
}
2017-12-07 04:45:47 +01:00
var server = getServer ( workerScript . serverIp ) ;
if ( server == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Error getting Server for this script in exit(). This is a bug please contact game dev" ) ;
}
if ( killWorkerScript ( workerScript . scriptRef , server . ip ) ) {
workerScript . scriptRef . log ( "Exiting..." ) ;
} else {
workerScript . scriptRef . log ( "Exit failed(). This is a bug please contact game developer" ) ;
}
} ,
2018-01-27 07:52:39 +01:00
scp : function ( scriptname , ip1 , ip2 ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . scp ) {
return 0 ;
} else {
workerScript . loadedFns . scp = true ;
return CONSTANTS . ScriptScpRamCost ;
}
}
2017-09-19 20:38:03 +02:00
if ( arguments . length !== 2 && arguments . length !== 3 ) {
throw makeRuntimeRejectMsg ( workerScript , "Error: scp() call has incorrect number of arguments. Takes 2 or 3 arguments" ) ;
2017-09-07 07:45:14 +02:00
}
2017-09-27 17:13:42 +02:00
if ( scriptname && scriptname . constructor === Array ) {
//Recursively call scp on all elements of array
var res = false ;
scriptname . forEach ( function ( script ) {
if ( NetscriptFunctions ( workerScript ) . scp ( script , ip1 , ip2 ) ) {
res = true ;
} ;
} ) ;
return res ;
}
2018-05-06 00:13:35 +02:00
if ( ! scriptname . endsWith ( ".lit" ) && ! isScriptFilename ( scriptname ) &&
2018-02-24 23:55:06 +01:00
! scriptname . endsWith ( "txt" ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Error: scp() does not work with this file type. It only works for .script, .lit, and .txt files" ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2017-09-19 20:38:03 +02:00
var destServer , currServ ;
if ( arguments . length === 3 ) { //scriptname, source, destination
if ( scriptname === undefined || ip1 === undefined || ip2 === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Error: scp() call has incorrect number of arguments. Takes 2 or 3 arguments" ) ;
}
destServer = getServer ( ip2 ) ;
if ( destServer == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Error: Invalid hostname/ip passed into scp() command: " + ip ) ;
}
currServ = getServer ( ip1 ) ;
if ( currServ == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Could not find server ip for this script. This is a bug please contact game developer" ) ;
}
} else if ( arguments . length === 2 ) { //scriptname, destination
if ( scriptname === undefined || ip1 === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Error: scp() call has incorrect number of arguments. Takes 2 or 3 arguments" ) ;
}
destServer = getServer ( ip1 ) ;
if ( destServer == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Error: Invalid hostname/ip passed into scp() command: " + ip ) ;
}
currServ = getServer ( workerScript . serverIp ) ;
if ( currServ == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Could not find server ip for this script. This is a bug please contact game developer" ) ;
}
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2017-09-07 07:45:14 +02:00
//Scp for lit files
if ( scriptname . endsWith ( ".lit" ) ) {
var found = false ;
for ( var i = 0 ; i < currServ . messages . length ; ++ i ) {
if ( ! ( currServ . messages [ i ] instanceof Message ) && currServ . messages [ i ] == scriptname ) {
found = true ;
2018-02-24 23:55:06 +01:00
break ;
2017-09-07 07:45:14 +02:00
}
}
if ( ! found ) {
workerScript . scriptRef . log ( scriptname + " does not exist. scp() failed" ) ;
return false ;
}
for ( var i = 0 ; i < destServer . messages . length ; ++ i ) {
if ( destServer . messages [ i ] === scriptname ) {
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . scp == null ) {
workerScript . scriptRef . log ( scriptname + " copied over to " + destServer . hostname ) ;
}
2017-09-07 07:45:14 +02:00
return true ; //Already exists
}
}
destServer . messages . push ( scriptname ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . scp == null ) {
workerScript . scriptRef . log ( scriptname + " copied over to " + destServer . hostname ) ;
}
return true ;
}
//Scp for text files
if ( scriptname . endsWith ( ".txt" ) ) {
var found = false , txtFile ;
for ( var i = 0 ; i < currServ . textFiles . length ; ++ i ) {
if ( currServ . textFiles [ i ] . fn === scriptname ) {
found = true ;
txtFile = currServ . textFiles [ i ] ;
break ;
}
}
if ( ! found ) {
workerScript . scriptRef . log ( scriptname + " does not exist. scp() failed" ) ;
return false ;
}
for ( var i = 0 ; i < destServer . textFiles . length ; ++ i ) {
if ( destServer . textFiles [ i ] . fn === scriptname ) {
//Overwrite
destServer . textFiles [ i ] . text = txtFile . text ;
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . scp == null ) {
workerScript . scriptRef . log ( scriptname + " copied over to " + destServer . hostname ) ;
}
return true ;
}
}
var newFile = new TextFile ( txtFile . fn , txtFile . text ) ;
destServer . textFiles . push ( newFile ) ;
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . scp == null ) {
workerScript . scriptRef . log ( scriptname + " copied over to " + destServer . hostname ) ;
}
2017-09-07 07:45:14 +02:00
return true ;
}
//Scp for script files
2017-06-28 11:47:42 +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-06-11 22:28:20 +02:00
}
2017-06-28 11:47:42 +02:00
}
if ( sourceScript == null ) {
workerScript . scriptRef . log ( scriptname + " does not exist. scp() failed" ) ;
return false ;
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +02:00
//Overwrite script if it already exists
for ( var i = 0 ; i < destServer . scripts . length ; ++ i ) {
if ( scriptname == destServer . scripts [ i ] . filename ) {
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . scp == null ) {
workerScript . scriptRef . log ( "WARNING: " + scriptname + " already exists on " + destServer . hostname + " and it will be overwritten." ) ;
workerScript . scriptRef . log ( scriptname + " overwritten on " + destServer . hostname ) ;
}
2017-06-28 11:47:42 +02:00
var oldScript = destServer . scripts [ i ] ;
oldScript . code = sourceScript . code ;
oldScript . ramUsage = sourceScript . ramUsage ;
return true ;
2017-06-18 06:36:16 +02:00
}
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2017-06-28 11:47:42 +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 ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . scp == null ) {
workerScript . scriptRef . log ( scriptname + " copied over to " + destServer . hostname ) ;
}
2017-06-28 11:47:42 +02:00
return true ;
} ,
2017-09-07 07:45:14 +02:00
ls : function ( ip , grep ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . ls ) {
return 0 ;
} else {
workerScript . loadedFns . ls = true ;
return CONSTANTS . ScriptScanRamCost ;
}
}
2017-09-07 07:45:14 +02:00
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "ls() failed because of invalid arguments. Usage: ls(ip/hostname, [grep filter])" ) ;
}
var server = getServer ( ip ) ;
2017-10-26 00:05:12 +02:00
if ( server == null ) {
2017-09-07 07:45:14 +02:00
workerScript . scriptRef . log ( "ls() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "ls() failed. Invalid IP or hostname passed in: " + ip ) ;
}
//Get the grep filter, if one exists
var filter = false ;
if ( arguments . length >= 2 ) {
filter = grep . toString ( ) ;
}
var allFiles = [ ] ;
for ( var i = 0 ; i < server . programs . length ; i ++ ) {
if ( filter ) {
if ( server . programs [ i ] . includes ( filter ) ) {
allFiles . push ( server . programs [ i ] ) ;
}
} else {
allFiles . push ( server . programs [ i ] ) ;
}
}
for ( var i = 0 ; i < server . scripts . length ; i ++ ) {
if ( filter ) {
if ( server . scripts [ i ] . filename . includes ( filter ) ) {
allFiles . push ( server . scripts [ i ] . filename ) ;
}
} else {
allFiles . push ( server . scripts [ i ] . filename ) ;
}
}
for ( var i = 0 ; i < server . messages . length ; i ++ ) {
if ( filter ) {
if ( server . messages [ i ] instanceof Message ) {
if ( server . messages [ i ] . filename . includes ( filter ) ) {
allFiles . push ( server . messages [ i ] . filename ) ;
}
} else if ( server . messages [ i ] . includes ( filter ) ) {
allFiles . push ( server . messages [ i ] ) ;
}
} else {
if ( server . messages [ i ] instanceof Message ) {
allFiles . push ( server . messages [ i ] . filename ) ;
} else {
allFiles . push ( server . messages [ i ] ) ;
}
}
}
2018-02-18 04:08:54 +01:00
for ( var i = 0 ; i < server . textFiles . length ; i ++ ) {
if ( filter ) {
if ( server . textFiles [ i ] . fn . includes ( filter ) ) {
allFiles . push ( server . textFiles [ i ] . fn ) ;
}
} else {
allFiles . push ( server . textFiles [ i ] . fn ) ;
}
}
2017-09-07 07:45:14 +02:00
//Sort the files alphabetically then print each
allFiles . sort ( ) ;
return allFiles ;
} ,
2018-01-27 07:52:39 +01:00
hasRootAccess : function ( ip ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . hasRootAccess ) {
return 0 ;
} else {
workerScript . loadedFns . hasRootAccess = true ;
return CONSTANTS . ScriptHasRootAccessRamCost ;
}
}
2017-07-13 18:54:29 +02:00
if ( ip === undefined ) {
2017-06-28 11:47:42 +02:00
throw makeRuntimeRejectMsg ( workerScript , "hasRootAccess() call has incorrect number of arguments. Takes 1 argument" ) ;
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "hasRootAccess() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "hasRootAccess() failed. Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-13 18:54:29 +02:00
return server . hasAdminRights ;
2017-06-28 11:47:42 +02:00
} ,
2017-09-19 20:38:03 +02:00
getIp : function ( ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getIp ) {
return 0 ;
} else {
workerScript . loadedFns . getIp = true ;
return CONSTANTS . ScriptGetHostnameRamCost ;
}
}
2017-09-19 20:38:03 +02:00
var scriptServer = getServer ( workerScript . serverIp ) ;
if ( scriptServer == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Could not find server. This is a bug in the game. Report to game dev" ) ;
}
return scriptServer . ip ;
} ,
2017-06-28 11:47:42 +02:00
getHostname : function ( ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getHostname ) {
return 0 ;
} else {
workerScript . loadedFns . getHostname = true ;
return CONSTANTS . ScriptGetHostnameRamCost ;
}
}
2017-06-28 11:47:42 +02:00
var scriptServer = getServer ( workerScript . serverIp ) ;
if ( scriptServer == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Could not find server. This is a bug in the game. Report to game dev" ) ;
}
return scriptServer . hostname ;
} ,
getHackingLevel : function ( ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getHackingLevel ) {
return 0 ;
} else {
workerScript . loadedFns . getHackingLevel = true ;
return CONSTANTS . ScriptGetHackingLevelRamCost ;
}
}
2017-06-28 11:47:42 +02:00
Player . updateSkillLevels ( ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . getHackingLevel == null ) {
workerScript . scriptRef . log ( "getHackingLevel() returned " + Player . hacking _skill ) ;
}
2017-06-28 11:47:42 +02:00
return Player . hacking _skill ;
} ,
2017-09-19 20:38:03 +02:00
getHackingMultipliers : function ( ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getHackingMultipliers ) {
return 0 ;
} else {
workerScript . loadedFns . getHackingMultipliers = true ;
return CONSTANTS . ScriptGetMultipliersRamCost ;
}
}
2017-09-19 20:38:03 +02:00
return {
chance : Player . hacking _chance _mult ,
speed : Player . hacking _speed _mult ,
money : Player . hacking _money _mult ,
growth : Player . hacking _grow _mult ,
} ;
} ,
2018-05-06 20:22:29 +02:00
getHacknetMultipliers : function ( ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getHacknetMultipliers ) {
return 0 ;
} else {
workerScript . loadedFns . getHacknetMultipliers = true ;
return CONSTANTS . ScriptGetMultipliersRamCost ;
}
}
return {
production : Player . hacknet _node _money _mult ,
purchaseCost : Player . hacknet _node _purchase _cost _mult ,
ramCost : Player . hacknet _node _ram _cost _mult ,
coreCost : Player . hacknet _node _core _cost _mult ,
levelCost : Player . hacknet _node _level _cost _mult ,
} ;
} ,
2017-09-19 20:38:03 +02:00
getBitNodeMultipliers : function ( ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getBitNodeMultipliers ) {
return 0 ;
} else {
workerScript . loadedFns . getBitNodeMultipliers = true ;
return CONSTANTS . ScriptGetMultipliersRamCost ;
}
}
2017-09-19 20:38:03 +02:00
if ( ! hasAISF ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getBitNodeMultipliers(). It requires Source-File 5 to run." ) ;
}
2018-06-03 03:37:56 +02:00
let copy = Object . assign ( { } , BitNodeMultipliers ) ;
return copy ;
2017-09-19 20:38:03 +02:00
} ,
2017-06-28 11:47:42 +02:00
getServerMoneyAvailable : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getServerMoneyAvailable ) {
return 0 ;
} else {
workerScript . loadedFns . getServerMoneyAvailable = true ;
return CONSTANTS . ScriptGetServerRamCost ;
}
}
2017-06-28 11:47:42 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
2017-09-07 07:45:14 +02:00
workerScript . scriptRef . log ( "getServerMoneyAvailable() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getServerMoneyAvailable() failed. Invalid IP or hostname passed in: " + ip ) ;
2017-07-13 18:54:29 +02:00
}
if ( server . hostname == "home" ) {
//Return player's money
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . getServerMoneyAvailable == null ) {
workerScript . scriptRef . log ( "getServerMoneyAvailable('home') returned player's money: $" + formatNumber ( Player . money . toNumber ( ) , 2 ) ) ;
}
2017-07-29 18:25:40 +02:00
return Player . money . toNumber ( ) ;
2017-06-28 11:47:42 +02:00
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . getServerMoneyAvailable == null ) {
workerScript . scriptRef . log ( "getServerMoneyAvailable() returned " + formatNumber ( server . moneyAvailable , 2 ) + " for " + server . hostname ) ;
}
2017-06-28 11:47:42 +02:00
return server . moneyAvailable ;
} ,
getServerSecurityLevel : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getServerSecurityLevel ) {
return 0 ;
} else {
workerScript . loadedFns . getServerSecurityLevel = true ;
return CONSTANTS . ScriptGetServerRamCost ;
}
}
2017-06-28 11:47:42 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "getServerSecurityLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getServerSecurityLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . getServerSecurityLevel == null ) {
workerScript . scriptRef . log ( "getServerSecurityLevel() returned " + formatNumber ( server . hackDifficulty , 3 ) + " for " + server . hostname ) ;
}
2017-06-28 11:47:42 +02:00
return server . hackDifficulty ;
} ,
getServerBaseSecurityLevel : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getServerBaseSecurityLevel ) {
return 0 ;
} else {
workerScript . loadedFns . getServerBaseSecurityLevel = true ;
return CONSTANTS . ScriptGetServerRamCost ;
}
}
2017-06-28 11:47:42 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "getServerBaseSecurityLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getServerBaseSecurityLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . getServerBaseSecurityLevel == null ) {
workerScript . scriptRef . log ( "getServerBaseSecurityLevel() returned " + formatNumber ( server . baseDifficulty , 3 ) + " for " + server . hostname ) ;
}
2017-06-28 11:47:42 +02:00
return server . baseDifficulty ;
} ,
2017-09-26 04:44:33 +02:00
getServerMinSecurityLevel : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getServerMinSecurityLevel ) {
return 0 ;
} else {
workerScript . loadedFns . getServerMinSecurityLevel = true ;
return CONSTANTS . ScriptGetServerRamCost ;
}
}
2017-09-26 04:44:33 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "getServerMinSecurityLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getServerMinSecurityLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . getServerMinSecurityLevel == null ) {
workerScript . scriptRef . log ( "getServerMinSecurityLevel() returned " + formatNumber ( server . minDifficulty , 3 ) + " for " + server . hostname ) ;
}
2017-09-26 04:44:33 +02:00
return server . minDifficulty ;
} ,
2018-01-27 07:52:39 +01:00
getServerRequiredHackingLevel : function ( ip ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getServerRequiredHackingLevel ) {
return 0 ;
} else {
workerScript . loadedFns . getServerRequiredHackingLevel = true ;
return CONSTANTS . ScriptGetServerRamCost ;
}
}
2017-06-28 11:47:42 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "getServerRequiredHackingLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getServerRequiredHackingLevel() failed. Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . getServerRequiredHackingLevel == null ) {
workerScript . scriptRef . log ( "getServerRequiredHackingLevel returned " + formatNumber ( server . requiredHackingSkill , 0 ) + " for " + server . hostname ) ;
}
2017-06-28 11:47:42 +02:00
return server . requiredHackingSkill ;
} ,
getServerMaxMoney : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getServerMaxMoney ) {
return 0 ;
} else {
workerScript . loadedFns . getServerMaxMoney = true ;
return CONSTANTS . ScriptGetServerRamCost ;
}
}
2017-06-28 11:47:42 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
2017-08-18 19:20:51 +02:00
workerScript . scriptRef . log ( "getServerMaxMoney() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getServerMaxMoney() failed. Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . getServerMaxMoney == null ) {
workerScript . scriptRef . log ( "getServerMaxMoney() returned " + formatNumber ( server . moneyMax , 0 ) + " for " + server . hostname ) ;
}
2017-06-28 11:47:42 +02:00
return server . moneyMax ;
} ,
2017-08-18 19:20:51 +02:00
getServerGrowth : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getServerGrowth ) {
return 0 ;
} else {
workerScript . loadedFns . getServerGrowth = true ;
return CONSTANTS . ScriptGetServerRamCost ;
}
}
2017-08-18 19:20:51 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "getServerGrowth() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getServerGrowth() failed. Invalid IP or hostname passed in: " + ip ) ;
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . getServerGrowth == null ) {
workerScript . scriptRef . log ( "getServerGrowth() returned " + formatNumber ( server . serverGrowth , 0 ) + " for " + server . hostname ) ;
}
2017-08-18 19:20:51 +02:00
return server . serverGrowth ;
} ,
2018-01-27 07:52:39 +01:00
getServerNumPortsRequired : function ( ip ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getServerNumPortsRequired ) {
return 0 ;
} else {
workerScript . loadedFns . getServerNumPortsRequired = true ;
return CONSTANTS . ScriptGetServerRamCost ;
}
}
2017-07-13 18:54:29 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "getServerNumPortsRequired() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getServerNumPortsRequired() failed. Invalid IP or hostname passed in: " + ip ) ;
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . getServerNumPortsRequired == null ) {
workerScript . scriptRef . log ( "getServerNumPortsRequired() returned " + formatNumber ( server . numOpenPortsRequired , 0 ) + " for " + server . hostname ) ;
}
2017-07-13 18:54:29 +02:00
return server . numOpenPortsRequired ;
} ,
2017-07-25 03:06:40 +02:00
getServerRam : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getServerRam ) {
return 0 ;
} else {
workerScript . loadedFns . getServerRam = true ;
return CONSTANTS . ScriptGetServerRamCost ;
}
}
2017-07-25 03:06:40 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "getServerRam() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getServerRam() failed. Invalid IP or hostname passed in: " + ip ) ;
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . getServerRam == null ) {
workerScript . scriptRef . log ( "getServerRam() returned [" + formatNumber ( server . maxRam , 2 ) + "GB, " + formatNumber ( server . ramUsed , 2 ) + "GB]" ) ;
}
2017-07-25 03:06:40 +02:00
return [ server . maxRam , server . ramUsed ] ;
} ,
2017-09-15 16:06:59 +02:00
serverExists : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . serverExists ) {
return 0 ;
} else {
workerScript . loadedFns . serverExists = true ;
return CONSTANTS . ScriptGetServerRamCost ;
}
}
2017-09-15 16:06:59 +02:00
return ( getServer ( ip ) !== null ) ;
} ,
2018-01-27 07:52:39 +01:00
fileExists : function ( filename , ip = workerScript . serverIp ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . fileExists ) {
return 0 ;
} else {
workerScript . loadedFns . fileExists = true ;
return CONSTANTS . ScriptFileExistsRamCost ;
}
}
2017-06-28 11:47:42 +02:00
if ( filename === undefined ) {
2017-07-25 03:06:40 +02:00
throw makeRuntimeRejectMsg ( workerScript , "fileExists() call has incorrect number of arguments. Usage: fileExists(scriptname, [server])" ) ;
2017-06-28 11:47:42 +02:00
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "fileExists() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "fileExists() failed. Invalid IP or hostname passed in: " + ip ) ;
2017-06-28 11:47:42 +02:00
}
for ( var i = 0 ; i < server . scripts . length ; ++ i ) {
if ( filename == server . scripts [ i ] . filename ) {
return true ;
}
}
2017-07-13 18:54:29 +02:00
for ( var i = 0 ; i < server . programs . length ; ++ i ) {
if ( filename . toLowerCase ( ) == server . programs [ i ] . toLowerCase ( ) ) {
return true ;
}
2017-06-28 11:47:42 +02:00
}
2017-09-21 23:27:31 +02:00
for ( var i = 0 ; i < server . messages . length ; ++ i ) {
if ( ! ( server . messages [ i ] instanceof Message ) &&
filename . toLowerCase ( ) === server . messages [ i ] ) {
return true ;
}
}
2018-01-02 08:12:54 +01:00
var txtFile = getTextFile ( filename , server ) ;
2018-01-21 21:53:16 +01:00
if ( txtFile != null ) {
2018-01-02 08:12:54 +01:00
return true ;
}
2017-06-28 11:47:42 +02:00
return false ;
} ,
2018-01-27 07:52:39 +01:00
isRunning : function ( filename , ip ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . isRunning ) {
return 0 ;
} else {
workerScript . loadedFns . isRunning = true ;
return CONSTANTS . ScriptIsRunningRamCost ;
}
}
2017-06-28 11:47:42 +02:00
if ( filename === undefined || ip === undefined ) {
2017-07-25 03:06:40 +02:00
throw makeRuntimeRejectMsg ( workerScript , "isRunning() call has incorrect number of arguments. Usage: isRunning(scriptname, server, [arg1], [arg2]...)" ) ;
2017-06-28 11:47:42 +02:00
}
var server = getServer ( ip ) ;
if ( server == null ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "isRunning() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "isRunning() failed. Invalid IP or hostname passed in: " + ip ) ;
}
var argsForTargetScript = [ ] ;
for ( var i = 2 ; i < arguments . length ; ++ i ) {
argsForTargetScript . push ( arguments [ i ] ) ;
}
return ( findRunningScript ( filename , argsForTargetScript , server ) != null ) ;
} ,
2018-01-27 07:52:39 +01:00
getNextHacknetNodeCost : function ( ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getNextHacknetNodeCost ) {
return 0 ;
} else {
workerScript . loadedFns . getNextHacknetNodeCost = true ;
2018-02-24 23:55:06 +01:00
return CONSTANTS . ScriptPurchaseHacknetRamCost ;
2018-01-27 07:52:39 +01:00
}
}
return getCostOfNextHacknetNode ( ) ;
} ,
purchaseHacknetNode : function ( ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . purchaseHacknetNode ) {
return 0 ;
} else {
workerScript . loadedFns . purchaseHacknetNode = true ;
return CONSTANTS . ScriptPurchaseHacknetRamCost ;
}
}
2018-01-30 06:14:17 +01:00
return purchaseHacknet ( ) ;
2018-01-27 07:52:39 +01:00
} ,
2017-07-13 18:54:29 +02:00
getStockPrice : function ( symbol ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getStockPrice ) {
return 0 ;
} else {
workerScript . loadedFns . getStockPrice = true ;
return CONSTANTS . ScriptGetStockRamCost ;
}
}
2017-07-13 18:54:29 +02:00
if ( ! Player . hasTixApiAccess ) {
throw makeRuntimeRejectMsg ( workerScript , "You don't have TIX API Access! Cannot use getStockPrice()" ) ;
}
var stock = SymbolToStockMap [ symbol ] ;
if ( stock == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Invalid stock symbol passed into getStockPrice()" ) ;
}
return parseFloat ( stock . price . toFixed ( 3 ) ) ;
} ,
getStockPosition : function ( symbol ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getStockPosition ) {
return 0 ;
} else {
workerScript . loadedFns . getStockPosition = true ;
return CONSTANTS . ScriptGetStockRamCost ;
}
}
2017-07-13 18:54:29 +02:00
if ( ! Player . hasTixApiAccess ) {
throw makeRuntimeRejectMsg ( workerScript , "You don't have TIX API Access! Cannot use getStockPosition()" ) ;
}
var stock = SymbolToStockMap [ symbol ] ;
if ( stock == null ) {
2018-05-13 02:50:13 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Invalid stock symbol passed into getStockPosition()" ) ;
2017-07-13 18:54:29 +02:00
}
2017-10-25 21:47:47 +02:00
return [ stock . playerShares , stock . playerAvgPx , stock . playerShortShares , stock . playerAvgShortPx ] ;
2017-07-13 18:54:29 +02:00
} ,
buyStock : function ( symbol , shares ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . buyStock ) {
return 0 ;
} else {
workerScript . loadedFns . buyStock = true ;
return CONSTANTS . ScriptBuySellStockRamCost ;
}
}
2017-07-13 18:54:29 +02:00
if ( ! Player . hasTixApiAccess ) {
throw makeRuntimeRejectMsg ( workerScript , "You don't have TIX API Access! Cannot use buyStock()" ) ;
}
var stock = SymbolToStockMap [ symbol ] ;
if ( stock == null ) {
2017-10-25 21:47:47 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Invalid stock symbol passed into buyStock()" ) ;
2017-07-13 18:54:29 +02:00
}
2017-10-25 21:47:47 +02:00
if ( shares < 0 || isNaN ( shares ) ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Error: Invalid 'shares' argument passed to buyStock()" ) ;
2017-12-03 05:19:49 +01:00
return 0 ;
2017-07-13 18:54:29 +02:00
}
shares = Math . round ( shares ) ;
2017-12-03 05:19:49 +01:00
if ( shares === 0 ) { return 0 ; }
2017-07-25 03:06:40 +02:00
2017-07-13 18:54:29 +02:00
var totalPrice = stock . price * shares ;
2017-07-29 18:25:40 +02:00
if ( Player . money . lt ( totalPrice + CONSTANTS . StockMarketCommission ) ) {
2017-07-25 03:06:40 +02:00
workerScript . scriptRef . log ( "Not enough money to purchase " + formatNumber ( shares , 0 ) + " shares of " +
symbol + ". Need $" +
2017-07-13 18:54:29 +02:00
formatNumber ( totalPrice + CONSTANTS . StockMarketCommission , 2 ) . toString ( ) ) ;
2017-12-03 05:19:49 +01:00
return 0 ;
2017-07-13 18:54:29 +02:00
}
2017-07-25 03:06:40 +02:00
2017-07-13 18:54:29 +02:00
var origTotal = stock . playerShares * stock . playerAvgPx ;
Player . loseMoney ( totalPrice + CONSTANTS . StockMarketCommission ) ;
var newTotal = origTotal + totalPrice ;
2017-07-25 03:06:40 +02:00
stock . playerShares += shares ;
2017-07-13 18:54:29 +02:00
stock . playerAvgPx = newTotal / stock . playerShares ;
if ( Engine . currentPage == Engine . Page . StockMarket ) {
updateStockPlayerPosition ( stock ) ;
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . buyStock == null ) {
workerScript . scriptRef . log ( "Bought " + formatNumber ( shares , 0 ) + " shares of " + stock . symbol + " at $" +
formatNumber ( stock . price , 2 ) + " per share" ) ;
}
2017-12-03 05:19:49 +01:00
return stock . price ;
2017-07-13 18:54:29 +02:00
} ,
sellStock : function ( symbol , shares ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . sellStock ) {
return 0 ;
} else {
workerScript . loadedFns . sellStock = true ;
return CONSTANTS . ScriptBuySellStockRamCost ;
}
}
2017-07-13 18:54:29 +02:00
if ( ! Player . hasTixApiAccess ) {
throw makeRuntimeRejectMsg ( workerScript , "You don't have TIX API Access! Cannot use sellStock()" ) ;
}
var stock = SymbolToStockMap [ symbol ] ;
if ( stock == null ) {
2017-10-25 21:47:47 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Invalid stock symbol passed into sellStock()" ) ;
2017-07-13 18:54:29 +02:00
}
2017-10-25 21:47:47 +02:00
if ( shares < 0 || isNaN ( shares ) ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Error: Invalid 'shares' argument passed to sellStock()" ) ;
2017-12-03 05:19:49 +01:00
return 0 ;
2017-06-28 11:47:42 +02:00
}
2017-10-15 03:55:41 +02:00
shares = Math . round ( shares ) ;
2017-07-13 18:54:29 +02:00
if ( shares > stock . playerShares ) { shares = stock . playerShares ; }
2017-12-03 05:19:49 +01:00
if ( shares === 0 ) { return 0 ; }
2017-07-13 18:54:29 +02:00
var gains = stock . price * shares - CONSTANTS . StockMarketCommission ;
Player . gainMoney ( gains ) ;
2017-07-25 03:06:40 +02:00
2017-07-13 18:54:29 +02:00
//Calculate net profit and add to script stats
var netProfit = ( ( stock . price - stock . playerAvgPx ) * shares ) - CONSTANTS . StockMarketCommission ;
if ( isNaN ( netProfit ) ) { netProfit = 0 ; }
workerScript . scriptRef . onlineMoneyMade += netProfit ;
2017-09-26 04:44:33 +02:00
Player . scriptProdSinceLastAug += netProfit ;
2017-07-25 03:06:40 +02:00
2017-07-13 18:54:29 +02:00
stock . playerShares -= shares ;
if ( stock . playerShares == 0 ) {
stock . playerAvgPx = 0 ;
}
if ( Engine . currentPage == Engine . Page . StockMarket ) {
updateStockPlayerPosition ( stock ) ;
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . sellStock == null ) {
workerScript . scriptRef . log ( "Sold " + formatNumber ( shares , 0 ) + " shares of " + stock . symbol + " at $" +
formatNumber ( stock . price , 2 ) + " per share. Gained " +
"$" + formatNumber ( gains , 2 ) ) ;
}
2017-12-03 05:19:49 +01:00
return stock . price ;
2017-07-13 18:54:29 +02:00
} ,
2017-10-25 21:47:47 +02:00
shortStock ( symbol , shares ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . shortStock ) {
return 0 ;
} else {
workerScript . loadedFns . shortStock = true ;
return CONSTANTS . ScriptBuySellStockRamCost ;
}
}
2017-10-25 21:47:47 +02:00
if ( ! Player . hasTixApiAccess ) {
throw makeRuntimeRejectMsg ( workerScript , "You don't have TIX API Access! Cannot use shortStock()" ) ;
}
if ( Player . bitNodeN !== 8 ) {
if ( ! ( hasWallStreetSF && wallStreetSFLvl >= 2 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Cannot use shortStock(). You must either be in BitNode-8 or you must have Level 2 of Source-File 8" ) ;
}
}
var stock = SymbolToStockMap [ symbol ] ;
if ( stock == null ) {
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Invalid stock symbol passed into shortStock()" ) ;
}
2017-12-03 05:19:49 +01:00
var res = shortStock ( stock , shares , workerScript ) ;
return res ? stock . price : 0 ;
2017-10-25 21:47:47 +02:00
} ,
sellShort ( symbol , shares ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . sellShort ) {
return 0 ;
} else {
workerScript . loadedFns . sellShort = true ;
return CONSTANTS . ScriptBuySellStockRamCost ;
}
}
2017-10-25 21:47:47 +02:00
if ( ! Player . hasTixApiAccess ) {
throw makeRuntimeRejectMsg ( workerScript , "You don't have TIX API Access! Cannot use sellShort()" ) ;
}
if ( Player . bitNodeN !== 8 ) {
if ( ! ( hasWallStreetSF && wallStreetSFLvl >= 2 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Cannot use sellShort(). You must either be in BitNode-8 or you must have Level 2 of Source-File 8" ) ;
}
}
var stock = SymbolToStockMap [ symbol ] ;
if ( stock == null ) {
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Invalid stock symbol passed into sellShort()" ) ;
}
2017-12-03 05:19:49 +01:00
var res = sellShort ( stock , shares , workerScript ) ;
return res ? stock . price : 0 ;
2017-10-25 21:47:47 +02:00
} ,
placeOrder ( symbol , shares , price , type , pos ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . placeOrder ) {
return 0 ;
} else {
workerScript . loadedFns . placeOrder = true ;
return CONSTANTS . ScriptBuySellStockRamCost ;
}
}
2017-10-25 21:47:47 +02:00
if ( ! Player . hasTixApiAccess ) {
throw makeRuntimeRejectMsg ( workerScript , "You don't have TIX API Access! Cannot use placeOrder()" ) ;
}
if ( Player . bitNodeN !== 8 ) {
if ( ! ( hasWallStreetSF && wallStreetSFLvl >= 3 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Cannot use placeOrder(). You must either be in BitNode-8 or have Level 3 of Source-File 8" ) ;
}
}
var stock = SymbolToStockMap [ symbol ] ;
if ( stock == null ) {
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Invalid stock symbol passed into placeOrder()" ) ;
}
var orderType , orderPos ;
type = type . toLowerCase ( ) ;
if ( type . includes ( "limit" ) && type . includes ( "buy" ) ) {
orderType = OrderTypes . LimitBuy ;
} else if ( type . includes ( "limit" ) && type . includes ( "sell" ) ) {
orderType = OrderTypes . LimitSell ;
} else if ( type . includes ( "stop" ) && type . includes ( "buy" ) ) {
orderType = OrderTypes . StopBuy ;
} else if ( type . includes ( "stop" ) && type . includes ( "sell" ) ) {
orderType = OrderTypes . StopSell ;
} else {
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Invalid Order Type passed into placeOrder()" ) ;
}
pos = pos . toLowerCase ( ) ;
if ( pos . includes ( "l" ) ) {
orderPos = PositionTypes . Long ;
} else if ( pos . includes ( 's' ) ) {
orderPos = PositionTypes . Short ;
} else {
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Invalid Position Type passed into placeOrder()" ) ;
}
return placeOrder ( stock , shares , price , orderType , orderPos , workerScript ) ;
} ,
cancelOrder ( symbol , shares , price , type , pos ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . cancelOrder ) {
return 0 ;
} else {
workerScript . loadedFns . cancelOrder = true ;
return CONSTANTS . ScriptBuySellStockRamCost ;
}
}
2017-10-25 21:47:47 +02:00
if ( ! Player . hasTixApiAccess ) {
throw makeRuntimeRejectMsg ( workerScript , "You don't have TIX API Access! Cannot use cancelOrder()" ) ;
}
if ( Player . bitNodeN !== 8 ) {
if ( ! ( hasWallStreetSF && wallStreetSFLvl >= 3 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Cannot use cancelOrder(). You must either be in BitNode-8 or have Level 3 of Source-File 8" ) ;
}
}
var stock = SymbolToStockMap [ symbol ] ;
if ( stock == null ) {
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Invalid stock symbol passed into cancelOrder()" ) ;
}
if ( isNaN ( shares ) || isNaN ( price ) ) {
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Invalid shares or price argument passed into cancelOrder(). Must be numeric" ) ;
}
var orderType , orderPos ;
type = type . toLowerCase ( ) ;
if ( type . includes ( "limit" ) && type . includes ( "buy" ) ) {
orderType = OrderTypes . LimitBuy ;
} else if ( type . includes ( "limit" ) && type . includes ( "sell" ) ) {
orderType = OrderTypes . LimitSell ;
} else if ( type . includes ( "stop" ) && type . includes ( "buy" ) ) {
orderType = OrderTypes . StopBuy ;
} else if ( type . includes ( "stop" ) && type . includes ( "sell" ) ) {
2017-12-11 06:04:00 +01:00
orderType = OrderTypes . StopSell ;
2017-10-25 21:47:47 +02:00
} else {
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Invalid Order Type passed into placeOrder()" ) ;
}
pos = pos . toLowerCase ( ) ;
if ( pos . includes ( "l" ) ) {
orderPos = PositionTypes . Long ;
} else if ( pos . includes ( 's' ) ) {
orderPos = PositionTypes . Short ;
} else {
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Invalid Position Type passed into placeOrder()" ) ;
}
2017-12-11 06:04:00 +01:00
var params = {
2017-10-25 21:47:47 +02:00
stock : stock ,
shares : shares ,
price : price ,
type : orderType ,
pos : orderPos
} ;
return cancelOrder ( params , workerScript ) ;
} ,
2017-07-13 18:54:29 +02:00
purchaseServer : function ( hostname , ram ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . purchaseServer ) {
return 0 ;
} else {
workerScript . loadedFns . purchaseServer = true ;
return CONSTANTS . ScriptPurchaseServerRamCost ;
}
}
2017-07-13 18:54:29 +02:00
var hostnameStr = String ( hostname ) ;
2018-03-03 22:05:33 +01:00
hostnameStr = hostnameStr . replace ( /\s+/g , '' ) ;
2017-07-13 18:54:29 +02:00
if ( hostnameStr == "" ) {
workerScript . scriptRef . log ( "Error: Passed empty string for hostname argument of purchaseServer()" ) ;
return "" ;
}
2017-07-25 03:06:40 +02:00
2017-07-27 04:56:14 +02:00
if ( Player . purchasedServers . length >= CONSTANTS . PurchasedServerLimit ) {
workerScript . scriptRef . log ( "Error: You have reached the maximum limit of " + CONSTANTS . PurchasedServerLimit +
" servers. You cannot purchase any more." ) ;
return "" ;
}
2017-07-13 18:54:29 +02:00
ram = Math . round ( ram ) ;
if ( isNaN ( ram ) || ! powerOfTwo ( ram ) ) {
2018-05-23 02:09:04 +02:00
workerScript . scriptRef . log ( "Error: purchaseServer() failed due to invalid ram argument. Must be numeric and a power of 2" ) ;
return "" ;
}
if ( ram > CONSTANTS . PurchasedServerMaxRam ) {
workerScript . scriptRef . log ( "Error: purchasedServer() failed because specified RAM was too high. Maximum RAM on a purchased server is " + CONSTANTS . PurchasedServerMaxRam + "GB" ) ;
2017-07-13 18:54:29 +02:00
return "" ;
}
2017-07-25 03:06:40 +02:00
2017-07-29 18:25:40 +02:00
var cost = ram * CONSTANTS . BaseCostFor1GBOfRamServer ;
if ( Player . money . lt ( cost ) ) {
2017-07-13 18:54:29 +02:00
workerScript . scriptRef . log ( "Error: Not enough money to purchase server. Need $" + formatNumber ( cost , 2 ) ) ;
return "" ;
}
2018-05-06 15:23:07 +02:00
var newServ = new Server ( {
ip : createRandomIp ( ) ,
hostname : hostnameStr ,
organizationName : "" ,
isConnectedTo : false ,
adminRights : true ,
purchasedByPlayer : true ,
maxRam : ram ,
} ) ;
2017-07-13 18:54:29 +02:00
AddToAllServers ( newServ ) ;
2017-07-25 03:06:40 +02:00
2017-07-13 18:54:29 +02:00
Player . purchasedServers . push ( newServ . ip ) ;
var homeComputer = Player . getHomeComputer ( ) ;
homeComputer . serversOnNetwork . push ( newServ . ip ) ;
newServ . serversOnNetwork . push ( homeComputer . ip ) ;
Player . loseMoney ( cost ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . purchaseServer == null ) {
workerScript . scriptRef . log ( "Purchased new server with hostname " + newServ . hostname + " for $" + formatNumber ( cost , 2 ) ) ;
}
2017-07-13 18:54:29 +02:00
return newServ . hostname ;
2017-06-28 11:47:42 +02:00
} ,
2017-07-27 04:56:14 +02:00
deleteServer : function ( hostname ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . deleteServer ) {
return 0 ;
} else {
workerScript . loadedFns . deleteServer = true ;
return CONSTANTS . ScriptPurchaseServerRamCost ;
}
}
2017-07-27 04:56:14 +02:00
var hostnameStr = String ( hostname ) ;
hostnameStr = hostnameStr . replace ( /\s\s+/g , '' ) ;
var server = GetServerByHostname ( hostnameStr ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "Error: Could not find server with hostname " + hostnameStr + ". deleteServer() failed" ) ;
return false ;
}
2018-05-23 02:09:04 +02:00
if ( ! server . purchasedByPlayer || server . hostname === "home" ) {
2017-07-27 04:56:14 +02:00
workerScript . scriptRef . log ( "Error: Server " + server . hostname + " is not a purchased server. " +
2018-05-23 02:09:04 +02:00
"Cannot be deleted. deleteServer() failed" ) ;
2017-07-27 04:56:14 +02:00
return false ;
}
2017-08-03 06:21:15 +02:00
2017-07-27 04:56:14 +02:00
var ip = server . ip ;
2018-05-23 02:09:04 +02:00
//Can't delete server you're currently connected to
if ( server . isConnectedTo ) {
workerScript . scriptRef . log ( "Error: deleteServer() failed because you are currently connected to the server you are trying to delete" ) ;
return false ;
}
2017-08-13 07:01:33 +02:00
//A server cannot delete itself
2018-05-23 02:09:04 +02:00
if ( ip === workerScript . serverIp ) {
workerScript . scriptRef . log ( "Error: Cannot call deleteServer() on self. deleteServer() failed" ) ;
2017-08-13 07:01:33 +02:00
return false ;
2017-08-03 06:21:15 +02:00
}
2017-08-13 07:01:33 +02:00
//Delete all scripts running on server
if ( server . runningScripts . length > 0 ) {
workerScript . scriptRef . log ( "Error: Cannot delete server " + server . hostname + " because it still has scripts running." ) ;
return false ;
}
2017-07-27 04:56:14 +02:00
//Delete from player's purchasedServers array
var found = false ;
for ( var i = 0 ; i < Player . purchasedServers . length ; ++ i ) {
if ( ip == Player . purchasedServers [ i ] ) {
found = true ;
Player . purchasedServers . splice ( i , 1 ) ;
break ;
}
}
if ( ! found ) {
workerScript . scriptRef . log ( "Error: Could not identify server " + server . hostname +
"as a purchased server. This is likely a bug please contact game dev" ) ;
return false ;
}
2017-08-13 07:01:33 +02:00
//Delete from all servers
delete AllServers [ ip ] ;
2017-07-27 04:56:14 +02:00
//Delete from home computer
found = false ;
var homeComputer = Player . getHomeComputer ( ) ;
for ( var i = 0 ; i < homeComputer . serversOnNetwork . length ; ++ i ) {
if ( ip == homeComputer . serversOnNetwork [ i ] ) {
homeComputer . serversOnNetwork . splice ( i , 1 ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . deleteServer == null ) {
workerScript . scriptRef . log ( "Deleted server " + hostnameStr ) ;
}
2017-07-27 04:56:14 +02:00
return true ;
}
}
//Wasn't found on home computer
workerScript . scriptRef . log ( "Error: Could not find server " + server . hostname +
"as a purchased server. This is likely a bug please contact game dev" ) ;
return false ;
} ,
2017-09-26 04:44:33 +02:00
getPurchasedServers : function ( hostname = true ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getPurchasedServers ) {
return 0 ;
} else {
workerScript . loadedFns . getPurchasedServers = true ;
return CONSTANTS . ScriptPurchaseServerRamCost ;
}
}
2017-09-26 04:44:33 +02:00
var res = [ ] ;
Player . purchasedServers . forEach ( function ( ip ) {
if ( hostname ) {
var server = getServer ( ip ) ;
if ( server == null ) {
throw makeRuntimeRejectMsg ( workerScript , "ERR: Could not find server in getPurchasedServers(). This is a bug please report to game dev" ) ;
}
res . push ( server . hostname ) ;
} else {
res . push ( ip ) ;
}
} ) ;
return res ;
} ,
2017-10-12 04:00:22 +02:00
write : function ( port , data = "" , mode = "a" ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . write ) {
return 0 ;
} else {
workerScript . loadedFns . write = true ;
return CONSTANTS . ScriptReadWriteRamCost ;
}
}
2017-10-12 04:00:22 +02:00
if ( ! isNaN ( port ) ) { //Write to port
2017-07-22 00:54:55 +02:00
//Port 1-10
2018-03-03 22:05:33 +01:00
port = Math . round ( port ) ;
if ( port < 1 || port > CONSTANTS . NumNetscriptPorts ) {
throw makeRuntimeRejectMsg ( workerScript , "ERR: Trying to write to invalid port: " + port + ". Only ports 1-" + CONSTANTS . NumNetscriptPorts + " are valid." ) ;
2017-07-22 00:54:55 +02:00
}
2018-03-03 22:05:33 +01:00
var port = NetscriptPorts [ port - 1 ] ;
if ( port == null || ! ( port instanceof NetscriptPort ) ) {
2017-07-22 00:54:55 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Could not find port: " + port + ". This is a bug contact the game developer" ) ;
}
2018-03-03 22:05:33 +01:00
return port . write ( data ) ;
2017-10-12 04:00:22 +02:00
} else if ( isString ( port ) ) { //Write to text file
var fn = port ;
var server = getServer ( workerScript . serverIp ) ;
2017-10-26 00:05:12 +02:00
if ( server == null ) {
2017-10-12 04:00:22 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Error getting Server for this script in write(). This is a bug please contact game dev" ) ;
}
var txtFile = getTextFile ( fn , server ) ;
2017-10-26 00:05:12 +02:00
if ( txtFile == null ) {
2017-10-12 04:00:22 +02:00
txtFile = createTextFile ( fn , data , server ) ;
return true ;
}
if ( mode === "w" ) {
txtFile . write ( data ) ;
} else {
txtFile . append ( data ) ;
}
return true ;
2017-07-22 00:54:55 +02:00
} else {
2017-12-07 04:45:47 +01:00
throw makeRuntimeRejectMsg ( workerScript , "Invalid argument passed in for write: " + port ) ;
2017-07-22 00:54:55 +02:00
}
} ,
read : function ( port ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . read ) {
return 0 ;
} else {
workerScript . loadedFns . read = true ;
return CONSTANTS . ScriptReadWriteRamCost ;
}
}
2017-10-12 04:00:22 +02:00
if ( ! isNaN ( port ) ) { //Read from port
2017-07-22 00:54:55 +02:00
//Port 1-10
2018-03-03 22:05:33 +01:00
port = Math . round ( port ) ;
if ( port < 1 || port > CONSTANTS . NumNetscriptPorts ) {
throw makeRuntimeRejectMsg ( workerScript , "ERR: Trying to read from invalid port: " + port + ". Only ports 1-" + CONSTANTS . NumNetscriptPorts + " are valid." ) ;
2017-07-22 00:54:55 +02:00
}
2018-03-03 22:05:33 +01:00
var port = NetscriptPorts [ port - 1 ] ;
if ( port == null || ! ( port instanceof NetscriptPort ) ) {
2017-12-07 04:45:47 +01:00
throw makeRuntimeRejectMsg ( workerScript , "ERR: Could not find port: " + port + ". This is a bug contact the game developer" ) ;
2017-07-22 00:54:55 +02:00
}
2018-03-03 22:05:33 +01:00
return port . read ( ) ;
2017-10-12 04:00:22 +02:00
} else if ( isString ( port ) ) { //Read from text file
var fn = port ;
var server = getServer ( workerScript . serverIp ) ;
2017-10-26 00:05:12 +02:00
if ( server == null ) {
2017-10-12 04:00:22 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Error getting Server for this script in read(). This is a bug please contact game dev" ) ;
}
var txtFile = getTextFile ( fn , server ) ;
if ( txtFile !== null ) {
return txtFile . text ;
} else {
return "" ;
}
2017-07-22 00:54:55 +02:00
} else {
2017-12-07 04:45:47 +01:00
throw makeRuntimeRejectMsg ( workerScript , "Invalid argument passed in for read(): " + port ) ;
}
} ,
2018-02-24 23:55:06 +01:00
peek : function ( port ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . peek ) {
return 0 ;
} else {
workerScript . loadedFns . peek = true ;
return CONSTANTS . ScriptReadWriteRamCost ;
}
}
2018-03-03 22:05:33 +01:00
if ( isNaN ( port ) ) {
throw makeRuntimeRejectMsg ( workerScript , "ERR: peek() called with invalid argument. Must be a port number between 1 and " + CONSTANTS . NumNetscriptPorts ) ;
2018-02-24 23:55:06 +01:00
}
2018-03-03 22:05:33 +01:00
port = Math . round ( port ) ;
if ( port < 1 || port > CONSTANTS . NumNetscriptPorts ) {
throw makeRuntimeRejectMsg ( workerScript , "ERR: peek() called with invalid argument. Must be a port number between 1 and " + CONSTANTS . NumNetscriptPorts ) ;
2018-02-24 23:55:06 +01:00
}
2018-03-03 22:05:33 +01:00
var port = NetscriptPorts [ port - 1 ] ;
if ( port == null || ! ( port instanceof NetscriptPort ) ) {
throw makeRuntimeRejectMsg ( workerScript , "ERR: Could not find port: " + port + ". This is a bug contact the game developer" ) ;
2018-02-24 23:55:06 +01:00
}
2018-03-03 22:05:33 +01:00
return port . peek ( ) ;
2018-02-24 23:55:06 +01:00
} ,
2017-12-07 04:45:47 +01:00
clear : function ( port ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . clear ) {
return 0 ;
} else {
workerScript . loadedFns . clear = true ;
return CONSTANTS . ScriptReadWriteRamCost ;
}
}
2017-12-07 04:45:47 +01:00
if ( ! isNaN ( port ) ) { //Clear port
2018-03-03 22:05:33 +01:00
port = Math . round ( port ) ;
if ( port < 1 || port > CONSTANTS . NumNetscriptPorts ) {
throw makeRuntimeRejectMsg ( workerScript , "ERR: Trying to clear invalid port: " + port + ". Only ports 1-" + CONSTANTS . NumNetscriptPorts + " are valid" ) ;
2017-12-07 04:45:47 +01:00
}
2018-03-03 22:05:33 +01:00
var port = NetscriptPorts [ port - 1 ] ;
if ( port == null || ! ( port instanceof NetscriptPort ) ) {
2017-12-07 04:45:47 +01:00
throw makeRuntimeRejectMsg ( workerScript , "ERR: Could not find port: " + port + ". This is a bug contact the game developer" ) ;
}
2018-03-03 22:05:33 +01:00
return port . clear ( ) ;
2017-12-07 04:45:47 +01:00
} else if ( isString ( port ) ) { //Clear text file
var fn = port ;
var server = getServer ( workerScript . serverIp ) ;
if ( server == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Error getting Server for this script in clear(). This is a bug please contact game dev" ) ;
}
var txtFile = getTextFile ( fn , server ) ;
if ( txtFile != null ) {
txtFile . write ( "" ) ;
}
} else {
throw makeRuntimeRejectMsg ( workerScript , "Invalid argument passed in for clear(): " + port ) ;
2017-07-22 00:54:55 +02:00
}
2017-12-07 04:45:47 +01:00
return 0 ;
2017-08-13 07:01:33 +02:00
} ,
2018-03-03 22:05:33 +01:00
getPortHandle : function ( port ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getPortHandle ) {
return 0 ;
} else {
workerScript . loadedFns . getPortHandle = true ;
return CONSTANTS . ScriptReadWriteRamCost * 10 ;
}
}
if ( isNaN ( port ) ) {
throw makeRuntimeRejectMsg ( workerScript , "ERR: Invalid argument passed into getPortHandle(). Must be an integer between 1 and " + CONSTANTS . NumNetscriptPorts ) ;
}
port = Math . round ( port ) ;
if ( port < 1 || port > CONSTANTS . NumNetscriptPorts ) {
throw makeRuntimeRejectMsg ( workerScript , "ERR: getPortHandle() called with invalid port number: " + port + ". Only ports 1-" + CONSTANTS . NumNetscriptPorts + " are valid" ) ;
}
var port = NetscriptPorts [ port - 1 ] ;
if ( port == null || ! ( port instanceof NetscriptPort ) ) {
throw makeRuntimeRejectMsg ( workerScript , "ERR: Could not find port: " + port + ". This is a bug contact the game developer" ) ;
}
return port ;
} ,
2018-01-27 07:52:39 +01:00
rm : function ( fn ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . rm ) {
return 0 ;
} else {
workerScript . loadedFns . rm = true ;
return CONSTANTS . ScriptReadWriteRamCost ;
}
}
var s = getServer ( workerScript . serverIp ) ;
if ( s == null ) {
throw makeRuntimeRejectMsg ( workerScript , "Error getting Server for this script in clear(). This is a bug please contact game dev" ) ;
}
if ( fn . includes ( ".exe" ) ) {
for ( var i = 0 ; i < s . programs . length ; ++ i ) {
if ( s . programs [ i ] === fn ) {
s . programs . splice ( i , 1 ) ;
return true ;
}
}
2018-05-06 00:13:35 +02:00
} else if ( isScriptFilename ( fn ) ) {
2018-01-27 07:52:39 +01:00
for ( var i = 0 ; i < s . scripts . length ; ++ i ) {
if ( s . scripts [ i ] . filename === fn ) {
//Check that the script isnt currently running
for ( var j = 0 ; j < s . runningScripts . length ; ++ j ) {
if ( s . runningScripts [ j ] . filename === fn ) {
workerScript . scriptRef . log ( "Cannot delete a script that is currently running!" ) ;
return false ;
}
}
s . scripts . splice ( i , 1 ) ;
return true ;
}
}
} else if ( fn . endsWith ( ".lit" ) ) {
for ( var i = 0 ; i < s . messages . length ; ++ i ) {
var f = s . messages [ i ] ;
if ( ! ( f instanceof Message ) && isString ( f ) && f === fn ) {
s . messages . splice ( i , 1 ) ;
return true ;
}
}
} else if ( fn . endsWith ( ".txt" ) ) {
for ( var i = 0 ; i < s . textFiles . length ; ++ i ) {
if ( s . textFiles [ i ] . fn === fn ) {
s . textFiles . splice ( i , 1 ) ;
return true ;
}
}
}
return false ;
} ,
2017-08-13 07:01:33 +02:00
scriptRunning : function ( scriptname , ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . scriptRunning ) {
return 0 ;
} else {
workerScript . loadedFns . scriptRunning = true ;
return CONSTANTS . ScriptArbScriptRamCost ;
}
}
2017-08-13 07:01:33 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "scriptRunning() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "scriptRunning() failed. Invalid IP or hostname passed in: " + ip ) ;
}
for ( var i = 0 ; i < server . runningScripts . length ; ++ i ) {
if ( server . runningScripts [ i ] . filename == scriptname ) {
return true ;
}
}
return false ;
} ,
scriptKill : function ( scriptname , ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . scriptKill ) {
return 0 ;
} else {
workerScript . loadedFns . scriptKill = true ;
return CONSTANTS . ScriptArbScriptRamCost ;
}
}
2017-08-13 07:01:33 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "scriptKill() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "scriptKill() failed. Invalid IP or hostname passed in: " + ip ) ;
}
var suc = false ;
for ( var i = 0 ; i < server . runningScripts . length ; ++ i ) {
if ( server . runningScripts [ i ] . filename == scriptname ) {
killWorkerScript ( server . runningScripts [ i ] , server . ip ) ;
suc = true ;
}
}
return suc ;
} ,
2018-05-06 09:27:16 +02:00
getScriptName : function ( ) {
if ( workerScript . checkingRam ) { return 0 ; }
return workerScript . name ;
} ,
2018-05-09 09:21:47 +02:00
getScriptRam : function ( scriptname , ip = workerScript . serverIp ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getScriptRam ) {
return 0 ;
} else {
workerScript . loadedFns . getScriptRam = true ;
return CONSTANTS . ScriptGetScriptRamCost ;
}
}
2017-08-13 07:01:33 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "getScriptRam() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getScriptRam() failed. Invalid IP or hostname passed in: " + ip ) ;
}
2017-08-18 19:20:51 +02:00
for ( var i = 0 ; i < server . scripts . length ; ++ i ) {
if ( server . scripts [ i ] . filename == scriptname ) {
return server . scripts [ i ] . ramUsage ;
2017-08-13 07:01:33 +02:00
}
}
return 0 ;
} ,
2017-08-20 03:36:19 +02:00
getHackTime : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getHackTime ) {
return 0 ;
} else {
workerScript . loadedFns . getHackTime = true ;
return CONSTANTS . ScriptGetHackTimeRamCost ;
}
}
2017-08-20 03:36:19 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "getHackTime() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getHackTime() failed. Invalid IP or hostname passed in: " + ip ) ;
}
return scriptCalculateHackingTime ( server ) ; //Returns seconds
} ,
getGrowTime : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getGrowTime ) {
return 0 ;
} else {
workerScript . loadedFns . getGrowTime = true ;
return CONSTANTS . ScriptGetHackTimeRamCost ;
}
}
2017-08-20 03:36:19 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "getGrowTime() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getGrowTime() failed. Invalid IP or hostname passed in: " + ip ) ;
}
return scriptCalculateGrowTime ( server ) / 1000 ; //Returns seconds
} ,
getWeakenTime : function ( ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getWeakenTime ) {
return 0 ;
} else {
workerScript . loadedFns . getWeakenTime = true ;
return CONSTANTS . ScriptGetHackTimeRamCost ;
}
}
2017-08-20 03:36:19 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "getWeakenTime() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getWeakenTime() failed. Invalid IP or hostname passed in: " + ip ) ;
}
return scriptCalculateWeakenTime ( server ) / 1000 ; //Returns seconds
2017-08-21 18:59:06 +02:00
} ,
2017-09-12 01:14:51 +02:00
getScriptIncome : function ( scriptname , ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getScriptIncome ) {
return 0 ;
} else {
workerScript . loadedFns . getScriptIncome = true ;
return CONSTANTS . ScriptGetScriptRamCost ;
}
}
2017-09-12 01:14:51 +02:00
if ( arguments . length === 0 ) {
//Get total script income
2017-09-27 17:13:42 +02:00
var res = [ ] ;
res . push ( updateActiveScriptsItems ( ) ) ;
res . push ( Player . scriptProdSinceLastAug / ( Player . playtimeSinceLastAug / 1000 ) ) ;
return res ;
2017-09-12 01:14:51 +02:00
} else {
//Get income for a particular script
var server = getServer ( ip ) ;
2017-10-26 00:05:12 +02:00
if ( server == null ) {
2017-09-12 01:14:51 +02:00
workerScript . scriptRef . log ( "getScriptIncome() failed. Invalid IP or hostnamed passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getScriptIncome() failed. Invalid IP or hostnamed passed in: " + ip ) ;
}
var argsForScript = [ ] ;
for ( var i = 2 ; i < arguments . length ; ++ i ) {
argsForScript . push ( arguments [ i ] ) ;
}
var runningScriptObj = findRunningScript ( scriptname , argsForScript , server ) ;
if ( runningScriptObj == null ) {
workerScript . scriptRef . log ( "getScriptIncome() failed. No such script " + scriptname + " on " + server . hostname + " with args: " + printArray ( argsForScript ) ) ;
return - 1 ;
}
return runningScriptObj . onlineMoneyMade / runningScriptObj . onlineRunningTime ;
}
} ,
2017-09-15 16:06:59 +02:00
getScriptExpGain : function ( scriptname , ip ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getScriptExpGain ) {
return 0 ;
} else {
workerScript . loadedFns . getScriptExpGain = true ;
return CONSTANTS . ScriptGetScriptRamCost ;
}
}
2017-09-15 16:06:59 +02:00
if ( arguments . length === 0 ) {
var total = 0 ;
for ( var i = 0 ; i < workerScripts . length ; ++ i ) {
total += ( workerScripts [ i ] . scriptRef . onlineExpGained / workerScripts [ i ] . scriptRef . onlineRunningTime ) ;
}
return total ;
} else {
//Get income for a particular script
var server = getServer ( ip ) ;
2017-10-26 00:05:12 +02:00
if ( server == null ) {
2017-09-15 16:06:59 +02:00
workerScript . scriptRef . log ( "getScriptExpGain() failed. Invalid IP or hostnamed passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "getScriptExpGain() failed. Invalid IP or hostnamed passed in: " + ip ) ;
}
var argsForScript = [ ] ;
for ( var i = 2 ; i < arguments . length ; ++ i ) {
argsForScript . push ( arguments [ i ] ) ;
}
var runningScriptObj = findRunningScript ( scriptname , argsForScript , server ) ;
if ( runningScriptObj == null ) {
workerScript . scriptRef . log ( "getScriptExpGain() failed. No such script " + scriptname + " on " + server . hostname + " with args: " + printArray ( argsForScript ) ) ;
return - 1 ;
}
return runningScriptObj . onlineExpGained / runningScriptObj . onlineRunningTime ;
}
} ,
2017-09-27 17:13:42 +02:00
getTimeSinceLastAug : function ( ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getTimeSinceLastAug ) {
return 0 ;
} else {
workerScript . loadedFns . getTimeSinceLastAug = true ;
return CONSTANTS . ScriptGetHackTimeRamCost ;
}
}
2017-09-27 17:13:42 +02:00
return Player . playtimeSinceLastAug ;
} ,
2017-11-03 04:11:14 +01:00
prompt : function ( txt ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) { return 0 ; }
2017-11-02 22:47:09 +01:00
if ( yesNoBoxOpen ) {
workerScript . scriptRef . log ( "ERROR: confirm() failed because a pop-up dialog box is already open" ) ;
return false ;
}
if ( ! isString ( txt ) ) { txt = String ( txt ) ; }
var yesBtn = yesNoBoxGetYesButton ( ) , noBtn = yesNoBoxGetNoButton ( ) ;
yesBtn . innerHTML = "Yes" ;
noBtn . innerHTML = "No" ;
return new Promise ( function ( resolve , reject ) {
yesBtn . addEventListener ( "click" , ( ) => {
yesNoBoxClose ( ) ;
resolve ( true ) ;
} ) ;
noBtn . addEventListener ( "click" , ( ) => {
yesNoBoxClose ( ) ;
resolve ( false ) ;
} ) ;
yesNoBoxCreate ( txt ) ;
} ) ;
2017-11-01 23:56:30 +01:00
} ,
2017-08-21 18:59:06 +02:00
/* Singularity Functions */
2017-11-01 23:56:30 +01:00
universityCourse : function ( universityName , className ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . universityCourse ) {
return 0 ;
} else {
workerScript . loadedFns . universityCourse = true ;
var ramCost = CONSTANTS . ScriptSingularityFn1RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 1 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run universityCourse(). It is a Singularity Function and requires SourceFile-4 (level 1) to run." ) ;
return false ;
}
}
2017-11-01 23:56:30 +01:00
if ( inMission ) {
workerScript . scriptRef . log ( "ERROR: universityCourse() failed because you are in the middle of a mission." ) ;
return ;
}
2017-08-21 18:59:06 +02:00
if ( Player . isWorking ) {
var txt = Player . singularityStopWork ( ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . universityCourse == null ) {
workerScript . scriptRef . log ( txt ) ;
}
2017-08-21 18:59:06 +02:00
}
2017-08-30 19:44:29 +02:00
2017-08-22 20:48:04 +02:00
var costMult , expMult ;
switch ( universityName . toLowerCase ( ) ) {
case Locations . AevumSummitUniversity . toLowerCase ( ) :
2017-08-30 19:44:29 +02:00
if ( Player . city != Locations . Aevum ) {
workerScript . scriptRef . log ( "ERROR: You cannot study at Summit University because you are not in Aevum. universityCourse() failed" ) ;
return false ;
}
2017-09-12 01:14:51 +02:00
Player . location = Locations . AevumSummitUniversity ;
2017-08-22 20:48:04 +02:00
costMult = 4 ;
expMult = 3 ;
break ;
case Locations . Sector12RothmanUniversity . toLowerCase ( ) :
2017-08-30 19:44:29 +02:00
if ( Player . city != Locations . Sector12 ) {
workerScript . scriptRef . log ( "ERROR: You cannot study at Rothman University because you are not in Sector-12. universityCourse() failed" ) ;
return false ;
}
2017-09-12 01:14:51 +02:00
Player . location = Locations . Sector12RothmanUniversity ;
2017-08-22 20:48:04 +02:00
costMult = 3 ;
expMult = 2 ;
break ;
case Locations . VolhavenZBInstituteOfTechnology . toLowerCase ( ) :
2017-08-31 07:04:23 +02:00
if ( Player . city != Locations . Volhaven ) {
2017-08-30 19:44:29 +02:00
workerScript . scriptRef . log ( "ERROR: You cannot study at ZB Institute of Technology because you are not in Volhaven. universityCourse() failed" ) ;
return false ;
}
2017-09-12 01:14:51 +02:00
Player . location = Locations . VolhavenZBInstituteOfTechnology ;
2017-08-22 20:48:04 +02:00
costMult = 5 ;
expMult = 4 ;
break ;
default :
workerScript . scriptRef . log ( "Invalid university name: " + universityName + ". universityCourse() failed" ) ;
return false ;
}
2017-08-30 19:44:29 +02:00
var task ;
2017-08-22 20:48:04 +02:00
switch ( className . toLowerCase ( ) ) {
case "Study Computer Science" . toLowerCase ( ) :
2017-08-30 19:44:29 +02:00
task = CONSTANTS . ClassStudyComputerScience ;
2017-08-22 20:48:04 +02:00
break ;
case "Data Structures" . toLowerCase ( ) :
2017-08-30 19:44:29 +02:00
task = CONSTANTS . ClassDataStructures ;
2017-08-22 20:48:04 +02:00
break ;
case "Networks" . toLowerCase ( ) :
2017-08-30 19:44:29 +02:00
task = CONSTANTS . ClassNetworks ;
2017-08-22 20:48:04 +02:00
break ;
case "Algorithms" . toLowerCase ( ) :
2017-08-30 19:44:29 +02:00
task = CONSTANTS . ClassAlgorithms ;
2017-08-22 20:48:04 +02:00
break ;
case "Management" . toLowerCase ( ) :
2017-08-30 19:44:29 +02:00
task = CONSTANTS . ClassManagement ;
2017-08-22 20:48:04 +02:00
break ;
case "Leadership" . toLowerCase ( ) :
2017-08-30 19:44:29 +02:00
task = CONSTANTS . ClassLeadership ;
2017-08-22 20:48:04 +02:00
break ;
default :
workerScript . scriptRef . log ( "Invalid class name: " + className + ". universityCourse() failed" ) ;
2017-08-30 19:44:29 +02:00
return false ;
}
Player . startClass ( costMult , expMult , task ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . universityCourse == null ) {
workerScript . scriptRef . log ( "Started " + task + " at " + universityName ) ;
}
2017-08-30 19:44:29 +02:00
return true ;
} ,
2017-11-01 23:56:30 +01:00
gymWorkout : function ( gymName , stat ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . gymWorkout ) {
return 0 ;
} else {
workerScript . loadedFns . gymWorkout = true ;
var ramCost = CONSTANTS . ScriptSingularityFn1RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 1 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run gymWorkout(). It is a Singularity Function and requires SourceFile-4 (level 1) to run." ) ;
return false ;
}
}
2017-11-01 23:56:30 +01:00
if ( inMission ) {
2017-11-03 04:32:31 +01:00
workerScript . scriptRef . log ( "ERROR: gymWorkout() failed because you are in the middle of a mission." ) ;
2017-11-01 23:56:30 +01:00
return ;
}
2017-08-30 19:44:29 +02:00
if ( Player . isWorking ) {
var txt = Player . singularityStopWork ( ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . gymWorkout == null ) {
workerScript . scriptRef . log ( txt ) ;
}
2017-08-30 19:44:29 +02:00
}
var costMult , expMult ;
switch ( gymName . toLowerCase ( ) ) {
case Locations . AevumCrushFitnessGym . toLowerCase ( ) :
if ( Player . city != Locations . Aevum ) {
workerScript . scriptRef . log ( "ERROR: You cannot workout at Crush Fitness because you are not in Aevum. gymWorkout() failed" ) ;
return false ;
}
2017-09-12 01:14:51 +02:00
Player . location = Locations . AevumCrushFitnessGym ;
2018-05-23 02:09:04 +02:00
costMult = 3 ;
expMult = 2 ;
2017-08-30 19:44:29 +02:00
break ;
case Locations . AevumSnapFitnessGym . toLowerCase ( ) :
if ( Player . city != Locations . Aevum ) {
workerScript . scriptRef . log ( "ERROR: You cannot workout at Snap Fitness because you are not in Aevum. gymWorkout() failed" ) ;
return false ;
}
2017-09-12 01:14:51 +02:00
Player . location = Locations . AevumSnapFitnessGym ;
2018-05-23 02:09:04 +02:00
costMult = 10 ;
expMult = 5 ;
2017-08-30 19:44:29 +02:00
break ;
case Locations . Sector12IronGym . toLowerCase ( ) :
if ( Player . city != Locations . Sector12 ) {
workerScript . scriptRef . log ( "ERROR: You cannot workout at Iron Gym because you are not in Sector-12. gymWorkout() failed" ) ;
return false ;
}
2017-09-12 01:14:51 +02:00
Player . location = Locations . Sector12IronGym ;
2017-08-30 19:44:29 +02:00
costMult = 1 ;
expMult = 1 ;
break ;
case Locations . Sector12PowerhouseGym . toLowerCase ( ) :
if ( Player . city != Locations . Sector12 ) {
workerScript . scriptRef . log ( "ERROR: You cannot workout at Powerhouse Gym because you are not in Sector-12. gymWorkout() failed" ) ;
return false ;
}
2017-09-12 01:14:51 +02:00
Player . location = Locations . Sector12PowerhouseGym ;
2018-05-23 02:09:04 +02:00
costMult = 20 ;
expMult = 10 ;
2017-08-30 19:44:29 +02:00
break ;
2017-08-30 20:36:59 +02:00
case Locations . VolhavenMilleniumFitnessGym :
if ( Player . city != Locations . Volhaven ) {
workerScript . scriptRef . log ( "ERROR: You cannot workout at Millenium Fitness Gym because you are not in Volhaven. gymWorkout() failed" ) ;
return false ;
}
2017-09-12 01:14:51 +02:00
Player . location = Locations . VolhavenMilleniumFitnessGym ;
2018-05-23 02:09:04 +02:00
costMult = 7 ;
expMult = 4 ;
2017-08-30 20:36:59 +02:00
break ;
2017-08-30 19:44:29 +02:00
default :
workerScript . scriptRef . log ( "Invalid gym name: " + gymName + ". gymWorkout() failed" ) ;
return false ;
}
switch ( stat . toLowerCase ( ) ) {
case "strength" . toLowerCase ( ) :
case "str" . toLowerCase ( ) :
Player . startClass ( costMult , expMult , CONSTANTS . ClassGymStrength ) ;
break ;
case "defense" . toLowerCase ( ) :
case "def" . toLowerCase ( ) :
Player . startClass ( costMult , expMult , CONSTANTS . ClassGymDefense ) ;
break ;
case "dexterity" . toLowerCase ( ) :
case "dex" . toLowerCase ( ) :
Player . startClass ( costMult , expMult , CONSTANTS . ClassGymDexterity ) ;
break ;
case "agility" . toLowerCase ( ) :
case "agi" . toLowerCase ( ) :
Player . startClass ( costMult , expMult , CONSTANTS . ClassGymAgility ) ;
break ;
default :
workerScript . scriptRef . log ( "Invalid stat: " + stat + ". gymWorkout() failed" ) ;
return false ;
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . gymWorkout == null ) {
workerScript . scriptRef . log ( "Started training " + stat + " at " + gymName ) ;
}
2017-08-30 19:44:29 +02:00
return true ;
} ,
travelToCity ( cityname ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . travelToCity ) {
return 0 ;
} else {
workerScript . loadedFns . travelToCity = true ;
2018-03-03 22:05:33 +01:00
var ramCost = CONSTANTS . ScriptSingularityFn1RamCost / 2 ;
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 1 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run travelToCity(). It is a Singularity Function and requires SourceFile-4 (level 1) to run." ) ;
return false ;
}
}
switch ( cityname ) {
case Locations . Aevum :
case Locations . Chongqing :
case Locations . Sector12 :
case Locations . NewTokyo :
case Locations . Ishima :
case Locations . Volhaven :
Player . loseMoney ( 200000 ) ;
Player . city = cityname ;
2017-09-19 20:38:03 +02:00
Player . gainIntelligenceExp ( CONSTANTS . IntelligenceSingFnBaseExpGain ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . travelToCity == null ) {
workerScript . scriptRef . log ( "Traveled to " + cityname ) ;
}
2017-08-30 19:44:29 +02:00
return true ;
default :
workerScript . scriptRef . log ( "ERROR: Invalid city name passed into travelToCity()." ) ;
return false ;
}
} ,
purchaseTor ( ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . purchaseTor ) {
return 0 ;
} else {
workerScript . loadedFns . purchaseTor = true ;
var ramCost = CONSTANTS . ScriptSingularityFn1RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 1 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run purchaseTor(). It is a Singularity Function and requires SourceFile-4 (level 1) to run." ) ;
return false ;
}
}
if ( SpecialServerIps [ "Darkweb Server" ] != null ) {
workerScript . scriptRef . log ( "You already have a TOR router! purchaseTor() failed" ) ;
return false ;
}
if ( Player . money . lt ( CONSTANTS . TorRouterCost ) ) {
workerScript . scriptRef . log ( "ERROR: You cannot afford to purchase a Tor router. purchaseTor() failed" ) ;
return false ;
}
Player . loseMoney ( CONSTANTS . TorRouterCost ) ;
2018-05-06 23:20:00 +02:00
var darkweb = new Server ( {
ip : createRandomIp ( ) , hostname : "darkweb" , organizationName : "" ,
isConnectedTo : false , adminRights : false , purchasedByPlayer : false , maxRam : 1
} ) ;
2017-08-30 19:44:29 +02:00
AddToAllServers ( darkweb ) ;
SpecialServerIps . addIp ( "Darkweb Server" , darkweb . ip ) ;
document . getElementById ( "location-purchase-tor" ) . setAttribute ( "class" , "a-link-button-inactive" ) ;
Player . getHomeComputer ( ) . serversOnNetwork . push ( darkweb . ip ) ;
darkweb . serversOnNetwork . push ( Player . getHomeComputer ( ) . ip ) ;
2017-09-19 20:38:03 +02:00
Player . gainIntelligenceExp ( CONSTANTS . IntelligenceSingFnBaseExpGain ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . purchaseTor == null ) {
workerScript . scriptRef . log ( "You have purchased a Tor router!" ) ;
}
2017-08-30 19:44:29 +02:00
return true ;
} ,
purchaseProgram ( programName ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . purchaseProgram ) {
return 0 ;
} else {
workerScript . loadedFns . purchaseProgram = true ;
var ramCost = CONSTANTS . ScriptSingularityFn1RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 1 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run purchaseProgram(). It is a Singularity Function and requires SourceFile-4 (level 1) to run." ) ;
return false ;
}
}
if ( SpecialServerIps [ "Darkweb Server" ] == null ) {
workerScript . scriptRef . log ( "ERROR: You do not have TOR router. purchaseProgram() failed." ) ;
return false ;
}
switch ( programName . toLowerCase ( ) ) {
case Programs . BruteSSHProgram . toLowerCase ( ) :
var price = parseDarkwebItemPrice ( DarkWebItems . BruteSSHProgram ) ;
if ( price > 0 && Player . money . gt ( price ) ) {
Player . loseMoney ( price ) ;
Player . getHomeComputer ( ) . programs . push ( Programs . BruteSSHProgram ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . purchaseProgram == null ) {
workerScript . scriptRef . log ( "You have purchased the BruteSSH.exe program. The new program can be found on your home computer." ) ;
}
2017-08-30 19:44:29 +02:00
} else {
workerScript . scriptRef . log ( "Not enough money to purchase " + programName ) ;
2017-09-07 07:45:14 +02:00
return false ;
2017-08-30 19:44:29 +02:00
}
return true ;
case Programs . FTPCrackProgram . toLowerCase ( ) :
var price = parseDarkwebItemPrice ( DarkWebItems . FTPCrackProgram ) ;
if ( price > 0 && Player . money . gt ( price ) ) {
Player . loseMoney ( price ) ;
Player . getHomeComputer ( ) . programs . push ( Programs . FTPCrackProgram ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . purchaseProgram == null ) {
workerScript . scriptRef . log ( "You have purchased the FTPCrack.exe program. The new program can be found on your home computer." ) ;
}
2017-08-30 19:44:29 +02:00
} else {
2017-09-07 07:45:14 +02:00
workerScript . scriptRef . log ( "Not enough money to purchase " + programName ) ;
return false ;
2017-08-30 19:44:29 +02:00
}
return true ;
case Programs . RelaySMTPProgram . toLowerCase ( ) :
var price = parseDarkwebItemPrice ( DarkWebItems . RelaySMTPProgram ) ;
if ( price > 0 && Player . money . gt ( price ) ) {
Player . loseMoney ( price ) ;
Player . getHomeComputer ( ) . programs . push ( Programs . RelaySMTPProgram ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . purchaseProgram == null ) {
workerScript . scriptRef . log ( "You have purchased the relaySMTP.exe program. The new program can be found on your home computer." ) ;
}
2017-08-30 19:44:29 +02:00
} else {
2017-09-07 07:45:14 +02:00
workerScript . scriptRef . log ( "Not enough money to purchase " + programName ) ;
return false ;
2017-08-30 19:44:29 +02:00
}
return true ;
case Programs . HTTPWormProgram . toLowerCase ( ) :
var price = parseDarkwebItemPrice ( DarkWebItems . HTTPWormProgram ) ;
if ( price > 0 && Player . money . gt ( price ) ) {
Player . loseMoney ( price ) ;
Player . getHomeComputer ( ) . programs . push ( Programs . HTTPWormProgram ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . purchaseProgram == null ) {
workerScript . scriptRef . log ( "You have purchased the HTTPWorm.exe program. The new program can be found on your home computer." ) ;
}
2017-08-30 19:44:29 +02:00
} else {
2017-09-07 07:45:14 +02:00
workerScript . scriptRef . log ( "Not enough money to purchase " + programName ) ;
return false ;
2017-08-30 19:44:29 +02:00
}
return true ;
case Programs . SQLInjectProgram . toLowerCase ( ) :
var price = parseDarkwebItemPrice ( DarkWebItems . SQLInjectProgram ) ;
if ( price > 0 && Player . money . gt ( price ) ) {
Player . loseMoney ( price ) ;
Player . getHomeComputer ( ) . programs . push ( Programs . SQLInjectProgram ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . purchaseProgram == null ) {
workerScript . scriptRef . log ( "You have purchased the SQLInject.exe program. The new program can be found on your home computer." ) ;
}
2017-08-30 19:44:29 +02:00
} else {
2017-09-07 07:45:14 +02:00
workerScript . scriptRef . log ( "Not enough money to purchase " + programName ) ;
return false ;
2017-08-30 19:44:29 +02:00
}
return true ;
case Programs . DeepscanV1 . toLowerCase ( ) :
var price = parseDarkwebItemPrice ( DarkWebItems . DeepScanV1Program ) ;
if ( price > 0 && Player . money . gt ( price ) ) {
Player . loseMoney ( price ) ;
Player . getHomeComputer ( ) . programs . push ( Programs . DeepscanV1 ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . purchaseProgram == null ) {
workerScript . scriptRef . log ( "You have purchased the DeepscanV1.exe program. The new program can be found on your home computer." ) ;
}
2017-08-30 19:44:29 +02:00
} else {
2017-09-07 07:45:14 +02:00
workerScript . scriptRef . log ( "Not enough money to purchase " + programName ) ;
return false ;
2017-08-30 19:44:29 +02:00
}
return true ;
case Programs . DeepscanV2 . toLowerCase ( ) :
var price = parseDarkwebItemPrice ( DarkWebItems . DeepScanV2Program ) ;
if ( price > 0 && Player . money . gt ( price ) ) {
Player . loseMoney ( price ) ;
Player . getHomeComputer ( ) . programs . push ( Programs . DeepscanV2 ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . purchaseProgram == null ) {
workerScript . scriptRef . log ( "You have purchased the DeepscanV2.exe program. The new program can be found on your home computer." ) ;
}
2017-08-30 19:44:29 +02:00
} else {
2017-09-07 07:45:14 +02:00
workerScript . scriptRef . log ( "Not enough money to purchase " + programName ) ;
return false ;
2017-08-30 19:44:29 +02:00
}
return true ;
default :
workerScript . scriptRef . log ( "ERROR: Invalid program passed into purchaseProgram()." ) ;
return false ;
}
return true ;
} ,
2017-10-12 04:00:22 +02:00
getStats : function ( ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getStats ) {
return 0 ;
} else {
workerScript . loadedFns . getStats = true ;
2018-03-03 22:05:33 +01:00
var ramCost = CONSTANTS . ScriptSingularityFn1RamCost / 4 ;
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-10-12 04:00:22 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 1 ) ) {
2017-10-16 04:09:49 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getStats(). It is a Singularity Function and requires SourceFile-4 (level 1) to run." ) ;
2017-10-12 04:00:22 +02:00
return { } ;
}
}
return {
hacking : Player . hacking _skill ,
strength : Player . strength ,
defense : Player . defense ,
dexterity : Player . dexterity ,
agility : Player . agility ,
charisma : Player . charisma ,
intelligence : Player . intelligence
}
} ,
2018-03-03 22:05:33 +01:00
getCharacterInformation : function ( ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getCharacterInformation ) {
return 0 ;
} else {
workerScript . loadedFns . getCharacterInformation = true ;
var ramCost = CONSTANTS . ScriptSingularityFn1RamCost / 4 ;
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
return ramCost ;
}
}
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 1 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getCharacterInformation(). It is a Singularity Function and requires SourceFile-4 (level 1) to run." ) ;
return { } ;
}
}
var companyPositionTitle = "" ;
if ( Player . companyPosition instanceof CompanyPosition ) {
companyPositionTitle = Player . companyPosition . positionName ;
}
return {
bitnode : Player . bitNodeN ,
company : Player . companyName ,
jobTitle : companyPositionTitle ,
city : Player . city ,
factions : Player . factions . slice ( ) ,
tor : SpecialServerIps . hasOwnProperty ( "Darkweb Server" ) ,
timeWorked : Player . timeWorked ,
workHackExpGain : Player . workHackExpGained ,
workStrExpGain : Player . workStrExpGained ,
workDefExpGain : Player . workDefExpGained ,
workDexExpGain : Player . workDexExpGained ,
workAgiExpGain : Player . workAgiExpGained ,
workChaExpGain : Player . workChaExpGained ,
workRepGain : Player . workRepGained ,
workMoneyGain : Player . workMoneyGained ,
} ;
} ,
2017-10-16 04:09:49 +02:00
isBusy : function ( ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . isBusy ) {
return 0 ;
} else {
workerScript . loadedFns . isBusy = true ;
2018-03-03 22:05:33 +01:00
var ramCost = CONSTANTS . ScriptSingularityFn1RamCost / 4 ;
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-10-16 04:09:49 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 1 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run isBusy(). It is a Singularity Function and requires SourceFile-4 (level 1) to run." ) ;
return ;
}
}
return Player . isWorking ;
} ,
2018-02-15 05:26:43 +01:00
stopAction : function ( ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . stopAction ) {
return 0 ;
} else {
workerScript . loadedFns . stopAction = true ;
2018-03-03 22:05:33 +01:00
var ramCost = CONSTANTS . ScriptSingularityFn1RamCost / 2 ;
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-02-15 05:26:43 +01:00
return ramCost ;
}
}
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 1 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run stopAction(). It is a Singularity Function and requires SourceFile-4 (level 1) to run." ) ;
return false ;
}
}
2018-02-15 05:26:43 +01:00
if ( Player . isWorking ) {
var txt = Player . singularityStopWork ( ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . stopAction == null ) {
workerScript . scriptRef . log ( txt ) ;
}
2018-02-15 05:26:43 +01:00
return true ;
}
return false ;
} ,
2018-03-03 22:05:33 +01:00
upgradeHomeRam : function ( ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . upgradeHomeRam ) {
return 0 ;
} else {
workerScript . loadedFns . upgradeHomeRam = true ;
var ramCost = CONSTANTS . ScriptSingularityFn2RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 2 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run upgradeHomeRam(). It is a Singularity Function and requires SourceFile-4 (level 2) to run." ) ;
return false ;
}
}
//Calculate how many times ram has been upgraded (doubled)
var currentRam = Player . getHomeComputer ( ) . maxRam ;
var numUpgrades = Math . log2 ( currentRam ) ;
//Calculate cost
//Have cost increase by some percentage each time RAM has been upgraded
var cost = currentRam * CONSTANTS . BaseCostFor1GBOfRamHome ;
var mult = Math . pow ( 1.55 , numUpgrades ) ;
cost = cost * mult ;
if ( Player . money . lt ( cost ) ) {
2017-08-31 07:04:23 +02:00
workerScript . scriptRef . log ( "ERROR: upgradeHomeRam() failed because you don't have enough money" ) ;
2017-08-30 19:44:29 +02:00
return false ;
}
var homeComputer = Player . getHomeComputer ( ) ;
homeComputer . maxRam *= 2 ;
Player . loseMoney ( cost ) ;
2017-09-19 20:38:03 +02:00
Player . gainIntelligenceExp ( CONSTANTS . IntelligenceSingFnBaseExpGain ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . upgradeHomeRam == null ) {
workerScript . scriptRef . log ( "Purchased additional RAM for home computer! It now has " + homeComputer . maxRam + "GB of RAM." ) ;
}
2017-08-30 19:44:29 +02:00
return true ;
} ,
2018-03-03 22:05:33 +01:00
getUpgradeHomeRamCost : function ( ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getUpgradeHomeRamCost ) {
return 0 ;
} else {
workerScript . loadedFns . getUpgradeHomeRamCost = true ;
2018-03-03 22:05:33 +01:00
var ramCost = CONSTANTS . ScriptSingularityFn2RamCost / 2 ;
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 2 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getUpgradeHomeRamCost(). It is a Singularity Function and requires SourceFile-4 (level 2) to run." ) ;
return false ;
}
}
//Calculate how many times ram has been upgraded (doubled)
var currentRam = Player . getHomeComputer ( ) . maxRam ;
var numUpgrades = Math . log2 ( currentRam ) ;
//Calculate cost
//Have cost increase by some percentage each time RAM has been upgraded
var cost = currentRam * CONSTANTS . BaseCostFor1GBOfRamHome ;
var mult = Math . pow ( 1.55 , numUpgrades ) ;
return cost * mult ;
} ,
2018-03-03 22:05:33 +01:00
workForCompany : function ( ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . workForCompany ) {
return 0 ;
} else {
workerScript . loadedFns . workForCompany = true ;
var ramCost = CONSTANTS . ScriptSingularityFn2RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 2 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run workForCompany(). It is a Singularity Function and requires SourceFile-4 (level 2) to run." ) ;
return false ;
}
}
2017-11-01 23:56:30 +01:00
if ( inMission ) {
2017-11-03 04:32:31 +01:00
workerScript . scriptRef . log ( "ERROR: workForCompany() failed because you are in the middle of a mission." ) ;
2017-11-01 23:56:30 +01:00
return ;
}
2017-08-30 19:44:29 +02:00
if ( Player . companyPosition == "" || ! ( Player . companyPosition instanceof CompanyPosition ) ) {
workerScript . scriptRef . log ( "ERROR: workForCompany() failed because you do not have a job" ) ;
return false ;
}
if ( Player . isWorking ) {
var txt = Player . singularityStopWork ( ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . workForCompany == null ) {
workerScript . scriptRef . log ( txt ) ;
}
2017-08-30 19:44:29 +02:00
}
if ( Player . companyPosition . isPartTimeJob ( ) ) {
Player . startWorkPartTime ( ) ;
} else {
Player . startWork ( ) ;
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . workForCompany == null ) {
workerScript . scriptRef . log ( "Began working at " + Player . companyName + " as a " + Player . companyPosition . positionName ) ;
}
2017-08-30 19:44:29 +02:00
return true ;
} ,
2018-03-03 22:05:33 +01:00
applyToCompany : function ( companyName , field ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . applyToCompany ) {
return 0 ;
} else {
workerScript . loadedFns . applyToCompany = true ;
var ramCost = CONSTANTS . ScriptSingularityFn2RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 2 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run applyToCompany(). It is a Singularity Function and requires SourceFile-4 (level 2) to run." ) ;
return false ;
}
}
2017-08-30 20:36:59 +02:00
if ( ! companyExists ( companyName ) ) {
2017-08-31 07:04:23 +02:00
workerScript . scriptRef . log ( "ERROR: applyToCompany() failed because specified company " + companyName + " does not exist." ) ;
2017-08-30 20:36:59 +02:00
return false ;
}
2017-08-30 19:44:29 +02:00
Player . location = companyName ;
var res ;
switch ( field . toLowerCase ( ) ) {
case "software" :
res = Player . applyForSoftwareJob ( true ) ;
break ;
case "software consultant" :
res = Player . applyForSoftwareConsultantJob ( true ) ;
break ;
case "it" :
res = Player . applyForItJob ( true ) ;
break ;
case "security engineer" :
res = Player . applyForSecurityEngineerJob ( true ) ;
break ;
case "network engineer" :
res = Player . applyForNetworkEngineerJob ( true ) ;
break ;
case "business" :
res = Player . applyForBusinessJob ( true ) ;
2017-08-22 20:48:04 +02:00
break ;
2017-08-30 19:44:29 +02:00
case "business consultant" :
res = Player . applyForBusinessConsultantJob ( true ) ;
break ;
case "security" :
res = Player . applyForSecurityJob ( true ) ;
break ;
case "agent" :
res = Player . applyForAgentJob ( true ) ;
break ;
case "employee" :
res = Player . applyForEmployeeJob ( true ) ;
break ;
case "part-time employee" :
res = Player . applyForPartTimeEmployeeJob ( true ) ;
break ;
case "waiter" :
res = Player . applyForWaiterJob ( true ) ;
break ;
case "part-time waiter" :
res = Player . applyForPartTimeWaiterJob ( true ) ;
break ;
default :
workerScript . scriptRef . log ( "ERROR: Invalid job passed into applyToCompany: " + field + ". applyToCompany() failed" ) ;
return false ;
2017-08-22 20:48:04 +02:00
}
2017-08-30 19:44:29 +02:00
//The Player object's applyForJob function can return string with special error messages
if ( isString ( res ) ) {
workerScript . scriptRef . log ( res ) ;
return false ;
}
if ( res ) {
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . applyToCompany == null ) {
workerScript . scriptRef . log ( "You were offered a new job at " + companyName + " as a " + Player . companyPosition . positionName ) ;
}
2017-08-30 19:44:29 +02:00
} else {
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . applyToCompany == null ) {
workerScript . scriptRef . log ( "You failed to get a new job/promotion at " + companyName + " in the " + field + " field." ) ;
}
2017-08-30 19:44:29 +02:00
}
return res ;
2017-08-21 18:59:06 +02:00
} ,
2018-03-03 22:05:33 +01:00
getCompanyRep : function ( companyName ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getCompanyRep ) {
return 0 ;
} else {
workerScript . loadedFns . getCompanyRep = true ;
2018-03-03 22:05:33 +01:00
var ramCost = CONSTANTS . ScriptSingularityFn2RamCost / 4 ;
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 2 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getCompanyRep(). It is a Singularity Function and requires SourceFile-4 (level 2) to run." ) ;
return false ;
}
}
var company = Companies [ companyName ] ;
2017-10-26 00:05:12 +02:00
if ( company == null || ! ( company instanceof Company ) ) {
2017-08-30 19:44:29 +02:00
workerScript . scriptRef . log ( "ERROR: Invalid companyName passed into getCompanyRep(): " + companyName ) ;
return - 1 ;
}
return company . playerReputation ;
} ,
2018-03-03 22:05:33 +01:00
getCompanyFavor : function ( companyName ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getCompanyFavor ) {
return 0 ;
} else {
workerScript . loadedFns . getCompanyFavor = true ;
var ramCost = CONSTANTS . ScriptSingularityFn2RamCost / 4 ;
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
return ramCost ;
}
}
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 2 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getCompanyFavor(). It is a Singularity Function and requires SourceFile-4 (level 2) to run." ) ;
return false ;
}
}
var company = Companies [ companyName ] ;
if ( company == null || ! ( company instanceof Company ) ) {
workerScript . scriptRef . log ( "ERROR: Invalid companyName passed into getCompanyFavor(): " + companyName ) ;
return - 1 ;
}
return company . favor ;
} ,
checkFactionInvitations : function ( ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . checkFactionInvitations ) {
return 0 ;
} else {
workerScript . loadedFns . checkFactionInvitations = true ;
var ramCost = CONSTANTS . ScriptSingularityFn2RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 2 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run checkFactionInvitations(). It is a Singularity Function and requires SourceFile-4 (level 2) to run." ) ;
return false ;
}
}
//Make a copy of Player.factionInvitations
return Player . factionInvitations . slice ( ) ;
} ,
2018-03-03 22:05:33 +01:00
joinFaction : function ( name ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . joinFaction ) {
return 0 ;
} else {
workerScript . loadedFns . joinFaction = true ;
var ramCost = CONSTANTS . ScriptSingularityFn2RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 2 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run joinFaction(). It is a Singularity Function and requires SourceFile-4 (level 2) to run." ) ;
return false ;
}
}
2017-08-21 18:59:06 +02:00
2017-08-30 19:44:29 +02:00
if ( ! factionExists ( name ) ) {
workerScript . scriptRef . log ( "ERROR: Faction specified in joinFaction() does not exist." ) ;
return false ;
}
2017-08-21 18:59:06 +02:00
2017-08-30 19:44:29 +02:00
if ( ! Player . factionInvitations . includes ( name ) ) {
workerScript . scriptRef . log ( "ERROR: Cannot join " + name + " Faction because you have not been invited. joinFaction() failed" ) ;
return false ;
}
2017-08-21 18:59:06 +02:00
2017-08-30 19:44:29 +02:00
var index = Player . factionInvitations . indexOf ( name ) ;
if ( index === - 1 ) {
//Redundant and should never happen...
workerScript . scriptRef . log ( "ERROR: Cannot join " + name + " Faction because you have not been invited. joinFaction() failed" ) ;
return false ;
}
Player . factionInvitations . splice ( index , 1 ) ;
var fac = Factions [ name ] ;
joinFaction ( fac ) ;
2017-09-19 20:38:03 +02:00
Player . gainIntelligenceExp ( CONSTANTS . IntelligenceSingFnBaseExpGain ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . joinFaction == null ) {
workerScript . scriptRef . log ( "Joined the " + name + " faction." ) ;
}
2017-08-30 19:44:29 +02:00
return true ;
} ,
2018-03-03 22:05:33 +01:00
workForFaction : function ( name , type ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . workForFaction ) {
return 0 ;
} else {
workerScript . loadedFns . workForFaction = true ;
var ramCost = CONSTANTS . ScriptSingularityFn2RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 2 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run workForFaction(). It is a Singularity Function and requires SourceFile-4 (level 2) to run." ) ;
return false ;
}
}
2017-08-21 18:59:06 +02:00
2017-11-01 23:56:30 +01:00
if ( inMission ) {
2017-11-03 04:32:31 +01:00
workerScript . scriptRef . log ( "ERROR: workForFaction() failed because you are in the middle of a mission." ) ;
2017-11-01 23:56:30 +01:00
return ;
}
2017-08-30 19:44:29 +02:00
if ( ! factionExists ( name ) ) {
workerScript . scriptRef . log ( "ERROR: Faction specified in workForFaction() does not exist." ) ;
return false ;
}
2017-08-21 18:59:06 +02:00
2017-08-30 20:36:59 +02:00
if ( ! Player . factions . includes ( name ) ) {
workerScript . scriptRef . log ( "ERROR: workForFaction() failed because you are not a member of " + name ) ;
return false ;
}
2017-08-30 19:44:29 +02:00
if ( Player . isWorking ) {
var txt = Player . singularityStopWork ( ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . workForFaction == null ) {
workerScript . scriptRef . log ( txt ) ;
}
2017-08-30 19:44:29 +02:00
}
2017-08-21 18:59:06 +02:00
2017-08-30 19:44:29 +02:00
var fac = Factions [ name ] ;
//Arrays listing factions that allow each time of work
var hackAvailable = [ "Illuminati" , "Daedalus" , "The Covenant" , "ECorp" , "MegaCorp" ,
"Bachman & Associates" , "Blade Industries" , "NWO" , "Clarke Incorporated" ,
"OmniTek Incorporated" , "Four Sigma" , "KuaiGong International" ,
"Fulcrum Secret Technologies" , "BitRunners" , "The Black Hand" ,
"NiteSec" , "Chongqing" , "Sector-12" , "New Tokyo" , "Aevum" ,
"Ishima" , "Volhaven" , "Speakers for the Dead" , "The Dark Army" ,
"The Syndicate" , "Silhouette" , "Netburners" , "Tian Di Hui" , "CyberSec" ] ;
var fdWkAvailable = [ "Illuminati" , "Daedalus" , "The Covenant" , "ECorp" , "MegaCorp" ,
"Bachman & Associates" , "Blade Industries" , "NWO" , "Clarke Incorporated" ,
"OmniTek Incorporated" , "Four Sigma" , "KuaiGong International" ,
"The Black Hand" , "Chongqing" , "Sector-12" , "New Tokyo" , "Aevum" ,
"Ishima" , "Volhaven" , "Speakers for the Dead" , "The Dark Army" ,
"The Syndicate" , "Silhouette" , "Tetrads" , "Slum Snakes" ] ;
var scWkAvailable = [ "ECorp" , "MegaCorp" ,
"Bachman & Associates" , "Blade Industries" , "NWO" , "Clarke Incorporated" ,
"OmniTek Incorporated" , "Four Sigma" , "KuaiGong International" ,
"Fulcrum Secret Technologies" , "Chongqing" , "Sector-12" , "New Tokyo" , "Aevum" ,
"Ishima" , "Volhaven" , "Speakers for the Dead" ,
"The Syndicate" , "Tetrads" , "Slum Snakes" , "Tian Di Hui" ] ;
2017-08-21 18:59:06 +02:00
2017-08-30 19:44:29 +02:00
switch ( type . toLowerCase ( ) ) {
case "hacking" :
case "hacking contracts" :
case "hackingcontracts" :
if ( ! hackAvailable . includes ( fac . name ) ) {
workerScript . scriptRef . log ( "ERROR: Cannot carry out hacking contracts for " + fac . name + ". workForFaction() failed" ) ;
return false ;
}
Player . startFactionHackWork ( fac ) ;
workerScript . scriptRef . log ( "Started carrying out hacking contracts for " + fac . name ) ;
return true ;
case "field" :
case "fieldwork" :
case "field work" :
if ( ! fdWkAvailable . includes ( fac . name ) ) {
workerScript . scriptRef . log ( "ERROR: Cannot carry out field missions for " + fac . name + ". workForFaction() failed" ) ;
return false ;
}
Player . startFactionFieldWork ( fac ) ;
workerScript . scriptRef . log ( "Started carrying out field missions for " + fac . name ) ;
return true ;
case "security" :
case "securitywork" :
case "security work" :
if ( ! scWkAvailable . includes ( fac . name ) ) {
workerScript . scriptRef . log ( "ERROR: Cannot serve as security detail for " + fac . name + ". workForFaction() failed" ) ;
return false ;
}
Player . startFactionSecurityWork ( fac ) ;
workerScript . scriptRef . log ( "Started serving as security details for " + fac . name ) ;
return true ;
default :
workerScript . scriptRef . log ( "ERROR: Invalid work type passed into workForFaction(): " + type ) ;
}
2017-08-30 20:36:59 +02:00
return true ;
2017-08-30 19:44:29 +02:00
} ,
2018-03-03 22:05:33 +01:00
getFactionRep : function ( name ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getFactionRep ) {
return 0 ;
} else {
workerScript . loadedFns . getFactionRep = true ;
2018-03-03 22:05:33 +01:00
var ramCost = CONSTANTS . ScriptSingularityFn2RamCost / 4 ;
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 2 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getFactionRep(). It is a Singularity Function and requires SourceFile-4 (level 2) to run." ) ;
return - 1 ;
}
}
if ( ! factionExists ( name ) ) {
workerScript . scriptRef . log ( "ERROR: Faction specified in getFactionRep() does not exist." ) ;
return - 1 ;
}
2017-08-21 18:59:06 +02:00
2017-08-30 19:44:29 +02:00
return Factions [ name ] . playerReputation ;
} ,
2018-03-03 22:05:33 +01:00
getFactionFavor : function ( name ) {
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getFactionFavor ) {
return 0 ;
} else {
workerScript . loadedFns . getFactionFavor = true ;
var ramCost = CONSTANTS . ScriptSingularityFn2RamCost / 4 ;
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
return ramCost ;
}
}
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 2 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getFactionFavor(). It is a Singularity Function and requires SourceFile-4 (level 2) to run." ) ;
return - 1 ;
}
}
if ( ! factionExists ( name ) ) {
workerScript . scriptRef . log ( "ERROR: Faction specified in getFactionFavor() does not exist." ) ;
return - 1 ;
}
return Factions [ name ] . favor ;
} ,
createProgram : function ( name ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . createProgram ) {
return 0 ;
} else {
workerScript . loadedFns . createProgram = true ;
var ramCost = CONSTANTS . ScriptSingularityFn3RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 3 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run createProgram(). It is a Singularity Function and requires SourceFile-4 (level 3) to run." ) ;
return false ;
}
}
2017-11-01 23:56:30 +01:00
if ( inMission ) {
2017-11-03 04:32:31 +01:00
workerScript . scriptRef . log ( "ERROR: createProgram() failed because you are in the middle of a mission." ) ;
2017-11-01 23:56:30 +01:00
return ;
}
2017-08-30 19:44:29 +02:00
if ( Player . isWorking ) {
var txt = Player . singularityStopWork ( ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . createProgram == null ) {
workerScript . scriptRef . log ( txt ) ;
}
2017-08-30 19:44:29 +02:00
}
switch ( name . toLowerCase ( ) ) {
case Programs . NukeProgram . toLowerCase ( ) :
Player . startCreateProgramWork ( Programs . NukeProgram , CONSTANTS . MillisecondsPerFiveMinutes , 1 ) ;
break ;
case Programs . BruteSSHProgram . toLowerCase ( ) :
if ( Player . hacking _skill < 50 ) {
workerScript . scriptRef . log ( "ERROR: createProgram() failed because hacking level is too low to create BruteSSH (level 50 req)" ) ;
return false ;
}
Player . startCreateProgramWork ( Programs . BruteSSHProgram , CONSTANTS . MillisecondsPerFiveMinutes * 2 , 50 ) ;
break ;
case Programs . FTPCrackProgram . toLowerCase ( ) :
if ( Player . hacking _skill < 100 ) {
workerScript . scriptRef . log ( "ERROR: createProgram() failed because hacking level is too low to create FTPCrack (level 100 req)" ) ;
return false ;
}
Player . startCreateProgramWork ( Programs . FTPCrackProgram , CONSTANTS . MillisecondsPerHalfHour , 100 ) ;
break ;
case Programs . RelaySMTPProgram . toLowerCase ( ) :
if ( Player . hacking _skill < 250 ) {
workerScript . scriptRef . log ( "ERROR: createProgram() failed because hacking level is too low to create relaySMTP (level 250 req)" ) ;
return false ;
}
Player . startCreateProgramWork ( Programs . RelaySMTPProgram , CONSTANTS . MillisecondsPer2Hours , 250 ) ;
break ;
case Programs . HTTPWormProgram . toLowerCase ( ) :
if ( Player . hacking _skill < 500 ) {
workerScript . scriptRef . log ( "ERROR: createProgram() failed because hacking level is too low to create HTTPWorm (level 500 req)" ) ;
return false ;
}
Player . startCreateProgramWork ( Programs . HTTPWormProgram , CONSTANTS . MillisecondsPer4Hours , 500 ) ;
break ;
case Programs . SQLInjectProgram . toLowerCase ( ) :
if ( Player . hacking _skill < 750 ) {
workerScript . scriptRef . log ( "ERROR: createProgram() failed because hacking level is too low to create SQLInject (level 750 req)" ) ;
return false ;
}
Player . startCreateProgramWork ( Programs . SQLInjectProgram , CONSTANTS . MillisecondsPer8Hours , 750 ) ;
break ;
case Programs . DeepscanV1 . toLowerCase ( ) :
if ( Player . hacking _skill < 75 ) {
workerScript . scriptRef . log ( "ERROR: createProgram() failed because hacking level is too low to create DeepscanV1 (level 75 req)" ) ;
return false ;
}
Player . startCreateProgramWork ( Programs . DeepscanV1 , CONSTANTS . MillisecondsPerQuarterHour , 75 ) ;
break ;
case Programs . DeepscanV2 . toLowerCase ( ) :
if ( Player . hacking _skill < 400 ) {
workerScript . scriptRef . log ( "ERROR: createProgram() failed because hacking level is too low to create DeepscanV2 (level 400 req)" ) ;
return false ;
}
Player . startCreateProgramWork ( Programs . DeepscanV2 , CONSTANTS . MillisecondsPer2Hours , 400 ) ;
break ;
case Programs . ServerProfiler . toLowerCase ( ) :
if ( Player . hacking _skill < 75 ) {
workerScript . scriptRef . log ( "ERROR: createProgram() failed because hacking level is too low to create ServerProfiler (level 75 req)" ) ;
return false ;
}
Player . startCreateProgramWork ( Programs . ServerProfiler , CONSTANTS . MillisecondsPerHalfHour , 75 ) ;
break ;
case Programs . AutoLink . toLowerCase ( ) :
if ( Player . hacking _skill < 25 ) {
workerScript . scriptRef . log ( "ERROR: createProgram() failed because hacking level is too low to create AutoLink (level 25 req)" ) ;
return false ;
}
Player . startCreateProgramWork ( Programs . AutoLink , CONSTANTS . MillisecondsPerQuarterHour , 25 ) ;
break ;
default :
workerScript . scriptRef . log ( "ERROR: createProgram() failed because the specified program does not exist: " + name ) ;
return false ;
}
workerScript . scriptRef . log ( "Began creating program: " + name ) ;
return true ;
} ,
2017-11-01 23:56:30 +01:00
commitCrime : function ( crime ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . commitCrime ) {
return 0 ;
} else {
workerScript . loadedFns . commitCrime = true ;
var ramCost = CONSTANTS . ScriptSingularityFn3RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-10-12 04:00:22 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 3 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run commitCrime(). It is a Singularity Function and requires SourceFile-4 (level 3) to run." ) ;
return ;
}
}
2017-11-01 23:56:30 +01:00
if ( inMission ) {
2017-11-03 04:32:31 +01:00
workerScript . scriptRef . log ( "ERROR: commitCrime() failed because you are in the middle of a mission." ) ;
2017-11-01 23:56:30 +01:00
return ;
}
2017-10-12 04:00:22 +02:00
if ( Player . isWorking ) {
var txt = Player . singularityStopWork ( ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . commitCrime == null ) {
workerScript . scriptRef . log ( txt ) ;
}
2017-10-12 04:00:22 +02:00
}
2017-10-20 23:59:54 +02:00
//Set Location to slums
switch ( Player . city ) {
case Locations . Aevum :
Player . location = Locations . AevumSlums ;
break ;
case Locations . Chongqing :
Player . location = Locations . ChongqingSlums ;
break ;
case Locations . Sector12 :
Player . location = Locations . Sector12Slums ;
break ;
case Locations . NewTokyo :
Player . location = Locations . NewTokyoSlums ;
break ;
case Locations . Ishima :
Player . location = Locations . IshimaSlums ;
break ;
case Locations . Volhaven :
Player . location = Locations . VolhavenSlums ;
break ;
default :
console . log ( "Invalid Player.city value" ) ;
}
2017-10-12 04:00:22 +02:00
crime = crime . toLowerCase ( ) ;
2018-05-06 05:59:55 +02:00
let enableCommitCrimeLog = workerScript . disableLogs . ALL == null && workerScript . disableLogs . commitCrime == null
2017-10-12 04:00:22 +02:00
if ( crime . includes ( "shoplift" ) ) {
2018-05-06 05:59:55 +02:00
if ( enableCommitCrimeLog ) { workerScript . scriptRef . log ( "Attempting to shoplift..." ) ; }
2017-10-16 04:09:49 +02:00
return commitShopliftCrime ( CONSTANTS . CrimeSingFnDivider , { workerscript : workerScript } ) ;
2017-10-12 04:00:22 +02:00
} else if ( crime . includes ( "rob" ) && crime . includes ( "store" ) ) {
2018-05-06 05:59:55 +02:00
if ( enableCommitCrimeLog ) { workerScript . scriptRef . log ( "Attempting to rob a store..." ) ; }
2017-10-16 04:09:49 +02:00
return commitRobStoreCrime ( CONSTANTS . CrimeSingFnDivider , { workerscript : workerScript } ) ;
2017-10-12 04:00:22 +02:00
} else if ( crime . includes ( "mug" ) ) {
2018-05-06 05:59:55 +02:00
if ( enableCommitCrimeLog ) { workerScript . scriptRef . log ( "Attempting to mug someone..." ) ; }
2017-10-16 04:09:49 +02:00
return commitMugCrime ( CONSTANTS . CrimeSingFnDivider , { workerscript : workerScript } ) ;
2017-10-12 04:00:22 +02:00
} else if ( crime . includes ( "larceny" ) ) {
2018-05-06 05:59:55 +02:00
if ( enableCommitCrimeLog ) { workerScript . scriptRef . log ( "Attempting to commit larceny..." ) ; }
2017-10-16 04:09:49 +02:00
return commitLarcenyCrime ( CONSTANTS . CrimeSingFnDivider , { workerscript : workerScript } ) ;
2017-10-12 04:00:22 +02:00
} else if ( crime . includes ( "drugs" ) ) {
2018-05-06 05:59:55 +02:00
if ( enableCommitCrimeLog ) { workerScript . scriptRef . log ( "Attempting to deal drugs..." ) ; }
2017-10-16 04:09:49 +02:00
return commitDealDrugsCrime ( CONSTANTS . CrimeSingFnDivider , { workerscript : workerScript } ) ;
2017-10-12 04:00:22 +02:00
} else if ( crime . includes ( "bond" ) && crime . includes ( "forge" ) ) {
2018-05-06 05:59:55 +02:00
if ( enableCommitCrimeLog ) { workerScript . scriptRef . log ( "Attempting to forge corporate bonds..." ) ; }
2017-10-16 04:09:49 +02:00
return commitBondForgeryCrime ( CONSTANTS . CrimeSingFnDivider , { workerscript : workerScript } ) ;
2017-10-12 04:00:22 +02:00
} else if ( crime . includes ( "traffick" ) && crime . includes ( "arms" ) ) {
2018-05-06 05:59:55 +02:00
if ( enableCommitCrimeLog ) { workerScript . scriptRef . log ( "Attempting to traffick illegal arms..." ) ; }
2017-10-16 04:09:49 +02:00
return commitTraffickArmsCrime ( CONSTANTS . CrimeSingFnDivider , { workerscript : workerScript } ) ;
2017-10-12 04:00:22 +02:00
} else if ( crime . includes ( "homicide" ) ) {
2018-05-06 05:59:55 +02:00
if ( enableCommitCrimeLog ) { workerScript . scriptRef . log ( "Attempting to commit homicide..." ) ; }
2017-10-16 04:09:49 +02:00
return commitHomicideCrime ( CONSTANTS . CrimeSingFnDivider , { workerscript : workerScript } ) ;
2017-10-12 04:00:22 +02:00
} else if ( crime . includes ( "grand" ) && crime . includes ( "auto" ) ) {
2018-05-06 05:59:55 +02:00
if ( enableCommitCrimeLog ) { workerScript . scriptRef . log ( "Attempting to commit grand theft auto..." ) ; }
2017-10-16 04:09:49 +02:00
return commitGrandTheftAutoCrime ( CONSTANTS . CrimeSingFnDivider , { workerscript : workerScript } ) ;
2017-10-12 04:00:22 +02:00
} else if ( crime . includes ( "kidnap" ) ) {
2018-05-06 05:59:55 +02:00
if ( enableCommitCrimeLog ) { workerScript . scriptRef . log ( "Attempting to kidnap and ransom a high-profile target..." ) ; }
2017-10-16 04:09:49 +02:00
return commitKidnapCrime ( CONSTANTS . CrimeSingFnDivider , { workerscript : workerScript } ) ;
2017-10-12 04:00:22 +02:00
} else if ( crime . includes ( "assassinate" ) ) {
2018-05-06 05:59:55 +02:00
if ( enableCommitCrimeLog ) { workerScript . scriptRef . log ( "Attempting to assassinate a high-profile target..." ) ; }
2017-10-16 04:09:49 +02:00
return commitAssassinationCrime ( CONSTANTS . CrimeSingFnDivider , { workerscript : workerScript } )
2017-10-12 04:00:22 +02:00
} else if ( crime . includes ( "heist" ) ) {
2018-05-06 05:59:55 +02:00
if ( enableCommitCrimeLog ) { workerScript . scriptRef . log ( "Attempting to pull off a heist..." ) ; }
2017-10-16 04:09:49 +02:00
return commitHeistCrime ( CONSTANTS . CrimeSingFnDivider , { workerscript : workerScript } ) ;
2017-10-12 04:00:22 +02:00
} else {
throw makeRuntimeRejectMsg ( workerScript , "Invalid crime passed into commitCrime(): " + crime ) ;
}
} ,
2018-03-03 22:05:33 +01:00
getCrimeChance : function ( crime ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getCrimeChance ) {
return 0 ;
} else {
workerScript . loadedFns . getCrimeChance = true ;
var ramCost = CONSTANTS . ScriptSingularityFn3RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-10-15 03:55:41 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 3 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getCrimeChance(). It is a Singularity Function and requires SourceFile-4 (level 3) to run." ) ;
return ;
}
}
crime = crime . toLowerCase ( ) ;
if ( crime . includes ( "shoplift" ) ) {
return determineCrimeChanceShoplift ( ) ;
} else if ( crime . includes ( "rob" ) && crime . includes ( "store" ) ) {
return determineCrimeChanceRobStore ( ) ;
} else if ( crime . includes ( "mug" ) ) {
return determineCrimeChanceMug ( ) ;
} else if ( crime . includes ( "larceny" ) ) {
return determineCrimeChanceLarceny ( ) ;
} else if ( crime . includes ( "drugs" ) ) {
return determineCrimeChanceDealDrugs ( ) ;
} else if ( crime . includes ( "bond" ) && crime . includes ( "forge" ) ) {
return determineCrimeChanceBondForgery ( ) ;
} else if ( crime . includes ( "traffick" ) && crime . includes ( "arms" ) ) {
return determineCrimeChanceTraffickArms ( ) ;
} else if ( crime . includes ( "homicide" ) ) {
return determineCrimeChanceHomicide ( ) ;
} else if ( crime . includes ( "grand" ) && crime . includes ( "auto" ) ) {
return determineCrimeChanceGrandTheftAuto ( ) ;
} else if ( crime . includes ( "kidnap" ) ) {
return determineCrimeChanceKidnap ( ) ;
} else if ( crime . includes ( "assassinate" ) ) {
return determineCrimeChanceAssassination ( ) ;
} else if ( crime . includes ( "heist" ) ) {
return determineCrimeChanceHeist ( ) ;
} else {
throw makeRuntimeRejectMsg ( workerScript , "Invalid crime passed into getCrimeChance(): " + crime ) ;
}
} ,
2018-03-03 22:05:33 +01:00
getOwnedAugmentations : function ( purchased = false ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getOwnedAugmentations ) {
return 0 ;
} else {
workerScript . loadedFns . getOwnedAugmentations = true ;
var ramCost = CONSTANTS . ScriptSingularityFn3RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-10-10 06:56:48 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 3 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getOwnedAugmentations(). It is a Singularity Function and requires SourceFile-4 (level 3) to run." ) ;
return [ ] ;
}
}
var res = [ ] ;
for ( var i = 0 ; i < Player . augmentations . length ; ++ i ) {
res . push ( Player . augmentations [ i ] . name ) ;
}
if ( purchased ) {
for ( var i = 0 ; i < Player . queuedAugmentations . length ; ++ i ) {
res . push ( Player . queuedAugmentations [ i ] . name ) ;
}
}
return res ;
} ,
2018-03-03 22:05:33 +01:00
getAugmentationsFromFaction : function ( facname ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getAugmentationsFromFaction ) {
return 0 ;
} else {
workerScript . loadedFns . getAugmentationsFromFaction = true ;
var ramCost = CONSTANTS . ScriptSingularityFn3RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-10-10 06:56:48 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 3 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getAugmentationsFromFaction(). It is a Singularity Function and requires SourceFile-4 (level 3) to run." ) ;
return [ ] ;
}
}
if ( ! factionExists ( facname ) ) {
workerScript . scriptRef . log ( "ERROR: getAugmentationsFromFaction() failed. Invalid faction name passed in (this is case-sensitive): " + facname ) ;
return [ ] ;
}
var fac = Factions [ facname ] ;
var res = [ ] ;
for ( var i = 0 ; i < fac . augmentations . length ; ++ i ) {
res . push ( fac . augmentations [ i ] ) ;
}
return res ;
} ,
2018-03-03 22:05:33 +01:00
getAugmentationCost : function ( name ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . getAugmentationCost ) {
return 0 ;
} else {
workerScript . loadedFns . getAugmentationCost = true ;
var ramCost = CONSTANTS . ScriptSingularityFn3RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 3 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getAugmentationCost(). It is a Singularity Function and requires SourceFile-4 (level 3) to run." ) ;
return false ;
}
}
if ( ! augmentationExists ( name ) ) {
workerScript . scriptRef . log ( "ERROR: getAugmentationCost() failed. Invalid Augmentation name passed in (note: this is case-sensitive): " + name ) ;
return [ - 1 , - 1 ] ;
}
var aug = Augmentations [ name ] ;
return [ aug . baseRepRequirement , aug . baseCost ] ;
} ,
2018-03-03 22:05:33 +01:00
purchaseAugmentation : function ( faction , name ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . purchaseAugmentation ) {
return 0 ;
} else {
workerScript . loadedFns . purchaseAugmentation = true ;
var ramCost = CONSTANTS . ScriptSingularityFn3RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 3 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run purchaseAugmentation(). It is a Singularity Function and requires SourceFile-4 (level 3) to run." ) ;
return false ;
}
}
var fac = Factions [ faction ] ;
2017-10-26 00:05:12 +02:00
if ( fac == null || ! ( fac instanceof Faction ) ) {
2017-08-30 19:44:29 +02:00
workerScript . scriptRef . log ( "ERROR: purchaseAugmentation() failed because of invalid faction name: " + faction ) ;
return false ;
}
if ( ! fac . augmentations . includes ( name ) ) {
workerScript . scriptRef . log ( "ERROR: purchaseAugmentation() failed because the faction " + faction + " does not contain the " + name + " augmentation" ) ;
return false ;
}
var aug = Augmentations [ name ] ;
2017-10-26 00:05:12 +02:00
if ( aug == null || ! ( aug instanceof Augmentation ) ) {
2017-08-30 19:44:29 +02:00
workerScript . scriptRef . log ( "ERROR: purchaseAugmentation() failed because of invalid augmentation name: " + name ) ;
return false ;
}
2017-09-08 21:16:48 +02:00
var isNeuroflux = false ;
if ( aug . name === AugmentationNames . NeuroFluxGovernor ) {
isNeuroflux = true ;
2017-08-30 19:44:29 +02:00
}
2017-09-08 21:16:48 +02:00
if ( ! isNeuroflux ) {
for ( var j = 0 ; j < Player . queuedAugmentations . length ; ++ j ) {
if ( Player . queuedAugmentations [ j ] . name === aug . name ) {
workerScript . scriptRef . log ( "ERROR: purchaseAugmentation() failed because you already have " + name ) ;
return false ;
}
}
for ( var j = 0 ; j < Player . augmentations . length ; ++ j ) {
if ( Player . augmentations [ j ] . name === aug . name ) {
workerScript . scriptRef . log ( "ERROR: purchaseAugmentation() failed because you already have " + name ) ;
return false ;
}
2017-08-30 19:44:29 +02:00
}
}
2017-08-30 20:36:59 +02:00
if ( fac . playerReputation < aug . baseRepRequirement ) {
workerScript . scriptRef . log ( "ERROR: purchaseAugmentation() failed because you do not have enough reputation with " + fac . name ) ;
return false ;
}
2017-08-30 19:44:29 +02:00
var res = purchaseAugmentation ( aug , fac , true ) ;
workerScript . scriptRef . log ( res ) ;
if ( isString ( res ) && res . startsWith ( "You purchased" ) ) {
2017-09-19 20:38:03 +02:00
Player . gainIntelligenceExp ( CONSTANTS . IntelligenceSingFnBaseExpGain ) ;
2017-08-30 19:44:29 +02:00
return true ;
} else {
return false ;
}
} ,
2018-03-03 22:05:33 +01:00
installAugmentations : function ( cbScript ) {
2018-01-27 07:52:39 +01:00
if ( workerScript . checkingRam ) {
if ( workerScript . loadedFns . installAugmentations ) {
return 0 ;
} else {
workerScript . loadedFns . installAugmentations = true ;
var ramCost = CONSTANTS . ScriptSingularityFn3RamCost ;
2018-03-03 22:05:33 +01:00
if ( Player . bitNodeN !== 4 ) { ramCost *= 8 ; }
2018-01-27 07:52:39 +01:00
return ramCost ;
}
}
2017-08-30 19:44:29 +02:00
if ( Player . bitNodeN != 4 ) {
if ( ! ( hasSingularitySF && singularitySFLvl >= 3 ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Cannot run installAugmentations(). It is a Singularity Function and requires SourceFile-4 (level 3) to run." ) ;
return false ;
}
}
if ( Player . queuedAugmentations . length === 0 ) {
workerScript . scriptRef . log ( "ERROR: installAugmentations() failed because you do not have any Augmentations to be installed" ) ;
return false ;
}
2017-09-19 20:38:03 +02:00
Player . gainIntelligenceExp ( CONSTANTS . IntelligenceSingFnBaseExpGain ) ;
2017-08-30 19:44:29 +02:00
workerScript . scriptRef . log ( "Installing Augmentations. This will cause this script to be killed" ) ;
2017-10-02 04:35:22 +02:00
installAugmentations ( cbScript ) ;
2017-08-30 19:44:29 +02:00
return true ;
2018-05-23 02:09:04 +02:00
} ,
//Bladeburner API
bladeburner : {
isContractName : function ( name ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
isOperationName : function ( name ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
isBlackOpName : function ( name ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
isGeneralActionName : function ( name ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
isSkillName : function ( name ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
startAction : function ( type , name ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
stopAction : function ( ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
getActionTime : function ( type = "" , name = "" ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
getActionEstimatedSuccessChance : function ( type = "" , name = "" ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
getActionCountRemaining : function ( type = "" , name = "" ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
getRank : function ( ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
getSkillPoints : function ( ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
getSkillLevel : function ( skillName = "" ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
upgradeSkill : function ( skillName ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
getTeamSize : function ( ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
setTeamSize : function ( type = "" , name = "" , size ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
getCityEstimatedPopulation : function ( cityName ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
getCityEstimatedCommunities : function ( cityName ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
getCityChaos : function ( cityName ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
switchCity : function ( cityName ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
getStamina : function ( ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
joinFaction : function ( ) {
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || hasBladeburner2079SF ) ) {
}
throw makeRuntimeRejectMsg ( workerScript , "isContractName() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7" ) ;
}
2017-08-30 19:44:29 +02:00
}
2018-05-23 02:09:04 +02:00
} //End return
} //End NetscriptFunction()
2017-08-30 19:44:29 +02:00
2018-05-02 19:38:11 +02:00
export { NetscriptFunctions , initSingularitySFFlags , hasSingularitySF , hasBn11SF ,
hasWallStreetSF , wallStreetSFLvl , hasCorporationSF , hasAISF , hasBladeburnerSF } ;