2019-04-11 10:37:40 +02:00
const sprintf = require ( "sprintf-js" ) . sprintf ;
const vsprintf = require ( "sprintf-js" ) . vsprintf ;
2017-10-12 22:10:34 +02:00
2019-05-05 06:03:40 +02:00
import { getRamCost } from "./Netscript/RamCostGenerator" ;
2019-06-22 10:12:17 +02:00
import { WorkerScriptStartStopEventEmitter } from "./Netscript/WorkerScriptStartStopEventEmitter" ;
2019-05-05 06:03:40 +02:00
2019-04-11 10:37:40 +02:00
import { Augmentation } from "./Augmentation/Augmentation" ;
import { Augmentations } from "./Augmentation/Augmentations" ;
import {
augmentationExists ,
installAugmentations
} from "./Augmentation/AugmentationHelpers" ;
import { AugmentationNames } from "./Augmentation/data/AugmentationNames" ;
import { BitNodeMultipliers } from "./BitNode/BitNodeMultipliers" ;
import { findCrime } from "./Crime/CrimeHelpers" ;
import { Bladeburner } from "./Bladeburner" ;
import { Company } from "./Company/Company" ;
import { Companies , companyExists } from "./Company/Companies" ;
import { CompanyPosition } from "./Company/CompanyPosition" ;
import { CompanyPositions } from "./Company/CompanyPositions" ;
import { CONSTANTS } from "./Constants" ;
import { DarkWebItems } from "./DarkWeb/DarkWebItems" ;
import {
calculateHackingChance ,
calculateHackingExpGain ,
calculatePercentMoneyHacked ,
calculateHackingTime ,
calculateGrowTime ,
calculateWeakenTime
} from "./Hacking" ;
import { AllGangs } from "./Gang" ;
import { Faction } from "./Faction/Faction" ;
import { Factions , factionExists } from "./Faction/Factions" ;
import { joinFaction , purchaseAugmentation } from "./Faction/FactionHelpers" ;
import { FactionWorkType } from "./Faction/FactionWorkTypeEnum" ;
import {
netscriptCanGrow ,
netscriptCanHack ,
netscriptCanWeaken
} from "./Hacking/netscriptCanHack" ;
2019-03-30 04:01:34 +01:00
2019-04-11 10:37:40 +02:00
import {
getCostOfNextHacknetNode ,
getCostOfNextHacknetServer ,
hasHacknetServers ,
2019-05-05 06:03:40 +02:00
purchaseHacknet ,
purchaseLevelUpgrade ,
purchaseRamUpgrade ,
purchaseCoreUpgrade ,
purchaseCacheUpgrade ,
purchaseHashUpgrade ,
updateHashManagerCapacity ,
2019-04-11 10:37:40 +02:00
} from "./Hacknet/HacknetHelpers" ;
2019-05-05 06:03:40 +02:00
import { HacknetServer } from "./Hacknet/HacknetServer" ;
2019-04-11 10:37:40 +02:00
import { CityName } from "./Locations/data/CityNames" ;
import { LocationName } from "./Locations/data/LocationNames" ;
2019-04-04 02:12:11 +02:00
2019-04-11 10:37:40 +02:00
import { Message } from "./Message/Message" ;
import { Messages } from "./Message/MessageHelpers" ;
import { inMission } from "./Missions" ;
import { Player } from "./Player" ;
import { Programs } from "./Programs/Programs" ;
import { Script } from "./Script/Script" ;
import { findRunningScript } from "./Script/ScriptHelpers" ;
import { isScriptFilename } from "./Script/ScriptHelpersTS" ;
2019-05-05 06:03:40 +02:00
import {
AllServers ,
AddToAllServers ,
createUniqueRandomIp ,
} from "./Server/AllServers" ;
2019-04-11 10:37:40 +02:00
import { Server } from "./Server/Server" ;
import {
GetServerByHostname ,
getServer ,
getServerOnNetwork ,
numCycleForGrowth ,
2019-05-05 06:03:40 +02:00
processSingleServerGrowth ,
safetlyCreateUniqueServer ,
2019-04-11 10:37:40 +02:00
} from "./Server/ServerHelpers" ;
import {
getPurchaseServerCost ,
getPurchaseServerLimit ,
getPurchaseServerMaxRam
} from "./Server/ServerPurchases" ;
import { Settings } from "./Settings/Settings" ;
import { SpecialServerIps } from "./Server/SpecialServerIps" ;
2019-05-05 06:03:40 +02:00
import { SourceFileFlags } from "./SourceFile/SourceFileFlags" ;
2019-04-11 10:37:40 +02:00
import {
buyStock ,
sellStock ,
shortStock ,
sellShort ,
2019-05-05 06:03:40 +02:00
} from "./StockMarket/BuyingAndSelling" ;
2019-06-04 07:21:36 +02:00
import {
influenceStockThroughServerHack ,
influenceStockThroughServerGrow ,
} from "./StockMarket/PlayerInfluencing" ;
2019-05-05 06:03:40 +02:00
import { Stock } from "./StockMarket/Stock" ;
import {
StockMarket ,
SymbolToStockMap ,
2019-04-11 10:37:40 +02:00
placeOrder ,
2019-05-05 06:03:40 +02:00
cancelOrder ,
displayStockMarketContent ,
2019-04-11 10:37:40 +02:00
} from "./StockMarket/StockMarket" ;
2019-06-03 05:28:02 +02:00
import {
getBuyTransactionCost ,
getSellTransactionGain ,
} from "./StockMarket/StockMarketHelpers" ;
2019-04-23 10:48:15 +02:00
import { OrderTypes } from "./StockMarket/data/OrderTypes" ;
import { PositionTypes } from "./StockMarket/data/PositionTypes" ;
import { StockSymbols } from "./StockMarket/data/StockSymbols" ;
2019-04-11 10:37:40 +02:00
import {
2019-05-10 04:03:13 +02:00
getStockMarket4SDataCost ,
2019-04-11 10:37:40 +02:00
getStockMarket4STixApiCost
} from "./StockMarket/StockMarketCosts" ;
2019-05-12 04:20:20 +02:00
import { isValidFilePath } from "./Terminal/DirectoryHelpers" ;
2019-04-11 10:37:40 +02:00
import { TextFile , getTextFile , createTextFile } from "./TextFile" ;
2017-08-30 19:44:29 +02:00
2019-04-11 10:37:40 +02:00
import {
unknownBladeburnerActionErrorMessage ,
unknownBladeburnerExceptionMessage ,
checkBladeburnerAccess
} from "./NetscriptBladeburner" ;
import * as nsGang from "./NetscriptGang" ;
import {
2019-05-05 06:03:40 +02:00
NetscriptPorts ,
runScriptFromScript ,
2019-04-11 10:37:40 +02:00
} from "./NetscriptWorker" ;
2019-05-16 08:05:36 +02:00
import { killWorkerScript } from "./Netscript/killWorkerScript" ;
import { workerScripts } from "./Netscript/WorkerScripts" ;
2019-04-11 10:37:40 +02:00
import {
makeRuntimeRejectMsg ,
netscriptDelay ,
2019-05-03 10:01:43 +02:00
resolveNetscriptRequestedThreads ,
2019-04-11 10:37:40 +02:00
} from "./NetscriptEvaluator" ;
import { NetscriptPort } from "./NetscriptPort" ;
import { SleeveTaskType } from "./PersonObjects/Sleeve/SleeveTaskTypesEnum" ;
2019-04-30 05:54:20 +02:00
import { findSleevePurchasableAugs } from "./PersonObjects/Sleeve/SleeveHelpers" ;
2017-08-30 19:44:29 +02:00
2019-04-11 10:37:40 +02:00
import { Page , routing } from "./ui/navigationTracking" ;
import { numeralWrapper } from "./ui/numeralFormat" ;
import { post } from "./ui/postToTerminal" ;
import { setTimeoutRef } from "./utils/SetTimeoutRef" ;
import { is2DArray } from "./utils/helpers/is2DArray" ;
2019-02-27 03:26:29 +01:00
2019-04-11 10:37:40 +02:00
import { dialogBoxCreate } from "../utils/DialogBox" ;
import { isPowerOfTwo } from "../utils/helpers/isPowerOfTwo" ;
import { arrayToString } from "../utils/helpers/arrayToString" ;
import { formatNumber , isHTML } from "../utils/StringHelperFunctions" ;
import { isString } from "../utils/helpers/isString" ;
2017-08-21 18:59:06 +02:00
2019-04-11 10:37:40 +02:00
import { createElement } from "../utils/uiHelpers/createElement" ;
import { createPopup } from "../utils/uiHelpers/createPopup" ;
import { removeElementById } from "../utils/uiHelpers/removeElementById" ;
2019-02-09 03:46:30 +01:00
2019-05-05 06:03:40 +02:00
const possibleLogs = {
2018-05-06 05:59:55 +02:00
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 ,
2018-06-14 21:51:06 +02:00
run : true ,
exec : true ,
2018-05-06 05:59:55 +02:00
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 ,
2018-11-01 19:18:32 +01:00
2018-10-29 17:08:41 +01:00
// TIX API
2018-05-06 05:59:55 +02:00
buyStock : true ,
sellStock : true ,
2018-10-29 17:08:41 +01:00
shortStock : true ,
sellShort : true ,
2018-11-01 19:18:32 +01:00
purchase4SMarketData : true ,
purchase4SMarketDataTixApi : true ,
2018-10-29 17:08:41 +01:00
// Singularity Functions
2018-05-06 05:59:55 +02:00
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 ,
2018-09-11 20:56:23 +02:00
donateToFaction : true ,
2018-05-06 05:59:55 +02:00
createProgram : true ,
commitCrime : true ,
2018-10-29 17:08:41 +01:00
// Bladeburner API
2018-06-08 17:51:48 +02:00
startAction : true ,
upgradeSkill : true ,
setTeamSize : true ,
joinBladeburnerFaction : true ,
2018-10-29 17:08:41 +01:00
// Gang API
recruitMember : true ,
setMemberTask : true ,
purchaseEquipment : true ,
setTerritoryWarfare : true ,
2018-05-06 05:59:55 +02:00
}
2018-01-20 05:47:57 +01:00
2017-08-30 19:44:29 +02:00
2017-06-28 11:47:42 +02:00
function NetscriptFunctions ( workerScript ) {
2019-03-30 00:14:32 +01:00
const updateDynamicRam = function ( fnName , ramCost ) {
2019-05-05 06:03:40 +02:00
if ( workerScript . dynamicLoadedFns [ fnName ] ) { return ; }
2018-06-06 18:02:21 +02:00
workerScript . dynamicLoadedFns [ fnName ] = true ;
2018-10-26 22:51:45 +02:00
2019-03-30 00:14:32 +01:00
let threads = workerScript . scriptRef . threads ;
2018-10-26 22:51:45 +02:00
if ( typeof threads !== 'number' ) {
console . warn ( ` WorkerScript detected NaN for threadcount for ${ workerScript . name } on ${ workerScript . serverIp } ` ) ;
threads = 1 ;
}
workerScript . dynamicRamUsage += ( ramCost * threads ) ;
2018-06-06 18:02:21 +02:00
if ( workerScript . dynamicRamUsage > 1.01 * workerScript . ramUsage ) {
throw makeRuntimeRejectMsg ( workerScript ,
2018-06-25 02:13:50 +02:00
"Dynamic RAM usage calculated to be greater than initial RAM usage on fn: " + fnName +
". This is probably because you somehow circumvented the static RAM " +
2018-07-10 07:11:18 +02:00
"calculation.<br><br>Please don't do that :(<br><br>" +
"Dynamic RAM Usage: " + workerScript . dynamicRamUsage + "<br>" +
"Static RAM Usage: " + workerScript . ramUsage ) ;
2018-06-06 18:02:21 +02:00
}
} ;
2018-09-23 02:25:48 +02:00
/ * *
* Gets the Server for a specific hostname / ip , throwing an error
* if the server doesn ' t exist .
* @ param { string } Hostname or IP of the server
2019-03-31 04:53:57 +02:00
* @ param { string } callingFnName - Name of calling function . For logging purposes
2018-09-23 02:25:48 +02:00
* @ returns { Server } The specified Server
* /
2019-03-30 00:14:32 +01:00
const safeGetServer = function ( ip , callingFnName = "" ) {
2018-09-23 02:25:48 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
2019-03-31 04:53:57 +02:00
workerScript . log ( ` ERROR: Invalid IP or hostname passed into ${ callingFnName } () ` ) ;
2018-09-23 02:25:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , ` Invalid IP or hostname passed into ${ callingFnName } () function ` ) ;
}
return server ;
}
2019-04-29 08:20:27 +02:00
/ * *
* Checks if the player has TIX API access . Throws an error if the player does not
* /
const checkTixApiAccess = function ( callingFn = "" ) {
2019-04-30 05:54:20 +02:00
if ( ! Player . hasWseAccount ) {
throw makeRuntimeRejectMsg ( workerScript , ` You don't have WSE Access! Cannot use ${ callingFn } () ` ) ;
}
2019-04-29 08:20:27 +02:00
if ( ! Player . hasTixApiAccess ) {
throw makeRuntimeRejectMsg ( workerScript , ` You don't have TIX API Access! Cannot use ${ callingFn } () ` ) ;
}
}
/ * *
* Gets a stock , given its symbol . Throws an error if the symbol is invalid
* @ param { string } symbol - Stock ' s symbol
* @ returns { Stock } stock object
* /
const getStockFromSymbol = function ( symbol , callingFn = "" ) {
const stock = SymbolToStockMap [ symbol ] ;
if ( stock == null ) {
throw makeRuntimeRejectMsg ( workerScript , ` Invalid stock symbol passed into ${ callingFn } () ` ) ;
}
return stock ;
}
2019-03-31 04:53:57 +02:00
/ * *
* Used to fail a function if the function ' s target is a Hacknet Server .
* This is used for functions that should run on normal Servers , but not Hacknet Servers
* @ param { Server } server - Target server
* @ param { string } callingFn - Name of calling function . For logging purposes
* @ returns { boolean } True if the server is a Hacknet Server , false otherwise
* /
const failOnHacknetServer = function ( server , callingFn = "" ) {
if ( server instanceof HacknetServer ) {
workerScript . log ( ` ERROR: ${ callingFn } () failed because it does not work on Hacknet Servers ` ) ;
return true ;
} else {
return false ;
}
}
2018-09-23 02:25:48 +02:00
// Utility function to get Hacknet Node object
2019-03-30 00:14:32 +01:00
const getHacknetNode = function ( i ) {
2018-07-15 02:25:50 +02:00
if ( isNaN ( i ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Invalid index specified for Hacknet Node: " + i ) ;
}
if ( i < 0 || i >= Player . hacknetNodes . length ) {
throw makeRuntimeRejectMsg ( workerScript , "Index specified for Hacknet Node is out-of-bounds: " + i ) ;
}
2019-03-30 00:14:32 +01:00
if ( hasHacknetServers ( ) ) {
const hserver = AllServers [ Player . hacknetNodes [ i ] ] ;
if ( hserver == null ) {
throw makeRuntimeRejectMsg ( workerScript , ` Could not get Hacknet Server for index ${ i } . This is probably a bug, please report to game dev ` ) ;
}
return hserver ;
} else {
return Player . hacknetNodes [ i ] ;
}
2018-06-20 18:43:05 +02:00
} ;
2019-03-30 00:14:32 +01:00
const getCodingContract = function ( fn , ip ) {
2018-09-23 02:25:48 +02:00
var server = safeGetServer ( ip , "getCodingContract" ) ;
return server . getContract ( fn ) ;
}
2017-06-28 11:47:42 +02:00
return {
2018-07-15 02:25:50 +02:00
hacknet : {
numNodes : function ( ) {
return Player . hacknetNodes . length ;
} ,
purchaseNode : function ( ) {
return purchaseHacknet ( ) ;
} ,
getPurchaseNodeCost : function ( ) {
2019-03-30 00:14:32 +01:00
if ( hasHacknetServers ( ) ) {
return getCostOfNextHacknetServer ( ) ;
} else {
return getCostOfNextHacknetNode ( ) ;
}
2018-07-15 02:25:50 +02:00
} ,
getNodeStats : function ( i ) {
2019-03-30 00:14:32 +01:00
const node = getHacknetNode ( i ) ;
const hasUpgraded = hasHacknetServers ( ) ;
const res = {
2018-07-15 02:25:50 +02:00
name : node . name ,
level : node . level ,
2019-03-30 00:14:32 +01:00
ram : hasUpgraded ? node . maxRam : node . ram ,
2018-07-15 02:25:50 +02:00
cores : node . cores ,
2019-03-30 00:14:32 +01:00
production : hasUpgraded ? node . hashRate : node . moneyGainRatePerSecond ,
2018-07-15 02:25:50 +02:00
timeOnline : node . onlineTimeSeconds ,
2019-03-30 00:14:32 +01:00
totalProduction : hasUpgraded ? node . totalHashesGenerated : node . totalMoneyGenerated ,
2018-07-15 02:25:50 +02:00
} ;
2019-03-30 00:14:32 +01:00
if ( hasUpgraded ) {
res . cache = node . cache ;
}
return res ;
2018-07-15 02:25:50 +02:00
} ,
upgradeLevel : function ( i , n ) {
2019-03-30 00:14:32 +01:00
const node = getHacknetNode ( i ) ;
2019-05-05 06:03:40 +02:00
return purchaseLevelUpgrade ( node , n ) ;
2018-07-15 02:25:50 +02:00
} ,
upgradeRam : function ( i , n ) {
2019-03-30 00:14:32 +01:00
const node = getHacknetNode ( i ) ;
2019-05-05 06:03:40 +02:00
return purchaseRamUpgrade ( node , n ) ;
2018-07-15 02:25:50 +02:00
} ,
upgradeCore : function ( i , n ) {
2019-03-30 00:14:32 +01:00
const node = getHacknetNode ( i ) ;
2019-05-05 06:03:40 +02:00
return purchaseCoreUpgrade ( node , n ) ;
2018-07-15 02:25:50 +02:00
} ,
2019-03-30 00:14:32 +01:00
upgradeCache : function ( i , n ) {
if ( ! hasHacknetServers ( ) ) { return false ; }
const node = getHacknetNode ( i ) ;
2019-05-05 06:03:40 +02:00
const res = purchaseCacheUpgrade ( node , n ) ;
2019-03-30 04:01:34 +01:00
if ( res ) {
2019-05-05 06:03:40 +02:00
updateHashManagerCapacity ( ) ;
2019-03-30 04:01:34 +01:00
}
return res ;
2019-03-30 00:14:32 +01:00
} ,
2018-07-15 02:25:50 +02:00
getLevelUpgradeCost : function ( i , n ) {
2019-03-30 00:14:32 +01:00
const node = getHacknetNode ( i ) ;
2019-05-05 06:03:40 +02:00
return node . calculateLevelUpgradeCost ( n , Player . hacknet _node _level _cost _mult ) ;
2018-07-15 02:25:50 +02:00
} ,
getRamUpgradeCost : function ( i , n ) {
2019-03-30 00:14:32 +01:00
const node = getHacknetNode ( i ) ;
2019-05-05 06:03:40 +02:00
return node . calculateRamUpgradeCost ( n , Player . hacknet _node _ram _cost _mult ) ;
2018-07-15 02:25:50 +02:00
} ,
getCoreUpgradeCost : function ( i , n ) {
2019-03-30 00:14:32 +01:00
const node = getHacknetNode ( i ) ;
2019-05-05 06:03:40 +02:00
return node . calculateCoreUpgradeCost ( n , Player . hacknet _node _core _cost _mult ) ;
2019-03-30 00:14:32 +01:00
} ,
getCacheUpgradeCost : function ( i , n ) {
if ( ! hasHacknetServers ( ) ) { return Infinity ; }
const node = getHacknetNode ( i ) ;
return node . calculateCacheUpgradeCost ( n ) ;
2019-04-05 11:08:41 +02:00
} ,
numHashes : function ( ) {
if ( ! hasHacknetServers ( ) ) { return 0 ; }
return Player . hashManager . hashes ;
} ,
hashCost : function ( upgName ) {
if ( ! hasHacknetServers ( ) ) { return Infinity ; }
return Player . hashManager . getUpgradeCost ( upgName ) ;
} ,
spendHashes : function ( upgName , upgTarget ) {
if ( ! hasHacknetServers ( ) ) { return false ; }
return purchaseHashUpgrade ( upgName , upgTarget ) ;
2018-07-15 02:25:50 +02:00
}
2018-07-09 01:53:24 +02:00
} ,
2017-10-12 22:10:34 +02:00
sprintf : sprintf ,
vsprintf : vsprintf ,
2019-05-05 06:03:40 +02:00
scan : function ( ip = workerScript . serverIp , hostnames = true ) {
updateDynamicRam ( "scan" , getRamCost ( "scan" ) ) ;
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 ) {
2019-03-05 02:40:28 +01:00
entry = getServerOnNetwork ( server , i ) . hostname ;
2017-09-19 20:38:03 +02:00
} else {
2019-03-05 02:40:28 +01:00
entry = getServerOnNetwork ( server , i ) . ip ;
2017-09-19 20:38:03 +02:00
}
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 ;
} ,
2019-06-04 07:21:36 +02:00
hack : function ( ip , { threads : requestedThreads , stock } = { } ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "hack" , getRamCost ( "hack" ) ) ;
2017-06-28 11:47:42 +02:00
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Hack() call has incorrect number of arguments. Takes 1 argument" ) ;
}
2019-05-11 11:20:09 +02:00
const threads = resolveNetscriptRequestedThreads ( workerScript , "hack" , requestedThreads ) ;
const server = getServer ( ip ) ;
2017-06-28 11:47:42 +02:00
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
2019-04-13 03:22:46 +02:00
// Calculate the hacking time
var hackingTime = calculateHackingTime ( server ) ; // This is in seconds
2017-07-25 03:06:40 +02:00
2019-04-13 03:22:46 +02:00
// No root access or skill level too low
2019-03-30 00:14:32 +01:00
const canHack = netscriptCanHack ( server , Player ) ;
if ( ! canHack . res ) {
workerScript . scriptRef . log ( ` ERROR: ${ canHack . msg } ` ) ;
throw makeRuntimeRejectMsg ( workerScript , canHack . msg ) ;
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 + ")" ) ;
}
2019-03-30 00:14:32 +01:00
2018-08-30 19:00:38 +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 ) ; }
2018-08-30 19:00:38 +02:00
var hackChance = calculateHackingChance ( server ) ;
2017-06-28 11:47:42 +02:00
var rand = Math . random ( ) ;
2018-08-30 19:00:38 +02:00
var expGainedOnSuccess = calculateHackingExpGain ( server ) * threads ;
2017-06-28 11:47:42 +02:00
var expGainedOnFailure = ( expGainedOnSuccess / 4 ) ;
2019-04-13 03:22:46 +02:00
if ( rand < hackChance ) { // Success!
2018-08-30 19:00:38 +02:00
const percentHacked = calculatePercentMoneyHacked ( server ) ;
2018-07-25 22:58:36 +02:00
let maxThreadNeeded = Math . ceil ( 1 / percentHacked * ( server . moneyAvailable / server . moneyMax ) ) ;
if ( isNaN ( maxThreadNeeded ) ) {
2019-04-13 03:22:46 +02:00
// Server has a 'max money' of 0 (probably). We'll set this to an arbitrarily large value
2018-07-28 02:00:57 +02:00
maxThreadNeeded = 1e6 ;
2018-07-25 22:58:36 +02:00
}
2018-07-13 03:16:24 +02:00
let moneyGained = Math . floor ( server . moneyAvailable * percentHacked ) * threads ;
2017-07-25 03:06:40 +02:00
2019-04-13 03:22:46 +02:00
// Over-the-top safety checks
2017-06-28 11:47:42 +02:00
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 ;
2019-02-22 03:26:28 +01:00
Player . recordMoneySource ( moneyGained , "hacking" ) ;
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 + ")" ) ;
}
2018-07-13 03:16:24 +02:00
server . fortify ( CONSTANTS . ServerFortifyAmount * Math . min ( threads , maxThreadNeeded ) ) ;
2019-06-04 07:21:36 +02:00
if ( stock ) {
influenceStockThroughServerHack ( server , moneyGained ) ;
}
2018-02-24 23:55:06 +01:00
return Promise . resolve ( moneyGained ) ;
2017-07-25 03:06:40 +02:00
} else {
2019-04-13 03:22:46 +02: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
} ) ;
} ,
2019-01-03 09:39:32 +01:00
hackAnalyzeThreads : function ( ip , hackAmount ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "hackAnalyzeThreads" , getRamCost ( "hackAnalyzeThreads" ) ) ;
2019-01-03 09:39:32 +01:00
// Check argument validity
const server = safeGetServer ( ip , 'hackAnalyzeThreads' ) ;
if ( isNaN ( hackAmount ) ) {
2019-01-18 18:57:21 +01:00
throw makeRuntimeRejectMsg ( workerScript , ` Invalid growth argument passed into hackAnalyzeThreads: ${ hackAmount } . Must be numeric ` ) ;
2019-01-03 09:39:32 +01:00
}
if ( hackAmount < 0 || hackAmount > server . moneyAvailable ) {
return - 1 ;
}
const percentHacked = calculatePercentMoneyHacked ( server ) ;
return hackAmount / Math . floor ( server . moneyAvailable * percentHacked ) ;
} ,
hackAnalyzePercent : function ( ip ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "hackAnalyzePercent" , getRamCost ( "hackAnalyzePercent" ) ) ;
2019-01-03 09:39:32 +01:00
const server = safeGetServer ( ip , 'hackAnalyzePercent' ) ;
return calculatePercentMoneyHacked ( server ) * 100 ;
} ,
hackChance : function ( ip ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "hackChance" , getRamCost ( "hackChance" ) ) ;
2019-01-03 09:39:32 +01:00
const server = safeGetServer ( ip , 'hackChance' ) ;
return calculateHackingChance ( server ) ;
} ,
2018-02-24 23:55:06 +01:00
sleep : function ( time ) {
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 ) ;
} ) ;
} ,
2019-06-04 07:21:36 +02:00
grow : function ( ip , { threads : requestedThreads , stock } = { } ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "grow" , getRamCost ( "grow" ) ) ;
2019-05-11 11:20:09 +02:00
const threads = resolveNetscriptRequestedThreads ( workerScript , "grow" , requestedThreads ) ;
2017-06-28 11:47:42 +02:00
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
2019-04-13 03:22:46 +02:00
// No root access or skill level too low
2019-03-30 00:14:32 +01:00
const canHack = netscriptCanGrow ( server ) ;
if ( ! canHack . res ) {
workerScript . scriptRef . log ( ` ERROR: ${ canHack . msg } ` ) ;
throw makeRuntimeRejectMsg ( workerScript , canHack . msg ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2018-08-30 19:00:38 +02:00
var growTime = calculateGrowTime ( server ) ;
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . grow == null ) {
2018-08-30 19:00:38 +02:00
workerScript . scriptRef . log ( "Executing grow() on server " + server . hostname + " in " + formatNumber ( growTime , 3 ) + " seconds (t=" + threads + ")" ) ;
2018-02-24 23:55:06 +01:00
}
2018-08-30 19:00:38 +02:00
return netscriptDelay ( growTime * 1000 , workerScript ) . then ( function ( ) {
2017-06-28 11:47:42 +02:00
if ( workerScript . env . stopFlag ) { return Promise . reject ( workerScript ) ; }
2018-09-28 04:09:02 +02:00
const moneyBefore = server . moneyAvailable <= 0 ? 1 : server . moneyAvailable ;
2019-04-13 03:22:46 +02:00
server . moneyAvailable += ( 1 * threads ) ; // It can be grown even if it has no money
2019-03-05 02:40:28 +01:00
var growthPercentage = processSingleServerGrowth ( server , 450 * threads , Player ) ;
2018-06-09 08:58:33 +02:00
const moneyAfter = server . moneyAvailable ;
2017-06-28 11:47:42 +02:00
workerScript . scriptRef . recordGrow ( server . ip , threads ) ;
2018-08-30 19:00:38 +02:00
var expGain = calculateHackingExpGain ( server ) * threads ;
2017-06-28 11:47:42 +02:00
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 " +
2018-06-09 08:58:33 +02:00
formatNumber ( ( moneyAfter / moneyBefore ) * 100 - 100 , 6 ) + "%. Gained " +
2018-02-24 23:55:06 +01:00
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 ) ;
2019-06-04 07:21:36 +02:00
if ( stock ) {
influenceStockThroughServerGrow ( server , moneyAfter - moneyBefore ) ;
}
2018-06-14 21:51:06 +02:00
return Promise . resolve ( moneyAfter / moneyBefore ) ;
2017-07-25 03:06:40 +02:00
} ) ;
2017-06-28 11:47:42 +02:00
} ,
2018-11-20 06:54:03 +01:00
growthAnalyze : function ( ip , growth ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "growthAnalyze" , getRamCost ( "growthAnalyze" ) ) ;
2018-11-20 06:54:03 +01:00
// Check argument validity
const server = safeGetServer ( ip , 'growthAnalyze' ) ;
if ( isNaN ( growth ) ) {
throw makeRuntimeRejectMsg ( workerScript , ` Invalid growth argument passed into growthAnalyze: ${ growth } . Must be numeric ` ) ;
}
2019-03-05 02:40:28 +01:00
return numCycleForGrowth ( server , Number ( growth ) , Player ) ;
2018-11-20 06:54:03 +01:00
} ,
2019-05-03 10:01:43 +02:00
weaken : function ( ip , { threads : requestedThreads } = { } ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "weaken" , getRamCost ( "weaken" ) ) ;
2019-05-03 10:01:43 +02:00
var threads = resolveNetscriptRequestedThreads ( workerScript , "weaken" , requestedThreads )
2017-06-28 11:47:42 +02:00
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
2019-04-13 03:22:46 +02:00
// No root access or skill level too low
2019-03-30 00:14:32 +01:00
const canHack = netscriptCanWeaken ( server ) ;
if ( ! canHack . res ) {
workerScript . scriptRef . log ( ` ERROR: ${ canHack . msg } ` ) ;
throw makeRuntimeRejectMsg ( workerScript , canHack . msg ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2018-08-30 19:00:38 +02:00
var weakenTime = calculateWeakenTime ( 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 " +
2018-08-30 19:00:38 +02:00
formatNumber ( weakenTime , 3 ) + " seconds (t=" + threads + ")" ) ;
2018-02-24 23:55:06 +01:00
}
2018-08-30 19:00:38 +02:00
return netscriptDelay ( weakenTime * 1000 , 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 ) ;
2018-08-30 19:00:38 +02:00
var expGain = calculateHackingExpGain ( 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
} ,
2019-05-05 06:03:40 +02:00
print : function ( args ) {
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 ( ) ) ;
} ,
2019-05-05 06:03:40 +02:00
tprint : function ( args ) {
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 ( ) ;
2017-09-01 16:12:40 +02:00
post ( workerScript . scriptRef . filename + ": " + args . toString ( ) ) ;
} ,
2019-05-05 06:03:40 +02:00
clearLog : function ( ) {
2017-07-22 00:54:55 +02:00
workerScript . scriptRef . clearLog ( ) ;
} ,
2019-05-05 06:03:40 +02:00
disableLog : function ( fn ) {
if ( possibleLogs [ fn ] === undefined ) {
2018-05-06 05:59:55 +02:00
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
} ,
2019-05-05 06:03:40 +02:00
enableLog : function ( fn ) {
if ( possibleLogs [ fn ] === undefined ) {
2018-05-06 05:59:55 +02:00
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
} ,
2018-09-11 20:56:23 +02:00
isLogEnabled : function ( fn ) {
if ( possibleLogs [ fn ] === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "Invalid argument to isLogEnabled: " + fn ) ;
}
return workerScript . disableLogs [ fn ] ? false : true ;
} ,
2019-05-05 06:03:40 +02:00
getScriptLogs : function ( fn , ip ) {
2018-11-01 19:18:32 +01:00
if ( fn != null && typeof fn === 'string' ) {
// Get Logs of another script
if ( ip == null ) { ip = workerScript . serverIp ; }
2018-11-05 00:57:31 +01:00
const server = getServer ( ip ) ;
if ( server == null ) {
workerScript . log ( ` getScriptLogs() failed. Invalid IP or hostname passed in: ${ ip } ` ) ;
throw makeRuntimeRejectMsg ( workerScript , ` getScriptLogs() failed. Invalid IP or hostname passed in: ${ ip } ` ) ;
}
let argsForTarget = [ ] ;
for ( let i = 2 ; i < arguments . length ; ++ i ) {
argsForTarget . push ( arguments [ i ] ) ;
}
const runningScriptObj = findRunningScript ( fn , argsForTarget , server ) ;
if ( runningScriptObj == null ) {
workerScript . scriptRef . log ( ` getScriptLogs() failed. No such script ${ fn } on ${ server . hostname } with args: ${ arrayToString ( argsForTarget ) } ` ) ;
return "" ;
}
return runningScriptObj . logs . slice ( ) ;
2018-11-01 19:18:32 +01:00
}
2018-09-11 20:56:23 +02:00
return workerScript . scriptRef . logs . slice ( ) ;
} ,
2019-05-05 06:03:40 +02:00
nuke : function ( ip ) {
updateDynamicRam ( "nuke" , getRamCost ( "nuke" ) ) ;
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
}
2018-06-02 01:31:34 +02:00
if ( ! Player . hasProgram ( Programs . NukeProgram . name ) ) {
2017-07-22 00:54:55 +02:00
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 ;
} ,
2019-05-05 06:03:40 +02:00
brutessh : function ( ip ) {
updateDynamicRam ( "brutessh" , getRamCost ( "brutessh" ) ) ;
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
}
2018-06-02 01:31:34 +02:00
if ( ! Player . hasProgram ( Programs . BruteSSHProgram . name ) ) {
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 ;
} ,
2019-05-05 06:03:40 +02:00
ftpcrack : function ( ip ) {
updateDynamicRam ( "ftpcrack" , getRamCost ( "ftpcrack" ) ) ;
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
}
2018-06-02 01:31:34 +02:00
if ( ! Player . hasProgram ( Programs . FTPCrackProgram . name ) ) {
2017-07-22 00:54:55 +02:00
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 ;
} ,
2019-05-05 06:03:40 +02:00
relaysmtp : function ( ip ) {
updateDynamicRam ( "relaysmtp" , getRamCost ( "relaysmtp" ) ) ;
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
}
2018-06-02 01:31:34 +02:00
if ( ! Player . hasProgram ( Programs . RelaySMTPProgram . name ) ) {
2017-07-22 00:54:55 +02:00
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 ;
} ,
2019-05-05 06:03:40 +02:00
httpworm : function ( ip ) {
updateDynamicRam ( "httpworm" , getRamCost ( "httpworm" ) ) ;
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
}
2018-06-02 01:31:34 +02:00
if ( ! Player . hasProgram ( Programs . HTTPWormProgram . name ) ) {
2017-07-22 00:54:55 +02:00
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 ;
} ,
2019-05-05 06:03:40 +02:00
sqlinject : function ( ip ) {
updateDynamicRam ( "sqlinject" , getRamCost ( "sqlinject" ) ) ;
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
}
2018-06-02 01:31:34 +02:00
if ( ! Player . hasProgram ( Programs . SQLInjectProgram . name ) ) {
2017-07-22 00:54:55 +02:00
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 ;
} ,
2019-05-05 06:03:40 +02:00
run : function ( scriptname , threads = 1 ) {
updateDynamicRam ( "run" , getRamCost ( "run" ) ) ;
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]...)" ) ;
}
2019-04-27 00:18:19 +02:00
if ( isNaN ( threads ) || threads <= 0 ) {
2017-06-28 11:47:42 +02:00
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 ) ;
} ,
2019-05-05 06:03:40 +02:00
exec : function ( scriptname , ip , threads = 1 ) {
updateDynamicRam ( "exec" , getRamCost ( "exec" ) ) ;
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]...)" ) ;
}
2019-04-30 05:54:20 +02:00
if ( isNaN ( threads ) || threads <= 0 ) {
2017-06-28 11:47:42 +02:00
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 ) ;
} ,
2019-05-05 06:03:40 +02:00
spawn : function ( scriptname , threads ) {
updateDynamicRam ( "spawn" , getRamCost ( "spawn" ) ) ;
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()" ) ;
}
2019-02-20 09:42:27 +01:00
setTimeoutRef ( ( ) => {
2018-06-17 21:19:43 +02:00
if ( scriptname === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "spawn() call has incorrect number of arguments. Usage: spawn(scriptname, numThreads, [arg1], [arg2]...)" ) ;
}
2019-04-30 05:54:20 +02:00
if ( isNaN ( threads ) || threads <= 0 ) {
2018-06-17 21:19:43 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Invalid argument for thread count passed into run(). Must be numeric and greater than 0" ) ;
}
var argsForNewScript = [ ] ;
for ( var i = 2 ; i < arguments . length ; ++ i ) {
argsForNewScript . push ( arguments [ i ] ) ;
}
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 runScriptFromScript ( scriptServer , scriptname , argsForNewScript , workerScript , threads ) ;
2019-02-20 09:42:27 +01:00
} , 20e3 ) ;
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 ( ) ;
} ,
2019-05-05 06:03:40 +02:00
kill : function ( filename , ip ) {
updateDynamicRam ( "kill" , getRamCost ( "kill" ) ) ;
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 ) {
2018-07-05 20:12:20 +02:00
workerScript . scriptRef . log ( "kill() failed. No such script " + filename + " on " + server . hostname + " with args: " + arrayToString ( argsForKillTarget ) ) ;
2017-06-28 11:47:42 +02:00
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 ) {
2018-07-05 20:12:20 +02:00
workerScript . scriptRef . log ( "Killing " + filename + " on " + server . hostname + " with args: " + arrayToString ( argsForKillTarget ) + ". May take up to a few minutes for the scripts to die..." ) ;
2018-02-24 23:55:06 +01:00
}
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 ) {
2018-07-05 20:12:20 +02:00
workerScript . scriptRef . log ( "kill() failed. No such script " + filename + " on " + server . hostname + " with args: " + arrayToString ( argsForKillTarget ) ) ;
2018-02-24 23:55:06 +01:00
}
2017-06-28 11:47:42 +02:00
return false ;
}
} ,
2019-05-05 06:03:40 +02:00
killall : function ( ip = workerScript . serverIp ) {
updateDynamicRam ( "killall" , getRamCost ( "killall" ) ) ;
2017-06-28 11:47:42 +02:00
if ( ip === undefined ) {
throw makeRuntimeRejectMsg ( workerScript , "killall() call has incorrect number of arguments. Takes 1 argument" ) ;
}
2019-06-22 10:12:17 +02:00
const server = getServer ( ip ) ;
2017-06-28 11:47:42 +02:00
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
}
2019-06-22 10:12:17 +02:00
const scriptsRunning = ( server . runningScripts . length > 0 ) ;
for ( let i = server . runningScripts . length - 1 ; i >= 0 ; -- i ) {
killWorkerScript ( server . runningScripts [ i ] , server . ip , false ) ;
2017-06-28 11:47:42 +02:00
}
2019-06-22 10:12:17 +02:00
WorkerScriptStartStopEventEmitter . emitEvent ( ) ;
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" ) ;
}
2019-06-22 10:12:17 +02:00
2018-02-24 23:55:06 +01:00
return scriptsRunning ;
2017-06-28 11:47:42 +02:00
} ,
2017-12-07 04:45:47 +01:00
exit : function ( ) {
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" ) ;
}
} ,
2019-05-05 06:03:40 +02:00
scp : function ( scriptname , ip1 , ip2 ) {
updateDynamicRam ( "scp" , getRamCost ( "scp" ) ) ;
2017-09-19 20:38:03 +02:00
if ( arguments . length !== 2 && arguments . length !== 3 ) {
2018-06-08 17:51:48 +02:00
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 ) {
2019-04-13 03:22:46 +02:00
// Recursively call scp on all elements of array
2017-09-27 17:13:42 +02:00
var res = false ;
scriptname . forEach ( function ( script ) {
if ( NetscriptFunctions ( workerScript ) . scp ( script , ip1 , ip2 ) ) {
res = true ;
} ;
} ) ;
return res ;
}
2019-05-12 04:20:20 +02:00
// Invalid file type
if ( ! isValidFilePath ( scriptname ) ) {
throw makeRuntimeRejectMsg ( workerScript , ` Error: scp() failed due to invalid filename: ${ scriptname } ` ) ;
}
// Invalid file name
if ( ! scriptname . endsWith ( ".lit" ) && ! isScriptFilename ( scriptname ) && ! scriptname . endsWith ( "txt" ) ) {
2018-06-08 17:51:48 +02:00
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 ;
2018-11-18 01:23:48 +01:00
if ( ip2 != null ) { // 3 Argument version: scriptname, source, destination
2017-09-19 20:38:03 +02:00
if ( scriptname === undefined || ip1 === undefined || ip2 === undefined ) {
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: scp() call has incorrect number of arguments. Takes 2 or 3 arguments" ) ;
2017-09-19 20:38:03 +02:00
}
destServer = getServer ( ip2 ) ;
if ( destServer == null ) {
2018-10-23 20:55:42 +02:00
throw makeRuntimeRejectMsg ( workerScript , ` ERROR: Invalid hostname/ip passed into scp() command: ${ ip2 } ` ) ;
2017-09-19 20:38:03 +02:00
}
currServ = getServer ( ip1 ) ;
if ( currServ == null ) {
2018-10-23 20:55:42 +02:00
throw makeRuntimeRejectMsg ( workerScript , ` ERROR: Invalid hostname/ip passed into scp() command: ${ ip1 } ` ) ;
2017-09-19 20:38:03 +02:00
}
2018-11-18 01:23:48 +01:00
} else if ( ip1 != null ) { // 2 Argument version: scriptname, destination
2017-09-19 20:38:03 +02:00
if ( scriptname === undefined || ip1 === undefined ) {
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: scp() call has incorrect number of arguments. Takes 2 or 3 arguments" ) ;
2017-09-19 20:38:03 +02:00
}
destServer = getServer ( ip1 ) ;
if ( destServer == null ) {
2018-10-23 20:55:42 +02:00
throw makeRuntimeRejectMsg ( workerScript , ` ERROR: Invalid hostname/ip passed into scp() command: ${ ip1 } ` ) ;
2017-09-19 20:38:03 +02:00
}
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" ) ;
}
2018-11-18 01:23:48 +01:00
} else {
throw makeRuntimeRejectMsg ( workerScript , "ERROR: scp() call has incorrect number of arguments. Takes 2 or 3 arguments" ) ;
2017-06-28 11:47:42 +02:00
}
2017-07-25 03:06:40 +02:00
2019-04-13 03:22:46 +02:00
// Scp for lit files
2017-09-07 07:45:14 +02:00
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 ) ;
}
2019-04-13 03:22:46 +02:00
return true ; // Already exists
2017-09-07 07:45:14 +02:00
}
}
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 ;
}
2019-04-13 03:22:46 +02:00
// Scp for text files
2018-02-24 23:55:06 +01:00
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 ) {
2019-04-13 03:22:46 +02:00
// Overwrite
2018-02-24 23:55:06 +01:00
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 ;
}
2019-04-13 03:22:46 +02:00
// 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
2019-04-13 03:22:46 +02:00
// Overwrite script if it already exists
2017-06-28 11:47:42 +02:00
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 ;
2019-06-02 21:40:13 +02:00
oldScript . markUpdated ( ) ;
2017-06-28 11:47:42 +02:00
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
2019-04-13 03:22:46 +02:00
// Create new script if it does not already exist
2019-05-07 03:01:06 +02:00
var newScript = new Script ( scriptname ) ;
2017-06-28 11:47:42 +02:00
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 ;
} ,
2019-05-05 06:03:40 +02:00
ls : function ( ip , grep ) {
updateDynamicRam ( "ls" , getRamCost ( "ls" ) ) ;
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 ) ;
}
2019-04-13 03:22:46 +02:00
// Get the grep filter, if one exists
2017-09-07 07:45:14 +02:00
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 ) ;
}
}
2018-09-23 02:25:48 +02:00
for ( var i = 0 ; i < server . contracts . length ; ++ i ) {
if ( filter ) {
if ( server . contracts [ i ] . fn . includes ( filter ) ) {
allFiles . push ( server . contracts [ i ] . fn ) ;
}
} else {
allFiles . push ( server . contracts [ i ] . fn ) ;
}
}
2019-04-13 03:22:46 +02:00
// Sort the files alphabetically then print each
2017-09-07 07:45:14 +02:00
allFiles . sort ( ) ;
return allFiles ;
} ,
2019-05-05 06:03:40 +02:00
ps : function ( ip = workerScript . serverIp ) {
updateDynamicRam ( "ps" , getRamCost ( "ps" ) ) ;
2018-06-13 06:03:02 +02:00
var server = getServer ( ip ) ;
if ( server == null ) {
workerScript . scriptRef . log ( "ps() failed. Invalid IP or hostname passed in: " + ip ) ;
throw makeRuntimeRejectMsg ( workerScript , "ps() failed. Invalid IP or hostname passed in: " + ip ) ;
}
const processes = [ ] ;
2018-10-23 20:55:42 +02:00
for ( const i in server . runningScripts ) {
2018-06-13 06:03:02 +02:00
const script = server . runningScripts [ i ] ;
processes . push ( { filename : script . filename , threads : script . threads , args : script . args . slice ( ) } )
}
return processes ;
} ,
2019-05-05 06:03:40 +02:00
hasRootAccess : function ( ip ) {
updateDynamicRam ( "hasRootAccess" , getRamCost ( "hasRootAccess" ) ) ;
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
} ,
2019-05-05 06:03:40 +02:00
getIp : function ( ) {
updateDynamicRam ( "getIp" , getRamCost ( "getIp" ) ) ;
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 ;
} ,
2019-05-05 06:03:40 +02:00
getHostname : function ( ) {
updateDynamicRam ( "getHostname" , getRamCost ( "getHostname" ) ) ;
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 ;
} ,
2019-05-05 06:03:40 +02:00
getHackingLevel : function ( ) {
updateDynamicRam ( "getHackingLevel" , getRamCost ( "getHackingLevel" ) ) ;
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 ;
} ,
2019-05-05 06:03:40 +02:00
getHackingMultipliers : function ( ) {
updateDynamicRam ( "getHackingMultipliers" , getRamCost ( "getHackingMultipliers" ) ) ;
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 ,
} ;
} ,
2019-05-05 06:03:40 +02:00
getHacknetMultipliers : function ( ) {
updateDynamicRam ( "getHacknetMultipliers" , getRamCost ( "getHacknetMultipliers" ) ) ;
2018-05-06 20:22:29 +02:00
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 ( ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "getBitNodeMultipliers" , getRamCost ( "getBitNodeMultipliers" ) ) ;
if ( SourceFileFlags [ 5 ] <= 0 ) {
2017-09-19 20:38:03 +02:00
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
} ,
2019-05-05 06:03:40 +02:00
getServerMoneyAvailable : function ( ip ) {
updateDynamicRam ( "getServerMoneyAvailable" , getRamCost ( "getServerMoneyAvailable" ) ) ;
2019-03-31 04:53:57 +02:00
const server = safeGetServer ( ip , "getServerMoneyAvailable" ) ;
if ( failOnHacknetServer ( server , "getServerMoneyAvailable" ) ) { return 0 ; }
2017-07-13 18:54:29 +02:00
if ( server . hostname == "home" ) {
2019-03-31 04:53:57 +02:00
// Return player's money
if ( workerScript . shouldLog ( "getServerMoneyAvailable" ) ) {
workerScript . log ( "getServerMoneyAvailable('home') returned player's money: $" + formatNumber ( Player . money . toNumber ( ) , 2 ) ) ;
2018-02-24 23:55:06 +01:00
}
2017-07-29 18:25:40 +02:00
return Player . money . toNumber ( ) ;
2017-06-28 11:47:42 +02:00
}
2019-03-31 04:53:57 +02:00
if ( workerScript . shouldLog ( "getServerMoneyAvailable" ) ) {
workerScript . log ( "getServerMoneyAvailable() returned " + formatNumber ( server . moneyAvailable , 2 ) + " for " + server . hostname ) ;
2018-02-24 23:55:06 +01:00
}
2017-06-28 11:47:42 +02:00
return server . moneyAvailable ;
} ,
2019-05-05 06:03:40 +02:00
getServerSecurityLevel : function ( ip ) {
updateDynamicRam ( "getServerSecurityLevel" , getRamCost ( "getServerSecurityLevel" ) ) ;
2019-03-31 04:53:57 +02:00
const server = safeGetServer ( ip , "getServerSecurityLevel" ) ;
if ( failOnHacknetServer ( server , "getServerSecurityLevel" ) ) { return 1 ; }
if ( workerScript . shouldLog ( "getServerSecurityLevel" ) ) {
workerScript . log ( "getServerSecurityLevel() returned " + formatNumber ( server . hackDifficulty , 3 ) + " for " + server . hostname ) ;
2018-02-24 23:55:06 +01:00
}
2017-06-28 11:47:42 +02:00
return server . hackDifficulty ;
} ,
2019-05-05 06:03:40 +02:00
getServerBaseSecurityLevel : function ( ip ) {
updateDynamicRam ( "getServerBaseSecurityLevel" , getRamCost ( "getServerBaseSecurityLevel" ) ) ;
2019-03-31 04:53:57 +02:00
const server = safeGetServer ( ip , "getServerBaseSecurityLevel" ) ;
if ( failOnHacknetServer ( server , "getServerBaseSecurityLevel" ) ) { return 1 ; }
if ( workerScript . shouldLog ( "getServerBaseSecurityLevel" ) ) {
workerScript . log ( "getServerBaseSecurityLevel() returned " + formatNumber ( server . baseDifficulty , 3 ) + " for " + server . hostname ) ;
2018-02-24 23:55:06 +01:00
}
2017-06-28 11:47:42 +02:00
return server . baseDifficulty ;
} ,
2019-05-05 06:03:40 +02:00
getServerMinSecurityLevel : function ( ip ) {
updateDynamicRam ( "getServerMinSecurityLevel" , getRamCost ( "getServerMinSecurityLevel" ) ) ;
2019-03-31 04:53:57 +02:00
const server = safeGetServer ( ip , "getServerMinSecurityLevel" ) ;
if ( failOnHacknetServer ( server , "getServerMinSecurityLevel" ) ) { return 1 ; }
if ( workerScript . shouldLog ( "getServerMinSecurityLevel" ) ) {
workerScript . log ( "getServerMinSecurityLevel() returned " + formatNumber ( server . minDifficulty , 3 ) + " for " + server . hostname ) ;
2018-02-24 23:55:06 +01:00
}
2017-09-26 04:44:33 +02:00
return server . minDifficulty ;
} ,
2019-05-05 06:03:40 +02:00
getServerRequiredHackingLevel : function ( ip ) {
updateDynamicRam ( "getServerRequiredHackingLevel" , getRamCost ( "getServerRequiredHackingLevel" ) ) ;
2019-03-31 04:53:57 +02:00
const server = safeGetServer ( ip , "getServerRequiredHackingLevel" ) ;
if ( failOnHacknetServer ( server , "getServerRequiredHackingLevel" ) ) { return 1 ; }
if ( workerScript . shouldLog ( "getServerRequiredHackingLevel" ) ) {
workerScript . log ( "getServerRequiredHackingLevel returned " + formatNumber ( server . requiredHackingSkill , 0 ) + " for " + server . hostname ) ;
2018-02-24 23:55:06 +01:00
}
2017-06-28 11:47:42 +02:00
return server . requiredHackingSkill ;
} ,
2019-05-05 06:03:40 +02:00
getServerMaxMoney : function ( ip ) {
updateDynamicRam ( "getServerMaxMoney" , getRamCost ( "getServerMaxMoney" ) ) ;
2019-03-31 04:53:57 +02:00
const server = safeGetServer ( ip , "getServerMaxMoney" ) ;
if ( failOnHacknetServer ( server , "getServerMaxMoney" ) ) { return 0 ; }
if ( workerScript . shouldLog ( "getServerMaxMoney" ) ) {
workerScript . log ( "getServerMaxMoney() returned " + formatNumber ( server . moneyMax , 0 ) + " for " + server . hostname ) ;
2018-02-24 23:55:06 +01:00
}
2017-06-28 11:47:42 +02:00
return server . moneyMax ;
} ,
2019-05-05 06:03:40 +02:00
getServerGrowth : function ( ip ) {
updateDynamicRam ( "getServerGrowth" , getRamCost ( "getServerGrowth" ) ) ;
2019-03-31 04:53:57 +02:00
const server = safeGetServer ( ip , "getServerGrowth" ) ;
if ( failOnHacknetServer ( server , "getServerGrowth" ) ) { return 1 ; }
if ( workerScript . shouldLog ( "getServerGrowth" ) ) {
workerScript . log ( "getServerGrowth() returned " + formatNumber ( server . serverGrowth , 0 ) + " for " + server . hostname ) ;
2018-02-24 23:55:06 +01:00
}
2017-08-18 19:20:51 +02:00
return server . serverGrowth ;
} ,
2019-05-05 06:03:40 +02:00
getServerNumPortsRequired : function ( ip ) {
updateDynamicRam ( "getServerNumPortsRequired" , getRamCost ( "getServerNumPortsRequired" ) ) ;
2019-03-31 04:53:57 +02:00
const server = safeGetServer ( ip , "getServerNumPortsRequired" ) ;
if ( failOnHacknetServer ( server , "getServerNumPortsRequired" ) ) { return 5 ; }
if ( workerScript . shouldLog ( "getServerNumPortsRequired" ) ) {
workerScript . log ( "getServerNumPortsRequired() returned " + formatNumber ( server . numOpenPortsRequired , 0 ) + " for " + server . hostname ) ;
2018-02-24 23:55:06 +01:00
}
2017-07-13 18:54:29 +02:00
return server . numOpenPortsRequired ;
} ,
2019-05-05 06:03:40 +02:00
getServerRam : function ( ip ) {
updateDynamicRam ( "getServerRam" , getRamCost ( "getServerRam" ) ) ;
2019-03-31 04:53:57 +02:00
const server = safeGetServer ( ip , "getServerRam" ) ;
if ( workerScript . shouldLog ( "getServerRam" ) ) {
workerScript . log ( "getServerRam() returned [" + formatNumber ( server . maxRam , 2 ) + "GB, " + formatNumber ( server . ramUsed , 2 ) + "GB]" ) ;
2018-02-24 23:55:06 +01:00
}
2017-07-25 03:06:40 +02:00
return [ server . maxRam , server . ramUsed ] ;
} ,
2019-05-05 06:03:40 +02:00
serverExists : function ( ip ) {
updateDynamicRam ( "serverExists" , getRamCost ( "serverExists" ) ) ;
2017-09-15 16:06:59 +02:00
return ( getServer ( ip ) !== null ) ;
} ,
2019-05-05 06:03:40 +02:00
fileExists : function ( filename , ip = workerScript . serverIp ) {
updateDynamicRam ( "fileExists" , getRamCost ( "fileExists" ) ) ;
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 ;
} ,
2019-05-05 06:03:40 +02:00
isRunning : function ( filename , ip ) {
updateDynamicRam ( "isRunning" , getRamCost ( "isRunning" ) ) ;
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 ) ;
} ,
2019-05-05 06:03:40 +02:00
getStockSymbols : function ( ) {
updateDynamicRam ( "getStockSymbols" , getRamCost ( "getStockSymbols" ) ) ;
2019-04-29 08:20:27 +02:00
checkTixApiAccess ( "getStockSymbols" ) ;
2018-09-30 03:52:38 +02:00
return Object . values ( StockSymbols ) ;
} ,
2019-05-05 06:03:40 +02:00
getStockPrice : function ( symbol ) {
updateDynamicRam ( "getStockPrice" , getRamCost ( "getStockPrice" ) ) ;
2019-04-29 08:20:27 +02:00
checkTixApiAccess ( "getStockPrice" ) ;
const stock = getStockFromSymbol ( symbol , "getStockPrice" ) ;
return stock . price ;
} ,
2019-05-05 06:03:40 +02:00
getStockAskPrice : function ( symbol ) {
updateDynamicRam ( "getStockAskPrice" , getRamCost ( "getStockAskPrice" ) ) ;
2019-04-29 08:20:27 +02:00
checkTixApiAccess ( "getStockAskPrice" ) ;
const stock = getStockFromSymbol ( symbol , "getStockAskPrice" ) ;
return stock . getAskPrice ( ) ;
} ,
2019-05-05 06:03:40 +02:00
getStockBidPrice : function ( symbol ) {
updateDynamicRam ( "getStockBidPrice" , getRamCost ( "getStockBidPrice" ) ) ;
2019-04-29 08:20:27 +02:00
checkTixApiAccess ( "getStockBidPrice" ) ;
const stock = getStockFromSymbol ( symbol , "getStockBidPrice" ) ;
return stock . getBidPrice ( ) ;
2017-07-13 18:54:29 +02:00
} ,
2019-05-05 06:03:40 +02:00
getStockPosition : function ( symbol ) {
updateDynamicRam ( "getStockPosition" , getRamCost ( "getStockPosition" ) ) ;
2019-04-29 08:20:27 +02:00
checkTixApiAccess ( "getStockPosition" ) ;
2017-07-13 18:54:29 +02:00
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
} ,
2019-05-05 06:03:40 +02:00
getStockMaxShares : function ( symbol ) {
updateDynamicRam ( "getStockMaxShares" , getRamCost ( "getStockMaxShares" ) ) ;
2019-04-29 08:20:27 +02:00
checkTixApiAccess ( "getStockMaxShares" ) ;
const stock = getStockFromSymbol ( symbol , "getStockMaxShares" ) ;
2019-01-09 11:06:49 +01:00
2019-04-29 08:20:27 +02:00
return stock . maxShares ;
} ,
2019-06-03 05:28:02 +02:00
getStockPurchaseCost : function ( symbol , shares , posType ) {
updateDynamicRam ( "getStockPurchaseCost" , getRamCost ( "getStockPurchaseCost" ) ) ;
checkTixApiAccess ( "getStockPurchaseCost" ) ;
const stock = getStockFromSymbol ( symbol , "getStockPurchaseCost" ) ;
shares = Math . round ( shares ) ;
let pos ;
const sanitizedPosType = posType . toLowerCase ( ) ;
if ( sanitizedPosType . includes ( "l" ) ) {
pos = PositionTypes . Long ;
} else if ( sanitizedPosType . includes ( "s" ) ) {
pos = PositionTypes . Short ;
} else {
return Infinity ;
}
const res = getBuyTransactionCost ( stock , shares , pos ) ;
if ( res == null ) { return Infinity ; }
return res ;
} ,
getStockSaleGain : function ( symbol , shares , posType ) {
updateDynamicRam ( "getStockSaleGain" , getRamCost ( "getStockSaleGain" ) ) ;
checkTixApiAccess ( "getStockSaleGain" ) ;
const stock = getStockFromSymbol ( symbol , "getStockSaleGain" ) ;
shares = Math . round ( shares ) ;
let pos ;
const sanitizedPosType = posType . toLowerCase ( ) ;
if ( sanitizedPosType . includes ( "l" ) ) {
pos = PositionTypes . Long ;
} else if ( sanitizedPosType . includes ( "s" ) ) {
pos = PositionTypes . Short ;
} else {
return 0 ;
}
const res = getSellTransactionGain ( stock , shares , pos ) ;
if ( res == null ) { return 0 ; }
return res ;
} ,
2019-05-05 06:03:40 +02:00
buyStock : function ( symbol , shares ) {
updateDynamicRam ( "buyStock" , getRamCost ( "buyStock" ) ) ;
2019-04-29 08:20:27 +02:00
checkTixApiAccess ( "buyStock" ) ;
const stock = getStockFromSymbol ( symbol , "buyStock" ) ;
2019-05-05 06:03:40 +02:00
const res = buyStock ( stock , shares , workerScript , { rerenderFn : displayStockMarketContent } ) ;
2019-04-21 07:31:19 +02:00
return res ? stock . price : 0 ;
2017-07-13 18:54:29 +02:00
} ,
2019-05-05 06:03:40 +02:00
sellStock : function ( symbol , shares ) {
updateDynamicRam ( "sellStock" , getRamCost ( "sellStock" ) ) ;
2019-04-29 08:20:27 +02:00
checkTixApiAccess ( "sellStock" ) ;
const stock = getStockFromSymbol ( symbol , "sellStock" ) ;
2019-05-05 06:03:40 +02:00
const res = sellStock ( stock , shares , workerScript , { rerenderFn : displayStockMarketContent } ) ;
2017-07-25 03:06:40 +02:00
2019-04-21 07:31:19 +02:00
return res ? stock . price : 0 ;
2017-07-13 18:54:29 +02:00
} ,
2019-05-05 06:03:40 +02:00
shortStock : function ( symbol , shares ) {
updateDynamicRam ( "shortStock" , getRamCost ( "shortStock" ) ) ;
2019-04-29 08:20:27 +02:00
checkTixApiAccess ( "shortStock" ) ;
2017-10-25 21:47:47 +02:00
if ( Player . bitNodeN !== 8 ) {
2019-05-05 06:03:40 +02:00
if ( SourceFileFlags [ 8 ] <= 1 ) {
2017-10-25 21:47:47 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Cannot use shortStock(). You must either be in BitNode-8 or you must have Level 2 of Source-File 8" ) ;
}
}
2019-04-29 08:20:27 +02:00
const stock = getStockFromSymbol ( symbol , "shortStock" ) ;
2019-05-05 06:03:40 +02:00
const res = shortStock ( stock , shares , workerScript , { rerenderFn : displayStockMarketContent } ) ;
2019-04-21 07:31:19 +02:00
2017-12-03 05:19:49 +01:00
return res ? stock . price : 0 ;
2017-10-25 21:47:47 +02:00
} ,
2019-05-05 06:03:40 +02:00
sellShort : function ( symbol , shares ) {
updateDynamicRam ( "sellShort" , getRamCost ( "sellShort" ) ) ;
2019-04-29 08:20:27 +02:00
checkTixApiAccess ( "sellShort" ) ;
2017-10-25 21:47:47 +02:00
if ( Player . bitNodeN !== 8 ) {
2019-05-05 06:03:40 +02:00
if ( SourceFileFlags [ 8 ] <= 1 ) {
2017-10-25 21:47:47 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Cannot use sellShort(). You must either be in BitNode-8 or you must have Level 2 of Source-File 8" ) ;
}
}
2019-04-29 08:20:27 +02:00
const stock = getStockFromSymbol ( symbol , "sellShort" ) ;
2019-05-05 06:03:40 +02:00
const res = sellShort ( stock , shares , workerScript , { rerenderFn : displayStockMarketContent } ) ;
2019-04-23 10:23:08 +02:00
2017-12-03 05:19:49 +01:00
return res ? stock . price : 0 ;
2017-10-25 21:47:47 +02:00
} ,
2019-05-05 06:03:40 +02:00
placeOrder : function ( symbol , shares , price , type , pos ) {
updateDynamicRam ( "placeOrder" , getRamCost ( "placeOrder" ) ) ;
2019-04-29 08:20:27 +02:00
checkTixApiAccess ( "placeOrder" ) ;
2017-10-25 21:47:47 +02:00
if ( Player . bitNodeN !== 8 ) {
2019-05-05 06:03:40 +02:00
if ( SourceFileFlags [ 8 ] <= 2 ) {
2017-10-25 21:47:47 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Cannot use placeOrder(). You must either be in BitNode-8 or have Level 3 of Source-File 8" ) ;
}
}
2019-04-29 08:20:27 +02:00
const stock = getStockFromSymbol ( symbol , "placeOrder" ) ;
2017-10-25 21:47:47 +02:00
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 ) ;
} ,
2019-05-05 06:03:40 +02:00
cancelOrder : function ( symbol , shares , price , type , pos ) {
updateDynamicRam ( "cancelOrder" , getRamCost ( "cancelOrder" ) ) ;
2019-04-29 08:20:27 +02:00
checkTixApiAccess ( "cancelOrder" ) ;
2017-10-25 21:47:47 +02:00
if ( Player . bitNodeN !== 8 ) {
2019-05-05 06:03:40 +02:00
if ( SourceFileFlags [ 8 ] <= 2 ) {
2017-10-25 21:47:47 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Cannot use cancelOrder(). You must either be in BitNode-8 or have Level 3 of Source-File 8" ) ;
}
}
2019-04-29 08:20:27 +02:00
const stock = getStockFrom ( symbol , "cancelOrder" ) ;
2017-10-25 21:47:47 +02:00
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 ) ;
} ,
2019-05-05 06:03:40 +02:00
getOrders : function ( ) {
updateDynamicRam ( "getOrders" , getRamCost ( "getOrders" ) ) ;
2019-04-30 05:54:20 +02:00
checkTixApiAccess ( "getOrders" ) ;
2018-12-31 01:11:48 +01:00
if ( Player . bitNodeN !== 8 ) {
2019-05-05 06:03:40 +02:00
if ( SourceFileFlags [ 8 ] <= 2 ) {
2018-12-31 01:11:48 +01:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Cannot use getOrders(). You must either be in BitNode-8 or have Level 3 of Source-File 8" ) ;
}
}
const orders = { } ;
const stockMarketOrders = StockMarket [ "Orders" ] ;
for ( let symbol in stockMarketOrders ) {
const orderBook = stockMarketOrders [ symbol ] ;
if ( orderBook . constructor === Array && orderBook . length > 0 ) {
orders [ symbol ] = [ ] ;
for ( let i = 0 ; i < orderBook . length ; ++ i ) {
orders [ symbol ] . push ( {
shares : orderBook [ i ] . shares ,
price : orderBook [ i ] . price ,
type : orderBook [ i ] . type ,
position : orderBook [ i ] . pos ,
} ) ;
}
}
}
return orders ;
} ,
2019-05-05 06:03:40 +02:00
getStockVolatility : function ( symbol ) {
updateDynamicRam ( "getStockVolatility" , getRamCost ( "getStockVolatility" ) ) ;
2018-08-24 22:44:48 +02:00
if ( ! Player . has4SDataTixApi ) {
throw makeRuntimeRejectMsg ( workerScript , "You don't have 4S Market Data TIX API Access! Cannot use getStockVolatility()" ) ;
}
2019-04-29 08:20:27 +02:00
const stock = getStockFromSymbol ( symbol , "getStockVolatility" ) ;
2019-04-13 03:22:46 +02:00
return stock . mv / 100 ; // Convert from percentage to decimal
2018-08-24 22:44:48 +02:00
} ,
2019-05-05 06:03:40 +02:00
getStockForecast : function ( symbol ) {
updateDynamicRam ( "getStockForecast" , getRamCost ( "getStockForecast" ) ) ;
2018-08-24 22:44:48 +02:00
if ( ! Player . has4SDataTixApi ) {
throw makeRuntimeRejectMsg ( workerScript , "You don't have 4S Market Data TIX API Access! Cannot use getStockForecast()" ) ;
}
2019-04-29 08:20:27 +02:00
const stock = getStockFromSymbol ( symbol , "getStockForecast" ) ;
2018-08-24 22:44:48 +02:00
var forecast = 50 ;
stock . b ? forecast += stock . otlkMag : forecast -= stock . otlkMag ;
2019-04-13 03:22:46 +02:00
return forecast / 100 ; // Convert from percentage to decimal
2018-08-24 22:44:48 +02:00
} ,
2019-05-05 06:03:40 +02:00
purchase4SMarketData : function ( ) {
updateDynamicRam ( "purchase4SMarketData" , getRamCost ( "purchase4SMarketData" ) ) ;
2019-04-29 08:20:27 +02:00
checkTixApiAccess ( "purchase4SMarketData" ) ;
2018-11-01 19:18:32 +01:00
2018-11-04 23:39:30 +01:00
if ( Player . has4SData ) {
2018-11-01 19:18:32 +01:00
if ( workerScript . shouldLog ( "purchase4SMarketData" ) ) {
workerScript . log ( "Already purchased 4S Market Data" ) ;
}
return true ;
}
2019-02-14 03:08:18 +01:00
if ( Player . money . lt ( getStockMarket4SDataCost ( ) ) ) {
2018-11-01 19:18:32 +01:00
if ( workerScript . shouldLog ( "purchase4SMarketData" ) ) {
workerScript . log ( "Failed to purchase 4S Market Data - Not enough money" ) ;
}
return false ;
}
Player . has4SData = true ;
2019-02-14 03:08:18 +01:00
Player . loseMoney ( getStockMarket4SDataCost ( ) ) ;
2018-11-01 19:18:32 +01:00
if ( workerScript . shouldLog ( "purchase4SMarketData" ) ) {
workerScript . log ( "Purchased 4S Market Data" ) ;
}
2019-05-12 04:20:20 +02:00
displayStockMarketContent ( ) ;
2018-11-01 19:18:32 +01:00
return true ;
} ,
purchase4SMarketDataTixApi : function ( ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "purchase4SMarketDataTixApi" , getRamCost ( "purchase4SMarketDataTixApi" ) ) ;
2019-04-29 08:20:27 +02:00
checkTixApiAccess ( "purchase4SMarketDataTixApi" ) ;
2018-11-01 19:18:32 +01:00
if ( Player . has4SDataTixApi ) {
if ( workerScript . shouldLog ( "purchase4SMarketDataTixApi" ) ) {
workerScript . log ( "Already purchased 4S Market Data TIX API" ) ;
}
return true ;
}
2019-02-14 03:08:18 +01:00
if ( Player . money . lt ( getStockMarket4STixApiCost ( ) ) ) {
2018-11-01 19:18:32 +01:00
if ( workerScript . shouldLog ( "purchase4SMarketDataTixApi" ) ) {
workerScript . log ( "Failed to purchase 4S Market Data TIX API - Not enough money" ) ;
}
return false ;
}
Player . has4SDataTixApi = true ;
2019-02-14 03:08:18 +01:00
Player . loseMoney ( getStockMarket4STixApiCost ( ) ) ;
2018-11-01 19:18:32 +01:00
if ( workerScript . shouldLog ( "purchase4SMarketDataTixApi" ) ) {
workerScript . log ( "Purchased 4S Market Data TIX API" ) ;
}
2019-05-12 04:20:20 +02:00
displayStockMarketContent ( ) ;
2018-11-01 19:18:32 +01:00
return true ;
} ,
2018-07-20 04:21:11 +02:00
getPurchasedServerLimit : function ( ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "getPurchasedServerLimit" , getRamCost ( "getPurchasedServerLimit" ) ) ;
2018-07-20 04:21:11 +02:00
2019-01-30 07:02:27 +01:00
return getPurchaseServerLimit ( ) ;
2018-07-20 04:21:11 +02:00
} ,
getPurchasedServerMaxRam : function ( ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "getPurchasedServerMaxRam" , getRamCost ( "getPurchasedServerMaxRam" ) ) ;
2018-07-20 04:21:11 +02:00
2019-01-30 07:02:27 +01:00
return getPurchaseServerMaxRam ( ) ;
2018-07-20 04:21:11 +02:00
} ,
2018-06-20 18:43:05 +02:00
getPurchasedServerCost : function ( ram ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "getPurchasedServerCost" , getRamCost ( "getPurchasedServerCost" ) ) ;
2018-06-20 18:43:05 +02:00
2019-01-30 07:02:27 +01:00
const cost = getPurchaseServerCost ( ram ) ;
if ( cost === Infinity ) {
workerScript . scriptRef . log ( "ERROR: 'getPurchasedServerCost()' failed due to an invalid 'ram' argument" ) ;
2018-11-04 23:39:30 +01:00
return Infinity ;
2018-06-20 18:43:05 +02:00
}
return cost ;
} ,
2019-05-05 06:03:40 +02:00
purchaseServer : function ( hostname , ram ) {
updateDynamicRam ( "purchaseServer" , getRamCost ( "purchaseServer" ) ) ;
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 == "" ) {
2019-01-30 07:02:27 +01:00
workerScript . log ( "ERROR: Passed empty string for hostname argument of purchaseServer()" ) ;
2017-07-13 18:54:29 +02:00
return "" ;
}
2017-07-25 03:06:40 +02:00
2019-01-30 07:02:27 +01:00
if ( Player . purchasedServers . length >= getPurchaseServerLimit ( ) ) {
workerScript . log ( ` ERROR: You have reached the maximum limit of ${ getPurchaseServerLimit ( ) } servers. You cannot purchase any more. ` ) ;
2017-07-27 04:56:14 +02:00
return "" ;
}
2019-01-30 07:02:27 +01:00
const cost = getPurchaseServerCost ( ram ) ;
if ( cost === Infinity ) {
workerScript . log ( "ERROR: 'purchaseServer()' failed due to an invalid 'ram' argument" ) ;
return Infinity ;
2017-07-13 18:54:29 +02:00
}
2017-07-25 03:06:40 +02:00
2017-07-29 18:25:40 +02:00
if ( Player . money . lt ( cost ) ) {
2019-01-30 07:02:27 +01:00
workerScript . log ( "ERROR: Not enough money to purchase server. Need $" + formatNumber ( cost , 2 ) ) ;
2017-07-13 18:54:29 +02:00
return "" ;
}
2019-05-05 06:03:40 +02:00
var newServ = safetlyCreateUniqueServer ( {
ip : createUniqueRandomIp ( ) ,
2018-05-06 15:23:07 +02:00
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
} ,
2019-05-05 06:03:40 +02:00
deleteServer : function ( hostname ) {
updateDynamicRam ( "deleteServer" , getRamCost ( "deleteServer" ) ) ;
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 ) {
2018-06-08 17:51:48 +02:00
workerScript . scriptRef . log ( "ERROR: Could not find server with hostname " + hostnameStr + ". deleteServer() failed" ) ;
2017-07-27 04:56:14 +02:00
return false ;
}
2018-05-23 02:09:04 +02:00
if ( ! server . purchasedByPlayer || server . hostname === "home" ) {
2018-06-08 17:51:48 +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 ;
2019-04-13 03:22:46 +02:00
// Can't delete server you're currently connected to
2018-05-23 02:09:04 +02:00
if ( server . isConnectedTo ) {
2018-06-08 17:51:48 +02:00
workerScript . scriptRef . log ( "ERROR: deleteServer() failed because you are currently connected to the server you are trying to delete" ) ;
2018-05-23 02:09:04 +02:00
return false ;
}
2019-04-13 03:22:46 +02:00
// A server cannot delete itself
2018-05-23 02:09:04 +02:00
if ( ip === workerScript . serverIp ) {
2018-06-08 17:51:48 +02:00
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
}
2019-04-13 03:22:46 +02:00
// Delete all scripts running on server
2017-08-13 07:01:33 +02:00
if ( server . runningScripts . length > 0 ) {
2018-06-08 17:51:48 +02:00
workerScript . scriptRef . log ( "ERROR: Cannot delete server " + server . hostname + " because it still has scripts running." ) ;
2017-08-13 07:01:33 +02:00
return false ;
}
2017-07-27 04:56:14 +02:00
2019-04-13 03:22:46 +02:00
// Delete from player's purchasedServers array
2017-07-27 04:56:14 +02:00
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 ) {
2018-06-08 17:51:48 +02:00
workerScript . scriptRef . log ( "ERROR: Could not identify server " + server . hostname +
2017-07-27 04:56:14 +02:00
"as a purchased server. This is likely a bug please contact game dev" ) ;
return false ;
}
2019-04-13 03:22:46 +02:00
// Delete from all servers
2017-08-13 07:01:33 +02:00
delete AllServers [ ip ] ;
2019-04-13 03:22:46 +02:00
// Delete from home computer
2017-07-27 04:56:14 +02:00
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 ;
}
}
2019-04-13 03:22:46 +02:00
// Wasn't found on home computer
2018-06-08 17:51:48 +02:00
workerScript . scriptRef . log ( "ERROR: Could not find server " + server . hostname +
2017-07-27 04:56:14 +02:00
"as a purchased server. This is likely a bug please contact game dev" ) ;
return false ;
} ,
2019-05-05 06:03:40 +02:00
getPurchasedServers : function ( hostname = true ) {
updateDynamicRam ( "getPurchasedServers" , getRamCost ( "getPurchasedServers" ) ) ;
2017-09-26 04:44:33 +02:00
var res = [ ] ;
Player . purchasedServers . forEach ( function ( ip ) {
if ( hostname ) {
var server = getServer ( ip ) ;
if ( server == null ) {
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Could not find server in getPurchasedServers(). This is a bug please report to game dev" ) ;
2017-09-26 04:44:33 +02:00
}
res . push ( server . hostname ) ;
} else {
res . push ( ip ) ;
}
} ) ;
return res ;
} ,
2019-05-05 06:03:40 +02:00
write : function ( port , data = "" , mode = "a" ) {
updateDynamicRam ( "write" , getRamCost ( "write" ) ) ;
2019-04-13 03:22:46 +02:00
if ( ! isNaN ( port ) ) { // Write to port
// Port 1-10
2018-03-03 22:05:33 +01:00
port = Math . round ( port ) ;
if ( port < 1 || port > CONSTANTS . NumNetscriptPorts ) {
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: 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 ) ;
2019-04-13 03:22:46 +02:00
} else if ( isString ( port ) ) { // Write to script or text file
2019-05-12 04:20:20 +02:00
const fn = port ;
if ( ! isValidFilePath ( fn ) ) {
throw makeRuntimeRejectMsg ( workerScript , ` write() failed due to invalid filepath: ${ fn } ` ) ;
}
const server = workerScript . getServer ( ) ;
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" ) ;
}
2018-09-14 23:03:31 +02:00
if ( isScriptFilename ( fn ) ) {
2019-04-13 03:22:46 +02:00
// Write to script
2018-09-14 23:03:31 +02:00
let script = workerScript . getScriptOnServer ( fn ) ;
if ( script == null ) {
2019-04-13 03:22:46 +02:00
// Create a new script
2019-05-07 03:01:06 +02:00
script = new Script ( fn , data , server . ip , server . scripts ) ;
2018-09-14 23:03:31 +02:00
server . scripts . push ( script ) ;
return true ;
}
mode === "w" ? script . code = data : script . code += data ;
2019-05-07 03:01:06 +02:00
script . updateRamUsage ( server . scripts ) ;
2019-06-02 21:32:35 +02:00
script . markUpdated ( ) ;
2017-10-12 04:00:22 +02:00
} else {
2019-04-13 03:22:46 +02:00
// Write to text file
2018-09-14 23:03:31 +02:00
let txtFile = getTextFile ( fn , server ) ;
if ( txtFile == null ) {
txtFile = createTextFile ( fn , data , server ) ;
return true ;
}
if ( mode === "w" ) {
txtFile . write ( data ) ;
} else {
txtFile . append ( data ) ;
}
2017-10-12 04:00:22 +02:00
}
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
}
} ,
2019-05-05 06:03:40 +02:00
tryWrite : function ( port , data = "" ) {
updateDynamicRam ( "tryWrite" , getRamCost ( "tryWrite" ) ) ;
2018-08-30 22:27:47 +02:00
if ( ! isNaN ( port ) ) {
port = Math . round ( port ) ;
if ( port < 1 || port > CONSTANTS . NumNetscriptPorts ) {
throw makeRuntimeRejectMsg ( workerScript , "ERROR: tryWrite() called on invalid port: " + port + ". Only ports 1-" + CONSTANTS . NumNetscriptPorts + " are valid." ) ;
}
var port = NetscriptPorts [ port - 1 ] ;
if ( port == null || ! ( port instanceof NetscriptPort ) ) {
throw makeRuntimeRejectMsg ( workerScript , "Could not find port: " + port + ". This is a bug contact the game developer" ) ;
}
return port . tryWrite ( data ) ;
} else {
throw makeRuntimeRejectMsg ( workerScript , "Invalid argument passed in for tryWrite: " + port ) ;
}
} ,
2019-05-05 06:03:40 +02:00
read : function ( port ) {
updateDynamicRam ( "read" , getRamCost ( "read" ) ) ;
2019-04-13 03:22:46 +02:00
if ( ! isNaN ( port ) ) { // Read from port
// Port 1-10
2018-03-03 22:05:33 +01:00
port = Math . round ( port ) ;
if ( port < 1 || port > CONSTANTS . NumNetscriptPorts ) {
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: 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 ) ) {
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: 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 ( ) ;
2019-04-13 03:22:46 +02:00
} else if ( isString ( port ) ) { // Read from script or text file
2018-09-14 23:03:31 +02:00
let fn = port ;
let 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" ) ;
}
2018-09-14 23:03:31 +02:00
if ( isScriptFilename ( fn ) ) {
2019-04-13 03:22:46 +02:00
// Read from script
2018-09-14 23:03:31 +02:00
let script = workerScript . getScriptOnServer ( fn ) ;
if ( script == null ) {
return "" ;
}
return script . code ;
2017-10-12 04:00:22 +02:00
} else {
2019-04-13 03:22:46 +02:00
// Read from text file
2018-09-14 23:03:31 +02:00
let txtFile = getTextFile ( fn , server ) ;
if ( txtFile !== null ) {
return txtFile . text ;
} else {
return "" ;
}
2017-10-12 04:00:22 +02:00
}
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 ) ;
}
} ,
2019-05-05 06:03:40 +02:00
peek : function ( port ) {
updateDynamicRam ( "peek" , getRamCost ( "peek" ) ) ;
2018-03-03 22:05:33 +01:00
if ( isNaN ( port ) ) {
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: 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 ) {
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: 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 ) ) {
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: 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
} ,
2019-05-05 06:03:40 +02:00
clear : function ( port ) {
updateDynamicRam ( "clear" , getRamCost ( "clear" ) ) ;
2019-04-13 03:22:46 +02:00
if ( ! isNaN ( port ) ) { // Clear port
2018-03-03 22:05:33 +01:00
port = Math . round ( port ) ;
if ( port < 1 || port > CONSTANTS . NumNetscriptPorts ) {
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: 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 ) ) {
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Could not find port: " + port + ". This is a bug contact the game developer" ) ;
2017-12-07 04:45:47 +01:00
}
2018-03-03 22:05:33 +01:00
return port . clear ( ) ;
2019-04-13 03:22:46 +02:00
} else if ( isString ( port ) ) { // Clear text file
2017-12-07 04:45:47 +01:00
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
} ,
2019-05-05 06:03:40 +02:00
getPortHandle : function ( port ) {
updateDynamicRam ( "getPortHandle" , getRamCost ( "getPortHandle" ) ) ;
2018-03-03 22:05:33 +01:00
if ( isNaN ( port ) ) {
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Invalid argument passed into getPortHandle(). Must be an integer between 1 and " + CONSTANTS . NumNetscriptPorts ) ;
2018-03-03 22:05:33 +01:00
}
port = Math . round ( port ) ;
if ( port < 1 || port > CONSTANTS . NumNetscriptPorts ) {
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: getPortHandle() called with invalid port number: " + port + ". Only ports 1-" + CONSTANTS . NumNetscriptPorts + " are valid" ) ;
2018-03-03 22:05:33 +01:00
}
var port = NetscriptPorts [ port - 1 ] ;
if ( port == null || ! ( port instanceof NetscriptPort ) ) {
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "ERROR: Could not find port: " + port + ". This is a bug contact the game developer" ) ;
2018-03-03 22:05:33 +01:00
}
return port ;
} ,
2019-05-05 06:03:40 +02:00
rm : function ( fn , ip ) {
updateDynamicRam ( "rm" , getRamCost ( "rm" ) ) ;
2018-11-14 07:05:51 +01:00
if ( ip == null || ip === "" ) {
ip = workerScript . serverIp ;
}
2019-04-10 08:07:12 +02:00
const s = safeGetServer ( ip , "rm" ) ;
2018-01-27 07:52:39 +01:00
2019-04-10 08:07:12 +02:00
const status = s . removeFile ( fn ) ;
if ( ! status . res ) {
workerScript . log ( status . msg ) ;
2018-01-27 07:52:39 +01:00
}
2019-04-10 08:07:12 +02:00
return status . res ;
2018-01-27 07:52:39 +01:00
} ,
2019-05-05 06:03:40 +02:00
scriptRunning : function ( scriptname , ip ) {
updateDynamicRam ( "scriptRunning" , getRamCost ( "scriptRunning" ) ) ;
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 ;
} ,
2019-05-05 06:03:40 +02:00
scriptKill : function ( scriptname , ip ) {
updateDynamicRam ( "scriptKill" , getRamCost ( "scriptKill" ) ) ;
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 ;
} ,
2019-05-05 06:03:40 +02:00
getScriptName : function ( ) {
2018-05-06 09:27:16 +02:00
return workerScript . name ;
} ,
2019-05-05 06:03:40 +02:00
getScriptRam : function ( scriptname , ip = workerScript . serverIp ) {
updateDynamicRam ( "getScriptRam" , getRamCost ( "getScriptRam" ) ) ;
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 ;
} ,
2019-05-05 06:03:40 +02:00
getHackTime : function ( ip , hack , int ) {
updateDynamicRam ( "getHackTime" , getRamCost ( "getHackTime" ) ) ;
2019-05-14 10:35:37 +02:00
const server = safeGetServer ( ip , "getHackTime" ) ;
if ( failOnHacknetServer ( server , "getHackTime" ) ) { return Infinity ; }
2019-04-13 03:22:46 +02:00
return calculateHackingTime ( server , hack , int ) ; // Returns seconds
2017-08-20 03:36:19 +02:00
} ,
2019-05-05 06:03:40 +02:00
getGrowTime : function ( ip , hack , int ) {
updateDynamicRam ( "getGrowTime" , getRamCost ( "getGrowTime" ) ) ;
2019-05-14 10:35:37 +02:00
const server = safeGetServer ( ip , "getGrowTime" ) ;
if ( failOnHacknetServer ( server , "getGrowTime" ) ) { return Infinity ; }
2019-04-13 03:22:46 +02:00
return calculateGrowTime ( server , hack , int ) ; // Returns seconds
2017-08-20 03:36:19 +02:00
} ,
2019-05-05 06:03:40 +02:00
getWeakenTime : function ( ip , hack , int ) {
updateDynamicRam ( "getWeakenTime" , getRamCost ( "getWeakenTime" ) ) ;
2019-05-14 10:35:37 +02:00
const server = safeGetServer ( ip , "getWeakenTime" ) ;
if ( failOnHacknetServer ( server , "getWeakenTime" ) ) { return Infinity ; }
2019-04-13 03:22:46 +02:00
return calculateWeakenTime ( server , hack , int ) ; // Returns seconds
2017-08-21 18:59:06 +02:00
} ,
2019-05-05 06:03:40 +02:00
getScriptIncome : function ( scriptname , ip ) {
updateDynamicRam ( "getScriptIncome" , getRamCost ( "getScriptIncome" ) ) ;
2017-09-12 01:14:51 +02:00
if ( arguments . length === 0 ) {
2017-09-27 17:13:42 +02:00
var res = [ ] ;
2019-05-14 13:23:55 +02:00
// First element is total income of all currently running scripts
let total = 0 ;
2019-06-19 10:51:25 +02:00
for ( const script of workerScripts . values ( ) ) {
2019-05-14 13:23:55 +02:00
total += ( script . scriptRef . onlineMoneyMade / script . scriptRef . onlineRunningTime ) ;
}
res . push ( total ) ;
// Second element is total income you've earned from scripts since you installed Augs
res . push ( Player . scriptProdSinceLastAug / ( Player . playtimeSinceLastAug / 1000 ) ) ;
2017-09-27 17:13:42 +02:00
return res ;
2017-09-12 01:14:51 +02:00
} else {
2019-04-13 03:22:46 +02:00
// Get income for a particular script
2017-09-12 01:14:51 +02:00
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 ) {
2018-07-05 20:12:20 +02:00
workerScript . scriptRef . log ( "getScriptIncome() failed. No such script " + scriptname + " on " + server . hostname + " with args: " + arrayToString ( argsForScript ) ) ;
2017-09-12 01:14:51 +02:00
return - 1 ;
}
return runningScriptObj . onlineMoneyMade / runningScriptObj . onlineRunningTime ;
}
} ,
2019-05-05 06:03:40 +02:00
getScriptExpGain : function ( scriptname , ip ) {
updateDynamicRam ( "getScriptExpGain" , getRamCost ( "getScriptExpGain" ) ) ;
2017-09-15 16:06:59 +02:00
if ( arguments . length === 0 ) {
var total = 0 ;
2019-06-19 10:51:25 +02:00
for ( const ws of workerScripts . values ( ) ) {
total += ( ws . scriptRef . onlineExpGained / ws . scriptRef . onlineRunningTime ) ;
2017-09-15 16:06:59 +02:00
}
return total ;
} else {
2019-04-13 03:22:46 +02:00
// Get income for a particular script
2017-09-15 16:06:59 +02:00
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 ) {
2018-07-05 20:12:20 +02:00
workerScript . scriptRef . log ( "getScriptExpGain() failed. No such script " + scriptname + " on " + server . hostname + " with args: " + arrayToString ( argsForScript ) ) ;
2017-09-15 16:06:59 +02:00
return - 1 ;
}
return runningScriptObj . onlineExpGained / runningScriptObj . onlineRunningTime ;
}
} ,
2019-05-05 06:03:40 +02:00
nFormat : function ( n , format ) {
2019-02-09 03:46:30 +01:00
if ( isNaN ( n ) || isNaN ( parseFloat ( n ) ) || typeof format !== "string" ) {
return "" ;
}
return numeralWrapper . format ( parseFloat ( n ) , format ) ;
} ,
2019-05-05 06:03:40 +02:00
getTimeSinceLastAug : function ( ) {
updateDynamicRam ( "getTimeSinceLastAug" , getRamCost ( "getTimeSinceLastAug" ) ) ;
2017-09-27 17:13:42 +02:00
return Player . playtimeSinceLastAug ;
} ,
2017-11-03 04:11:14 +01:00
prompt : function ( txt ) {
2017-11-02 22:47:09 +01:00
if ( ! isString ( txt ) ) { txt = String ( txt ) ; }
2019-02-09 03:46:30 +01:00
// The id for this popup will consist of the first 20 characters of the prompt string..
// Thats hopefully good enough to be unique
const popupId = ` prompt-popup- ${ txt . slice ( 0 , 20 ) } ` ;
const textElement = createElement ( "p" , { innerHTML : txt } ) ;
2017-11-02 22:47:09 +01:00
return new Promise ( function ( resolve , reject ) {
2019-02-09 03:46:30 +01:00
const yesBtn = createElement ( "button" , {
class : "popup-box-button" ,
innerText : "Yes" ,
clickListener : ( ) => {
removeElementById ( popupId ) ;
resolve ( true ) ;
} ,
2017-11-02 22:47:09 +01:00
} ) ;
2019-02-09 03:46:30 +01:00
const noBtn = createElement ( "button" , {
class : "popup-box-button" ,
innerText : "No" ,
clickListener : ( ) => {
removeElementById ( popupId ) ;
resolve ( false ) ;
} ,
2017-11-02 22:47:09 +01:00
} ) ;
2019-02-09 03:46:30 +01:00
createPopup ( popupId , [ textElement , yesBtn , noBtn ] ) ;
2017-11-02 22:47:09 +01:00
} ) ;
2017-11-01 23:56:30 +01:00
} ,
2019-05-05 06:03:40 +02:00
wget : async function ( url , target , ip = workerScript . serverIp ) {
2018-09-27 23:49:23 +02:00
if ( ! isScriptFilename ( target ) && ! target . endsWith ( ".txt" ) ) {
2019-05-12 04:20:20 +02:00
workerScript . log ( ` ERROR: wget() failed because of an invalid target file: ${ target } . Target file must be a script or text file ` ) ;
2018-09-28 06:45:13 +02:00
return Promise . resolve ( false ) ;
2018-09-27 23:49:23 +02:00
}
var s = safeGetServer ( ip , "wget" ) ;
2018-09-28 06:19:52 +02:00
return new Promise ( function ( resolve , reject ) {
$ . get ( url , function ( data ) {
let res ;
if ( isScriptFilename ( target ) ) {
res = s . writeToScriptFile ( target , data ) ;
} else {
res = s . writeToTextFile ( target , data ) ;
}
if ( ! res . success ) {
workerScript . log ( "ERROR: wget() failed" ) ;
return resolve ( false ) ;
}
if ( res . overwritten ) {
workerScript . log ( ` wget() successfully retrieved content and overwrote ${ target } on ${ ip } ` ) ;
return resolve ( true ) ;
}
workerScript . log ( ` wget successfully retrieved content to new file ${ target } on ${ ip } ` ) ;
return resolve ( true ) ;
} , 'text' ) . fail ( function ( e ) {
workerScript . log ( ` ERROR: wget() failed: ${ JSON . stringify ( e ) } ` ) ;
return resolve ( false )
} ) ;
2018-09-27 23:49:23 +02:00
} ) ;
} ,
2018-07-28 03:46:37 +02:00
getFavorToDonate : function ( ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "getFavorToDonate" , getRamCost ( "getFavorToDonate" ) ) ;
2018-07-28 03:46:37 +02:00
return Math . floor ( CONSTANTS . BaseFavorToDonate * BitNodeMultipliers . RepToDonateToFaction ) ;
} ,
2017-08-21 18:59:06 +02:00
/* Singularity Functions */
2019-05-05 06:03:40 +02:00
universityCourse : function ( universityName , className ) {
updateDynamicRam ( "universityCourse" , getRamCost ( "universityCourse" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 0 ) {
2017-08-30 19:44:29 +02:00
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 ( ) ) {
2019-04-01 11:23:25 +02:00
case LocationName . AevumSummitUniversity . toLowerCase ( ) :
if ( Player . city != CityName . Aevum ) {
2017-08-30 19:44:29 +02:00
workerScript . scriptRef . log ( "ERROR: You cannot study at Summit University because you are not in Aevum. universityCourse() failed" ) ;
return false ;
}
2019-04-01 11:23:25 +02:00
Player . gotoLocation ( LocationName . AevumSummitUniversity ) ;
2017-08-22 20:48:04 +02:00
costMult = 4 ;
expMult = 3 ;
break ;
2019-04-01 11:23:25 +02:00
case LocationName . Sector12RothmanUniversity . toLowerCase ( ) :
if ( Player . city != CityName . Sector12 ) {
2017-08-30 19:44:29 +02:00
workerScript . scriptRef . log ( "ERROR: You cannot study at Rothman University because you are not in Sector-12. universityCourse() failed" ) ;
return false ;
}
2019-04-01 11:23:25 +02:00
Player . location = LocationName . Sector12RothmanUniversity ;
2017-08-22 20:48:04 +02:00
costMult = 3 ;
expMult = 2 ;
break ;
2019-04-01 11:23:25 +02:00
case LocationName . VolhavenZBInstituteOfTechnology . toLowerCase ( ) :
if ( Player . city != CityName . 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 ;
}
2019-04-01 11:23:25 +02:00
Player . location = LocationName . 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 ;
} ,
2019-05-05 06:03:40 +02:00
gymWorkout : function ( gymName , stat ) {
updateDynamicRam ( "gymWorkout" , getRamCost ( "gymWorkout" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 0 ) {
2017-08-30 19:44:29 +02:00
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 ( ) ) {
2019-04-01 11:23:25 +02:00
case LocationName . AevumCrushFitnessGym . toLowerCase ( ) :
if ( Player . city != CityName . Aevum ) {
2017-08-30 19:44:29 +02:00
workerScript . scriptRef . log ( "ERROR: You cannot workout at Crush Fitness because you are not in Aevum. gymWorkout() failed" ) ;
return false ;
}
2019-04-01 11:23:25 +02:00
Player . location = LocationName . AevumCrushFitnessGym ;
2018-05-23 02:09:04 +02:00
costMult = 3 ;
expMult = 2 ;
2017-08-30 19:44:29 +02:00
break ;
2019-04-01 11:23:25 +02:00
case LocationName . AevumSnapFitnessGym . toLowerCase ( ) :
if ( Player . city != CityName . Aevum ) {
2017-08-30 19:44:29 +02:00
workerScript . scriptRef . log ( "ERROR: You cannot workout at Snap Fitness because you are not in Aevum. gymWorkout() failed" ) ;
return false ;
}
2019-04-01 11:23:25 +02:00
Player . location = LocationName . AevumSnapFitnessGym ;
2018-05-23 02:09:04 +02:00
costMult = 10 ;
expMult = 5 ;
2017-08-30 19:44:29 +02:00
break ;
2019-04-01 11:23:25 +02:00
case LocationName . Sector12IronGym . toLowerCase ( ) :
if ( Player . city != CityName . Sector12 ) {
2017-08-30 19:44:29 +02:00
workerScript . scriptRef . log ( "ERROR: You cannot workout at Iron Gym because you are not in Sector-12. gymWorkout() failed" ) ;
return false ;
}
2019-04-01 11:23:25 +02:00
Player . location = LocationName . Sector12IronGym ;
2017-08-30 19:44:29 +02:00
costMult = 1 ;
expMult = 1 ;
break ;
2019-04-01 11:23:25 +02:00
case LocationName . Sector12PowerhouseGym . toLowerCase ( ) :
if ( Player . city != CityName . Sector12 ) {
2017-08-30 19:44:29 +02:00
workerScript . scriptRef . log ( "ERROR: You cannot workout at Powerhouse Gym because you are not in Sector-12. gymWorkout() failed" ) ;
return false ;
}
2019-04-01 11:23:25 +02:00
Player . location = LocationName . Sector12PowerhouseGym ;
2018-05-23 02:09:04 +02:00
costMult = 20 ;
expMult = 10 ;
2017-08-30 19:44:29 +02:00
break ;
2019-04-01 11:23:25 +02:00
case LocationName . VolhavenMilleniumFitnessGym . toLowerCase ( ) :
if ( Player . city != CityName . Volhaven ) {
2017-08-30 20:36:59 +02:00
workerScript . scriptRef . log ( "ERROR: You cannot workout at Millenium Fitness Gym because you are not in Volhaven. gymWorkout() failed" ) ;
return false ;
}
2019-04-01 11:23:25 +02:00
Player . location = LocationName . 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 ;
} ,
2019-05-05 06:03:40 +02:00
travelToCity : function ( cityname ) {
updateDynamicRam ( "travelToCity" , getRamCost ( "travelToCity" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 0 ) {
2017-08-30 19:44:29 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Cannot run travelToCity(). It is a Singularity Function and requires SourceFile-4 (level 1) to run." ) ;
return false ;
}
}
switch ( cityname ) {
2019-04-01 11:23:25 +02:00
case CityName . Aevum :
case CityName . Chongqing :
case CityName . Sector12 :
case CityName . NewTokyo :
case CityName . Ishima :
case CityName . Volhaven :
2018-06-04 03:09:12 +02:00
if ( Player . money . lt ( CONSTANTS . TravelCost ) ) {
workerScript . scriptRef . log ( "ERROR: not enough money to travel with travelToCity()." ) ;
throw makeRuntimeRejectMsg ( workerScript , "ERROR: not enough money to travel with travelToCity()." ) ;
}
Player . loseMoney ( CONSTANTS . TravelCost ) ;
2017-08-30 19:44:29 +02:00
Player . city = cityname ;
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 ;
}
} ,
2019-05-05 06:03:40 +02:00
purchaseTor : function ( ) {
updateDynamicRam ( "purchaseTor" , getRamCost ( "purchaseTor" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 0 ) {
2017-08-30 19:44:29 +02:00
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 ) ;
2019-05-05 06:03:40 +02:00
var darkweb = safetlyCreateUniqueServer ( {
ip : createUniqueRandomIp ( ) , hostname : "darkweb" , organizationName : "" ,
2018-05-06 23:20:00 +02:00
isConnectedTo : false , adminRights : false , purchasedByPlayer : false , maxRam : 1
} ) ;
2017-08-30 19:44:29 +02:00
AddToAllServers ( darkweb ) ;
SpecialServerIps . addIp ( "Darkweb Server" , darkweb . ip ) ;
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 ;
} ,
2019-05-05 06:03:40 +02:00
purchaseProgram : function ( programName ) {
updateDynamicRam ( "purchaseProgram" , getRamCost ( "purchaseProgram" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 0 ) {
2017-08-30 19:44:29 +02:00
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 ) {
2018-06-01 23:05:05 +02:00
workerScript . scriptRef . log ( "ERROR: You do not have the TOR router. purchaseProgram() failed." ) ;
2017-08-30 19:44:29 +02:00
return false ;
}
2018-06-01 23:05:05 +02:00
programName = programName . toLowerCase ( ) ;
let item = null ;
for ( const key in DarkWebItems ) {
const i = DarkWebItems [ key ] ;
if ( i . program . toLowerCase ( ) == programName ) {
item = i ;
}
}
if ( item == null ) {
workerScript . scriptRef . log ( "ERROR: Invalid program name passed into purchaseProgram()." ) ;
return false ;
}
if ( Player . money . lt ( item . price ) ) {
workerScript . scriptRef . log ( "Not enough money to purchase " + item . program ) ;
return false ;
}
if ( Player . hasProgram ( item . program ) ) {
workerScript . scriptRef . log ( 'You already have the ' + item . program + ' program' ) ;
return true ;
}
Player . loseMoney ( item . price ) ;
Player . getHomeComputer ( ) . programs . push ( item . program ) ;
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . purchaseProgram == null ) {
workerScript . scriptRef . log ( "You have purchased the " + item . program + " program. The new program can be found on your home computer." ) ;
2017-08-30 19:44:29 +02:00
}
return true ;
} ,
2019-05-05 06:03:40 +02:00
getStats : function ( ) {
updateDynamicRam ( "getStats" , getRamCost ( "getStats" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 0 ) {
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
}
} ,
2019-05-05 06:03:40 +02:00
getCharacterInformation : function ( ) {
updateDynamicRam ( "getCharacterInformation" , getRamCost ( "getCharacterInformation" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 0 ) {
2018-03-03 22:05:33 +01:00
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getCharacterInformation(). It is a Singularity Function and requires SourceFile-4 (level 1) to run." ) ;
return { } ;
}
}
return {
bitnode : Player . bitNodeN ,
city : Player . city ,
factions : Player . factions . slice ( ) ,
2019-02-20 09:42:27 +01:00
hp : Player . hp ,
2019-01-15 04:34:04 +01:00
jobs : Object . keys ( Player . jobs ) ,
jobTitles : Object . values ( Player . jobs ) ,
2019-02-20 09:42:27 +01:00
maxHp : Player . max _hp ,
2018-10-26 22:51:45 +02:00
mult : {
2018-10-26 19:37:28 +02:00
agility : Player . agility _mult ,
agilityExp : Player . agility _exp _mult ,
companyRep : Player . company _rep _mult ,
crimeMoney : Player . crime _money _mult ,
crimeSuccess : Player . crime _success _mult ,
defense : Player . defense _mult ,
defenseExp : Player . defense _exp _mult ,
dexterity : Player . dexterity _mult ,
dexterityExp : Player . dexterity _exp _mult ,
factionRep : Player . faction _rep _mult ,
hacking : Player . hacking _mult ,
hackingExp : Player . hacking _exp _mult ,
strength : Player . strength _mult ,
strengthExp : Player . strength _exp _mult ,
workMoney : Player . work _money _mult ,
} ,
2018-03-03 22:05:33 +01:00
timeWorked : Player . timeWorked ,
2018-10-26 19:37:28 +02:00
tor : SpecialServerIps . hasOwnProperty ( "Darkweb Server" ) ,
2018-03-03 22:05:33 +01:00
workHackExpGain : Player . workHackExpGained ,
workStrExpGain : Player . workStrExpGained ,
workDefExpGain : Player . workDefExpGained ,
workDexExpGain : Player . workDexExpGained ,
workAgiExpGain : Player . workAgiExpGained ,
workChaExpGain : Player . workChaExpGained ,
workRepGain : Player . workRepGained ,
workMoneyGain : Player . workMoneyGained ,
} ;
} ,
2019-05-05 06:03:40 +02:00
isBusy : function ( ) {
updateDynamicRam ( "isBusy" , getRamCost ( "isBusy" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 0 ) {
2017-10-16 04:09:49 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Cannot run isBusy(). It is a Singularity Function and requires SourceFile-4 (level 1) to run." ) ;
return ;
}
}
return Player . isWorking ;
} ,
2019-05-05 06:03:40 +02:00
stopAction : function ( ) {
updateDynamicRam ( "stopAction" , getRamCost ( "stopAction" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 0 ) {
2018-03-03 22:05:33 +01:00
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 ;
} ,
2019-05-05 06:03:40 +02:00
upgradeHomeRam : function ( ) {
updateDynamicRam ( "upgradeHomeRam" , getRamCost ( "upgradeHomeRam" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 1 ) {
2017-08-30 19:44:29 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Cannot run upgradeHomeRam(). It is a Singularity Function and requires SourceFile-4 (level 2) to run." ) ;
return false ;
}
}
2019-01-09 11:43:59 +01:00
// Check if we're at max RAM
const homeComputer = Player . getHomeComputer ( ) ;
if ( homeComputer . maxRam >= CONSTANTS . HomeComputerMaxRam ) {
workerScript . log ( ` ERROR: upgradeHomeRam() failed because your home computer is at max RAM ` ) ;
return false ;
}
2017-08-30 19:44:29 +02:00
2019-01-09 11:43:59 +01:00
const cost = Player . getUpgradeHomeRamCost ( ) ;
2017-08-30 19:44:29 +02:00
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 ;
}
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 ;
} ,
2019-05-05 06:03:40 +02:00
getUpgradeHomeRamCost : function ( ) {
updateDynamicRam ( "getUpgradeHomeRamCost" , getRamCost ( "getUpgradeHomeRamCost" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 1 ) {
2017-08-30 19:44:29 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getUpgradeHomeRamCost(). It is a Singularity Function and requires SourceFile-4 (level 2) to run." ) ;
return false ;
}
}
2018-06-07 20:54:34 +02:00
return Player . getUpgradeHomeRamCost ( ) ;
2017-08-30 19:44:29 +02:00
} ,
2019-05-05 06:03:40 +02:00
workForCompany : function ( companyName ) {
updateDynamicRam ( "workForCompany" , getRamCost ( "workForCompany" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 1 ) {
2017-08-30 19:44:29 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Cannot run workForCompany(). It is a Singularity Function and requires SourceFile-4 (level 2) to run." ) ;
return false ;
}
}
2019-01-15 04:34:04 +01:00
// Sanitize input
if ( companyName == null ) {
companyName = Player . companyName ;
}
// Make sure its a valid company
if ( companyName == null || companyName === "" || ! ( Companies [ companyName ] instanceof Company ) ) {
workerScript . scriptRef . log ( ` ERROR: workForCompany() failed because of an invalid company specified: ${ companyName } ` ) ;
return false ;
}
// Make sure player is actually employed at the comapny
if ( ! Object . keys ( Player . jobs ) . includes ( companyName ) ) {
workerScript . scriptRef . log ( ` ERROR: workForCompany() failed because you do not have a job at ${ companyName } ` ) ;
return false ;
}
// Cant work while in a mission
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." ) ;
2019-01-15 04:34:04 +01:00
return false ;
2017-11-01 23:56:30 +01:00
}
2019-01-15 04:34:04 +01:00
// Check to make sure company position data is valid
const companyPositionName = Player . jobs [ companyName ] ;
const companyPosition = CompanyPositions [ companyPositionName ] ;
if ( companyPositionName === "" || ! ( companyPosition instanceof CompanyPosition ) ) {
2017-08-30 19:44:29 +02:00
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
}
2018-11-16 02:28:23 +01:00
if ( companyPosition . isPartTimeJob ( ) ) {
2019-01-18 18:57:21 +01:00
Player . startWorkPartTime ( companyName ) ;
2017-08-30 19:44:29 +02:00
} else {
2019-01-18 18:57:21 +01:00
Player . startWork ( companyName ) ;
2017-08-30 19:44:29 +02:00
}
2018-02-24 23:55:06 +01:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . workForCompany == null ) {
2019-01-15 04:34:04 +01:00
workerScript . log ( ` Began working at ${ Player . companyName } as a ${ companyPositionName } ` ) ;
2018-02-24 23:55:06 +01:00
}
2017-08-30 19:44:29 +02:00
return true ;
} ,
2019-05-05 06:03:40 +02:00
applyToCompany : function ( companyName , field ) {
updateDynamicRam ( "applyToCompany" , getRamCost ( "applyToCompany" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 1 ) {
2017-08-30 19:44:29 +02:00
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
}
2019-04-13 03:22:46 +02:00
// The Player object's applyForJob function can return string with special error messages
2017-08-30 19:44:29 +02:00
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 ) {
2019-01-15 04:34:04 +01:00
workerScript . log ( ` You were offered a new job at ${ companyName } as a ${ Player . jobs [ companyName ] } ` ) ;
2018-02-24 23:55:06 +01:00
}
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 ) {
2018-11-16 02:28:23 +01:00
workerScript . log ( ` You failed to get a new job/promotion at ${ companyName } in the ${ field } field. ` ) ;
2018-02-24 23:55:06 +01:00
}
2017-08-30 19:44:29 +02:00
}
return res ;
2017-08-21 18:59:06 +02:00
} ,
2019-05-05 06:03:40 +02:00
getCompanyRep : function ( companyName ) {
updateDynamicRam ( "getCompanyRep" , getRamCost ( "getCompanyRep" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 1 ) {
2017-08-30 19:44:29 +02:00
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 ;
} ,
2019-05-05 06:03:40 +02:00
getCompanyFavor : function ( companyName ) {
updateDynamicRam ( "getCompanyFavor" , getRamCost ( "getCompanyFavor" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 1 ) {
2018-03-03 22:05:33 +01:00
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 ;
} ,
2019-05-05 06:03:40 +02:00
getCompanyFavorGain : function ( companyName ) {
updateDynamicRam ( "getCompanyFavorGain" , getRamCost ( "getCompanyFavorGain" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 1 ) {
2018-07-28 03:46:37 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getCompanyFavorGain(). It is a Singularity Function and requires SourceFile-4 (level 2) to run." ) ;
return - 1 ;
}
}
var company = Companies [ companyName ] ;
if ( company == null || ! ( company instanceof Company ) ) {
workerScript . scriptRef . log ( "ERROR: Invalid companyName passed into getCompanyFavorGain(): " + companyName ) ;
return - 1 ;
}
return company . getFavorGain ( ) [ 0 ] ;
} ,
2019-05-05 06:03:40 +02:00
checkFactionInvitations : function ( ) {
updateDynamicRam ( "checkFactionInvitations" , getRamCost ( "checkFactionInvitations" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 1 ) {
2017-08-30 19:44:29 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Cannot run checkFactionInvitations(). It is a Singularity Function and requires SourceFile-4 (level 2) to run." ) ;
return false ;
}
}
2019-04-13 03:22:46 +02:00
// Make a copy of Player.factionInvitations
2017-08-30 19:44:29 +02:00
return Player . factionInvitations . slice ( ) ;
} ,
2019-05-05 06:03:40 +02:00
joinFaction : function ( name ) {
updateDynamicRam ( "joinFaction" , getRamCost ( "joinFaction" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 1 ) {
2017-08-30 19:44:29 +02:00
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 ;
}
var fac = Factions [ name ] ;
joinFaction ( fac ) ;
2018-08-26 06:26:42 +02:00
2019-04-13 03:22:46 +02:00
// Update Faction Invitation list to account for joined + banned factions
2018-08-26 06:26:42 +02:00
for ( var i = 0 ; i < Player . factionInvitations . length ; ++ i ) {
if ( Player . factionInvitations [ i ] == name || Factions [ Player . factionInvitations [ i ] ] . isBanned ) {
Player . factionInvitations . splice ( i , 1 ) ;
i -- ;
}
}
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 ;
} ,
2019-05-05 06:03:40 +02:00
workForFaction : function ( name , type ) {
updateDynamicRam ( "workForFaction" , getRamCost ( "workForFaction" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 1 ) {
2017-08-30 19:44:29 +02:00
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
2018-06-10 06:55:25 +02:00
// if the player is in a gang and the target faction is any of the gang faction, fail
2018-06-14 21:51:06 +02:00
if ( Player . inGang ( ) && AllGangs [ name ] !== undefined ) {
2018-06-10 06:55:25 +02:00
workerScript . scriptRef . log ( "ERROR: Faction specified in workForFaction() does not offer work at the moment." ) ;
return ;
}
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 ] ;
2019-04-13 03:22:46 +02:00
// Arrays listing factions that allow each time of work
2017-08-30 19:44:29 +02:00
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
} ,
2019-05-05 06:03:40 +02:00
getFactionRep : function ( name ) {
updateDynamicRam ( "getFactionRep" , getRamCost ( "getFactionRep" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 1 ) {
2017-08-30 19:44:29 +02:00
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 ;
} ,
2019-05-05 06:03:40 +02:00
getFactionFavor : function ( name ) {
updateDynamicRam ( "getFactionFavor" , getRamCost ( "getFactionFavor" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 1 ) {
2018-03-03 22:05:33 +01:00
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 ;
} ,
2018-09-11 20:56:23 +02:00
getFactionFavorGain : function ( name ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "getFactionFavorGain" , getRamCost ( "getFactionFavorGain" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 1 ) {
2018-07-28 03:46:37 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getFactionFavorGain(). 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 getFactionFavorGain() does not exist." ) ;
return - 1 ;
}
return Factions [ name ] . getFavorGain ( ) [ 0 ] ;
} ,
2019-05-05 06:03:40 +02:00
donateToFaction : function ( name , amt ) {
updateDynamicRam ( "donateToFaction" , getRamCost ( "donateToFaction" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 2 ) {
2018-09-11 20:56:23 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Cannot run donateToFaction(). It is a Singularity Function and requires SourceFile-4 (level 3) to run." ) ;
return ;
}
}
if ( ! factionExists ( name ) ) {
workerScript . log ( ` ERROR: Faction specified in donateToFaction() does not exist: ${ name } ` ) ;
return false ;
}
if ( typeof amt !== 'number' || amt <= 0 ) {
workerScript . log ( ` ERROR: Invalid donation amount specified in donateToFaction(): ${ amt } . Must be numeric and positive ` ) ;
return false ;
}
if ( Player . money . lt ( amt ) ) {
workerScript . log ( ` ERROR: You do not have enough money to donate $ ${ amt } to ${ name } ` ) ;
return false ;
}
var repNeededToDonate = Math . round ( CONSTANTS . BaseFavorToDonate * BitNodeMultipliers . RepToDonateToFaction ) ;
if ( Factions [ name ] . favor < repNeededToDonate ) {
workerScript . log ( ` ERROR: You do not have enough favor to donate to this faction. Have ${ Factions [ name ] . favor } , need ${ repNeededToDonate } ` ) ;
return false ;
}
var repGain = amt / CONSTANTS . DonateMoneyToRepDivisor * Player . faction _rep _mult ;
Factions [ name ] . playerReputation += repGain ;
Player . loseMoney ( amt ) ;
if ( workerScript . shouldLog ( "donateToFaction" ) ) {
workerScript . log ( ` $ ${ amt } donated to ${ name } for ${ repGain } reputation ` ) ;
}
return true ;
} ,
2019-05-05 06:03:40 +02:00
createProgram : function ( name ) {
updateDynamicRam ( "createProgram" , getRamCost ( "createProgram" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 2 ) {
2017-08-30 19:44:29 +02:00
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
}
2018-06-02 01:31:34 +02:00
name = name . toLowerCase ( ) ;
let p = null ;
for ( const key in Programs ) {
if ( Programs [ key ] . name . toLowerCase ( ) == name ) {
p = Programs [ key ] ;
}
}
2018-06-26 16:49:28 +02:00
if ( p == null ) {
2018-06-02 01:31:34 +02:00
workerScript . scriptRef . log ( "ERROR: createProgram() failed because the specified program does not exist: " + name ) ;
return false ;
}
2018-06-26 16:49:28 +02:00
if ( Player . hasProgram ( p . name ) ) {
2018-06-02 01:31:34 +02:00
workerScript . scriptRef . log ( 'ERROR: createProgram() failed because you already have the ' + p . name + ' program' ) ;
return false ;
}
2019-01-17 06:27:24 +01:00
if ( ! p . create . req ( Player ) ) {
2018-06-02 01:31:34 +02:00
workerScript . scriptRef . log ( "ERROR: createProgram() failed because hacking level is too low to create " + p . name + " (level " + p . create . level + " req)" ) ;
return false
}
Player . startCreateProgramWork ( p . name , p . create . time , p . create . level ) ;
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . createProgram == null ) {
workerScript . scriptRef . log ( "Began creating program: " + name ) ;
2017-08-30 19:44:29 +02:00
}
return true ;
} ,
2019-05-05 06:03:40 +02:00
commitCrime : function ( crimeRoughName ) {
updateDynamicRam ( "commitCrime" , getRamCost ( "commitCrime" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 2 ) {
2017-10-12 04:00:22 +02:00
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
}
2019-04-01 11:23:25 +02:00
// Set Location to slums
Player . gotoLocation ( LocationName . Slums ) ;
2017-10-20 23:59:54 +02:00
2018-05-29 22:36:52 +02:00
const crime = findCrime ( crimeRoughName . toLowerCase ( ) ) ;
if ( crime == null ) { // couldn't find crime
2018-07-28 02:00:57 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Invalid crime passed into commitCrime(): " + crimeRoughName ) ;
2017-10-12 04:00:22 +02:00
}
2018-05-29 22:36:52 +02:00
if ( workerScript . disableLogs . ALL == null && workerScript . disableLogs . commitCrime == null ) {
workerScript . scriptRef . log ( "Attempting to commit crime: " + crime . name + "..." ) ;
}
2019-01-15 04:34:04 +01:00
return crime . commit ( Player , 1 , { workerscript : workerScript } ) ;
2017-10-12 04:00:22 +02:00
} ,
2019-05-05 06:03:40 +02:00
getCrimeChance : function ( crimeRoughName ) {
updateDynamicRam ( "getCrimeChance" , getRamCost ( "getCrimeChance" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 2 ) {
2017-10-15 03:55:41 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getCrimeChance(). It is a Singularity Function and requires SourceFile-4 (level 3) to run." ) ;
return ;
}
}
2018-05-29 22:36:52 +02:00
const crime = findCrime ( crimeRoughName . toLowerCase ( ) ) ;
if ( crime == null ) {
2017-10-15 03:55:41 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Invalid crime passed into getCrimeChance(): " + crime ) ;
}
2018-05-29 22:36:52 +02:00
2019-02-09 03:02:00 +01:00
return crime . successRate ( Player ) ;
2017-10-15 03:55:41 +02:00
} ,
2019-05-05 06:03:40 +02:00
getOwnedAugmentations : function ( purchased = false ) {
updateDynamicRam ( "getOwnedAugmentations" , getRamCost ( "getOwnedAugmentations" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 2 ) {
2017-10-10 06:56:48 +02:00
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 ;
} ,
2019-05-05 06:03:40 +02:00
getOwnedSourceFiles : function ( ) {
updateDynamicRam ( "getOwnedSourceFiles" , getRamCost ( "getOwnedSourceFiles" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 2 ) {
2018-07-25 06:31:17 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getOwnedSourceFiles(). It is a Singularity Function and requires SourceFile-4 (level 3) to run." ) ;
return [ ] ;
}
}
let res = [ ] ;
for ( let i = 0 ; i < Player . sourceFiles . length ; ++ i ) {
res . push ( { n : Player . sourceFiles [ i ] . n , lvl : Player . sourceFiles [ i ] . lvl } ) ;
}
return res ;
} ,
2019-05-05 06:03:40 +02:00
getAugmentationsFromFaction : function ( facname ) {
updateDynamicRam ( "getAugmentationsFromFaction" , getRamCost ( "getAugmentationsFromFaction" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 2 ) {
2017-10-10 06:56:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getAugmentationsFromFaction(). It is a Singularity Function and requires SourceFile-4 (level 3) to run." ) ;
return [ ] ;
}
}
2019-05-02 00:20:14 +02:00
const fac = Factions [ facname ] ;
if ( ! ( fac instanceof Faction ) ) {
2017-10-10 06:56:48 +02:00
workerScript . scriptRef . log ( "ERROR: getAugmentationsFromFaction() failed. Invalid faction name passed in (this is case-sensitive): " + facname ) ;
return [ ] ;
}
2019-05-02 00:20:14 +02:00
// If player has a gang with this faction, return all factions
if ( Player . hasGangWith ( facname ) ) {
const res = [ ] ;
for ( const augName in Augmentations ) {
const aug = Augmentations [ augName ] ;
if ( ! aug . isSpecial ) {
res . push ( augName ) ;
}
}
return res ;
2017-10-10 06:56:48 +02:00
}
2019-05-02 00:20:14 +02:00
return fac . augmentations . slice ( ) ;
2017-10-10 06:56:48 +02:00
} ,
2019-05-05 06:03:40 +02:00
getAugmentationPrereq : function ( name ) {
updateDynamicRam ( "getAugmentationPrereq" , getRamCost ( "getAugmentationPrereq" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 2 ) {
2018-12-30 16:28:42 +01:00
throw makeRuntimeRejectMsg ( workerScript , "Cannot run getAugmentationPrereq(). It is a Singularity Function and requires SourceFile-4 (level 3) to run." ) ;
return false ;
}
}
if ( ! augmentationExists ( name ) ) {
workerScript . scriptRef . log ( "ERROR: getAugmentationPrereq() failed. Invalid Augmentation name passed in (note: this is case-sensitive): " + name ) ;
2018-12-30 16:37:24 +01:00
return [ ] ;
2018-12-30 16:28:42 +01:00
}
var aug = Augmentations [ name ] ;
2018-12-31 01:36:44 +01:00
return aug . prereqs . slice ( ) ;
2018-12-30 16:28:42 +01:00
} ,
2019-05-05 06:03:40 +02:00
getAugmentationCost : function ( name ) {
updateDynamicRam ( "getAugmentationCost" , getRamCost ( "getAugmentationCost" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 2 ) {
2017-08-30 19:44:29 +02:00
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 ] ;
} ,
2019-05-05 06:03:40 +02:00
purchaseAugmentation : function ( faction , name ) {
updateDynamicRam ( "purchaseAugmentation" , getRamCost ( "purchaseAugmentation" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 2 ) {
2017-08-30 19:44:29 +02:00
throw makeRuntimeRejectMsg ( workerScript , "Cannot run purchaseAugmentation(). It is a Singularity Function and requires SourceFile-4 (level 3) to run." ) ;
return false ;
}
}
2019-05-02 00:20:14 +02:00
const fac = Factions [ faction ] ;
if ( ! ( fac instanceof Faction ) ) {
workerScript . log ( "ERROR: purchaseAugmentation() failed because of invalid faction name: " + faction ) ;
2017-08-30 19:44:29 +02:00
return false ;
}
2019-05-02 00:20:14 +02:00
let augs = [ ] ;
if ( Player . hasGangWith ( faction ) ) {
for ( const augName in Augmentations ) {
const tempAug = Augmentations [ augName ] ;
if ( ! tempAug . isSpecial ) {
augs . push ( augName ) ;
}
}
} else {
augs = fac . augmentations ;
2017-08-30 19:44:29 +02:00
}
2019-05-02 00:20:14 +02:00
if ( ! augs . includes ( name ) ) {
workerScript . log ( "ERROR: purchaseAugmentation() failed because the faction " + faction + " does not contain the " + name + " augmentation" ) ;
2017-08-30 19:44:29 +02:00
return false ;
}
2019-05-02 00:20:14 +02:00
const aug = Augmentations [ name ] ;
if ( ! ( aug instanceof Augmentation ) ) {
workerScript . log ( "ERROR: purchaseAugmentation() failed because of invalid augmentation name: " + name ) ;
return false ;
2017-08-30 19:44:29 +02:00
}
2017-09-08 21:16:48 +02:00
2019-05-02 00:20:14 +02:00
let isNeuroflux = ( aug . name === AugmentationNames . NeuroFluxGovernor ) ;
2017-09-08 21:16:48 +02:00
if ( ! isNeuroflux ) {
2019-05-02 00:20:14 +02:00
for ( let j = 0 ; j < Player . queuedAugmentations . length ; ++ j ) {
2017-09-08 21:16:48 +02:00
if ( Player . queuedAugmentations [ j ] . name === aug . name ) {
2019-05-02 00:20:14 +02:00
workerScript . log ( "ERROR: purchaseAugmentation() failed because you already have " + name ) ;
2017-09-08 21:16:48 +02:00
return false ;
}
}
2019-05-02 00:20:14 +02:00
for ( let j = 0 ; j < Player . augmentations . length ; ++ j ) {
2017-09-08 21:16:48 +02:00
if ( Player . augmentations [ j ] . name === aug . name ) {
2019-05-02 00:20:14 +02:00
workerScript . log ( "ERROR: purchaseAugmentation() failed because you already have " + name ) ;
2017-09-08 21:16:48 +02:00
return false ;
}
2017-08-30 19:44:29 +02:00
}
}
2017-08-30 20:36:59 +02:00
if ( fac . playerReputation < aug . baseRepRequirement ) {
2019-05-02 00:20:14 +02:00
workerScript . log ( "ERROR: purchaseAugmentation() failed because you do not have enough reputation with " + fac . name ) ;
2017-08-30 20:36:59 +02:00
return false ;
}
2017-08-30 19:44:29 +02:00
var res = purchaseAugmentation ( aug , fac , true ) ;
2019-05-02 00:20:14 +02:00
workerScript . log ( res ) ;
2017-08-30 19:44:29 +02:00
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 ;
}
} ,
2019-05-05 06:03:40 +02:00
installAugmentations : function ( cbScript ) {
updateDynamicRam ( "installAugmentations" , getRamCost ( "installAugmentations" ) ) ;
if ( Player . bitNodeN !== 4 ) {
if ( SourceFileFlags [ 4 ] <= 2 ) {
2017-08-30 19:44:29 +02:00
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
} ,
2018-10-23 20:55:42 +02:00
// Gang API
2019-05-05 06:03:40 +02:00
gang : {
getMemberNames : function ( ) {
updateDynamicRam ( "getMemberNames" , getRamCost ( "gang" , "getMemberNames" ) ) ;
2018-10-23 20:55:42 +02:00
nsGang . checkGangApiAccess ( workerScript , "getMemberNames" ) ;
try {
const names = [ ] ;
for ( const member of Player . gang . members ) {
names . push ( member . name ) ;
}
return names ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , nsGang . unknownGangApiExceptionMessage ( "getMemberNames" , e ) ) ;
}
} ,
2019-05-05 06:03:40 +02:00
getGangInformation : function ( ) {
updateDynamicRam ( "getGangInformation" , getRamCost ( "gang" , "getGangInformation" ) ) ;
2018-10-23 20:55:42 +02:00
nsGang . checkGangApiAccess ( workerScript , "getGangInformation" ) ;
try {
return {
faction : Player . gang . facName ,
isHacking : Player . gang . isHackingGang ,
moneyGainRate : Player . gang . moneyGainRate ,
power : Player . gang . getPower ( ) ,
respect : Player . gang . respect ,
respectGainRate : Player . gang . respectGainRate ,
territory : Player . gang . getTerritory ( ) ,
territoryClashChance : Player . gang . territoryClashChance ,
territoryWarfareEngaged : Player . gang . territoryWarfareEngaged ,
wantedLevel : Player . gang . wanted ,
wantedLevelGainRate : Player . gang . wantedGainRate ,
}
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , nsGang . unknownGangApiExceptionMessage ( "getGangInformation" , e ) ) ;
}
} ,
2019-05-05 06:03:40 +02:00
getOtherGangInformation : function ( ) {
updateDynamicRam ( "getOtherGangInformation" , getRamCost ( "gang" , "getOtherGangInformation" ) ) ;
2018-10-25 03:26:53 +02:00
nsGang . checkGangApiAccess ( workerScript , "getOtherGangInformation" ) ;
try {
2019-05-14 10:35:37 +02:00
// We have to make a deep copy
const cpy = { } ;
for ( const gang in AllGangs ) {
cpy [ gang ] = Object . assign ( { } , AllGangs [ gang ] ) ;
}
return cpy ;
2018-10-25 03:26:53 +02:00
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , nsGang . unknownGangApiExceptionMessage ( "getOtherGangInformation" , e ) ) ;
}
} ,
2019-05-05 06:03:40 +02:00
getMemberInformation : function ( name ) {
updateDynamicRam ( "getMemberInformation" , getRamCost ( "gang" , "getMemberInformation" ) ) ;
2018-10-23 20:55:42 +02:00
nsGang . checkGangApiAccess ( workerScript , "getMemberInformation" ) ;
try {
for ( const member of Player . gang . members ) {
if ( member . name === name ) {
return {
agility : member . agi ,
agilityEquipMult : member . agi _mult ,
agilityAscensionMult : member . agi _asc _mult ,
augmentations : member . augmentations . slice ( ) ,
charisma : member . cha ,
charismaEquipMult : member . cha _mult ,
charismaAscensionMult : member . cha _asc _mult ,
defense : member . def ,
defenseEquipMult : member . def _mult ,
defenseAscensionMult : member . def _asc _mult ,
dexterity : member . dex ,
dexterityEquipMult : member . dex _mult ,
dexterityAscensionMult : member . dex _asc _mult ,
equipment : member . upgrades . slice ( ) ,
hacking : member . hack ,
hackingEquipMult : member . hack _mult ,
hackingAscensionMult : member . hack _asc _mult ,
strength : member . str ,
strengthEquipMult : member . str _mult ,
strengthAscensionMult : member . str _asc _mult ,
2018-10-29 17:08:41 +01:00
task : member . task ,
2018-10-23 20:55:42 +02:00
}
}
}
workerScript . log ( ` Invalid argument passed to gang.getMemberInformation(). No gang member could be found with name ${ name } ` ) ;
return { } ; // Member could not be found
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , nsGang . unknownGangApiExceptionMessage ( "getMemberInformation" , e ) ) ;
}
} ,
2019-05-05 06:03:40 +02:00
canRecruitMember : function ( ) {
updateDynamicRam ( "canRecruitMember" , getRamCost ( "gang" , "canRecruitMember" ) ) ;
2018-10-23 20:55:42 +02:00
nsGang . checkGangApiAccess ( workerScript , "canRecruitMember" ) ;
try {
return Player . gang . canRecruitMember ( ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , nsGang . unknownGangApiExceptionMessage ( "canRecruitMember" , e ) ) ;
}
} ,
2019-05-05 06:03:40 +02:00
recruitMember : function ( name ) {
updateDynamicRam ( "recruitMember" , getRamCost ( "gang" , "recruitMember" ) ) ;
2018-10-23 20:55:42 +02:00
nsGang . checkGangApiAccess ( workerScript , "recruitMember" ) ;
try {
2018-10-29 17:08:41 +01:00
const res = Player . gang . recruitMember ( name ) ;
if ( workerScript . shouldLog ( "recruitMember" ) ) {
if ( res ) {
workerScript . log ( ` Successfully recruited Gang Member ${ name } ` ) ;
} else {
workerScript . log ( ` Failed to recruit Gang Member ${ name } ` ) ;
}
}
return res ;
2018-10-23 20:55:42 +02:00
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , nsGang . unknownGangApiExceptionMessage ( "recruitMember" , e ) ) ;
}
} ,
2019-05-05 06:03:40 +02:00
getTaskNames : function ( ) {
updateDynamicRam ( "getTaskNames" , getRamCost ( "gang" , "getTaskNames" ) ) ;
2018-10-23 20:55:42 +02:00
nsGang . checkGangApiAccess ( workerScript , "getTaskNames" ) ;
try {
const tasks = Player . gang . getAllTaskNames ( ) ;
tasks . unshift ( "Unassigned" ) ;
return tasks ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , nsGang . unknownGangApiExceptionMessage ( "getTaskNames" , e ) ) ;
}
} ,
2019-05-05 06:03:40 +02:00
setMemberTask : function ( memberName , taskName ) {
updateDynamicRam ( "setMemberTask" , getRamCost ( "gang" , "setMemberTask" ) ) ;
2018-10-23 20:55:42 +02:00
nsGang . checkGangApiAccess ( workerScript , "setMemberTask" ) ;
try {
for ( const member of Player . gang . members ) {
if ( member . name === memberName ) {
2018-10-29 17:08:41 +01:00
const res = member . assignToTask ( taskName ) ;
if ( workerScript . shouldLog ( "setMemberTask" ) ) {
if ( res ) {
workerScript . log ( ` Successfully assigned Gang Member ${ memberName } to ${ taskName } task ` ) ;
} else {
workerScript . log ( ` Failed to assign Gang Member ${ memberName } to ${ taskName } task. ${ memberName } is now Unassigned ` ) ;
}
}
return res ;
2018-10-23 20:55:42 +02:00
}
}
workerScript . log ( ` Invalid argument passed to gang.setMemberTask(). No gang member could be found with name ${ memberName } ` ) ;
return false ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , nsGang . unknownGangApiExceptionMessage ( "setMemberTask" , e ) ) ;
}
} ,
2019-05-05 06:03:40 +02:00
getEquipmentNames : function ( ) {
updateDynamicRam ( "getEquipmentNames" , getRamCost ( "gang" , "getEquipmentNames" ) ) ;
2018-10-23 20:55:42 +02:00
nsGang . checkGangApiAccess ( workerScript , "getEquipmentNames" ) ;
try {
return Player . gang . getAllUpgradeNames ( ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , nsGang . unknownGangApiExceptionMessage ( "getEquipmentNames" , e ) ) ;
}
} ,
2019-05-05 06:03:40 +02:00
getEquipmentCost : function ( equipName ) {
updateDynamicRam ( "getEquipmentCost" , getRamCost ( "gang" , "getEquipmentCost" ) ) ;
2018-10-23 20:55:42 +02:00
nsGang . checkGangApiAccess ( workerScript , "getEquipmentCost" ) ;
try {
return Player . gang . getUpgradeCost ( equipName ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , nsGang . unknownGangApiExceptionMessage ( "getEquipmentCost" , e ) ) ;
}
} ,
2019-05-05 06:03:40 +02:00
getEquipmentType : function ( equipName ) {
updateDynamicRam ( "getEquipmentType" , getRamCost ( "gang" , "getEquipmentType" ) ) ;
2018-11-20 06:54:03 +01:00
nsGang . checkGangApiAccess ( workerScript , "getEquipmentType" ) ;
try {
return Player . gang . getUpgradeType ( equipName ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , nsGang . unknownGangApiExceptionMessage ( "getEquipmentType" , e ) ) ;
}
} ,
2019-05-05 06:03:40 +02:00
purchaseEquipment : function ( memberName , equipName ) {
updateDynamicRam ( "purchaseEquipment" , getRamCost ( "gang" , "purchaseEquipment" ) ) ;
2018-10-23 20:55:42 +02:00
nsGang . checkGangApiAccess ( workerScript , "purchaseEquipment" ) ;
try {
2018-11-13 23:42:15 +01:00
for ( const member of Player . gang . members ) {
2018-10-23 20:55:42 +02:00
if ( member . name === memberName ) {
2018-10-29 17:08:41 +01:00
const res = member . buyUpgrade ( equipName , Player , Player . gang ) ;
if ( workerScript . shouldLog ( "purchaseEquipment" ) ) {
if ( res ) {
workerScript . log ( ` Purchased ${ equipName } for Gang member ${ memberName } ` ) ;
} else {
workerScript . log ( ` Failed to purchase ${ equipName } for Gang member ${ memberName } ` ) ;
}
}
return res ;
2018-10-23 20:55:42 +02:00
}
}
workerScript . log ( ` Invalid argument passed to gang.purchaseEquipment(). No gang member could be found with name ${ memberName } ` ) ;
return false ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , nsGang . unknownGangApiExceptionMessage ( "purchaseEquipment" , e ) ) ;
}
} ,
2019-05-05 06:03:40 +02:00
ascendMember : function ( name ) {
updateDynamicRam ( "ascendMember" , getRamCost ( "gang" , "ascendMember" ) ) ;
2018-10-23 20:55:42 +02:00
nsGang . checkGangApiAccess ( workerScript , "ascendMember" ) ;
try {
2018-11-13 23:42:15 +01:00
for ( const member of Player . gang . members ) {
2018-10-23 20:55:42 +02:00
if ( member . name === name ) {
return Player . gang . ascendMember ( member , workerScript ) ;
}
}
2018-11-06 01:16:53 +01:00
workerScript . log ( ` Invalid argument passed to gang.ascendMember(). No gang member could be found with name ${ name } ` ) ;
2018-10-23 20:55:42 +02:00
return false ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , nsGang . unknownGangApiExceptionMessage ( "ascendMember" , e ) ) ;
}
} ,
2019-05-05 06:03:40 +02:00
setTerritoryWarfare : function ( engage ) {
updateDynamicRam ( "setTerritoryWarfare" , getRamCost ( "gang" , "setTerritoryWarfare" ) ) ;
2018-10-23 20:55:42 +02:00
nsGang . checkGangApiAccess ( workerScript , "setTerritoryWarfare" ) ;
try {
if ( engage ) {
Player . gang . territoryWarfareEngaged = true ;
2018-10-29 17:08:41 +01:00
if ( workerScript . shouldLog ( "setTerritoryWarfare" ) ) {
workerScript . log ( "Engaging in Gang Territory Warfare" ) ;
}
2018-10-23 20:55:42 +02:00
} else {
Player . gang . territoryWarfareEngaged = false ;
2018-10-29 17:08:41 +01:00
if ( workerScript . shouldLog ( "setTerritoryWarfare" ) ) {
workerScript . log ( "Disengaging in Gang Territory Warfare" ) ;
}
2018-10-23 20:55:42 +02:00
}
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , nsGang . unknownGangApiExceptionMessage ( "setTerritoryWarfare" , e ) ) ;
}
} ,
2019-05-05 06:03:40 +02:00
getChanceToWinClash : function ( otherGang ) {
updateDynamicRam ( "getChanceToWinClash" , getRamCost ( "gang" , "getChanceToWinClash" ) ) ;
2018-11-14 07:05:51 +01:00
nsGang . checkGangApiAccess ( workerScript , "getChanceToWinClash" ) ;
try {
if ( AllGangs [ otherGang ] == null ) {
workerScript . log ( ` Invalid gang specified in gang.getChanceToWinClash() : ${ otherGang } ` ) ;
return 0 ;
}
const playerPower = AllGangs [ Player . gang . facName ] . power ;
const otherPower = AllGangs [ otherGang ] . power ;
return playerPower / ( otherPower + playerPower ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , nsGang . unknownGangApiExceptionMessage ( "getChanceToWinClash" , e ) ) ;
}
} ,
2019-05-05 06:03:40 +02:00
getBonusTime : function ( ) {
2018-10-23 20:55:42 +02:00
nsGang . checkGangApiAccess ( workerScript , "getBonusTime" ) ;
try {
return Math . round ( Player . gang . storedCycles / 5 ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , nsGang . unknownGangApiExceptionMessage ( "getBonusTime" , e ) ) ;
}
} ,
} , // end gang namespace
// Bladeburner API
2019-05-05 06:03:40 +02:00
bladeburner : {
getContractNames : function ( ) {
updateDynamicRam ( "getContractNames" , getRamCost ( "bladeburner" , "getContractNames" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-25 21:07:03 +02:00
return Player . bladeburner . getContractNamesNetscriptFn ( ) ;
2018-05-23 02:09:04 +02:00
}
2018-06-25 02:13:50 +02:00
throw makeRuntimeRejectMsg ( workerScript , "getContractNames() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
getOperationNames : function ( ) {
updateDynamicRam ( "getOperationNames" , getRamCost ( "bladeburner" , "getOperationNames" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-25 21:07:03 +02:00
return Player . bladeburner . getOperationNamesNetscriptFn ( ) ;
2018-05-23 02:09:04 +02:00
}
2018-06-25 02:13:50 +02:00
throw makeRuntimeRejectMsg ( workerScript , "getOperationNames() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
getBlackOpNames : function ( ) {
updateDynamicRam ( "getBlackOpNames" , getRamCost ( "bladeburner" , "getBlackOpNames" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-25 21:07:03 +02:00
return Player . bladeburner . getBlackOpNamesNetscriptFn ( ) ;
2018-05-23 02:09:04 +02:00
}
2018-06-25 02:13:50 +02:00
throw makeRuntimeRejectMsg ( workerScript , "getBlackOpNames() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
getBlackOpRank : function ( name = "" ) {
updateDynamicRam ( "getBlackOpRank" , getRamCost ( "bladeburner" , "getBlackOpRank" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2019-03-12 07:39:32 +01:00
const actionId = Player . bladeburner . getActionIdFromTypeAndName ( 'blackops' , name )
if ( ! actionId ) {
return - 1 ;
}
const actionObj = Player . bladeburner . getActionObject ( actionId ) ;
if ( ! actionObj ) {
return - 1 ;
}
return actionObj . reqdRank ;
}
throw makeRuntimeRejectMsg ( workerScript , "getBlackOpRank() 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" ) ;
} ,
2019-05-05 06:03:40 +02:00
getGeneralActionNames : function ( ) {
updateDynamicRam ( "getGeneralActionNames" , getRamCost ( "bladeburner" , "getGeneralActionNames" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-25 21:07:03 +02:00
return Player . bladeburner . getGeneralActionNamesNetscriptFn ( ) ;
2018-05-23 02:09:04 +02:00
}
2018-06-25 02:13:50 +02:00
throw makeRuntimeRejectMsg ( workerScript , "getGeneralActionNames() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
getSkillNames : function ( ) {
updateDynamicRam ( "getSkillNames" , getRamCost ( "bladeburner" , "getSkillNames" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-25 21:07:03 +02:00
return Player . bladeburner . getSkillNamesNetscriptFn ( ) ;
2018-05-23 02:09:04 +02:00
}
2018-06-25 02:13:50 +02:00
throw makeRuntimeRejectMsg ( workerScript , "getSkillNames() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
startAction : function ( type = "" , name = "" ) {
updateDynamicRam ( "startAction" , getRamCost ( "bladeburner" , "startAction" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-08 17:51:48 +02:00
try {
return Player . bladeburner . startActionNetscriptFn ( type , name , workerScript ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , "Bladeburner.startAction() failed with exception: " + e ) ;
}
2018-05-23 02:09:04 +02:00
}
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "startAction() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
stopBladeburnerAction : function ( ) {
updateDynamicRam ( "stopBladeburnerAction" , getRamCost ( "bladeburner" , "stopBladeburnerAction" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-08 17:51:48 +02:00
return Player . bladeburner . resetAction ( ) ;
2018-05-23 02:09:04 +02:00
}
2018-06-25 02:13:50 +02:00
throw makeRuntimeRejectMsg ( workerScript , "stopBladeburnerAction() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
getCurrentAction : function ( ) {
updateDynamicRam ( "getCurrentAction" , getRamCost ( "bladeburner" , "getCurrentAction" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-08-04 23:52:45 +02:00
return Player . bladeburner . getTypeAndNameFromActionId ( Player . bladeburner . action ) ;
2018-07-11 06:41:26 +02:00
}
throw makeRuntimeRejectMsg ( workerScript , "getCurrentAction() 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" ) ;
} ,
2019-05-05 06:03:40 +02:00
getActionTime : function ( type = "" , name = "" ) {
updateDynamicRam ( "getActionTime" , getRamCost ( "bladeburner" , "getActionTime" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-08 17:51:48 +02:00
try {
return Player . bladeburner . getActionTimeNetscriptFn ( type , name , workerScript ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , "Bladeburner.getActionTime() failed with exception: " + e ) ;
}
2018-05-23 02:09:04 +02:00
}
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "getActionTime() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
getActionEstimatedSuccessChance : function ( type = "" , name = "" ) {
updateDynamicRam ( "getActionEstimatedSuccessChance" , getRamCost ( "bladeburner" , "getActionEstimatedSuccessChance" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-08 17:51:48 +02:00
try {
return Player . bladeburner . getActionEstimatedSuccessChanceNetscriptFn ( type , name , workerScript ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , "Bladeburner.getActionEstimatedSuccessChance() failed with exception: " + e ) ;
}
2018-05-23 02:09:04 +02:00
}
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "getActionEstimatedSuccessChance() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2018-09-24 06:27:31 +02:00
getActionRepGain : function ( type = "" , name = "" , level ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "getActionRepGain" , getRamCost ( "bladeburner" , "getActionRepGain" ) ) ;
2018-09-24 06:27:31 +02:00
checkBladeburnerAccess ( workerScript , "getActionRepGain" ) ;
try {
var errorLogText = unknownBladeburnerActionErrorMessage ( "getActionAutolevel" , type , name ) ;
const actionId = Player . bladeburner . getActionIdFromTypeAndName ( type , name ) ;
if ( actionId == null ) {
workerScript . log ( errorLogText ) ;
return - 1 ;
}
const actionObj = Player . bladeburner . getActionObject ( actionId ) ;
if ( actionObj == null ) {
workerScript . log ( errorLogText ) ;
return - 1 ;
}
var rewardMultiplier ;
if ( level == null || isNaN ( level ) ) {
rewardMultiplier = Math . pow ( actionObj . rewardFac , actionObj . level - 1 ) ;
} else {
rewardMultiplier = Math . pow ( actionObj . rewardFac , level - 1 ) ;
}
return actionObj . rankGain * rewardMultiplier * BitNodeMultipliers . BladeburnerRank ;
} catch ( err ) {
throw makeRuntimeRejectMsg ( workerScript , unknownBladeburnerExceptionMessage ( "getActionAutolevel" , err ) ) ;
}
} ,
2019-05-05 06:03:40 +02:00
getActionCountRemaining : function ( type = "" , name = "" ) {
updateDynamicRam ( "getActionCountRemaining" , getRamCost ( "bladeburner" , "getActionCountRemaining" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-08 17:51:48 +02:00
try {
return Player . bladeburner . getActionCountRemainingNetscriptFn ( type , name , workerScript ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , "Bladeburner.getActionCountRemaining() failed with exception: " + e ) ;
}
2018-05-23 02:09:04 +02:00
}
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "getActionCountRemaining() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2018-07-20 06:06:59 +02:00
getActionMaxLevel : function ( type = "" , name = "" ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "getActionMaxLevel" , getRamCost ( "bladeburner" , "getActionMaxLevel" ) ) ;
2018-07-20 06:06:59 +02:00
checkBladeburnerAccess ( workerScript , "getActionMaxLevel" ) ;
try {
var errorLogText = unknownBladeburnerActionErrorMessage ( "getActionMaxLevel" , type , name ) ;
const actionId = Player . bladeburner . getActionIdFromTypeAndName ( type , name ) ;
if ( actionId == null ) {
workerScript . log ( errorLogText ) ;
return - 1 ;
}
const actionObj = Player . bladeburner . getActionObject ( actionId ) ;
if ( actionObj == null ) {
workerScript . log ( errorLogText ) ;
return - 1 ;
}
return actionObj . maxLevel ;
} catch ( err ) {
throw makeRuntimeRejectMsg ( workerScript , unknownBladeburnerExceptionMessage ( "getActionMaxLevel" , err ) ) ;
}
} ,
getActionCurrentLevel : function ( type = "" , name = "" ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "getActionCurrentLevel" , getRamCost ( "bladeburner" , "getActionCurrentLevel" ) ) ;
2018-07-20 06:06:59 +02:00
checkBladeburnerAccess ( workerScript , "getActionCurrentLevel" ) ;
try {
var errorLogText = unknownBladeburnerActionErrorMessage ( "getActionCurrentLevel" , type , name ) ;
const actionId = Player . bladeburner . getActionIdFromTypeAndName ( type , name ) ;
if ( actionId == null ) {
workerScript . log ( errorLogText ) ;
return - 1 ;
}
const actionObj = Player . bladeburner . getActionObject ( actionId ) ;
if ( actionObj == null ) {
workerScript . log ( errorLogText ) ;
return - 1 ;
}
return actionObj . level ;
} catch ( err ) {
throw makeRuntimeRejectMsg ( workerScript , unknownBladeburnerExceptionMessage ( "getActionCurrentLevel" , err ) ) ;
}
} ,
getActionAutolevel : function ( type = "" , name = "" ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "getActionAutolevel" , getRamCost ( "bladeburner" , "getActionAutolevel" ) ) ;
2018-07-20 06:06:59 +02:00
checkBladeburnerAccess ( workerScript , "getActionAutolevel" ) ;
try {
var errorLogText = unknownBladeburnerActionErrorMessage ( "getActionAutolevel" , type , name ) ;
const actionId = Player . bladeburner . getActionIdFromTypeAndName ( type , name ) ;
if ( actionId == null ) {
workerScript . log ( errorLogText ) ;
return false ;
}
const actionObj = Player . bladeburner . getActionObject ( actionId ) ;
if ( actionObj == null ) {
workerScript . log ( errorLogText ) ;
return false ;
}
return actionObj . autoLevel ;
} catch ( err ) {
throw makeRuntimeRejectMsg ( workerScript , unknownBladeburnerExceptionMessage ( "getActionAutolevel" , err ) ) ;
}
} ,
setActionAutolevel : function ( type = "" , name = "" , autoLevel = true ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "setActionAutolevel" , getRamCost ( "bladeburner" , "setActionAutolevel" ) ) ;
2018-07-20 06:06:59 +02:00
checkBladeburnerAccess ( workerScript , "setActionAutolevel" ) ;
try {
var errorLogText = unknownBladeburnerActionErrorMessage ( "setActionAutolevel" , type , name ) ;
const actionId = Player . bladeburner . getActionIdFromTypeAndName ( type , name ) ;
if ( actionId == null ) {
workerScript . log ( errorLogText ) ;
return ;
}
const actionObj = Player . bladeburner . getActionObject ( actionId ) ;
if ( actionObj == null ) {
workerScript . log ( errorLogText ) ;
return ;
}
actionObj . autoLevel = autoLevel ;
} catch ( err ) {
throw makeRuntimeRejectMsg ( workerScript , unknownBladeburnerExceptionMessage ( "setActionAutolevel" , err ) ) ;
}
} ,
setActionLevel : function ( type = "" , name = "" , level = 1 ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "setActionLevel" , getRamCost ( "bladeburner" , "setActionLevel" ) ) ;
2018-07-20 06:06:59 +02:00
checkBladeburnerAccess ( workerScript , "setActionLevel" ) ;
try {
var errorLogText = unknownBladeburnerActionErrorMessage ( "setActionLevel" , type , name ) ;
const actionId = Player . bladeburner . getActionIdFromTypeAndName ( type , name ) ;
if ( actionId == null ) {
workerScript . log ( errorLogText ) ;
return ;
}
const actionObj = Player . bladeburner . getActionObject ( actionId ) ;
if ( actionObj == null ) {
workerScript . log ( errorLogText ) ;
return ;
}
if ( level > actionObj . maxLevel ) {
workerScript . log ( ` ERROR: bladeburner. ${ setActionLevel } () failed because level exceeds max level for given action. ` ) ;
return ;
}
if ( level < 1 ) {
workerScript . log ( ` ERROR: bladeburner. ${ setActionLevel } () failed because level is below 1. ` ) ;
return ;
}
actionObj . level = level ;
} catch ( err ) {
throw makeRuntimeRejectMsg ( workerScript , unknownBladeburnerExceptionMessage ( "setActionLevel" , err ) ) ;
}
} ,
2019-05-05 06:03:40 +02:00
getRank : function ( ) {
updateDynamicRam ( "getRank" , getRamCost ( "bladeburner" , "getRank" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-08 17:51:48 +02:00
return Player . bladeburner . rank ;
2018-05-23 02:09:04 +02:00
}
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "getRank() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
getSkillPoints : function ( ) {
updateDynamicRam ( "getSkillPoints" , getRamCost ( "bladeburner" , "getSkillPoints" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-08 17:51:48 +02:00
return Player . bladeburner . skillPoints ;
2018-05-23 02:09:04 +02:00
}
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "getSkillPoints() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
getSkillLevel : function ( skillName = "" ) {
updateDynamicRam ( "getSkillLevel" , getRamCost ( "bladeburner" , "getSkillLevel" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-08 17:51:48 +02:00
try {
return Player . bladeburner . getSkillLevelNetscriptFn ( skillName , workerScript ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , "Bladeburner.getSkillLevel() failed with exception: " + e ) ;
}
2018-05-23 02:09:04 +02:00
}
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "getSkillLevel() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
getSkillUpgradeCost : function ( skillName = "" ) {
updateDynamicRam ( "getSkillUpgradeCost" , getRamCost ( "bladeburner" , "getSkillUpgradeCost" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-08-12 03:05:32 +02:00
try {
return Player . bladeburner . getSkillUpgradeCostNetscriptFn ( skillName , workerScript ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , "Bladeburner.getSkillUpgradeCost() failed with exception: " + e ) ;
}
}
throw makeRuntimeRejectMsg ( workerScript , "getSkillUpgradeCost() 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" ) ;
} ,
2019-05-05 06:03:40 +02:00
upgradeSkill : function ( skillName ) {
updateDynamicRam ( "upgradeSkill" , getRamCost ( "bladeburner" , "upgradeSkill" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-08 17:51:48 +02:00
try {
return Player . bladeburner . upgradeSkillNetscriptFn ( skillName , workerScript ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , "Bladeburner.upgradeSkill() failed with exception: " + e ) ;
}
2018-05-23 02:09:04 +02:00
}
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "upgradeSkill() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
getTeamSize : function ( type = "" , name = "" ) {
updateDynamicRam ( "getTeamSize" , getRamCost ( "bladeburner" , "getTeamSize" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-08 17:51:48 +02:00
try {
return Player . bladeburner . getTeamSizeNetscriptFn ( type , name , workerScript ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , "Bladeburner.getTeamSize() failed with exception: " + e ) ;
}
2018-05-23 02:09:04 +02:00
}
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "getTeamSize() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
setTeamSize : function ( type = "" , name = "" , size ) {
updateDynamicRam ( "setTeamSize" , getRamCost ( "bladeburner" , "setTeamSize" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-08 17:51:48 +02:00
try {
return Player . bladeburner . setTeamSizeNetscriptFn ( type , name , size , workerScript ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , "Bladeburner.setTeamSize() failed with exception: " + e ) ;
}
2018-05-23 02:09:04 +02:00
}
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "setTeamSize() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
getCityEstimatedPopulation : function ( cityName ) {
updateDynamicRam ( "getCityEstimatedPopulation" , getRamCost ( "bladeburner" , "getCityEstimatedPopulation" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-08 17:51:48 +02:00
try {
return Player . bladeburner . getCityEstimatedPopulationNetscriptFn ( cityName , workerScript ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , "Bladeburner.getCityEstimatedPopulation() failed with exception: " + e ) ;
}
2018-05-23 02:09:04 +02:00
}
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "getCityEstimatedPopulation() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
getCityEstimatedCommunities : function ( cityName ) {
updateDynamicRam ( "getCityEstimatedCommunities" , getRamCost ( "bladeburner" , "getCityEstimatedCommunities" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-08 17:51:48 +02:00
try {
return Player . bladeburner . getCityEstimatedCommunitiesNetscriptFn ( cityName , workerScript ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , "Bladeburner.getCityEstimatedCommunities() failed with exception: " + e ) ;
}
2018-05-23 02:09:04 +02:00
}
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "getCityEstimatedCommunities() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
getCityChaos : function ( cityName ) {
updateDynamicRam ( "getCityChaos" , getRamCost ( "bladeburner" , "getCityChaos" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-08 17:51:48 +02:00
try {
return Player . bladeburner . getCityChaosNetscriptFn ( cityName , workerScript ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , "Bladeburner.getCityChaos() failed with exception: " + e ) ;
}
2018-05-23 02:09:04 +02:00
}
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "getCityChaos() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
getCity : function ( ) {
updateDynamicRam ( "getCity" , getRamCost ( "bladeburner" , "getCity" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-08-24 22:44:48 +02:00
try {
return Player . bladeburner . city ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , "Bladeburner.getCity() failed with exception: " + e ) ;
}
}
throw makeRuntimeRejectMsg ( workerScript , "getCity() 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" ) ;
} ,
2019-05-05 06:03:40 +02:00
switchCity : function ( cityName ) {
updateDynamicRam ( "switchCity" , getRamCost ( "bladeburner" , "switchCity" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-08 17:51:48 +02:00
try {
return Player . bladeburner . switchCityNetscriptFn ( cityName , workerScript ) ;
} catch ( e ) {
throw makeRuntimeRejectMsg ( workerScript , "Bladeburner.switchCity() failed with exception: " + e ) ;
}
2018-05-23 02:09:04 +02:00
}
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "switchCity() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
getStamina : function ( ) {
updateDynamicRam ( "getStamina" , getRamCost ( "bladeburner" , "getStamina" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-08 17:51:48 +02:00
return [ Player . bladeburner . stamina , Player . bladeburner . maxStamina ] ;
2018-05-23 02:09:04 +02:00
}
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "getStamina() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
} ,
2019-05-05 06:03:40 +02:00
joinBladeburnerFaction : function ( ) {
updateDynamicRam ( "joinBladeburnerFaction" , getRamCost ( "bladeburner" , "joinBladeburnerFaction" ) ) ;
if ( Player . bladeburner instanceof Bladeburner && ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-06-08 17:51:48 +02:00
return Player . bladeburner . joinBladeburnerFactionNetscriptFn ( workerScript ) ;
2018-05-23 02:09:04 +02:00
}
2018-06-08 17:51:48 +02:00
throw makeRuntimeRejectMsg ( workerScript , "joinBladeburnerFaction() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
2018-05-23 02:09:04 +02:00
"at the Bladeburner division or because you do not have Source-File 7" ) ;
2018-06-25 02:13:50 +02:00
} ,
2019-05-05 06:03:40 +02:00
joinBladeburnerDivision : function ( ) {
updateDynamicRam ( "joinBladeburnerDivision" , getRamCost ( "bladeburner" , "joinBladeburnerDivision" ) ) ;
if ( ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2019-04-20 07:27:33 +02:00
if ( Player . bitNodeN === 8 ) { return false ; }
2018-07-03 05:35:12 +02:00
if ( Player . bladeburner instanceof Bladeburner ) {
2019-04-13 03:22:46 +02:00
return true ; // Already member
2018-07-03 05:35:12 +02:00
} else if ( Player . strength >= 100 && Player . defense >= 100 &&
Player . dexterity >= 100 && Player . agility >= 100 ) {
Player . bladeburner = new Bladeburner ( { new : true } ) ;
workerScript . log ( "You have been accepted into the Bladeburner division" ) ;
2019-04-20 07:27:33 +02:00
const worldHeader = document . getElementById ( "world-menu-header" ) ;
if ( worldHeader instanceof HTMLElement ) {
worldHeader . click ( ) ; worldHeader . click ( ) ;
}
2018-07-03 05:35:12 +02:00
return true ;
} else {
workerScript . log ( "You do not meet the requirements for joining the Bladeburner division" ) ;
return false ;
}
}
throw makeRuntimeRejectMsg ( workerScript , "joinBladeburnerDivision() 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" ) ;
2018-08-12 03:05:32 +02:00
} ,
2019-05-05 06:03:40 +02:00
getBonusTime : function ( ) {
if ( ( Player . bitNodeN === 7 || SourceFileFlags [ 7 ] > 0 ) ) {
2018-08-12 03:05:32 +02:00
return Math . round ( Player . bladeburner . storedCycles / 5 ) ;
}
throw makeRuntimeRejectMsg ( workerScript , "getBonusTime() 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" ) ;
2018-07-03 05:35:12 +02:00
}
2018-09-23 02:25:48 +02:00
} , // End Bladeburner
2019-05-05 06:03:40 +02:00
// Coding Contract API
codingcontract : {
2019-05-14 10:35:37 +02:00
attempt : function ( answer , fn , ip = workerScript . serverIp , { returnReward } = { } ) {
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "attempt" , getRamCost ( "codingcontract" , "attempt" ) ) ;
2018-09-23 02:25:48 +02:00
const contract = getCodingContract ( fn , ip ) ;
if ( contract == null ) {
workerScript . log ( ` ERROR: codingcontract.getData() failed because it could find the specified contract ${ fn } on server ${ ip } ` ) ;
return false ;
}
2019-02-27 03:26:29 +01:00
// Convert answer to string. If the answer is a 2D array, then we have to
// manually add brackets for the inner arrays
if ( is2DArray ( answer ) ) {
let answerComponents = [ ] ;
for ( let i = 0 ; i < answer . length ; ++ i ) {
answerComponents . push ( [ "[" , answer [ i ] . toString ( ) , "]" ] . join ( "" ) ) ;
}
answer = answerComponents . join ( "," ) ;
} else {
answer = String ( answer ) ;
}
2019-03-31 04:53:57 +02:00
const serv = safeGetServer ( ip , "codingcontract.attempt" ) ;
2018-09-23 02:25:48 +02:00
if ( contract . isSolution ( answer ) ) {
const reward = Player . gainCodingContractReward ( contract . reward , contract . getDifficulty ( ) ) ;
workerScript . log ( ` Successfully completed Coding Contract ${ fn } . Reward: ${ reward } ` ) ;
serv . removeContract ( fn ) ;
2019-05-14 10:35:37 +02:00
return returnReward ? reward : true ;
2018-09-23 02:25:48 +02:00
} else {
++ contract . tries ;
if ( contract . tries >= contract . getMaxNumTries ( ) ) {
workerScript . log ( ` Coding Contract ${ fn } failed. Contract is now self-destructing ` ) ;
serv . removeContract ( fn ) ;
} else {
workerScript . log ( ` Coding Contract ${ fn } failed. ${ contract . getMaxNumTries ( ) - contract . tries } attempts remaining ` ) ;
}
2019-05-14 10:35:37 +02:00
return returnReward ? "" : false ;
2018-09-23 02:25:48 +02:00
}
} ,
2019-05-05 06:03:40 +02:00
getContractType : function ( fn , ip = workerScript . serverIp ) {
updateDynamicRam ( "getContractType" , getRamCost ( "codingcontract" , "getContractType" ) ) ;
2018-10-09 02:26:24 +02:00
let contract = getCodingContract ( fn , ip ) ;
if ( contract == null ) {
workerScript . log ( ` ERROR: codingcontract.getData() failed because it could find the specified contract ${ fn } on server ${ ip } ` ) ;
return null ;
}
return contract . getType ( ) ;
} ,
2019-05-05 06:03:40 +02:00
getData : function ( fn , ip = workerScript . serverIp ) {
updateDynamicRam ( "getData" , getRamCost ( "codingcontract" , "getData" ) ) ;
2018-10-09 02:26:24 +02:00
let contract = getCodingContract ( fn , ip ) ;
2018-09-23 02:25:48 +02:00
if ( contract == null ) {
workerScript . log ( ` ERROR: codingcontract.getData() failed because it could find the specified contract ${ fn } on server ${ ip } ` ) ;
return null ;
}
2018-10-09 02:26:24 +02:00
let data = contract . getData ( ) ;
2018-10-09 02:33:07 +02:00
if ( data . constructor === Array ) {
2019-02-01 09:27:24 +01:00
// For two dimensional arrays, we have to copy the internal arrays using
// slice() as well. As of right now, no contract has arrays that have
// more than two dimensions
const copy = data . slice ( ) ;
for ( let i = 0 ; i < copy . length ; ++ i ) {
if ( data [ i ] . constructor === Array ) {
copy [ i ] = data [ i ] . slice ( ) ;
}
}
return copy ;
2018-10-09 02:26:24 +02:00
} else {
return data ;
}
2018-09-23 02:25:48 +02:00
} ,
2019-05-05 06:03:40 +02:00
getDescription : function ( fn , ip = workerScript . serverIp ) {
updateDynamicRam ( "getDescription" , getRamCost ( "codingcontract" , "getDescription" ) ) ;
2018-09-23 02:25:48 +02:00
var contract = getCodingContract ( fn , ip ) ;
if ( contract == null ) {
workerScript . log ( ` ERROR: codingcontract.getDescription() failed because it could find the specified contract ${ fn } on server ${ ip } ` ) ;
return "" ;
}
return contract . getDescription ( ) ;
} ,
2019-05-05 06:03:40 +02:00
getNumTriesRemaining : function ( fn , ip = workerScript . serverIp ) {
updateDynamicRam ( "getNumTriesRemaining" , getRamCost ( "codingcontract" , "getNumTriesRemaining" ) ) ;
2018-09-23 02:25:48 +02:00
var contract = getCodingContract ( fn , ip ) ;
if ( contract == null ) {
workerScript . log ( ` ERROR: codingcontract.getNumTriesRemaining() failed because it could find the specified contract ${ fn } on server ${ ip } ` ) ;
return - 1 ;
}
return contract . getMaxNumTries ( ) - contract . tries ;
} ,
2019-03-12 08:40:48 +01:00
} , // End coding contracts
2019-05-05 06:03:40 +02:00
// Duplicate Sleeve API
sleeve : {
getNumSleeves : function ( ) {
2019-03-13 00:35:44 +01:00
if ( Player . bitNodeN !== 10 && ! SourceFileFlags [ 10 ] ) {
2019-03-13 00:05:38 +01:00
throw makeRuntimeRejectMsg ( workerScript , "getNumSleeves() failed because you do not currently have access to the Sleeve API. This is either because you are not in BitNode-10 or because you do not have Source-File 10" ) ;
}
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "getNumSleeves" , getRamCost ( "sleeve" , "getNumSleeves" ) ) ;
2019-03-12 08:40:48 +01:00
return Player . sleeves . length ;
} ,
2019-05-05 06:03:40 +02:00
setToShockRecovery : function ( sleeveNumber = 0 ) {
2019-03-13 00:35:44 +01:00
if ( Player . bitNodeN !== 10 && ! SourceFileFlags [ 10 ] ) {
2019-03-18 06:04:12 +01:00
throw makeRuntimeRejectMsg ( workerScript , "setToShockRecovery() failed because you do not currently have access to the Sleeve API. This is either because you are not in BitNode-10 or because you do not have Source-File 10" ) ;
2019-03-13 00:05:38 +01:00
}
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "setToShockRecovery" , getRamCost ( "sleeve" , "setToShockRecovery" ) ) ;
2019-03-12 08:40:48 +01:00
if ( sleeveNumber >= Player . sleeves . length || sleeveNumber < 0 ) {
2019-03-18 06:04:12 +01:00
workerScript . log ( ` ERROR: sleeve.setToShockRecovery( ${ sleeveNumber } ) failed because it is an invalid sleeve number. ` ) ;
2019-03-12 08:40:48 +01:00
return false ;
}
return Player . sleeves [ sleeveNumber ] . shockRecovery ( Player ) ;
} ,
2019-05-05 06:03:40 +02:00
setToSynchronize : function ( sleeveNumber = 0 ) {
2019-03-13 00:35:44 +01:00
if ( Player . bitNodeN !== 10 && ! SourceFileFlags [ 10 ] ) {
2019-03-18 06:04:12 +01:00
throw makeRuntimeRejectMsg ( workerScript , "setToSynchronize() failed because you do not currently have access to the Sleeve API. This is either because you are not in BitNode-10 or because you do not have Source-File 10" ) ;
2019-03-13 00:05:38 +01:00
}
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "setToSynchronize" , getRamCost ( "sleeve" , "setToSynchronize" ) ) ;
2019-03-12 08:40:48 +01:00
if ( sleeveNumber >= Player . sleeves . length || sleeveNumber < 0 ) {
2019-03-18 06:04:12 +01:00
workerScript . log ( ` ERROR: sleeve.setToSynchronize( ${ sleeveNumber } ) failed because it is an invalid sleeve number. ` ) ;
2019-03-12 08:40:48 +01:00
return false ;
}
return Player . sleeves [ sleeveNumber ] . synchronize ( Player ) ;
} ,
2019-05-05 06:03:40 +02:00
setToCommitCrime : function ( sleeveNumber = 0 , crimeName = "" ) {
2019-03-13 00:35:44 +01:00
if ( Player . bitNodeN !== 10 && ! SourceFileFlags [ 10 ] ) {
2019-03-18 06:04:12 +01:00
throw makeRuntimeRejectMsg ( workerScript , "setToCommitCrime() failed because you do not currently have access to the Sleeve API. This is either because you are not in BitNode-10 or because you do not have Source-File 10" ) ;
2019-03-13 00:05:38 +01:00
}
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "setToCommitCrime" , getRamCost ( "sleeve" , "setToCommitCrime" ) ) ;
2019-03-12 08:40:48 +01:00
if ( sleeveNumber >= Player . sleeves . length || sleeveNumber < 0 ) {
2019-03-18 06:04:12 +01:00
workerScript . log ( ` ERROR: sleeve.setToCommitCrime( ${ sleeveNumber } ) failed because it is an invalid sleeve number. ` ) ;
2019-03-12 08:40:48 +01:00
return false ;
}
return Player . sleeves [ sleeveNumber ] . commitCrime ( Player , crimeName ) ;
} ,
2019-05-05 06:03:40 +02:00
setToUniversityCourse : function ( sleeveNumber = 0 , universityName = "" , className = "" ) {
2019-03-13 00:35:44 +01:00
if ( Player . bitNodeN !== 10 && ! SourceFileFlags [ 10 ] ) {
2019-03-18 06:04:12 +01:00
throw makeRuntimeRejectMsg ( workerScript , "setToUniversityCourse() failed because you do not currently have access to the Sleeve API. This is either because you are not in BitNode-10 or because you do not have Source-File 10" ) ;
2019-03-13 00:05:38 +01:00
}
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "setToUniversityCourse" , getRamCost ( "sleeve" , "setToUniversityCourse" ) ) ;
2019-03-12 08:40:48 +01:00
if ( sleeveNumber >= Player . sleeves . length || sleeveNumber < 0 ) {
2019-03-18 06:04:12 +01:00
workerScript . log ( ` ERROR: sleeve.setToUniversityCourse( ${ sleeveNumber } ) failed because it is an invalid sleeve number. ` ) ;
2019-03-12 08:40:48 +01:00
return false ;
}
return Player . sleeves [ sleeveNumber ] . takeUniversityCourse ( Player , universityName , className ) ;
} ,
2019-05-05 06:03:40 +02:00
travel : function ( sleeveNumber = 0 , cityName = "" ) {
2019-03-13 00:35:44 +01:00
if ( Player . bitNodeN !== 10 && ! SourceFileFlags [ 10 ] ) {
2019-03-13 00:05:38 +01:00
throw makeRuntimeRejectMsg ( workerScript , "travel() failed because you do not currently have access to the Sleeve API. This is either because you are not in BitNode-10 or because you do not have Source-File 10" ) ;
}
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "travel" , getRamCost ( "sleeve" , "travel" ) ) ;
2019-03-12 08:40:48 +01:00
if ( sleeveNumber >= Player . sleeves . length || sleeveNumber < 0 ) {
workerScript . log ( ` ERROR: sleeve.travel( ${ sleeveNumber } ) failed because it is an invalid sleeve number. ` ) ;
return false ;
}
return Player . sleeves [ sleeveNumber ] . travel ( Player , cityName ) ;
} ,
2019-05-05 06:03:40 +02:00
setToCompanyWork : function ( sleeveNumber = 0 , companyName = "" ) {
2019-03-13 00:35:44 +01:00
if ( Player . bitNodeN !== 10 && ! SourceFileFlags [ 10 ] ) {
2019-03-18 06:04:12 +01:00
throw makeRuntimeRejectMsg ( workerScript , "setToCompanyWork() failed because you do not currently have access to the Sleeve API. This is either because you are not in BitNode-10 or because you do not have Source-File 10" ) ;
2019-03-13 00:05:38 +01:00
}
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "setToCompanyWork" , getRamCost ( "sleeve" , "setToCompanyWork" ) ) ;
2019-03-12 08:40:48 +01:00
if ( sleeveNumber >= Player . sleeves . length || sleeveNumber < 0 ) {
2019-03-18 06:04:12 +01:00
workerScript . log ( ` ERROR: sleeve.setToCompanyWork( ${ sleeveNumber } ) failed because it is an invalid sleeve number. ` ) ;
2019-03-12 08:40:48 +01:00
return false ;
}
2019-03-20 00:38:49 +01:00
// Cannot work at the same company that another sleeve is working at
for ( let i = 0 ; i < Player . sleeves . length ; ++ i ) {
if ( i === sleeveNumber ) { continue ; }
const other = Player . sleeves [ i ] ;
if ( other . currentTask === SleeveTaskType . Company && other . currentTaskLocation === companyName ) {
workerScript . log ( ` ERROR: sleeve.setToCompanyWork() failed for Sleeve ${ sleeveNumber } because Sleeve ${ i } is doing the same task ` ) ;
return false ;
}
}
2019-03-12 08:40:48 +01:00
return Player . sleeves [ sleeveNumber ] . workForCompany ( Player , companyName ) ;
} ,
2019-05-05 06:03:40 +02:00
setToFactionWork : function ( sleeveNumber = 0 , factionName = "" , workType = "" ) {
2019-03-13 00:35:44 +01:00
if ( Player . bitNodeN !== 10 && ! SourceFileFlags [ 10 ] ) {
2019-03-18 06:04:12 +01:00
throw makeRuntimeRejectMsg ( workerScript , "setToFactionWork() failed because you do not currently have access to the Sleeve API. This is either because you are not in BitNode-10 or because you do not have Source-File 10" ) ;
2019-03-13 00:05:38 +01:00
}
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "setToFactionWork" , getRamCost ( "sleeve" , "setToFactionWork" ) ) ;
2019-03-12 08:40:48 +01:00
if ( sleeveNumber >= Player . sleeves . length || sleeveNumber < 0 ) {
2019-03-18 06:04:12 +01:00
workerScript . log ( ` ERROR: sleeve.setToFactionWork( ${ sleeveNumber } ) failed because it is an invalid sleeve number. ` ) ;
2019-03-12 08:40:48 +01:00
return false ;
}
2019-03-20 00:38:49 +01:00
// Cannot work at the same faction that another sleeve is working at
for ( let i = 0 ; i < Player . sleeves . length ; ++ i ) {
if ( i === sleeveNumber ) { continue ; }
const other = Player . sleeves [ i ] ;
if ( other . currentTask === SleeveTaskType . Faction && other . currentTaskLocation === factionName ) {
workerScript . log ( ` ERROR: sleeve.setToFactionWork() failed for Sleeve ${ sleeveNumber } because Sleeve ${ i } is doing the same task ` ) ;
return false ;
}
}
2019-03-12 08:40:48 +01:00
return Player . sleeves [ sleeveNumber ] . workForFaction ( Player , factionName , workType ) ;
} ,
2019-05-05 06:03:40 +02:00
setToGymWorkout : function ( sleeveNumber = 0 , gymName = "" , stat = "" ) {
2019-03-13 00:35:44 +01:00
if ( Player . bitNodeN !== 10 && ! SourceFileFlags [ 10 ] ) {
2019-03-18 06:04:12 +01:00
throw makeRuntimeRejectMsg ( workerScript , "setToGymWorkout() failed because you do not currently have access to the Sleeve API. This is either because you are not in BitNode-10 or because you do not have Source-File 10" ) ;
2019-03-13 00:05:38 +01:00
}
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "setToGymWorkout" , getRamCost ( "sleeve" , "setToGymWorkout" ) ) ;
2019-03-12 08:40:48 +01:00
if ( sleeveNumber >= Player . sleeves . length || sleeveNumber < 0 ) {
2019-03-18 06:04:12 +01:00
workerScript . log ( ` ERROR: sleeve.setToGymWorkout( ${ sleeveNumber } ) failed because it is an invalid sleeve number. ` ) ;
2019-03-12 08:40:48 +01:00
return false ;
}
return Player . sleeves [ sleeveNumber ] . workoutAtGym ( Player , gymName , stat ) ;
} ,
2019-05-05 06:03:40 +02:00
getSleeveStats : function ( sleeveNumber = 0 ) {
2019-03-13 00:35:44 +01:00
if ( Player . bitNodeN !== 10 && ! SourceFileFlags [ 10 ] ) {
2019-03-13 00:05:38 +01:00
throw makeRuntimeRejectMsg ( workerScript , "getStats() failed because you do not currently have access to the Sleeve API. This is either because you are not in BitNode-10 or because you do not have Source-File 10" ) ;
}
2019-05-10 11:24:50 +02:00
updateDynamicRam ( "getSleeveStats" , getRamCost ( "sleeve" , "getSleeveStats" ) ) ;
2019-03-12 23:10:12 +01:00
if ( sleeveNumber >= Player . sleeves . length || sleeveNumber < 0 ) {
workerScript . log ( ` ERROR: sleeve.workoutAtGym( ${ sleeveNumber } ) failed because it is an invalid sleeve number. ` ) ;
return false ;
}
2019-03-24 03:40:35 +01:00
const sl = Player . sleeves [ sleeveNumber ] ;
2019-03-12 23:10:12 +01:00
return {
2019-03-24 03:40:35 +01:00
shock : 100 - sl . shock ,
2019-03-12 23:10:12 +01:00
sync : sl . sync ,
hacking _skill : sl . hacking _skill ,
strength : sl . strength ,
defense : sl . defense ,
dexterity : sl . dexterity ,
agility : sl . agility ,
charisma : sl . charisma ,
} ;
} ,
2019-05-05 06:03:40 +02:00
getTask : function ( sleeveNumber = 0 ) {
2019-03-13 00:35:44 +01:00
if ( Player . bitNodeN !== 10 && ! SourceFileFlags [ 10 ] ) {
2019-03-13 00:05:38 +01:00
throw makeRuntimeRejectMsg ( workerScript , "getTask() failed because you do not currently have access to the Sleeve API. This is either because you are not in BitNode-10 or because you do not have Source-File 10" ) ;
}
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "getTask" , getRamCost ( "sleeve" , "getTask" ) ) ;
2019-03-12 23:10:12 +01:00
if ( sleeveNumber >= Player . sleeves . length || sleeveNumber < 0 ) {
workerScript . log ( ` ERROR: sleeve.getTask( ${ sleeveNumber } ) failed because it is an invalid sleeve number. ` ) ;
return false ;
}
const sl = Player . sleeves [ sleeveNumber ] ;
return {
task : SleeveTaskType [ sl . currentTask ] ,
crime : sl . crimeType ,
location : sl . currentTaskLocation ,
gymStatType : sl . gymStatType ,
factionWorkType : FactionWorkType [ sl . factionWorkType ] ,
} ;
} ,
2019-05-05 06:03:40 +02:00
getInformation : function ( sleeveNumber = 0 ) {
2019-03-13 00:35:44 +01:00
if ( Player . bitNodeN !== 10 && ! SourceFileFlags [ 10 ] ) {
2019-03-13 00:05:38 +01:00
throw makeRuntimeRejectMsg ( workerScript , "getInformation() failed because you do not currently have access to the Sleeve API. This is either because you are not in BitNode-10 or because you do not have Source-File 10" ) ;
}
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "getInformation" , getRamCost ( "sleeve" , "getInformation" ) ) ;
2019-03-12 23:10:12 +01:00
if ( sleeveNumber >= Player . sleeves . length || sleeveNumber < 0 ) {
workerScript . log ( ` ERROR: sleeve.getInformation( ${ sleeveNumber } ) failed because it is an invalid sleeve number. ` ) ;
return false ;
}
const sl = Player . sleeves [ sleeveNumber ] ;
return {
city : sl . city ,
hp : sl . hp ,
jobs : Object . keys ( Player . jobs ) , // technically sleeves have the same jobs as the player.
2019-03-18 06:04:12 +01:00
jobTitle : Object . values ( Player . jobs ) ,
2019-03-12 23:10:12 +01:00
maxHp : sl . max _hp ,
tor : SpecialServerIps . hasOwnProperty ( "Darkweb Server" ) , // There's no reason not to give that infomation here as well. Worst case scenario it isn't used.
mult : {
agility : sl . agility _mult ,
agilityExp : sl . agility _exp _mult ,
companyRep : sl . company _rep _mult ,
crimeMoney : sl . crime _money _mult ,
crimeSuccess : sl . crime _success _mult ,
defense : sl . defense _mult ,
defenseExp : sl . defense _exp _mult ,
dexterity : sl . dexterity _mult ,
dexterityExp : sl . dexterity _exp _mult ,
factionRep : sl . faction _rep _mult ,
hacking : sl . hacking _mult ,
hackingExp : sl . hacking _exp _mult ,
strength : sl . strength _mult ,
strengthExp : sl . strength _exp _mult ,
workMoney : sl . work _money _mult ,
} ,
timeWorked : sl . currentTaskTime ,
earningsForSleeves : {
workHackExpGain : sl . earningsForSleeves . hack ,
workStrExpGain : sl . earningsForSleeves . str ,
workDefExpGain : sl . earningsForSleeves . def ,
workDexExpGain : sl . earningsForSleeves . dex ,
workAgiExpGain : sl . earningsForSleeves . agi ,
workChaExpGain : sl . earningsForSleeves . cha ,
workMoneyGain : sl . earningsForSleeves . money ,
} ,
earningsForPlayer : {
workHackExpGain : sl . earningsForPlayer . hack ,
workStrExpGain : sl . earningsForPlayer . str ,
workDefExpGain : sl . earningsForPlayer . def ,
workDexExpGain : sl . earningsForPlayer . dex ,
workAgiExpGain : sl . earningsForPlayer . agi ,
workChaExpGain : sl . earningsForPlayer . cha ,
workMoneyGain : sl . earningsForPlayer . money ,
} ,
earningsForTask : {
workHackExpGain : sl . earningsForTask . hack ,
workStrExpGain : sl . earningsForTask . str ,
workDefExpGain : sl . earningsForTask . def ,
workDexExpGain : sl . earningsForTask . dex ,
workAgiExpGain : sl . earningsForTask . agi ,
workChaExpGain : sl . earningsForTask . cha ,
workMoneyGain : sl . earningsForTask . money ,
} ,
2019-04-30 05:54:20 +02:00
workRepGain : sl . getRepGain ( Player ) ,
2019-03-12 23:10:12 +01:00
}
} ,
2019-05-05 06:03:40 +02:00
getSleeveAugmentations : function ( sleeveNumber = 0 ) {
2019-03-23 05:22:40 +01:00
if ( Player . bitNodeN !== 10 && ! SourceFileFlags [ 10 ] ) {
throw makeRuntimeRejectMsg ( workerScript , "getSleeveAugmentations() failed because you do not currently have access to the Sleeve API. This is either because you are not in BitNode-10 or because you do not have Source-File 10" ) ;
}
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "getSleeveAugmentations" , getRamCost ( "sleeve" , "getSleeveAugmentations" ) ) ;
2019-03-23 05:22:40 +01:00
if ( sleeveNumber >= Player . sleeves . length || sleeveNumber < 0 ) {
workerScript . log ( ` ERROR: sleeve.getSleeveAugmentations( ${ sleeveNumber } ) failed because it is an invalid sleeve number. ` ) ;
return [ ] ;
}
const augs = [ ] ;
for ( let i = 0 ; i < Player . sleeves [ sleeveNumber ] . augmentations . length ; i ++ ) {
augs . push ( Player . sleeves [ sleeveNumber ] . augmentations [ i ] . name ) ;
}
return augs ;
} ,
2019-05-05 06:03:40 +02:00
getSleevePurchasableAugs : function ( sleeveNumber = 0 ) {
2019-03-23 05:22:40 +01:00
if ( Player . bitNodeN !== 10 && ! SourceFileFlags [ 10 ] ) {
throw makeRuntimeRejectMsg ( workerScript , "getSleevePurchasableAugs() failed because you do not currently have access to the Sleeve API. This is either because you are not in BitNode-10 or because you do not have Source-File 10" ) ;
}
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "getSleevePurchasableAugs" , getRamCost ( "sleeve" , "getSleevePurchasableAugs" ) ) ;
2019-03-23 05:22:40 +01:00
if ( sleeveNumber >= Player . sleeves . length || sleeveNumber < 0 ) {
workerScript . log ( ` ERROR: sleeve.getSleevePurchasableAugs( ${ sleeveNumber } ) failed because it is an invalid sleeve number. ` ) ;
return [ ] ;
}
const purchasableAugs = findSleevePurchasableAugs ( Player . sleeves [ sleeveNumber ] , Player ) ;
const augs = [ ] ;
for ( let i = 0 ; i < purchasableAugs . length ; i ++ ) {
const aug = purchasableAugs [ i ] ;
augs . push ( {
name : aug . name ,
cost : aug . startingCost ,
} ) ;
}
return augs ;
} ,
2019-05-05 06:03:40 +02:00
purchaseSleeveAug : function ( sleeveNumber = 0 , augName = "" ) {
2019-03-23 05:22:40 +01:00
if ( Player . bitNodeN !== 10 && ! SourceFileFlags [ 10 ] ) {
throw makeRuntimeRejectMsg ( workerScript , "purchaseSleeveAug() failed because you do not currently have access to the Sleeve API. This is either because you are not in BitNode-10 or because you do not have Source-File 10" ) ;
}
2019-05-05 06:03:40 +02:00
updateDynamicRam ( "purchaseSleeveAug" , getRamCost ( "sleeve" , "purchaseSleeveAug" ) ) ;
2019-03-23 05:22:40 +01:00
if ( sleeveNumber >= Player . sleeves . length || sleeveNumber < 0 ) {
workerScript . log ( ` ERROR: sleeve.purchaseSleeveAug( ${ sleeveNumber } ) failed because it is an invalid sleeve number. ` ) ;
return false ;
}
const aug = Augmentations [ augName ] ;
if ( ! aug ) {
workerScript . log ( ` ERROR: sleeve.purchaseSleeveAug( ${ sleeveNumber } ) failed because ${ augName } is not a valid aug. ` ) ;
}
return Player . sleeves [ sleeveNumber ] . tryBuyAugmentation ( Player , aug ) ;
}
2019-04-13 09:33:30 +02:00
} , // End sleeve
heart : {
// Easter egg function
2019-05-05 06:03:40 +02:00
break : function ( ) {
2019-04-13 09:33:30 +02:00
return Player . karma ;
}
}
2019-04-13 03:22:46 +02:00
} // End return
} // End NetscriptFunction()
2017-08-30 19:44:29 +02:00
2019-05-05 06:03:40 +02:00
export { NetscriptFunctions } ;