Merge pull request #172 from danielyxie/dev

Minor bug fixes, adding spotify music player, and adding sphinx docum…
This commit is contained in:
danielyxie 2018-01-09 14:58:34 -06:00 committed by GitHub
commit ae053f3f57
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
87 changed files with 23934 additions and 34 deletions

52
dist/bundle.js vendored

@ -3247,7 +3247,7 @@ let CONSTANTS = {
"kill('foo.script', getHostname(), 1, 'foodnstuff');<br><br>" + "kill('foo.script', getHostname(), 1, 'foodnstuff');<br><br>" +
"<i><u>killall(hostname/ip)</u></i><br> Kills all running scripts on the specified server. This function takes a single argument which " + "<i><u>killall(hostname/ip)</u></i><br> Kills all running scripts on the specified server. This function takes a single argument which " +
"must be a string containing the hostname or IP of the target server. This function will always return true. <br><br>" + "must be a string containing the hostname or IP of the target server. This function will always return true. <br><br>" +
"<i><u>exit()</u></i><br>Terminates the script immediately<br><br>" + "<i><u>exit()</u></i><br>Terminates the script immediately<br><br>" +
"<i><u>scp(script, [source], destination)</u></i><br>Copies a script or literature (.lit) file to another server. The first argument is a string with " + "<i><u>scp(script, [source], destination)</u></i><br>Copies a script or literature (.lit) file to another server. The first argument is a string with " +
"the filename of the script or literature file " + "the filename of the script or literature file " +
"to be copied, or an array of filenames to be copied. The next two arguments are strings containing the hostname/IPs of the source and target server. " + "to be copied, or an array of filenames to be copied. The next two arguments are strings containing the hostname/IPs of the source and target server. " +
@ -3839,6 +3839,9 @@ let CONSTANTS = {
"World Stock Exchange account and TIX API Access<br>", "World Stock Exchange account and TIX API Access<br>",
LatestUpdate: LatestUpdate:
"v0.34.1<br>" +
"-Added new 'secret' Terminal command. Try: run musicplayer<br>" +
"v0.34.0<br>" + "v0.34.0<br>" +
"-Added clear() and exit() Netscript functions<br>" + "-Added clear() and exit() Netscript functions<br>" +
"-When starting out or prestiging, you will now receive a 'Hacking Starter Guide'. It provides tips/pointers for new players<br>" + "-When starting out or prestiging, you will now receive a 'Hacking Starter Guide'. It provides tips/pointers for new players<br>" +
@ -17377,6 +17380,12 @@ function runScriptsLoop() {
var ip = workerScripts[i].serverIp; var ip = workerScripts[i].serverIp;
var name = workerScripts[i].name; var name = workerScripts[i].name;
//Free RAM
__WEBPACK_IMPORTED_MODULE_5__Server_js__["b" /* AllServers */][ip].ramUsed -= workerScripts[i].ramUsage;
//Delete script from Active Scripts
Object(__WEBPACK_IMPORTED_MODULE_0__ActiveScriptsUI_js__["b" /* deleteActiveScriptsItem */])(workerScripts[i]);
for (var j = 0; j < __WEBPACK_IMPORTED_MODULE_5__Server_js__["b" /* AllServers */][ip].runningScripts.length; j++) { for (var j = 0; j < __WEBPACK_IMPORTED_MODULE_5__Server_js__["b" /* AllServers */][ip].runningScripts.length; j++) {
if (__WEBPACK_IMPORTED_MODULE_5__Server_js__["b" /* AllServers */][ip].runningScripts[j].filename == name && if (__WEBPACK_IMPORTED_MODULE_5__Server_js__["b" /* AllServers */][ip].runningScripts[j].filename == name &&
Object(__WEBPACK_IMPORTED_MODULE_9__utils_HelperFunctions_js__["d" /* compareArrays */])(__WEBPACK_IMPORTED_MODULE_5__Server_js__["b" /* AllServers */][ip].runningScripts[j].args, workerScripts[i].args)) { Object(__WEBPACK_IMPORTED_MODULE_9__utils_HelperFunctions_js__["d" /* compareArrays */])(__WEBPACK_IMPORTED_MODULE_5__Server_js__["b" /* AllServers */][ip].runningScripts[j].args, workerScripts[i].args)) {
@ -17385,12 +17394,6 @@ function runScriptsLoop() {
} }
} }
//Free RAM
__WEBPACK_IMPORTED_MODULE_5__Server_js__["b" /* AllServers */][ip].ramUsed -= workerScripts[i].ramUsage;
//Delete script from Active Scripts
Object(__WEBPACK_IMPORTED_MODULE_0__ActiveScriptsUI_js__["b" /* deleteActiveScriptsItem */])(workerScripts[i]);
//Delete script from workerScripts //Delete script from workerScripts
workerScripts.splice(i, 1); workerScripts.splice(i, 1);
} }
@ -28674,6 +28677,13 @@ let Terminal = {
post("Incorrect number of arguments. Usage: run [program/script] [-t] [num threads] [arg1] [arg2]..."); post("Incorrect number of arguments. Usage: run [program/script] [-t] [num threads] [arg1] [arg2]...");
} else { } else {
var executableName = commandArray[1]; var executableName = commandArray[1];
//Music player!
if (executableName === "musicplayer") {
post('<iframe src="https://open.spotify.com/embed/user/danielyxie/playlist/1ORnnL6YNvXOracUaUV2kh" width="300" height="380" frameborder="0" allowtransparency="true"></iframe>', false);
return;
}
//Check if its a script or just a program/executable //Check if its a script or just a program/executable
if (executableName.indexOf(".script") == -1) { if (executableName.indexOf(".script") == -1) {
//Not a script //Not a script
@ -28865,9 +28875,9 @@ let Terminal = {
post("Theme not found"); post("Theme not found");
} }
}else{ }else{
inputBackgroundHex = args[0]; var inputBackgroundHex = args[0];
inputTextHex = args[1]; var inputTextHex = args[1];
inputHighlightHex = args[2]; var inputHighlightHex = args[2];
if(/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(inputBackgroundHex) && if(/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(inputBackgroundHex) &&
/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(inputTextHex) && /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(inputTextHex) &&
/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(inputHighlightHex)){ /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(inputHighlightHex)){
@ -34534,10 +34544,9 @@ function addActiveScriptsItem(workerscript) {
//Create the element itself. Each element is an accordion collapsible //Create the element itself. Each element is an accordion collapsible
var itemNameArray = ["active", "scripts", server.hostname, workerscript.name]; var itemNameArray = ["active", "scripts", server.hostname, workerscript.name];
for (var i = 0; i < workerscript.args.length; ++i) { for (var i = 0; i < workerscript.args.length; ++i) {
itemNameArray.push(workerscript.args[i].toString()); itemNameArray.push(String(workerscript.args[i]));
} }
var itemName = itemNameArray.join("-"); var itemName = itemNameArray.join("-");
//var itemName = "active-scripts-" + server.hostname + "-" + workerscript.name;
var item = document.createElement("li"); var item = document.createElement("li");
item.setAttribute("id", itemName); item.setAttribute("id", itemName);
@ -34569,10 +34578,9 @@ function deleteActiveScriptsItem(workerscript) {
} }
var itemNameArray = ["active", "scripts", server.hostname, workerscript.name]; var itemNameArray = ["active", "scripts", server.hostname, workerscript.name];
for (var i = 0; i < workerscript.args.length; ++i) { for (var i = 0; i < workerscript.args.length; ++i) {
itemNameArray.push(workerscript.args[i].toString()); itemNameArray.push(String(workerscript.args[i]));
} }
var itemName = itemNameArray.join("-"); var itemName = itemNameArray.join("-");
//var itemName = "active-scripts-" + server.hostname + "-" + workerscript.name;
var li = document.getElementById(itemName); var li = document.getElementById(itemName);
if (li == null) { if (li == null) {
console.log("could not find Active scripts li element for: " + workerscript.name); console.log("could not find Active scripts li element for: " + workerscript.name);
@ -34605,7 +34613,7 @@ function updateActiveScriptsItemContent(workerscript) {
} }
var itemNameArray = ["active", "scripts", server.hostname, workerscript.name]; var itemNameArray = ["active", "scripts", server.hostname, workerscript.name];
for (var i = 0; i < workerscript.args.length; ++i) { for (var i = 0; i < workerscript.args.length; ++i) {
itemNameArray.push(workerscript.args[i].toString()); itemNameArray.push(String(workerscript.args[i]));
} }
var itemName = itemNameArray.join("-"); var itemName = itemNameArray.join("-");
var itemContent = document.getElementById(itemName + "-content") var itemContent = document.getElementById(itemName + "-content")
@ -41355,17 +41363,21 @@ Corporation.prototype.displayCorporationOverviewContent = function() {
display:"inline-block", display:"inline-block",
clickListener:()=>{ clickListener:()=>{
var shares = Math.round(input.value); var shares = Math.round(input.value);
var tempStockPrice = this.sharePrice;
if (isNaN(shares)) { if (isNaN(shares)) {
Object(__WEBPACK_IMPORTED_MODULE_4__utils_DialogBox_js__["a" /* dialogBoxCreate */])("ERROR: Invalid value for number of shares"); Object(__WEBPACK_IMPORTED_MODULE_4__utils_DialogBox_js__["a" /* dialogBoxCreate */])("ERROR: Invalid value for number of shares");
} else if (shares > this.issuedShares) { } else if (shares > this.issuedShares) {
Object(__WEBPACK_IMPORTED_MODULE_4__utils_DialogBox_js__["a" /* dialogBoxCreate */])("ERROR: There are not this many oustanding shares to buy back"); Object(__WEBPACK_IMPORTED_MODULE_4__utils_DialogBox_js__["a" /* dialogBoxCreate */])("ERROR: There are not this many oustanding shares to buy back");
} else if (shares * tempStockPrice > __WEBPACK_IMPORTED_MODULE_2__Player_js__["a" /* Player */].money) {
Object(__WEBPACK_IMPORTED_MODULE_4__utils_DialogBox_js__["a" /* dialogBoxCreate */])("ERROR: You do not have enough money to purchase this many shares (you need " +
__WEBPACK_IMPORTED_MODULE_7__utils_numeral_min_js___default()(shares * tempStockPrice).format("$0.000a") + ")");
} else { } else {
this.numShares += shares; this.numShares += shares;
this.issuedShares -= shares; this.issuedShares -= shares;
//TODO REMOVE from Player money //TODO REMOVE from Player money
Object(__WEBPACK_IMPORTED_MODULE_5__utils_HelperFunctions_js__["l" /* removeElementById */])(popupId); Object(__WEBPACK_IMPORTED_MODULE_5__utils_HelperFunctions_js__["l" /* removeElementById */])(popupId);
return false;
} }
return false;
} }
}); });
@ -44258,7 +44270,8 @@ HacknetNode.prototype.updateMoneyGainRate = function() {
} }
HacknetNode.prototype.calculateLevelUpgradeCost = function(levels=1) { HacknetNode.prototype.calculateLevelUpgradeCost = function(levels=1) {
if (levels < 1) {return 0;} levels = Math.round(levels);
if (isNaN(levels) || levels < 1) {return 0;}
var mult = __WEBPACK_IMPORTED_MODULE_1__Constants_js__["a" /* CONSTANTS */].HacknetNodeUpgradeLevelMult; var mult = __WEBPACK_IMPORTED_MODULE_1__Constants_js__["a" /* CONSTANTS */].HacknetNodeUpgradeLevelMult;
var totalMultiplier = 0; //Summed var totalMultiplier = 0; //Summed
var currLevel = this.level; var currLevel = this.level;
@ -103716,7 +103729,12 @@ BitburnerSaveObject.prototype.exportGame = function() {
this.AliasesSave = JSON.stringify(__WEBPACK_IMPORTED_MODULE_0__Alias_js__["a" /* Aliases */]); this.AliasesSave = JSON.stringify(__WEBPACK_IMPORTED_MODULE_0__Alias_js__["a" /* Aliases */]);
this.GlobalAliasesSave = JSON.stringify(__WEBPACK_IMPORTED_MODULE_0__Alias_js__["b" /* GlobalAliases */]); this.GlobalAliasesSave = JSON.stringify(__WEBPACK_IMPORTED_MODULE_0__Alias_js__["b" /* GlobalAliases */]);
this.MessagesSave = JSON.stringify(__WEBPACK_IMPORTED_MODULE_7__Message_js__["b" /* Messages */]); this.MessagesSave = JSON.stringify(__WEBPACK_IMPORTED_MODULE_7__Message_js__["b" /* Messages */]);
this.StockMarketSave = JSON.stringify(__WEBPACK_IMPORTED_MODULE_13__StockMarket_js__["c" /* StockMarket */]);
this.SettingsSave = JSON.stringify(__WEBPACK_IMPORTED_MODULE_11__Settings_js__["a" /* Settings */]);
this.VersionSave = JSON.stringify(__WEBPACK_IMPORTED_MODULE_2__Constants_js__["a" /* CONSTANTS */].Version); this.VersionSave = JSON.stringify(__WEBPACK_IMPORTED_MODULE_2__Constants_js__["a" /* CONSTANTS */].Version);
if (__WEBPACK_IMPORTED_MODULE_8__Player_js__["a" /* Player */].bitNodeN == 2 && __WEBPACK_IMPORTED_MODULE_8__Player_js__["a" /* Player */].inGang()) {
this.AllGangsSave = JSON.stringify(__WEBPACK_IMPORTED_MODULE_5__Gang_js__["a" /* AllGangs */]);
}
var saveString = btoa(unescape(encodeURIComponent(JSON.stringify(this)))); var saveString = btoa(unescape(encodeURIComponent(JSON.stringify(this))));
var filename = "bitburnerSave.json"; var filename = "bitburnerSave.json";

20
doc/Makefile Normal file

@ -0,0 +1,20 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = python -msphinx
SPHINXPROJ = Bitburner
SOURCEDIR = source
BUILDDIR = build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

BIN
doc/build/doctrees/environment.pickle vendored Normal file

Binary file not shown.

BIN
doc/build/doctrees/index.doctree vendored Normal file

Binary file not shown.

BIN
doc/build/doctrees/netscript.doctree vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

4
doc/build/html/.buildinfo vendored Normal file

@ -0,0 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 2dc85c27d5b3eafd764454e0cb5932ea
tags: 645f666f9bcd5a90fca523b33c5a78b7

0
doc/build/html/.nojekyll vendored Normal file

31
doc/build/html/_sources/index.rst.txt vendored Normal file

@ -0,0 +1,31 @@
.. Bitburner documentation master file, created by
sphinx-quickstart on Wed Oct 4 15:03:07 2017.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to Bitburner's documentation!
=====================================
Bitburner is a cyberpunk-themed `incremental game <https://en.wikipedia.org/wiki/Incremental_game>`_ that is currently in the
early beta stage of development. The game `can be played here <https://danielyxie.github.io/bitburner/>`_.
What is Bitburner?
------------------
Bitburner is a cyberpunk-themed incremental RPG where you, the player, take the role of an unknown hacker in a dark, dystopian world.
When a mysterious hacker called jump3R messages you, he/she confirms your suspicions that there is something wrong with the world around you.
Now, aided by jump3R, you embark on a quest to gain money and power by any means necessary, in the hopes that this will lead to to uncover the
secrets that you've been searching for.
.. toctree::
:maxdepth: 5
:caption: Contents:
Netscript <netscript>
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

@ -0,0 +1,25 @@
Netscript Documentation
=======================
Netscript is the programming language used in the world of Bitburner.
When you write scripts in Bitburner, they are written in the Netscript language.
Netscript is simply a tiny subset of Javascript. This means that Netscript's
syntax is almost idental to Javascript's, but it does not implement many of the
features that Javascript has.
If you have any requests or suggestions to improve the Netscript language, feel free
to reach out to the developer!
.. toctree::
:maxdepth: 5
:caption: Sections:
Data Types and Variables <netscriptdatatypes>
Operators <netscriptoperators>
Loops and Conditionals <netscriptloopsandconditionals>
Script Arguments <netscriptscriptarguments>
Basic Functions <netscriptfunctions>
Advanced Functions <netscriptadvancedfunctions>
Hacknet Node API <netscripthacknetnodeapi>
Trade Information eXchange (TIX) API <netscriptixapi>
Singularity Functions <netscriptsingularityfunctions>

@ -0,0 +1,45 @@
Netscript Advanced Functions
============================
These Netscript functions become relevant later on in the game. They are put on a separate page because
they contain spoilers for the game.
getBitNodeMultipliers
^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getBitNodeMultipliers()
Returns an object containing the current BitNode multipliers. This function requires Source-File 5 in order
to run. The multipliers are returned in integer forms (e.g. 1.5 instead of 150%). The multipliers represent
the difference between the current BitNode and the original BitNode (BitNode-1). For example, if the
*CrimeMoney* multiplier has a value of 0.1, then that means that committing crimes in the current BitNode
will only give 10% of the money you would have received in BitNode-1. The object has the following structure,
(subject to change in the future)::
{
ServerMaxMoney: 1,
ServerStartingMoney: 1,
ServerGrowthRate: 1,
ServerWeakenRate: 1,
ServerStartingSecurity: 1,
ManualHackMoney: 1,
ScriptHackMoney: 1,
CompanyWorkMoney: 1,
CrimeMoney: 1,
HacknetNodeMoney: 1,
CompanyWorkExpGain: 1,
ClassGymExpGain: 1,
FactionWorkExpGain: 1,
HackExpGain: 1,
CrimeExpGain: 1,
FactionWorkRepGain: 1,
FactionPassiveRepGain: 1,
AugmentationRepCost: 1,
AugmentationMoneyCost: 1,
}
Example::
mults = getBitNodeMultipliers();
print(mults.ServerMaxMoney);
print(mults.HackExpGain);

@ -0,0 +1,44 @@
Netscript Data Types and Variables
==================================
Data Types
----------
Netscript supports three primitive data types:
**Numbers** - Positive numerics, such as integers and floats. Examples: 6, 0, 10.5
**Strings** - A sequence of characters that represents text. The characters must be encapsulated by single or
double quotes. Example: "This is a string" or equivalently 'This is a string'.
*Strings are fully functional* `Javascript strings <https://www.w3schools.com/jsref/jsref_obj_string.asp>`_,
*which means that all of the member functions of Javascript strings such as toLowerCase() and includes() are also available in Netscript!*
**Boolean** - true or false
**Array** - An array is a special container object that is capable of holding many different values. Arrays are simply Javascript
arrays, and most Javascript array methods can be used in Netscript as well (join(), pop(), splice(), etc.). You can read more about
`Javascript arrays here <https://www.w3schools.com/js/js_arrays.asp>`_
Variables
---------
Variables can be thought of as named containers. Their purpose is to label and store data. The data stored in the
variable can then be accessed and changed by referring to the variable's name. The name of a variable must start with
either a letter or an underscore. The rest of the variable name can contain any alphanumeric (letters and numbers),
as well as hyphens and underscores.
The Netscript language is untyped, meaning that any variable can hold any of the data types above. The value type of a variable
can also change. For example, if a variable initially holds a number, it can later hold a string.
The following shows how you can declare and initialize variables::
i = 1;
s = "This is a string";
b = false;
After declaring a variable, the values in variables can be used simply by referencing the name. For example::
j = i + 5;
s2 = s + " Adding more letters onto the string"
The first command above will store the value 6 in the variable j. The second command will store the string "This is a string Adding more letters onto the string" into the variable s2.

@ -0,0 +1,889 @@
Netscript Basic Functions
=========================
This page contains the complete documentation for all functions that are available in Netscript.
This includes information such as function signatures, what they do, and their return values.
At the end is also a section that describes how to define your own functions in Netscript.
hack
^^^^
.. js:function:: hack(hostname/ip)
:param string hostname/ip: IP or hostname of the target server to hack
:returns: True if the hack is successful, false otherwise
Function that is used to try and hack servers to steal money and gain hacking experience. The runtime for this command depends
on your hacking level and the target server's security level. In order to hack a server you must first gain root access
to that server and also have the required hacking level.
A script can hack a server from anywhere. It does not need to be running on the same server to hack that server. For example,
you can create a script that hacks the 'foodnstuff' server and run that script on any server in the game.
A successful hack() on a server will raise that server's security level by 0.002.
Example::
hack("foodnstuff");
hack("10.1.2.3");
grow
^^^^
.. js:function:: grow(hostname/ip)
:param string hostname/ip: IP or hostname of the target server to grow
:returns: The number by which the money on the server was multiplied for the growth
Use your hacking skills to increase the amount of money available on a server. The runtime for this command depends on your hacking
level and the target server's security level. When grow() completes, the money available on a target server will be increased by a
certain, fixed percentage. This percentage is determined by the target server's growth rate (which varies between servers) and security level.
Generally, higher-level servers have higher growth rates. The getServerGrowth() function can be used to obtain a server's growth rate.
Like hack(), grow() can be called on any server, regardless of where the script is running. The grow() command requires
root access to the target server, but there is no required hacking level to run the command. It also raises the security level
of the target server by 0.004.
Example::
grow("foodnstuff");
weaken
^^^^^^
.. js:function:: weaken(hostname/ip)
:param string hostname.ip: IP or hostname of the target server to weaken
:returns: The amount by which the target server's security level was decreased. This is equivalent to 0.05 multiplied
by the number of script threads
Use your hacking skills to attack a server's security, lowering the server's security level. The runtime for this command
depends on your hacking level and the target server's security level. This function lowers the security level of the target
server by 0.05.
Like hack() and grow(), weaken() can be called on any server, regardless of where the script is running. This command requires
root access to the target server, but there is no required hacking level to run the command.
Example::
weaken("foodnstuff");
sleep
^^^^^
.. js:function:: sleep(n[, log=true])
:param number n: Number of milliseconds to sleep
:param boolean log: Optional boolean specifying whether or not to log the action
Suspends the script for n milliseconds.
print
^^^^^
.. js:function:: print(x)
:param x: Value to be printed
Prints a value or a variable to the script's logs.
tprint
^^^^^^
.. js:function:: tprint(x)
:param x: Value to be printed
Prints a value or a variable to the Terminal
scan
^^^^
.. js:function:: scan(hostname/ip[, hostnames=true])
:param string hostname/ip: IP or hostname of the server to scan
:param boolean: Optional boolean specifying whether the function should output hostnames (if true) or IP addresses (if false)
Returns an array containing the hostnames or IPs of all servers that are one node way from the specified target server. The
hostnames/IPs in the returned array are strings.
nuke
^^^^
.. js:function:: nuke(hostname/ip)
:param string hostname/ip: IP or hostname of the target server
Runs the NUKE.exe program on the target server. NUKE.exe must exist on your home computer.
Example::
nuke("foodnstuff");
brutessh
^^^^^^^^
.. js:function:: brutessh(hostname/ip)
:param string hostname/ip: IP or hostname of the target server
Runs the BruteSSH.exe program on the target server. BruteSSH.exe must exist on your home computer.
Example::
brutessh("foodnstuff");
ftpcrack
^^^^^^^^
.. js:function:: ftpcrack(hostname/ip)
:param string hostname/ip: IP or hostname of the target server
Runs the FTPCrack.exe program on the target server. FTPCrack.exe must exist on your home computer.
Example::
ftpcrack("foodnstuff");
relaysmtp
^^^^^^^^^
.. js:function:: relaysmtp(hostname/ip)
:param string hostname/ip: IP or hostname of the target server
Runs the relaySMTP.exe program on the target server. relaySMTP.exe must exist on your home computer.
Example::
relaysmtp("foodnstuff");
httpworm
^^^^^^^^
.. js:function:: httpworm(hostname/ip)
:param string hostname/ip: IP or hostname of the target server
Runs the HTTPWorm.exe program on the target server. HTTPWorm.exe must exist on your home computer.
Example::
httpworm("foodnstuff");
sqlinject
^^^^^^^^^
.. js:function:: sqlinject(hostname/ip)
:param string hostname/ip: IP or hostname of the target server
Runs the SQLInject.exe program on the target server. SQLInject.exe must exist on your home computer.
Example::
sqlinject("foodnstuff");
run
^^^
.. js:function:: run(script, [numThreads=1], [args...])
:param string script: Filename of script to run
:param number numThreads: Optional thread count for new script. Set to 1 by default. Will be rounded to nearest integer
:param args...:
Additional arguments to pass into the new script that is being run. Note that if any arguments are being
passed into the new script, then the second argument *numThreads* must be filled in with a value.
Run a script as a separate process. This function can only be used to run scripts located on the current server (the server
running the script that calls this function).
Returns true if the script is successfully started, and false otherwise. Requires a significant amount of RAM to run this
command.
The simplest way to use the *run* command is to call it with just the script name. The following example will run
'foo.script' single-threaded with no arguments::
run("foo.script");
The following example will run 'foo.script' but with 5 threads instead of single-threaded::
run("foo.script", 5);
This next example will run 'foo.script' single-threaded, and will pass the string 'foodnstuff' into the script
as an argument::
run("foo.script", 1, 'foodnstuff');
exec
^^^^
.. js:function:: exec(script, hostname/ip, [numThreads=1], [args...])
:param string script: Filename of script to execute
:param string hostname/ip: IP or hostname of the 'target server' on which to execute the script
:param number numThreads: Optional thread count for new script. Set to 1 by default. Will be rounded to nearest integer
:param args...:
Additional arguments to pass into the new script that is being run. Note that if any arguments are being
passed into the new script, then the third argument *numThreads* must be filled in with a value.
Run a script as a separate process on a specified server. This is similar to the *run* function except
that it can be used to run a script on any server, instead of just the current server.
Returns true if the script is successfully started, and false otherwise.
The simplest way to use the *exec* command is to call it with just the script name and the target server.
The following example will try to run *generic-hack.script* on the *foodnstuff* server::
exec("generic-hack.script", "foodnstuff");
The following example will try to run the script *generic-hack.script* on the *joesguns* server with 10 threads::
exec("generic-hack.script", "joesguns", 10);
This last example will try to run the script *foo.script* on the *foodnstuff* server with 5 threads. It will also pass
the number 1 and the string "test" in as arguments to the script::
exec("foo.script", "foodnstuff", 5, 1, "test");
kill
^^^^
.. js:function:: kill(script, hostname/ip, [args...])
:param string script: Filename of the script to kill
:param string hostname/ip: IP or hostname of the server on which to kill the script
:param args...: Arguments to identify which script to kill
Kills the script on the target server specified by the script's name and arguments. Remember that scripts
are uniquely identified by both their name and arguments. For example, if *foo.script* is run with the argument 1, then this
is not the same as *foo.script* run with the argument 2, even though they have the same code.
If this function successfully kills the specified script, then it will return true. Otherwise, it will return false.
Examples:
The following example will try to kill a script named *foo.script* on the *foodnstuff* server that was ran with no arguments::
kill("foo.script", "foodnstuff");
The following will try to kill a script named *foo.script* on the current server that was ran with no arguments::
kill("foo.script", getHostname());
The following will try to kill a script named *foo.script* on the current server that was ran with the arguments 1 and "foodnstuff"::
kill("foo.script", getHostname(), 1, "foodnstuff");
killall
^^^^^^^
.. js:function:: killall(hostname/ip)
:param string hostname/ip: IP or hostname of the server on which to kill all scripts
Kills all running scripts on the specified server. This function will always return true.
exit
^^^^
.. js:function:: exit()
Terminates the current script immediately
scp
^^^
.. js:function:: scp(files, [source], destination)
:param string/array files: Filename or an array of filenames of script/literature files to copy
:param string source:
Hostname or IP of the source server, which is the server from which the file will be copied.
This argument is optional and if it's omitted the source will be the current server.
:param string destination: Hostname or IP of the destination server, which is the server to which the file will be copied.
Copies a script or literature (.lit) file(s) to another server. The *files* argument can be either a string specifying a
single file to copy, or an array of strings specifying multiple files to copy.
Returns true if the script/literature file is successfully copied over and false otherwise. If the *files* argument is an array
then this function will return true if at least one of the files in the array is successfully copied.
Examples::
//Copies hack-template.script from the current server to foodnstuff
scp("hack-template.script", "foodnstuff");
//Copies foo.lit from the helios server to the home computer
scp("foo.lit", "helios", "home");
//Tries to copy three files from rothman-uni to home computer
files = ["foo1.lit", "foo2.script", "foo3.script"];
scp(files, "rothman-uni", "home");
ls
^^
.. js:function:: ls(hostname/ip)
:param string hostname/ip: Hostname or IP of the target server
Returns an array with the filenames of all files on the specified server (as strings). The returned array
is sorted in alphabetic order
hasRootAccess
^^^^^^^^^^^^^
.. js:function:: hasRootAccess(hostname/ip)
:param string hostname/ip: Hostname or IP of the target server
Returns a boolean indicating whether or not the player has root access to the specified target server.
Example::
if (hasRootAccess("foodnstuff") == false) {
nuke("foodnstuff");
}
getHostname
^^^^^^^^^^^
.. js:function:: getHostname()
Returns a string with the hostname of the server that the script is running on
getHackingLevel
^^^^^^^^^^^^^^^
.. js:function:: getHackingLevel()
Returns the player's current hacking level
getHackingMultipliers
^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getHackingMultipliers()
Returns an object containing the Player's hacking related multipliers. These multipliers are
returned in integer forms, not percentages (e.g. 1.5 instead of 150%). The object has the following structure::
{
chance: Player's hacking chance multiplier,
speed: Player's hacking speed multiplier,
money: Player's hacking money stolen multiplier,
growth: Player's hacking growth multiplier
}
Example of how this can be used::
mults = getHackingMultipliers();
print(mults.chance);
print(mults.growth);
getServerMoneyAvailable
^^^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getServerMoneyAvailable(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the amount of money available on a server. **Running this function on the home computer will return
the player's money.**
Example::
getServerMoneyAvailable("foodnstuff");
getServerMoneyAvailable("home"); //Returns player's money
getServerMaxMoney
^^^^^^^^^^^^^^^^^
.. js:function:: getServerMaxMoney(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the maximum amount of money that can be available on a server
getServerGrowth
^^^^^^^^^^^^^^^
.. js:function:: getServerGrowth(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the server's instrinsic "growth parameter". This growth parameter is a number
between 1 and 100 that represents how quickly the server's money grows. This parameter affects the
percentage by which the server's money is increased when using the *grow()* function. A higher
growth parameter will result in a higher percentage increase from *grow()*.
getServerSecurityLevel
^^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getServerSecurityLevel(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the security level of the target server. A server's security level is denoted by a number, typically
between 1 and 100 (but it can go above 100).
getServerBaseSecurityLevel
^^^^^^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getServerBaseSecurityLevel(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the base security level of the target server. This is the security level that the server starts out with.
This is different than *getServerSecurityLevel()* because *getServerSecurityLevel()* returns the current
security level of a server, which can constantly change due to *hack()*, *grow()*, and *weaken()*, calls on that
server. The base security level will stay the same until you reset by installing an Augmentation(s).
getServerMinSecurityLevel
^^^^^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getServerMinSecurityLevel(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the minimum security level of the target server
getServerRequiredHackingLevel
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getServerRequiredHackingLevel(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the required hacking level of the target server
getServerNumPortsRequired
^^^^^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getServerNumPortsRequired(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the number of open ports required to successfully run NUKE.exe on the specified server.
getServerRam
^^^^^^^^^^^^
.. js:function:: getServerRam(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns an array with two elements that gives information about a server's memory (RAM). The first
element in the array is the amount of RAM that the server has total (in GB). The second element in
the array is the amount of RAM that is currently being used on the server (in GB).
Example::
res = getServerRam("helios");
totalRam = res[0];
ramUsed = res[1];
serverExists
^^^^^^^^^^^^
.. js:function:: serverExists(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns a boolean denoting whether or not the specified server exists
fileExists
^^^^^^^^^^
.. js:function:: fileExists(filename, [hostname/ip])
:param string filename: Filename of file to check
:param string hostname/ip:
Hostname or IP of target server. This is optional. If it is not specified then the
function will use the current server as the target server
Returns a boolean indicating whether the specified file exists on the target server. The filename
for scripts is case-sensitive, but for other types of files it is not. For example, *fileExists("brutessh.exe")*
will work fine, even though the actual program is named "BruteSSH.exe".
If the *hostname/ip* argument is omitted, then the function will search through the current server (the server
running the script that calls this function) for the file.
Examples::
fileExists("foo.script", "foodnstuff");
fileExists("ftpcrack.exe");
The first example above will return true if the script named *foo.script* exists on the *foodnstuff* server, and false otherwise.
The second example above will return true if the current server contains the *FTPCrack.exe* program, and false otherwise.
isRunning
^^^^^^^^^
.. js:function:: isRunning(filename, hostname/ip, [args...])
:param string filename: Filename of script to check. This is case-sensitive.
:param string hostname/ip: Hostname or IP of target server
:param args...: Arguments to specify/identify which scripts to search for
Returns a boolean indicating whether the specified script is running on the target server. Remember that a script is
uniquely identified by both its name and its arguments.
**Examples:**
In this first example below, the function call will return true if there is a script named *foo.script* with no arguments
running on the *foodnstuff* server, and false otherwise::
isRunning("foo.script", "foodnstuff");
In this second example below, the function call will return true if there is a script named *foo.script* with no arguments
running on the current server, and false otherwise::
isRunning("foo.script", getHostname());
In this next example below, the function call will return true if there is a script named *foo.script* running with the arguments
1, 5, and "test" (in that order) on the *joesguns* server, and false otherwise::
isRunning("foo.script", "joesguns", 1, 5, "test");
getNextHacknetNodeCost
^^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getNextHacknetNodeCost()
Returns the cost of purchasing a new Hacknet Node
purchaseHacknetNode
^^^^^^^^^^^^^^^^^^^
.. js:function:: purchaseHacknetNode()
Purchases a new Hacknet Node. Returns a number with the index of the Hacknet Node. This index is equivalent to the number at the
end of the Hacknet Node's name (e.g The Hacknet Node named 'hacknet-node-4' will have an index of 4). If the player cannot afford
to purchase a new Hacknet Node then the function will return false.
purchaseServer
^^^^^^^^^^^^^^
.. js:function:: purchaseServer(hostname, ram)
:param string hostname: Hostname of the purchased server
:param number ram: Amount of RAM of the purchased server. Must be a power of 2 (2, 4, 8, 16, etc.)
Purchased a server with the specified hostname and amount of RAM.
The *hostname* argument can be any data type, but it will be converted to a string and have whitespace removed. Anything that resolves to an empty string will
cause the function to fail. If there is already a server with the specified hostname, then the function will automatically append
a number at the end of the *hostname* argument value until it finds a unique hostname. For example, if the script calls
*purchaseServer("foo", 4)* but a server named "foo" already exists, the it will automatically change the hostname to "foo-0". If there is already
a server with the hostname "foo-0", then it will change the hostname to "foo-1", and so on.
Note that there is a maximum limit to the amount of servers you can purchase.
Returns the hostname of the newly purchased server as a string. If the function fails to purchase a server, then it will return an
empty string. The function will fail if the arguments passed in are invalid, if the player does not have enough money to purchase
the specified server, or if the player has exceeded the maximum amount of servers.
Example::
ram = 64;
hn = "pserv-";
for (i = 0; i < 5; ++i) {
purchaseServer(hn + i, ram);
}
deleteServer
^^^^^^^^^^^^
.. js:function:: deleteServer(hostname)
:param string hostname: Hostname of the server to delete
Deletes one of your purchased servers, which is specified by its hostname.
The *hostname* argument can be any data type, but it will be converted to a string. Whitespace is automatically removed from
the string. This function will not delete a server that still has scripts running on it.
Returns true if successful, and false otherwise.
getPurchasedServers
^^^^^^^^^^^^^^^^^^^
.. js:function:: getPurchasedServers([hostname=true])
:param boolean hostname:
Specifies whether hostnames or IP addresses should be returned. If it's true then hostnames will be returned, and if false
then IPs will be returned. If this argument is omitted then it is true by default
Returns an array with either the hostnames or IPs of all of the servers you have purchased.
round
^^^^^
.. js:function:: round(n)
:param number n: Number to round
Returns the argument *n* rounded to the nearest integer. If the argument passed in is not a number, then the function will return 0.
write
^^^^^
.. js:function:: write(port/fn, data="", mode="a")
:param string/number port/fn: Port or text file that will be written to
:param string data: Data to write
:param string mode: Defines the write mode. Only valid when writing to text files.
This function can be used to either write data to a port or to a text file (.txt).
If the first argument is a number between 1 and 10, then it specifies a port and this function will write *data* to that port. Read
about how `Netscript Ports work here <http://bitburner.wikia.com/wiki/Netscript_Ports>`_. The third argument, *mode*, is not used
when writing to a port.
If the first argument is a string, then it specifies the name of a text file (.txt) and this function will write *data* to that text file. If the
specified text file does not exist, then it will be created. The third argument *mode, defines how the data will be written to the text file. If *mode*
is set to "w", then the data is written in "write" mode which means that it will overwrite all existing data on the text file. If *mode* is set to
any other value then the data will be written in "append" mode which means that the data will be added at the end of the text file.
read
^^^^
.. js:function:: read(port/fn)
:param string/number port/fn: Port or text file to read from
This function is used to read data from a port or from a text file (.txt).
If the argument *port/fn* is a number between 1 and 10, then it specifies a port and it will read data from that port. Read
about how `Netscript Ports work here <http://bitburner.wikia.com/wiki/Netscript_Ports>`_. A port is a serialized queue. This function
will remove the first element from that queue and return it. If the queue is empty, then the string "NULL PORT DATA" will be returned.
If the argument *port/fn* is a string, then it specifies the name of a text file (.txt) and this function will return the data in the specified text file. If
the text file does not exist, an empty string will be returned.
clear
^^^^^
.. js:function:: clear(port/fn)
:param string/number port/fn: Port or text file to clear
This function is used to clear data in a `Netscript Ports <http://bitburner.wikia.com/wiki/Netscript_Ports>`_ or a text file.
If the *port/fn* argument is a number between 1 and 10, then it specifies a port and will clear it (deleting all data from the underlying queue).
If the *port/fn* argument is a string, then it specifies the name of a text file (.txt) and will delete all data from that text file.
scriptRunning
^^^^^^^^^^^^^
.. js:function:: scriptRunning(scriptname, hostname/ip)
:param string scriptname: Filename of script to check. This is case-sensitive.
:param string hostname/ip: Hostname or IP of target server
Returns a boolean indicating whether any instance of the specified script is running on the target server, regardless of
its arguments.
This is different than the *isRunning()* function because it does not try to identify a specific instance of a running script
by its arguments.
**Examples:**
The example below will return true if there is any script named *foo.script* running on the *foodnstuff* server, and false otherwise::
scriptRunning("foo.script", "foodnstuff");
The example below will return true if there is any script named "foo.script" running on the current server, and false otherwise::
scriptRunning("foo.script", getHostname());
scriptKill
^^^^^^^^^^
.. js:function:: scriptKill(scriptname, hostname/ip)
:param string scriptname: Filename of script to kill. This is case-sensitive.
:param string hostname/ip: Hostname or IP of target server
Kills all scripts with the specified filename on the target server specified by *hostname/ip*, regardless of arguments. Returns
true if one or more scripts were successfully killed, and false if none were.
getScriptRam
^^^^^^^^^^^^
.. js:function:: getScriptRam(scriptname, hostname/ip)
:param string scriptname: Filename of script. This is case-sensitive.
:param string hostname/ip: Hostname or IP of target server
Returns the amount of RAM required to run the specified script on the target server
getHackTime
^^^^^^^^^^^
.. js:function:: getHackTime(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the amount of time in seconds it takes to execute the *hack()* Netscript function on the target server.
getGrowTime
^^^^^^^^^^^
.. js:function:: getGrowTime(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the amount of time in seconds it takes to execute the *grow()* Netscript function on the target server.
getWeakenTime
^^^^^^^^^^^^^
.. js:function:: getWeakenTime(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the amount of time in seconds it takes to execute the *weaken()* Netscript function on the target server.
getScriptIncome
^^^^^^^^^^^^^^^
.. js:function:: getScriptIncome([scriptname], [hostname/ip], [args...])
:param string scriptname: Filename of script
:param string hostname/ip: Server on which script is running
:param args...: Arguments that the script is running with
Returns the amount of income the specified script generates while online (when the game is open, does not apply for offline income).
Remember that a script is uniquely identified by both its name and its arguments. So for example if you ran a script with the arguments
"foodnstuff" and "5" then in order to use this function to get that script's income you must specify those same arguments in the same order
in this function call.
This function can also be called with no arguments. If called with no arguments, then this function will return an array of two values. The
first value is the total income ($ / second) of all of your active scripts (scripts that are currently running on any server). The second value
is the total income ($ / second) that you've earned from scripts since you last installed Augmentations.
getScriptExpGain
^^^^^^^^^^^^^^^^
.. js:function:: getScriptExpGain([scriptname], [hostname/ip], [args...])
:param string scriptname: Filename of script
:param string hostname/ip: Server on which script is running
:param args...: Arguments that the script is running with
Returns the amount of hacking experience the specified script generates while online (when the game is open, does not apply for offline experience gains).
Remember that a script is uniquely identified by both its name and its arguments.
This function can also return the total experience gain rate of all of your active scripts by running the function with no arguments.
getTimeSinceLastAug
^^^^^^^^^^^^^^^^^^^
.. js:function:: getTimeSinceLastAug()
Returns the amount of time in milliseconds that have passed since you last installed Augmentations
sprintf
^^^^^^^
.. js:function:: sprintf()
See `this link <https://github.com/alexei/sprintf.js>`_ for details.
vsprintf
^^^^^^^^
.. js:function:: vsprintf()
See `this link <https://github.com/alexei/sprintf.js>`_ for details.
prompt
^^^^^^
.. js:function:: prompt(txt)
:param string txt: Text to appear in the prompt dialog box
Prompts the player with a dialog box with two options: "Yes" and "No". This function will return true if the player click "Yes" and
false if the player clicks "No". The script's execution is halted until the player selects one of the options.
Defining your own Functions
---------------------------
You can define your own functions in Netscript using the following syntax::
function name(args...) {
function code here...
return some_value
}
Functions should have some return value. Here is an example of defining and using a function::
function sum(values) {
res = 0;
for (i = 0; i < values.length; ++i) {
res += values[i];
}
return res;
}
print(sum([1, 2, 3, 4, 5]));
print(sum([1, 10]));
The example above prints the following in its log::
15
11
**Note about variable scope in functions:**
Functions can access "global" variables declared outside of the function's scope. However, they cannot change the value of any "global" variables.
Any changes to "global" variables will only be applied locally to the function. This also means that any variable that is first defined inside a
function will NOT be accessible outside of the function.
For example, the following code::
function sum(values) {
res = 0;
for (i = 0; i < values.length; ++i) {
res += values[i];
}
return res;
}
print(res);
results in the following runtime error::
Script runtime error:
Server Ip: 75.7.4.1
Script name: test.script
Args:[]
variable res not defined
The following example shows that any change to "global" variable inside a function only applies in the function's local scope::
function foo() {
i = 5;
return "foo";
}
i = 0;
print(i);
foo();
print(i);
Results in the following log::
0
0
**Other Notes about creating your own functions:**
Defining a function does not create a Javascript function object in the underlying game code. This means that you cannot use any function
you create in functions such as `Array.sort() <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort>`_ (not yet at least, I'll try to make it work in the future).

@ -0,0 +1,127 @@
Netscript Hacknet Node API
==========================
Netscript provides the following API for accessing and upgrading your Hacknet Nodes
through scripts.
Note that none of these functions will write to the script's logs. If you want
to see what your script is doing you will have to print to the logs yourself.
hacknetnodes
^^^^^^^^^^^^
*hacknetnodes* is a special variable. It is an array that maps to the player's
Hacknet Nodes. The Hacknet Nodes are accessed through indexed. These indexes
correspond to the number at the end of the name of the Hacknet Node. For example,
the first Hacknet Node you purchase will have the name "hacknet-node-0" and can be
accessed using *hacknetnodes[0]*. The fourth Hacknet Node you purchase will have the name
"hacknet-node-3" and can be accessed using *hacknetnodes[3]*.
Hacknet Node Member Variables
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The following is a list of member variables for a Hacknet Node object. These variables are read-only, which means you cannot assign
a value to these.
Note that these must be called on an element inside the *hacknetnodes* array, not the array itself.
.. js:function:: hacknetnodes[i].level
Returns the level of the corresponding Hacknet Node
.. js:function:: hacknetnodes[i].ram
Returns the amount of RAM on the corresponding Hacknet Node
.. js:function:: hacknetnodes[i].cores
Returns the number of cores on the corresponding Hacknet Node
.. js:function:: hacknetnodes[i].totalMoneyGenerated
Returns the total amount of money that the corresponding Hacknet Node has earned
.. js:function:: hacknetnodes[i].onlineTimeSeconds
Returns the total amount of time (in seconds) that the corresponding Hacknet Node has existed
.. js:function:: hacknetnodes[i].moneyGainRatePerSecond
Returns the amount of income that the corresponding Hacknet Node earns
Hacknet Node Methods
^^^^^^^^^^^^^^^^^^^^
The following is a list of supported functions/methods for a Hacknet Node object.
Note that these must be called on an element inside the *hacknetnodes* array, not the
array itself.
.. js:function:: hacknetnodes[i].upgradeLevel(n);
:param number n: Number of levels to upgrade. Must be positive. Rounded to nearest integer
Tries to upgrade the level of the corresponding Hacknet Node *n* times. Returns true if the
Hacknet Node's level is successfully upgraded *n* times or up to the max level (200), and false
otherwise.
.. js:function:: hacknetnodes[i].upgradeRam()
Tries to upgrade the amount of RAM on the corresponding Hacknet Node. Returns true if the RAM is
successfully upgraded and false otherwise.
.. js:function:: hacknetnodes[i].upgradeCore()
Tries to purchase an additional core for the corresponding Hacknet Node. Returns true if the
additional core is successfully purchased, and false otherwise.
.. js:function:: hacknetnodes[i].getLevelUpgradeCost(n);
:param number n: Number of levels to upgrade. Must be positive. Rounded to nearest integer
Returns the cost of upgrading the specified Hacknet Node by *n* levels
.. js:function:: hacknetnodes[i].getRamUpgradeCost()
Returns the cost of upgrading the RAM of the specified Hacknet Node. Upgrading a Node's RAM doubles it.
.. js:function:: hacknetnodes[i].getCoreUpgradeCost()
Returns the cost of upgrading the number of cores of the specified Hacknet Node. Upgrading a Node's
number of cores adds one additional core.
Example(s)
^^^^^^^^^^
The following is an example of one way a script can be used to automate the purchasing and upgrading of Hacknet Nodes.
This script purchases new Hacknet Nodes until the player has four. Then, it iteratively upgrades each of those four Hacknet
Nodes to a level of at least 75, RAM to at least 8GB, and number of cores to at least 2::
//Purchase 4 Hacknet Nodes
while(hacknetnodes.length < 4) {
purchaseHacknetNode();
}
//Upgrade all 4 Hacknet Nodes to at least level 75
for (i = 0; i < 4; i = i++) {
while (hacknetnodes[i].level <= 75) {
hacknetnodes[i].upgradeLevel(5);
sleep(10000);
}
}
//Upgrade RAM on all Hacknet Nodes to 8GB
for (i = 0; i < 4; i = i++) {
while (hacknetnodes[i].ram < 8) {
hacknetnodes[i].upgradeRam();
sleep(10000);
}
}
//Upgrade cores on all Hacknet Nodes to 2
for (i = 0; i < 4; i = i++) {
while (hacknetnodes[i].cores < 2) {
hacknetnodes[i].upgradeCore();
sleep(10000);
}
}

@ -0,0 +1,174 @@
Netscript Trade Information eXchange (TIX) API
==============================================
The Trade Information eXchange (TIX) is the communications protocol supported by the World Stock Exchange (WSE).
The WESE provides an API that allows you to automatically communicate with the
`Stock Market <http://bitburner.wikia.com/wiki/Stock_Market>`_. This API lets you write code using Netscript
to build automated trading systems and create your own algorithmic trading strategies. Access to this
TIX API can be purchased by visiting the World Stock Exchange in-game.
Access to the TIX API currently costs $5 billion. After you purchase it, you will retain this
access even after you 'reset' by installing Augmentations
getStockPrice
-------------
.. js:function:: getStockPrice(sym)
:param string sym: Stock symbol
Returns the price of a stock, given its symbol (NOT the company name). The symbol is a sequence
of two to four capital letters.
Example::
getStockPrice("FISG");
getStockPosition
----------------
.. js:function:: getStockPosition(sym)
:param string sym: Stock symbol
Returns an array of four elements that represents the player's position in a stock.
The first element is the returned array is the number of shares the player owns of the stock in the
`Long position <http://bitburner.wikia.com/wiki/Stock_Market#Positions:_Long_vs_Short>`_. The second
element in the array is the average price of the player's shares in the Long position.
The third element in the array is the number of shares the player owns of the stock in the
`Short position <http://bitburner.wikia.com/wiki/Stock_Market#Positions:_Long_vs_Short>`_. The fourth
element in the array is the average price of the player's Short position.
All elements in the returned array are numeric.
Example::
pos = getStockPosition("ECP");
shares = pos[0];
avgPx = pos[1];
sharesShort = pos[2];
avgPxShort = pos[3];
buyStock
--------
.. js:function:: buyStock(sym, shares)
:param string sym: Symbol of stock to purchase
:param number shares: Number of shares to purchased. Must be positive. Will be rounded to nearest integer
Attempts to purchase shares of a stock using a `Market Order <http://bitburner.wikia.com/wiki/Stock_Market#Order_Types>`_.
If the player does not have enough money to purchase the specified number of shares, then no shares will be purchased. Remember
that every transaction on the stock exchange costs a certain commission fee.
If this function successfully purchases the shares, it will return the stock price at which each share was purchased. Otherwise,
it will return 0.
sellStock
---------
.. js:function:: sellStock(sym, shares)
:param string sym: Symbol of stock to sell
:param number shares: Number of shares to sell. Must be positive. Will be rounded to nearest integer
Attempts to sell shares of a stock using a `Market Order <http://bitburner.wikia.com/wiki/Stock_Market#Order_Types>`_.
If the specified number of shares in the function exceeds the amount that the player actually owns, then this function will
sell all owned shares. Remember that every transaction on the stock exchange costs a certain commission fee.
The net profit made from selling stocks with this function is reflected in the script's statistics.
This net profit is calculated as::
shares * (sell price - average price of purchased shares)
If the sale is successful, this function will return the stock price at which each share was sold. Otherwise, it will return 0.
shortStock
----------
.. js:function:: shortStock(sym, shares)
:param string sym: Symbol of stock to short
:param number shares: Number of shares to short. Must be positive. Will be rounded to nearest integer
Attempts to purchase a `short <http://bitburner.wikia.com/wiki/Stock_Market#Positions:_Long_vs_Short>`_ position of a stock
using a `Market Order <http://bitburner.wikia.com/wiki/Stock_Market#Order_Types>`_.
The ability to short a stock is **not** immediately available to the player and must be unlocked later on in the game.
If the player does not have enough money to purchase the specified number of shares, then no shares will be purchased.
Remember that every transaction on the stock exchange costs a certain commission fee.
If the purchase is successful, this function will return the stock price at which each share was purchased. Otherwise, it will return 0.
sellShort
---------
.. js:function:: sellShort(sym, shares)
:param string sym: Symbol of stock to sell
:param number shares: Number of shares to sell. Must be positive. Will be rounded to nearest integer
Attempts to sell a `short <http://bitburner.wikia.com/wiki/Stock_Market#Positions:_Long_vs_Short>`_ position of a stock
using a `Market Order <http://bitburner.wikia.com/wiki/Stock_Market#Order_Types>`_.
The ability to short a stock is **not** immediately available to the player and must be unlocked later on in the game.
If the specified number of shares exceeds the amount that the player actually owns, then this function will sell all owned
shares. Remember that every transaction on the stock exchange costs a certain commission fee.
If the sale is successful, this function will return the stock price at which each share was sold. Otherwise it will return 0.
placeOrder
----------
.. js:function:: placeOrder(sym, shares, price, type, pos)
:param string sym: Symbol of stock to player order for
:param number shares: Number of shares for order. Must be positive. Will be rounded to nearest integer
:param number price: Execution price for the order
:param string type: Type of order. It must specify "limit" or "stop", and must also specify "buy" or "sell". This is NOT
case-sensitive. Here are four examples that will work:
* limitbuy
* limitsell
* stopbuy
* stopsell
:param string pos:
Specifies whether the order is a "Long" or "Short" position. The Values "L" or "S" can also be used. This is
NOT case-sensitive.
Places an order on the stock market. This function only works for `Limit and Stop Orders <http://bitburner.wikia.com/wiki/Stock_Market#Order_Types>`_.
The ability to place limit and stop orders is **not** immediately available to the player and must be unlocked later on in the game.
Returns true if the order is successfully placed, and false otherwise.
cancelOrder
-----------
.. js:function:: cancelOrder(sym, shares, price, type, pos)
:param string sym: Symbol of stock to player order for
:param number shares: Number of shares for order. Must be positive. Will be rounded to nearest integer
:param number price: Execution price for the order
:param string type: Type of order. It must specify "limit" or "stop", and must also specify "buy" or "sell". This is NOT
case-sensitive. Here are four examples that will work:
* limitbuy
* limitsell
* stopbuy
* stopsell
:param string pos:
Specifies whether the order is a "Long" or "Short" position. The Values "L" or "S" can also be used. This is
NOT case-sensitive.
Cancels an oustanding Limit or Stop order on the stock market.
The ability to use limit and stop orders is **not** immediately available to the player and must be unlocked later on in the game.

@ -0,0 +1,42 @@
Netscript Loops and Conditionals
================================
Loops and Conditionals
----------------------
Netscript loops and conditionals are the same as Javascript. However, the one caveat is that when declaring variables such as the
iterator for traversing a loop, you should not use the 'var' or 'let' keyword. For reference, you can see the Javascript
documentation for loops/conditionals here:
`While loops <https://www.w3schools.com/js/js_loop_while.asp>`_
`For loops <https://www.w3schools.com/js/js_loop_for.asp>`_
`Conditionals (If/Else statements) <https://www.w3schools.com/js/js_if_else.asp>`_
Here are some simple code examples that show the use of loops and conditionals in Netscript.
The following is a while loop that runs the hack() Netscript function ten times::
i = 0;
while (i < 10) {
hack('foodnstuff');
i = i + 1;
}
The following is a for loop that runs the hack() Netscript function ten times::
for (i = 0; i < 10; ++i) {
hack("foodnstuff");
}
The following is a conditional that uses the getServerMoneyAvailable() Netscript function to check how much money
exists on the 'foodnstuff' server. If there is more than $200,000 on the server, then the server will be hacked.
Otherwise, the money available on the server will be grown using the grow() Netscript function::
if (getServerMoneyAvailable('foodnstuff') > 200000) {
hack("foodnstuff");
} else {
grow("foodnstuff");
}

@ -0,0 +1,53 @@
Netscript Operators
===================
Operators
---------
Binary Operators
^^^^^^^^^^^^^^^^
Binary operators require two operands and produce a result based on their values. In general, binary
operators do not change the value of the operands.
=========== =========================== ==============================================================
Operator Name Example/Comments
=========== =========================== ==============================================================
= Assignment i = 5 would assign the value 5 to the variable i
\+ Addition 5 + 12 would return 17
\- Subtraction 20 - 8 would return 12
\* Multiplication 4 * 5 would return 20
\/ Division 50 / 10 would return 5
% Modulo 50 % 9 would return 5
&& Logical AND true && false would return false
|| Logical OR true || false would return true
< Less than 4 < 5 would return true
> Greater than 4 > 5 would return false
<= Less than or equal to 5 <= 5 would return true
>= Greater than or equal to 5 >= 4 would return true
== Equality 1 == 1 would return true
!= Inequality 4 != 5 would return true
=== Strict equality 1 === "1" would return false
!== Strict inequality 1 !== "1" would return true
=========== =========================== ==============================================================
Unary Operators
^^^^^^^^^^^^^^^
Unary operators require only a single operand and produce a result based on their values. Some unary operators will
change the value of their operands. For example::
i = 0;
++i;
Running the pre-increment unary operator (++) in the code above changes the value of the variable i.
=============== =========================== ==============================================================================================
Operator Name Example/comments
=============== =========================== ==============================================================================================
! Logical NOT operator !true would return false, and !false would return true. Does not change operand's value
\- Negation Negates a number. Only works for numerics. Does not change operand's value
++ Pre-increment ++i or i++. WARNING: This only pre-increments, even if you put i++. Changes operand's value
-- Pre-decrement --i or i--. WARNING: This only pre-decrements, even if you put i--. Changes operand's value
=============== =========================== ==============================================================================================

@ -0,0 +1,17 @@
Netscript Script Arguments
==========================
Arguments passed into a script can be accessed in Netscript using a special array called *args*. The arguments can be
accessed using a normal array using the [] operator (args[0], args[1], etc...).
For example, let's say we want to make a generic script 'generic-run.script' and we plan to pass two arguments into that script.
The first argument will be the name of another script, and the second argument will be a number. This generic script will run the
script specified in the first argument with the amount of threads specified in the second element. The code would look like::
run(args[0], args[1]);
It is also possible to get the number of arguments that was passed into a script using::
args.length
WARNING: Do not try to modify the args array. This will break the game. I will do my best to prevent players from doing this.

@ -0,0 +1,465 @@
Netscript Singularity Functions
===============================
The Singularity Functions are a special set of Netscript functions. These functions allow you to control
many additional aspects of the game through scripts, such as working for factions/companies, purchasing/installing Augmentations,
and creating programs.
The Singularity Functions are **not** immediately available to the player and must be unlocked later in the game.
**WARNING: This page contains spoilers for the game**.
The Singularity Functions are unlocked in BitNode-4. If you are in BitNode-4, then you will automatically have access to all of these functions.
You can use the Singularity Functions in other BitNodes if and only if you have the Source-File for BitNode-4 (aka Source-File 4). Each level of
Source-File 4 will open up additional Singularity Functions that you can use in other BitNodes. If your Source-File 4 is upgraded all the way to
level 3, then you will be able to access all of the Singularity Functions.
Note that Singularity Functions require a lot of RAM outside of BitNode-4 (their RAM costs are multiplied by 10 if you are not in BitNode-4)
universityCourse
----------------
.. js:function:: universityCourse(universityName, courseName)
:param string universityName:
Name of university. Not case-sensitive. You must be in the correct city for whatever university you specify.
* Summit University
* Rothman University
* ZB Institute Of Technology
:param string courseName:
Name of course. Not case-sensitive.
* Study Computer Science
* Data Strucures
* Networks
* Algorithms
* Management
* Leadership
If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function.
This function will automatically set you to start taking a course at a university. If you are already in the middle of some
"working" action (such as working at a company, for a faction, or on a program), then running this function will automatically
cancel that action and give you your earnings.
The cost and experience gains for all of these universities and classes are the same as if you were to manually visit and take these classes.
This function will return true if you successfully start taking the course, and false otherwise.
gymWorkout
----------
.. js:function:: gymWorkout(gymName, stat)
:param string gymName:
Name of gym. Not case-sensitive. You must be in the correct city for whatever gym you specify.
* Crush Fitness Gym
* Snap Fitness Gym
* Iron Gym
* Powerhouse Gym
* Millenium Fitness Gym
:param string stat:
The stat you want to train. Not case-sensitive.
* strength OR str
* defense OR def
* dexterity OR dex
* agility OR agi
If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function.
This function will automatically set you to start working out at a gym to train a particular stat. If you are
already in the middle of some "working" action (such as working at a company, for a faction, or on a program),
then running this function will automatically cancel that action and give you your earnings.
The cost and experience gains for all of these gyms are the same as if you were to manually visit these gyms and train
This function will return true if you successfully start working out at the gym, and false otherwise.
travelToCity
------------
.. js:function:: travelToCity(cityName)
:param string cityName:
City to travel to. CASE-SENSITIVE.
* Aevum
* Chongqing
* Sector-12
* New Tokyo
* Ishima
* Volhaven
If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function.
This function allows the player to travel to any city. The cost for using this function is the same as the cost for traveling through the Travel Agency.
This function will return true if you successfully travel to the specified city and false otherwise.
purchaseTor
-----------
.. js:function:: purchaseTor()
If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function.
This function allows you to automatically purchase a TOR router. The cost for purchasing a TOR router using this
function is the same as if you were to manually purchase one.
This function will return true if it successfully purchase a TOR router and false otherwise.
purchaseProgram
---------------
.. js:function:: purchaseProgram(programName)
:param string programName: Name of program to purchase. Must include '.exe' extension. Not case-sensitive.
If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function.
This function allows you to automatically purchase programs. You MUST have a TOR router in order to use this function.
The cost of purchasing programs using this function is the same as if you were purchasing them through the Dark Web using the
Terminal *buy* command.
Example::
purchaseProgram("brutessh.exe");
This function will return true if the specified program is purchased, and false otherwise.
getStats
--------
.. js:function:: getStats()
If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to run this function.
Returns an object with the Player's stats. The object has the following properties::
Player.hacking
Player.strength
Player.defense
Player.dexterity
Player.agility
Player.charisma
Player.intelligence
Example::
res = getStats();
print('My charisma level is: ' + res.charisma);
isBusy
------
.. js:function:: isBusy()
If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to run this function.
Returns a boolean indicating whether or not the player is currently performing an 'action'. These actions include
working for a company/faction, studying at a univeristy, working out at a gym, creating a program, or committing a crime.
upgradeHomeRam
--------------
.. js:function:: upgradeHomeRam()
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
This function will upgrade amount of RAM on the player's home computer. The cost is the same as if you were to do it manually.
This function will return true if the player's home computer RAM is successfully upgraded, and false otherwise.
getUpgradeHomeRamCost
---------------------
.. js:function:: getUpgradeHomeRamCost()
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
Returns the cost of upgrading the player's home computer RAM.
workForCompany
--------------
.. js:function:: workForCompany()
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
This function will automatically set you to start working at the company at which you are employed.
If you are already in the middle of some "working" action (such as working for a faction, training at
a gym, or creating a program), then running this function will automatically cancel that action and give you your earnings.
This function will return true if the player starts working, and false otherwise.
Note that when you are working for a company, you will not actually receive your earnings
(reputation, money, experience) until you FINISH the action. This can be an issue if, for example,
you only want to work until you get 100,000 company reputation. One small hack to get around this is to
continuously restart the action to receive your earnings::
while (getCompanyRep(COMPANY HERE) < VALUE) {
workForCompany();
sleep(60000);
}
This way, your company reputation will be updated every minute.
applyToCompany
--------------
.. js:function:: applyToCompany(companyName, field)
:param string companyName: Name of company to apply to. CASE-SENSITIVE.
:param string field:
Field to which you want to apply. Not case-sensitive
* software
* software consultant
* it
* security engineer
* network engineer
* business
* business consultant
* security
* agent
* employee
* part-time employee
* waiter
* part-time waiter
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
This function will automatically try to apply to the specified company for a position in the specified
field. This function can also be used to apply for promotions by specifying the company and field you
are already employed at.
This function will return true if you successfully get a job/promotion, and false otherwise. Note that
if you are trying to use this function to apply for a promotion and you don't get one, it will return false.
getCompanyRep
-------------
.. js:function:: getCompanyRep(companyName)
:param string companyName: Name of the company. CASE-SENSITIVE
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
This function will return the amount of reputation you have at the specified company.
If the company passed in as an argument is invalid, -1 will be returned.
checkFactionInvitations
-----------------------
.. js:function:: checkFactionInvitations()
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
Returns an array with the name of all Factions you currently have oustanding invitations from.
joinFaction
-----------
.. js:function:: joinFaction(name)
:param string name: Name of faction to join. CASE-SENSITIVE
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
This function will automatically accept an invitation from a faction and join it.
workForFaction
--------------
.. js:function:: workForFaction(factionName, workType)
:param string factionName: Name of faction to work for. CASE-SENSITIVE
:param string workType:
Type of work to perform for the faction
* hacking/hacking contracts/hackingcontracts
* field/fieldwork/field work
* security/securitywork/security work
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
This function will automatically set you to start working for the specified faction.
Obviously, you must be a member of the faction or else this function will fail. If you are already in
the middle of some "working" action (such as working for a company, training at a gym, or creating a program),
then running this function will automatically cancel that action and give you your earnings.
This function will return true if you successfully start working for the specified faction, and false otherwise.
Note that when you are working for a faction, you will not actually receive your earnings (reputation, experience)
until you FINISH the action. This can be an issue if, for example, you only want to work until you get 100,000 faction
reputation. One small hack to get around this is to continuously restart the action to receive your earnings::
while (getFactionRep(FACTION NAME) < VALUE) {
workForFaction(FACNAME, WORKTYPE);
sleep(60000);
}
This way, your faction reputation will be updated every minute.
getFactionRep
-------------
.. js:function:: getFactionRep(factionName)
:param string factionName: Name of faction. CASE-SENSITIVE
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
This function returns the amount of reputation you have for the specified faction.
createProgram
-------------
.. js:function:: createProgram(programName)
:param string programName: Name of program to create. Not case-sensitive
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
This function will automatically set you to start working on creating the specified program. If you are
already in the middle of some "working" action (such as working for a company, training at a gym, or taking a course),
then running this function will automatically cancel that action and give you your earnings.
Example:
createProgram("relaysmtp.exe");
Note that creating a program using this function has the same hacking level requirements as it normally would. These level requirements are:
* BruteSSH.exe: 50
* FTPCrack.exe: 100
* relaySMTP.exe: 250
* HTTPWorm.exe: 500
* SQLInject.exe: 750
* DeepscanV1.exe: 75
* DeepscanV2.exe: 400
* ServerProfiler.exe: 75
* AutoLink.exe: 25
This function returns true if you successfully start working on the specified program, and false otherwise.
commitCrime
-----------
.. js:function::commitCrime(crime)
:param string crime:
Name of crime to attempt. Not case-sensitive. This argument is fairly lenient in terms of what inputs it accepts.
Here is a list of valid inputs for all of the crimes:
* shoplift
* rob store
* mug
* larceny
* deal drugs
* bond forgery
* traffick arms
* homicide
* grand theft auto
* kidnap
* assassinate
* heist
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
This function is used to automatically attempt to commit crimes. If you are already in the middle of some 'working' action
(such as working for a company or training at a gym), then running this function will automatically cancel that action and give you your earnings.
Note that crimes committed using this function will have all of their earnings halved (this applied for both money and experience!)
This function returns the number of seconds it takes to attempt the specified crime (e.g It takes 60 seconds to attempt the 'Rob Store' crime,
so running *commitCrime('rob store')* will return 60).
Warning: I do not recommend using the time returned from this function to try and schedule your crime attempts.
Instead, I would use the isBusy() Singularity function to check whether you have finished attempting a crime.
This is because although the game sets a certain crime to be X amount of seconds, there is no guarantee that your
browser will follow that time limit.
getCrimeChance
--------------
.. js:function:: getCrimeChance(crime)
:param string crime:
Name of crime. Not case-sensitive. This argument is fairlyn lenient in terms of what inputs it accepts.
Check the documentation for the *commitCrime()* function for a list of example inputs.
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
This function returns your chance of success at commiting the specified crime. The chance is returned as a decimal (i.e. 60% would be returned as 0.6).
getOwnedAugmentations
---------------------
.. js:function:: getOwnedAugmentations(purchased=false)
:param boolean purchase:
Specifies whether the returned array should include Augmentations you have purchased but not yet installed.
By default, this argument is false which means that the return value will NOT have the purchased Augmentations.
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
This function returns an array containing the names (as strings) of all Augmentations you have.
getAugmentationsFromFaction
---------------------------
.. js:function:: getAugmentationsFromFaction(facName)
:param string facName: Name of faction. CASE-SENSITIVE
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
Returns an array containing the names (as strings) of all Augmentations that are available from the specified faction.
getAugmentationCost
-------------------
.. js:function:: getAugmentationCost(augName)
:param string augName: Name of Augmentation. CASE-SENSITIVE
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
This function returns an array with two elements that gives the cost for the specified Augmentation.
The first element in the returned array is the reputation requirement of the Augmentation, and the second element is the money cost.
If an invalid Augmentation name is passed in for the *augName* argument, this function will return the array [-1, -1].
purchaseAugmentation
--------------------
.. js:function:: purchaseAugmentation(factionName, augName)
:param string factionName: Name of faction to purchase Augmentation from. CASE-SENSITIVE
:param string augName: Name of Augmentation to purchase. CASE-SENSITIVE
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
This function will try to purchase the specified Augmentation through the given Faction.
This function will return true if the Augmentation is successfully purchased, and false otherwise.
installAugmentations
--------------------
.. js:function:: installAugmentations(cbScript)
:param string cbScript:
Optional callback script. This is a script that will automatically be run after Augmentations are installed (after the reset).
This script will be run with no arguments and 1 thread. It must be located on your home computer.
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
This function will automatically install your Augmentations, resetting the game as usual.
It will return true if successful, and false otherwise.

541
doc/build/html/_static/agogo.css vendored Normal file

@ -0,0 +1,541 @@
/*
* agogo.css_t
* ~~~~~~~~~~~
*
* Sphinx stylesheet -- agogo theme.
*
* :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
* {
margin: 0px;
padding: 0px;
}
body {
font-family: "Verdana", Arial, sans-serif;
line-height: 1.4em;
color: black;
background-color: #eeeeec;
}
/* Page layout */
div.header, div.content, div.footer {
width: 70em;
margin-left: auto;
margin-right: auto;
}
div.header-wrapper {
background: #555573 url(bgtop.png) top left repeat-x;
border-bottom: 3px solid #2e3436;
}
/* Default body styles */
a {
color: #ce5c00;
}
div.bodywrapper a, div.footer a {
text-decoration: underline;
}
.clearer {
clear: both;
}
.left {
float: left;
}
.right {
float: right;
}
.line-block {
display: block;
margin-top: 1em;
margin-bottom: 1em;
}
.line-block .line-block {
margin-top: 0;
margin-bottom: 0;
margin-left: 1.5em;
}
h1, h2, h3, h4 {
font-family: "Georgia", "Times New Roman", serif;
font-weight: normal;
color: #3465a4;
margin-bottom: .8em;
}
h1 {
color: #204a87;
}
h2 {
padding-bottom: .5em;
border-bottom: 1px solid #3465a4;
}
a.headerlink {
visibility: hidden;
color: #dddddd;
padding-left: .3em;
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink,
caption:hover > a.headerlink,
p.caption:hover > a.headerlink,
div.code-block-caption:hover > a.headerlink {
visibility: visible;
}
img {
border: 0;
}
div.admonition {
margin-top: 10px;
margin-bottom: 10px;
padding: 2px 7px 1px 7px;
border-left: 0.2em solid black;
}
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
}
dt:target, .highlighted {
background-color: #fbe54e;
}
/* Header */
div.header {
padding-top: 10px;
padding-bottom: 10px;
}
div.header .headertitle {
font-family: "Georgia", "Times New Roman", serif;
font-weight: normal;
font-size: 180%;
letter-spacing: .08em;
margin-bottom: .8em;
}
div.header .headertitle a {
color: white;
}
div.header div.rel {
margin-top: 1em;
}
div.header div.rel a {
color: #fcaf3e;
letter-spacing: .1em;
text-transform: uppercase;
}
p.logo {
float: right;
}
img.logo {
border: 0;
}
/* Content */
div.content-wrapper {
background-color: white;
padding-top: 20px;
padding-bottom: 20px;
}
div.document {
width: 50em;
float: left;
}
div.body {
padding-right: 2em;
text-align: justify;
}
div.document h1 {
line-height: 120%;
}
div.document ul {
margin: 1.5em;
list-style-type: square;
}
div.document dd {
margin-left: 1.2em;
margin-top: .4em;
margin-bottom: 1em;
}
div.document .section {
margin-top: 1.7em;
}
div.document .section:first-child {
margin-top: 0px;
}
div.document div.highlight {
padding: 3px;
background-color: #eeeeec;
border-top: 2px solid #dddddd;
border-bottom: 2px solid #dddddd;
margin-top: .8em;
margin-bottom: .8em;
}
div.document div.literal-block-wrapper {
margin-top: .8em;
margin-bottom: .8em;
}
div.document div.literal-block-wrapper div.highlight {
margin: 0;
}
div.document div.code-block-caption span.caption-number {
padding: 0.1em 0.3em;
font-style: italic;
}
div.document div.code-block-caption span.caption-text {
}
div.document h2 {
margin-top: .7em;
}
div.document p {
margin-bottom: .5em;
}
div.document li.toctree-l1 {
margin-bottom: 1em;
}
div.document .descname {
font-weight: bold;
}
div.document .sig-paren {
font-size: larger;
}
div.document .docutils.literal {
background-color: #eeeeec;
padding: 1px;
}
div.document .docutils.xref.literal {
background-color: transparent;
padding: 0px;
}
div.document blockquote {
margin: 1em;
}
div.document ol {
margin: 1.5em;
}
/* Sidebar */
div.sidebar {
width: 20em;
position:fixed;
right: 10%;
height:75%;
font-size: .9em;
overflow-y:auto;
}
/*
div.sidebar {
width: 20em;
float: right;
font-size: .9em;
}
*/
div.sidebar a, div.header a {
text-decoration: none;
}
div.sidebar a:hover, div.header a:hover {
text-decoration: underline;
}
div.sidebar h3 {
color: #2e3436;
text-transform: uppercase;
font-size: 130%;
letter-spacing: .1em;
}
div.sidebar ul {
list-style-type: none;
}
div.sidebar li.toctree-l1 a {
display: block;
padding: 1px;
border: 1px solid #dddddd;
background-color: #eeeeec;
margin-bottom: .4em;
padding-left: 3px;
color: #2e3436;
}
div.sidebar li.toctree-l2 a {
background-color: transparent;
border: none;
margin-left: 1em;
border-bottom: 1px solid #dddddd;
}
div.sidebar li.toctree-l3 a {
background-color: transparent;
border: none;
margin-left: 2em;
border-bottom: 1px solid #dddddd;
}
div.sidebar li.toctree-l2:last-child a {
border-bottom: none;
}
div.sidebar li.toctree-l1.current a {
border-right: 5px solid #fcaf3e;
}
div.sidebar li.toctree-l1.current li.toctree-l2 a {
border-right: none;
}
div.sidebar input[type="text"] {
width: 170px;
}
div.sidebar input[type="submit"] {
width: 30px;
}
/* Footer */
div.footer-wrapper {
background: url(bgfooter.png) top left repeat-x;
border-top: 4px solid #babdb6;
padding-top: 10px;
padding-bottom: 10px;
min-height: 80px;
}
div.footer, div.footer a {
color: #888a85;
}
div.footer .right {
text-align: right;
}
div.footer .left {
text-transform: uppercase;
}
/* Styles copied from basic theme */
img.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
img.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-right {
text-align: right;
}
table caption span.caption-number {
font-style: italic;
}
table caption span.caption-text {
}
div.figure p.caption span.caption-number {
font-style: italic;
}
div.figure p.caption span.caption-text {
}
/* -- search page ----------------------------------------------------------- */
ul.search {
margin: 10px 0 0 20px;
padding: 0;
}
ul.search li {
padding: 5px 0 5px 20px;
background-image: url(file.png);
background-repeat: no-repeat;
background-position: 0 7px;
}
ul.search li a {
font-weight: bold;
}
ul.search li div.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
}
ul.keywordmatches li.goodmatch a {
font-weight: bold;
}
/* -- index page ------------------------------------------------------------ */
table.contentstable {
width: 90%;
}
table.contentstable p.biglink {
line-height: 150%;
}
a.biglink {
font-size: 1.3em;
}
span.linkdescr {
font-style: italic;
padding-top: 5px;
font-size: 90%;
}
/* -- general index --------------------------------------------------------- */
table.indextable td {
text-align: left;
vertical-align: top;
}
table.indextable ul {
margin-top: 0;
margin-bottom: 0;
list-style-type: none;
}
table.indextable > tbody > tr > td > ul {
padding-left: 0em;
}
table.indextable tr.pcap {
height: 10px;
}
table.indextable tr.cap {
margin-top: 10px;
background-color: #f2f2f2;
}
img.toggler {
margin-right: 3px;
margin-top: 3px;
cursor: pointer;
}
/* -- domain module index --------------------------------------------------- */
table.modindextable td {
padding: 2px;
border-collapse: collapse;
}
/* -- viewcode extension ---------------------------------------------------- */
.viewcode-link {
float: right;
}
.viewcode-back {
float: right;
font-family:: "Verdana", Arial, sans-serif;
}
div.viewcode-block:target {
margin: -1px -3px;
padding: 0 3px;
background-color: #f4debf;
border-top: 1px solid #ac9;
border-bottom: 1px solid #ac9;
}
div.code-block-caption {
background-color: #ddd;
color: #333;
padding: 2px 5px;
font-size: small;
}
/* -- math display ---------------------------------------------------------- */
div.body div.math p {
text-align: center;
}
span.eqno {
float: right;
}

BIN
doc/build/html/_static/ajax-loader.gif vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

639
doc/build/html/_static/basic.css vendored Normal file

@ -0,0 +1,639 @@
/*
* basic.css
* ~~~~~~~~~
*
* Sphinx stylesheet -- basic theme.
*
* :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/* -- main layout ----------------------------------------------------------- */
div.clearer {
clear: both;
}
/* -- relbar ---------------------------------------------------------------- */
div.related {
width: 100%;
font-size: 90%;
}
div.related h3 {
display: none;
}
div.related ul {
margin: 0;
padding: 0 0 0 10px;
list-style: none;
}
div.related li {
display: inline;
}
div.related li.right {
float: right;
margin-right: 5px;
}
/* -- sidebar --------------------------------------------------------------- */
div.sphinxsidebarwrapper {
padding: 10px 5px 0 10px;
}
div.sphinxsidebar {
float: left;
width: 0px;
margin-left: -100%;
font-size: 90%;
word-wrap: break-word;
overflow-wrap : break-word;
}
div.sphinxsidebar ul {
list-style: none;
}
div.sphinxsidebar ul ul,
div.sphinxsidebar ul.want-points {
margin-left: 20px;
list-style: square;
}
div.sphinxsidebar ul ul {
margin-top: 0;
margin-bottom: 0;
}
div.sphinxsidebar form {
margin-top: 10px;
}
div.sphinxsidebar input {
border: 1px solid #98dbcc;
font-family: sans-serif;
font-size: 1em;
}
div.sphinxsidebar #searchbox input[type="text"] {
width: 170px;
}
img {
border: 0;
max-width: 100%;
}
/* -- search page ----------------------------------------------------------- */
ul.search {
margin: 10px 0 0 20px;
padding: 0;
}
ul.search li {
padding: 5px 0 5px 20px;
background-image: url(file.png);
background-repeat: no-repeat;
background-position: 0 7px;
}
ul.search li a {
font-weight: bold;
}
ul.search li div.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
}
ul.keywordmatches li.goodmatch a {
font-weight: bold;
}
/* -- index page ------------------------------------------------------------ */
table.contentstable {
width: 90%;
margin-left: auto;
margin-right: auto;
}
table.contentstable p.biglink {
line-height: 150%;
}
a.biglink {
font-size: 1.3em;
}
span.linkdescr {
font-style: italic;
padding-top: 5px;
font-size: 90%;
}
/* -- general index --------------------------------------------------------- */
table.indextable {
width: 100%;
}
table.indextable td {
text-align: left;
vertical-align: top;
}
table.indextable ul {
margin-top: 0;
margin-bottom: 0;
list-style-type: none;
}
table.indextable > tbody > tr > td > ul {
padding-left: 0em;
}
table.indextable tr.pcap {
height: 10px;
}
table.indextable tr.cap {
margin-top: 10px;
background-color: #f2f2f2;
}
img.toggler {
margin-right: 3px;
margin-top: 3px;
cursor: pointer;
}
div.modindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
div.genindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
/* -- domain module index --------------------------------------------------- */
table.modindextable td {
padding: 2px;
border-collapse: collapse;
}
/* -- general body styles --------------------------------------------------- */
div.body p, div.body dd, div.body li, div.body blockquote {
-moz-hyphens: auto;
-ms-hyphens: auto;
-webkit-hyphens: auto;
hyphens: auto;
}
a.headerlink {
visibility: hidden;
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink,
caption:hover > a.headerlink,
p.caption:hover > a.headerlink,
div.code-block-caption:hover > a.headerlink {
visibility: visible;
}
div.body p.caption {
text-align: inherit;
}
div.body td {
text-align: left;
}
.first {
margin-top: 0 !important;
}
p.rubric {
margin-top: 30px;
font-weight: bold;
}
img.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
img.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-right {
text-align: right;
}
/* -- sidebars -------------------------------------------------------------- */
div.sidebar {
margin: 0 0 0.5em 1em;
border: 1px solid #ddb;
padding: 7px 7px 0 7px;
background-color: #ffe;
width: 40%;
float: right;
}
p.sidebar-title {
font-weight: bold;
}
/* -- topics ---------------------------------------------------------------- */
div.topic {
border: 1px solid #ccc;
padding: 7px 7px 0 7px;
margin: 10px 0 10px 0;
}
p.topic-title {
font-size: 1.1em;
font-weight: bold;
margin-top: 10px;
}
/* -- admonitions ----------------------------------------------------------- */
div.admonition {
margin-top: 10px;
margin-bottom: 10px;
padding: 7px;
}
div.admonition dt {
font-weight: bold;
}
div.admonition dl {
margin-bottom: 0;
}
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
}
div.body p.centered {
text-align: center;
margin-top: 25px;
}
/* -- tables ---------------------------------------------------------------- */
table.docutils {
border: 0;
border-collapse: collapse;
}
table caption span.caption-number {
font-style: italic;
}
table caption span.caption-text {
}
table.docutils td, table.docutils th {
padding: 1px 8px 1px 5px;
border-top: 0;
border-left: 0;
border-right: 0;
border-bottom: 1px solid #aaa;
}
table.footnote td, table.footnote th {
border: 0 !important;
}
th {
text-align: left;
padding-right: 5px;
}
table.citation {
border-left: solid 1px gray;
margin-left: 1px;
}
table.citation td {
border-bottom: none;
}
/* -- figures --------------------------------------------------------------- */
div.figure {
margin: 0.5em;
padding: 0.5em;
}
div.figure p.caption {
padding: 0.3em;
}
div.figure p.caption span.caption-number {
font-style: italic;
}
div.figure p.caption span.caption-text {
}
/* -- field list styles ----------------------------------------------------- */
table.field-list td, table.field-list th {
border: 0 !important;
}
.field-list ul {
margin: 0;
padding-left: 1em;
}
.field-list p {
margin: 0;
}
.field-name {
-moz-hyphens: manual;
-ms-hyphens: manual;
-webkit-hyphens: manual;
hyphens: manual;
}
/* -- other body styles ----------------------------------------------------- */
ol.arabic {
list-style: decimal;
}
ol.loweralpha {
list-style: lower-alpha;
}
ol.upperalpha {
list-style: upper-alpha;
}
ol.lowerroman {
list-style: lower-roman;
}
ol.upperroman {
list-style: upper-roman;
}
dl {
margin-bottom: 15px;
}
dd p {
margin-top: 0px;
}
dd ul, dd table {
margin-bottom: 10px;
}
dd {
margin-top: 3px;
margin-bottom: 10px;
margin-left: 30px;
}
dt:target, .highlighted {
background-color: #fbe54e;
}
dl.glossary dt {
font-weight: bold;
font-size: 1.1em;
}
.optional {
font-size: 1.3em;
}
.sig-paren {
font-size: larger;
}
.versionmodified {
font-style: italic;
}
.system-message {
background-color: #fda;
padding: 5px;
border: 3px solid red;
}
.footnote:target {
background-color: #ffa;
}
.line-block {
display: block;
margin-top: 1em;
margin-bottom: 1em;
}
.line-block .line-block {
margin-top: 0;
margin-bottom: 0;
margin-left: 1.5em;
}
.guilabel, .menuselection {
font-family: sans-serif;
}
.accelerator {
text-decoration: underline;
}
.classifier {
font-style: oblique;
}
abbr, acronym {
border-bottom: dotted 1px;
cursor: help;
}
/* -- code displays --------------------------------------------------------- */
pre {
overflow: auto;
overflow-y: hidden; /* fixes display issues on Chrome browsers */
}
span.pre {
-moz-hyphens: none;
-ms-hyphens: none;
-webkit-hyphens: none;
hyphens: none;
}
td.linenos pre {
padding: 5px 0px;
border: 0;
background-color: transparent;
color: #aaa;
}
table.highlighttable {
margin-left: 0.5em;
}
table.highlighttable td {
padding: 0 0.5em 0 0.5em;
}
div.code-block-caption {
padding: 2px 5px;
font-size: small;
}
div.code-block-caption code {
background-color: transparent;
}
div.code-block-caption + div > div.highlight > pre {
margin-top: 0;
}
div.code-block-caption span.caption-number {
padding: 0.1em 0.3em;
font-style: italic;
}
div.code-block-caption span.caption-text {
}
div.literal-block-wrapper {
padding: 1em 1em 0;
}
div.literal-block-wrapper div.highlight {
margin: 0;
}
code.descname {
background-color: transparent;
font-weight: bold;
font-size: 1.2em;
}
code.descclassname {
background-color: transparent;
}
code.xref, a code {
background-color: transparent;
font-weight: bold;
}
h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
background-color: transparent;
}
.viewcode-link {
float: right;
}
.viewcode-back {
float: right;
font-family: sans-serif;
}
div.viewcode-block:target {
margin: -1px -10px;
padding: 0 10px;
}
/* -- math display ---------------------------------------------------------- */
img.math {
vertical-align: middle;
}
div.body div.math p {
text-align: center;
}
span.eqno {
float: right;
}
span.eqno a.headerlink {
position: relative;
left: 0px;
z-index: 1;
}
div.math:hover a.headerlink {
visibility: visible;
}
/* -- printout stylesheet --------------------------------------------------- */
@media print {
div.document,
div.documentwrapper,
div.bodywrapper {
margin: 0 !important;
width: 100%;
}
div.sphinxsidebar,
div.related,
div.footer,
#top-link {
display: none;
}
}

BIN
doc/build/html/_static/bgfooter.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 B

BIN
doc/build/html/_static/bgtop.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 756 B

BIN
doc/build/html/_static/comment-close.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 829 B

BIN
doc/build/html/_static/comment.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 641 B

287
doc/build/html/_static/doctools.js vendored Normal file

@ -0,0 +1,287 @@
/*
* doctools.js
* ~~~~~~~~~~~
*
* Sphinx JavaScript utilities for all documentation.
*
* :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/**
* select a different prefix for underscore
*/
$u = _.noConflict();
/**
* make the code below compatible with browsers without
* an installed firebug like debugger
if (!window.console || !console.firebug) {
var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
"dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
"profile", "profileEnd"];
window.console = {};
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {};
}
*/
/**
* small helper function to urldecode strings
*/
jQuery.urldecode = function(x) {
return decodeURIComponent(x).replace(/\+/g, ' ');
};
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s == 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node) {
if (node.nodeType == 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
var span = document.createElement("span");
span.className = className;
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this);
});
}
}
return this.each(function() {
highlight(this);
});
};
/*
* backward compatibility for jQuery.browser
* This will be supported until firefox bug is fixed.
*/
if (!jQuery.browser) {
jQuery.uaMatch = function(ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}
/**
* Small JavaScript module for the documentation.
*/
var Documentation = {
init : function() {
this.fixFirefoxAnchorBug();
this.highlightSearchWords();
this.initIndexTable();
},
/**
* i18n support
*/
TRANSLATIONS : {},
PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
LOCALE : 'unknown',
// gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext)
gettext : function(string) {
var translated = Documentation.TRANSLATIONS[string];
if (typeof translated == 'undefined')
return string;
return (typeof translated == 'string') ? translated : translated[0];
},
ngettext : function(singular, plural, n) {
var translated = Documentation.TRANSLATIONS[singular];
if (typeof translated == 'undefined')
return (n == 1) ? singular : plural;
return translated[Documentation.PLURALEXPR(n)];
},
addTranslations : function(catalog) {
for (var key in catalog.messages)
this.TRANSLATIONS[key] = catalog.messages[key];
this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
this.LOCALE = catalog.locale;
},
/**
* add context elements like header anchor links
*/
addContextElements : function() {
$('div[id] > :header:first').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this headline')).
appendTo(this);
});
$('dt[id]').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this definition')).
appendTo(this);
});
},
/**
* workaround a firefox stupidity
* see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
*/
fixFirefoxAnchorBug : function() {
if (document.location.hash)
window.setTimeout(function() {
document.location.href += '';
}, 10);
},
/**
* highlight the search words provided in the url in the text
*/
highlightSearchWords : function() {
var params = $.getQueryParameters();
var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
if (terms.length) {
var body = $('div.body');
if (!body.length) {
body = $('body');
}
window.setTimeout(function() {
$.each(terms, function() {
body.highlightText(this.toLowerCase(), 'highlighted');
});
}, 10);
$('<p class="highlight-link"><a href="javascript:Documentation.' +
'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
.appendTo($('#searchbox'));
}
},
/**
* init the domain index toggle buttons
*/
initIndexTable : function() {
var togglers = $('img.toggler').click(function() {
var src = $(this).attr('src');
var idnum = $(this).attr('id').substr(7);
$('tr.cg-' + idnum).toggle();
if (src.substr(-9) == 'minus.png')
$(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
else
$(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
}).css('display', '');
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
togglers.click();
}
},
/**
* helper function to hide the search marks again
*/
hideSearchWords : function() {
$('#searchbox .highlight-link').fadeOut(300);
$('span.highlighted').removeClass('highlighted');
},
/**
* make the url absolute
*/
makeURL : function(relativeURL) {
return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
},
/**
* get the current relative url
*/
getCurrentURL : function() {
var path = document.location.pathname;
var parts = path.split(/\//);
$.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
if (this == '..')
parts.pop();
});
var url = parts.join('/');
return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
},
initOnKeyListeners: function() {
$(document).keyup(function(event) {
var activeElementType = document.activeElement.tagName;
// don't navigate when in search box or textarea
if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') {
switch (event.keyCode) {
case 37: // left
var prevHref = $('link[rel="prev"]').prop('href');
if (prevHref) {
window.location.href = prevHref;
return false;
}
case 39: // right
var nextHref = $('link[rel="next"]').prop('href');
if (nextHref) {
window.location.href = nextHref;
return false;
}
}
}
});
}
};
// quick alias for translations
_ = Documentation.gettext;
$(document).ready(function() {
Documentation.init();
});

BIN
doc/build/html/_static/down-pressed.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

BIN
doc/build/html/_static/down.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 B

BIN
doc/build/html/_static/file.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

10074
doc/build/html/_static/jquery-3.1.0.js vendored Normal file

File diff suppressed because it is too large Load Diff

4
doc/build/html/_static/jquery.js vendored Normal file

File diff suppressed because one or more lines are too long

BIN
doc/build/html/_static/minus.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 B

BIN
doc/build/html/_static/plus.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 B

69
doc/build/html/_static/pygments.css vendored Normal file

@ -0,0 +1,69 @@
.highlight .hll { background-color: #ffffcc }
.highlight { background: #eeffcc; }
.highlight .c { color: #408090; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #007020; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */
.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #007020 } /* Comment.Preproc */
.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #FF0000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .go { color: #333333 } /* Generic.Output */
.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #0044DD } /* Generic.Traceback */
.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #007020 } /* Keyword.Pseudo */
.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #902000 } /* Keyword.Type */
.highlight .m { color: #208050 } /* Literal.Number */
.highlight .s { color: #4070a0 } /* Literal.String */
.highlight .na { color: #4070a0 } /* Name.Attribute */
.highlight .nb { color: #007020 } /* Name.Builtin */
.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
.highlight .no { color: #60add5 } /* Name.Constant */
.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #007020 } /* Name.Exception */
.highlight .nf { color: #06287e } /* Name.Function */
.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #bb60d5 } /* Name.Variable */
.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #208050 } /* Literal.Number.Bin */
.highlight .mf { color: #208050 } /* Literal.Number.Float */
.highlight .mh { color: #208050 } /* Literal.Number.Hex */
.highlight .mi { color: #208050 } /* Literal.Number.Integer */
.highlight .mo { color: #208050 } /* Literal.Number.Oct */
.highlight .sa { color: #4070a0 } /* Literal.String.Affix */
.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
.highlight .sc { color: #4070a0 } /* Literal.String.Char */
.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */
.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
.highlight .sx { color: #c65d09 } /* Literal.String.Other */
.highlight .sr { color: #235388 } /* Literal.String.Regex */
.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
.highlight .ss { color: #517918 } /* Literal.String.Symbol */
.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #06287e } /* Name.Function.Magic */
.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */
.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */

758
doc/build/html/_static/searchtools.js vendored Normal file

@ -0,0 +1,758 @@
/*
* searchtools.js_t
* ~~~~~~~~~~~~~~~~
*
* Sphinx JavaScript utilities for the full-text search.
*
* :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/* Non-minified version JS is _stemmer.js if file is provided */
/**
* Porter Stemmer
*/
var Stemmer = function() {
var step2list = {
ational: 'ate',
tional: 'tion',
enci: 'ence',
anci: 'ance',
izer: 'ize',
bli: 'ble',
alli: 'al',
entli: 'ent',
eli: 'e',
ousli: 'ous',
ization: 'ize',
ation: 'ate',
ator: 'ate',
alism: 'al',
iveness: 'ive',
fulness: 'ful',
ousness: 'ous',
aliti: 'al',
iviti: 'ive',
biliti: 'ble',
logi: 'log'
};
var step3list = {
icate: 'ic',
ative: '',
alize: 'al',
iciti: 'ic',
ical: 'ic',
ful: '',
ness: ''
};
var c = "[^aeiou]"; // consonant
var v = "[aeiouy]"; // vowel
var C = c + "[^aeiouy]*"; // consonant sequence
var V = v + "[aeiou]*"; // vowel sequence
var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
var s_v = "^(" + C + ")?" + v; // vowel in stem
this.stemWord = function (w) {
var stem;
var suffix;
var firstch;
var origword = w;
if (w.length < 3)
return w;
var re;
var re2;
var re3;
var re4;
firstch = w.substr(0,1);
if (firstch == "y")
w = firstch.toUpperCase() + w.substr(1);
// Step 1a
re = /^(.+?)(ss|i)es$/;
re2 = /^(.+?)([^s])s$/;
if (re.test(w))
w = w.replace(re,"$1$2");
else if (re2.test(w))
w = w.replace(re2,"$1$2");
// Step 1b
re = /^(.+?)eed$/;
re2 = /^(.+?)(ed|ing)$/;
if (re.test(w)) {
var fp = re.exec(w);
re = new RegExp(mgr0);
if (re.test(fp[1])) {
re = /.$/;
w = w.replace(re,"");
}
}
else if (re2.test(w)) {
var fp = re2.exec(w);
stem = fp[1];
re2 = new RegExp(s_v);
if (re2.test(stem)) {
w = stem;
re2 = /(at|bl|iz)$/;
re3 = new RegExp("([^aeiouylsz])\\1$");
re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
if (re2.test(w))
w = w + "e";
else if (re3.test(w)) {
re = /.$/;
w = w.replace(re,"");
}
else if (re4.test(w))
w = w + "e";
}
}
// Step 1c
re = /^(.+?)y$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(s_v);
if (re.test(stem))
w = stem + "i";
}
// Step 2
re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
suffix = fp[2];
re = new RegExp(mgr0);
if (re.test(stem))
w = stem + step2list[suffix];
}
// Step 3
re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
suffix = fp[2];
re = new RegExp(mgr0);
if (re.test(stem))
w = stem + step3list[suffix];
}
// Step 4
re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
re2 = /^(.+?)(s|t)(ion)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(mgr1);
if (re.test(stem))
w = stem;
}
else if (re2.test(w)) {
var fp = re2.exec(w);
stem = fp[1] + fp[2];
re2 = new RegExp(mgr1);
if (re2.test(stem))
w = stem;
}
// Step 5
re = /^(.+?)e$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(mgr1);
re2 = new RegExp(meq1);
re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
w = stem;
}
re = /ll$/;
re2 = new RegExp(mgr1);
if (re.test(w) && re2.test(w)) {
re = /.$/;
w = w.replace(re,"");
}
// and turn initial Y back to y
if (firstch == "y")
w = firstch.toLowerCase() + w.substr(1);
return w;
}
}
/**
* Simple result scoring code.
*/
var Scorer = {
// Implement the following function to further tweak the score for each result
// The function takes a result array [filename, title, anchor, descr, score]
// and returns the new score.
/*
score: function(result) {
return result[4];
},
*/
// query matches the full name of an object
objNameMatch: 11,
// or matches in the last dotted part of the object name
objPartialMatch: 6,
// Additive scores depending on the priority of the object
objPrio: {0: 15, // used to be importantResults
1: 5, // used to be objectResults
2: -5}, // used to be unimportantResults
// Used when the priority is not in the mapping.
objPrioDefault: 0,
// query found in title
title: 15,
// query found in terms
term: 5
};
var splitChars = (function() {
var result = {};
var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,
2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,
2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,
3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,
3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,
4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,
8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,
11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,
43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];
var i, j, start, end;
for (i = 0; i < singles.length; i++) {
result[singles[i]] = true;
}
var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],
[722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],
[1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],
[1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],
[1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],
[2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],
[2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],
[2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],
[2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],
[2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],
[2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],
[2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],
[3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],
[3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],
[3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],
[3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],
[3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],
[3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],
[4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],
[4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],
[4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],
[4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],
[5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],
[6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],
[6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],
[6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],
[6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],
[7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],
[7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],
[8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],
[8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],
[8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],
[10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],
[11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],
[12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],
[12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],
[12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],
[19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],
[42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],
[42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],
[43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],
[43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],
[43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],
[43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],
[44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],
[57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],
[64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],
[65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],
[65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];
for (i = 0; i < ranges.length; i++) {
start = ranges[i][0];
end = ranges[i][1];
for (j = start; j <= end; j++) {
result[j] = true;
}
}
return result;
})();
function splitQuery(query) {
var result = [];
var start = -1;
for (var i = 0; i < query.length; i++) {
if (splitChars[query.charCodeAt(i)]) {
if (start !== -1) {
result.push(query.slice(start, i));
start = -1;
}
} else if (start === -1) {
start = i;
}
}
if (start !== -1) {
result.push(query.slice(start));
}
return result;
}
/**
* Search Module
*/
var Search = {
_index : null,
_queued_query : null,
_pulse_status : -1,
init : function() {
var params = $.getQueryParameters();
if (params.q) {
var query = params.q[0];
$('input[name="q"]')[0].value = query;
this.performSearch(query);
}
},
loadIndex : function(url) {
$.ajax({type: "GET", url: url, data: null,
dataType: "script", cache: true,
complete: function(jqxhr, textstatus) {
if (textstatus != "success") {
document.getElementById("searchindexloader").src = url;
}
}});
},
setIndex : function(index) {
var q;
this._index = index;
if ((q = this._queued_query) !== null) {
this._queued_query = null;
Search.query(q);
}
},
hasIndex : function() {
return this._index !== null;
},
deferQuery : function(query) {
this._queued_query = query;
},
stopPulse : function() {
this._pulse_status = 0;
},
startPulse : function() {
if (this._pulse_status >= 0)
return;
function pulse() {
var i;
Search._pulse_status = (Search._pulse_status + 1) % 4;
var dotString = '';
for (i = 0; i < Search._pulse_status; i++)
dotString += '.';
Search.dots.text(dotString);
if (Search._pulse_status > -1)
window.setTimeout(pulse, 500);
}
pulse();
},
/**
* perform a search for something (or wait until index is loaded)
*/
performSearch : function(query) {
// create the required interface elements
this.out = $('#search-results');
this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
this.dots = $('<span></span>').appendTo(this.title);
this.status = $('<p style="display: none"></p>').appendTo(this.out);
this.output = $('<ul class="search"/>').appendTo(this.out);
$('#search-progress').text(_('Preparing search...'));
this.startPulse();
// index already loaded, the browser was quick!
if (this.hasIndex())
this.query(query);
else
this.deferQuery(query);
},
/**
* execute search (requires search index to be loaded)
*/
query : function(query) {
var i;
var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
// stem the searchterms and add them to the correct list
var stemmer = new Stemmer();
var searchterms = [];
var excluded = [];
var hlterms = [];
var tmp = splitQuery(query);
var objectterms = [];
for (i = 0; i < tmp.length; i++) {
if (tmp[i] !== "") {
objectterms.push(tmp[i].toLowerCase());
}
if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i].match(/^\d+$/) ||
tmp[i] === "") {
// skip this "word"
continue;
}
// stem the word
var word = stemmer.stemWord(tmp[i].toLowerCase());
// prevent stemmer from cutting word smaller than two chars
if(word.length < 3 && tmp[i].length >= 3) {
word = tmp[i];
}
var toAppend;
// select the correct list
if (word[0] == '-') {
toAppend = excluded;
word = word.substr(1);
}
else {
toAppend = searchterms;
hlterms.push(tmp[i].toLowerCase());
}
// only add if not already in the list
if (!$u.contains(toAppend, word))
toAppend.push(word);
}
var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
// console.debug('SEARCH: searching for:');
// console.info('required: ', searchterms);
// console.info('excluded: ', excluded);
// prepare search
var terms = this._index.terms;
var titleterms = this._index.titleterms;
// array of [filename, title, anchor, descr, score]
var results = [];
$('#search-progress').empty();
// lookup as object
for (i = 0; i < objectterms.length; i++) {
var others = [].concat(objectterms.slice(0, i),
objectterms.slice(i+1, objectterms.length));
results = results.concat(this.performObjectSearch(objectterms[i], others));
}
// lookup as search terms in fulltext
results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));
// let the scorer override scores with a custom scoring function
if (Scorer.score) {
for (i = 0; i < results.length; i++)
results[i][4] = Scorer.score(results[i]);
}
// now sort the results by score (in opposite order of appearance, since the
// display function below uses pop() to retrieve items) and then
// alphabetically
results.sort(function(a, b) {
var left = a[4];
var right = b[4];
if (left > right) {
return 1;
} else if (left < right) {
return -1;
} else {
// same score: sort alphabetically
left = a[1].toLowerCase();
right = b[1].toLowerCase();
return (left > right) ? -1 : ((left < right) ? 1 : 0);
}
});
// for debugging
//Search.lastresults = results.slice(); // a copy
//console.info('search results:', Search.lastresults);
// print the results
var resultCount = results.length;
function displayNextItem() {
// results left, load the summary and display it
if (results.length) {
var item = results.pop();
var listItem = $('<li style="display:none"></li>');
if (DOCUMENTATION_OPTIONS.FILE_SUFFIX === '') {
// dirhtml builder
var dirname = item[0] + '/';
if (dirname.match(/\/index\/$/)) {
dirname = dirname.substring(0, dirname.length-6);
} else if (dirname == 'index/') {
dirname = '';
}
listItem.append($('<a/>').attr('href',
DOCUMENTATION_OPTIONS.URL_ROOT + dirname +
highlightstring + item[2]).html(item[1]));
} else {
// normal html builders
listItem.append($('<a/>').attr('href',
item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
highlightstring + item[2]).html(item[1]));
}
if (item[3]) {
listItem.append($('<span> (' + item[3] + ')</span>'));
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
});
} else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
var suffix = DOCUMENTATION_OPTIONS.SOURCELINK_SUFFIX;
$.ajax({url: DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + item[5] + (item[5].slice(-suffix.length) === suffix ? '' : suffix),
dataType: "text",
complete: function(jqxhr, textstatus) {
var data = jqxhr.responseText;
if (data !== '' && data !== undefined) {
listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
}
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
});
}});
} else {
// no source available, just display title
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
});
}
}
// search finished, update title and status message
else {
Search.stopPulse();
Search.title.text(_('Search Results'));
if (!resultCount)
Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
else
Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
Search.status.fadeIn(500);
}
}
displayNextItem();
},
/**
* search for object names
*/
performObjectSearch : function(object, otherterms) {
var filenames = this._index.filenames;
var docnames = this._index.docnames;
var objects = this._index.objects;
var objnames = this._index.objnames;
var titles = this._index.titles;
var i;
var results = [];
for (var prefix in objects) {
for (var name in objects[prefix]) {
var fullname = (prefix ? prefix + '.' : '') + name;
if (fullname.toLowerCase().indexOf(object) > -1) {
var score = 0;
var parts = fullname.split('.');
// check for different match types: exact matches of full name or
// "last name" (i.e. last dotted part)
if (fullname == object || parts[parts.length - 1] == object) {
score += Scorer.objNameMatch;
// matches in last name
} else if (parts[parts.length - 1].indexOf(object) > -1) {
score += Scorer.objPartialMatch;
}
var match = objects[prefix][name];
var objname = objnames[match[1]][2];
var title = titles[match[0]];
// If more than one term searched for, we require other words to be
// found in the name/title/description
if (otherterms.length > 0) {
var haystack = (prefix + ' ' + name + ' ' +
objname + ' ' + title).toLowerCase();
var allfound = true;
for (i = 0; i < otherterms.length; i++) {
if (haystack.indexOf(otherterms[i]) == -1) {
allfound = false;
break;
}
}
if (!allfound) {
continue;
}
}
var descr = objname + _(', in ') + title;
var anchor = match[3];
if (anchor === '')
anchor = fullname;
else if (anchor == '-')
anchor = objnames[match[1]][1] + '-' + fullname;
// add custom score for some objects according to scorer
if (Scorer.objPrio.hasOwnProperty(match[2])) {
score += Scorer.objPrio[match[2]];
} else {
score += Scorer.objPrioDefault;
}
results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]);
}
}
}
return results;
},
/**
* search for full-text terms in the index
*/
performTermsSearch : function(searchterms, excluded, terms, titleterms) {
var docnames = this._index.docnames;
var filenames = this._index.filenames;
var titles = this._index.titles;
var i, j, file;
var fileMap = {};
var scoreMap = {};
var results = [];
// perform the search on the required terms
for (i = 0; i < searchterms.length; i++) {
var word = searchterms[i];
var files = [];
var _o = [
{files: terms[word], score: Scorer.term},
{files: titleterms[word], score: Scorer.title}
];
// no match but word was a required one
if ($u.every(_o, function(o){return o.files === undefined;})) {
break;
}
// found search word in contents
$u.each(_o, function(o) {
var _files = o.files;
if (_files === undefined)
return
if (_files.length === undefined)
_files = [_files];
files = files.concat(_files);
// set score for the word in each file to Scorer.term
for (j = 0; j < _files.length; j++) {
file = _files[j];
if (!(file in scoreMap))
scoreMap[file] = {}
scoreMap[file][word] = o.score;
}
});
// create the mapping
for (j = 0; j < files.length; j++) {
file = files[j];
if (file in fileMap)
fileMap[file].push(word);
else
fileMap[file] = [word];
}
}
// now check if the files don't contain excluded terms
for (file in fileMap) {
var valid = true;
// check if all requirements are matched
if (fileMap[file].length != searchterms.length)
continue;
// ensure that none of the excluded terms is in the search result
for (i = 0; i < excluded.length; i++) {
if (terms[excluded[i]] == file ||
titleterms[excluded[i]] == file ||
$u.contains(terms[excluded[i]] || [], file) ||
$u.contains(titleterms[excluded[i]] || [], file)) {
valid = false;
break;
}
}
// if we have still a valid result we can add it to the result list
if (valid) {
// select one (max) score for the file.
// for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
results.push([docnames[file], titles[file], '', null, score, filenames[file]]);
}
}
return results;
},
/**
* helper function to return a node containing the
* search summary for a given text. keywords is a list
* of stemmed words, hlwords is the list of normal, unstemmed
* words. the first one is used to find the occurrence, the
* latter for highlighting it.
*/
makeSearchSummary : function(text, keywords, hlwords) {
var textLower = text.toLowerCase();
var start = 0;
$.each(keywords, function() {
var i = textLower.indexOf(this.toLowerCase());
if (i > -1)
start = i;
});
start = Math.max(start - 120, 0);
var excerpt = ((start > 0) ? '...' : '') +
$.trim(text.substr(start, 240)) +
((start + 240 - text.length) ? '...' : '');
var rv = $('<div class="context"></div>').text(excerpt);
$.each(hlwords, function() {
rv = rv.highlightText(this, 'highlighted');
});
return rv;
}
};
$(document).ready(function() {
Search.init();
});

@ -0,0 +1,999 @@
// Underscore.js 1.3.1
// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
// Underscore is freely distributable under the MIT license.
// Portions of Underscore are inspired or borrowed from Prototype,
// Oliver Steele's Functional, and John Resig's Micro-Templating.
// For all details and documentation:
// http://documentcloud.github.com/underscore
(function() {
// Baseline setup
// --------------
// Establish the root object, `window` in the browser, or `global` on the server.
var root = this;
// Save the previous value of the `_` variable.
var previousUnderscore = root._;
// Establish the object that gets returned to break out of a loop iteration.
var breaker = {};
// Save bytes in the minified (but not gzipped) version:
var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
// Create quick reference variables for speed access to core prototypes.
var slice = ArrayProto.slice,
unshift = ArrayProto.unshift,
toString = ObjProto.toString,
hasOwnProperty = ObjProto.hasOwnProperty;
// All **ECMAScript 5** native function implementations that we hope to use
// are declared here.
var
nativeForEach = ArrayProto.forEach,
nativeMap = ArrayProto.map,
nativeReduce = ArrayProto.reduce,
nativeReduceRight = ArrayProto.reduceRight,
nativeFilter = ArrayProto.filter,
nativeEvery = ArrayProto.every,
nativeSome = ArrayProto.some,
nativeIndexOf = ArrayProto.indexOf,
nativeLastIndexOf = ArrayProto.lastIndexOf,
nativeIsArray = Array.isArray,
nativeKeys = Object.keys,
nativeBind = FuncProto.bind;
// Create a safe reference to the Underscore object for use below.
var _ = function(obj) { return new wrapper(obj); };
// Export the Underscore object for **Node.js**, with
// backwards-compatibility for the old `require()` API. If we're in
// the browser, add `_` as a global object via a string identifier,
// for Closure Compiler "advanced" mode.
if (typeof exports !== 'undefined') {
if (typeof module !== 'undefined' && module.exports) {
exports = module.exports = _;
}
exports._ = _;
} else {
root['_'] = _;
}
// Current version.
_.VERSION = '1.3.1';
// Collection Functions
// --------------------
// The cornerstone, an `each` implementation, aka `forEach`.
// Handles objects with the built-in `forEach`, arrays, and raw objects.
// Delegates to **ECMAScript 5**'s native `forEach` if available.
var each = _.each = _.forEach = function(obj, iterator, context) {
if (obj == null) return;
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
} else if (obj.length === +obj.length) {
for (var i = 0, l = obj.length; i < l; i++) {
if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
for (var key in obj) {
if (_.has(obj, key)) {
if (iterator.call(context, obj[key], key, obj) === breaker) return;
}
}
}
};
// Return the results of applying the iterator to each element.
// Delegates to **ECMAScript 5**'s native `map` if available.
_.map = _.collect = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
each(obj, function(value, index, list) {
results[results.length] = iterator.call(context, value, index, list);
});
if (obj.length === +obj.length) results.length = obj.length;
return results;
};
// **Reduce** builds up a single result from a list of values, aka `inject`,
// or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
_.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
var initial = arguments.length > 2;
if (obj == null) obj = [];
if (nativeReduce && obj.reduce === nativeReduce) {
if (context) iterator = _.bind(iterator, context);
return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
}
each(obj, function(value, index, list) {
if (!initial) {
memo = value;
initial = true;
} else {
memo = iterator.call(context, memo, value, index, list);
}
});
if (!initial) throw new TypeError('Reduce of empty array with no initial value');
return memo;
};
// The right-associative version of reduce, also known as `foldr`.
// Delegates to **ECMAScript 5**'s native `reduceRight` if available.
_.reduceRight = _.foldr = function(obj, iterator, memo, context) {
var initial = arguments.length > 2;
if (obj == null) obj = [];
if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
if (context) iterator = _.bind(iterator, context);
return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
}
var reversed = _.toArray(obj).reverse();
if (context && !initial) iterator = _.bind(iterator, context);
return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator);
};
// Return the first value which passes a truth test. Aliased as `detect`.
_.find = _.detect = function(obj, iterator, context) {
var result;
any(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)) {
result = value;
return true;
}
});
return result;
};
// Return all the elements that pass a truth test.
// Delegates to **ECMAScript 5**'s native `filter` if available.
// Aliased as `select`.
_.filter = _.select = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
each(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)) results[results.length] = value;
});
return results;
};
// Return all the elements for which a truth test fails.
_.reject = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
each(obj, function(value, index, list) {
if (!iterator.call(context, value, index, list)) results[results.length] = value;
});
return results;
};
// Determine whether all of the elements match a truth test.
// Delegates to **ECMAScript 5**'s native `every` if available.
// Aliased as `all`.
_.every = _.all = function(obj, iterator, context) {
var result = true;
if (obj == null) return result;
if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
each(obj, function(value, index, list) {
if (!(result = result && iterator.call(context, value, index, list))) return breaker;
});
return result;
};
// Determine if at least one element in the object matches a truth test.
// Delegates to **ECMAScript 5**'s native `some` if available.
// Aliased as `any`.
var any = _.some = _.any = function(obj, iterator, context) {
iterator || (iterator = _.identity);
var result = false;
if (obj == null) return result;
if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
each(obj, function(value, index, list) {
if (result || (result = iterator.call(context, value, index, list))) return breaker;
});
return !!result;
};
// Determine if a given value is included in the array or object using `===`.
// Aliased as `contains`.
_.include = _.contains = function(obj, target) {
var found = false;
if (obj == null) return found;
if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
found = any(obj, function(value) {
return value === target;
});
return found;
};
// Invoke a method (with arguments) on every item in a collection.
_.invoke = function(obj, method) {
var args = slice.call(arguments, 2);
return _.map(obj, function(value) {
return (_.isFunction(method) ? method || value : value[method]).apply(value, args);
});
};
// Convenience version of a common use case of `map`: fetching a property.
_.pluck = function(obj, key) {
return _.map(obj, function(value){ return value[key]; });
};
// Return the maximum element or (element-based computation).
_.max = function(obj, iterator, context) {
if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj);
if (!iterator && _.isEmpty(obj)) return -Infinity;
var result = {computed : -Infinity};
each(obj, function(value, index, list) {
var computed = iterator ? iterator.call(context, value, index, list) : value;
computed >= result.computed && (result = {value : value, computed : computed});
});
return result.value;
};
// Return the minimum element (or element-based computation).
_.min = function(obj, iterator, context) {
if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj);
if (!iterator && _.isEmpty(obj)) return Infinity;
var result = {computed : Infinity};
each(obj, function(value, index, list) {
var computed = iterator ? iterator.call(context, value, index, list) : value;
computed < result.computed && (result = {value : value, computed : computed});
});
return result.value;
};
// Shuffle an array.
_.shuffle = function(obj) {
var shuffled = [], rand;
each(obj, function(value, index, list) {
if (index == 0) {
shuffled[0] = value;
} else {
rand = Math.floor(Math.random() * (index + 1));
shuffled[index] = shuffled[rand];
shuffled[rand] = value;
}
});
return shuffled;
};
// Sort the object's values by a criterion produced by an iterator.
_.sortBy = function(obj, iterator, context) {
return _.pluck(_.map(obj, function(value, index, list) {
return {
value : value,
criteria : iterator.call(context, value, index, list)
};
}).sort(function(left, right) {
var a = left.criteria, b = right.criteria;
return a < b ? -1 : a > b ? 1 : 0;
}), 'value');
};
// Groups the object's values by a criterion. Pass either a string attribute
// to group by, or a function that returns the criterion.
_.groupBy = function(obj, val) {
var result = {};
var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };
each(obj, function(value, index) {
var key = iterator(value, index);
(result[key] || (result[key] = [])).push(value);
});
return result;
};
// Use a comparator function to figure out at what index an object should
// be inserted so as to maintain order. Uses binary search.
_.sortedIndex = function(array, obj, iterator) {
iterator || (iterator = _.identity);
var low = 0, high = array.length;
while (low < high) {
var mid = (low + high) >> 1;
iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;
}
return low;
};
// Safely convert anything iterable into a real, live array.
_.toArray = function(iterable) {
if (!iterable) return [];
if (iterable.toArray) return iterable.toArray();
if (_.isArray(iterable)) return slice.call(iterable);
if (_.isArguments(iterable)) return slice.call(iterable);
return _.values(iterable);
};
// Return the number of elements in an object.
_.size = function(obj) {
return _.toArray(obj).length;
};
// Array Functions
// ---------------
// Get the first element of an array. Passing **n** will return the first N
// values in the array. Aliased as `head`. The **guard** check allows it to work
// with `_.map`.
_.first = _.head = function(array, n, guard) {
return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
};
// Returns everything but the last entry of the array. Especcialy useful on
// the arguments object. Passing **n** will return all the values in
// the array, excluding the last N. The **guard** check allows it to work with
// `_.map`.
_.initial = function(array, n, guard) {
return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
};
// Get the last element of an array. Passing **n** will return the last N
// values in the array. The **guard** check allows it to work with `_.map`.
_.last = function(array, n, guard) {
if ((n != null) && !guard) {
return slice.call(array, Math.max(array.length - n, 0));
} else {
return array[array.length - 1];
}
};
// Returns everything but the first entry of the array. Aliased as `tail`.
// Especially useful on the arguments object. Passing an **index** will return
// the rest of the values in the array from that index onward. The **guard**
// check allows it to work with `_.map`.
_.rest = _.tail = function(array, index, guard) {
return slice.call(array, (index == null) || guard ? 1 : index);
};
// Trim out all falsy values from an array.
_.compact = function(array) {
return _.filter(array, function(value){ return !!value; });
};
// Return a completely flattened version of an array.
_.flatten = function(array, shallow) {
return _.reduce(array, function(memo, value) {
if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value));
memo[memo.length] = value;
return memo;
}, []);
};
// Return a version of the array that does not contain the specified value(s).
_.without = function(array) {
return _.difference(array, slice.call(arguments, 1));
};
// Produce a duplicate-free version of the array. If the array has already
// been sorted, you have the option of using a faster algorithm.
// Aliased as `unique`.
_.uniq = _.unique = function(array, isSorted, iterator) {
var initial = iterator ? _.map(array, iterator) : array;
var result = [];
_.reduce(initial, function(memo, el, i) {
if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) {
memo[memo.length] = el;
result[result.length] = array[i];
}
return memo;
}, []);
return result;
};
// Produce an array that contains the union: each distinct element from all of
// the passed-in arrays.
_.union = function() {
return _.uniq(_.flatten(arguments, true));
};
// Produce an array that contains every item shared between all the
// passed-in arrays. (Aliased as "intersect" for back-compat.)
_.intersection = _.intersect = function(array) {
var rest = slice.call(arguments, 1);
return _.filter(_.uniq(array), function(item) {
return _.every(rest, function(other) {
return _.indexOf(other, item) >= 0;
});
});
};
// Take the difference between one array and a number of other arrays.
// Only the elements present in just the first array will remain.
_.difference = function(array) {
var rest = _.flatten(slice.call(arguments, 1));
return _.filter(array, function(value){ return !_.include(rest, value); });
};
// Zip together multiple lists into a single array -- elements that share
// an index go together.
_.zip = function() {
var args = slice.call(arguments);
var length = _.max(_.pluck(args, 'length'));
var results = new Array(length);
for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i);
return results;
};
// If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
// we need this function. Return the position of the first occurrence of an
// item in an array, or -1 if the item is not included in the array.
// Delegates to **ECMAScript 5**'s native `indexOf` if available.
// If the array is large and already in sort order, pass `true`
// for **isSorted** to use binary search.
_.indexOf = function(array, item, isSorted) {
if (array == null) return -1;
var i, l;
if (isSorted) {
i = _.sortedIndex(array, item);
return array[i] === item ? i : -1;
}
if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;
return -1;
};
// Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
_.lastIndexOf = function(array, item) {
if (array == null) return -1;
if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
var i = array.length;
while (i--) if (i in array && array[i] === item) return i;
return -1;
};
// Generate an integer Array containing an arithmetic progression. A port of
// the native Python `range()` function. See
// [the Python documentation](http://docs.python.org/library/functions.html#range).
_.range = function(start, stop, step) {
if (arguments.length <= 1) {
stop = start || 0;
start = 0;
}
step = arguments[2] || 1;
var len = Math.max(Math.ceil((stop - start) / step), 0);
var idx = 0;
var range = new Array(len);
while(idx < len) {
range[idx++] = start;
start += step;
}
return range;
};
// Function (ahem) Functions
// ------------------
// Reusable constructor function for prototype setting.
var ctor = function(){};
// Create a function bound to a given object (assigning `this`, and arguments,
// optionally). Binding with arguments is also known as `curry`.
// Delegates to **ECMAScript 5**'s native `Function.bind` if available.
// We check for `func.bind` first, to fail fast when `func` is undefined.
_.bind = function bind(func, context) {
var bound, args;
if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
if (!_.isFunction(func)) throw new TypeError;
args = slice.call(arguments, 2);
return bound = function() {
if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
ctor.prototype = func.prototype;
var self = new ctor;
var result = func.apply(self, args.concat(slice.call(arguments)));
if (Object(result) === result) return result;
return self;
};
};
// Bind all of an object's methods to that object. Useful for ensuring that
// all callbacks defined on an object belong to it.
_.bindAll = function(obj) {
var funcs = slice.call(arguments, 1);
if (funcs.length == 0) funcs = _.functions(obj);
each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
return obj;
};
// Memoize an expensive function by storing its results.
_.memoize = function(func, hasher) {
var memo = {};
hasher || (hasher = _.identity);
return function() {
var key = hasher.apply(this, arguments);
return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
};
};
// Delays a function for the given number of milliseconds, and then calls
// it with the arguments supplied.
_.delay = function(func, wait) {
var args = slice.call(arguments, 2);
return setTimeout(function(){ return func.apply(func, args); }, wait);
};
// Defers a function, scheduling it to run after the current call stack has
// cleared.
_.defer = function(func) {
return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
};
// Returns a function, that, when invoked, will only be triggered at most once
// during a given window of time.
_.throttle = function(func, wait) {
var context, args, timeout, throttling, more;
var whenDone = _.debounce(function(){ more = throttling = false; }, wait);
return function() {
context = this; args = arguments;
var later = function() {
timeout = null;
if (more) func.apply(context, args);
whenDone();
};
if (!timeout) timeout = setTimeout(later, wait);
if (throttling) {
more = true;
} else {
func.apply(context, args);
}
whenDone();
throttling = true;
};
};
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds.
_.debounce = function(func, wait) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
func.apply(context, args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
};
// Returns a function that will be executed at most one time, no matter how
// often you call it. Useful for lazy initialization.
_.once = function(func) {
var ran = false, memo;
return function() {
if (ran) return memo;
ran = true;
return memo = func.apply(this, arguments);
};
};
// Returns the first function passed as an argument to the second,
// allowing you to adjust arguments, run code before and after, and
// conditionally execute the original function.
_.wrap = function(func, wrapper) {
return function() {
var args = [func].concat(slice.call(arguments, 0));
return wrapper.apply(this, args);
};
};
// Returns a function that is the composition of a list of functions, each
// consuming the return value of the function that follows.
_.compose = function() {
var funcs = arguments;
return function() {
var args = arguments;
for (var i = funcs.length - 1; i >= 0; i--) {
args = [funcs[i].apply(this, args)];
}
return args[0];
};
};
// Returns a function that will only be executed after being called N times.
_.after = function(times, func) {
if (times <= 0) return func();
return function() {
if (--times < 1) { return func.apply(this, arguments); }
};
};
// Object Functions
// ----------------
// Retrieve the names of an object's properties.
// Delegates to **ECMAScript 5**'s native `Object.keys`
_.keys = nativeKeys || function(obj) {
if (obj !== Object(obj)) throw new TypeError('Invalid object');
var keys = [];
for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
return keys;
};
// Retrieve the values of an object's properties.
_.values = function(obj) {
return _.map(obj, _.identity);
};
// Return a sorted list of the function names available on the object.
// Aliased as `methods`
_.functions = _.methods = function(obj) {
var names = [];
for (var key in obj) {
if (_.isFunction(obj[key])) names.push(key);
}
return names.sort();
};
// Extend a given object with all the properties in passed-in object(s).
_.extend = function(obj) {
each(slice.call(arguments, 1), function(source) {
for (var prop in source) {
obj[prop] = source[prop];
}
});
return obj;
};
// Fill in a given object with default properties.
_.defaults = function(obj) {
each(slice.call(arguments, 1), function(source) {
for (var prop in source) {
if (obj[prop] == null) obj[prop] = source[prop];
}
});
return obj;
};
// Create a (shallow-cloned) duplicate of an object.
_.clone = function(obj) {
if (!_.isObject(obj)) return obj;
return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
};
// Invokes interceptor with the obj, and then returns obj.
// The primary purpose of this method is to "tap into" a method chain, in
// order to perform operations on intermediate results within the chain.
_.tap = function(obj, interceptor) {
interceptor(obj);
return obj;
};
// Internal recursive comparison function.
function eq(a, b, stack) {
// Identical objects are equal. `0 === -0`, but they aren't identical.
// See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
if (a === b) return a !== 0 || 1 / a == 1 / b;
// A strict comparison is necessary because `null == undefined`.
if (a == null || b == null) return a === b;
// Unwrap any wrapped objects.
if (a._chain) a = a._wrapped;
if (b._chain) b = b._wrapped;
// Invoke a custom `isEqual` method if one is provided.
if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b);
if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a);
// Compare `[[Class]]` names.
var className = toString.call(a);
if (className != toString.call(b)) return false;
switch (className) {
// Strings, numbers, dates, and booleans are compared by value.
case '[object String]':
// Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
// equivalent to `new String("5")`.
return a == String(b);
case '[object Number]':
// `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
// other numeric values.
return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
case '[object Date]':
case '[object Boolean]':
// Coerce dates and booleans to numeric primitive values. Dates are compared by their
// millisecond representations. Note that invalid dates with millisecond representations
// of `NaN` are not equivalent.
return +a == +b;
// RegExps are compared by their source patterns and flags.
case '[object RegExp]':
return a.source == b.source &&
a.global == b.global &&
a.multiline == b.multiline &&
a.ignoreCase == b.ignoreCase;
}
if (typeof a != 'object' || typeof b != 'object') return false;
// Assume equality for cyclic structures. The algorithm for detecting cyclic
// structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
var length = stack.length;
while (length--) {
// Linear search. Performance is inversely proportional to the number of
// unique nested structures.
if (stack[length] == a) return true;
}
// Add the first object to the stack of traversed objects.
stack.push(a);
var size = 0, result = true;
// Recursively compare objects and arrays.
if (className == '[object Array]') {
// Compare array lengths to determine if a deep comparison is necessary.
size = a.length;
result = size == b.length;
if (result) {
// Deep compare the contents, ignoring non-numeric properties.
while (size--) {
// Ensure commutative equality for sparse arrays.
if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break;
}
}
} else {
// Objects with different constructors are not equivalent.
if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false;
// Deep compare objects.
for (var key in a) {
if (_.has(a, key)) {
// Count the expected number of properties.
size++;
// Deep compare each member.
if (!(result = _.has(b, key) && eq(a[key], b[key], stack))) break;
}
}
// Ensure that both objects contain the same number of properties.
if (result) {
for (key in b) {
if (_.has(b, key) && !(size--)) break;
}
result = !size;
}
}
// Remove the first object from the stack of traversed objects.
stack.pop();
return result;
}
// Perform a deep comparison to check if two objects are equal.
_.isEqual = function(a, b) {
return eq(a, b, []);
};
// Is a given array, string, or object empty?
// An "empty" object has no enumerable own-properties.
_.isEmpty = function(obj) {
if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
for (var key in obj) if (_.has(obj, key)) return false;
return true;
};
// Is a given value a DOM element?
_.isElement = function(obj) {
return !!(obj && obj.nodeType == 1);
};
// Is a given value an array?
// Delegates to ECMA5's native Array.isArray
_.isArray = nativeIsArray || function(obj) {
return toString.call(obj) == '[object Array]';
};
// Is a given variable an object?
_.isObject = function(obj) {
return obj === Object(obj);
};
// Is a given variable an arguments object?
_.isArguments = function(obj) {
return toString.call(obj) == '[object Arguments]';
};
if (!_.isArguments(arguments)) {
_.isArguments = function(obj) {
return !!(obj && _.has(obj, 'callee'));
};
}
// Is a given value a function?
_.isFunction = function(obj) {
return toString.call(obj) == '[object Function]';
};
// Is a given value a string?
_.isString = function(obj) {
return toString.call(obj) == '[object String]';
};
// Is a given value a number?
_.isNumber = function(obj) {
return toString.call(obj) == '[object Number]';
};
// Is the given value `NaN`?
_.isNaN = function(obj) {
// `NaN` is the only value for which `===` is not reflexive.
return obj !== obj;
};
// Is a given value a boolean?
_.isBoolean = function(obj) {
return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
};
// Is a given value a date?
_.isDate = function(obj) {
return toString.call(obj) == '[object Date]';
};
// Is the given value a regular expression?
_.isRegExp = function(obj) {
return toString.call(obj) == '[object RegExp]';
};
// Is a given value equal to null?
_.isNull = function(obj) {
return obj === null;
};
// Is a given variable undefined?
_.isUndefined = function(obj) {
return obj === void 0;
};
// Has own property?
_.has = function(obj, key) {
return hasOwnProperty.call(obj, key);
};
// Utility Functions
// -----------------
// Run Underscore.js in *noConflict* mode, returning the `_` variable to its
// previous owner. Returns a reference to the Underscore object.
_.noConflict = function() {
root._ = previousUnderscore;
return this;
};
// Keep the identity function around for default iterators.
_.identity = function(value) {
return value;
};
// Run a function **n** times.
_.times = function (n, iterator, context) {
for (var i = 0; i < n; i++) iterator.call(context, i);
};
// Escape a string for HTML interpolation.
_.escape = function(string) {
return (''+string).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/\//g,'&#x2F;');
};
// Add your own custom functions to the Underscore object, ensuring that
// they're correctly added to the OOP wrapper as well.
_.mixin = function(obj) {
each(_.functions(obj), function(name){
addToWrapper(name, _[name] = obj[name]);
});
};
// Generate a unique integer id (unique within the entire client session).
// Useful for temporary DOM ids.
var idCounter = 0;
_.uniqueId = function(prefix) {
var id = idCounter++;
return prefix ? prefix + id : id;
};
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /.^/;
// Within an interpolation, evaluation, or escaping, remove HTML escaping
// that had been previously added.
var unescape = function(code) {
return code.replace(/\\\\/g, '\\').replace(/\\'/g, "'");
};
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(str, data) {
var c = _.templateSettings;
var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
'with(obj||{}){__p.push(\'' +
str.replace(/\\/g, '\\\\')
.replace(/'/g, "\\'")
.replace(c.escape || noMatch, function(match, code) {
return "',_.escape(" + unescape(code) + "),'";
})
.replace(c.interpolate || noMatch, function(match, code) {
return "'," + unescape(code) + ",'";
})
.replace(c.evaluate || noMatch, function(match, code) {
return "');" + unescape(code).replace(/[\r\n\t]/g, ' ') + ";__p.push('";
})
.replace(/\r/g, '\\r')
.replace(/\n/g, '\\n')
.replace(/\t/g, '\\t')
+ "');}return __p.join('');";
var func = new Function('obj', '_', tmpl);
if (data) return func(data, _);
return function(data) {
return func.call(this, data, _);
};
};
// Add a "chain" function, which will delegate to the wrapper.
_.chain = function(obj) {
return _(obj).chain();
};
// The OOP Wrapper
// ---------------
// If Underscore is called as a function, it returns a wrapped object that
// can be used OO-style. This wrapper holds altered versions of all the
// underscore functions. Wrapped objects may be chained.
var wrapper = function(obj) { this._wrapped = obj; };
// Expose `wrapper.prototype` as `_.prototype`
_.prototype = wrapper.prototype;
// Helper function to continue chaining intermediate results.
var result = function(obj, chain) {
return chain ? _(obj).chain() : obj;
};
// A method to easily add functions to the OOP wrapper.
var addToWrapper = function(name, func) {
wrapper.prototype[name] = function() {
var args = slice.call(arguments);
unshift.call(args, this._wrapped);
return result(func.apply(_, args), this._chain);
};
};
// Add all of the Underscore functions to the wrapper object.
_.mixin(_);
// Add all mutator Array functions to the wrapper.
each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
var method = ArrayProto[name];
wrapper.prototype[name] = function() {
var wrapped = this._wrapped;
method.apply(wrapped, arguments);
var length = wrapped.length;
if ((name == 'shift' || name == 'splice') && length === 0) delete wrapped[0];
return result(wrapped, this._chain);
};
});
// Add all accessor Array functions to the wrapper.
each(['concat', 'join', 'slice'], function(name) {
var method = ArrayProto[name];
wrapper.prototype[name] = function() {
return result(method.apply(this._wrapped, arguments), this._chain);
};
});
// Start chaining a wrapped Underscore object.
wrapper.prototype.chain = function() {
this._chain = true;
return this;
};
// Extracts the result from a wrapped and chained object.
wrapper.prototype.value = function() {
return this._wrapped;
};
}).call(this);

31
doc/build/html/_static/underscore.js vendored Normal file

@ -0,0 +1,31 @@
// Underscore.js 1.3.1
// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
// Underscore is freely distributable under the MIT license.
// Portions of Underscore are inspired or borrowed from Prototype,
// Oliver Steele's Functional, and John Resig's Micro-Templating.
// For all details and documentation:
// http://documentcloud.github.com/underscore
(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source==
c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,
h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each=
b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===n)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===n)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(x&&a.map===x)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.length>2;a==
null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=
function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e=
e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck=
function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a,computed:b})});
return e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){f==0?b[0]=a:(d=Math.floor(Math.random()*(f+1)),b[f]=b[d],b[d]=a)});return b};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,
c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-1]};b.rest=
b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];return d},[]);
return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,c,
d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(p&&a.indexOf===p)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(D&&a.lastIndexOf===D)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g};
var F=function(){};b.bind=function(a,c){var d,e;if(a.bind===s&&s)return s.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));F.prototype=a.prototype;var b=new F,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,
c){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c));g?h=true:
a.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};
b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments,
1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};
b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};
b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};b.mixin=function(a){j(b.functions(a),
function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+
u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]=
function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=
true;return this};m.prototype.value=function(){return this._wrapped}}).call(this);

BIN
doc/build/html/_static/up-pressed.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

BIN
doc/build/html/_static/up.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 B

808
doc/build/html/_static/websupport.js vendored Normal file

@ -0,0 +1,808 @@
/*
* websupport.js
* ~~~~~~~~~~~~~
*
* sphinx.websupport utilities for all documentation.
*
* :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
(function($) {
$.fn.autogrow = function() {
return this.each(function() {
var textarea = this;
$.fn.autogrow.resize(textarea);
$(textarea)
.focus(function() {
textarea.interval = setInterval(function() {
$.fn.autogrow.resize(textarea);
}, 500);
})
.blur(function() {
clearInterval(textarea.interval);
});
});
};
$.fn.autogrow.resize = function(textarea) {
var lineHeight = parseInt($(textarea).css('line-height'), 10);
var lines = textarea.value.split('\n');
var columns = textarea.cols;
var lineCount = 0;
$.each(lines, function() {
lineCount += Math.ceil(this.length / columns) || 1;
});
var height = lineHeight * (lineCount + 1);
$(textarea).css('height', height);
};
})(jQuery);
(function($) {
var comp, by;
function init() {
initEvents();
initComparator();
}
function initEvents() {
$(document).on("click", 'a.comment-close', function(event) {
event.preventDefault();
hide($(this).attr('id').substring(2));
});
$(document).on("click", 'a.vote', function(event) {
event.preventDefault();
handleVote($(this));
});
$(document).on("click", 'a.reply', function(event) {
event.preventDefault();
openReply($(this).attr('id').substring(2));
});
$(document).on("click", 'a.close-reply', function(event) {
event.preventDefault();
closeReply($(this).attr('id').substring(2));
});
$(document).on("click", 'a.sort-option', function(event) {
event.preventDefault();
handleReSort($(this));
});
$(document).on("click", 'a.show-proposal', function(event) {
event.preventDefault();
showProposal($(this).attr('id').substring(2));
});
$(document).on("click", 'a.hide-proposal', function(event) {
event.preventDefault();
hideProposal($(this).attr('id').substring(2));
});
$(document).on("click", 'a.show-propose-change', function(event) {
event.preventDefault();
showProposeChange($(this).attr('id').substring(2));
});
$(document).on("click", 'a.hide-propose-change', function(event) {
event.preventDefault();
hideProposeChange($(this).attr('id').substring(2));
});
$(document).on("click", 'a.accept-comment', function(event) {
event.preventDefault();
acceptComment($(this).attr('id').substring(2));
});
$(document).on("click", 'a.delete-comment', function(event) {
event.preventDefault();
deleteComment($(this).attr('id').substring(2));
});
$(document).on("click", 'a.comment-markup', function(event) {
event.preventDefault();
toggleCommentMarkupBox($(this).attr('id').substring(2));
});
}
/**
* Set comp, which is a comparator function used for sorting and
* inserting comments into the list.
*/
function setComparator() {
// If the first three letters are "asc", sort in ascending order
// and remove the prefix.
if (by.substring(0,3) == 'asc') {
var i = by.substring(3);
comp = function(a, b) { return a[i] - b[i]; };
} else {
// Otherwise sort in descending order.
comp = function(a, b) { return b[by] - a[by]; };
}
// Reset link styles and format the selected sort option.
$('a.sel').attr('href', '#').removeClass('sel');
$('a.by' + by).removeAttr('href').addClass('sel');
}
/**
* Create a comp function. If the user has preferences stored in
* the sortBy cookie, use those, otherwise use the default.
*/
function initComparator() {
by = 'rating'; // Default to sort by rating.
// If the sortBy cookie is set, use that instead.
if (document.cookie.length > 0) {
var start = document.cookie.indexOf('sortBy=');
if (start != -1) {
start = start + 7;
var end = document.cookie.indexOf(";", start);
if (end == -1) {
end = document.cookie.length;
by = unescape(document.cookie.substring(start, end));
}
}
}
setComparator();
}
/**
* Show a comment div.
*/
function show(id) {
$('#ao' + id).hide();
$('#ah' + id).show();
var context = $.extend({id: id}, opts);
var popup = $(renderTemplate(popupTemplate, context)).hide();
popup.find('textarea[name="proposal"]').hide();
popup.find('a.by' + by).addClass('sel');
var form = popup.find('#cf' + id);
form.submit(function(event) {
event.preventDefault();
addComment(form);
});
$('#s' + id).after(popup);
popup.slideDown('fast', function() {
getComments(id);
});
}
/**
* Hide a comment div.
*/
function hide(id) {
$('#ah' + id).hide();
$('#ao' + id).show();
var div = $('#sc' + id);
div.slideUp('fast', function() {
div.remove();
});
}
/**
* Perform an ajax request to get comments for a node
* and insert the comments into the comments tree.
*/
function getComments(id) {
$.ajax({
type: 'GET',
url: opts.getCommentsURL,
data: {node: id},
success: function(data, textStatus, request) {
var ul = $('#cl' + id);
var speed = 100;
$('#cf' + id)
.find('textarea[name="proposal"]')
.data('source', data.source);
if (data.comments.length === 0) {
ul.html('<li>No comments yet.</li>');
ul.data('empty', true);
} else {
// If there are comments, sort them and put them in the list.
var comments = sortComments(data.comments);
speed = data.comments.length * 100;
appendComments(comments, ul);
ul.data('empty', false);
}
$('#cn' + id).slideUp(speed + 200);
ul.slideDown(speed);
},
error: function(request, textStatus, error) {
showError('Oops, there was a problem retrieving the comments.');
},
dataType: 'json'
});
}
/**
* Add a comment via ajax and insert the comment into the comment tree.
*/
function addComment(form) {
var node_id = form.find('input[name="node"]').val();
var parent_id = form.find('input[name="parent"]').val();
var text = form.find('textarea[name="comment"]').val();
var proposal = form.find('textarea[name="proposal"]').val();
if (text == '') {
showError('Please enter a comment.');
return;
}
// Disable the form that is being submitted.
form.find('textarea,input').attr('disabled', 'disabled');
// Send the comment to the server.
$.ajax({
type: "POST",
url: opts.addCommentURL,
dataType: 'json',
data: {
node: node_id,
parent: parent_id,
text: text,
proposal: proposal
},
success: function(data, textStatus, error) {
// Reset the form.
if (node_id) {
hideProposeChange(node_id);
}
form.find('textarea')
.val('')
.add(form.find('input'))
.removeAttr('disabled');
var ul = $('#cl' + (node_id || parent_id));
if (ul.data('empty')) {
$(ul).empty();
ul.data('empty', false);
}
insertComment(data.comment);
var ao = $('#ao' + node_id);
ao.find('img').attr({'src': opts.commentBrightImage});
if (node_id) {
// if this was a "root" comment, remove the commenting box
// (the user can get it back by reopening the comment popup)
$('#ca' + node_id).slideUp();
}
},
error: function(request, textStatus, error) {
form.find('textarea,input').removeAttr('disabled');
showError('Oops, there was a problem adding the comment.');
}
});
}
/**
* Recursively append comments to the main comment list and children
* lists, creating the comment tree.
*/
function appendComments(comments, ul) {
$.each(comments, function() {
var div = createCommentDiv(this);
ul.append($(document.createElement('li')).html(div));
appendComments(this.children, div.find('ul.comment-children'));
// To avoid stagnating data, don't store the comments children in data.
this.children = null;
div.data('comment', this);
});
}
/**
* After adding a new comment, it must be inserted in the correct
* location in the comment tree.
*/
function insertComment(comment) {
var div = createCommentDiv(comment);
// To avoid stagnating data, don't store the comments children in data.
comment.children = null;
div.data('comment', comment);
var ul = $('#cl' + (comment.node || comment.parent));
var siblings = getChildren(ul);
var li = $(document.createElement('li'));
li.hide();
// Determine where in the parents children list to insert this comment.
for(i=0; i < siblings.length; i++) {
if (comp(comment, siblings[i]) <= 0) {
$('#cd' + siblings[i].id)
.parent()
.before(li.html(div));
li.slideDown('fast');
return;
}
}
// If we get here, this comment rates lower than all the others,
// or it is the only comment in the list.
ul.append(li.html(div));
li.slideDown('fast');
}
function acceptComment(id) {
$.ajax({
type: 'POST',
url: opts.acceptCommentURL,
data: {id: id},
success: function(data, textStatus, request) {
$('#cm' + id).fadeOut('fast');
$('#cd' + id).removeClass('moderate');
},
error: function(request, textStatus, error) {
showError('Oops, there was a problem accepting the comment.');
}
});
}
function deleteComment(id) {
$.ajax({
type: 'POST',
url: opts.deleteCommentURL,
data: {id: id},
success: function(data, textStatus, request) {
var div = $('#cd' + id);
if (data == 'delete') {
// Moderator mode: remove the comment and all children immediately
div.slideUp('fast', function() {
div.remove();
});
return;
}
// User mode: only mark the comment as deleted
div
.find('span.user-id:first')
.text('[deleted]').end()
.find('div.comment-text:first')
.text('[deleted]').end()
.find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id +
', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id)
.remove();
var comment = div.data('comment');
comment.username = '[deleted]';
comment.text = '[deleted]';
div.data('comment', comment);
},
error: function(request, textStatus, error) {
showError('Oops, there was a problem deleting the comment.');
}
});
}
function showProposal(id) {
$('#sp' + id).hide();
$('#hp' + id).show();
$('#pr' + id).slideDown('fast');
}
function hideProposal(id) {
$('#hp' + id).hide();
$('#sp' + id).show();
$('#pr' + id).slideUp('fast');
}
function showProposeChange(id) {
$('#pc' + id).hide();
$('#hc' + id).show();
var textarea = $('#pt' + id);
textarea.val(textarea.data('source'));
$.fn.autogrow.resize(textarea[0]);
textarea.slideDown('fast');
}
function hideProposeChange(id) {
$('#hc' + id).hide();
$('#pc' + id).show();
var textarea = $('#pt' + id);
textarea.val('').removeAttr('disabled');
textarea.slideUp('fast');
}
function toggleCommentMarkupBox(id) {
$('#mb' + id).toggle();
}
/** Handle when the user clicks on a sort by link. */
function handleReSort(link) {
var classes = link.attr('class').split(/\s+/);
for (var i=0; i<classes.length; i++) {
if (classes[i] != 'sort-option') {
by = classes[i].substring(2);
}
}
setComparator();
// Save/update the sortBy cookie.
var expiration = new Date();
expiration.setDate(expiration.getDate() + 365);
document.cookie= 'sortBy=' + escape(by) +
';expires=' + expiration.toUTCString();
$('ul.comment-ul').each(function(index, ul) {
var comments = getChildren($(ul), true);
comments = sortComments(comments);
appendComments(comments, $(ul).empty());
});
}
/**
* Function to process a vote when a user clicks an arrow.
*/
function handleVote(link) {
if (!opts.voting) {
showError("You'll need to login to vote.");
return;
}
var id = link.attr('id');
if (!id) {
// Didn't click on one of the voting arrows.
return;
}
// If it is an unvote, the new vote value is 0,
// Otherwise it's 1 for an upvote, or -1 for a downvote.
var value = 0;
if (id.charAt(1) != 'u') {
value = id.charAt(0) == 'u' ? 1 : -1;
}
// The data to be sent to the server.
var d = {
comment_id: id.substring(2),
value: value
};
// Swap the vote and unvote links.
link.hide();
$('#' + id.charAt(0) + (id.charAt(1) == 'u' ? 'v' : 'u') + d.comment_id)
.show();
// The div the comment is displayed in.
var div = $('div#cd' + d.comment_id);
var data = div.data('comment');
// If this is not an unvote, and the other vote arrow has
// already been pressed, unpress it.
if ((d.value !== 0) && (data.vote === d.value * -1)) {
$('#' + (d.value == 1 ? 'd' : 'u') + 'u' + d.comment_id).hide();
$('#' + (d.value == 1 ? 'd' : 'u') + 'v' + d.comment_id).show();
}
// Update the comments rating in the local data.
data.rating += (data.vote === 0) ? d.value : (d.value - data.vote);
data.vote = d.value;
div.data('comment', data);
// Change the rating text.
div.find('.rating:first')
.text(data.rating + ' point' + (data.rating == 1 ? '' : 's'));
// Send the vote information to the server.
$.ajax({
type: "POST",
url: opts.processVoteURL,
data: d,
error: function(request, textStatus, error) {
showError('Oops, there was a problem casting that vote.');
}
});
}
/**
* Open a reply form used to reply to an existing comment.
*/
function openReply(id) {
// Swap out the reply link for the hide link
$('#rl' + id).hide();
$('#cr' + id).show();
// Add the reply li to the children ul.
var div = $(renderTemplate(replyTemplate, {id: id})).hide();
$('#cl' + id)
.prepend(div)
// Setup the submit handler for the reply form.
.find('#rf' + id)
.submit(function(event) {
event.preventDefault();
addComment($('#rf' + id));
closeReply(id);
})
.find('input[type=button]')
.click(function() {
closeReply(id);
});
div.slideDown('fast', function() {
$('#rf' + id).find('textarea').focus();
});
}
/**
* Close the reply form opened with openReply.
*/
function closeReply(id) {
// Remove the reply div from the DOM.
$('#rd' + id).slideUp('fast', function() {
$(this).remove();
});
// Swap out the hide link for the reply link
$('#cr' + id).hide();
$('#rl' + id).show();
}
/**
* Recursively sort a tree of comments using the comp comparator.
*/
function sortComments(comments) {
comments.sort(comp);
$.each(comments, function() {
this.children = sortComments(this.children);
});
return comments;
}
/**
* Get the children comments from a ul. If recursive is true,
* recursively include childrens' children.
*/
function getChildren(ul, recursive) {
var children = [];
ul.children().children("[id^='cd']")
.each(function() {
var comment = $(this).data('comment');
if (recursive)
comment.children = getChildren($(this).find('#cl' + comment.id), true);
children.push(comment);
});
return children;
}
/** Create a div to display a comment in. */
function createCommentDiv(comment) {
if (!comment.displayed && !opts.moderator) {
return $('<div class="moderate">Thank you! Your comment will show up '
+ 'once it is has been approved by a moderator.</div>');
}
// Prettify the comment rating.
comment.pretty_rating = comment.rating + ' point' +
(comment.rating == 1 ? '' : 's');
// Make a class (for displaying not yet moderated comments differently)
comment.css_class = comment.displayed ? '' : ' moderate';
// Create a div for this comment.
var context = $.extend({}, opts, comment);
var div = $(renderTemplate(commentTemplate, context));
// If the user has voted on this comment, highlight the correct arrow.
if (comment.vote) {
var direction = (comment.vote == 1) ? 'u' : 'd';
div.find('#' + direction + 'v' + comment.id).hide();
div.find('#' + direction + 'u' + comment.id).show();
}
if (opts.moderator || comment.text != '[deleted]') {
div.find('a.reply').show();
if (comment.proposal_diff)
div.find('#sp' + comment.id).show();
if (opts.moderator && !comment.displayed)
div.find('#cm' + comment.id).show();
if (opts.moderator || (opts.username == comment.username))
div.find('#dc' + comment.id).show();
}
return div;
}
/**
* A simple template renderer. Placeholders such as <%id%> are replaced
* by context['id'] with items being escaped. Placeholders such as <#id#>
* are not escaped.
*/
function renderTemplate(template, context) {
var esc = $(document.createElement('div'));
function handle(ph, escape) {
var cur = context;
$.each(ph.split('.'), function() {
cur = cur[this];
});
return escape ? esc.text(cur || "").html() : cur;
}
return template.replace(/<([%#])([\w\.]*)\1>/g, function() {
return handle(arguments[2], arguments[1] == '%' ? true : false);
});
}
/** Flash an error message briefly. */
function showError(message) {
$(document.createElement('div')).attr({'class': 'popup-error'})
.append($(document.createElement('div'))
.attr({'class': 'error-message'}).text(message))
.appendTo('body')
.fadeIn("slow")
.delay(2000)
.fadeOut("slow");
}
/** Add a link the user uses to open the comments popup. */
$.fn.comment = function() {
return this.each(function() {
var id = $(this).attr('id').substring(1);
var count = COMMENT_METADATA[id];
var title = count + ' comment' + (count == 1 ? '' : 's');
var image = count > 0 ? opts.commentBrightImage : opts.commentImage;
var addcls = count == 0 ? ' nocomment' : '';
$(this)
.append(
$(document.createElement('a')).attr({
href: '#',
'class': 'sphinx-comment-open' + addcls,
id: 'ao' + id
})
.append($(document.createElement('img')).attr({
src: image,
alt: 'comment',
title: title
}))
.click(function(event) {
event.preventDefault();
show($(this).attr('id').substring(2));
})
)
.append(
$(document.createElement('a')).attr({
href: '#',
'class': 'sphinx-comment-close hidden',
id: 'ah' + id
})
.append($(document.createElement('img')).attr({
src: opts.closeCommentImage,
alt: 'close',
title: 'close'
}))
.click(function(event) {
event.preventDefault();
hide($(this).attr('id').substring(2));
})
);
});
};
var opts = {
processVoteURL: '/_process_vote',
addCommentURL: '/_add_comment',
getCommentsURL: '/_get_comments',
acceptCommentURL: '/_accept_comment',
deleteCommentURL: '/_delete_comment',
commentImage: '/static/_static/comment.png',
closeCommentImage: '/static/_static/comment-close.png',
loadingImage: '/static/_static/ajax-loader.gif',
commentBrightImage: '/static/_static/comment-bright.png',
upArrow: '/static/_static/up.png',
downArrow: '/static/_static/down.png',
upArrowPressed: '/static/_static/up-pressed.png',
downArrowPressed: '/static/_static/down-pressed.png',
voting: false,
moderator: false
};
if (typeof COMMENT_OPTIONS != "undefined") {
opts = jQuery.extend(opts, COMMENT_OPTIONS);
}
var popupTemplate = '\
<div class="sphinx-comments" id="sc<%id%>">\
<p class="sort-options">\
Sort by:\
<a href="#" class="sort-option byrating">best rated</a>\
<a href="#" class="sort-option byascage">newest</a>\
<a href="#" class="sort-option byage">oldest</a>\
</p>\
<div class="comment-header">Comments</div>\
<div class="comment-loading" id="cn<%id%>">\
loading comments... <img src="<%loadingImage%>" alt="" /></div>\
<ul id="cl<%id%>" class="comment-ul"></ul>\
<div id="ca<%id%>">\
<p class="add-a-comment">Add a comment\
(<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\
<div class="comment-markup-box" id="mb<%id%>">\
reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \
<code>``code``</code>, \
code blocks: <code>::</code> and an indented block after blank line</div>\
<form method="post" id="cf<%id%>" class="comment-form" action="">\
<textarea name="comment" cols="80"></textarea>\
<p class="propose-button">\
<a href="#" id="pc<%id%>" class="show-propose-change">\
Propose a change &#9657;\
</a>\
<a href="#" id="hc<%id%>" class="hide-propose-change">\
Propose a change &#9663;\
</a>\
</p>\
<textarea name="proposal" id="pt<%id%>" cols="80"\
spellcheck="false"></textarea>\
<input type="submit" value="Add comment" />\
<input type="hidden" name="node" value="<%id%>" />\
<input type="hidden" name="parent" value="" />\
</form>\
</div>\
</div>';
var commentTemplate = '\
<div id="cd<%id%>" class="sphinx-comment<%css_class%>">\
<div class="vote">\
<div class="arrow">\
<a href="#" id="uv<%id%>" class="vote" title="vote up">\
<img src="<%upArrow%>" />\
</a>\
<a href="#" id="uu<%id%>" class="un vote" title="vote up">\
<img src="<%upArrowPressed%>" />\
</a>\
</div>\
<div class="arrow">\
<a href="#" id="dv<%id%>" class="vote" title="vote down">\
<img src="<%downArrow%>" id="da<%id%>" />\
</a>\
<a href="#" id="du<%id%>" class="un vote" title="vote down">\
<img src="<%downArrowPressed%>" />\
</a>\
</div>\
</div>\
<div class="comment-content">\
<p class="tagline comment">\
<span class="user-id"><%username%></span>\
<span class="rating"><%pretty_rating%></span>\
<span class="delta"><%time.delta%></span>\
</p>\
<div class="comment-text comment"><#text#></div>\
<p class="comment-opts comment">\
<a href="#" class="reply hidden" id="rl<%id%>">reply &#9657;</a>\
<a href="#" class="close-reply" id="cr<%id%>">reply &#9663;</a>\
<a href="#" id="sp<%id%>" class="show-proposal">proposal &#9657;</a>\
<a href="#" id="hp<%id%>" class="hide-proposal">proposal &#9663;</a>\
<a href="#" id="dc<%id%>" class="delete-comment hidden">delete</a>\
<span id="cm<%id%>" class="moderation hidden">\
<a href="#" id="ac<%id%>" class="accept-comment">accept</a>\
</span>\
</p>\
<pre class="proposal" id="pr<%id%>">\
<#proposal_diff#>\
</pre>\
<ul class="comment-children" id="cl<%id%>"></ul>\
</div>\
<div class="clearleft"></div>\
</div>\
</div>';
var replyTemplate = '\
<li>\
<div class="reply-div" id="rd<%id%>">\
<form id="rf<%id%>">\
<textarea name="comment" cols="80"></textarea>\
<input type="submit" value="Add reply" />\
<input type="button" value="Cancel" />\
<input type="hidden" name="parent" value="<%id%>" />\
<input type="hidden" name="node" value="" />\
</form>\
</div>\
</li>';
$(document).ready(function() {
init();
});
})(jQuery);
$(document).ready(function() {
// add comment anchors for all paragraphs that are commentable
$('.sphinx-has-comment').comment();
// highlight search words in search results
$("div.context").each(function() {
var params = $.getQueryParameters();
var terms = (params.q) ? params.q[0].split(/\s+/) : [];
var result = $(this);
$.each(terms, function() {
result.highlightText(this.toLowerCase(), 'highlighted');
});
});
// directly open comment window if requested
var anchor = document.location.hash;
if (anchor.substring(0, 9) == '#comment-') {
$('#ao' + anchor.substring(9)).click();
document.location.hash = '#s' + anchor.substring(9);
}
});

485
doc/build/html/genindex.html vendored Normal file

@ -0,0 +1,485 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="English">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Index &#8212; Bitburner 1.0 documentation</title>
<link rel="stylesheet" href="_static/agogo.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '1.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="#" />
<link rel="search" title="Search" href="search.html" />
</head>
<body>
<div class="header-wrapper" role="banner">
<div class="header">
<div class="headertitle"><a
href="index.html">Bitburner 1.0 documentation</a></div>
<div class="rel" role="navigation" aria-label="related navigation">
<a href="#" title="General Index"
accesskey="I">index</a>
</div>
</div>
</div>
<div class="content-wrapper">
<div class="content">
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1 id="index">Index</h1>
<div class="genindex-jumpbox">
<a href="#A"><strong>A</strong></a>
| <a href="#B"><strong>B</strong></a>
| <a href="#C"><strong>C</strong></a>
| <a href="#D"><strong>D</strong></a>
| <a href="#E"><strong>E</strong></a>
| <a href="#F"><strong>F</strong></a>
| <a href="#G"><strong>G</strong></a>
| <a href="#H"><strong>H</strong></a>
| <a href="#I"><strong>I</strong></a>
| <a href="#J"><strong>J</strong></a>
| <a href="#K"><strong>K</strong></a>
| <a href="#L"><strong>L</strong></a>
| <a href="#N"><strong>N</strong></a>
| <a href="#P"><strong>P</strong></a>
| <a href="#R"><strong>R</strong></a>
| <a href="#S"><strong>S</strong></a>
| <a href="#T"><strong>T</strong></a>
| <a href="#U"><strong>U</strong></a>
| <a href="#V"><strong>V</strong></a>
| <a href="#W"><strong>W</strong></a>
</div>
<h2 id="A">A</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptsingularityfunctions.html#applyToCompany">applyToCompany() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="B">B</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#brutessh">brutessh() (built-in function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptixapi.html#buyStock">buyStock() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="C">C</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptixapi.html#cancelOrder">cancelOrder() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#checkFactionInvitations">checkFactionInvitations() (built-in function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#clear">clear() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#createProgram">createProgram() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="D">D</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#deleteServer">deleteServer() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="E">E</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#exec">exec() (built-in function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#exit">exit() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="F">F</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#fileExists">fileExists() (built-in function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#ftpcrack">ftpcrack() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="G">G</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptsingularityfunctions.html#getAugmentationCost">getAugmentationCost() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#getAugmentationsFromFaction">getAugmentationsFromFaction() (built-in function)</a>
</li>
<li><a href="netscriptadvancedfunctions.html#getBitNodeMultipliers">getBitNodeMultipliers() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#getCompanyRep">getCompanyRep() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#getCrimeChance">getCrimeChance() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#getFactionRep">getFactionRep() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getGrowTime">getGrowTime() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getHackingLevel">getHackingLevel() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getHackingMultipliers">getHackingMultipliers() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getHackTime">getHackTime() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getHostname">getHostname() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getNextHacknetNodeCost">getNextHacknetNodeCost() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#getOwnedAugmentations">getOwnedAugmentations() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getPurchasedServers">getPurchasedServers() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getScriptExpGain">getScriptExpGain() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getScriptIncome">getScriptIncome() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getScriptRam">getScriptRam() (built-in function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#getServerBaseSecurityLevel">getServerBaseSecurityLevel() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getServerGrowth">getServerGrowth() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getServerMaxMoney">getServerMaxMoney() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getServerMinSecurityLevel">getServerMinSecurityLevel() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getServerMoneyAvailable">getServerMoneyAvailable() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getServerNumPortsRequired">getServerNumPortsRequired() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getServerRam">getServerRam() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getServerRequiredHackingLevel">getServerRequiredHackingLevel() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getServerSecurityLevel">getServerSecurityLevel() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#getStats">getStats() (built-in function)</a>
</li>
<li><a href="netscriptixapi.html#getStockPosition">getStockPosition() (built-in function)</a>
</li>
<li><a href="netscriptixapi.html#getStockPrice">getStockPrice() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getTimeSinceLastAug">getTimeSinceLastAug() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#getUpgradeHomeRamCost">getUpgradeHomeRamCost() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getWeakenTime">getWeakenTime() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#grow">grow() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#gymWorkout">gymWorkout() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="H">H</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#hack">hack() (built-in function)</a>
</li>
<li><a href="netscripthacknetnodeapi.html#hacknetnodes[i].cores">hacknetnodes[i].cores() (hacknetnodes[i] method)</a>
</li>
<li><a href="netscripthacknetnodeapi.html#hacknetnodes[i].getCoreUpgradeCost">hacknetnodes[i].getCoreUpgradeCost() (hacknetnodes[i] method)</a>
</li>
<li>
hacknetnodes[i].getLevelUpgradeCost(n)
<ul>
<li><a href="netscripthacknetnodeapi.html#hacknetnodes[i].getLevelUpgradeCost(n);">() (hacknetnodes[i] method)</a>
</li>
</ul></li>
<li><a href="netscripthacknetnodeapi.html#hacknetnodes[i].getRamUpgradeCost">hacknetnodes[i].getRamUpgradeCost() (hacknetnodes[i] method)</a>
</li>
<li><a href="netscripthacknetnodeapi.html#hacknetnodes[i].level">hacknetnodes[i].level() (hacknetnodes[i] method)</a>
</li>
<li><a href="netscripthacknetnodeapi.html#hacknetnodes[i].moneyGainRatePerSecond">hacknetnodes[i].moneyGainRatePerSecond() (hacknetnodes[i] method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscripthacknetnodeapi.html#hacknetnodes[i].onlineTimeSeconds">hacknetnodes[i].onlineTimeSeconds() (hacknetnodes[i] method)</a>
</li>
<li><a href="netscripthacknetnodeapi.html#hacknetnodes[i].ram">hacknetnodes[i].ram() (hacknetnodes[i] method)</a>
</li>
<li><a href="netscripthacknetnodeapi.html#hacknetnodes[i].totalMoneyGenerated">hacknetnodes[i].totalMoneyGenerated() (hacknetnodes[i] method)</a>
</li>
<li><a href="netscripthacknetnodeapi.html#hacknetnodes[i].upgradeCore">hacknetnodes[i].upgradeCore() (hacknetnodes[i] method)</a>
</li>
<li>
hacknetnodes[i].upgradeLevel(n)
<ul>
<li><a href="netscripthacknetnodeapi.html#hacknetnodes[i].upgradeLevel(n);">() (hacknetnodes[i] method)</a>
</li>
</ul></li>
<li><a href="netscripthacknetnodeapi.html#hacknetnodes[i].upgradeRam">hacknetnodes[i].upgradeRam() (hacknetnodes[i] method)</a>
</li>
<li><a href="netscriptfunctions.html#hasRootAccess">hasRootAccess() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#httpworm">httpworm() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="I">I</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptsingularityfunctions.html#installAugmentations">installAugmentations() (built-in function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptsingularityfunctions.html#isBusy">isBusy() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#isRunning">isRunning() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="J">J</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptsingularityfunctions.html#joinFaction">joinFaction() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="K">K</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#kill">kill() (built-in function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#killall">killall() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="L">L</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#ls">ls() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="N">N</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#nuke">nuke() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="P">P</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptixapi.html#placeOrder">placeOrder() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#print">print() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#prompt">prompt() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#purchaseAugmentation">purchaseAugmentation() (built-in function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#purchaseHacknetNode">purchaseHacknetNode() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#purchaseProgram">purchaseProgram() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#purchaseServer">purchaseServer() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#purchaseTor">purchaseTor() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="R">R</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#read">read() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#relaysmtp">relaysmtp() (built-in function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#round">round() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#run">run() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="S">S</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#scan">scan() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#scp">scp() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#scriptKill">scriptKill() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#scriptRunning">scriptRunning() (built-in function)</a>
</li>
<li><a href="netscriptixapi.html#sellShort">sellShort() (built-in function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptixapi.html#sellStock">sellStock() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#serverExists">serverExists() (built-in function)</a>
</li>
<li><a href="netscriptixapi.html#shortStock">shortStock() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#sleep">sleep() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#sprintf">sprintf() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#sqlinject">sqlinject() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="T">T</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#tprint">tprint() (built-in function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptsingularityfunctions.html#travelToCity">travelToCity() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="U">U</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptsingularityfunctions.html#universityCourse">universityCourse() (built-in function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptsingularityfunctions.html#upgradeHomeRam">upgradeHomeRam() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="V">V</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#vsprintf">vsprintf() (built-in function)</a>
</li>
</ul></td>
</tr></table>
<h2 id="W">W</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#weaken">weaken() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#workForCompany">workForCompany() (built-in function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptsingularityfunctions.html#workForFaction">workForFaction() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#write">write() (built-in function)</a>
</li>
</ul></td>
</tr></table>
</div>
</div>
</div>
</div>
<div class="sidebar">
<h3>Table Of Contents</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="netscript.html"> Netscript</a></li>
</ul>
<div role="search">
<h3 style="margin-top: 1.5em;">Search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="clearer"></div>
</div>
</div>
<div class="footer-wrapper">
<div class="footer">
<div class="left">
<div role="navigation" aria-label="related navigaton">
<a href="#" title="General Index"
>index</a>
</div>
<div role="note" aria-label="source link">
</div>
</div>
<div class="right">
<div class="footer" role="contentinfo">
&#169; Copyright 2017, Bitburner.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.4.
</div>
</div>
<div class="clearer"></div>
</div>
</div>
</body>
</html>

264
doc/build/html/index.html vendored Normal file

@ -0,0 +1,264 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="English">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome to Bitburner&#39;s documentation! &#8212; Bitburner 1.0 documentation</title>
<link rel="stylesheet" href="_static/agogo.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '1.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Netscript Documentation" href="netscript.html" />
</head>
<body>
<div class="header-wrapper" role="banner">
<div class="header">
<div class="headertitle"><a
href="#">Bitburner 1.0 documentation</a></div>
<div class="rel" role="navigation" aria-label="related navigation">
<a href="netscript.html" title="Netscript Documentation"
accesskey="N">next</a> |
<a href="genindex.html" title="General Index"
accesskey="I">index</a>
</div>
</div>
</div>
<div class="content-wrapper">
<div class="content">
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="welcome-to-bitburner-s-documentation">
<h1>Welcome to Bitburner's documentation!<a class="headerlink" href="#welcome-to-bitburner-s-documentation" title="Permalink to this headline"></a></h1>
<p>Bitburner is a cyberpunk-themed <a class="reference external" href="https://en.wikipedia.org/wiki/Incremental_game">incremental game</a> that is currently in the
early beta stage of development. The game <a class="reference external" href="https://danielyxie.github.io/bitburner/">can be played here</a>.</p>
<div class="section" id="what-is-bitburner">
<h2>What is Bitburner?<a class="headerlink" href="#what-is-bitburner" title="Permalink to this headline"></a></h2>
<p>Bitburner is a cyberpunk-themed incremental RPG where you, the player, take the role of an unknown hacker in a dark, dystopian world.
When a mysterious hacker called jump3R messages you, he/she confirms your suspicions that there is something wrong with the world around you.
Now, aided by jump3R, you embark on a quest to gain money and power by any means necessary, in the hopes that this will lead to to uncover the
secrets that you've been searching for.</p>
<div class="toctree-wrapper compound">
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="netscript.html"> Netscript</a><ul>
<li class="toctree-l2"><a class="reference internal" href="netscriptdatatypes.html"> Data Types and Variables</a><ul>
<li class="toctree-l3"><a class="reference internal" href="netscriptdatatypes.html#data-types">Data Types</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptdatatypes.html#variables">Variables</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="netscriptoperators.html"> Operators</a><ul>
<li class="toctree-l3"><a class="reference internal" href="netscriptoperators.html#operators">Operators</a><ul>
<li class="toctree-l4"><a class="reference internal" href="netscriptoperators.html#binary-operators">Binary Operators</a></li>
<li class="toctree-l4"><a class="reference internal" href="netscriptoperators.html#unary-operators">Unary Operators</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="netscriptloopsandconditionals.html"> Loops and Conditionals</a><ul>
<li class="toctree-l3"><a class="reference internal" href="netscriptloopsandconditionals.html#loops-and-conditionals">Loops and Conditionals</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="netscriptscriptarguments.html"> Script Arguments</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html"> Basic Functions</a><ul>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#hack">hack</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#grow">grow</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#weaken">weaken</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#sleep">sleep</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#print">print</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#tprint">tprint</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#scan">scan</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#nuke">nuke</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#brutessh">brutessh</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#ftpcrack">ftpcrack</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#relaysmtp">relaysmtp</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#httpworm">httpworm</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#sqlinject">sqlinject</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#run">run</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#exec">exec</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#kill">kill</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#killall">killall</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#exit">exit</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#scp">scp</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#ls">ls</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#hasrootaccess">hasRootAccess</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#gethostname">getHostname</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#gethackinglevel">getHackingLevel</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#gethackingmultipliers">getHackingMultipliers</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#getservermoneyavailable">getServerMoneyAvailable</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#getservermaxmoney">getServerMaxMoney</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#getservergrowth">getServerGrowth</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#getserversecuritylevel">getServerSecurityLevel</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#getserverbasesecuritylevel">getServerBaseSecurityLevel</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#getserverminsecuritylevel">getServerMinSecurityLevel</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#getserverrequiredhackinglevel">getServerRequiredHackingLevel</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#getservernumportsrequired">getServerNumPortsRequired</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#getserverram">getServerRam</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#serverexists">serverExists</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#fileexists">fileExists</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#isrunning">isRunning</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#getnexthacknetnodecost">getNextHacknetNodeCost</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#purchasehacknetnode">purchaseHacknetNode</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#purchaseserver">purchaseServer</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#deleteserver">deleteServer</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#getpurchasedservers">getPurchasedServers</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#round">round</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#write">write</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#read">read</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#clear">clear</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#scriptrunning">scriptRunning</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#scriptkill">scriptKill</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#getscriptram">getScriptRam</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#gethacktime">getHackTime</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#getgrowtime">getGrowTime</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#getweakentime">getWeakenTime</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#getscriptincome">getScriptIncome</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#getscriptexpgain">getScriptExpGain</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#gettimesincelastaug">getTimeSinceLastAug</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#sprintf">sprintf</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#vsprintf">vsprintf</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#prompt">prompt</a><ul>
<li class="toctree-l4"><a class="reference internal" href="netscriptfunctions.html#defining-your-own-functions">Defining your own Functions</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="netscriptadvancedfunctions.html"> Advanced Functions</a><ul>
<li class="toctree-l3"><a class="reference internal" href="netscriptadvancedfunctions.html#getbitnodemultipliers">getBitNodeMultipliers</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="netscripthacknetnodeapi.html"> Hacknet Node API</a><ul>
<li class="toctree-l3"><a class="reference internal" href="netscripthacknetnodeapi.html#hacknetnodes">hacknetnodes</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscripthacknetnodeapi.html#hacknet-node-member-variables">Hacknet Node Member Variables</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscripthacknetnodeapi.html#hacknet-node-methods">Hacknet Node Methods</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscripthacknetnodeapi.html#example-s">Example(s)</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="netscriptixapi.html"> Trade Information eXchange (TIX) API</a><ul>
<li class="toctree-l3"><a class="reference internal" href="netscriptixapi.html#getstockprice">getStockPrice</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptixapi.html#getstockposition">getStockPosition</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptixapi.html#buystock">buyStock</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptixapi.html#sellstock">sellStock</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptixapi.html#shortstock">shortStock</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptixapi.html#sellshort">sellShort</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptixapi.html#placeorder">placeOrder</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptixapi.html#cancelorder">cancelOrder</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html"> Singularity Functions</a><ul>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#universitycourse">universityCourse</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#gymworkout">gymWorkout</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#traveltocity">travelToCity</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#purchasetor">purchaseTor</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#purchaseprogram">purchaseProgram</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#getstats">getStats</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#isbusy">isBusy</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#upgradehomeram">upgradeHomeRam</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#getupgradehomeramcost">getUpgradeHomeRamCost</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#workforcompany">workForCompany</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#applytocompany">applyToCompany</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#getcompanyrep">getCompanyRep</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#checkfactioninvitations">checkFactionInvitations</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#joinfaction">joinFaction</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#workforfaction">workForFaction</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#getfactionrep">getFactionRep</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#createprogram">createProgram</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#commitcrime">commitCrime</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#getcrimechance">getCrimeChance</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#getownedaugmentations">getOwnedAugmentations</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#getaugmentationsfromfaction">getAugmentationsFromFaction</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#getaugmentationcost">getAugmentationCost</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#purchaseaugmentation">purchaseAugmentation</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#installaugmentations">installAugmentations</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
</div>
<div class="section" id="indices-and-tables">
<h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline"></a></h1>
<ul class="simple">
<li><a class="reference internal" href="genindex.html"><span class="std std-ref">Index</span></a></li>
<li><a class="reference internal" href="py-modindex.html"><span class="std std-ref">Module Index</span></a></li>
<li><a class="reference internal" href="search.html"><span class="std std-ref">Search Page</span></a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="sidebar">
<h3>Table Of Contents</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="netscript.html"> Netscript</a></li>
</ul>
<div role="search">
<h3 style="margin-top: 1.5em;">Search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="clearer"></div>
</div>
</div>
<div class="footer-wrapper">
<div class="footer">
<div class="left">
<div role="navigation" aria-label="related navigaton">
<a href="netscript.html" title="Netscript Documentation"
>next</a> |
<a href="genindex.html" title="General Index"
>index</a>
</div>
<div role="note" aria-label="source link">
<br/>
<a href="_sources/index.rst.txt"
rel="nofollow">Show Source</a>
</div>
</div>
<div class="right">
<div class="footer" role="contentinfo">
&#169; Copyright 2017, Bitburner.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.4.
</div>
</div>
<div class="clearer"></div>
</div>
</div>
</body>
</html>

267
doc/build/html/netscript.html vendored Normal file

@ -0,0 +1,267 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="English">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Netscript Documentation &#8212; Bitburner 1.0 documentation</title>
<link rel="stylesheet" href="_static/agogo.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '1.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Netscript Data Types and Variables" href="netscriptdatatypes.html" />
<link rel="prev" title="Welcome to Bitburner&#39;s documentation!" href="index.html" />
</head>
<body>
<div class="header-wrapper" role="banner">
<div class="header">
<div class="headertitle"><a
href="index.html">Bitburner 1.0 documentation</a></div>
<div class="rel" role="navigation" aria-label="related navigation">
<a href="index.html" title="Welcome to Bitburner&#39;s documentation!"
accesskey="P">previous</a> |
<a href="netscriptdatatypes.html" title="Netscript Data Types and Variables"
accesskey="N">next</a> |
<a href="genindex.html" title="General Index"
accesskey="I">index</a>
</div>
</div>
</div>
<div class="content-wrapper">
<div class="content">
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="netscript-documentation">
<h1>Netscript Documentation<a class="headerlink" href="#netscript-documentation" title="Permalink to this headline"></a></h1>
<p>Netscript is the programming language used in the world of Bitburner.</p>
<p>When you write scripts in Bitburner, they are written in the Netscript language.
Netscript is simply a tiny subset of Javascript. This means that Netscript's
syntax is almost idental to Javascript's, but it does not implement many of the
features that Javascript has.</p>
<p>If you have any requests or suggestions to improve the Netscript language, feel free
to reach out to the developer!</p>
<div class="toctree-wrapper compound">
<p class="caption"><span class="caption-text">Sections:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="netscriptdatatypes.html"> Data Types and Variables</a><ul>
<li class="toctree-l2"><a class="reference internal" href="netscriptdatatypes.html#data-types">Data Types</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptdatatypes.html#variables">Variables</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="netscriptoperators.html"> Operators</a><ul>
<li class="toctree-l2"><a class="reference internal" href="netscriptoperators.html#operators">Operators</a><ul>
<li class="toctree-l3"><a class="reference internal" href="netscriptoperators.html#binary-operators">Binary Operators</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptoperators.html#unary-operators">Unary Operators</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="netscriptloopsandconditionals.html"> Loops and Conditionals</a><ul>
<li class="toctree-l2"><a class="reference internal" href="netscriptloopsandconditionals.html#loops-and-conditionals">Loops and Conditionals</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="netscriptscriptarguments.html"> Script Arguments</a></li>
<li class="toctree-l1"><a class="reference internal" href="netscriptfunctions.html"> Basic Functions</a><ul>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#hack">hack</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#grow">grow</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#weaken">weaken</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#sleep">sleep</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#print">print</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#tprint">tprint</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#scan">scan</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#nuke">nuke</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#brutessh">brutessh</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#ftpcrack">ftpcrack</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#relaysmtp">relaysmtp</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#httpworm">httpworm</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#sqlinject">sqlinject</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#run">run</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#exec">exec</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#kill">kill</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#killall">killall</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#exit">exit</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#scp">scp</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#ls">ls</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#hasrootaccess">hasRootAccess</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#gethostname">getHostname</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#gethackinglevel">getHackingLevel</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#gethackingmultipliers">getHackingMultipliers</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#getservermoneyavailable">getServerMoneyAvailable</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#getservermaxmoney">getServerMaxMoney</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#getservergrowth">getServerGrowth</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#getserversecuritylevel">getServerSecurityLevel</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#getserverbasesecuritylevel">getServerBaseSecurityLevel</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#getserverminsecuritylevel">getServerMinSecurityLevel</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#getserverrequiredhackinglevel">getServerRequiredHackingLevel</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#getservernumportsrequired">getServerNumPortsRequired</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#getserverram">getServerRam</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#serverexists">serverExists</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#fileexists">fileExists</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#isrunning">isRunning</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#getnexthacknetnodecost">getNextHacknetNodeCost</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#purchasehacknetnode">purchaseHacknetNode</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#purchaseserver">purchaseServer</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#deleteserver">deleteServer</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#getpurchasedservers">getPurchasedServers</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#round">round</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#write">write</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#read">read</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#clear">clear</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#scriptrunning">scriptRunning</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#scriptkill">scriptKill</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#getscriptram">getScriptRam</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#gethacktime">getHackTime</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#getgrowtime">getGrowTime</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#getweakentime">getWeakenTime</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#getscriptincome">getScriptIncome</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#getscriptexpgain">getScriptExpGain</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#gettimesincelastaug">getTimeSinceLastAug</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#sprintf">sprintf</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#vsprintf">vsprintf</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html#prompt">prompt</a><ul>
<li class="toctree-l3"><a class="reference internal" href="netscriptfunctions.html#defining-your-own-functions">Defining your own Functions</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="netscriptadvancedfunctions.html"> Advanced Functions</a><ul>
<li class="toctree-l2"><a class="reference internal" href="netscriptadvancedfunctions.html#getbitnodemultipliers">getBitNodeMultipliers</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="netscripthacknetnodeapi.html"> Hacknet Node API</a><ul>
<li class="toctree-l2"><a class="reference internal" href="netscripthacknetnodeapi.html#hacknetnodes">hacknetnodes</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscripthacknetnodeapi.html#hacknet-node-member-variables">Hacknet Node Member Variables</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscripthacknetnodeapi.html#hacknet-node-methods">Hacknet Node Methods</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscripthacknetnodeapi.html#example-s">Example(s)</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="netscriptixapi.html"> Trade Information eXchange (TIX) API</a><ul>
<li class="toctree-l2"><a class="reference internal" href="netscriptixapi.html#getstockprice">getStockPrice</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptixapi.html#getstockposition">getStockPosition</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptixapi.html#buystock">buyStock</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptixapi.html#sellstock">sellStock</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptixapi.html#shortstock">shortStock</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptixapi.html#sellshort">sellShort</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptixapi.html#placeorder">placeOrder</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptixapi.html#cancelorder">cancelOrder</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="netscriptsingularityfunctions.html"> Singularity Functions</a><ul>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#universitycourse">universityCourse</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#gymworkout">gymWorkout</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#traveltocity">travelToCity</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#purchasetor">purchaseTor</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#purchaseprogram">purchaseProgram</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#getstats">getStats</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#isbusy">isBusy</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#upgradehomeram">upgradeHomeRam</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#getupgradehomeramcost">getUpgradeHomeRamCost</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#workforcompany">workForCompany</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#applytocompany">applyToCompany</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#getcompanyrep">getCompanyRep</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#checkfactioninvitations">checkFactionInvitations</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#joinfaction">joinFaction</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#workforfaction">workForFaction</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#getfactionrep">getFactionRep</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#createprogram">createProgram</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#commitcrime">commitCrime</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#getcrimechance">getCrimeChance</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#getownedaugmentations">getOwnedAugmentations</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#getaugmentationsfromfaction">getAugmentationsFromFaction</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#getaugmentationcost">getAugmentationCost</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#purchaseaugmentation">purchaseAugmentation</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#installaugmentations">installAugmentations</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sidebar">
<h3>Table Of Contents</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#"> Netscript</a><ul>
<li class="toctree-l2"><a class="reference internal" href="netscriptdatatypes.html"> Data Types and Variables</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptoperators.html"> Operators</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptloopsandconditionals.html"> Loops and Conditionals</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptscriptarguments.html"> Script Arguments</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html"> Basic Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptadvancedfunctions.html"> Advanced Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscripthacknetnodeapi.html"> Hacknet Node API</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptixapi.html"> Trade Information eXchange (TIX) API</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html"> Singularity Functions</a></li>
</ul>
</li>
</ul>
<div role="search">
<h3 style="margin-top: 1.5em;">Search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="clearer"></div>
</div>
</div>
<div class="footer-wrapper">
<div class="footer">
<div class="left">
<div role="navigation" aria-label="related navigaton">
<a href="index.html" title="Welcome to Bitburner&#39;s documentation!"
>previous</a> |
<a href="netscriptdatatypes.html" title="Netscript Data Types and Variables"
>next</a> |
<a href="genindex.html" title="General Index"
>index</a>
</div>
<div role="note" aria-label="source link">
<br/>
<a href="_sources/netscript.rst.txt"
rel="nofollow">Show Source</a>
</div>
</div>
<div class="right">
<div class="footer" role="contentinfo">
&#169; Copyright 2017, Bitburner.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.4.
</div>
</div>
<div class="clearer"></div>
</div>
</div>
</body>
</html>

@ -0,0 +1,173 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="English">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Netscript Advanced Functions &#8212; Bitburner 1.0 documentation</title>
<link rel="stylesheet" href="_static/agogo.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '1.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Netscript Hacknet Node API" href="netscripthacknetnodeapi.html" />
<link rel="prev" title="Netscript Basic Functions" href="netscriptfunctions.html" />
</head>
<body>
<div class="header-wrapper" role="banner">
<div class="header">
<div class="headertitle"><a
href="index.html">Bitburner 1.0 documentation</a></div>
<div class="rel" role="navigation" aria-label="related navigation">
<a href="netscriptfunctions.html" title="Netscript Basic Functions"
accesskey="P">previous</a> |
<a href="netscripthacknetnodeapi.html" title="Netscript Hacknet Node API"
accesskey="N">next</a> |
<a href="genindex.html" title="General Index"
accesskey="I">index</a>
</div>
</div>
</div>
<div class="content-wrapper">
<div class="content">
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="netscript-advanced-functions">
<h1>Netscript Advanced Functions<a class="headerlink" href="#netscript-advanced-functions" title="Permalink to this headline"></a></h1>
<p>These Netscript functions become relevant later on in the game. They are put on a separate page because
they contain spoilers for the game.</p>
<div class="section" id="getbitnodemultipliers">
<h2>getBitNodeMultipliers<a class="headerlink" href="#getbitnodemultipliers" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getBitNodeMultipliers">
<code class="descname">getBitNodeMultipliers</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#getBitNodeMultipliers" title="Permalink to this definition"></a></dt>
<dd><p>Returns an object containing the current BitNode multipliers. This function requires Source-File 5 in order
to run. The multipliers are returned in integer forms (e.g. 1.5 instead of 150%). The multipliers represent
the difference between the current BitNode and the original BitNode (BitNode-1). For example, if the
<em>CrimeMoney</em> multiplier has a value of 0.1, then that means that committing crimes in the current BitNode
will only give 10% of the money you would have received in BitNode-1. The object has the following structure,
(subject to change in the future):</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">{</span>
<span class="n">ServerMaxMoney</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">ServerStartingMoney</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">ServerGrowthRate</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">ServerWeakenRate</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">ServerStartingSecurity</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">ManualHackMoney</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">ScriptHackMoney</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">CompanyWorkMoney</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">CrimeMoney</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">HacknetNodeMoney</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">CompanyWorkExpGain</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">ClassGymExpGain</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">FactionWorkExpGain</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">HackExpGain</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">CrimeExpGain</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">FactionWorkRepGain</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">FactionPassiveRepGain</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">AugmentationRepCost</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="n">AugmentationMoneyCost</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Example:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">mults</span> <span class="o">=</span> <span class="n">getBitNodeMultipliers</span><span class="p">();</span>
<span class="nb">print</span><span class="p">(</span><span class="n">mults</span><span class="o">.</span><span class="n">ServerMaxMoney</span><span class="p">);</span>
<span class="nb">print</span><span class="p">(</span><span class="n">mults</span><span class="o">.</span><span class="n">HackExpGain</span><span class="p">);</span>
</pre></div>
</div>
</dd></dl>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sidebar">
<h3>Table Of Contents</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="netscript.html"> Netscript</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="netscriptdatatypes.html"> Data Types and Variables</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptoperators.html"> Operators</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptloopsandconditionals.html"> Loops and Conditionals</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptscriptarguments.html"> Script Arguments</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html"> Basic Functions</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#"> Advanced Functions</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#getbitnodemultipliers">getBitNodeMultipliers</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="netscripthacknetnodeapi.html"> Hacknet Node API</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptixapi.html"> Trade Information eXchange (TIX) API</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html"> Singularity Functions</a></li>
</ul>
</li>
</ul>
<div role="search">
<h3 style="margin-top: 1.5em;">Search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="clearer"></div>
</div>
</div>
<div class="footer-wrapper">
<div class="footer">
<div class="left">
<div role="navigation" aria-label="related navigaton">
<a href="netscriptfunctions.html" title="Netscript Basic Functions"
>previous</a> |
<a href="netscripthacknetnodeapi.html" title="Netscript Hacknet Node API"
>next</a> |
<a href="genindex.html" title="General Index"
>index</a>
</div>
<div role="note" aria-label="source link">
<br/>
<a href="_sources/netscriptadvancedfunctions.rst.txt"
rel="nofollow">Show Source</a>
</div>
</div>
<div class="right">
<div class="footer" role="contentinfo">
&#169; Copyright 2017, Bitburner.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.4.
</div>
</div>
<div class="clearer"></div>
</div>
</div>
</body>
</html>

163
doc/build/html/netscriptdatatypes.html vendored Normal file

@ -0,0 +1,163 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="English">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Netscript Data Types and Variables &#8212; Bitburner 1.0 documentation</title>
<link rel="stylesheet" href="_static/agogo.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '1.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Netscript Operators" href="netscriptoperators.html" />
<link rel="prev" title="Netscript Documentation" href="netscript.html" />
</head>
<body>
<div class="header-wrapper" role="banner">
<div class="header">
<div class="headertitle"><a
href="index.html">Bitburner 1.0 documentation</a></div>
<div class="rel" role="navigation" aria-label="related navigation">
<a href="netscript.html" title="Netscript Documentation"
accesskey="P">previous</a> |
<a href="netscriptoperators.html" title="Netscript Operators"
accesskey="N">next</a> |
<a href="genindex.html" title="General Index"
accesskey="I">index</a>
</div>
</div>
</div>
<div class="content-wrapper">
<div class="content">
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="netscript-data-types-and-variables">
<h1>Netscript Data Types and Variables<a class="headerlink" href="#netscript-data-types-and-variables" title="Permalink to this headline"></a></h1>
<div class="section" id="data-types">
<h2>Data Types<a class="headerlink" href="#data-types" title="Permalink to this headline"></a></h2>
<p>Netscript supports three primitive data types:</p>
<p><strong>Numbers</strong>&nbsp;- Positive numerics, such as integers and floats. Examples: 6, 0, 10.5</p>
<p><strong>Strings</strong> - A sequence of characters that represents text. The characters must be encapsulated by single or
double quotes. Example: &quot;This is a string&quot; or equivalently 'This is a string'.
<em>Strings are fully functional</em> <a class="reference external" href="https://www.w3schools.com/jsref/jsref_obj_string.asp">Javascript strings</a>,
<em>which means that all of the member functions of Javascript strings such as toLowerCase() and includes() are also available in Netscript!</em></p>
<p><strong>Boolean</strong> - true or false</p>
<p><strong>Array</strong> - An array is a special container object that is capable of holding many different values. Arrays are simply Javascript
arrays, and most Javascript array methods can be used in Netscript as well (join(), pop(), splice(), etc.). You can read more about
<a class="reference external" href="https://www.w3schools.com/js/js_arrays.asp">Javascript arrays here</a></p>
</div>
<div class="section" id="variables">
<h2>Variables<a class="headerlink" href="#variables" title="Permalink to this headline"></a></h2>
<p>Variables can be thought of as named containers. Their purpose is to label and store data. The data stored in the
variable can then be accessed and changed by referring to the variable's name. The name of a variable must start with
either a letter or an underscore. The rest of the variable name can contain any alphanumeric (letters and numbers),
as well as hyphens and underscores.</p>
<p>The Netscript language is untyped, meaning that any variable can hold any of the data types above. The value type of a variable
can also change. For example, if a variable initially holds a number, it can later hold a string.</p>
<p>The following shows how you can declare and initialize variables:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="n">s</span> <span class="o">=</span> <span class="s2">&quot;This is a string&quot;</span><span class="p">;</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">false</span><span class="p">;</span>
</pre></div>
</div>
<p>After declaring a variable, the values in variables can be used simply by referencing the name. For example:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">j</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">5</span><span class="p">;</span>
<span class="n">s2</span> <span class="o">=</span> <span class="n">s</span> <span class="o">+</span> <span class="s2">&quot; Adding more letters onto the string&quot;</span>
</pre></div>
</div>
<p>The first command above will store the value 6 in the variable j. The second command will store the string &quot;This is a string Adding more letters onto the string&quot; into the variable s2.</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sidebar">
<h3>Table Of Contents</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="netscript.html"> Netscript</a><ul class="current">
<li class="toctree-l2 current"><a class="current reference internal" href="#"> Data Types and Variables</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#data-types">Data Types</a></li>
<li class="toctree-l3"><a class="reference internal" href="#variables">Variables</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="netscriptoperators.html"> Operators</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptloopsandconditionals.html"> Loops and Conditionals</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptscriptarguments.html"> Script Arguments</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html"> Basic Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptadvancedfunctions.html"> Advanced Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscripthacknetnodeapi.html"> Hacknet Node API</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptixapi.html"> Trade Information eXchange (TIX) API</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html"> Singularity Functions</a></li>
</ul>
</li>
</ul>
<div role="search">
<h3 style="margin-top: 1.5em;">Search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="clearer"></div>
</div>
</div>
<div class="footer-wrapper">
<div class="footer">
<div class="left">
<div role="navigation" aria-label="related navigaton">
<a href="netscript.html" title="Netscript Documentation"
>previous</a> |
<a href="netscriptoperators.html" title="Netscript Operators"
>next</a> |
<a href="genindex.html" title="General Index"
>index</a>
</div>
<div role="note" aria-label="source link">
<br/>
<a href="_sources/netscriptdatatypes.rst.txt"
rel="nofollow">Show Source</a>
</div>
</div>
<div class="right">
<div class="footer" role="contentinfo">
&#169; Copyright 2017, Bitburner.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.4.
</div>
</div>
<div class="clearer"></div>
</div>
</div>
</body>
</html>

1587
doc/build/html/netscriptfunctions.html vendored Normal file

File diff suppressed because it is too large Load Diff

@ -0,0 +1,292 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="English">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Netscript Hacknet Node API &#8212; Bitburner 1.0 documentation</title>
<link rel="stylesheet" href="_static/agogo.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '1.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Netscript Trade Information eXchange (TIX) API" href="netscriptixapi.html" />
<link rel="prev" title="Netscript Advanced Functions" href="netscriptadvancedfunctions.html" />
</head>
<body>
<div class="header-wrapper" role="banner">
<div class="header">
<div class="headertitle"><a
href="index.html">Bitburner 1.0 documentation</a></div>
<div class="rel" role="navigation" aria-label="related navigation">
<a href="netscriptadvancedfunctions.html" title="Netscript Advanced Functions"
accesskey="P">previous</a> |
<a href="netscriptixapi.html" title="Netscript Trade Information eXchange (TIX) API"
accesskey="N">next</a> |
<a href="genindex.html" title="General Index"
accesskey="I">index</a>
</div>
</div>
</div>
<div class="content-wrapper">
<div class="content">
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="netscript-hacknet-node-api">
<h1>Netscript Hacknet Node API<a class="headerlink" href="#netscript-hacknet-node-api" title="Permalink to this headline"></a></h1>
<p>Netscript provides the following API for accessing and upgrading your Hacknet Nodes
through scripts.</p>
<p>Note that none of these functions will write to the script's logs. If you want
to see what your script is doing you will have to print to the logs yourself.</p>
<div class="section" id="hacknetnodes">
<h2>hacknetnodes<a class="headerlink" href="#hacknetnodes" title="Permalink to this headline"></a></h2>
<blockquote>
<div><em>hacknetnodes</em> is a special variable. It is an array that maps to the player's
Hacknet Nodes. The Hacknet Nodes are accessed through indexed. These indexes
correspond to the number at the end of the name of the Hacknet Node. For example,
the first Hacknet Node you purchase will have the name &quot;hacknet-node-0&quot; and can be
accessed using <em>hacknetnodes[0]</em>. The fourth Hacknet Node you purchase will have the name
&quot;hacknet-node-3&quot; and can be accessed using <em>hacknetnodes[3]</em>.</div></blockquote>
</div>
<div class="section" id="hacknet-node-member-variables">
<h2>Hacknet Node Member Variables<a class="headerlink" href="#hacknet-node-member-variables" title="Permalink to this headline"></a></h2>
<p>The following is a list of member variables for a Hacknet Node object. These variables are read-only, which means you cannot assign
a value to these.</p>
<p>Note that these must be called on an element inside the <em>hacknetnodes</em> array, not the array itself.</p>
<dl class="function">
<dt id="hacknetnodes[i].level">
<code class="descclassname">hacknetnodes[i].</code><code class="descname">level</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#hacknetnodes[i].level" title="Permalink to this definition"></a></dt>
<dd><p>Returns the level of the corresponding Hacknet Node</p>
</dd></dl>
<dl class="function">
<dt id="hacknetnodes[i].ram">
<code class="descclassname">hacknetnodes[i].</code><code class="descname">ram</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#hacknetnodes[i].ram" title="Permalink to this definition"></a></dt>
<dd><p>Returns the amount of RAM on the corresponding Hacknet Node</p>
</dd></dl>
<dl class="function">
<dt id="hacknetnodes[i].cores">
<code class="descclassname">hacknetnodes[i].</code><code class="descname">cores</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#hacknetnodes[i].cores" title="Permalink to this definition"></a></dt>
<dd><p>Returns the number of cores on the corresponding Hacknet Node</p>
</dd></dl>
<dl class="function">
<dt id="hacknetnodes[i].totalMoneyGenerated">
<code class="descclassname">hacknetnodes[i].</code><code class="descname">totalMoneyGenerated</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#hacknetnodes[i].totalMoneyGenerated" title="Permalink to this definition"></a></dt>
<dd><p>Returns the total amount of money that the corresponding Hacknet Node has earned</p>
</dd></dl>
<dl class="function">
<dt id="hacknetnodes[i].onlineTimeSeconds">
<code class="descclassname">hacknetnodes[i].</code><code class="descname">onlineTimeSeconds</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#hacknetnodes[i].onlineTimeSeconds" title="Permalink to this definition"></a></dt>
<dd><p>Returns the total amount of time (in seconds) that the corresponding Hacknet Node has existed</p>
</dd></dl>
<dl class="function">
<dt id="hacknetnodes[i].moneyGainRatePerSecond">
<code class="descclassname">hacknetnodes[i].</code><code class="descname">moneyGainRatePerSecond</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#hacknetnodes[i].moneyGainRatePerSecond" title="Permalink to this definition"></a></dt>
<dd><p>Returns the amount of income that the corresponding Hacknet Node earns</p>
</dd></dl>
</div>
<div class="section" id="hacknet-node-methods">
<h2>Hacknet Node Methods<a class="headerlink" href="#hacknet-node-methods" title="Permalink to this headline"></a></h2>
<p>The following is a list of supported functions/methods for a Hacknet Node object.</p>
<p>Note that these must be called on an element inside the <em>hacknetnodes</em> array, not the
array itself.</p>
<dl class="function">
<dt id="hacknetnodes[i].upgradeLevel(n);">
<code class="descclassname">hacknetnodes[i].</code><code class="descname">upgradeLevel(n);</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#hacknetnodes[i].upgradeLevel(n);" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>n</strong> (<em>number</em>) -- Number of levels to upgrade. Must be positive. Rounded to nearest integer</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Tries to upgrade the level of the corresponding Hacknet Node <em>n</em> times. Returns true if the
Hacknet Node's level is successfully upgraded <em>n</em> times or up to the max level (200), and false
otherwise.</p>
</dd></dl>
<dl class="function">
<dt id="hacknetnodes[i].upgradeRam">
<code class="descclassname">hacknetnodes[i].</code><code class="descname">upgradeRam</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#hacknetnodes[i].upgradeRam" title="Permalink to this definition"></a></dt>
<dd><p>Tries to upgrade the amount of RAM on the corresponding Hacknet Node. Returns true if the RAM is
successfully upgraded and false otherwise.</p>
</dd></dl>
<dl class="function">
<dt id="hacknetnodes[i].upgradeCore">
<code class="descclassname">hacknetnodes[i].</code><code class="descname">upgradeCore</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#hacknetnodes[i].upgradeCore" title="Permalink to this definition"></a></dt>
<dd><p>Tries to purchase an additional core for the corresponding Hacknet Node. Returns true if the
additional core is successfully purchased, and false otherwise.</p>
</dd></dl>
<dl class="function">
<dt id="hacknetnodes[i].getLevelUpgradeCost(n);">
<code class="descclassname">hacknetnodes[i].</code><code class="descname">getLevelUpgradeCost(n);</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#hacknetnodes[i].getLevelUpgradeCost(n);" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>n</strong> (<em>number</em>) -- Number of levels to upgrade. Must be positive. Rounded to nearest integer</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Returns the cost of upgrading the specified Hacknet Node by <em>n</em> levels</p>
</dd></dl>
<dl class="function">
<dt id="hacknetnodes[i].getRamUpgradeCost">
<code class="descclassname">hacknetnodes[i].</code><code class="descname">getRamUpgradeCost</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#hacknetnodes[i].getRamUpgradeCost" title="Permalink to this definition"></a></dt>
<dd><p>Returns the cost of upgrading the RAM of the specified Hacknet Node. Upgrading a Node's RAM doubles it.</p>
</dd></dl>
<dl class="function">
<dt id="hacknetnodes[i].getCoreUpgradeCost">
<code class="descclassname">hacknetnodes[i].</code><code class="descname">getCoreUpgradeCost</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#hacknetnodes[i].getCoreUpgradeCost" title="Permalink to this definition"></a></dt>
<dd><p>Returns the cost of upgrading the number of cores of the specified Hacknet Node. Upgrading a Node's
number of cores adds one additional core.</p>
</dd></dl>
</div>
<div class="section" id="example-s">
<h2>Example(s)<a class="headerlink" href="#example-s" title="Permalink to this headline"></a></h2>
<p>The following is an example of one way a script can be used to automate the purchasing and upgrading of Hacknet Nodes.
This script purchases new Hacknet Nodes until the player has four. Then, it iteratively upgrades each of those four Hacknet
Nodes to a level of at least 75, RAM to at least 8GB, and number of cores to at least 2:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">//</span><span class="n">Purchase</span> <span class="mi">4</span> <span class="n">Hacknet</span> <span class="n">Nodes</span>
<span class="k">while</span><span class="p">(</span><span class="n">hacknetnodes</span><span class="o">.</span><span class="n">length</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span>
<span class="n">purchaseHacknetNode</span><span class="p">();</span>
<span class="p">}</span>
<span class="o">//</span><span class="n">Upgrade</span> <span class="nb">all</span> <span class="mi">4</span> <span class="n">Hacknet</span> <span class="n">Nodes</span> <span class="n">to</span> <span class="n">at</span> <span class="n">least</span> <span class="n">level</span> <span class="mi">75</span>
<span class="k">for</span> <span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="n">i</span> <span class="o">=</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="k">while</span> <span class="p">(</span><span class="n">hacknetnodes</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">level</span> <span class="o">&lt;=</span> <span class="mi">75</span><span class="p">)</span> <span class="p">{</span>
<span class="n">hacknetnodes</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">upgradeLevel</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span>
<span class="n">sleep</span><span class="p">(</span><span class="mi">10000</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="o">//</span><span class="n">Upgrade</span> <span class="n">RAM</span> <span class="n">on</span> <span class="nb">all</span> <span class="n">Hacknet</span> <span class="n">Nodes</span> <span class="n">to</span> <span class="mi">8</span><span class="n">GB</span>
<span class="k">for</span> <span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="n">i</span> <span class="o">=</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="k">while</span> <span class="p">(</span><span class="n">hacknetnodes</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">ram</span> <span class="o">&lt;</span> <span class="mi">8</span><span class="p">)</span> <span class="p">{</span>
<span class="n">hacknetnodes</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">upgradeRam</span><span class="p">();</span>
<span class="n">sleep</span><span class="p">(</span><span class="mi">10000</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="o">//</span><span class="n">Upgrade</span> <span class="n">cores</span> <span class="n">on</span> <span class="nb">all</span> <span class="n">Hacknet</span> <span class="n">Nodes</span> <span class="n">to</span> <span class="mi">2</span>
<span class="k">for</span> <span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="n">i</span> <span class="o">=</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="k">while</span> <span class="p">(</span><span class="n">hacknetnodes</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">cores</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
<span class="n">hacknetnodes</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">upgradeCore</span><span class="p">();</span>
<span class="n">sleep</span><span class="p">(</span><span class="mi">10000</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sidebar">
<h3>Table Of Contents</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="netscript.html"> Netscript</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="netscriptdatatypes.html"> Data Types and Variables</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptoperators.html"> Operators</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptloopsandconditionals.html"> Loops and Conditionals</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptscriptarguments.html"> Script Arguments</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html"> Basic Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptadvancedfunctions.html"> Advanced Functions</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#"> Hacknet Node API</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#hacknetnodes">hacknetnodes</a></li>
<li class="toctree-l3"><a class="reference internal" href="#hacknet-node-member-variables">Hacknet Node Member Variables</a></li>
<li class="toctree-l3"><a class="reference internal" href="#hacknet-node-methods">Hacknet Node Methods</a></li>
<li class="toctree-l3"><a class="reference internal" href="#example-s">Example(s)</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="netscriptixapi.html"> Trade Information eXchange (TIX) API</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html"> Singularity Functions</a></li>
</ul>
</li>
</ul>
<div role="search">
<h3 style="margin-top: 1.5em;">Search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="clearer"></div>
</div>
</div>
<div class="footer-wrapper">
<div class="footer">
<div class="left">
<div role="navigation" aria-label="related navigaton">
<a href="netscriptadvancedfunctions.html" title="Netscript Advanced Functions"
>previous</a> |
<a href="netscriptixapi.html" title="Netscript Trade Information eXchange (TIX) API"
>next</a> |
<a href="genindex.html" title="General Index"
>index</a>
</div>
<div role="note" aria-label="source link">
<br/>
<a href="_sources/netscripthacknetnodeapi.rst.txt"
rel="nofollow">Show Source</a>
</div>
</div>
<div class="right">
<div class="footer" role="contentinfo">
&#169; Copyright 2017, Bitburner.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.4.
</div>
</div>
<div class="clearer"></div>
</div>
</div>
</body>
</html>

377
doc/build/html/netscriptixapi.html vendored Normal file

@ -0,0 +1,377 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="English">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Netscript Trade Information eXchange (TIX) API &#8212; Bitburner 1.0 documentation</title>
<link rel="stylesheet" href="_static/agogo.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '1.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Netscript Singularity Functions" href="netscriptsingularityfunctions.html" />
<link rel="prev" title="Netscript Hacknet Node API" href="netscripthacknetnodeapi.html" />
</head>
<body>
<div class="header-wrapper" role="banner">
<div class="header">
<div class="headertitle"><a
href="index.html">Bitburner 1.0 documentation</a></div>
<div class="rel" role="navigation" aria-label="related navigation">
<a href="netscripthacknetnodeapi.html" title="Netscript Hacknet Node API"
accesskey="P">previous</a> |
<a href="netscriptsingularityfunctions.html" title="Netscript Singularity Functions"
accesskey="N">next</a> |
<a href="genindex.html" title="General Index"
accesskey="I">index</a>
</div>
</div>
</div>
<div class="content-wrapper">
<div class="content">
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="netscript-trade-information-exchange-tix-api">
<h1>Netscript Trade Information eXchange (TIX) API<a class="headerlink" href="#netscript-trade-information-exchange-tix-api" title="Permalink to this headline"></a></h1>
<p>The Trade Information eXchange (TIX) is the communications protocol supported by the World Stock Exchange (WSE).
The WESE provides an API that allows you to automatically communicate with the
<a class="reference external" href="http://bitburner.wikia.com/wiki/Stock_Market">Stock Market</a>. This API lets you write code using Netscript
to build automated trading systems and create your own algorithmic trading strategies. Access to this
TIX API can be purchased by visiting the World Stock Exchange in-game.</p>
<p>Access to the TIX API currently costs $5 billion. After you purchase it, you will retain this
access even after you 'reset' by installing Augmentations</p>
<div class="section" id="getstockprice">
<h2>getStockPrice<a class="headerlink" href="#getstockprice" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getStockPrice">
<code class="descname">getStockPrice</code><span class="sig-paren">(</span><em>sym</em><span class="sig-paren">)</span><a class="headerlink" href="#getStockPrice" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>sym</strong> (<em>string</em>) -- Stock symbol</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Returns the price of a stock, given its symbol (NOT the company name). The symbol is a sequence
of two to four capital letters.</p>
<p>Example:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">getStockPrice</span><span class="p">(</span><span class="s2">&quot;FISG&quot;</span><span class="p">);</span>
</pre></div>
</div>
</dd></dl>
</div>
<div class="section" id="getstockposition">
<h2>getStockPosition<a class="headerlink" href="#getstockposition" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getStockPosition">
<code class="descname">getStockPosition</code><span class="sig-paren">(</span><em>sym</em><span class="sig-paren">)</span><a class="headerlink" href="#getStockPosition" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>sym</strong> (<em>string</em>) -- Stock symbol</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Returns an array of four elements that represents the player's position in a stock.</p>
<p>The first element is the returned array is the number of shares the player owns of the stock in the
<a class="reference external" href="http://bitburner.wikia.com/wiki/Stock_Market#Positions:_Long_vs_Short">Long position</a>. The second
element in the array is the average price of the player's shares in the Long position.</p>
<p>The third element in the array is the number of shares the player owns of the stock in the
<a class="reference external" href="http://bitburner.wikia.com/wiki/Stock_Market#Positions:_Long_vs_Short">Short position</a>. The fourth
element in the array is the average price of the player's Short position.</p>
<p>All elements in the returned array are numeric.</p>
<p>Example:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">pos</span> <span class="o">=</span> <span class="n">getStockPosition</span><span class="p">(</span><span class="s2">&quot;ECP&quot;</span><span class="p">);</span>
<span class="n">shares</span> <span class="o">=</span> <span class="n">pos</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
<span class="n">avgPx</span> <span class="o">=</span> <span class="n">pos</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
<span class="n">sharesShort</span> <span class="o">=</span> <span class="n">pos</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
<span class="n">avgPxShort</span> <span class="o">=</span> <span class="n">pos</span><span class="p">[</span><span class="mi">3</span><span class="p">];</span>
</pre></div>
</div>
</dd></dl>
</div>
<div class="section" id="buystock">
<h2>buyStock<a class="headerlink" href="#buystock" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="buyStock">
<code class="descname">buyStock</code><span class="sig-paren">(</span><em>sym</em>, <em>shares</em><span class="sig-paren">)</span><a class="headerlink" href="#buyStock" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>sym</strong> (<em>string</em>) -- Symbol of stock to purchase</li>
<li><strong>shares</strong> (<em>number</em>) -- Number of shares to purchased. Must be positive. Will be rounded to nearest integer</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Attempts to purchase shares of a stock using a <a class="reference external" href="http://bitburner.wikia.com/wiki/Stock_Market#Order_Types">Market Order</a>.</p>
<p>If the player does not have enough money to purchase the specified number of shares, then no shares will be purchased. Remember
that every transaction on the stock exchange costs a certain commission fee.</p>
<p>If this function successfully purchases the shares, it will return the stock price at which each share was purchased. Otherwise,
it will return 0.</p>
</dd></dl>
</div>
<div class="section" id="sellstock">
<h2>sellStock<a class="headerlink" href="#sellstock" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="sellStock">
<code class="descname">sellStock</code><span class="sig-paren">(</span><em>sym</em>, <em>shares</em><span class="sig-paren">)</span><a class="headerlink" href="#sellStock" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>sym</strong> (<em>string</em>) -- Symbol of stock to sell</li>
<li><strong>shares</strong> (<em>number</em>) -- Number of shares to sell. Must be positive. Will be rounded to nearest integer</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Attempts to sell shares of a stock using a <a class="reference external" href="http://bitburner.wikia.com/wiki/Stock_Market#Order_Types">Market Order</a>.</p>
<p>If the specified number of shares in the function exceeds the amount that the player actually owns, then this function will
sell all owned shares. Remember that every transaction on the stock exchange costs a certain commission fee.</p>
<p>The net profit made from selling stocks with this function is reflected in the script's statistics.
This net profit is calculated as:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">shares</span> <span class="o">*</span> <span class="p">(</span><span class="n">sell</span> <span class="n">price</span> <span class="o">-</span> <span class="n">average</span> <span class="n">price</span> <span class="n">of</span> <span class="n">purchased</span> <span class="n">shares</span><span class="p">)</span>
</pre></div>
</div>
<p>If the sale is successful, this function will return the stock price at which each share was sold. Otherwise, it will return 0.</p>
</dd></dl>
</div>
<div class="section" id="shortstock">
<h2>shortStock<a class="headerlink" href="#shortstock" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="shortStock">
<code class="descname">shortStock</code><span class="sig-paren">(</span><em>sym</em>, <em>shares</em><span class="sig-paren">)</span><a class="headerlink" href="#shortStock" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>sym</strong> (<em>string</em>) -- Symbol of stock to short</li>
<li><strong>shares</strong> (<em>number</em>) -- Number of shares to short. Must be positive. Will be rounded to nearest integer</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Attempts to purchase a <a class="reference external" href="http://bitburner.wikia.com/wiki/Stock_Market#Positions:_Long_vs_Short">short</a> position of a stock
using a <a class="reference external" href="http://bitburner.wikia.com/wiki/Stock_Market#Order_Types">Market Order</a>.</p>
<p>The ability to short a stock is <strong>not</strong> immediately available to the player and must be unlocked later on in the game.</p>
<p>If the player does not have enough money to purchase the specified number of shares, then no shares will be purchased.
Remember that every transaction on the stock exchange costs a certain commission fee.</p>
<p>If the purchase is successful, this function will return the stock price at which each share was purchased. Otherwise, it will return 0.</p>
</dd></dl>
</div>
<div class="section" id="sellshort">
<h2>sellShort<a class="headerlink" href="#sellshort" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="sellShort">
<code class="descname">sellShort</code><span class="sig-paren">(</span><em>sym</em>, <em>shares</em><span class="sig-paren">)</span><a class="headerlink" href="#sellShort" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>sym</strong> (<em>string</em>) -- Symbol of stock to sell</li>
<li><strong>shares</strong> (<em>number</em>) -- Number of shares to sell. Must be positive. Will be rounded to nearest integer</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Attempts to sell a <a class="reference external" href="http://bitburner.wikia.com/wiki/Stock_Market#Positions:_Long_vs_Short">short</a> position of a stock
using a <a class="reference external" href="http://bitburner.wikia.com/wiki/Stock_Market#Order_Types">Market Order</a>.</p>
<p>The ability to short a stock is <strong>not</strong> immediately available to the player and must be unlocked later on in the game.</p>
<p>If the specified number of shares exceeds the amount that the player actually owns, then this function will sell all owned
shares. Remember that every transaction on the stock exchange costs a certain commission fee.</p>
<p>If the sale is successful, this function will return the stock price at which each share was sold. Otherwise it will return 0.</p>
</dd></dl>
</div>
<div class="section" id="placeorder">
<h2>placeOrder<a class="headerlink" href="#placeorder" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="placeOrder">
<code class="descname">placeOrder</code><span class="sig-paren">(</span><em>sym</em>, <em>shares</em>, <em>price</em>, <em>type</em>, <em>pos</em><span class="sig-paren">)</span><a class="headerlink" href="#placeOrder" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>sym</strong> (<em>string</em>) -- Symbol of stock to player order for</li>
<li><strong>shares</strong> (<em>number</em>) -- Number of shares for order. Must be positive. Will be rounded to nearest integer</li>
<li><strong>price</strong> (<em>number</em>) -- Execution price for the order</li>
<li><strong>type</strong> (<em>string</em>) -- <p>Type of order. It must specify &quot;limit&quot; or &quot;stop&quot;, and must also specify &quot;buy&quot; or &quot;sell&quot;. This is NOT
case-sensitive. Here are four examples that will work:</p>
<ul>
<li>limitbuy</li>
<li>limitsell</li>
<li>stopbuy</li>
<li>stopsell</li>
</ul>
</li>
<li><strong>pos</strong> (<em>string</em>) -- Specifies whether the order is a &quot;Long&quot; or &quot;Short&quot; position. The Values &quot;L&quot; or &quot;S&quot; can also be used. This is
NOT case-sensitive.</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Places an order on the stock market. This function only works for <a class="reference external" href="http://bitburner.wikia.com/wiki/Stock_Market#Order_Types">Limit and Stop Orders</a>.</p>
<p>The ability to place limit and stop orders is <strong>not</strong> immediately available to the player and must be unlocked later on in the game.</p>
<p>Returns true if the order is successfully placed, and false otherwise.</p>
</dd></dl>
</div>
<div class="section" id="cancelorder">
<h2>cancelOrder<a class="headerlink" href="#cancelorder" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="cancelOrder">
<code class="descname">cancelOrder</code><span class="sig-paren">(</span><em>sym</em>, <em>shares</em>, <em>price</em>, <em>type</em>, <em>pos</em><span class="sig-paren">)</span><a class="headerlink" href="#cancelOrder" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>sym</strong> (<em>string</em>) -- Symbol of stock to player order for</li>
<li><strong>shares</strong> (<em>number</em>) -- Number of shares for order. Must be positive. Will be rounded to nearest integer</li>
<li><strong>price</strong> (<em>number</em>) -- Execution price for the order</li>
<li><strong>type</strong> (<em>string</em>) -- <p>Type of order. It must specify &quot;limit&quot; or &quot;stop&quot;, and must also specify &quot;buy&quot; or &quot;sell&quot;. This is NOT
case-sensitive. Here are four examples that will work:</p>
<ul>
<li>limitbuy</li>
<li>limitsell</li>
<li>stopbuy</li>
<li>stopsell</li>
</ul>
</li>
<li><strong>pos</strong> (<em>string</em>) -- Specifies whether the order is a &quot;Long&quot; or &quot;Short&quot; position. The Values &quot;L&quot; or &quot;S&quot; can also be used. This is
NOT case-sensitive.</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Cancels an oustanding Limit or Stop order on the stock market.</p>
<p>The ability to use limit and stop orders is <strong>not</strong> immediately available to the player and must be unlocked later on in the game.</p>
</dd></dl>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sidebar">
<h3>Table Of Contents</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="netscript.html"> Netscript</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="netscriptdatatypes.html"> Data Types and Variables</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptoperators.html"> Operators</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptloopsandconditionals.html"> Loops and Conditionals</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptscriptarguments.html"> Script Arguments</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html"> Basic Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptadvancedfunctions.html"> Advanced Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscripthacknetnodeapi.html"> Hacknet Node API</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#"> Trade Information eXchange (TIX) API</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#getstockprice">getStockPrice</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getstockposition">getStockPosition</a></li>
<li class="toctree-l3"><a class="reference internal" href="#buystock">buyStock</a></li>
<li class="toctree-l3"><a class="reference internal" href="#sellstock">sellStock</a></li>
<li class="toctree-l3"><a class="reference internal" href="#shortstock">shortStock</a></li>
<li class="toctree-l3"><a class="reference internal" href="#sellshort">sellShort</a></li>
<li class="toctree-l3"><a class="reference internal" href="#placeorder">placeOrder</a></li>
<li class="toctree-l3"><a class="reference internal" href="#cancelorder">cancelOrder</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html"> Singularity Functions</a></li>
</ul>
</li>
</ul>
<div role="search">
<h3 style="margin-top: 1.5em;">Search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="clearer"></div>
</div>
</div>
<div class="footer-wrapper">
<div class="footer">
<div class="left">
<div role="navigation" aria-label="related navigaton">
<a href="netscripthacknetnodeapi.html" title="Netscript Hacknet Node API"
>previous</a> |
<a href="netscriptsingularityfunctions.html" title="Netscript Singularity Functions"
>next</a> |
<a href="genindex.html" title="General Index"
>index</a>
</div>
<div role="note" aria-label="source link">
<br/>
<a href="_sources/netscriptixapi.rst.txt"
rel="nofollow">Show Source</a>
</div>
</div>
<div class="right">
<div class="footer" role="contentinfo">
&#169; Copyright 2017, Bitburner.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.4.
</div>
</div>
<div class="clearer"></div>
</div>
</div>
</body>
</html>

@ -0,0 +1,162 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="English">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Netscript Loops and Conditionals &#8212; Bitburner 1.0 documentation</title>
<link rel="stylesheet" href="_static/agogo.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '1.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Netscript Script Arguments" href="netscriptscriptarguments.html" />
<link rel="prev" title="Netscript Operators" href="netscriptoperators.html" />
</head>
<body>
<div class="header-wrapper" role="banner">
<div class="header">
<div class="headertitle"><a
href="index.html">Bitburner 1.0 documentation</a></div>
<div class="rel" role="navigation" aria-label="related navigation">
<a href="netscriptoperators.html" title="Netscript Operators"
accesskey="P">previous</a> |
<a href="netscriptscriptarguments.html" title="Netscript Script Arguments"
accesskey="N">next</a> |
<a href="genindex.html" title="General Index"
accesskey="I">index</a>
</div>
</div>
</div>
<div class="content-wrapper">
<div class="content">
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="netscript-loops-and-conditionals">
<h1>Netscript Loops and Conditionals<a class="headerlink" href="#netscript-loops-and-conditionals" title="Permalink to this headline"></a></h1>
<div class="section" id="loops-and-conditionals">
<h2>Loops and Conditionals<a class="headerlink" href="#loops-and-conditionals" title="Permalink to this headline"></a></h2>
<p>Netscript loops and conditionals are the same as Javascript. However, the one caveat is that when declaring variables such as the
iterator for traversing a loop, you should not use the 'var' or 'let' keyword. For reference, you can see the Javascript
documentation for loops/conditionals here:</p>
<p><a class="reference external" href="https://www.w3schools.com/js/js_loop_while.asp">While loops</a></p>
<p><a class="reference external" href="https://www.w3schools.com/js/js_loop_for.asp">For loops</a></p>
<p><a class="reference external" href="https://www.w3schools.com/js/js_if_else.asp">Conditionals (If/Else statements)</a></p>
<p>Here are some simple code examples that show the use of loops and conditionals in Netscript.</p>
<p>The following is a while loop that runs the hack() Netscript function ten times:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="k">while</span> <span class="p">(</span><span class="n">i</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">)</span> <span class="p">{</span>
<span class="n">hack</span><span class="p">(</span><span class="s1">&#39;foodnstuff&#39;</span><span class="p">);</span>
<span class="n">i</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
<p>The following is a for loop that runs the hack() Netscript function ten times:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
<span class="n">hack</span><span class="p">(</span><span class="s2">&quot;foodnstuff&quot;</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
<p>The following is a conditional that uses the getServerMoneyAvailable() Netscript function to check how much money
exists on the 'foodnstuff' server. If there is more than $200,000 on the server, then the server will be hacked.
Otherwise, the money available on the server will be grown using the grow() Netscript function:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="k">if</span> <span class="p">(</span><span class="n">getServerMoneyAvailable</span><span class="p">(</span><span class="s1">&#39;foodnstuff&#39;</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">200000</span><span class="p">)</span> <span class="p">{</span>
<span class="n">hack</span><span class="p">(</span><span class="s2">&quot;foodnstuff&quot;</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">grow</span><span class="p">(</span><span class="s2">&quot;foodnstuff&quot;</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sidebar">
<h3>Table Of Contents</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="netscript.html"> Netscript</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="netscriptdatatypes.html"> Data Types and Variables</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptoperators.html"> Operators</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#"> Loops and Conditionals</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#loops-and-conditionals">Loops and Conditionals</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="netscriptscriptarguments.html"> Script Arguments</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html"> Basic Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptadvancedfunctions.html"> Advanced Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscripthacknetnodeapi.html"> Hacknet Node API</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptixapi.html"> Trade Information eXchange (TIX) API</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html"> Singularity Functions</a></li>
</ul>
</li>
</ul>
<div role="search">
<h3 style="margin-top: 1.5em;">Search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="clearer"></div>
</div>
</div>
<div class="footer-wrapper">
<div class="footer">
<div class="left">
<div role="navigation" aria-label="related navigaton">
<a href="netscriptoperators.html" title="Netscript Operators"
>previous</a> |
<a href="netscriptscriptarguments.html" title="Netscript Script Arguments"
>next</a> |
<a href="genindex.html" title="General Index"
>index</a>
</div>
<div role="note" aria-label="source link">
<br/>
<a href="_sources/netscriptloopsandconditionals.rst.txt"
rel="nofollow">Show Source</a>
</div>
</div>
<div class="right">
<div class="footer" role="contentinfo">
&#169; Copyright 2017, Bitburner.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.4.
</div>
</div>
<div class="clearer"></div>
</div>
</div>
</body>
</html>

260
doc/build/html/netscriptoperators.html vendored Normal file

@ -0,0 +1,260 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="English">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Netscript Operators &#8212; Bitburner 1.0 documentation</title>
<link rel="stylesheet" href="_static/agogo.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '1.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Netscript Loops and Conditionals" href="netscriptloopsandconditionals.html" />
<link rel="prev" title="Netscript Data Types and Variables" href="netscriptdatatypes.html" />
</head>
<body>
<div class="header-wrapper" role="banner">
<div class="header">
<div class="headertitle"><a
href="index.html">Bitburner 1.0 documentation</a></div>
<div class="rel" role="navigation" aria-label="related navigation">
<a href="netscriptdatatypes.html" title="Netscript Data Types and Variables"
accesskey="P">previous</a> |
<a href="netscriptloopsandconditionals.html" title="Netscript Loops and Conditionals"
accesskey="N">next</a> |
<a href="genindex.html" title="General Index"
accesskey="I">index</a>
</div>
</div>
</div>
<div class="content-wrapper">
<div class="content">
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="netscript-operators">
<h1>Netscript Operators<a class="headerlink" href="#netscript-operators" title="Permalink to this headline"></a></h1>
<div class="section" id="operators">
<h2>Operators<a class="headerlink" href="#operators" title="Permalink to this headline"></a></h2>
<div class="section" id="binary-operators">
<h3>Binary Operators<a class="headerlink" href="#binary-operators" title="Permalink to this headline"></a></h3>
<p>Binary operators require two operands and produce a result based on their values. In general, binary
operators do not change the value of the operands.</p>
<table border="1" class="docutils">
<colgroup>
<col width="11%" />
<col width="27%" />
<col width="62%" />
</colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">Operator</th>
<th class="head">Name</th>
<th class="head">Example/Comments</th>
</tr>
</thead>
<tbody valign="top">
<tr class="row-even"><td>=</td>
<td>Assignment</td>
<td>i = 5 would assign the value 5 to the variable i</td>
</tr>
<tr class="row-odd"><td>+</td>
<td>Addition</td>
<td>5 + 12 would return 17</td>
</tr>
<tr class="row-even"><td>-</td>
<td>Subtraction</td>
<td>20 - 8 would return 12</td>
</tr>
<tr class="row-odd"><td>*</td>
<td>Multiplication</td>
<td>4 * 5 would return 20</td>
</tr>
<tr class="row-even"><td>/</td>
<td>Division</td>
<td>50 / 10 would return 5</td>
</tr>
<tr class="row-odd"><td>%</td>
<td>Modulo</td>
<td>50 % 9 would return 5</td>
</tr>
<tr class="row-even"><td>&amp;&amp;</td>
<td>Logical AND</td>
<td>true &amp;&amp; false would return false</td>
</tr>
<tr class="row-odd"><td>||</td>
<td>Logical OR</td>
<td>true || false would return true</td>
</tr>
<tr class="row-even"><td>&lt;</td>
<td>Less than</td>
<td>4 &lt; 5 would return true</td>
</tr>
<tr class="row-odd"><td>&gt;</td>
<td>Greater than</td>
<td>4 &gt; 5 would return false</td>
</tr>
<tr class="row-even"><td>&lt;=</td>
<td>Less than or equal to</td>
<td>5 &lt;= 5 would return true</td>
</tr>
<tr class="row-odd"><td>&gt;=</td>
<td>Greater than or equal to</td>
<td>5 &gt;= 4 would return true</td>
</tr>
<tr class="row-even"><td>==</td>
<td>Equality</td>
<td>1 == 1 would return true</td>
</tr>
<tr class="row-odd"><td>!=</td>
<td>Inequality</td>
<td>4 != 5 would return true</td>
</tr>
<tr class="row-even"><td>===</td>
<td>Strict equality</td>
<td>1 === &quot;1&quot; would return false</td>
</tr>
<tr class="row-odd"><td>!==</td>
<td>Strict inequality</td>
<td>1 !== &quot;1&quot; would return true</td>
</tr>
</tbody>
</table>
</div>
<div class="section" id="unary-operators">
<h3>Unary Operators<a class="headerlink" href="#unary-operators" title="Permalink to this headline"></a></h3>
<p>Unary operators require only a single operand and produce a result based on their values. Some unary operators will
change the value of their operands. For example:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="o">++</span><span class="n">i</span><span class="p">;</span>
</pre></div>
</div>
<p>Running the pre-increment unary operator (++) in the code above changes the value of the variable i.</p>
<table border="1" class="docutils">
<colgroup>
<col width="11%" />
<col width="20%" />
<col width="69%" />
</colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">Operator</th>
<th class="head">Name</th>
<th class="head">Example/comments</th>
</tr>
</thead>
<tbody valign="top">
<tr class="row-even"><td>!</td>
<td>Logical NOT operator</td>
<td>!true would return false, and !false would return true. Does not change operand's value</td>
</tr>
<tr class="row-odd"><td>-</td>
<td>Negation</td>
<td>Negates a number. Only works for numerics. Does not change operand's value</td>
</tr>
<tr class="row-even"><td>++</td>
<td>Pre-increment</td>
<td>++i or i++. WARNING: This only pre-increments, even if you put i++. Changes operand's value</td>
</tr>
<tr class="row-odd"><td>--</td>
<td>Pre-decrement</td>
<td>--i or i--. WARNING: This only pre-decrements, even if you put i--. Changes operand's value</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sidebar">
<h3>Table Of Contents</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="netscript.html"> Netscript</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="netscriptdatatypes.html"> Data Types and Variables</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#"> Operators</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#operators">Operators</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#binary-operators">Binary Operators</a></li>
<li class="toctree-l4"><a class="reference internal" href="#unary-operators">Unary Operators</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="netscriptloopsandconditionals.html"> Loops and Conditionals</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptscriptarguments.html"> Script Arguments</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html"> Basic Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptadvancedfunctions.html"> Advanced Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscripthacknetnodeapi.html"> Hacknet Node API</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptixapi.html"> Trade Information eXchange (TIX) API</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html"> Singularity Functions</a></li>
</ul>
</li>
</ul>
<div role="search">
<h3 style="margin-top: 1.5em;">Search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="clearer"></div>
</div>
</div>
<div class="footer-wrapper">
<div class="footer">
<div class="left">
<div role="navigation" aria-label="related navigaton">
<a href="netscriptdatatypes.html" title="Netscript Data Types and Variables"
>previous</a> |
<a href="netscriptloopsandconditionals.html" title="Netscript Loops and Conditionals"
>next</a> |
<a href="genindex.html" title="General Index"
>index</a>
</div>
<div role="note" aria-label="source link">
<br/>
<a href="_sources/netscriptoperators.rst.txt"
rel="nofollow">Show Source</a>
</div>
</div>
<div class="right">
<div class="footer" role="contentinfo">
&#169; Copyright 2017, Bitburner.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.4.
</div>
</div>
<div class="clearer"></div>
</div>
</div>
</body>
</html>

@ -0,0 +1,138 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="English">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Netscript Script Arguments &#8212; Bitburner 1.0 documentation</title>
<link rel="stylesheet" href="_static/agogo.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '1.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Netscript Basic Functions" href="netscriptfunctions.html" />
<link rel="prev" title="Netscript Loops and Conditionals" href="netscriptloopsandconditionals.html" />
</head>
<body>
<div class="header-wrapper" role="banner">
<div class="header">
<div class="headertitle"><a
href="index.html">Bitburner 1.0 documentation</a></div>
<div class="rel" role="navigation" aria-label="related navigation">
<a href="netscriptloopsandconditionals.html" title="Netscript Loops and Conditionals"
accesskey="P">previous</a> |
<a href="netscriptfunctions.html" title="Netscript Basic Functions"
accesskey="N">next</a> |
<a href="genindex.html" title="General Index"
accesskey="I">index</a>
</div>
</div>
</div>
<div class="content-wrapper">
<div class="content">
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="netscript-script-arguments">
<h1>Netscript Script Arguments<a class="headerlink" href="#netscript-script-arguments" title="Permalink to this headline"></a></h1>
<p>Arguments passed into a script can be accessed in Netscript using a special array called <em>args</em>. The arguments can be
accessed using a normal array using the [] operator (args[0], args[1], etc...).</p>
<p>For example, let's say we want to make a generic script 'generic-run.script' and we plan to pass two arguments into that script.
The first argument will be the name of another script, and the second argument will be a number. This generic script will run the
script specified in the first argument with the amount of threads specified in the second element. The code would look like:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">run</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
</pre></div>
</div>
<p>It is also possible to get the number of arguments that was passed into a script using:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">args</span><span class="o">.</span><span class="n">length</span>
</pre></div>
</div>
<p>WARNING: Do not try to modify the args array. This will break the game. I will do my best to prevent players from doing this.</p>
</div>
</div>
</div>
</div>
</div>
<div class="sidebar">
<h3>Table Of Contents</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="netscript.html"> Netscript</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="netscriptdatatypes.html"> Data Types and Variables</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptoperators.html"> Operators</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptloopsandconditionals.html"> Loops and Conditionals</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#"> Script Arguments</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html"> Basic Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptadvancedfunctions.html"> Advanced Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscripthacknetnodeapi.html"> Hacknet Node API</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptixapi.html"> Trade Information eXchange (TIX) API</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html"> Singularity Functions</a></li>
</ul>
</li>
</ul>
<div role="search">
<h3 style="margin-top: 1.5em;">Search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="clearer"></div>
</div>
</div>
<div class="footer-wrapper">
<div class="footer">
<div class="left">
<div role="navigation" aria-label="related navigaton">
<a href="netscriptloopsandconditionals.html" title="Netscript Loops and Conditionals"
>previous</a> |
<a href="netscriptfunctions.html" title="Netscript Basic Functions"
>next</a> |
<a href="genindex.html" title="General Index"
>index</a>
</div>
<div role="note" aria-label="source link">
<br/>
<a href="_sources/netscriptscriptarguments.rst.txt"
rel="nofollow">Show Source</a>
</div>
</div>
<div class="right">
<div class="footer" role="contentinfo">
&#169; Copyright 2017, Bitburner.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.4.
</div>
</div>
<div class="clearer"></div>
</div>
</div>
</body>
</html>

@ -0,0 +1,724 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="English">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Netscript Singularity Functions &#8212; Bitburner 1.0 documentation</title>
<link rel="stylesheet" href="_static/agogo.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '1.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="prev" title="Netscript Trade Information eXchange (TIX) API" href="netscriptixapi.html" />
</head>
<body>
<div class="header-wrapper" role="banner">
<div class="header">
<div class="headertitle"><a
href="index.html">Bitburner 1.0 documentation</a></div>
<div class="rel" role="navigation" aria-label="related navigation">
<a href="netscriptixapi.html" title="Netscript Trade Information eXchange (TIX) API"
accesskey="P">previous</a> |
<a href="genindex.html" title="General Index"
accesskey="I">index</a>
</div>
</div>
</div>
<div class="content-wrapper">
<div class="content">
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<div class="section" id="netscript-singularity-functions">
<h1>Netscript Singularity Functions<a class="headerlink" href="#netscript-singularity-functions" title="Permalink to this headline"></a></h1>
<p>The Singularity Functions are a special set of Netscript functions. These functions allow you to control
many additional aspects of the game through scripts, such as working for factions/companies, purchasing/installing Augmentations,
and creating programs.</p>
<p>The Singularity Functions are <strong>not</strong> immediately available to the player and must be unlocked later in the game.</p>
<p><strong>WARNING: This page contains spoilers for the game</strong>.</p>
<p>The Singularity Functions are unlocked in BitNode-4. If you are in BitNode-4, then you will automatically have access to all of these functions.
You can use the Singularity Functions in other BitNodes if and only if you have the Source-File for BitNode-4 (aka Source-File 4). Each level of
Source-File 4 will open up additional Singularity Functions that you can use in other BitNodes. If your Source-File 4 is upgraded all the way to
level 3, then you will be able to access all of the Singularity Functions.</p>
<p>Note that Singularity Functions require a lot of RAM outside of BitNode-4 (their RAM costs are multiplied by 10 if you are not in BitNode-4)</p>
<div class="section" id="universitycourse">
<h2>universityCourse<a class="headerlink" href="#universitycourse" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="universityCourse">
<code class="descname">universityCourse</code><span class="sig-paren">(</span><em>universityName</em>, <em>courseName</em><span class="sig-paren">)</span><a class="headerlink" href="#universityCourse" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>universityName</strong> (<em>string</em>) -- <p>Name of university. Not case-sensitive. You must be in the correct city for whatever university you specify.</p>
<ul>
<li>Summit University</li>
<li>Rothman University</li>
<li>ZB Institute Of Technology</li>
</ul>
</li>
<li><strong>courseName</strong> (<em>string</em>) -- <p>Name of course. Not case-sensitive.</p>
<ul>
<li>Study Computer Science</li>
<li>Data Strucures</li>
<li>Networks</li>
<li>Algorithms</li>
<li>Management</li>
<li>Leadership</li>
</ul>
<p>If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function.</p>
<p>This function will automatically set you to start taking a course at a university. If you are already in the middle of some
&quot;working&quot; action (such as working at a company, for a faction, or on a program), then running this function will automatically
cancel that action and give you your earnings.</p>
<p>The cost and experience gains for all of these universities and classes are the same as if you were to manually visit and take these classes.</p>
<p>This function will return true if you successfully start taking the course, and false otherwise.</p>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
</dd></dl>
</div>
<div class="section" id="gymworkout">
<h2>gymWorkout<a class="headerlink" href="#gymworkout" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="gymWorkout">
<code class="descname">gymWorkout</code><span class="sig-paren">(</span><em>gymName</em>, <em>stat</em><span class="sig-paren">)</span><a class="headerlink" href="#gymWorkout" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>gymName</strong> (<em>string</em>) -- <p>Name of gym. Not case-sensitive. You must be in the correct city for whatever gym you specify.</p>
<ul>
<li>Crush Fitness Gym</li>
<li>Snap Fitness Gym</li>
<li>Iron Gym</li>
<li>Powerhouse Gym</li>
<li>Millenium Fitness Gym</li>
</ul>
</li>
<li><strong>stat</strong> (<em>string</em>) -- <p>The stat you want to train. Not case-sensitive.</p>
<ul>
<li>strength OR str</li>
<li>defense OR def</li>
<li>dexterity OR dex</li>
<li>agility OR agi</li>
</ul>
<p>If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function.</p>
<p>This function will automatically set you to start working out at a gym to train a particular stat. If you are
already in the middle of some &quot;working&quot; action (such as working at a company, for a faction, or on a program),
then running this function will automatically cancel that action and give you your earnings.</p>
<p>The cost and experience gains for all of these gyms are the same as if you were to manually visit these gyms and train</p>
<p>This function will return true if you successfully start working out at the gym, and false otherwise.</p>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
</dd></dl>
</div>
<div class="section" id="traveltocity">
<h2>travelToCity<a class="headerlink" href="#traveltocity" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="travelToCity">
<code class="descname">travelToCity</code><span class="sig-paren">(</span><em>cityName</em><span class="sig-paren">)</span><a class="headerlink" href="#travelToCity" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>cityName</strong> (<em>string</em>) -- <p>City to travel to. CASE-SENSITIVE.</p>
<ul>
<li>Aevum</li>
<li>Chongqing</li>
<li>Sector-12</li>
<li>New Tokyo</li>
<li>Ishima</li>
<li>Volhaven</li>
</ul>
<p>If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function.</p>
<p>This function allows the player to travel to any city. The cost for using this function is the same as the cost for traveling through the Travel Agency.</p>
<p>This function will return true if you successfully travel to the specified city and false otherwise.</p>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
</dd></dl>
</div>
<div class="section" id="purchasetor">
<h2>purchaseTor<a class="headerlink" href="#purchasetor" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="purchaseTor">
<code class="descname">purchaseTor</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#purchaseTor" title="Permalink to this definition"></a></dt>
<dd><p>If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function.</p>
<p>This function allows you to automatically purchase a TOR router. The cost for purchasing a TOR router using this
function is the same as if you were to manually purchase one.</p>
<p>This function will return true if it successfully purchase a TOR router and false otherwise.</p>
</dd></dl>
</div>
<div class="section" id="purchaseprogram">
<h2>purchaseProgram<a class="headerlink" href="#purchaseprogram" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="purchaseProgram">
<code class="descname">purchaseProgram</code><span class="sig-paren">(</span><em>programName</em><span class="sig-paren">)</span><a class="headerlink" href="#purchaseProgram" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>programName</strong> (<em>string</em>) -- Name of program to purchase. Must include '.exe' extension. Not case-sensitive.</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function.</p>
<p>This function allows you to automatically purchase programs. You MUST have a TOR router in order to use this function.
The cost of purchasing programs using this function is the same as if you were purchasing them through the Dark Web using the
Terminal <em>buy</em> command.</p>
<p>Example:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">purchaseProgram</span><span class="p">(</span><span class="s2">&quot;brutessh.exe&quot;</span><span class="p">);</span>
</pre></div>
</div>
<p>This function will return true if the specified program is purchased, and false otherwise.</p>
</dd></dl>
</div>
<div class="section" id="getstats">
<h2>getStats<a class="headerlink" href="#getstats" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getStats">
<code class="descname">getStats</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#getStats" title="Permalink to this definition"></a></dt>
<dd><p>If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to run this function.</p>
<p>Returns an object with the Player's stats. The object has the following properties:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">Player</span><span class="o">.</span><span class="n">hacking</span>
<span class="n">Player</span><span class="o">.</span><span class="n">strength</span>
<span class="n">Player</span><span class="o">.</span><span class="n">defense</span>
<span class="n">Player</span><span class="o">.</span><span class="n">dexterity</span>
<span class="n">Player</span><span class="o">.</span><span class="n">agility</span>
<span class="n">Player</span><span class="o">.</span><span class="n">charisma</span>
<span class="n">Player</span><span class="o">.</span><span class="n">intelligence</span>
</pre></div>
</div>
<p>Example:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">res</span> <span class="o">=</span> <span class="n">getStats</span><span class="p">();</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;My charisma level is: &#39;</span> <span class="o">+</span> <span class="n">res</span><span class="o">.</span><span class="n">charisma</span><span class="p">);</span>
</pre></div>
</div>
</dd></dl>
</div>
<div class="section" id="isbusy">
<h2>isBusy<a class="headerlink" href="#isbusy" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="isBusy">
<code class="descname">isBusy</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#isBusy" title="Permalink to this definition"></a></dt>
<dd><p>If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to run this function.</p>
<p>Returns a boolean indicating whether or not the player is currently performing an 'action'. These actions include
working for a company/faction, studying at a univeristy, working out at a gym, creating a program, or committing a crime.</p>
</dd></dl>
</div>
<div class="section" id="upgradehomeram">
<h2>upgradeHomeRam<a class="headerlink" href="#upgradehomeram" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="upgradeHomeRam">
<code class="descname">upgradeHomeRam</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#upgradeHomeRam" title="Permalink to this definition"></a></dt>
<dd><p>If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.</p>
<p>This function will upgrade amount of RAM on the player's home computer. The cost is the same as if you were to do it manually.</p>
<p>This function will return true if the player's home computer RAM is successfully upgraded, and false otherwise.</p>
</dd></dl>
</div>
<div class="section" id="getupgradehomeramcost">
<h2>getUpgradeHomeRamCost<a class="headerlink" href="#getupgradehomeramcost" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getUpgradeHomeRamCost">
<code class="descname">getUpgradeHomeRamCost</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#getUpgradeHomeRamCost" title="Permalink to this definition"></a></dt>
<dd><p>If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.</p>
<p>Returns the cost of upgrading the player's home computer RAM.</p>
</dd></dl>
</div>
<div class="section" id="workforcompany">
<h2>workForCompany<a class="headerlink" href="#workforcompany" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="workForCompany">
<code class="descname">workForCompany</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#workForCompany" title="Permalink to this definition"></a></dt>
<dd><p>If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.</p>
<p>This function will automatically set you to start working at the company at which you are employed.
If you are already in the middle of some &quot;working&quot; action (such as working for a faction, training at
a gym, or creating a program), then running this function will automatically cancel that action and give you your earnings.</p>
<p>This function will return true if the player starts working, and false otherwise.</p>
<p>Note that when you are working for a company, you will not actually receive your earnings
(reputation, money, experience) until you FINISH the action. This can be an issue if, for example,
you only want to work until you get 100,000 company reputation. One small hack to get around this is to
continuously restart the action to receive your earnings:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="k">while</span> <span class="p">(</span><span class="n">getCompanyRep</span><span class="p">(</span><span class="n">COMPANY</span> <span class="n">HERE</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">VALUE</span><span class="p">)</span> <span class="p">{</span>
<span class="n">workForCompany</span><span class="p">();</span>
<span class="n">sleep</span><span class="p">(</span><span class="mi">60000</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
<p>This way, your company reputation will be updated every minute.</p>
</dd></dl>
</div>
<div class="section" id="applytocompany">
<h2>applyToCompany<a class="headerlink" href="#applytocompany" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="applyToCompany">
<code class="descname">applyToCompany</code><span class="sig-paren">(</span><em>companyName</em>, <em>field</em><span class="sig-paren">)</span><a class="headerlink" href="#applyToCompany" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>companyName</strong> (<em>string</em>) -- Name of company to apply to. CASE-SENSITIVE.</li>
<li><strong>field</strong> (<em>string</em>) -- <p>Field to which you want to apply. Not case-sensitive</p>
<ul>
<li>software</li>
<li>software consultant</li>
<li>it</li>
<li>security engineer</li>
<li>network engineer</li>
<li>business</li>
<li>business consultant</li>
<li>security</li>
<li>agent</li>
<li>employee</li>
<li>part-time employee</li>
<li>waiter</li>
<li>part-time waiter</li>
</ul>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.</p>
<p>This function will automatically try to apply to the specified company for a position in the specified
field. This function can also be used to apply for promotions by specifying the company and field you
are already employed at.</p>
<p>This function will return true if you successfully get a job/promotion, and false otherwise. Note that
if you are trying to use this function to apply for a promotion and you don't get one, it will return false.</p>
</dd></dl>
</div>
<div class="section" id="getcompanyrep">
<h2>getCompanyRep<a class="headerlink" href="#getcompanyrep" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getCompanyRep">
<code class="descname">getCompanyRep</code><span class="sig-paren">(</span><em>companyName</em><span class="sig-paren">)</span><a class="headerlink" href="#getCompanyRep" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>companyName</strong> (<em>string</em>) -- Name of the company. CASE-SENSITIVE</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.</p>
<p>This function will return the amount of reputation you have at the specified company.
If the company passed in as an argument is invalid, -1 will be returned.</p>
</dd></dl>
</div>
<div class="section" id="checkfactioninvitations">
<h2>checkFactionInvitations<a class="headerlink" href="#checkfactioninvitations" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="checkFactionInvitations">
<code class="descname">checkFactionInvitations</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#checkFactionInvitations" title="Permalink to this definition"></a></dt>
<dd><p>If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.</p>
<p>Returns an array with the name of all Factions you currently have oustanding invitations from.</p>
</dd></dl>
</div>
<div class="section" id="joinfaction">
<h2>joinFaction<a class="headerlink" href="#joinfaction" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="joinFaction">
<code class="descname">joinFaction</code><span class="sig-paren">(</span><em>name</em><span class="sig-paren">)</span><a class="headerlink" href="#joinFaction" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>name</strong> (<em>string</em>) -- Name of faction to join. CASE-SENSITIVE</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.</p>
<p>This function will automatically accept an invitation from a faction and join it.</p>
</dd></dl>
</div>
<div class="section" id="workforfaction">
<h2>workForFaction<a class="headerlink" href="#workforfaction" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="workForFaction">
<code class="descname">workForFaction</code><span class="sig-paren">(</span><em>factionName</em>, <em>workType</em><span class="sig-paren">)</span><a class="headerlink" href="#workForFaction" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>factionName</strong> (<em>string</em>) -- Name of faction to work for. CASE-SENSITIVE</li>
<li><strong>workType</strong> (<em>string</em>) -- <p>Type of work to perform for the faction</p>
<ul>
<li>hacking/hacking contracts/hackingcontracts</li>
<li>field/fieldwork/field work</li>
<li>security/securitywork/security work</li>
</ul>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.</p>
<p>This function will automatically set you to start working for the specified faction.
Obviously, you must be a member of the faction or else this function will fail. If you are already in
the middle of some &quot;working&quot; action (such as working for a company, training at a gym, or creating a program),
then running this function will automatically cancel that action and give you your earnings.</p>
<p>This function will return true if you successfully start working for the specified faction, and false otherwise.</p>
<p>Note that when you are working for a faction, you will not actually receive your earnings (reputation, experience)
until you FINISH the action. This can be an issue if, for example, you only want to work until you get 100,000 faction
reputation. One small hack to get around this is to continuously restart the action to receive your earnings:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="k">while</span> <span class="p">(</span><span class="n">getFactionRep</span><span class="p">(</span><span class="n">FACTION</span> <span class="n">NAME</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">VALUE</span><span class="p">)</span> <span class="p">{</span>
<span class="n">workForFaction</span><span class="p">(</span><span class="n">FACNAME</span><span class="p">,</span> <span class="n">WORKTYPE</span><span class="p">);</span>
<span class="n">sleep</span><span class="p">(</span><span class="mi">60000</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
<p>This way, your faction reputation will be updated every minute.</p>
</dd></dl>
</div>
<div class="section" id="getfactionrep">
<h2>getFactionRep<a class="headerlink" href="#getfactionrep" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getFactionRep">
<code class="descname">getFactionRep</code><span class="sig-paren">(</span><em>factionName</em><span class="sig-paren">)</span><a class="headerlink" href="#getFactionRep" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>factionName</strong> (<em>string</em>) -- Name of faction. CASE-SENSITIVE</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.</p>
<p>This function returns the amount of reputation you have for the specified faction.</p>
</dd></dl>
</div>
<div class="section" id="createprogram">
<h2>createProgram<a class="headerlink" href="#createprogram" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="createProgram">
<code class="descname">createProgram</code><span class="sig-paren">(</span><em>programName</em><span class="sig-paren">)</span><a class="headerlink" href="#createProgram" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>programName</strong> (<em>string</em>) -- Name of program to create. Not case-sensitive</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.</p>
<p>This function will automatically set you to start working on creating the specified program. If you are
already in the middle of some &quot;working&quot; action (such as working for a company, training at a gym, or taking a course),
then running this function will automatically cancel that action and give you your earnings.</p>
<p>Example:</p>
<blockquote>
<div><p>createProgram(&quot;relaysmtp.exe&quot;);</p>
<p>Note that creating a program using this function has the same hacking level requirements as it normally would. These level requirements are:</p>
<ul class="simple">
<li>BruteSSH.exe: 50</li>
<li>FTPCrack.exe: 100</li>
<li>relaySMTP.exe: 250</li>
<li>HTTPWorm.exe: 500</li>
<li>SQLInject.exe: 750</li>
<li>DeepscanV1.exe: 75</li>
<li>DeepscanV2.exe: 400</li>
<li>ServerProfiler.exe: 75</li>
<li>AutoLink.exe: 25</li>
</ul>
<p>This function returns true if you successfully start working on the specified program, and false otherwise.</p>
</div></blockquote>
</dd></dl>
</div>
<div class="section" id="commitcrime">
<h2>commitCrime<a class="headerlink" href="#commitcrime" title="Permalink to this headline"></a></h2>
</div>
<div class="section" id="getcrimechance">
<h2>getCrimeChance<a class="headerlink" href="#getcrimechance" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getCrimeChance">
<code class="descname">getCrimeChance</code><span class="sig-paren">(</span><em>crime</em><span class="sig-paren">)</span><a class="headerlink" href="#getCrimeChance" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>crime</strong> (<em>string</em>) -- Name of crime. Not case-sensitive. This argument is fairlyn lenient in terms of what inputs it accepts.
Check the documentation for the <em>commitCrime()</em> function for a list of example inputs.</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.</p>
<p>This function returns your chance of success at commiting the specified crime. The chance is returned as a decimal (i.e. 60% would be returned as 0.6).</p>
</dd></dl>
</div>
<div class="section" id="getownedaugmentations">
<h2>getOwnedAugmentations<a class="headerlink" href="#getownedaugmentations" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getOwnedAugmentations">
<code class="descname">getOwnedAugmentations</code><span class="sig-paren">(</span><em>purchased=false</em><span class="sig-paren">)</span><a class="headerlink" href="#getOwnedAugmentations" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>purchase</strong> (<em>boolean</em>) -- Specifies whether the returned array should include Augmentations you have purchased but not yet installed.
By default, this argument is false which means that the return value will NOT have the purchased Augmentations.</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.</p>
<p>This function returns an array containing the names (as strings) of all Augmentations you have.</p>
</dd></dl>
</div>
<div class="section" id="getaugmentationsfromfaction">
<h2>getAugmentationsFromFaction<a class="headerlink" href="#getaugmentationsfromfaction" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getAugmentationsFromFaction">
<code class="descname">getAugmentationsFromFaction</code><span class="sig-paren">(</span><em>facName</em><span class="sig-paren">)</span><a class="headerlink" href="#getAugmentationsFromFaction" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>facName</strong> (<em>string</em>) -- Name of faction. CASE-SENSITIVE</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.</p>
<p>Returns an array containing the names (as strings) of all Augmentations that are available from the specified faction.</p>
</dd></dl>
</div>
<div class="section" id="getaugmentationcost">
<h2>getAugmentationCost<a class="headerlink" href="#getaugmentationcost" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getAugmentationCost">
<code class="descname">getAugmentationCost</code><span class="sig-paren">(</span><em>augName</em><span class="sig-paren">)</span><a class="headerlink" href="#getAugmentationCost" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>augName</strong> (<em>string</em>) -- Name of Augmentation. CASE-SENSITIVE</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.</p>
<p>This function returns an array with two elements that gives the cost for the specified Augmentation.
The first element in the returned array is the reputation requirement of the Augmentation, and the second element is the money cost.</p>
<p>If an invalid Augmentation name is passed in for the <em>augName</em> argument, this function will return the array [-1, -1].</p>
</dd></dl>
</div>
<div class="section" id="purchaseaugmentation">
<h2>purchaseAugmentation<a class="headerlink" href="#purchaseaugmentation" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="purchaseAugmentation">
<code class="descname">purchaseAugmentation</code><span class="sig-paren">(</span><em>factionName</em>, <em>augName</em><span class="sig-paren">)</span><a class="headerlink" href="#purchaseAugmentation" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>factionName</strong> (<em>string</em>) -- Name of faction to purchase Augmentation from. CASE-SENSITIVE</li>
<li><strong>augName</strong> (<em>string</em>) -- Name of Augmentation to purchase. CASE-SENSITIVE</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.</p>
<p>This function will try to purchase the specified Augmentation through the given Faction.</p>
<p>This function will return true if the Augmentation is successfully purchased, and false otherwise.</p>
</dd></dl>
</div>
<div class="section" id="installaugmentations">
<h2>installAugmentations<a class="headerlink" href="#installaugmentations" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="installAugmentations">
<code class="descname">installAugmentations</code><span class="sig-paren">(</span><em>cbScript</em><span class="sig-paren">)</span><a class="headerlink" href="#installAugmentations" title="Permalink to this definition"></a></dt>
<dd><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Arguments:</th><td class="field-body"><ul class="first last simple">
<li><strong>cbScript</strong> (<em>string</em>) -- Optional callback script. This is a script that will automatically be run after Augmentations are installed (after the reset).
This script will be run with no arguments and 1 thread. It must be located on your home computer.</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.</p>
<p>This function will automatically install your Augmentations, resetting the game as usual.</p>
<p>It will return true if successful, and false otherwise.</p>
</dd></dl>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sidebar">
<h3>Table Of Contents</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="netscript.html"> Netscript</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="netscriptdatatypes.html"> Data Types and Variables</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptoperators.html"> Operators</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptloopsandconditionals.html"> Loops and Conditionals</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptscriptarguments.html"> Script Arguments</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptfunctions.html"> Basic Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptadvancedfunctions.html"> Advanced Functions</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscripthacknetnodeapi.html"> Hacknet Node API</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptixapi.html"> Trade Information eXchange (TIX) API</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#"> Singularity Functions</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#universitycourse">universityCourse</a></li>
<li class="toctree-l3"><a class="reference internal" href="#gymworkout">gymWorkout</a></li>
<li class="toctree-l3"><a class="reference internal" href="#traveltocity">travelToCity</a></li>
<li class="toctree-l3"><a class="reference internal" href="#purchasetor">purchaseTor</a></li>
<li class="toctree-l3"><a class="reference internal" href="#purchaseprogram">purchaseProgram</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getstats">getStats</a></li>
<li class="toctree-l3"><a class="reference internal" href="#isbusy">isBusy</a></li>
<li class="toctree-l3"><a class="reference internal" href="#upgradehomeram">upgradeHomeRam</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getupgradehomeramcost">getUpgradeHomeRamCost</a></li>
<li class="toctree-l3"><a class="reference internal" href="#workforcompany">workForCompany</a></li>
<li class="toctree-l3"><a class="reference internal" href="#applytocompany">applyToCompany</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getcompanyrep">getCompanyRep</a></li>
<li class="toctree-l3"><a class="reference internal" href="#checkfactioninvitations">checkFactionInvitations</a></li>
<li class="toctree-l3"><a class="reference internal" href="#joinfaction">joinFaction</a></li>
<li class="toctree-l3"><a class="reference internal" href="#workforfaction">workForFaction</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getfactionrep">getFactionRep</a></li>
<li class="toctree-l3"><a class="reference internal" href="#createprogram">createProgram</a></li>
<li class="toctree-l3"><a class="reference internal" href="#commitcrime">commitCrime</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getcrimechance">getCrimeChance</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getownedaugmentations">getOwnedAugmentations</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getaugmentationsfromfaction">getAugmentationsFromFaction</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getaugmentationcost">getAugmentationCost</a></li>
<li class="toctree-l3"><a class="reference internal" href="#purchaseaugmentation">purchaseAugmentation</a></li>
<li class="toctree-l3"><a class="reference internal" href="#installaugmentations">installAugmentations</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<div role="search">
<h3 style="margin-top: 1.5em;">Search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="clearer"></div>
</div>
</div>
<div class="footer-wrapper">
<div class="footer">
<div class="left">
<div role="navigation" aria-label="related navigaton">
<a href="netscriptixapi.html" title="Netscript Trade Information eXchange (TIX) API"
>previous</a> |
<a href="genindex.html" title="General Index"
>index</a>
</div>
<div role="note" aria-label="source link">
<br/>
<a href="_sources/netscriptsingularityfunctions.rst.txt"
rel="nofollow">Show Source</a>
</div>
</div>
<div class="right">
<div class="footer" role="contentinfo">
&#169; Copyright 2017, Bitburner.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.4.
</div>
</div>
<div class="clearer"></div>
</div>
</div>
</body>
</html>

BIN
doc/build/html/objects.inv vendored Normal file

Binary file not shown.

128
doc/build/html/search.html vendored Normal file

@ -0,0 +1,128 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="English">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Search &#8212; Bitburner 1.0 documentation</title>
<link rel="stylesheet" href="_static/agogo.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '1.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt'
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/javascript" src="_static/searchtools.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="#" />
<script type="text/javascript">
jQuery(function() { Search.loadIndex("searchindex.js"); });
</script>
<script type="text/javascript" id="searchindexloader"></script>
</head>
<body>
<div class="header-wrapper" role="banner">
<div class="header">
<div class="headertitle"><a
href="index.html">Bitburner 1.0 documentation</a></div>
<div class="rel" role="navigation" aria-label="related navigation">
<a href="genindex.html" title="General Index"
accesskey="I">index</a>
</div>
</div>
</div>
<div class="content-wrapper">
<div class="content">
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1 id="search-documentation">Search</h1>
<div id="fallback" class="admonition warning">
<script type="text/javascript">$('#fallback').hide();</script>
<p>
Please activate JavaScript to enable the search
functionality.
</p>
</div>
<p>
From here you can search these documents. Enter your search
words into the box below and click "search". Note that the search
function will automatically search for all of the words. Pages
containing fewer words won't appear in the result list.
</p>
<form action="" method="get">
<input type="text" name="q" value="" />
<input type="submit" value="search" />
<span id="search-progress" style="padding-left: 10px"></span>
</form>
<div id="search-results">
</div>
</div>
</div>
</div>
</div>
<div class="sidebar">
<h3>Table Of Contents</h3>
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="netscript.html"> Netscript</a></li>
</ul>
<div role="search">
<h3 style="margin-top: 1.5em;">Search</h3>
<form class="search" action="#" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="clearer"></div>
</div>
</div>
<div class="footer-wrapper">
<div class="footer">
<div class="left">
<div role="navigation" aria-label="related navigaton">
<a href="genindex.html" title="General Index"
>index</a>
</div>
<div role="note" aria-label="source link">
</div>
</div>
<div class="right">
<div class="footer" role="contentinfo">
&#169; Copyright 2017, Bitburner.
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.4.
</div>
</div>
<div class="clearer"></div>
</div>
</div>
</body>
</html>

1
doc/build/html/searchindex.js vendored Normal file

File diff suppressed because one or more lines are too long

36
doc/make.bat Normal file

@ -0,0 +1,36 @@
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=python -msphinx
)
set SOURCEDIR=source
set BUILDDIR=build
set SPHINXPROJ=Bitburner
if "%1" == "" goto help
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The Sphinx module was not found. Make sure you have Sphinx installed,
echo.then set the SPHINXBUILD environment variable to point to the full
echo.path of the 'sphinx-build' executable. Alternatively you may add the
echo.Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.http://sphinx-doc.org/
exit /b 1
)
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
:end
popd

25
doc/source/conf-guzzle.py Normal file

@ -0,0 +1,25 @@
import sys, os, subprocess
project = u'Bitburner'
copyright = u'2017, Daniel Xie'
master_doc = 'index'
templates_path = ['_templates']
extensions = []
source_suffix = '.rst'
version = '1.0.0'
exclude_patterns = ['_build']
# -- HTML theme settings ------------------------------------------------
html_show_sourcelink = False
import guzzle_sphinx_theme
extensions.append("guzzle_sphinx_theme")
html_theme_path = guzzle_sphinx_theme.html_theme_path()
html_theme = 'guzzle_sphinx_theme'
# Guzzle theme options (see theme.conf for more information)
html_theme_options = {
"project_nav_name": "Bitburner",
}

183
doc/source/conf.py Normal file

@ -0,0 +1,183 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Bitburner documentation build configuration file, created by
# sphinx-quickstart on Wed Oct 4 15:03:07 2017.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = ['sphinx.ext.autodoc',
'sphinx.ext.doctest',
'sphinx.ext.intersphinx',
'sphinx.ext.todo',
'sphinx.ext.coverage',
'sphinx.ext.mathjax',
'sphinx.ext.ifconfig',
'sphinx.ext.viewcode',
'sphinx.ext.githubpages']
# Add any paths that contain templates here, relative to this directory.
templates_path = ['ytemplates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = 'Bitburner'
copyright = '2017, Bitburner'
author = 'Bitburner'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '1.0'
# The full version, including alpha/beta/rc tags.
release = '1.0'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = 'English'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path
exclude_patterns = []
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = True
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'agogo'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
#html_theme_options = {'stickysidebar':'true'}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['ystatic']
# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
#
# This is required for the alabaster theme
# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
# html_sidebars = {
# '**': [
# 'about.html',
# 'navigation.html',
# 'relations.html', # needs 'show_related': True theme option to display
# 'searchbox.html',
# 'donate.html',
# ]
# }
# -- Options for HTMLHelp output ------------------------------------------
# Output file base name for HTML help builder.
htmlhelp_basename = 'Bitburnerdoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'Bitburner.tex', 'Bitburner Documentation',
'Bitburner', 'manual'),
]
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'bitburner', 'Bitburner Documentation',
[author], 1)
]
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'Bitburner', 'Bitburner Documentation',
author, 'Bitburner', 'One line description of project.',
'Miscellaneous'),
]
# Example configuration for intersphinx: refer to the Python standard library.
intersphinx_mapping = {'https://docs.python.org/': None}

31
doc/source/index.rst Normal file

@ -0,0 +1,31 @@
.. Bitburner documentation master file, created by
sphinx-quickstart on Wed Oct 4 15:03:07 2017.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to Bitburner's documentation!
=====================================
Bitburner is a cyberpunk-themed `incremental game <https://en.wikipedia.org/wiki/Incremental_game>`_ that is currently in the
early beta stage of development. The game `can be played here <https://danielyxie.github.io/bitburner/>`_.
What is Bitburner?
------------------
Bitburner is a cyberpunk-themed incremental RPG where you, the player, take the role of an unknown hacker in a dark, dystopian world.
When a mysterious hacker called jump3R messages you, he/she confirms your suspicions that there is something wrong with the world around you.
Now, aided by jump3R, you embark on a quest to gain money and power by any means necessary, in the hopes that this will lead to to uncover the
secrets that you've been searching for.
.. toctree::
:maxdepth: 5
:caption: Contents:
Netscript <netscript>
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

25
doc/source/netscript.rst Normal file

@ -0,0 +1,25 @@
Netscript Documentation
=======================
Netscript is the programming language used in the world of Bitburner.
When you write scripts in Bitburner, they are written in the Netscript language.
Netscript is simply a tiny subset of Javascript. This means that Netscript's
syntax is almost idental to Javascript's, but it does not implement many of the
features that Javascript has.
If you have any requests or suggestions to improve the Netscript language, feel free
to reach out to the developer!
.. toctree::
:maxdepth: 5
:caption: Sections:
Data Types and Variables <netscriptdatatypes>
Operators <netscriptoperators>
Loops and Conditionals <netscriptloopsandconditionals>
Script Arguments <netscriptscriptarguments>
Basic Functions <netscriptfunctions>
Advanced Functions <netscriptadvancedfunctions>
Hacknet Node API <netscripthacknetnodeapi>
Trade Information eXchange (TIX) API <netscriptixapi>
Singularity Functions <netscriptsingularityfunctions>

@ -0,0 +1,45 @@
Netscript Advanced Functions
============================
These Netscript functions become relevant later on in the game. They are put on a separate page because
they contain spoilers for the game.
getBitNodeMultipliers
^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getBitNodeMultipliers()
Returns an object containing the current BitNode multipliers. This function requires Source-File 5 in order
to run. The multipliers are returned in integer forms (e.g. 1.5 instead of 150%). The multipliers represent
the difference between the current BitNode and the original BitNode (BitNode-1). For example, if the
*CrimeMoney* multiplier has a value of 0.1, then that means that committing crimes in the current BitNode
will only give 10% of the money you would have received in BitNode-1. The object has the following structure,
(subject to change in the future)::
{
ServerMaxMoney: 1,
ServerStartingMoney: 1,
ServerGrowthRate: 1,
ServerWeakenRate: 1,
ServerStartingSecurity: 1,
ManualHackMoney: 1,
ScriptHackMoney: 1,
CompanyWorkMoney: 1,
CrimeMoney: 1,
HacknetNodeMoney: 1,
CompanyWorkExpGain: 1,
ClassGymExpGain: 1,
FactionWorkExpGain: 1,
HackExpGain: 1,
CrimeExpGain: 1,
FactionWorkRepGain: 1,
FactionPassiveRepGain: 1,
AugmentationRepCost: 1,
AugmentationMoneyCost: 1,
}
Example::
mults = getBitNodeMultipliers();
print(mults.ServerMaxMoney);
print(mults.HackExpGain);

@ -0,0 +1,44 @@
Netscript Data Types and Variables
==================================
Data Types
----------
Netscript supports three primitive data types:
**Numbers** - Positive numerics, such as integers and floats. Examples: 6, 0, 10.5
**Strings** - A sequence of characters that represents text. The characters must be encapsulated by single or
double quotes. Example: "This is a string" or equivalently 'This is a string'.
*Strings are fully functional* `Javascript strings <https://www.w3schools.com/jsref/jsref_obj_string.asp>`_,
*which means that all of the member functions of Javascript strings such as toLowerCase() and includes() are also available in Netscript!*
**Boolean** - true or false
**Array** - An array is a special container object that is capable of holding many different values. Arrays are simply Javascript
arrays, and most Javascript array methods can be used in Netscript as well (join(), pop(), splice(), etc.). You can read more about
`Javascript arrays here <https://www.w3schools.com/js/js_arrays.asp>`_
Variables
---------
Variables can be thought of as named containers. Their purpose is to label and store data. The data stored in the
variable can then be accessed and changed by referring to the variable's name. The name of a variable must start with
either a letter or an underscore. The rest of the variable name can contain any alphanumeric (letters and numbers),
as well as hyphens and underscores.
The Netscript language is untyped, meaning that any variable can hold any of the data types above. The value type of a variable
can also change. For example, if a variable initially holds a number, it can later hold a string.
The following shows how you can declare and initialize variables::
i = 1;
s = "This is a string";
b = false;
After declaring a variable, the values in variables can be used simply by referencing the name. For example::
j = i + 5;
s2 = s + " Adding more letters onto the string"
The first command above will store the value 6 in the variable j. The second command will store the string "This is a string Adding more letters onto the string" into the variable s2.

@ -0,0 +1,889 @@
Netscript Basic Functions
=========================
This page contains the complete documentation for all functions that are available in Netscript.
This includes information such as function signatures, what they do, and their return values.
At the end is also a section that describes how to define your own functions in Netscript.
hack
^^^^
.. js:function:: hack(hostname/ip)
:param string hostname/ip: IP or hostname of the target server to hack
:returns: True if the hack is successful, false otherwise
Function that is used to try and hack servers to steal money and gain hacking experience. The runtime for this command depends
on your hacking level and the target server's security level. In order to hack a server you must first gain root access
to that server and also have the required hacking level.
A script can hack a server from anywhere. It does not need to be running on the same server to hack that server. For example,
you can create a script that hacks the 'foodnstuff' server and run that script on any server in the game.
A successful hack() on a server will raise that server's security level by 0.002.
Example::
hack("foodnstuff");
hack("10.1.2.3");
grow
^^^^
.. js:function:: grow(hostname/ip)
:param string hostname/ip: IP or hostname of the target server to grow
:returns: The number by which the money on the server was multiplied for the growth
Use your hacking skills to increase the amount of money available on a server. The runtime for this command depends on your hacking
level and the target server's security level. When grow() completes, the money available on a target server will be increased by a
certain, fixed percentage. This percentage is determined by the target server's growth rate (which varies between servers) and security level.
Generally, higher-level servers have higher growth rates. The getServerGrowth() function can be used to obtain a server's growth rate.
Like hack(), grow() can be called on any server, regardless of where the script is running. The grow() command requires
root access to the target server, but there is no required hacking level to run the command. It also raises the security level
of the target server by 0.004.
Example::
grow("foodnstuff");
weaken
^^^^^^
.. js:function:: weaken(hostname/ip)
:param string hostname.ip: IP or hostname of the target server to weaken
:returns: The amount by which the target server's security level was decreased. This is equivalent to 0.05 multiplied
by the number of script threads
Use your hacking skills to attack a server's security, lowering the server's security level. The runtime for this command
depends on your hacking level and the target server's security level. This function lowers the security level of the target
server by 0.05.
Like hack() and grow(), weaken() can be called on any server, regardless of where the script is running. This command requires
root access to the target server, but there is no required hacking level to run the command.
Example::
weaken("foodnstuff");
sleep
^^^^^
.. js:function:: sleep(n[, log=true])
:param number n: Number of milliseconds to sleep
:param boolean log: Optional boolean specifying whether or not to log the action
Suspends the script for n milliseconds.
print
^^^^^
.. js:function:: print(x)
:param x: Value to be printed
Prints a value or a variable to the script's logs.
tprint
^^^^^^
.. js:function:: tprint(x)
:param x: Value to be printed
Prints a value or a variable to the Terminal
scan
^^^^
.. js:function:: scan(hostname/ip[, hostnames=true])
:param string hostname/ip: IP or hostname of the server to scan
:param boolean: Optional boolean specifying whether the function should output hostnames (if true) or IP addresses (if false)
Returns an array containing the hostnames or IPs of all servers that are one node way from the specified target server. The
hostnames/IPs in the returned array are strings.
nuke
^^^^
.. js:function:: nuke(hostname/ip)
:param string hostname/ip: IP or hostname of the target server
Runs the NUKE.exe program on the target server. NUKE.exe must exist on your home computer.
Example::
nuke("foodnstuff");
brutessh
^^^^^^^^
.. js:function:: brutessh(hostname/ip)
:param string hostname/ip: IP or hostname of the target server
Runs the BruteSSH.exe program on the target server. BruteSSH.exe must exist on your home computer.
Example::
brutessh("foodnstuff");
ftpcrack
^^^^^^^^
.. js:function:: ftpcrack(hostname/ip)
:param string hostname/ip: IP or hostname of the target server
Runs the FTPCrack.exe program on the target server. FTPCrack.exe must exist on your home computer.
Example::
ftpcrack("foodnstuff");
relaysmtp
^^^^^^^^^
.. js:function:: relaysmtp(hostname/ip)
:param string hostname/ip: IP or hostname of the target server
Runs the relaySMTP.exe program on the target server. relaySMTP.exe must exist on your home computer.
Example::
relaysmtp("foodnstuff");
httpworm
^^^^^^^^
.. js:function:: httpworm(hostname/ip)
:param string hostname/ip: IP or hostname of the target server
Runs the HTTPWorm.exe program on the target server. HTTPWorm.exe must exist on your home computer.
Example::
httpworm("foodnstuff");
sqlinject
^^^^^^^^^
.. js:function:: sqlinject(hostname/ip)
:param string hostname/ip: IP or hostname of the target server
Runs the SQLInject.exe program on the target server. SQLInject.exe must exist on your home computer.
Example::
sqlinject("foodnstuff");
run
^^^
.. js:function:: run(script, [numThreads=1], [args...])
:param string script: Filename of script to run
:param number numThreads: Optional thread count for new script. Set to 1 by default. Will be rounded to nearest integer
:param args...:
Additional arguments to pass into the new script that is being run. Note that if any arguments are being
passed into the new script, then the second argument *numThreads* must be filled in with a value.
Run a script as a separate process. This function can only be used to run scripts located on the current server (the server
running the script that calls this function).
Returns true if the script is successfully started, and false otherwise. Requires a significant amount of RAM to run this
command.
The simplest way to use the *run* command is to call it with just the script name. The following example will run
'foo.script' single-threaded with no arguments::
run("foo.script");
The following example will run 'foo.script' but with 5 threads instead of single-threaded::
run("foo.script", 5);
This next example will run 'foo.script' single-threaded, and will pass the string 'foodnstuff' into the script
as an argument::
run("foo.script", 1, 'foodnstuff');
exec
^^^^
.. js:function:: exec(script, hostname/ip, [numThreads=1], [args...])
:param string script: Filename of script to execute
:param string hostname/ip: IP or hostname of the 'target server' on which to execute the script
:param number numThreads: Optional thread count for new script. Set to 1 by default. Will be rounded to nearest integer
:param args...:
Additional arguments to pass into the new script that is being run. Note that if any arguments are being
passed into the new script, then the third argument *numThreads* must be filled in with a value.
Run a script as a separate process on a specified server. This is similar to the *run* function except
that it can be used to run a script on any server, instead of just the current server.
Returns true if the script is successfully started, and false otherwise.
The simplest way to use the *exec* command is to call it with just the script name and the target server.
The following example will try to run *generic-hack.script* on the *foodnstuff* server::
exec("generic-hack.script", "foodnstuff");
The following example will try to run the script *generic-hack.script* on the *joesguns* server with 10 threads::
exec("generic-hack.script", "joesguns", 10);
This last example will try to run the script *foo.script* on the *foodnstuff* server with 5 threads. It will also pass
the number 1 and the string "test" in as arguments to the script::
exec("foo.script", "foodnstuff", 5, 1, "test");
kill
^^^^
.. js:function:: kill(script, hostname/ip, [args...])
:param string script: Filename of the script to kill
:param string hostname/ip: IP or hostname of the server on which to kill the script
:param args...: Arguments to identify which script to kill
Kills the script on the target server specified by the script's name and arguments. Remember that scripts
are uniquely identified by both their name and arguments. For example, if *foo.script* is run with the argument 1, then this
is not the same as *foo.script* run with the argument 2, even though they have the same code.
If this function successfully kills the specified script, then it will return true. Otherwise, it will return false.
Examples:
The following example will try to kill a script named *foo.script* on the *foodnstuff* server that was ran with no arguments::
kill("foo.script", "foodnstuff");
The following will try to kill a script named *foo.script* on the current server that was ran with no arguments::
kill("foo.script", getHostname());
The following will try to kill a script named *foo.script* on the current server that was ran with the arguments 1 and "foodnstuff"::
kill("foo.script", getHostname(), 1, "foodnstuff");
killall
^^^^^^^
.. js:function:: killall(hostname/ip)
:param string hostname/ip: IP or hostname of the server on which to kill all scripts
Kills all running scripts on the specified server. This function will always return true.
exit
^^^^
.. js:function:: exit()
Terminates the current script immediately
scp
^^^
.. js:function:: scp(files, [source], destination)
:param string/array files: Filename or an array of filenames of script/literature files to copy
:param string source:
Hostname or IP of the source server, which is the server from which the file will be copied.
This argument is optional and if it's omitted the source will be the current server.
:param string destination: Hostname or IP of the destination server, which is the server to which the file will be copied.
Copies a script or literature (.lit) file(s) to another server. The *files* argument can be either a string specifying a
single file to copy, or an array of strings specifying multiple files to copy.
Returns true if the script/literature file is successfully copied over and false otherwise. If the *files* argument is an array
then this function will return true if at least one of the files in the array is successfully copied.
Examples::
//Copies hack-template.script from the current server to foodnstuff
scp("hack-template.script", "foodnstuff");
//Copies foo.lit from the helios server to the home computer
scp("foo.lit", "helios", "home");
//Tries to copy three files from rothman-uni to home computer
files = ["foo1.lit", "foo2.script", "foo3.script"];
scp(files, "rothman-uni", "home");
ls
^^
.. js:function:: ls(hostname/ip)
:param string hostname/ip: Hostname or IP of the target server
Returns an array with the filenames of all files on the specified server (as strings). The returned array
is sorted in alphabetic order
hasRootAccess
^^^^^^^^^^^^^
.. js:function:: hasRootAccess(hostname/ip)
:param string hostname/ip: Hostname or IP of the target server
Returns a boolean indicating whether or not the player has root access to the specified target server.
Example::
if (hasRootAccess("foodnstuff") == false) {
nuke("foodnstuff");
}
getHostname
^^^^^^^^^^^
.. js:function:: getHostname()
Returns a string with the hostname of the server that the script is running on
getHackingLevel
^^^^^^^^^^^^^^^
.. js:function:: getHackingLevel()
Returns the player's current hacking level
getHackingMultipliers
^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getHackingMultipliers()
Returns an object containing the Player's hacking related multipliers. These multipliers are
returned in integer forms, not percentages (e.g. 1.5 instead of 150%). The object has the following structure::
{
chance: Player's hacking chance multiplier,
speed: Player's hacking speed multiplier,
money: Player's hacking money stolen multiplier,
growth: Player's hacking growth multiplier
}
Example of how this can be used::
mults = getHackingMultipliers();
print(mults.chance);
print(mults.growth);
getServerMoneyAvailable
^^^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getServerMoneyAvailable(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the amount of money available on a server. **Running this function on the home computer will return
the player's money.**
Example::
getServerMoneyAvailable("foodnstuff");
getServerMoneyAvailable("home"); //Returns player's money
getServerMaxMoney
^^^^^^^^^^^^^^^^^
.. js:function:: getServerMaxMoney(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the maximum amount of money that can be available on a server
getServerGrowth
^^^^^^^^^^^^^^^
.. js:function:: getServerGrowth(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the server's instrinsic "growth parameter". This growth parameter is a number
between 1 and 100 that represents how quickly the server's money grows. This parameter affects the
percentage by which the server's money is increased when using the *grow()* function. A higher
growth parameter will result in a higher percentage increase from *grow()*.
getServerSecurityLevel
^^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getServerSecurityLevel(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the security level of the target server. A server's security level is denoted by a number, typically
between 1 and 100 (but it can go above 100).
getServerBaseSecurityLevel
^^^^^^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getServerBaseSecurityLevel(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the base security level of the target server. This is the security level that the server starts out with.
This is different than *getServerSecurityLevel()* because *getServerSecurityLevel()* returns the current
security level of a server, which can constantly change due to *hack()*, *grow()*, and *weaken()*, calls on that
server. The base security level will stay the same until you reset by installing an Augmentation(s).
getServerMinSecurityLevel
^^^^^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getServerMinSecurityLevel(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the minimum security level of the target server
getServerRequiredHackingLevel
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getServerRequiredHackingLevel(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the required hacking level of the target server
getServerNumPortsRequired
^^^^^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getServerNumPortsRequired(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the number of open ports required to successfully run NUKE.exe on the specified server.
getServerRam
^^^^^^^^^^^^
.. js:function:: getServerRam(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns an array with two elements that gives information about a server's memory (RAM). The first
element in the array is the amount of RAM that the server has total (in GB). The second element in
the array is the amount of RAM that is currently being used on the server (in GB).
Example::
res = getServerRam("helios");
totalRam = res[0];
ramUsed = res[1];
serverExists
^^^^^^^^^^^^
.. js:function:: serverExists(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns a boolean denoting whether or not the specified server exists
fileExists
^^^^^^^^^^
.. js:function:: fileExists(filename, [hostname/ip])
:param string filename: Filename of file to check
:param string hostname/ip:
Hostname or IP of target server. This is optional. If it is not specified then the
function will use the current server as the target server
Returns a boolean indicating whether the specified file exists on the target server. The filename
for scripts is case-sensitive, but for other types of files it is not. For example, *fileExists("brutessh.exe")*
will work fine, even though the actual program is named "BruteSSH.exe".
If the *hostname/ip* argument is omitted, then the function will search through the current server (the server
running the script that calls this function) for the file.
Examples::
fileExists("foo.script", "foodnstuff");
fileExists("ftpcrack.exe");
The first example above will return true if the script named *foo.script* exists on the *foodnstuff* server, and false otherwise.
The second example above will return true if the current server contains the *FTPCrack.exe* program, and false otherwise.
isRunning
^^^^^^^^^
.. js:function:: isRunning(filename, hostname/ip, [args...])
:param string filename: Filename of script to check. This is case-sensitive.
:param string hostname/ip: Hostname or IP of target server
:param args...: Arguments to specify/identify which scripts to search for
Returns a boolean indicating whether the specified script is running on the target server. Remember that a script is
uniquely identified by both its name and its arguments.
**Examples:**
In this first example below, the function call will return true if there is a script named *foo.script* with no arguments
running on the *foodnstuff* server, and false otherwise::
isRunning("foo.script", "foodnstuff");
In this second example below, the function call will return true if there is a script named *foo.script* with no arguments
running on the current server, and false otherwise::
isRunning("foo.script", getHostname());
In this next example below, the function call will return true if there is a script named *foo.script* running with the arguments
1, 5, and "test" (in that order) on the *joesguns* server, and false otherwise::
isRunning("foo.script", "joesguns", 1, 5, "test");
getNextHacknetNodeCost
^^^^^^^^^^^^^^^^^^^^^^
.. js:function:: getNextHacknetNodeCost()
Returns the cost of purchasing a new Hacknet Node
purchaseHacknetNode
^^^^^^^^^^^^^^^^^^^
.. js:function:: purchaseHacknetNode()
Purchases a new Hacknet Node. Returns a number with the index of the Hacknet Node. This index is equivalent to the number at the
end of the Hacknet Node's name (e.g The Hacknet Node named 'hacknet-node-4' will have an index of 4). If the player cannot afford
to purchase a new Hacknet Node then the function will return false.
purchaseServer
^^^^^^^^^^^^^^
.. js:function:: purchaseServer(hostname, ram)
:param string hostname: Hostname of the purchased server
:param number ram: Amount of RAM of the purchased server. Must be a power of 2 (2, 4, 8, 16, etc.)
Purchased a server with the specified hostname and amount of RAM.
The *hostname* argument can be any data type, but it will be converted to a string and have whitespace removed. Anything that resolves to an empty string will
cause the function to fail. If there is already a server with the specified hostname, then the function will automatically append
a number at the end of the *hostname* argument value until it finds a unique hostname. For example, if the script calls
*purchaseServer("foo", 4)* but a server named "foo" already exists, the it will automatically change the hostname to "foo-0". If there is already
a server with the hostname "foo-0", then it will change the hostname to "foo-1", and so on.
Note that there is a maximum limit to the amount of servers you can purchase.
Returns the hostname of the newly purchased server as a string. If the function fails to purchase a server, then it will return an
empty string. The function will fail if the arguments passed in are invalid, if the player does not have enough money to purchase
the specified server, or if the player has exceeded the maximum amount of servers.
Example::
ram = 64;
hn = "pserv-";
for (i = 0; i < 5; ++i) {
purchaseServer(hn + i, ram);
}
deleteServer
^^^^^^^^^^^^
.. js:function:: deleteServer(hostname)
:param string hostname: Hostname of the server to delete
Deletes one of your purchased servers, which is specified by its hostname.
The *hostname* argument can be any data type, but it will be converted to a string. Whitespace is automatically removed from
the string. This function will not delete a server that still has scripts running on it.
Returns true if successful, and false otherwise.
getPurchasedServers
^^^^^^^^^^^^^^^^^^^
.. js:function:: getPurchasedServers([hostname=true])
:param boolean hostname:
Specifies whether hostnames or IP addresses should be returned. If it's true then hostnames will be returned, and if false
then IPs will be returned. If this argument is omitted then it is true by default
Returns an array with either the hostnames or IPs of all of the servers you have purchased.
round
^^^^^
.. js:function:: round(n)
:param number n: Number to round
Returns the argument *n* rounded to the nearest integer. If the argument passed in is not a number, then the function will return 0.
write
^^^^^
.. js:function:: write(port/fn, data="", mode="a")
:param string/number port/fn: Port or text file that will be written to
:param string data: Data to write
:param string mode: Defines the write mode. Only valid when writing to text files.
This function can be used to either write data to a port or to a text file (.txt).
If the first argument is a number between 1 and 10, then it specifies a port and this function will write *data* to that port. Read
about how `Netscript Ports work here <http://bitburner.wikia.com/wiki/Netscript_Ports>`_. The third argument, *mode*, is not used
when writing to a port.
If the first argument is a string, then it specifies the name of a text file (.txt) and this function will write *data* to that text file. If the
specified text file does not exist, then it will be created. The third argument *mode, defines how the data will be written to the text file. If *mode*
is set to "w", then the data is written in "write" mode which means that it will overwrite all existing data on the text file. If *mode* is set to
any other value then the data will be written in "append" mode which means that the data will be added at the end of the text file.
read
^^^^
.. js:function:: read(port/fn)
:param string/number port/fn: Port or text file to read from
This function is used to read data from a port or from a text file (.txt).
If the argument *port/fn* is a number between 1 and 10, then it specifies a port and it will read data from that port. Read
about how `Netscript Ports work here <http://bitburner.wikia.com/wiki/Netscript_Ports>`_. A port is a serialized queue. This function
will remove the first element from that queue and return it. If the queue is empty, then the string "NULL PORT DATA" will be returned.
If the argument *port/fn* is a string, then it specifies the name of a text file (.txt) and this function will return the data in the specified text file. If
the text file does not exist, an empty string will be returned.
clear
^^^^^
.. js:function:: clear(port/fn)
:param string/number port/fn: Port or text file to clear
This function is used to clear data in a `Netscript Ports <http://bitburner.wikia.com/wiki/Netscript_Ports>`_ or a text file.
If the *port/fn* argument is a number between 1 and 10, then it specifies a port and will clear it (deleting all data from the underlying queue).
If the *port/fn* argument is a string, then it specifies the name of a text file (.txt) and will delete all data from that text file.
scriptRunning
^^^^^^^^^^^^^
.. js:function:: scriptRunning(scriptname, hostname/ip)
:param string scriptname: Filename of script to check. This is case-sensitive.
:param string hostname/ip: Hostname or IP of target server
Returns a boolean indicating whether any instance of the specified script is running on the target server, regardless of
its arguments.
This is different than the *isRunning()* function because it does not try to identify a specific instance of a running script
by its arguments.
**Examples:**
The example below will return true if there is any script named *foo.script* running on the *foodnstuff* server, and false otherwise::
scriptRunning("foo.script", "foodnstuff");
The example below will return true if there is any script named "foo.script" running on the current server, and false otherwise::
scriptRunning("foo.script", getHostname());
scriptKill
^^^^^^^^^^
.. js:function:: scriptKill(scriptname, hostname/ip)
:param string scriptname: Filename of script to kill. This is case-sensitive.
:param string hostname/ip: Hostname or IP of target server
Kills all scripts with the specified filename on the target server specified by *hostname/ip*, regardless of arguments. Returns
true if one or more scripts were successfully killed, and false if none were.
getScriptRam
^^^^^^^^^^^^
.. js:function:: getScriptRam(scriptname, hostname/ip)
:param string scriptname: Filename of script. This is case-sensitive.
:param string hostname/ip: Hostname or IP of target server
Returns the amount of RAM required to run the specified script on the target server
getHackTime
^^^^^^^^^^^
.. js:function:: getHackTime(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the amount of time in seconds it takes to execute the *hack()* Netscript function on the target server.
getGrowTime
^^^^^^^^^^^
.. js:function:: getGrowTime(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the amount of time in seconds it takes to execute the *grow()* Netscript function on the target server.
getWeakenTime
^^^^^^^^^^^^^
.. js:function:: getWeakenTime(hostname/ip)
:param string hostname/ip: Hostname or IP of target server
Returns the amount of time in seconds it takes to execute the *weaken()* Netscript function on the target server.
getScriptIncome
^^^^^^^^^^^^^^^
.. js:function:: getScriptIncome([scriptname], [hostname/ip], [args...])
:param string scriptname: Filename of script
:param string hostname/ip: Server on which script is running
:param args...: Arguments that the script is running with
Returns the amount of income the specified script generates while online (when the game is open, does not apply for offline income).
Remember that a script is uniquely identified by both its name and its arguments. So for example if you ran a script with the arguments
"foodnstuff" and "5" then in order to use this function to get that script's income you must specify those same arguments in the same order
in this function call.
This function can also be called with no arguments. If called with no arguments, then this function will return an array of two values. The
first value is the total income ($ / second) of all of your active scripts (scripts that are currently running on any server). The second value
is the total income ($ / second) that you've earned from scripts since you last installed Augmentations.
getScriptExpGain
^^^^^^^^^^^^^^^^
.. js:function:: getScriptExpGain([scriptname], [hostname/ip], [args...])
:param string scriptname: Filename of script
:param string hostname/ip: Server on which script is running
:param args...: Arguments that the script is running with
Returns the amount of hacking experience the specified script generates while online (when the game is open, does not apply for offline experience gains).
Remember that a script is uniquely identified by both its name and its arguments.
This function can also return the total experience gain rate of all of your active scripts by running the function with no arguments.
getTimeSinceLastAug
^^^^^^^^^^^^^^^^^^^
.. js:function:: getTimeSinceLastAug()
Returns the amount of time in milliseconds that have passed since you last installed Augmentations
sprintf
^^^^^^^
.. js:function:: sprintf()
See `this link <https://github.com/alexei/sprintf.js>`_ for details.
vsprintf
^^^^^^^^
.. js:function:: vsprintf()
See `this link <https://github.com/alexei/sprintf.js>`_ for details.
prompt
^^^^^^
.. js:function:: prompt(txt)
:param string txt: Text to appear in the prompt dialog box
Prompts the player with a dialog box with two options: "Yes" and "No". This function will return true if the player click "Yes" and
false if the player clicks "No". The script's execution is halted until the player selects one of the options.
Defining your own Functions
---------------------------
You can define your own functions in Netscript using the following syntax::
function name(args...) {
function code here...
return some_value
}
Functions should have some return value. Here is an example of defining and using a function::
function sum(values) {
res = 0;
for (i = 0; i < values.length; ++i) {
res += values[i];
}
return res;
}
print(sum([1, 2, 3, 4, 5]));
print(sum([1, 10]));
The example above prints the following in its log::
15
11
**Note about variable scope in functions:**
Functions can access "global" variables declared outside of the function's scope. However, they cannot change the value of any "global" variables.
Any changes to "global" variables will only be applied locally to the function. This also means that any variable that is first defined inside a
function will NOT be accessible outside of the function.
For example, the following code::
function sum(values) {
res = 0;
for (i = 0; i < values.length; ++i) {
res += values[i];
}
return res;
}
print(res);
results in the following runtime error::
Script runtime error:
Server Ip: 75.7.4.1
Script name: test.script
Args:[]
variable res not defined
The following example shows that any change to "global" variable inside a function only applies in the function's local scope::
function foo() {
i = 5;
return "foo";
}
i = 0;
print(i);
foo();
print(i);
Results in the following log::
0
0
**Other Notes about creating your own functions:**
Defining a function does not create a Javascript function object in the underlying game code. This means that you cannot use any function
you create in functions such as `Array.sort() <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort>`_ (not yet at least, I'll try to make it work in the future).

@ -0,0 +1,127 @@
Netscript Hacknet Node API
==========================
Netscript provides the following API for accessing and upgrading your Hacknet Nodes
through scripts.
Note that none of these functions will write to the script's logs. If you want
to see what your script is doing you will have to print to the logs yourself.
hacknetnodes
^^^^^^^^^^^^
*hacknetnodes* is a special variable. It is an array that maps to the player's
Hacknet Nodes. The Hacknet Nodes are accessed through indexed. These indexes
correspond to the number at the end of the name of the Hacknet Node. For example,
the first Hacknet Node you purchase will have the name "hacknet-node-0" and can be
accessed using *hacknetnodes[0]*. The fourth Hacknet Node you purchase will have the name
"hacknet-node-3" and can be accessed using *hacknetnodes[3]*.
Hacknet Node Member Variables
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The following is a list of member variables for a Hacknet Node object. These variables are read-only, which means you cannot assign
a value to these.
Note that these must be called on an element inside the *hacknetnodes* array, not the array itself.
.. js:function:: hacknetnodes[i].level
Returns the level of the corresponding Hacknet Node
.. js:function:: hacknetnodes[i].ram
Returns the amount of RAM on the corresponding Hacknet Node
.. js:function:: hacknetnodes[i].cores
Returns the number of cores on the corresponding Hacknet Node
.. js:function:: hacknetnodes[i].totalMoneyGenerated
Returns the total amount of money that the corresponding Hacknet Node has earned
.. js:function:: hacknetnodes[i].onlineTimeSeconds
Returns the total amount of time (in seconds) that the corresponding Hacknet Node has existed
.. js:function:: hacknetnodes[i].moneyGainRatePerSecond
Returns the amount of income that the corresponding Hacknet Node earns
Hacknet Node Methods
^^^^^^^^^^^^^^^^^^^^
The following is a list of supported functions/methods for a Hacknet Node object.
Note that these must be called on an element inside the *hacknetnodes* array, not the
array itself.
.. js:function:: hacknetnodes[i].upgradeLevel(n);
:param number n: Number of levels to upgrade. Must be positive. Rounded to nearest integer
Tries to upgrade the level of the corresponding Hacknet Node *n* times. Returns true if the
Hacknet Node's level is successfully upgraded *n* times or up to the max level (200), and false
otherwise.
.. js:function:: hacknetnodes[i].upgradeRam()
Tries to upgrade the amount of RAM on the corresponding Hacknet Node. Returns true if the RAM is
successfully upgraded and false otherwise.
.. js:function:: hacknetnodes[i].upgradeCore()
Tries to purchase an additional core for the corresponding Hacknet Node. Returns true if the
additional core is successfully purchased, and false otherwise.
.. js:function:: hacknetnodes[i].getLevelUpgradeCost(n);
:param number n: Number of levels to upgrade. Must be positive. Rounded to nearest integer
Returns the cost of upgrading the specified Hacknet Node by *n* levels
.. js:function:: hacknetnodes[i].getRamUpgradeCost()
Returns the cost of upgrading the RAM of the specified Hacknet Node. Upgrading a Node's RAM doubles it.
.. js:function:: hacknetnodes[i].getCoreUpgradeCost()
Returns the cost of upgrading the number of cores of the specified Hacknet Node. Upgrading a Node's
number of cores adds one additional core.
Example(s)
^^^^^^^^^^
The following is an example of one way a script can be used to automate the purchasing and upgrading of Hacknet Nodes.
This script purchases new Hacknet Nodes until the player has four. Then, it iteratively upgrades each of those four Hacknet
Nodes to a level of at least 75, RAM to at least 8GB, and number of cores to at least 2::
//Purchase 4 Hacknet Nodes
while(hacknetnodes.length < 4) {
purchaseHacknetNode();
}
//Upgrade all 4 Hacknet Nodes to at least level 75
for (i = 0; i < 4; i = i++) {
while (hacknetnodes[i].level <= 75) {
hacknetnodes[i].upgradeLevel(5);
sleep(10000);
}
}
//Upgrade RAM on all Hacknet Nodes to 8GB
for (i = 0; i < 4; i = i++) {
while (hacknetnodes[i].ram < 8) {
hacknetnodes[i].upgradeRam();
sleep(10000);
}
}
//Upgrade cores on all Hacknet Nodes to 2
for (i = 0; i < 4; i = i++) {
while (hacknetnodes[i].cores < 2) {
hacknetnodes[i].upgradeCore();
sleep(10000);
}
}

@ -0,0 +1,174 @@
Netscript Trade Information eXchange (TIX) API
==============================================
The Trade Information eXchange (TIX) is the communications protocol supported by the World Stock Exchange (WSE).
The WESE provides an API that allows you to automatically communicate with the
`Stock Market <http://bitburner.wikia.com/wiki/Stock_Market>`_. This API lets you write code using Netscript
to build automated trading systems and create your own algorithmic trading strategies. Access to this
TIX API can be purchased by visiting the World Stock Exchange in-game.
Access to the TIX API currently costs $5 billion. After you purchase it, you will retain this
access even after you 'reset' by installing Augmentations
getStockPrice
-------------
.. js:function:: getStockPrice(sym)
:param string sym: Stock symbol
Returns the price of a stock, given its symbol (NOT the company name). The symbol is a sequence
of two to four capital letters.
Example::
getStockPrice("FISG");
getStockPosition
----------------
.. js:function:: getStockPosition(sym)
:param string sym: Stock symbol
Returns an array of four elements that represents the player's position in a stock.
The first element is the returned array is the number of shares the player owns of the stock in the
`Long position <http://bitburner.wikia.com/wiki/Stock_Market#Positions:_Long_vs_Short>`_. The second
element in the array is the average price of the player's shares in the Long position.
The third element in the array is the number of shares the player owns of the stock in the
`Short position <http://bitburner.wikia.com/wiki/Stock_Market#Positions:_Long_vs_Short>`_. The fourth
element in the array is the average price of the player's Short position.
All elements in the returned array are numeric.
Example::
pos = getStockPosition("ECP");
shares = pos[0];
avgPx = pos[1];
sharesShort = pos[2];
avgPxShort = pos[3];
buyStock
--------
.. js:function:: buyStock(sym, shares)
:param string sym: Symbol of stock to purchase
:param number shares: Number of shares to purchased. Must be positive. Will be rounded to nearest integer
Attempts to purchase shares of a stock using a `Market Order <http://bitburner.wikia.com/wiki/Stock_Market#Order_Types>`_.
If the player does not have enough money to purchase the specified number of shares, then no shares will be purchased. Remember
that every transaction on the stock exchange costs a certain commission fee.
If this function successfully purchases the shares, it will return the stock price at which each share was purchased. Otherwise,
it will return 0.
sellStock
---------
.. js:function:: sellStock(sym, shares)
:param string sym: Symbol of stock to sell
:param number shares: Number of shares to sell. Must be positive. Will be rounded to nearest integer
Attempts to sell shares of a stock using a `Market Order <http://bitburner.wikia.com/wiki/Stock_Market#Order_Types>`_.
If the specified number of shares in the function exceeds the amount that the player actually owns, then this function will
sell all owned shares. Remember that every transaction on the stock exchange costs a certain commission fee.
The net profit made from selling stocks with this function is reflected in the script's statistics.
This net profit is calculated as::
shares * (sell price - average price of purchased shares)
If the sale is successful, this function will return the stock price at which each share was sold. Otherwise, it will return 0.
shortStock
----------
.. js:function:: shortStock(sym, shares)
:param string sym: Symbol of stock to short
:param number shares: Number of shares to short. Must be positive. Will be rounded to nearest integer
Attempts to purchase a `short <http://bitburner.wikia.com/wiki/Stock_Market#Positions:_Long_vs_Short>`_ position of a stock
using a `Market Order <http://bitburner.wikia.com/wiki/Stock_Market#Order_Types>`_.
The ability to short a stock is **not** immediately available to the player and must be unlocked later on in the game.
If the player does not have enough money to purchase the specified number of shares, then no shares will be purchased.
Remember that every transaction on the stock exchange costs a certain commission fee.
If the purchase is successful, this function will return the stock price at which each share was purchased. Otherwise, it will return 0.
sellShort
---------
.. js:function:: sellShort(sym, shares)
:param string sym: Symbol of stock to sell
:param number shares: Number of shares to sell. Must be positive. Will be rounded to nearest integer
Attempts to sell a `short <http://bitburner.wikia.com/wiki/Stock_Market#Positions:_Long_vs_Short>`_ position of a stock
using a `Market Order <http://bitburner.wikia.com/wiki/Stock_Market#Order_Types>`_.
The ability to short a stock is **not** immediately available to the player and must be unlocked later on in the game.
If the specified number of shares exceeds the amount that the player actually owns, then this function will sell all owned
shares. Remember that every transaction on the stock exchange costs a certain commission fee.
If the sale is successful, this function will return the stock price at which each share was sold. Otherwise it will return 0.
placeOrder
----------
.. js:function:: placeOrder(sym, shares, price, type, pos)
:param string sym: Symbol of stock to player order for
:param number shares: Number of shares for order. Must be positive. Will be rounded to nearest integer
:param number price: Execution price for the order
:param string type: Type of order. It must specify "limit" or "stop", and must also specify "buy" or "sell". This is NOT
case-sensitive. Here are four examples that will work:
* limitbuy
* limitsell
* stopbuy
* stopsell
:param string pos:
Specifies whether the order is a "Long" or "Short" position. The Values "L" or "S" can also be used. This is
NOT case-sensitive.
Places an order on the stock market. This function only works for `Limit and Stop Orders <http://bitburner.wikia.com/wiki/Stock_Market#Order_Types>`_.
The ability to place limit and stop orders is **not** immediately available to the player and must be unlocked later on in the game.
Returns true if the order is successfully placed, and false otherwise.
cancelOrder
-----------
.. js:function:: cancelOrder(sym, shares, price, type, pos)
:param string sym: Symbol of stock to player order for
:param number shares: Number of shares for order. Must be positive. Will be rounded to nearest integer
:param number price: Execution price for the order
:param string type: Type of order. It must specify "limit" or "stop", and must also specify "buy" or "sell". This is NOT
case-sensitive. Here are four examples that will work:
* limitbuy
* limitsell
* stopbuy
* stopsell
:param string pos:
Specifies whether the order is a "Long" or "Short" position. The Values "L" or "S" can also be used. This is
NOT case-sensitive.
Cancels an oustanding Limit or Stop order on the stock market.
The ability to use limit and stop orders is **not** immediately available to the player and must be unlocked later on in the game.

@ -0,0 +1,42 @@
Netscript Loops and Conditionals
================================
Loops and Conditionals
----------------------
Netscript loops and conditionals are the same as Javascript. However, the one caveat is that when declaring variables such as the
iterator for traversing a loop, you should not use the 'var' or 'let' keyword. For reference, you can see the Javascript
documentation for loops/conditionals here:
`While loops <https://www.w3schools.com/js/js_loop_while.asp>`_
`For loops <https://www.w3schools.com/js/js_loop_for.asp>`_
`Conditionals (If/Else statements) <https://www.w3schools.com/js/js_if_else.asp>`_
Here are some simple code examples that show the use of loops and conditionals in Netscript.
The following is a while loop that runs the hack() Netscript function ten times::
i = 0;
while (i < 10) {
hack('foodnstuff');
i = i + 1;
}
The following is a for loop that runs the hack() Netscript function ten times::
for (i = 0; i < 10; ++i) {
hack("foodnstuff");
}
The following is a conditional that uses the getServerMoneyAvailable() Netscript function to check how much money
exists on the 'foodnstuff' server. If there is more than $200,000 on the server, then the server will be hacked.
Otherwise, the money available on the server will be grown using the grow() Netscript function::
if (getServerMoneyAvailable('foodnstuff') > 200000) {
hack("foodnstuff");
} else {
grow("foodnstuff");
}

@ -0,0 +1,53 @@
Netscript Operators
===================
Operators
---------
Binary Operators
^^^^^^^^^^^^^^^^
Binary operators require two operands and produce a result based on their values. In general, binary
operators do not change the value of the operands.
=========== =========================== ==============================================================
Operator Name Example/Comments
=========== =========================== ==============================================================
= Assignment i = 5 would assign the value 5 to the variable i
\+ Addition 5 + 12 would return 17
\- Subtraction 20 - 8 would return 12
\* Multiplication 4 * 5 would return 20
\/ Division 50 / 10 would return 5
% Modulo 50 % 9 would return 5
&& Logical AND true && false would return false
|| Logical OR true || false would return true
< Less than 4 < 5 would return true
> Greater than 4 > 5 would return false
<= Less than or equal to 5 <= 5 would return true
>= Greater than or equal to 5 >= 4 would return true
== Equality 1 == 1 would return true
!= Inequality 4 != 5 would return true
=== Strict equality 1 === "1" would return false
!== Strict inequality 1 !== "1" would return true
=========== =========================== ==============================================================
Unary Operators
^^^^^^^^^^^^^^^
Unary operators require only a single operand and produce a result based on their values. Some unary operators will
change the value of their operands. For example::
i = 0;
++i;
Running the pre-increment unary operator (++) in the code above changes the value of the variable i.
=============== =========================== ==============================================================================================
Operator Name Example/comments
=============== =========================== ==============================================================================================
! Logical NOT operator !true would return false, and !false would return true. Does not change operand's value
\- Negation Negates a number. Only works for numerics. Does not change operand's value
++ Pre-increment ++i or i++. WARNING: This only pre-increments, even if you put i++. Changes operand's value
-- Pre-decrement --i or i--. WARNING: This only pre-decrements, even if you put i--. Changes operand's value
=============== =========================== ==============================================================================================

@ -0,0 +1,17 @@
Netscript Script Arguments
==========================
Arguments passed into a script can be accessed in Netscript using a special array called *args*. The arguments can be
accessed using a normal array using the [] operator (args[0], args[1], etc...).
For example, let's say we want to make a generic script 'generic-run.script' and we plan to pass two arguments into that script.
The first argument will be the name of another script, and the second argument will be a number. This generic script will run the
script specified in the first argument with the amount of threads specified in the second element. The code would look like::
run(args[0], args[1]);
It is also possible to get the number of arguments that was passed into a script using::
args.length
WARNING: Do not try to modify the args array. This will break the game. I will do my best to prevent players from doing this.

@ -0,0 +1,465 @@
Netscript Singularity Functions
===============================
The Singularity Functions are a special set of Netscript functions. These functions allow you to control
many additional aspects of the game through scripts, such as working for factions/companies, purchasing/installing Augmentations,
and creating programs.
The Singularity Functions are **not** immediately available to the player and must be unlocked later in the game.
**WARNING: This page contains spoilers for the game**.
The Singularity Functions are unlocked in BitNode-4. If you are in BitNode-4, then you will automatically have access to all of these functions.
You can use the Singularity Functions in other BitNodes if and only if you have the Source-File for BitNode-4 (aka Source-File 4). Each level of
Source-File 4 will open up additional Singularity Functions that you can use in other BitNodes. If your Source-File 4 is upgraded all the way to
level 3, then you will be able to access all of the Singularity Functions.
Note that Singularity Functions require a lot of RAM outside of BitNode-4 (their RAM costs are multiplied by 10 if you are not in BitNode-4)
universityCourse
----------------
.. js:function:: universityCourse(universityName, courseName)
:param string universityName:
Name of university. Not case-sensitive. You must be in the correct city for whatever university you specify.
* Summit University
* Rothman University
* ZB Institute Of Technology
:param string courseName:
Name of course. Not case-sensitive.
* Study Computer Science
* Data Strucures
* Networks
* Algorithms
* Management
* Leadership
If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function.
This function will automatically set you to start taking a course at a university. If you are already in the middle of some
"working" action (such as working at a company, for a faction, or on a program), then running this function will automatically
cancel that action and give you your earnings.
The cost and experience gains for all of these universities and classes are the same as if you were to manually visit and take these classes.
This function will return true if you successfully start taking the course, and false otherwise.
gymWorkout
----------
.. js:function:: gymWorkout(gymName, stat)
:param string gymName:
Name of gym. Not case-sensitive. You must be in the correct city for whatever gym you specify.
* Crush Fitness Gym
* Snap Fitness Gym
* Iron Gym
* Powerhouse Gym
* Millenium Fitness Gym
:param string stat:
The stat you want to train. Not case-sensitive.
* strength OR str
* defense OR def
* dexterity OR dex
* agility OR agi
If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function.
This function will automatically set you to start working out at a gym to train a particular stat. If you are
already in the middle of some "working" action (such as working at a company, for a faction, or on a program),
then running this function will automatically cancel that action and give you your earnings.
The cost and experience gains for all of these gyms are the same as if you were to manually visit these gyms and train
This function will return true if you successfully start working out at the gym, and false otherwise.
travelToCity
------------
.. js:function:: travelToCity(cityName)
:param string cityName:
City to travel to. CASE-SENSITIVE.
* Aevum
* Chongqing
* Sector-12
* New Tokyo
* Ishima
* Volhaven
If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function.
This function allows the player to travel to any city. The cost for using this function is the same as the cost for traveling through the Travel Agency.
This function will return true if you successfully travel to the specified city and false otherwise.
purchaseTor
-----------
.. js:function:: purchaseTor()
If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function.
This function allows you to automatically purchase a TOR router. The cost for purchasing a TOR router using this
function is the same as if you were to manually purchase one.
This function will return true if it successfully purchase a TOR router and false otherwise.
purchaseProgram
---------------
.. js:function:: purchaseProgram(programName)
:param string programName: Name of program to purchase. Must include '.exe' extension. Not case-sensitive.
If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to use this function.
This function allows you to automatically purchase programs. You MUST have a TOR router in order to use this function.
The cost of purchasing programs using this function is the same as if you were purchasing them through the Dark Web using the
Terminal *buy* command.
Example::
purchaseProgram("brutessh.exe");
This function will return true if the specified program is purchased, and false otherwise.
getStats
--------
.. js:function:: getStats()
If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to run this function.
Returns an object with the Player's stats. The object has the following properties::
Player.hacking
Player.strength
Player.defense
Player.dexterity
Player.agility
Player.charisma
Player.intelligence
Example::
res = getStats();
print('My charisma level is: ' + res.charisma);
isBusy
------
.. js:function:: isBusy()
If you are not in BitNode-4, then you must have Level 1 of Source-File 4 in order to run this function.
Returns a boolean indicating whether or not the player is currently performing an 'action'. These actions include
working for a company/faction, studying at a univeristy, working out at a gym, creating a program, or committing a crime.
upgradeHomeRam
--------------
.. js:function:: upgradeHomeRam()
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
This function will upgrade amount of RAM on the player's home computer. The cost is the same as if you were to do it manually.
This function will return true if the player's home computer RAM is successfully upgraded, and false otherwise.
getUpgradeHomeRamCost
---------------------
.. js:function:: getUpgradeHomeRamCost()
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
Returns the cost of upgrading the player's home computer RAM.
workForCompany
--------------
.. js:function:: workForCompany()
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
This function will automatically set you to start working at the company at which you are employed.
If you are already in the middle of some "working" action (such as working for a faction, training at
a gym, or creating a program), then running this function will automatically cancel that action and give you your earnings.
This function will return true if the player starts working, and false otherwise.
Note that when you are working for a company, you will not actually receive your earnings
(reputation, money, experience) until you FINISH the action. This can be an issue if, for example,
you only want to work until you get 100,000 company reputation. One small hack to get around this is to
continuously restart the action to receive your earnings::
while (getCompanyRep(COMPANY HERE) < VALUE) {
workForCompany();
sleep(60000);
}
This way, your company reputation will be updated every minute.
applyToCompany
--------------
.. js:function:: applyToCompany(companyName, field)
:param string companyName: Name of company to apply to. CASE-SENSITIVE.
:param string field:
Field to which you want to apply. Not case-sensitive
* software
* software consultant
* it
* security engineer
* network engineer
* business
* business consultant
* security
* agent
* employee
* part-time employee
* waiter
* part-time waiter
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
This function will automatically try to apply to the specified company for a position in the specified
field. This function can also be used to apply for promotions by specifying the company and field you
are already employed at.
This function will return true if you successfully get a job/promotion, and false otherwise. Note that
if you are trying to use this function to apply for a promotion and you don't get one, it will return false.
getCompanyRep
-------------
.. js:function:: getCompanyRep(companyName)
:param string companyName: Name of the company. CASE-SENSITIVE
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
This function will return the amount of reputation you have at the specified company.
If the company passed in as an argument is invalid, -1 will be returned.
checkFactionInvitations
-----------------------
.. js:function:: checkFactionInvitations()
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
Returns an array with the name of all Factions you currently have oustanding invitations from.
joinFaction
-----------
.. js:function:: joinFaction(name)
:param string name: Name of faction to join. CASE-SENSITIVE
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
This function will automatically accept an invitation from a faction and join it.
workForFaction
--------------
.. js:function:: workForFaction(factionName, workType)
:param string factionName: Name of faction to work for. CASE-SENSITIVE
:param string workType:
Type of work to perform for the faction
* hacking/hacking contracts/hackingcontracts
* field/fieldwork/field work
* security/securitywork/security work
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
This function will automatically set you to start working for the specified faction.
Obviously, you must be a member of the faction or else this function will fail. If you are already in
the middle of some "working" action (such as working for a company, training at a gym, or creating a program),
then running this function will automatically cancel that action and give you your earnings.
This function will return true if you successfully start working for the specified faction, and false otherwise.
Note that when you are working for a faction, you will not actually receive your earnings (reputation, experience)
until you FINISH the action. This can be an issue if, for example, you only want to work until you get 100,000 faction
reputation. One small hack to get around this is to continuously restart the action to receive your earnings::
while (getFactionRep(FACTION NAME) < VALUE) {
workForFaction(FACNAME, WORKTYPE);
sleep(60000);
}
This way, your faction reputation will be updated every minute.
getFactionRep
-------------
.. js:function:: getFactionRep(factionName)
:param string factionName: Name of faction. CASE-SENSITIVE
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
This function returns the amount of reputation you have for the specified faction.
createProgram
-------------
.. js:function:: createProgram(programName)
:param string programName: Name of program to create. Not case-sensitive
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
This function will automatically set you to start working on creating the specified program. If you are
already in the middle of some "working" action (such as working for a company, training at a gym, or taking a course),
then running this function will automatically cancel that action and give you your earnings.
Example:
createProgram("relaysmtp.exe");
Note that creating a program using this function has the same hacking level requirements as it normally would. These level requirements are:
* BruteSSH.exe: 50
* FTPCrack.exe: 100
* relaySMTP.exe: 250
* HTTPWorm.exe: 500
* SQLInject.exe: 750
* DeepscanV1.exe: 75
* DeepscanV2.exe: 400
* ServerProfiler.exe: 75
* AutoLink.exe: 25
This function returns true if you successfully start working on the specified program, and false otherwise.
commitCrime
-----------
.. js:function::commitCrime(crime)
:param string crime:
Name of crime to attempt. Not case-sensitive. This argument is fairly lenient in terms of what inputs it accepts.
Here is a list of valid inputs for all of the crimes:
* shoplift
* rob store
* mug
* larceny
* deal drugs
* bond forgery
* traffick arms
* homicide
* grand theft auto
* kidnap
* assassinate
* heist
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
This function is used to automatically attempt to commit crimes. If you are already in the middle of some 'working' action
(such as working for a company or training at a gym), then running this function will automatically cancel that action and give you your earnings.
Note that crimes committed using this function will have all of their earnings halved (this applied for both money and experience!)
This function returns the number of seconds it takes to attempt the specified crime (e.g It takes 60 seconds to attempt the 'Rob Store' crime,
so running *commitCrime('rob store')* will return 60).
Warning: I do not recommend using the time returned from this function to try and schedule your crime attempts.
Instead, I would use the isBusy() Singularity function to check whether you have finished attempting a crime.
This is because although the game sets a certain crime to be X amount of seconds, there is no guarantee that your
browser will follow that time limit.
getCrimeChance
--------------
.. js:function:: getCrimeChance(crime)
:param string crime:
Name of crime. Not case-sensitive. This argument is fairlyn lenient in terms of what inputs it accepts.
Check the documentation for the *commitCrime()* function for a list of example inputs.
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
This function returns your chance of success at commiting the specified crime. The chance is returned as a decimal (i.e. 60% would be returned as 0.6).
getOwnedAugmentations
---------------------
.. js:function:: getOwnedAugmentations(purchased=false)
:param boolean purchase:
Specifies whether the returned array should include Augmentations you have purchased but not yet installed.
By default, this argument is false which means that the return value will NOT have the purchased Augmentations.
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
This function returns an array containing the names (as strings) of all Augmentations you have.
getAugmentationsFromFaction
---------------------------
.. js:function:: getAugmentationsFromFaction(facName)
:param string facName: Name of faction. CASE-SENSITIVE
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
Returns an array containing the names (as strings) of all Augmentations that are available from the specified faction.
getAugmentationCost
-------------------
.. js:function:: getAugmentationCost(augName)
:param string augName: Name of Augmentation. CASE-SENSITIVE
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
This function returns an array with two elements that gives the cost for the specified Augmentation.
The first element in the returned array is the reputation requirement of the Augmentation, and the second element is the money cost.
If an invalid Augmentation name is passed in for the *augName* argument, this function will return the array [-1, -1].
purchaseAugmentation
--------------------
.. js:function:: purchaseAugmentation(factionName, augName)
:param string factionName: Name of faction to purchase Augmentation from. CASE-SENSITIVE
:param string augName: Name of Augmentation to purchase. CASE-SENSITIVE
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
This function will try to purchase the specified Augmentation through the given Faction.
This function will return true if the Augmentation is successfully purchased, and false otherwise.
installAugmentations
--------------------
.. js:function:: installAugmentations(cbScript)
:param string cbScript:
Optional callback script. This is a script that will automatically be run after Augmentations are installed (after the reset).
This script will be run with no arguments and 1 thread. It must be located on your home computer.
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
This function will automatically install your Augmentations, resetting the game as usual.
It will return true if successful, and false otherwise.

@ -0,0 +1,541 @@
/*
* agogo.css_t
* ~~~~~~~~~~~
*
* Sphinx stylesheet -- agogo theme.
*
* :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
* {
margin: 0px;
padding: 0px;
}
body {
font-family: "Verdana", Arial, sans-serif;
line-height: 1.4em;
color: black;
background-color: #eeeeec;
}
/* Page layout */
div.header, div.content, div.footer {
width: 70em;
margin-left: auto;
margin-right: auto;
}
div.header-wrapper {
background: #555573 url(bgtop.png) top left repeat-x;
border-bottom: 3px solid #2e3436;
}
/* Default body styles */
a {
color: #ce5c00;
}
div.bodywrapper a, div.footer a {
text-decoration: underline;
}
.clearer {
clear: both;
}
.left {
float: left;
}
.right {
float: right;
}
.line-block {
display: block;
margin-top: 1em;
margin-bottom: 1em;
}
.line-block .line-block {
margin-top: 0;
margin-bottom: 0;
margin-left: 1.5em;
}
h1, h2, h3, h4 {
font-family: "Georgia", "Times New Roman", serif;
font-weight: normal;
color: #3465a4;
margin-bottom: .8em;
}
h1 {
color: #204a87;
}
h2 {
padding-bottom: .5em;
border-bottom: 1px solid #3465a4;
}
a.headerlink {
visibility: hidden;
color: #dddddd;
padding-left: .3em;
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink,
caption:hover > a.headerlink,
p.caption:hover > a.headerlink,
div.code-block-caption:hover > a.headerlink {
visibility: visible;
}
img {
border: 0;
}
div.admonition {
margin-top: 10px;
margin-bottom: 10px;
padding: 2px 7px 1px 7px;
border-left: 0.2em solid black;
}
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
}
dt:target, .highlighted {
background-color: #fbe54e;
}
/* Header */
div.header {
padding-top: 10px;
padding-bottom: 10px;
}
div.header .headertitle {
font-family: "Georgia", "Times New Roman", serif;
font-weight: normal;
font-size: 180%;
letter-spacing: .08em;
margin-bottom: .8em;
}
div.header .headertitle a {
color: white;
}
div.header div.rel {
margin-top: 1em;
}
div.header div.rel a {
color: #fcaf3e;
letter-spacing: .1em;
text-transform: uppercase;
}
p.logo {
float: right;
}
img.logo {
border: 0;
}
/* Content */
div.content-wrapper {
background-color: white;
padding-top: 20px;
padding-bottom: 20px;
}
div.document {
width: 50em;
float: left;
}
div.body {
padding-right: 2em;
text-align: justify;
}
div.document h1 {
line-height: 120%;
}
div.document ul {
margin: 1.5em;
list-style-type: square;
}
div.document dd {
margin-left: 1.2em;
margin-top: .4em;
margin-bottom: 1em;
}
div.document .section {
margin-top: 1.7em;
}
div.document .section:first-child {
margin-top: 0px;
}
div.document div.highlight {
padding: 3px;
background-color: #eeeeec;
border-top: 2px solid #dddddd;
border-bottom: 2px solid #dddddd;
margin-top: .8em;
margin-bottom: .8em;
}
div.document div.literal-block-wrapper {
margin-top: .8em;
margin-bottom: .8em;
}
div.document div.literal-block-wrapper div.highlight {
margin: 0;
}
div.document div.code-block-caption span.caption-number {
padding: 0.1em 0.3em;
font-style: italic;
}
div.document div.code-block-caption span.caption-text {
}
div.document h2 {
margin-top: .7em;
}
div.document p {
margin-bottom: .5em;
}
div.document li.toctree-l1 {
margin-bottom: 1em;
}
div.document .descname {
font-weight: bold;
}
div.document .sig-paren {
font-size: larger;
}
div.document .docutils.literal {
background-color: #eeeeec;
padding: 1px;
}
div.document .docutils.xref.literal {
background-color: transparent;
padding: 0px;
}
div.document blockquote {
margin: 1em;
}
div.document ol {
margin: 1.5em;
}
/* Sidebar */
div.sidebar {
width: 20em;
position:fixed;
right: 10%;
height:75%;
font-size: .9em;
overflow-y:auto;
}
/*
div.sidebar {
width: 20em;
float: right;
font-size: .9em;
}
*/
div.sidebar a, div.header a {
text-decoration: none;
}
div.sidebar a:hover, div.header a:hover {
text-decoration: underline;
}
div.sidebar h3 {
color: #2e3436;
text-transform: uppercase;
font-size: 130%;
letter-spacing: .1em;
}
div.sidebar ul {
list-style-type: none;
}
div.sidebar li.toctree-l1 a {
display: block;
padding: 1px;
border: 1px solid #dddddd;
background-color: #eeeeec;
margin-bottom: .4em;
padding-left: 3px;
color: #2e3436;
}
div.sidebar li.toctree-l2 a {
background-color: transparent;
border: none;
margin-left: 1em;
border-bottom: 1px solid #dddddd;
}
div.sidebar li.toctree-l3 a {
background-color: transparent;
border: none;
margin-left: 2em;
border-bottom: 1px solid #dddddd;
}
div.sidebar li.toctree-l2:last-child a {
border-bottom: none;
}
div.sidebar li.toctree-l1.current a {
border-right: 5px solid #fcaf3e;
}
div.sidebar li.toctree-l1.current li.toctree-l2 a {
border-right: none;
}
div.sidebar input[type="text"] {
width: 170px;
}
div.sidebar input[type="submit"] {
width: 30px;
}
/* Footer */
div.footer-wrapper {
background: url(bgfooter.png) top left repeat-x;
border-top: 4px solid #babdb6;
padding-top: 10px;
padding-bottom: 10px;
min-height: 80px;
}
div.footer, div.footer a {
color: #888a85;
}
div.footer .right {
text-align: right;
}
div.footer .left {
text-transform: uppercase;
}
/* Styles copied from basic theme */
img.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
img.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-right {
text-align: right;
}
table caption span.caption-number {
font-style: italic;
}
table caption span.caption-text {
}
div.figure p.caption span.caption-number {
font-style: italic;
}
div.figure p.caption span.caption-text {
}
/* -- search page ----------------------------------------------------------- */
ul.search {
margin: 10px 0 0 20px;
padding: 0;
}
ul.search li {
padding: 5px 0 5px 20px;
background-image: url(file.png);
background-repeat: no-repeat;
background-position: 0 7px;
}
ul.search li a {
font-weight: bold;
}
ul.search li div.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
}
ul.keywordmatches li.goodmatch a {
font-weight: bold;
}
/* -- index page ------------------------------------------------------------ */
table.contentstable {
width: 90%;
}
table.contentstable p.biglink {
line-height: 150%;
}
a.biglink {
font-size: 1.3em;
}
span.linkdescr {
font-style: italic;
padding-top: 5px;
font-size: 90%;
}
/* -- general index --------------------------------------------------------- */
table.indextable td {
text-align: left;
vertical-align: top;
}
table.indextable ul {
margin-top: 0;
margin-bottom: 0;
list-style-type: none;
}
table.indextable > tbody > tr > td > ul {
padding-left: 0em;
}
table.indextable tr.pcap {
height: 10px;
}
table.indextable tr.cap {
margin-top: 10px;
background-color: #f2f2f2;
}
img.toggler {
margin-right: 3px;
margin-top: 3px;
cursor: pointer;
}
/* -- domain module index --------------------------------------------------- */
table.modindextable td {
padding: 2px;
border-collapse: collapse;
}
/* -- viewcode extension ---------------------------------------------------- */
.viewcode-link {
float: right;
}
.viewcode-back {
float: right;
font-family:: "Verdana", Arial, sans-serif;
}
div.viewcode-block:target {
margin: -1px -3px;
padding: 0 3px;
background-color: #f4debf;
border-top: 1px solid #ac9;
border-bottom: 1px solid #ac9;
}
div.code-block-caption {
background-color: #ddd;
color: #333;
padding: 2px 5px;
font-size: small;
}
/* -- math display ---------------------------------------------------------- */
div.body div.math p {
text-align: center;
}
span.eqno {
float: right;
}

@ -129,10 +129,9 @@ function addActiveScriptsItem(workerscript) {
//Create the element itself. Each element is an accordion collapsible //Create the element itself. Each element is an accordion collapsible
var itemNameArray = ["active", "scripts", server.hostname, workerscript.name]; var itemNameArray = ["active", "scripts", server.hostname, workerscript.name];
for (var i = 0; i < workerscript.args.length; ++i) { for (var i = 0; i < workerscript.args.length; ++i) {
itemNameArray.push(workerscript.args[i].toString()); itemNameArray.push(String(workerscript.args[i]));
} }
var itemName = itemNameArray.join("-"); var itemName = itemNameArray.join("-");
//var itemName = "active-scripts-" + server.hostname + "-" + workerscript.name;
var item = document.createElement("li"); var item = document.createElement("li");
item.setAttribute("id", itemName); item.setAttribute("id", itemName);
@ -164,10 +163,9 @@ function deleteActiveScriptsItem(workerscript) {
} }
var itemNameArray = ["active", "scripts", server.hostname, workerscript.name]; var itemNameArray = ["active", "scripts", server.hostname, workerscript.name];
for (var i = 0; i < workerscript.args.length; ++i) { for (var i = 0; i < workerscript.args.length; ++i) {
itemNameArray.push(workerscript.args[i].toString()); itemNameArray.push(String(workerscript.args[i]));
} }
var itemName = itemNameArray.join("-"); var itemName = itemNameArray.join("-");
//var itemName = "active-scripts-" + server.hostname + "-" + workerscript.name;
var li = document.getElementById(itemName); var li = document.getElementById(itemName);
if (li == null) { if (li == null) {
console.log("could not find Active scripts li element for: " + workerscript.name); console.log("could not find Active scripts li element for: " + workerscript.name);
@ -200,7 +198,7 @@ function updateActiveScriptsItemContent(workerscript) {
} }
var itemNameArray = ["active", "scripts", server.hostname, workerscript.name]; var itemNameArray = ["active", "scripts", server.hostname, workerscript.name];
for (var i = 0; i < workerscript.args.length; ++i) { for (var i = 0; i < workerscript.args.length; ++i) {
itemNameArray.push(workerscript.args[i].toString()); itemNameArray.push(String(workerscript.args[i]));
} }
var itemName = itemNameArray.join("-"); var itemName = itemNameArray.join("-");
var itemContent = document.getElementById(itemName + "-content") var itemContent = document.getElementById(itemName + "-content")

@ -2976,17 +2976,21 @@ Corporation.prototype.displayCorporationOverviewContent = function() {
display:"inline-block", display:"inline-block",
clickListener:()=>{ clickListener:()=>{
var shares = Math.round(input.value); var shares = Math.round(input.value);
var tempStockPrice = this.sharePrice;
if (isNaN(shares)) { if (isNaN(shares)) {
dialogBoxCreate("ERROR: Invalid value for number of shares"); dialogBoxCreate("ERROR: Invalid value for number of shares");
} else if (shares > this.issuedShares) { } else if (shares > this.issuedShares) {
dialogBoxCreate("ERROR: There are not this many oustanding shares to buy back"); dialogBoxCreate("ERROR: There are not this many oustanding shares to buy back");
} else if (shares * tempStockPrice > Player.money) {
dialogBoxCreate("ERROR: You do not have enough money to purchase this many shares (you need " +
numeral(shares * tempStockPrice).format("$0.000a") + ")");
} else { } else {
this.numShares += shares; this.numShares += shares;
this.issuedShares -= shares; this.issuedShares -= shares;
//TODO REMOVE from Player money //TODO REMOVE from Player money
removeElementById(popupId); removeElementById(popupId);
return false;
} }
return false;
} }
}); });

@ -525,7 +525,7 @@ let CONSTANTS = {
"kill('foo.script', getHostname(), 1, 'foodnstuff');<br><br>" + "kill('foo.script', getHostname(), 1, 'foodnstuff');<br><br>" +
"<i><u>killall(hostname/ip)</u></i><br> Kills all running scripts on the specified server. This function takes a single argument which " + "<i><u>killall(hostname/ip)</u></i><br> Kills all running scripts on the specified server. This function takes a single argument which " +
"must be a string containing the hostname or IP of the target server. This function will always return true. <br><br>" + "must be a string containing the hostname or IP of the target server. This function will always return true. <br><br>" +
"<i><u>exit()</u></i><br>Terminates the script immediately<br><br>" + "<i><u>exit()</u></i><br>Terminates the script immediately<br><br>" +
"<i><u>scp(script, [source], destination)</u></i><br>Copies a script or literature (.lit) file to another server. The first argument is a string with " + "<i><u>scp(script, [source], destination)</u></i><br>Copies a script or literature (.lit) file to another server. The first argument is a string with " +
"the filename of the script or literature file " + "the filename of the script or literature file " +
"to be copied, or an array of filenames to be copied. The next two arguments are strings containing the hostname/IPs of the source and target server. " + "to be copied, or an array of filenames to be copied. The next two arguments are strings containing the hostname/IPs of the source and target server. " +
@ -1117,6 +1117,9 @@ let CONSTANTS = {
"World Stock Exchange account and TIX API Access<br>", "World Stock Exchange account and TIX API Access<br>",
LatestUpdate: LatestUpdate:
"v0.34.1<br>" +
"-Added new 'secret' Terminal command. Try: run musicplayer<br>" +
"v0.34.0<br>" + "v0.34.0<br>" +
"-Added clear() and exit() Netscript functions<br>" + "-Added clear() and exit() Netscript functions<br>" +
"-When starting out or prestiging, you will now receive a 'Hacking Starter Guide'. It provides tips/pointers for new players<br>" + "-When starting out or prestiging, you will now receive a 'Hacking Starter Guide'. It provides tips/pointers for new players<br>" +

@ -74,7 +74,8 @@ HacknetNode.prototype.updateMoneyGainRate = function() {
} }
HacknetNode.prototype.calculateLevelUpgradeCost = function(levels=1) { HacknetNode.prototype.calculateLevelUpgradeCost = function(levels=1) {
if (levels < 1) {return 0;} levels = Math.round(levels);
if (isNaN(levels) || levels < 1) {return 0;}
var mult = CONSTANTS.HacknetNodeUpgradeLevelMult; var mult = CONSTANTS.HacknetNodeUpgradeLevelMult;
var totalMultiplier = 0; //Summed var totalMultiplier = 0; //Summed
var currLevel = this.level; var currLevel = this.level;

@ -70,6 +70,12 @@ function runScriptsLoop() {
var ip = workerScripts[i].serverIp; var ip = workerScripts[i].serverIp;
var name = workerScripts[i].name; var name = workerScripts[i].name;
//Free RAM
AllServers[ip].ramUsed -= workerScripts[i].ramUsage;
//Delete script from Active Scripts
deleteActiveScriptsItem(workerScripts[i]);
for (var j = 0; j < AllServers[ip].runningScripts.length; j++) { for (var j = 0; j < AllServers[ip].runningScripts.length; j++) {
if (AllServers[ip].runningScripts[j].filename == name && if (AllServers[ip].runningScripts[j].filename == name &&
compareArrays(AllServers[ip].runningScripts[j].args, workerScripts[i].args)) { compareArrays(AllServers[ip].runningScripts[j].args, workerScripts[i].args)) {
@ -78,12 +84,6 @@ function runScriptsLoop() {
} }
} }
//Free RAM
AllServers[ip].ramUsed -= workerScripts[i].ramUsage;
//Delete script from Active Scripts
deleteActiveScriptsItem(workerScripts[i]);
//Delete script from workerScripts //Delete script from workerScripts
workerScripts.splice(i, 1); workerScripts.splice(i, 1);
} }

@ -493,7 +493,12 @@ BitburnerSaveObject.prototype.exportGame = function() {
this.AliasesSave = JSON.stringify(Aliases); this.AliasesSave = JSON.stringify(Aliases);
this.GlobalAliasesSave = JSON.stringify(GlobalAliases); this.GlobalAliasesSave = JSON.stringify(GlobalAliases);
this.MessagesSave = JSON.stringify(Messages); this.MessagesSave = JSON.stringify(Messages);
this.StockMarketSave = JSON.stringify(StockMarket);
this.SettingsSave = JSON.stringify(Settings);
this.VersionSave = JSON.stringify(CONSTANTS.Version); this.VersionSave = JSON.stringify(CONSTANTS.Version);
if (Player.bitNodeN == 2 && Player.inGang()) {
this.AllGangsSave = JSON.stringify(AllGangs);
}
var saveString = btoa(unescape(encodeURIComponent(JSON.stringify(this)))); var saveString = btoa(unescape(encodeURIComponent(JSON.stringify(this))));
var filename = "bitburnerSave.json"; var filename = "bitburnerSave.json";

@ -1055,6 +1055,13 @@ let Terminal = {
post("Incorrect number of arguments. Usage: run [program/script] [-t] [num threads] [arg1] [arg2]..."); post("Incorrect number of arguments. Usage: run [program/script] [-t] [num threads] [arg1] [arg2]...");
} else { } else {
var executableName = commandArray[1]; var executableName = commandArray[1];
//Music player!
if (executableName === "musicplayer") {
post('<iframe src="https://open.spotify.com/embed/user/danielyxie/playlist/1ORnnL6YNvXOracUaUV2kh" width="300" height="380" frameborder="0" allowtransparency="true"></iframe>', false);
return;
}
//Check if its a script or just a program/executable //Check if its a script or just a program/executable
if (executableName.indexOf(".script") == -1) { if (executableName.indexOf(".script") == -1) {
//Not a script //Not a script
@ -1246,9 +1253,9 @@ let Terminal = {
post("Theme not found"); post("Theme not found");
} }
}else{ }else{
inputBackgroundHex = args[0]; var inputBackgroundHex = args[0];
inputTextHex = args[1]; var inputTextHex = args[1];
inputHighlightHex = args[2]; var inputHighlightHex = args[2];
if(/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(inputBackgroundHex) && if(/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(inputBackgroundHex) &&
/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(inputTextHex) && /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(inputTextHex) &&
/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(inputHighlightHex)){ /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(inputHighlightHex)){