Merge branch 'dev' into eslint

This commit is contained in:
Steven Evans 2018-06-26 22:04:45 -04:00
commit f372f1e693
82 changed files with 29953 additions and 26201 deletions

104
CONTRIBUTING.md Normal file

@ -0,0 +1,104 @@
# Contributing to Bitburner
## In General
The game is made better because the community as a whole speaks up about
ways to improve the game. Here's some of the ways you can make your voice
heard:
- [Discord](https://discordapp.com)
There is a dedicated Discord instance set up for more free-form chats
between all members of the community. Regular players, heavy scripters,
Bitburner contributors, and everyone in between can be found on the
server.
- [Github Issues](https://github.com/danielyxie/bitburner/issues)
Although the term "issues" can have a negative connotation, they are a
means of communicating with the community. A new Issue can be a
interesting new feature that you feel would improve the game. It could be
an unexpected behavior within the game. Or because the game is about
scripting perhaps there is something that is conflicting with the
browser's Javascript interaction. So please do not be afraid to open a
[new issue](https://github.com/danielyxie/bitburner/issues/new).
## Reporting Bugs
The recommended method for reporting a bug is by opening a
[Github Issue](https://github.com/danielyxie/bitburner/issues).
Before submitting a bug report, please check to make sure the bug has not
already been reported as an [Issue](https://github.com/danielyxie/bitburner/issues).
#### How to Submit a Good Bug Report
* **Use a clear and descriptive title** for the issue
* **State your browser, your browser's version, and your computer's OS**
* **Provide instructions on how to reproduce the bug** in as much detail
as possible. If you cannot reliably reproduce the bug, then just try
your best to explain what was happening when the bug occurred
* **Provide any scripts** that triggered the bug if the issue is Netscript-related
* **Open your browser's Dev Console and report any error-related output**
that may be printed there. The Dev Console can be opened on most modern
browsers by pressing F12
## As a Developer
Anyone is welcome to contribute to Bitburner code. However, please read
the [license](https://github.com/danielyxie/bitburner/blob/dev/license.txt)
and the [readme](https://github.com/danielyxie/bitburner/blob/dev/README.md)
before doing so.
To contribute to Bitburner code, you will need to have
[NodeJS](https://nodejs.org) installed. When installing NodeJS, a utility
called `npm` is installed as well.
#### What are you Allowed to Contribute?
Not all code contributions will be accepted. The safest way to ensure
that you don't waste time working on something that gets rejected is to
run your idea(s)/plan(s) past [danielyxie](https://github.com/danielyxie) first.
You can contact him through:
* Github
* Discord
* [Reddit](https://www.reddit.com/user/chapt3r/)
Otherwise, here are some general guidelines for determining what types of changes
are okay to contribute:
##### Contributions that Will Most Likely Be Accepted
* Bug Fixes
* Quality-of-Life Changes
* Adding a new, commonly-requested Netscript function
* Fixing or improving UI elements
* Adding game settings/options
* Adding a new Terminal command
* Code Refactors that conform to good/standard practices
##### Contributions that will not be Accepted without prior approval
* Changes that directly affect the game's balance
* New gameplay mechanics
#### Submitting a Pull Request
When submitting a pull request with your code contributions, please abide by
the following rules:
- Work in a branch forked from `dev` to isolate the new code
- Ensure you have latest from the [game's main
repository](danielyxie/bitburner@dev)
- Rebase your branch if necessary
- Run the game locally to test out your changes
- When submitting the pull request, make sure that the base fork is
_danielyxie/bitburner_ and the base is _dev_.
- If your changes affect the game's UI, attach some screenshots or GIFs showing
the changes to the UI
- If your changes affect Netscript, provide some
scripts that can be used to test the Netscript changes.
- Do not check in the bundled engine (dist\engine.bundle.js)
## As a Documentor
To contribute to BitBurner documentation, you will need to have Python
installed, along with [Sphinx](http://www.sphinx-doc.org).
Before submitting your code for a pull request, please try to follow these
rules:
- Work in a branch forked from `dev` to isolate the new code
- Ensure you have latest from the [game's main
repository](danielyxie/bitburner@dev)
- Rebase your branch if necessary
- When submitting the pull request, make sure that the base fork is
_danielyxie/bitburner_ and the base is _dev_.

@ -1,31 +1,35 @@
# Bitburner
Bitburner is a cyberpunk hacking-themed incremental game. The game can be
played [here](https://danielyxie.github.io/bitburner).
Bitburner is a cyberpunk hacking-themed incremental game. The game can be
played at https://danielyxie.github.io/bitburner.
# Documentation
The game's official documentation can be found [here](http://bitburner.readthedocs.io/en/latest/index.html). Please note that
this is still a work-in-progress and is in its early stages.
The game's official documentation can be found on [Read The
Docs](http://bitburner.readthedocs.io/). Please note that this is still a
work-in-progress and is in its early stages.
The documentation is created using Sphinx and is hosted on Read The Docs.
The documentation is created using [Sphinx](http://www.sphinx-doc.org).
Anyone is welcome to contribute to the documentation by editing the source files
in /doc/ and then making a pull request with your changes/contributions.
Anyone is welcome to contribute to the documentation by editing the [source
files](/doc/source) and then making a pull request with your contributions.
For further guidance, please refer to the "As A Documentor" section of
[CONTRIBUTING](CONTRIBUTING.md).
# Wiki
The game's wiki can be found [here](http://bitburner.wikia.com/wiki/Bitburner_Wiki).
Please note that the wiki is in the process of being deprecated. Eventually all of the
wiki content will be moved into the Read The Docs documentation.
The game's wiki can be found on [Wikia](http://bitburner.wikia.com/). Please
note that the wiki is in the process of being deprecated. Eventually all of
the wiki content will be moved into the Read The Docs documentation.
# Contributing
If you would like to make any small change or addition to the game, you may go ahead
and do so by submitting a pull request.
# Contribution
There are many ways to contribute to the game. It can be as simple as fixing
a typo, correcting a bug, or improving the UI. For guidance on doing so,
please refer to the [CONTRIBUTING](CONTRIBUTING.md) document.
You will retain all ownership of the Copyright of any contributions you make,
and will have the same rights to use or license your contributions. By
submitting a pull request you agree to grant me perpetual, worldwide, non-exclusive,
transferable, royalty-free, and irrevocable rights to use, publish, and distribute
your contributions to the project. A formal Contributor's License Agreement
will be drawn up in the future.
submitting a pull request you agree to grant me perpetual, worldwide,
non-exclusive, transferable, royalty-free, and irrevocable rights to use,
publish, and distribute your contributions to the project. A formal
Contributor's License Agreement will be drawn up in the future.
If you would like to make significant contributions to the project as a
collaborator, please message me privately.
collaborator, please reach out to @danielyxie to help coordinate the effort.

49564
dist/engine.bundle.js vendored

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -3,6 +3,36 @@
Changelog
=========
v0.39.0 - 6/25/2018
-------------------
* Added BitNode-7: Bladeburner 2079
* Infiltration base difficulty decreased by 10% for most locations
* Experience gains from Infiltration slightly increased
* Money gained from Infiltration increased by 20%
* Added 'var' declarations in Netscript 1.0 (only works with 'var', not 'let' or 'const')
* Script base RAM cost is now 1.6 GB (increased from 1.4 GB)
* While/for loops and if statements no longer cost RAM in scripts
* Made short-circuit evaluation logic more consistent in Netscript 1.0 (see https://github.com/danielyxie/bitburner/issues/308)
* Changelog button in the Options menu now links to the new Changelog URL (by Github user thePalindrome)
* Skill level calculation is now 'smoother' (by Github user hydroflame)
* Added a button to 'beautify' scripts in the text editor (by Github user hydroflame)
* Added favicon (by Github user kopelli)
v0.38.1 - 6/15/2018
-------------------
* Bug Fix: Using 'Object.prototype' functions like toLocaleString() or toString() should no longer cause errors in NetscriptJS
* Implemented by Github user hydroflame:
* Accessing the 'window' and 'document' objects in Netscript JS now requires a large amount of RAM (100 GB)
* Added game option to suppress travel confirmation
* Text on buttons can no longer be highlighted
* Bug Fix: Fixed an issue that caused NaN values when exporting Real Estate in Corporations
* Bug Fix: Competition and Demand displays in Corporation are now correct (were reversed before)
* Added ps() Netscript function
* Bug Fix: grow() should no longer return/log a negative value when it runs on a server that's already at max money
* Bug Fix: serverExists() Netscript function should now properly return false for non-existent hostname/ips
* Bug Fix: Sever's security level should now properly increase when its money is grown to max value
v0.38.0 - 6/12/2018
-------------------
* New BitNode: BN-12 The Recursion - Implemented by Github user hydroflame

@ -24,4 +24,5 @@ to reach out to the developer!
Hacknet Node API <netscripthacknetnodeapi>
Trade Information eXchange (TIX) API <netscriptixapi>
Singularity Functions <netscriptsingularityfunctions>
Bladeburner API <netscriptbladeburnerapi>
Miscellaneous <netscriptmisc>

@ -0,0 +1,446 @@
Netscript Bladeburner API
=========================
Netscript provides the following API for interacting with the game's Bladeburner mechanic.
The Bladeburner API is **not** immediately available to the palyer and must be unlocked
later in the game
**WARNING: This page contains spoilers for the game**
The Bladeburner API is unlocked in BitNode-7. If you are in BitNode-7, you will
automatically gain access to this API. Otherwise, you must have Source-File 7 in
order to use this API in other BitNodes
**Bladeburner API functions must be accessed through the bladeburner namespace**
In Netscript 1.0::
bladeburner.getContractNames();
bladeburner.startAction("general", "Training");
In :ref:`netscriptjs`::
ns.bladeburner.getContractNames();
ns.bladeburner.startAction("general", "Training");
.. _bladeburner_action_types:
Bladeburner Action Types
------------------------
Several functions in the Bladeburner API require you to specify an action using
its type and name. The following are valid values when specifying the action's type:
**Contracts**
* contract
* contracts
* contr
**Operations**
* operation
* operations
* op
* ops
**Black Ops**
* blackoperation
* black operation
* black operations
* black op
* black ops
* blackop
* blackops
**General Actions (Training, Field Analysis, Recruitment)**
* general
* general action
* gen
getContractNames
----------------
.. js:function:: getContractNames()
Returns an array of strings containing the names of all Bladeburner contracts
getOperationNames
-----------------
.. js:function:: getOperationNames()
Returns an array of strings containing the names of all Bladeburner operations
getBlackOpNames
---------------
.. js:function:: getBlackOpNames()
Returns an array of strings containing the names of all Bladeburner Black Ops
getGeneralActionNames
---------------------
.. js:function:: getGeneralActionNames()
Returns an array of strings containing the names of all general Bladeburner actions
getSkillNames
-------------
.. js:function:: getSkillNames()
Returns an array of strings containing the names of all Bladeburner skills
startAction
-----------
.. js:function:: startAction(type, name)
:param string type: Type of action. See :ref:`bladeburner_action_types`
:param string name: Name of action. Must be an exact match
Attempts to start the specified Bladeburner action. Returns true if the action
was started successfully, and false otherwise.
stopBladeburnerAction
---------------------
.. js:function:: stopBladeburnerAction()
Stops the current Bladeburner action
getActionTime
-------------
.. js:function:: getActionTime(type, name)
:param string type: Type of action. See :ref:`bladeburner_action_types`
:param string name: Name of action. Must be an exact match
Returns the number of seconds it takes to complete the specified action
getActionEstimatedSuccessChance
-------------------------------
.. js:function:: getActionEstimatedSuccessChance(type, name)
:param string type: Type of action. See :ref:`bladeburner_action_types`
:param string name: Name of action. Must be an exact match
Returns the estimated success chance for the specified action
getActionCountRemaining
-----------------------
.. js:function:: getActionCountRemaining(type, name)
:param string type: Type of action. See :ref:`bladeburner_action_types`
:param string name: Name of action. Must be an exact match
Returns the remaining count of the specified action.
Note that this is meant to be used for Contracts and Operations.
This function will return 'Infinity' for actions such as Training and Field Analysis.
getRank
-------
.. js:function:: getRank()
Returns the player's Bladeburner Rank
getSkillPoints
--------------
.. js:function:: getSkillPoints()
Returns the number of Bladeburner skill points you have
getSkillLevel
-------------
.. js:function:: getSkillLevel(skillName="")
:param string skillName: Optional name of Skill. Empty string by default
If no argument or an empty string is passed in, this function returns
an object with your level for all Bladeburner Skills (only for skills that
have at least one level). In the object, the name of the Bladeburner Skills
are the keys and your skill levels are the values. For example::
{
"Blade's Intuition": 10,
"Cloak": 5,
"Evasive System": 6
}
If the name of a skill is passed in as an argument, then this function
returns your level in the specified skill.
The function returns -1 if an invalid skill name is passed in
upgradeSkill
------------
.. js:function:: upgradeSkill(skillName)
:param string skillName: Name of Skill to be upgraded. Must be an exact match
Attempts to upgrade the specified Bladeburner skill. Returns true if the
skill is successfully upgraded, and false otherwise
getTeamSize
-----------
.. js:function:: getTeamSize(type, name)
:param string type: Type of action. See :ref:`bladeburner_action_types`
:param string name: Name of action. Must be an exact match
Returns the number of Bladeburner team members you have assigned to the
specified action.
Setting a team is only applicable for Operations and BlackOps. This function
will return 0 for other action types.
setTeamSize
-----------
.. js:function:: setTeamSize(type, name, size)
:param string type: Type of action. See :ref:`bladeburner_action_types`
:param string name: Name of action. Must be an exact match
:param int size: Number of team members to set. Will be converted using Math.round()
Set the team size for the specified Bladeburner action.
Returns the team size that was set, or -1 if the function failed.
getCityEstimatedPopulation
--------------------------
.. js:function:: getCityEstimatedPopulation(cityName)
:param string cityName: Name of city. Case-sensitive
Returns the estimated number of Synthoids in the specified city, or -1
if an invalid city was specified.
getCityEstimatedCommunities
---------------------------
.. js:function:: getCityEstimatedCommunities(cityName)
:param string cityName: Name of city. Case-sensitive
Returns the estimated number of Synthoid communities in the specified city,
or -1 if an invalid city was specified.
getCityChaos
------------
.. js:function:: getCityChaos(cityName)
:param string cityName: Name of city. Case-sensitive
Returns the chaos in the specified city, or -1 if an invalid city was specified
switchCity
----------
.. js:function:: switchCity(cityName)
:param string cityName: Name of city
Attempts to switch to the specified city (for Bladeburner only).
Returns true if successful, and false otherwise
getStamina
----------
.. js:function:: getStamina()
Returns an array with two elements:
[Current stamina, Max stamina]
Example usage::
function getStaminaPercentage() {
let res = bladeburner.getStamina();
return res[0] / res[1];
}
joinBladeburnerFaction
----------------------
.. js:function:: joinBladeburnerFaction()
Attempts to join the Bladeburner faction.
Returns true if you successfully join the Bladeburner faction, or if
you are already a member.
Returns false otherwise.
Examples
--------
**Basic example usage**::
tprint(bladeburner.getContractNames());
tprint(bladeburner.getOperationNames());
tprint(bladeburner.getBlackOpNames());
tprint(bladeburner.getGeneralActionNames());
tprint(bladeburner.getSkillNames());
tprint(bladeburner.getActionTime("contract", "Tracking"));
tprint("Rank: " + bladeburner.getRank());
tprint("Skill Points: " + bladeburner.getSkillPoints());
tprint("Cloak Skill Level: " + bladeburner.getSkillLevel("Cloak"));
tprint("Trying to upgradeSkill: " + bladeburner.upgradeSkill("Cloak"));
tprint("Skill Points remaining: " + bladeburner.getSkillPoints());
tprint("Trying to switch to a nonexistent city: " + bladeburner.switchCity("lskgns"));
var chongqing = "Chongqing";
tprint("Trying to switch to Chongqing: " + bladeburner.switchCity(chongqing));
tprint("Chongqing chaos: " + bladeburner.getCityChaos(chongqing));
tprint("Chongqing estimated pop: " + bladeburner.getCityEstimatedPopulation(chongqing));
tprint("Chonqging estimated communities: " + bladeburner.getCityEstimatedCommunities(chongqing));
**Bladeburner handler example**. Note that this avoids the need of using the *bladeburner* namespace
identifier by attaching the Bladeburner API functions to an object::
const FIELD_ANALYSIS_INTERVAL = 10; //Number of minutes between field analysis states
const FIELD_ANALYSIS_DURATION = 5; //Duration in minutes
function BladeburnerHandler(ns, params) {
//Netscript environment becomes part of the instance
this.ns = ns;
//Netscript bladeburner API becomes part of this instance
for (var bladeburnerFn in ns.bladeburner) {
this[bladeburnerFn] = ns.bladeburner[bladeburnerFn];
}
this.fieldAnalysis = {
inProgress: params.startFieldAnalysis ? true : false,
cyclesRemaining: FIELD_ANALYSIS_DURATION,
cyclesSince: FIELD_ANALYSIS_INTERVAL
}
}
BladeburnerHandler.prototype.getStaminaPercentage = function() {
var res = this.getStamina();
return 100 * (res[0] / res[1]);
}
BladeburnerHandler.prototype.hasSimulacrum = function() {
var augs = this.ns.getOwnedAugmentations();
return augs.includes("The Blade's Simulacrum");
}
BladeburnerHandler.prototype.handle = function() {
//If we're doing something else manually (without Simlacrum),
//it overrides Bladeburner stuff
if (!this.hasSimulacrum() && this.ns.isBusy()) {
this.ns.print("Idling bc player is busy with some other action");
return;
}
if (this.fieldAnalysis.inProgress) {
--(this.fieldAnalysis.cyclesRemaining);
if (this.fieldAnalysis.cyclesRemaining < 0) {
this.fieldAnalysis.inProgress = false;
this.fieldAnalysis.cyclesSince = 0;
return this.handle();
} else {
this.startAction("general", "Field Analysis");
this.ns.print("handler is doing field analyis for " +
(this.fieldAnalysis.cyclesRemaining+1) + " more mins");
return;
}
} else {
++(this.fieldAnalysis.cyclesSince);
if (this.fieldAnalysis.cyclesSince > FIELD_ANALYSIS_INTERVAL) {
this.fieldAnalysis.inProgress = true;
this.fieldAnalysis.cyclesRemaining = FIELD_ANALYSIS_DURATION;
return this.handle();
}
}
this.stopBladeburnerAction();
var staminaPerc = this.getStaminaPercentage();
if (staminaPerc < 55) {
this.ns.print("handler is starting training due to low stamina percentage");
this.startAction("general", "Training");
} else {
var action = this.chooseAction();
this.ns.print("handler chose " + action.name + " " + action.type + " through chooseAction()");
this.startAction(action.type, action.name);
}
}
BladeburnerHandler.prototype.chooseAction = function() {
//Array of all Operations
var ops = this.getOperationNames();
//Sort Operations in order of increasing success chance
ops.sort((a, b)=>{
return this.getActionEstimatedSuccessChance("operation", a) -
this.getActionEstimatedSuccessChance("operation", b);
});
//Loop through until you find one with 99+% success chance
for (let i = 0; i < ops.length; ++i) {
let successChance = this.getActionEstimatedSuccessChance("operation", ops[i]);
let count = this.getActionCountRemaining("operation", ops[i]);
if (successChance >= 0.99 && count > 10) {
return {type: "operation", name: ops[i]};
}
}
//Repeat for Contracts
var contracts = this.getContractNames();
contracts.sort((a, b)=>{
return this.getActionEstimatedSuccessChance("contract", a) -
this.getActionEstimatedSuccessChance("contract", b);
});
for (let i = 0; i < contracts.length; ++i) {
let successChance = this.getActionEstimatedSuccessChance("contract", contracts[i]);
let count = this.getActionCountRemaining("contract", contracts[i]);
if (successChance >= 0.80 && count > 10) {
return {type: "contract", name: contracts[i]};
}
}
return {type:"general", name:"Training"};
}
BladeburnerHandler.prototype.process = async function() {
this.handle();
await this.ns.sleep(60000);
}
export async function main(ns) {
ns.disableLog("sleep");
//Check if Bladeburner is available. This'll throw a runtime error if it's not
ns.bladeburner.getContractNames();
var startFieldAnalysis = true;
if (ns.args.length >= 1 && ns.args[0] == "false") {
startFieldAnalysis = false;
}
var handler = new BladeburnerHandler(ns, {
startFieldAnalysis: startFieldAnalysis
});
while(true) {
await handler.process();
}
}

@ -942,7 +942,11 @@ prompt
Defining your own Functions
---------------------------
You can define your own functions in Netscript using the following syntax::
Note that the following information is only applicable for Netscript 1.0.
:doc:`netscriptjs` allows you to define your functions using native Javascript
techniques.
You can define your own functions in Netscript 1.0 using the following syntax::
function name(args...) {
function code here...

@ -50,6 +50,45 @@
<div class="section" id="changelog">
<span id="id1"></span><h1>Changelog<a class="headerlink" href="#changelog" title="Permalink to this headline"></a></h1>
<div class="section" id="v0-39-0-6-25-2018">
<h2>v0.39.0 - 6/25/2018<a class="headerlink" href="#v0-39-0-6-25-2018" title="Permalink to this headline"></a></h2>
<ul class="simple">
<li>Added BitNode-7: Bladeburner 2079</li>
<li>Infiltration base difficulty decreased by 10% for most locations</li>
<li>Experience gains from Infiltration slightly increased</li>
<li>Money gained from Infiltration increased by 20%</li>
<li>Added 'var' declarations in Netscript 1.0 (only works with 'var', not 'let' or 'const')</li>
<li>Script base RAM cost is now 1.6 GB (increased from 1.4 GB)</li>
<li>While/for loops and if statements no longer cost RAM in scripts</li>
<li>Made short-circuit evaluation logic more consistent in Netscript 1.0 (see <a class="reference external" href="https://github.com/danielyxie/bitburner/issues/308">https://github.com/danielyxie/bitburner/issues/308</a>)</li>
<li>Changelog button in the Options menu now links to the new Changelog URL (by Github user thePalindrome)</li>
<li>Skill level calculation is now 'smoother' (by Github user hydroflame)</li>
<li>Added a button to 'beautify' scripts in the text editor (by Github user hydroflame)</li>
<li>Added favicon (by Github user kopelli)</li>
</ul>
</div>
<div class="section" id="v0-38-1-6-15-2018">
<h2>v0.38.1 - 6/15/2018<a class="headerlink" href="#v0-38-1-6-15-2018" title="Permalink to this headline"></a></h2>
<ul class="simple">
<li>Bug Fix: Using 'Object.prototype' functions like toLocaleString() or toString() should no longer cause errors in NetscriptJS</li>
<li><dl class="first docutils">
<dt>Implemented by Github user hydroflame:</dt>
<dd><ul class="first last">
<li>Accessing the 'window' and 'document' objects in Netscript JS now requires a large amount of RAM (100 GB)</li>
<li>Added game option to suppress travel confirmation</li>
<li>Text on buttons can no longer be highlighted</li>
<li>Bug Fix: Fixed an issue that caused NaN values when exporting Real Estate in Corporations</li>
<li>Bug Fix: Competition and Demand displays in Corporation are now correct (were reversed before)</li>
<li>Added ps() Netscript function</li>
<li>Bug Fix: grow() should no longer return/log a negative value when it runs on a server that's already at max money</li>
<li>Bug Fix: serverExists() Netscript function should now properly return false for non-existent hostname/ips</li>
<li>Bug Fix: Sever's security level should now properly increase when its money is grown to max value</li>
</ul>
</dd>
</dl>
</li>
</ul>
</div>
<div class="section" id="v0-38-0-6-12-2018">
<h2>v0.38.0 - 6/12/2018<a class="headerlink" href="#v0-38-0-6-12-2018" title="Permalink to this headline"></a></h2>
<ul class="simple">
@ -1006,6 +1045,8 @@ on the difficulty of the contract.</li>
<li class="toctree-l1"><a class="reference internal" href="terminal.html"> Terminal</a></li>
<li class="toctree-l1"><a class="reference internal" href="shortcuts.html"> Keyboard Shortcuts</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#"> Changelog</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#v0-39-0-6-25-2018">v0.39.0 - 6/25/2018</a></li>
<li class="toctree-l2"><a class="reference internal" href="#v0-38-1-6-15-2018">v0.38.1 - 6/15/2018</a></li>
<li class="toctree-l2"><a class="reference internal" href="#v0-38-0-6-12-2018">v0.38.0 - 6/12/2018</a></li>
<li class="toctree-l2"><a class="reference internal" href="#v0-37-2-6-2-2018">v0.37.2 - 6/2/2018</a></li>
<li class="toctree-l2"><a class="reference internal" href="#v0-37-1-5-22-2018">v0.37.1 - 5/22/2018</a></li>

@ -153,21 +153,39 @@
<h2 id="G">G</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptbladeburnerapi.html#getActionCountRemaining">getActionCountRemaining() (built-in function)</a>
</li>
<li><a href="netscriptbladeburnerapi.html#getActionEstimatedSuccessChance">getActionEstimatedSuccessChance() (built-in function)</a>
</li>
<li><a href="netscriptbladeburnerapi.html#getActionTime">getActionTime() (built-in function)</a>
</li>
<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="netscriptbladeburnerapi.html#getBlackOpNames">getBlackOpNames() (built-in function)</a>
</li>
<li><a href="netscriptbladeburnerapi.html#getCityChaos">getCityChaos() (built-in function)</a>
</li>
<li><a href="netscriptbladeburnerapi.html#getCityEstimatedCommunities">getCityEstimatedCommunities() (built-in function)</a>
</li>
<li><a href="netscriptbladeburnerapi.html#getCityEstimatedPopulation">getCityEstimatedPopulation() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#getCompanyFavor">getCompanyFavor() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#getCompanyRep">getCompanyRep() (built-in function)</a>
</li>
<li><a href="netscriptbladeburnerapi.html#getContractNames">getContractNames() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#getCrimeChance">getCrimeChance() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#getFactionFavor">getFactionFavor() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#getFactionRep">getFactionRep() (built-in function)</a>
</li>
<li><a href="netscriptbladeburnerapi.html#getGeneralActionNames">getGeneralActionNames() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getGrowTime">getGrowTime() (built-in function)</a>
</li>
@ -182,17 +200,21 @@
<li><a href="netscriptfunctions.html#getHostname">getHostname() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getNextHacknetNodeCost">getNextHacknetNodeCost() (built-in function)</a>, <a href="netscripthacknetnodeapi.html#getNextHacknetNodeCost">[1]</a>
</li>
<li><a href="netscriptbladeburnerapi.html#getOperationNames">getOperationNames() (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>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptbladeburnerapi.html#getRank">getRank() (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>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#getScriptName">getScriptName() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getScriptRam">getScriptRam() (built-in function)</a>
@ -214,12 +236,22 @@
<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="netscriptbladeburnerapi.html#getSkillLevel">getSkillLevel() (built-in function)</a>
</li>
<li><a href="netscriptbladeburnerapi.html#getSkillNames">getSkillNames() (built-in function)</a>
</li>
<li><a href="netscriptbladeburnerapi.html#getSkillPoints">getSkillPoints() (built-in function)</a>
</li>
<li><a href="netscriptbladeburnerapi.html#getStamina">getStamina() (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="netscriptbladeburnerapi.html#getTeamSize">getTeamSize() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#getTimeSinceLastAug">getTimeSinceLastAug() (built-in function)</a>
</li>
@ -278,6 +310,10 @@
<h2 id="J">J</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptbladeburnerapi.html#joinBladeburnerFaction">joinBladeburnerFaction() (built-in function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptsingularityfunctions.html#joinFaction">joinFaction() (built-in function)</a>
</li>
@ -375,10 +411,12 @@
</li>
<li><a href="netscriptixapi.html#sellStock">sellStock() (built-in function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptfunctions.html#serverExists">serverExists() (built-in function)</a>
</li>
<li><a href="netscriptbladeburnerapi.html#setTeamSize">setTeamSize() (built-in function)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptixapi.html#shortStock">shortStock() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#sleep">sleep() (built-in function)</a>
@ -388,8 +426,14 @@
<li><a href="netscriptfunctions.html#sprintf">sprintf() (built-in function)</a>
</li>
<li><a href="netscriptfunctions.html#sqlinject">sqlinject() (built-in function)</a>
</li>
<li><a href="netscriptbladeburnerapi.html#startAction">startAction() (built-in function)</a>
</li>
<li><a href="netscriptsingularityfunctions.html#stopAction">stopAction() (built-in function)</a>
</li>
<li><a href="netscriptbladeburnerapi.html#stopBladeburnerAction">stopBladeburnerAction() (built-in function)</a>
</li>
<li><a href="netscriptbladeburnerapi.html#switchCity">switchCity() (built-in function)</a>
</li>
</ul></td>
</tr></table>
@ -414,6 +458,8 @@
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="netscriptsingularityfunctions.html#upgradeHomeRam">upgradeHomeRam() (built-in function)</a>
</li>
<li><a href="netscriptbladeburnerapi.html#upgradeSkill">upgradeSkill() (built-in function)</a>
</li>
</ul></td>
</tr></table>

@ -211,6 +211,33 @@ secrets that you've been searching for.</p>
<li class="toctree-l3"><a class="reference internal" href="netscriptsingularityfunctions.html#installaugmentations">installAugmentations</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html"> Bladeburner API</a><ul>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#bladeburner-action-types">Bladeburner Action Types</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#getcontractnames">getContractNames</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#getoperationnames">getOperationNames</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#getblackopnames">getBlackOpNames</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#getgeneralactionnames">getGeneralActionNames</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#getskillnames">getSkillNames</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#startaction">startAction</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#stopbladeburneraction">stopBladeburnerAction</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#getactiontime">getActionTime</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#getactionestimatedsuccesschance">getActionEstimatedSuccessChance</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#getactioncountremaining">getActionCountRemaining</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#getrank">getRank</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#getskillpoints">getSkillPoints</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#getskilllevel">getSkillLevel</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#upgradeskill">upgradeSkill</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#getteamsize">getTeamSize</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#setteamsize">setTeamSize</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#getcityestimatedpopulation">getCityEstimatedPopulation</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#getcityestimatedcommunities">getCityEstimatedCommunities</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#getcitychaos">getCityChaos</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#switchcity">switchCity</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#getstamina">getStamina</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#joinbladeburnerfaction">joinBladeburnerFaction</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptbladeburnerapi.html#examples">Examples</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="netscriptmisc.html"> Miscellaneous</a><ul>
<li class="toctree-l3"><a class="reference internal" href="netscriptmisc.html#netscript-ports">Netscript Ports</a></li>
<li class="toctree-l3"><a class="reference internal" href="netscriptmisc.html#comments">Comments</a></li>
@ -269,6 +296,8 @@ secrets that you've been searching for.</p>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="changelog.html"> Changelog</a><ul>
<li class="toctree-l2"><a class="reference internal" href="changelog.html#v0-39-0-6-25-2018">v0.39.0 - 6/25/2018</a></li>
<li class="toctree-l2"><a class="reference internal" href="changelog.html#v0-38-1-6-15-2018">v0.38.1 - 6/15/2018</a></li>
<li class="toctree-l2"><a class="reference internal" href="changelog.html#v0-38-0-6-12-2018">v0.38.0 - 6/12/2018</a></li>
<li class="toctree-l2"><a class="reference internal" href="changelog.html#v0-37-2-6-2-2018">v0.37.2 - 6/2/2018</a></li>
<li class="toctree-l2"><a class="reference internal" href="changelog.html#v0-37-1-5-22-2018">v0.37.1 - 5/22/2018</a></li>

@ -212,6 +212,33 @@ to reach out to the developer!</p>
<li class="toctree-l2"><a class="reference internal" href="netscriptsingularityfunctions.html#installaugmentations">installAugmentations</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="netscriptbladeburnerapi.html"> Bladeburner API</a><ul>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#bladeburner-action-types">Bladeburner Action Types</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#getcontractnames">getContractNames</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#getoperationnames">getOperationNames</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#getblackopnames">getBlackOpNames</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#getgeneralactionnames">getGeneralActionNames</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#getskillnames">getSkillNames</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#startaction">startAction</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#stopbladeburneraction">stopBladeburnerAction</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#getactiontime">getActionTime</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#getactionestimatedsuccesschance">getActionEstimatedSuccessChance</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#getactioncountremaining">getActionCountRemaining</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#getrank">getRank</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#getskillpoints">getSkillPoints</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#getskilllevel">getSkillLevel</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#upgradeskill">upgradeSkill</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#getteamsize">getTeamSize</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#setteamsize">setTeamSize</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#getcityestimatedpopulation">getCityEstimatedPopulation</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#getcityestimatedcommunities">getCityEstimatedCommunities</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#getcitychaos">getCityChaos</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#switchcity">switchCity</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#getstamina">getStamina</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#joinbladeburnerfaction">joinBladeburnerFaction</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html#examples">Examples</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="netscriptmisc.html"> Miscellaneous</a><ul>
<li class="toctree-l2"><a class="reference internal" href="netscriptmisc.html#netscript-ports">Netscript Ports</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptmisc.html#comments">Comments</a></li>
@ -245,6 +272,7 @@ to reach out to the developer!</p>
<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>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html"> Bladeburner API</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptmisc.html"> Miscellaneous</a></li>
</ul>
</li>

@ -0,0 +1,748 @@
<!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 Bladeburner 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 Miscellaneous" href="netscriptmisc.html" />
<link rel="prev" title="Netscript Singularity Functions" href="netscriptsingularityfunctions.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="netscriptsingularityfunctions.html" title="Netscript Singularity Functions"
accesskey="P">previous</a> |
<a href="netscriptmisc.html" title="Netscript Miscellaneous"
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-bladeburner-api">
<h1>Netscript Bladeburner API<a class="headerlink" href="#netscript-bladeburner-api" title="Permalink to this headline"></a></h1>
<p>Netscript provides the following API for interacting with the game's Bladeburner mechanic.</p>
<p>The Bladeburner API is <strong>not</strong> immediately available to the palyer and must be unlocked
later in the game</p>
<p><strong>WARNING: This page contains spoilers for the game</strong></p>
<p>The Bladeburner API is unlocked in BitNode-7. If you are in BitNode-7, you will
automatically gain access to this API. Otherwise, you must have Source-File 7 in
order to use this API in other BitNodes</p>
<p><strong>Bladeburner API functions must be accessed through the bladeburner namespace</strong></p>
<p>In Netscript 1.0:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">bladeburner</span><span class="o">.</span><span class="n">getContractNames</span><span class="p">();</span>
<span class="n">bladeburner</span><span class="o">.</span><span class="n">startAction</span><span class="p">(</span><span class="s2">&quot;general&quot;</span><span class="p">,</span> <span class="s2">&quot;Training&quot;</span><span class="p">);</span>
</pre></div>
</div>
<p>In <a class="reference internal" href="netscriptjs.html#netscriptjs"><span class="std std-ref">NetscriptJS (Netscript 2.0)</span></a>:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">ns</span><span class="o">.</span><span class="n">bladeburner</span><span class="o">.</span><span class="n">getContractNames</span><span class="p">();</span>
<span class="n">ns</span><span class="o">.</span><span class="n">bladeburner</span><span class="o">.</span><span class="n">startAction</span><span class="p">(</span><span class="s2">&quot;general&quot;</span><span class="p">,</span> <span class="s2">&quot;Training&quot;</span><span class="p">);</span>
</pre></div>
</div>
<div class="section" id="bladeburner-action-types">
<span id="id1"></span><h2>Bladeburner Action Types<a class="headerlink" href="#bladeburner-action-types" title="Permalink to this headline"></a></h2>
<p>Several functions in the Bladeburner API require you to specify an action using
its type and name. The following are valid values when specifying the action's type:</p>
<dl class="docutils">
<dt><strong>Contracts</strong></dt>
<dd><ul class="first last simple">
<li>contract</li>
<li>contracts</li>
<li>contr</li>
</ul>
</dd>
<dt><strong>Operations</strong></dt>
<dd><ul class="first last simple">
<li>operation</li>
<li>operations</li>
<li>op</li>
<li>ops</li>
</ul>
</dd>
<dt><strong>Black Ops</strong></dt>
<dd><ul class="first last simple">
<li>blackoperation</li>
<li>black operation</li>
<li>black operations</li>
<li>black op</li>
<li>black ops</li>
<li>blackop</li>
<li>blackops</li>
</ul>
</dd>
<dt><strong>General Actions (Training, Field Analysis, Recruitment)</strong></dt>
<dd><ul class="first last simple">
<li>general</li>
<li>general action</li>
<li>gen</li>
</ul>
</dd>
</dl>
</div>
<div class="section" id="getcontractnames">
<h2>getContractNames<a class="headerlink" href="#getcontractnames" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getContractNames">
<code class="descname">getContractNames</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#getContractNames" title="Permalink to this definition"></a></dt>
<dd><p>Returns an array of strings containing the names of all Bladeburner contracts</p>
</dd></dl>
</div>
<div class="section" id="getoperationnames">
<h2>getOperationNames<a class="headerlink" href="#getoperationnames" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getOperationNames">
<code class="descname">getOperationNames</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#getOperationNames" title="Permalink to this definition"></a></dt>
<dd><p>Returns an array of strings containing the names of all Bladeburner operations</p>
</dd></dl>
</div>
<div class="section" id="getblackopnames">
<h2>getBlackOpNames<a class="headerlink" href="#getblackopnames" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getBlackOpNames">
<code class="descname">getBlackOpNames</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#getBlackOpNames" title="Permalink to this definition"></a></dt>
<dd><p>Returns an array of strings containing the names of all Bladeburner Black Ops</p>
</dd></dl>
</div>
<div class="section" id="getgeneralactionnames">
<h2>getGeneralActionNames<a class="headerlink" href="#getgeneralactionnames" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getGeneralActionNames">
<code class="descname">getGeneralActionNames</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#getGeneralActionNames" title="Permalink to this definition"></a></dt>
<dd><p>Returns an array of strings containing the names of all general Bladeburner actions</p>
</dd></dl>
</div>
<div class="section" id="getskillnames">
<h2>getSkillNames<a class="headerlink" href="#getskillnames" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getSkillNames">
<code class="descname">getSkillNames</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#getSkillNames" title="Permalink to this definition"></a></dt>
<dd><p>Returns an array of strings containing the names of all Bladeburner skills</p>
</dd></dl>
</div>
<div class="section" id="startaction">
<h2>startAction<a class="headerlink" href="#startaction" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="startAction">
<code class="descname">startAction</code><span class="sig-paren">(</span><em>type</em>, <em>name</em><span class="sig-paren">)</span><a class="headerlink" href="#startAction" 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>type</strong> (<em>string</em>) -- Type of action. See <a class="reference internal" href="#bladeburner-action-types"><span class="std std-ref">Bladeburner Action Types</span></a></li>
<li><strong>name</strong> (<em>string</em>) -- Name of action. Must be an exact match</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Attempts to start the specified Bladeburner action. Returns true if the action
was started successfully, and false otherwise.</p>
</dd></dl>
</div>
<div class="section" id="stopbladeburneraction">
<h2>stopBladeburnerAction<a class="headerlink" href="#stopbladeburneraction" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="stopBladeburnerAction">
<code class="descname">stopBladeburnerAction</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#stopBladeburnerAction" title="Permalink to this definition"></a></dt>
<dd><p>Stops the current Bladeburner action</p>
</dd></dl>
</div>
<div class="section" id="getactiontime">
<h2>getActionTime<a class="headerlink" href="#getactiontime" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getActionTime">
<code class="descname">getActionTime</code><span class="sig-paren">(</span><em>type</em>, <em>name</em><span class="sig-paren">)</span><a class="headerlink" href="#getActionTime" 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>type</strong> (<em>string</em>) -- Type of action. See <a class="reference internal" href="#bladeburner-action-types"><span class="std std-ref">Bladeburner Action Types</span></a></li>
<li><strong>name</strong> (<em>string</em>) -- Name of action. Must be an exact match</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Returns the number of seconds it takes to complete the specified action</p>
</dd></dl>
</div>
<div class="section" id="getactionestimatedsuccesschance">
<h2>getActionEstimatedSuccessChance<a class="headerlink" href="#getactionestimatedsuccesschance" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getActionEstimatedSuccessChance">
<code class="descname">getActionEstimatedSuccessChance</code><span class="sig-paren">(</span><em>type</em>, <em>name</em><span class="sig-paren">)</span><a class="headerlink" href="#getActionEstimatedSuccessChance" 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>type</strong> (<em>string</em>) -- Type of action. See <a class="reference internal" href="#bladeburner-action-types"><span class="std std-ref">Bladeburner Action Types</span></a></li>
<li><strong>name</strong> (<em>string</em>) -- Name of action. Must be an exact match</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Returns the estimated success chance for the specified action</p>
</dd></dl>
</div>
<div class="section" id="getactioncountremaining">
<h2>getActionCountRemaining<a class="headerlink" href="#getactioncountremaining" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getActionCountRemaining">
<code class="descname">getActionCountRemaining</code><span class="sig-paren">(</span><em>type</em>, <em>name</em><span class="sig-paren">)</span><a class="headerlink" href="#getActionCountRemaining" 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>type</strong> (<em>string</em>) -- Type of action. See <a class="reference internal" href="#bladeburner-action-types"><span class="std std-ref">Bladeburner Action Types</span></a></li>
<li><strong>name</strong> (<em>string</em>) -- Name of action. Must be an exact match</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Returns the remaining count of the specified action.</p>
<p>Note that this is meant to be used for Contracts and Operations.
This function will return 'Infinity' for actions such as Training and Field Analysis.</p>
</dd></dl>
</div>
<div class="section" id="getrank">
<h2>getRank<a class="headerlink" href="#getrank" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getRank">
<code class="descname">getRank</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#getRank" title="Permalink to this definition"></a></dt>
<dd><p>Returns the player's Bladeburner Rank</p>
</dd></dl>
</div>
<div class="section" id="getskillpoints">
<h2>getSkillPoints<a class="headerlink" href="#getskillpoints" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getSkillPoints">
<code class="descname">getSkillPoints</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#getSkillPoints" title="Permalink to this definition"></a></dt>
<dd><p>Returns the number of Bladeburner skill points you have</p>
</dd></dl>
</div>
<div class="section" id="getskilllevel">
<h2>getSkillLevel<a class="headerlink" href="#getskilllevel" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getSkillLevel">
<code class="descname">getSkillLevel</code><span class="sig-paren">(</span><em>skillName=&quot;&quot;</em><span class="sig-paren">)</span><a class="headerlink" href="#getSkillLevel" 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>skillName</strong> (<em>string</em>) -- Optional name of Skill. Empty string by default</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>If no argument or an empty string is passed in, this function returns
an object with your level for all Bladeburner Skills (only for skills that
have at least one level). In the object, the name of the Bladeburner Skills
are the keys and your skill levels are the values. For example:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="p">{</span>
<span class="s2">&quot;Blade&#39;s Intuition&quot;</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
<span class="s2">&quot;Cloak&quot;</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
<span class="s2">&quot;Evasive System&quot;</span><span class="p">:</span> <span class="mi">6</span>
<span class="p">}</span>
</pre></div>
</div>
<p>If the name of a skill is passed in as an argument, then this function
returns your level in the specified skill.</p>
<p>The function returns -1 if an invalid skill name is passed in</p>
</dd></dl>
</div>
<div class="section" id="upgradeskill">
<h2>upgradeSkill<a class="headerlink" href="#upgradeskill" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="upgradeSkill">
<code class="descname">upgradeSkill</code><span class="sig-paren">(</span><em>skillName</em><span class="sig-paren">)</span><a class="headerlink" href="#upgradeSkill" 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>skillName</strong> (<em>string</em>) -- Name of Skill to be upgraded. Must be an exact match</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Attempts to upgrade the specified Bladeburner skill. Returns true if the
skill is successfully upgraded, and false otherwise</p>
</dd></dl>
</div>
<div class="section" id="getteamsize">
<h2>getTeamSize<a class="headerlink" href="#getteamsize" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getTeamSize">
<code class="descname">getTeamSize</code><span class="sig-paren">(</span><em>type</em>, <em>name</em><span class="sig-paren">)</span><a class="headerlink" href="#getTeamSize" 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>type</strong> (<em>string</em>) -- Type of action. See <a class="reference internal" href="#bladeburner-action-types"><span class="std std-ref">Bladeburner Action Types</span></a></li>
<li><strong>name</strong> (<em>string</em>) -- Name of action. Must be an exact match</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Returns the number of Bladeburner team members you have assigned to the
specified action.</p>
<p>Setting a team is only applicable for Operations and BlackOps. This function
will return 0 for other action types.</p>
</dd></dl>
</div>
<div class="section" id="setteamsize">
<h2>setTeamSize<a class="headerlink" href="#setteamsize" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="setTeamSize">
<code class="descname">setTeamSize</code><span class="sig-paren">(</span><em>type</em>, <em>name</em>, <em>size</em><span class="sig-paren">)</span><a class="headerlink" href="#setTeamSize" 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>type</strong> (<em>string</em>) -- Type of action. See <a class="reference internal" href="#bladeburner-action-types"><span class="std std-ref">Bladeburner Action Types</span></a></li>
<li><strong>name</strong> (<em>string</em>) -- Name of action. Must be an exact match</li>
<li><strong>size</strong> (<em>int</em>) -- Number of team members to set. Will be converted using Math.round()</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Set the team size for the specified Bladeburner action.</p>
<p>Returns the team size that was set, or -1 if the function failed.</p>
</dd></dl>
</div>
<div class="section" id="getcityestimatedpopulation">
<h2>getCityEstimatedPopulation<a class="headerlink" href="#getcityestimatedpopulation" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getCityEstimatedPopulation">
<code class="descname">getCityEstimatedPopulation</code><span class="sig-paren">(</span><em>cityName</em><span class="sig-paren">)</span><a class="headerlink" href="#getCityEstimatedPopulation" 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>) -- Name of city. Case-sensitive</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Returns the estimated number of Synthoids in the specified city, or -1
if an invalid city was specified.</p>
</dd></dl>
</div>
<div class="section" id="getcityestimatedcommunities">
<h2>getCityEstimatedCommunities<a class="headerlink" href="#getcityestimatedcommunities" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getCityEstimatedCommunities">
<code class="descname">getCityEstimatedCommunities</code><span class="sig-paren">(</span><em>cityName</em><span class="sig-paren">)</span><a class="headerlink" href="#getCityEstimatedCommunities" 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>) -- Name of city. Case-sensitive</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Returns the estimated number of Synthoid communities in the specified city,
or -1 if an invalid city was specified.</p>
</dd></dl>
</div>
<div class="section" id="getcitychaos">
<h2>getCityChaos<a class="headerlink" href="#getcitychaos" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getCityChaos">
<code class="descname">getCityChaos</code><span class="sig-paren">(</span><em>cityName</em><span class="sig-paren">)</span><a class="headerlink" href="#getCityChaos" 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>) -- Name of city. Case-sensitive</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Returns the chaos in the specified city, or -1 if an invalid city was specified</p>
</dd></dl>
</div>
<div class="section" id="switchcity">
<h2>switchCity<a class="headerlink" href="#switchcity" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="switchCity">
<code class="descname">switchCity</code><span class="sig-paren">(</span><em>cityName</em><span class="sig-paren">)</span><a class="headerlink" href="#switchCity" 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>) -- Name of city</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>Attempts to switch to the specified city (for Bladeburner only).</p>
<p>Returns true if successful, and false otherwise</p>
</dd></dl>
</div>
<div class="section" id="getstamina">
<h2>getStamina<a class="headerlink" href="#getstamina" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="getStamina">
<code class="descname">getStamina</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#getStamina" title="Permalink to this definition"></a></dt>
<dd><p>Returns an array with two elements:</p>
<blockquote>
<div>[Current stamina, Max stamina]</div></blockquote>
<p>Example usage:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">function</span> <span class="n">getStaminaPercentage</span><span class="p">()</span> <span class="p">{</span>
<span class="n">let</span> <span class="n">res</span> <span class="o">=</span> <span class="n">bladeburner</span><span class="o">.</span><span class="n">getStamina</span><span class="p">();</span>
<span class="k">return</span> <span class="n">res</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">/</span> <span class="n">res</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
<span class="p">}</span>
</pre></div>
</div>
</dd></dl>
</div>
<div class="section" id="joinbladeburnerfaction">
<h2>joinBladeburnerFaction<a class="headerlink" href="#joinbladeburnerfaction" title="Permalink to this headline"></a></h2>
<dl class="function">
<dt id="joinBladeburnerFaction">
<code class="descname">joinBladeburnerFaction</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#joinBladeburnerFaction" title="Permalink to this definition"></a></dt>
<dd><p>Attempts to join the Bladeburner faction.</p>
<p>Returns true if you successfully join the Bladeburner faction, or if
you are already a member.</p>
<p>Returns false otherwise.</p>
</dd></dl>
</div>
<div class="section" id="examples">
<h2>Examples<a class="headerlink" href="#examples" title="Permalink to this headline"></a></h2>
<p><strong>Basic example usage</strong>:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">tprint</span><span class="p">(</span><span class="n">bladeburner</span><span class="o">.</span><span class="n">getContractNames</span><span class="p">());</span>
<span class="n">tprint</span><span class="p">(</span><span class="n">bladeburner</span><span class="o">.</span><span class="n">getOperationNames</span><span class="p">());</span>
<span class="n">tprint</span><span class="p">(</span><span class="n">bladeburner</span><span class="o">.</span><span class="n">getBlackOpNames</span><span class="p">());</span>
<span class="n">tprint</span><span class="p">(</span><span class="n">bladeburner</span><span class="o">.</span><span class="n">getGeneralActionNames</span><span class="p">());</span>
<span class="n">tprint</span><span class="p">(</span><span class="n">bladeburner</span><span class="o">.</span><span class="n">getSkillNames</span><span class="p">());</span>
<span class="n">tprint</span><span class="p">(</span><span class="n">bladeburner</span><span class="o">.</span><span class="n">getActionTime</span><span class="p">(</span><span class="s2">&quot;contract&quot;</span><span class="p">,</span> <span class="s2">&quot;Tracking&quot;</span><span class="p">));</span>
<span class="n">tprint</span><span class="p">(</span><span class="s2">&quot;Rank: &quot;</span> <span class="o">+</span> <span class="n">bladeburner</span><span class="o">.</span><span class="n">getRank</span><span class="p">());</span>
<span class="n">tprint</span><span class="p">(</span><span class="s2">&quot;Skill Points: &quot;</span> <span class="o">+</span> <span class="n">bladeburner</span><span class="o">.</span><span class="n">getSkillPoints</span><span class="p">());</span>
<span class="n">tprint</span><span class="p">(</span><span class="s2">&quot;Cloak Skill Level: &quot;</span> <span class="o">+</span> <span class="n">bladeburner</span><span class="o">.</span><span class="n">getSkillLevel</span><span class="p">(</span><span class="s2">&quot;Cloak&quot;</span><span class="p">));</span>
<span class="n">tprint</span><span class="p">(</span><span class="s2">&quot;Trying to upgradeSkill: &quot;</span> <span class="o">+</span> <span class="n">bladeburner</span><span class="o">.</span><span class="n">upgradeSkill</span><span class="p">(</span><span class="s2">&quot;Cloak&quot;</span><span class="p">));</span>
<span class="n">tprint</span><span class="p">(</span><span class="s2">&quot;Skill Points remaining: &quot;</span> <span class="o">+</span> <span class="n">bladeburner</span><span class="o">.</span><span class="n">getSkillPoints</span><span class="p">());</span>
<span class="n">tprint</span><span class="p">(</span><span class="s2">&quot;Trying to switch to a nonexistent city: &quot;</span> <span class="o">+</span> <span class="n">bladeburner</span><span class="o">.</span><span class="n">switchCity</span><span class="p">(</span><span class="s2">&quot;lskgns&quot;</span><span class="p">));</span>
<span class="n">var</span> <span class="n">chongqing</span> <span class="o">=</span> <span class="s2">&quot;Chongqing&quot;</span><span class="p">;</span>
<span class="n">tprint</span><span class="p">(</span><span class="s2">&quot;Trying to switch to Chongqing: &quot;</span> <span class="o">+</span> <span class="n">bladeburner</span><span class="o">.</span><span class="n">switchCity</span><span class="p">(</span><span class="n">chongqing</span><span class="p">));</span>
<span class="n">tprint</span><span class="p">(</span><span class="s2">&quot;Chongqing chaos: &quot;</span> <span class="o">+</span> <span class="n">bladeburner</span><span class="o">.</span><span class="n">getCityChaos</span><span class="p">(</span><span class="n">chongqing</span><span class="p">));</span>
<span class="n">tprint</span><span class="p">(</span><span class="s2">&quot;Chongqing estimated pop: &quot;</span> <span class="o">+</span> <span class="n">bladeburner</span><span class="o">.</span><span class="n">getCityEstimatedPopulation</span><span class="p">(</span><span class="n">chongqing</span><span class="p">));</span>
<span class="n">tprint</span><span class="p">(</span><span class="s2">&quot;Chonqging estimated communities: &quot;</span> <span class="o">+</span> <span class="n">bladeburner</span><span class="o">.</span><span class="n">getCityEstimatedCommunities</span><span class="p">(</span><span class="n">chongqing</span><span class="p">));</span>
</pre></div>
</div>
<p><strong>Bladeburner handler example</strong>. Note that this avoids the need of using the <em>bladeburner</em> namespace
identifier by attaching the Bladeburner API functions to an object:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span>const FIELD_ANALYSIS_INTERVAL = 10; //Number of minutes between field analysis states
const FIELD_ANALYSIS_DURATION = 5; //Duration in minutes
function BladeburnerHandler(ns, params) {
//Netscript environment becomes part of the instance
this.ns = ns;
//Netscript bladeburner API becomes part of this instance
for (var bladeburnerFn in ns.bladeburner) {
this[bladeburnerFn] = ns.bladeburner[bladeburnerFn];
}
this.fieldAnalysis = {
inProgress: params.startFieldAnalysis ? true : false,
cyclesRemaining: FIELD_ANALYSIS_DURATION,
cyclesSince: FIELD_ANALYSIS_INTERVAL
}
}
BladeburnerHandler.prototype.getStaminaPercentage = function() {
var res = this.getStamina();
return 100 * (res[0] / res[1]);
}
BladeburnerHandler.prototype.hasSimulacrum = function() {
var augs = this.ns.getOwnedAugmentations();
return augs.includes(&quot;The Blade&#39;s Simulacrum&quot;);
}
BladeburnerHandler.prototype.handle = function() {
//If we&#39;re doing something else manually (without Simlacrum),
//it overrides Bladeburner stuff
if (!this.hasSimulacrum() &amp;&amp; this.ns.isBusy()) {
this.ns.print(&quot;Idling bc player is busy with some other action&quot;);
return;
}
if (this.fieldAnalysis.inProgress) {
--(this.fieldAnalysis.cyclesRemaining);
if (this.fieldAnalysis.cyclesRemaining &lt; 0) {
this.fieldAnalysis.inProgress = false;
this.fieldAnalysis.cyclesSince = 0;
return this.handle();
} else {
this.startAction(&quot;general&quot;, &quot;Field Analysis&quot;);
this.ns.print(&quot;handler is doing field analyis for &quot; +
(this.fieldAnalysis.cyclesRemaining+1) + &quot; more mins&quot;);
return;
}
} else {
++(this.fieldAnalysis.cyclesSince);
if (this.fieldAnalysis.cyclesSince &gt; FIELD_ANALYSIS_INTERVAL) {
this.fieldAnalysis.inProgress = true;
this.fieldAnalysis.cyclesRemaining = FIELD_ANALYSIS_DURATION;
return this.handle();
}
}
this.stopBladeburnerAction();
var staminaPerc = this.getStaminaPercentage();
if (staminaPerc &lt; 55) {
this.ns.print(&quot;handler is starting training due to low stamina percentage&quot;);
this.startAction(&quot;general&quot;, &quot;Training&quot;);
} else {
var action = this.chooseAction();
this.ns.print(&quot;handler chose &quot; + action.name + &quot; &quot; + action.type + &quot; through chooseAction()&quot;);
this.startAction(action.type, action.name);
}
}
BladeburnerHandler.prototype.chooseAction = function() {
//Array of all Operations
var ops = this.getOperationNames();
//Sort Operations in order of increasing success chance
ops.sort((a, b)=&gt;{
return this.getActionEstimatedSuccessChance(&quot;operation&quot;, a) -
this.getActionEstimatedSuccessChance(&quot;operation&quot;, b);
});
//Loop through until you find one with 99+% success chance
for (let i = 0; i &lt; ops.length; ++i) {
let successChance = this.getActionEstimatedSuccessChance(&quot;operation&quot;, ops[i]);
let count = this.getActionCountRemaining(&quot;operation&quot;, ops[i]);
if (successChance &gt;= 0.99 &amp;&amp; count &gt; 10) {
return {type: &quot;operation&quot;, name: ops[i]};
}
}
//Repeat for Contracts
var contracts = this.getContractNames();
contracts.sort((a, b)=&gt;{
return this.getActionEstimatedSuccessChance(&quot;contract&quot;, a) -
this.getActionEstimatedSuccessChance(&quot;contract&quot;, b);
});
for (let i = 0; i &lt; contracts.length; ++i) {
let successChance = this.getActionEstimatedSuccessChance(&quot;contract&quot;, contracts[i]);
let count = this.getActionCountRemaining(&quot;contract&quot;, contracts[i]);
if (successChance &gt;= 0.80 &amp;&amp; count &gt; 10) {
return {type: &quot;contract&quot;, name: contracts[i]};
}
}
return {type:&quot;general&quot;, name:&quot;Training&quot;};
}
BladeburnerHandler.prototype.process = async function() {
this.handle();
await this.ns.sleep(60000);
}
export async function main(ns) {
ns.disableLog(&quot;sleep&quot;);
//Check if Bladeburner is available. This&#39;ll throw a runtime error if it&#39;s not
ns.bladeburner.getContractNames();
var startFieldAnalysis = true;
if (ns.args.length &gt;= 1 &amp;&amp; ns.args[0] == &quot;false&quot;) {
startFieldAnalysis = false;
}
var handler = new BladeburnerHandler(ns, {
startFieldAnalysis: startFieldAnalysis
});
while(true) {
await handler.process();
}
}
</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="netscriptjs.html"> NetscriptJS (Netscript 2.0)</a></li>
<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>
<li class="toctree-l2 current"><a class="current reference internal" href="#"> Bladeburner API</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#bladeburner-action-types">Bladeburner Action Types</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getcontractnames">getContractNames</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getoperationnames">getOperationNames</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getblackopnames">getBlackOpNames</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getgeneralactionnames">getGeneralActionNames</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getskillnames">getSkillNames</a></li>
<li class="toctree-l3"><a class="reference internal" href="#startaction">startAction</a></li>
<li class="toctree-l3"><a class="reference internal" href="#stopbladeburneraction">stopBladeburnerAction</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getactiontime">getActionTime</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getactionestimatedsuccesschance">getActionEstimatedSuccessChance</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getactioncountremaining">getActionCountRemaining</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getrank">getRank</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getskillpoints">getSkillPoints</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getskilllevel">getSkillLevel</a></li>
<li class="toctree-l3"><a class="reference internal" href="#upgradeskill">upgradeSkill</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getteamsize">getTeamSize</a></li>
<li class="toctree-l3"><a class="reference internal" href="#setteamsize">setTeamSize</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getcityestimatedpopulation">getCityEstimatedPopulation</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getcityestimatedcommunities">getCityEstimatedCommunities</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getcitychaos">getCityChaos</a></li>
<li class="toctree-l3"><a class="reference internal" href="#switchcity">switchCity</a></li>
<li class="toctree-l3"><a class="reference internal" href="#getstamina">getStamina</a></li>
<li class="toctree-l3"><a class="reference internal" href="#joinbladeburnerfaction">joinBladeburnerFaction</a></li>
<li class="toctree-l3"><a class="reference internal" href="#examples">Examples</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="netscriptmisc.html"> Miscellaneous</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="terminal.html"> Terminal</a></li>
<li class="toctree-l1"><a class="reference internal" href="shortcuts.html"> Keyboard Shortcuts</a></li>
<li class="toctree-l1"><a class="reference internal" href="changelog.html"> Changelog</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="netscriptsingularityfunctions.html" title="Netscript Singularity Functions"
>previous</a> |
<a href="netscriptmisc.html" title="Netscript Miscellaneous"
>next</a> |
<a href="genindex.html" title="General Index"
>index</a>
</div>
<div role="note" aria-label="source link">
<br/>
<a href="_sources/netscriptbladeburnerapi.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>

@ -1567,7 +1567,10 @@ false if the player clicks &quot;No&quot;. The script's execution is halted unti
<div class="section" id="defining-your-own-functions">
<h3>Defining your own Functions<a class="headerlink" href="#defining-your-own-functions" title="Permalink to this headline"></a></h3>
<p>You can define your own functions in Netscript using the following syntax:</p>
<p>Note that the following information is only applicable for Netscript 1.0.
<a class="reference internal" href="netscriptjs.html"><span class="doc">NetscriptJS (Netscript 2.0)</span></a> allows you to define your functions using native Javascript
techniques.</p>
<p>You can define your own functions in Netscript 1.0 using the following syntax:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">function</span> <span class="n">name</span><span class="p">(</span><span class="n">args</span><span class="o">...</span><span class="p">)</span> <span class="p">{</span>
<span class="n">function</span> <span class="n">code</span> <span class="n">here</span><span class="o">...</span>
<span class="k">return</span> <span class="n">some_value</span>
@ -1738,6 +1741,7 @@ you create in functions such as <a class="reference external" href="https://deve
<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>
<li class="toctree-l2"><a class="reference internal" href="netscriptbladeburnerapi.html"> Bladeburner API</a></li>
<li class="toctree-l2"><a class="reference internal" href="netscriptmisc.html"> Miscellaneous</a></li>
</ul>
</li>

Binary file not shown.

File diff suppressed because one or more lines are too long

@ -3,6 +3,22 @@
Changelog
=========
v0.39.0 - 6/25/2018
-------------------
* Added BitNode-7: Bladeburner 2079
* Infiltration base difficulty decreased by 10% for most locations
* Experience gains from Infiltration slightly increased
* Money gained from Infiltration increased by 20%
* Added 'var' declarations in Netscript 1.0 (only works with 'var', not 'let' or 'const')
* Script base RAM cost is now 1.6 GB (increased from 1.4 GB)
* While/for loops and if statements no longer cost RAM in scripts
* Made short-circuit evaluation logic more consistent in Netscript 1.0 (see https://github.com/danielyxie/bitburner/issues/308)
* Changelog button in the Options menu now links to the new Changelog URL (by Github user thePalindrome)
* Skill level calculation is now 'smoother' (by Github user hydroflame)
* Added a button to 'beautify' scripts in the text editor (by Github user hydroflame)
* Added favicon (by Github user kopelli)
v0.38.1 - 6/15/2018
-------------------
* Bug Fix: Using 'Object.prototype' functions like toLocaleString() or toString() should no longer cause errors in NetscriptJS
@ -17,7 +33,6 @@ v0.38.1 - 6/15/2018
* Bug Fix: serverExists() Netscript function should now properly return false for non-existent hostname/ips
* Bug Fix: Sever's security level should now properly increase when its money is grown to max value
v0.38.0 - 6/12/2018
-------------------
* New BitNode: BN-12 The Recursion - Implemented by Github user hydroflame

@ -24,4 +24,5 @@ to reach out to the developer!
Hacknet Node API <netscripthacknetnodeapi>
Trade Information eXchange (TIX) API <netscriptixapi>
Singularity Functions <netscriptsingularityfunctions>
Bladeburner API <netscriptbladeburnerapi>
Miscellaneous <netscriptmisc>

@ -0,0 +1,446 @@
Netscript Bladeburner API
=========================
Netscript provides the following API for interacting with the game's Bladeburner mechanic.
The Bladeburner API is **not** immediately available to the palyer and must be unlocked
later in the game
**WARNING: This page contains spoilers for the game**
The Bladeburner API is unlocked in BitNode-7. If you are in BitNode-7, you will
automatically gain access to this API. Otherwise, you must have Source-File 7 in
order to use this API in other BitNodes
**Bladeburner API functions must be accessed through the bladeburner namespace**
In Netscript 1.0::
bladeburner.getContractNames();
bladeburner.startAction("general", "Training");
In :ref:`netscriptjs`::
ns.bladeburner.getContractNames();
ns.bladeburner.startAction("general", "Training");
.. _bladeburner_action_types:
Bladeburner Action Types
------------------------
Several functions in the Bladeburner API require you to specify an action using
its type and name. The following are valid values when specifying the action's type:
**Contracts**
* contract
* contracts
* contr
**Operations**
* operation
* operations
* op
* ops
**Black Ops**
* blackoperation
* black operation
* black operations
* black op
* black ops
* blackop
* blackops
**General Actions (Training, Field Analysis, Recruitment)**
* general
* general action
* gen
getContractNames
----------------
.. js:function:: getContractNames()
Returns an array of strings containing the names of all Bladeburner contracts
getOperationNames
-----------------
.. js:function:: getOperationNames()
Returns an array of strings containing the names of all Bladeburner operations
getBlackOpNames
---------------
.. js:function:: getBlackOpNames()
Returns an array of strings containing the names of all Bladeburner Black Ops
getGeneralActionNames
---------------------
.. js:function:: getGeneralActionNames()
Returns an array of strings containing the names of all general Bladeburner actions
getSkillNames
-------------
.. js:function:: getSkillNames()
Returns an array of strings containing the names of all Bladeburner skills
startAction
-----------
.. js:function:: startAction(type, name)
:param string type: Type of action. See :ref:`bladeburner_action_types`
:param string name: Name of action. Must be an exact match
Attempts to start the specified Bladeburner action. Returns true if the action
was started successfully, and false otherwise.
stopBladeburnerAction
---------------------
.. js:function:: stopBladeburnerAction()
Stops the current Bladeburner action
getActionTime
-------------
.. js:function:: getActionTime(type, name)
:param string type: Type of action. See :ref:`bladeburner_action_types`
:param string name: Name of action. Must be an exact match
Returns the number of seconds it takes to complete the specified action
getActionEstimatedSuccessChance
-------------------------------
.. js:function:: getActionEstimatedSuccessChance(type, name)
:param string type: Type of action. See :ref:`bladeburner_action_types`
:param string name: Name of action. Must be an exact match
Returns the estimated success chance for the specified action
getActionCountRemaining
-----------------------
.. js:function:: getActionCountRemaining(type, name)
:param string type: Type of action. See :ref:`bladeburner_action_types`
:param string name: Name of action. Must be an exact match
Returns the remaining count of the specified action.
Note that this is meant to be used for Contracts and Operations.
This function will return 'Infinity' for actions such as Training and Field Analysis.
getRank
-------
.. js:function:: getRank()
Returns the player's Bladeburner Rank
getSkillPoints
--------------
.. js:function:: getSkillPoints()
Returns the number of Bladeburner skill points you have
getSkillLevel
-------------
.. js:function:: getSkillLevel(skillName="")
:param string skillName: Optional name of Skill. Empty string by default
If no argument or an empty string is passed in, this function returns
an object with your level for all Bladeburner Skills (only for skills that
have at least one level). In the object, the name of the Bladeburner Skills
are the keys and your skill levels are the values. For example::
{
"Blade's Intuition": 10,
"Cloak": 5,
"Evasive System": 6
}
If the name of a skill is passed in as an argument, then this function
returns your level in the specified skill.
The function returns -1 if an invalid skill name is passed in
upgradeSkill
------------
.. js:function:: upgradeSkill(skillName)
:param string skillName: Name of Skill to be upgraded. Must be an exact match
Attempts to upgrade the specified Bladeburner skill. Returns true if the
skill is successfully upgraded, and false otherwise
getTeamSize
-----------
.. js:function:: getTeamSize(type, name)
:param string type: Type of action. See :ref:`bladeburner_action_types`
:param string name: Name of action. Must be an exact match
Returns the number of Bladeburner team members you have assigned to the
specified action.
Setting a team is only applicable for Operations and BlackOps. This function
will return 0 for other action types.
setTeamSize
-----------
.. js:function:: setTeamSize(type, name, size)
:param string type: Type of action. See :ref:`bladeburner_action_types`
:param string name: Name of action. Must be an exact match
:param int size: Number of team members to set. Will be converted using Math.round()
Set the team size for the specified Bladeburner action.
Returns the team size that was set, or -1 if the function failed.
getCityEstimatedPopulation
--------------------------
.. js:function:: getCityEstimatedPopulation(cityName)
:param string cityName: Name of city. Case-sensitive
Returns the estimated number of Synthoids in the specified city, or -1
if an invalid city was specified.
getCityEstimatedCommunities
---------------------------
.. js:function:: getCityEstimatedCommunities(cityName)
:param string cityName: Name of city. Case-sensitive
Returns the estimated number of Synthoid communities in the specified city,
or -1 if an invalid city was specified.
getCityChaos
------------
.. js:function:: getCityChaos(cityName)
:param string cityName: Name of city. Case-sensitive
Returns the chaos in the specified city, or -1 if an invalid city was specified
switchCity
----------
.. js:function:: switchCity(cityName)
:param string cityName: Name of city
Attempts to switch to the specified city (for Bladeburner only).
Returns true if successful, and false otherwise
getStamina
----------
.. js:function:: getStamina()
Returns an array with two elements:
[Current stamina, Max stamina]
Example usage::
function getStaminaPercentage() {
let res = bladeburner.getStamina();
return res[0] / res[1];
}
joinBladeburnerFaction
----------------------
.. js:function:: joinBladeburnerFaction()
Attempts to join the Bladeburner faction.
Returns true if you successfully join the Bladeburner faction, or if
you are already a member.
Returns false otherwise.
Examples
--------
**Basic example usage**::
tprint(bladeburner.getContractNames());
tprint(bladeburner.getOperationNames());
tprint(bladeburner.getBlackOpNames());
tprint(bladeburner.getGeneralActionNames());
tprint(bladeburner.getSkillNames());
tprint(bladeburner.getActionTime("contract", "Tracking"));
tprint("Rank: " + bladeburner.getRank());
tprint("Skill Points: " + bladeburner.getSkillPoints());
tprint("Cloak Skill Level: " + bladeburner.getSkillLevel("Cloak"));
tprint("Trying to upgradeSkill: " + bladeburner.upgradeSkill("Cloak"));
tprint("Skill Points remaining: " + bladeburner.getSkillPoints());
tprint("Trying to switch to a nonexistent city: " + bladeburner.switchCity("lskgns"));
var chongqing = "Chongqing";
tprint("Trying to switch to Chongqing: " + bladeburner.switchCity(chongqing));
tprint("Chongqing chaos: " + bladeburner.getCityChaos(chongqing));
tprint("Chongqing estimated pop: " + bladeburner.getCityEstimatedPopulation(chongqing));
tprint("Chonqging estimated communities: " + bladeburner.getCityEstimatedCommunities(chongqing));
**Bladeburner handler example**. Note that this avoids the need of using the *bladeburner* namespace
identifier by attaching the Bladeburner API functions to an object::
const FIELD_ANALYSIS_INTERVAL = 10; //Number of minutes between field analysis states
const FIELD_ANALYSIS_DURATION = 5; //Duration in minutes
function BladeburnerHandler(ns, params) {
//Netscript environment becomes part of the instance
this.ns = ns;
//Netscript bladeburner API becomes part of this instance
for (var bladeburnerFn in ns.bladeburner) {
this[bladeburnerFn] = ns.bladeburner[bladeburnerFn];
}
this.fieldAnalysis = {
inProgress: params.startFieldAnalysis ? true : false,
cyclesRemaining: FIELD_ANALYSIS_DURATION,
cyclesSince: FIELD_ANALYSIS_INTERVAL
}
}
BladeburnerHandler.prototype.getStaminaPercentage = function() {
var res = this.getStamina();
return 100 * (res[0] / res[1]);
}
BladeburnerHandler.prototype.hasSimulacrum = function() {
var augs = this.ns.getOwnedAugmentations();
return augs.includes("The Blade's Simulacrum");
}
BladeburnerHandler.prototype.handle = function() {
//If we're doing something else manually (without Simlacrum),
//it overrides Bladeburner stuff
if (!this.hasSimulacrum() && this.ns.isBusy()) {
this.ns.print("Idling bc player is busy with some other action");
return;
}
if (this.fieldAnalysis.inProgress) {
--(this.fieldAnalysis.cyclesRemaining);
if (this.fieldAnalysis.cyclesRemaining < 0) {
this.fieldAnalysis.inProgress = false;
this.fieldAnalysis.cyclesSince = 0;
return this.handle();
} else {
this.startAction("general", "Field Analysis");
this.ns.print("handler is doing field analyis for " +
(this.fieldAnalysis.cyclesRemaining+1) + " more mins");
return;
}
} else {
++(this.fieldAnalysis.cyclesSince);
if (this.fieldAnalysis.cyclesSince > FIELD_ANALYSIS_INTERVAL) {
this.fieldAnalysis.inProgress = true;
this.fieldAnalysis.cyclesRemaining = FIELD_ANALYSIS_DURATION;
return this.handle();
}
}
this.stopBladeburnerAction();
var staminaPerc = this.getStaminaPercentage();
if (staminaPerc < 55) {
this.ns.print("handler is starting training due to low stamina percentage");
this.startAction("general", "Training");
} else {
var action = this.chooseAction();
this.ns.print("handler chose " + action.name + " " + action.type + " through chooseAction()");
this.startAction(action.type, action.name);
}
}
BladeburnerHandler.prototype.chooseAction = function() {
//Array of all Operations
var ops = this.getOperationNames();
//Sort Operations in order of increasing success chance
ops.sort((a, b)=>{
return this.getActionEstimatedSuccessChance("operation", a) -
this.getActionEstimatedSuccessChance("operation", b);
});
//Loop through until you find one with 99+% success chance
for (let i = 0; i < ops.length; ++i) {
let successChance = this.getActionEstimatedSuccessChance("operation", ops[i]);
let count = this.getActionCountRemaining("operation", ops[i]);
if (successChance >= 0.99 && count > 10) {
return {type: "operation", name: ops[i]};
}
}
//Repeat for Contracts
var contracts = this.getContractNames();
contracts.sort((a, b)=>{
return this.getActionEstimatedSuccessChance("contract", a) -
this.getActionEstimatedSuccessChance("contract", b);
});
for (let i = 0; i < contracts.length; ++i) {
let successChance = this.getActionEstimatedSuccessChance("contract", contracts[i]);
let count = this.getActionCountRemaining("contract", contracts[i]);
if (successChance >= 0.80 && count > 10) {
return {type: "contract", name: contracts[i]};
}
}
return {type:"general", name:"Training"};
}
BladeburnerHandler.prototype.process = async function() {
this.handle();
await this.ns.sleep(60000);
}
export async function main(ns) {
ns.disableLog("sleep");
//Check if Bladeburner is available. This'll throw a runtime error if it's not
ns.bladeburner.getContractNames();
var startFieldAnalysis = true;
if (ns.args.length >= 1 && ns.args[0] == "false") {
startFieldAnalysis = false;
}
var handler = new BladeburnerHandler(ns, {
startFieldAnalysis: startFieldAnalysis
});
while(true) {
await handler.process();
}
}

@ -942,7 +942,11 @@ prompt
Defining your own Functions
---------------------------
You can define your own functions in Netscript using the following syntax::
Note that the following information is only applicable for Netscript 1.0.
:doc:`netscriptjs` allows you to define your functions using native Javascript
techniques.
You can define your own functions in Netscript 1.0 using the following syntax::
function name(args...) {
function code here...

@ -886,6 +886,17 @@
<input type="checkbox" name="settingsSuppressTravelConfirmation" id="settingsSuppressTravelConfirmation">
</fieldset>
<!-- Suppress buy aug confirmation -->
<fieldset>
<label for="settingsSuppressBuyAugmentationConfirmation" class="tooltip">Suppress buy augmentation confirmation:
<span class="tooltiptext">
If this is set, the confirmation message before buying augmentation will not show up.
</span>
</label>
<input type="checkbox" name="settingsSuppressBuyAugmentationConfirmation" id="settingsSuppressBuyAugmentationConfirmation">
</fieldset>
<!-- Disable Terminal and Navigation Shortcuts -->
<fieldset>
<label for="settingsDisableHotkeys" class="tooltip">Disable Hotkeys:

@ -86,7 +86,16 @@ let NetscriptFunctions =
"installAugmentations|hacknetnodes|upgradeLevel|upgradeRam|upgradeCore|" +
"getLevelUpgradeCost|getRamUpgradeCost|getCoreUpgradeCost|" +
"getStockPrice|getStockPosition|buyStock|sellStock|shortStock|sellShort|" +
"placeOrder|cancelOrder";
"placeOrder|cancelOrder|" +
//Bladeburner functions
"bladeburner|getContractNames|getOperationNames|getBlackOpNames|" +
"getGeneralActionNames|getSkillNames|startAction|stopBladeburnerAction|" +
"getActionTime|getActionEstimatedSuccessChance|getActionCountRemaining|" +
"getRank|getSkillPoints|getSkillLevel|upgradeSkill|getTeamSize|" +
"setTeamSize|getCityEstimatedPopulation|getCityEstimatedCommunities|" +
"getCityChaos|switchCity|getStamina|joinBladeburnerFaction"
;
var NetscriptHighlightRules = function(options) {
var keywordMapper = this.createKeywordMapper({

1955
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -62,6 +62,9 @@
"sinon": "^2.3.2",
"source-map": "^0.7.3",
"style-loader": "^0.21.0",
"stylelint": "^9.2.1",
"stylelint-declaration-use-variable": "^1.6.1",
"stylelint-order": "^0.8.1",
"ts-loader": "^4.4.1",
"tslint": "^5.10.0",
"typescript": "^2.9.2",
@ -84,11 +87,11 @@
"url": "git+https://github.com/danielyxie/bitburner.git"
},
"scripts": {
"lint:js": "eslint *.js src utils tests",
"start:dev": "webpack-dev-server",
"build": "webpack --mode production",
"build:dev": "webpack --mode development",
"lint:javascript": "eslint ./src/**/*.js ./tests/**/*.js ./utils/**/*.js",
"lint:javascript": "eslint *.js ./src/**/*.js ./tests/**/*.js ./utils/**/*.js",
"lint:style": "stylelint ./css/*",
"lint:typescript": "tslint --project . --exclude **/*.d.ts --format stylish src/**/*.ts utils/**/*.ts",
"watch": "webpack --watch --mode production",
"watch:dev": "webpack --watch --mode development"

@ -1,16 +1,16 @@
import {Engine} from "./engine.js";
import {Engine} from "./engine";
import {workerScripts,
addWorkerScript,
killWorkerScript} from "./NetscriptWorker.js";
import {Player} from "./Player.js";
import {getServer} from "./Server.js";
import {dialogBoxCreate} from "../utils/DialogBox.js";
killWorkerScript} from "./NetscriptWorker";
import {Player} from "./Player";
import {getServer} from "./Server";
import {dialogBoxCreate} from "../utils/DialogBox";
import {printArray, createElement,
createAccordionElement, removeElement,
removeChildrenFromElement, exceptionAlert} from "../utils/HelperFunctions.js";
import {logBoxCreate} from "../utils/LogBox.js";
removeChildrenFromElement, exceptionAlert} from "../utils/HelperFunctions";
import {logBoxCreate} from "../utils/LogBox";
import numeral from "numeral/min/numeral.min";
import {formatNumber} from "../utils/StringHelperFunctions.js";
import {formatNumber} from "../utils/StringHelperFunctions";
/* {
* serverName: {

@ -1,4 +1,4 @@
import {post} from "./Terminal.js";
import {post} from "./Terminal";
let Aliases = {};
let GlobalAliases = {};

@ -1,22 +1,22 @@
import {BitNodeMultipliers} from "./BitNode.js";
import {CONSTANTS} from "./Constants.js";
import {Engine} from "./engine.js";
import {BitNodeMultipliers} from "./BitNode";
import {CONSTANTS} from "./Constants";
import {Engine} from "./engine";
import {Factions, getNextNeurofluxLevel,
factionExists} from "./Faction.js";
import {hasBladeburnerSF} from "./NetscriptFunctions.js";
import {addWorkerScript} from "./NetscriptWorker.js";
import {Player} from "./Player.js";
import {prestigeAugmentation} from "./Prestige.js";
import {saveObject} from "./SaveObject.js";
import {Script, RunningScript} from "./Script.js";
import {Server} from "./Server.js";
import {SourceFiles} from "./SourceFile.js";
import {dialogBoxCreate} from "../utils/DialogBox.js";
factionExists} from "./Faction";
import {hasBladeburnerSF} from "./NetscriptFunctions";
import {addWorkerScript} from "./NetscriptWorker";
import {Player} from "./Player";
import {prestigeAugmentation} from "./Prestige";
import {saveObject} from "./SaveObject";
import {Script, RunningScript} from "./Script";
import {Server} from "./Server";
import {SourceFiles} from "./SourceFile";
import {dialogBoxCreate} from "../utils/DialogBox";
import {createElement, createAccordionElement,
removeChildrenFromElement, clearObject} from "../utils/HelperFunctions.js";
removeChildrenFromElement, clearObject} from "../utils/HelperFunctions";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver.js";
import {isString} from "../utils/StringHelperFunctions.js";
Generic_fromJSON} from "../utils/JSONReviver";
import {isString} from "../utils/StringHelperFunctions";
//Augmentations
function Augmentation(params) {

@ -1,4 +1,4 @@
import {Player} from "./Player.js";
import {Player} from "./Player";
function BitNode(n, name, desc="", info="") {
this.number = n;
@ -132,7 +132,7 @@ function initBitNodes() {
"Corporations have 80% lower valuations and are therefore less profitable<br>" +
"Working for companies is 50% less profitable<br>" +
"Crimes and Infiltration are 50% less profitable<br><br>" +
"Destroying this BitNode will give you Source-File 6, or if you already have this Source-File it will upgrade " +
"Destroying this BitNode will give you Source-File 7, or if you already have this Source-File it will upgrade " +
"its level up to a maximum of 3. This Source-File allows you to access the Bladeburner Netscript API in other " +
"BitNodes. In addition, this Source-File will increase all of your Bladeburner multipliers by:<br><br>" +
"Level 1: 8%<br>" +

@ -1,24 +1,24 @@
import {Augmentations, AugmentationNames} from "./Augmentations.js";
import {BitNodeMultipliers} from "./BitNode.js";
import {CONSTANTS} from "./Constants.js";
import {Engine} from "./engine.js";
import {Augmentations, AugmentationNames} from "./Augmentations";
import {BitNodeMultipliers} from "./BitNode";
import {CONSTANTS} from "./Constants";
import {Engine} from "./engine";
import {Faction, Factions, factionExists,
joinFaction, displayFactionContent} from "./Faction.js";
import {Locations} from "./Location.js";
import {Player} from "./Player.js";
import {hackWorldDaemon, redPillFlag} from "./RedPill.js";
import {KEY} from "./Terminal.js";
joinFaction, displayFactionContent} from "./Faction";
import {Locations} from "./Location";
import {Player} from "./Player";
import {hackWorldDaemon, redPillFlag} from "./RedPill";
import {KEY} from "./Terminal";
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {dialogBoxCreate} from "../utils/DialogBox";
import {getRandomInt, addOffset, clearObject,
createElement, removeChildrenFromElement,
exceptionAlert, createPopup, appendLineBreaks,
removeElementById, removeElement,
createProgressBarText} from "../utils/HelperFunctions.js";
createProgressBarText} from "../utils/HelperFunctions";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver.js";
Generic_fromJSON} from "../utils/JSONReviver";
import numeral from "numeral/min/numeral.min";
import {formatNumber} from "../utils/StringHelperFunctions.js";
import {formatNumber} from "../utils/StringHelperFunctions";
var CityNames = ["Aevum", "Chongqing", "Sector-12", "New Tokyo", "Ishima", "Volhaven"];
@ -3208,6 +3208,7 @@ Bladeburner.prototype.getActionIdFromTypeAndName = function(type="", name="") {
switch (convertedType) {
case "contract":
case "contracts":
case "contr":
action.type = ActionTypes["Contract"];
if (this.contracts.hasOwnProperty(name)) {
action.name = name;
@ -3268,24 +3269,23 @@ Bladeburner.prototype.getActionIdFromTypeAndName = function(type="", name="") {
}
}
Bladeburner.prototype.getContractNamesNetscriptFn = function(name) {
Bladeburner.prototype.getContractNamesNetscriptFn = function() {
return Object.keys(this.contracts);
}
Bladeburner.prototype.getOperationNamesNetscriptFn = function(name) {
Bladeburner.prototype.getOperationNamesNetscriptFn = function() {
return Object.keys(this.operations);
}
Bladeburner.prototype.getBlackOpNamesNetscriptFn = function(name) {
Bladeburner.prototype.getBlackOpNamesNetscriptFn = function() {
return Object.keys(BlackOperations);
}
Bladeburner.prototype.getGeneralActionNamesNetscriptFn = function(name) {
Bladeburner.prototype.getGeneralActionNamesNetscriptFn = function() {
return Object.keys(GeneralActions);
}
Bladeburner.prototype.getSkillNamesNetscriptFn = function(name) {
return Skills.hasOwnProperty(name);
Bladeburner.prototype.getSkillNamesNetscriptFn = function() {
return Object.keys(Skills);
}
@ -3428,7 +3428,11 @@ Bladeburner.prototype.getSkillLevelNetscriptFn = function(skillName, workerScrip
return -1;
}
return Skills[skillName];
if (this.skills[skillName] == null) {
return 0;
} else {
return this.skills[skillName];
}
}
Bladeburner.prototype.upgradeSkillNetscriptFn = function(skillName, workerScript) {
@ -3506,8 +3510,8 @@ Bladeburner.prototype.setTeamSizeNetscriptFn = function(type, name, size, worker
return -1;
}
if (actionId.type !== ActionTypes["Operation"] ||
actionId.type !== ActionTypes["BlackOp"] ||
if (actionId.type !== ActionTypes["Operation"] &&
actionId.type !== ActionTypes["BlackOp"] &&
actionId.type !== ActionTypes["BlackOperation"]) {
workerScript.log("ERROR: Bladeburner.setTeamSize() failed. This function " +
"only works for Operations and BlackOps");

@ -1,8 +1,8 @@
import {Engine} from "./engine.js";
import {Engine} from "./engine";
import {removeChildrenFromElement,
createElement, exceptionAlert} from "../utils/HelperFunctions.js";
import {isString} from "../utils/StringHelperFunctions.js";
createElement, exceptionAlert} from "../utils/HelperFunctions";
import {isString} from "../utils/StringHelperFunctions";
var cinematicTextFlag = false;

@ -1,9 +1,9 @@
import {CONSTANTS} from "./Constants.js";
import {Locations} from "./Location.js";
import {Player} from "./Player.js";
import {CONSTANTS} from "./Constants";
import {Locations} from "./Location";
import {Player} from "./Player";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver.js";
Generic_fromJSON} from "../utils/JSONReviver";
//Netburner Company class
// Note: Company Positions can be loaded every time with init() but Company class needs

@ -1 +0,0 @@
//TODO probably just move this to whatever file needs it then delete this

@ -1,25 +1,25 @@
import {BitNodeMultipliers} from "./BitNode.js";
import {Engine} from "./engine.js";
import {Factions} from "./Faction.js";
import {showLiterature} from "./Literature.js";
import {Locations} from "./Location.js";
import {Player} from "./Player.js";
import {BitNodeMultipliers} from "./BitNode";
import {Engine} from "./engine";
import {Factions} from "./Faction";
import {showLiterature} from "./Literature";
import {Locations} from "./Location";
import {Player} from "./Player";
import Decimal from "decimal.js";
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {dialogBoxCreate} from "../utils/DialogBox";
import {getRandomInt, removeElementById,
createElement, createAccordionElement,
removeChildrenFromElement, createPopup,
clearSelector} from "../utils/HelperFunctions.js";
clearSelector} from "../utils/HelperFunctions";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver.js";
Generic_fromJSON} from "../utils/JSONReviver";
import numeral from "numeral/min/numeral.min";
import {formatNumber, isString, generateRandomString} from "../utils/StringHelperFunctions.js";
import {formatNumber, isString, generateRandomString} from "../utils/StringHelperFunctions";
import {yesNoBoxCreate, yesNoTxtInpBoxCreate,
yesNoBoxGetYesButton, yesNoBoxGetNoButton,
yesNoTxtInpBoxGetYesButton, yesNoTxtInpBoxGetNoButton,
yesNoTxtInpBoxGetInput, yesNoBoxClose,
yesNoTxtInpBoxClose, yesNoBoxOpen} from "../utils/YesNoBox.js";
yesNoTxtInpBoxClose, yesNoBoxOpen} from "../utils/YesNoBox";
/* State */
var companyStates = ["START", "PURCHASE", "PRODUCTION", "SALE", "EXPORT"];

@ -1,5 +1,5 @@
let CONSTANTS = {
Version: "0.38.1",
Version: "0.39.0",
//Max level for any skill, assuming no multipliers. Determined by max numerical value in javascript for experience
//and the skill level formula in Player.js. Note that all this means it that when experience hits MAX_INT, then
@ -106,8 +106,8 @@ let CONSTANTS = {
TorRouterCost: 200000,
//Infiltration constants
InfiltrationBribeBaseAmount: 100000, //Amount per clearance level
InfiltrationMoneyValue: 2500, //Convert "secret" value to money
InfiltrationBribeBaseAmount: 100e3, //Amount per clearance level
InfiltrationMoneyValue: 3e3, //Convert "secret" value to money
InfiltrationRepValue: 1.4, //Convert "secret" value to faction reputation
//Stock market constants
@ -489,15 +489,8 @@ let CONSTANTS = {
"World Stock Exchange account and TIX API Access<br>",
LatestUpdate:
"v0.38.1<br>" +
"* Added 'var' declarations in Netscript 1.0 (only works with 'var', not 'let' or 'const')<br>" +
"* Script base RAM cost is now 1.6 GB (increased from 1.4 GB)<br>" +
"* While/for loops and if statements no longer cost RAM in scripts<br>" +
"* Made short-circuit evaluation logic more consistent in Netscript 1.0 (see https://github.com/danielyxie/bitburner/issues/308)<br>" +
"* Changelog button in the Options menu now links to the new Changelog URL (by Github user thePalindrome)<br>" +
"* Skill level calculation is now 'smoother' (by Github user hydroflame)<br>" +
"* Added a button to 'beautify' scripts in the text editor (by Github user hydroflame)<br>" +
"* Added favicon (by Github user kopelli)"
"v0.39.1<br>" +
"* The setting to suppress the confirmation box when purchasing Augmentations was moved into the main Options menu (by Github user hydroflame)<br>"
}

@ -1,139 +1,128 @@
import {CONSTANTS} from "./Constants.js";
import {Player} from "./Player.js";
import {createElement} from "../utils/HelperFunctions.js";
import {CONSTANTS} from "./Constants";
import {Player} from "./Player";
import {createElement} from "../utils/HelperFunctions";
// a function that returns a requirement for a program that requires only that
// the player has at least the given skill level.
function requireLevel(lvl) {
return function() {
return Player.hacking_skill >= lvl;
}
}
function Program(name, create) {
this.name = name;
this.create = create;
}
Program.prototype.htmlID = function() {
const name = this.name.endsWith('.exe') ? this.name.slice(0, -('.exe'.length)) : this.name;
return "create-program-"+name;
}
/* Create programs */
let Programs = {
NukeProgram: "NUKE.exe",
BruteSSHProgram: "BruteSSH.exe",
FTPCrackProgram: "FTPCrack.exe",
RelaySMTPProgram: "relaySMTP.exe",
HTTPWormProgram: "HTTPWorm.exe",
SQLInjectProgram: "SQLInject.exe",
DeepscanV1: "DeepscanV1.exe",
DeepscanV2: "DeepscanV2.exe",
ServerProfiler: "ServerProfiler.exe",
AutoLink: "AutoLink.exe",
Flight: "fl1ght.exe",
BitFlume: "b1t_flum3.exe"
const Programs = {
NukeProgram: new Program("NUKE.exe", {
level: 1,
tooltip:"This virus is used to gain root access to a machine if enough ports are opened.",
req: requireLevel(1),
time: CONSTANTS.MillisecondsPerFiveMinutes,
}),
BruteSSHProgram: new Program("BruteSSH.exe", {
level: 50,
tooltip:"This program executes a brute force attack that opens SSH ports",
req: requireLevel(50),
time: CONSTANTS.MillisecondsPerFiveMinutes * 2,
}),
FTPCrackProgram: new Program("FTPCrack.exe", {
level: 100,
tooltip:"This program cracks open FTP ports",
req: requireLevel(100),
time: CONSTANTS.MillisecondsPerHalfHour,
}),
RelaySMTPProgram: new Program("relaySMTP.exe", {
level: 250,
tooltip:"This program opens SMTP ports by redirecting data",
req: requireLevel(250),
time: CONSTANTS.MillisecondsPer2Hours,
}),
HTTPWormProgram: new Program("HTTPWorm.exe", {
level: 500,
tooltip:"This virus opens up HTTP ports",
req: requireLevel(500),
time: CONSTANTS.MillisecondsPer4Hours,
}),
SQLInjectProgram: new Program("SQLInject.exe", {
level: 750,
tooltip:"This virus opens SQL ports",
req: requireLevel(750),
time: CONSTANTS.MillisecondsPer8Hours,
}),
DeepscanV1: new Program("DeepscanV1.exe", {
level: 75,
tooltip:"This program allows you to use the scan-analyze command with a depth up to 5",
req: requireLevel(75),
time: CONSTANTS.MillisecondsPerQuarterHour,
}),
DeepscanV2: new Program("DeepscanV2.exe", {
level: 400,
tooltip:"This program allows you to use the scan-analyze command with a depth up to 10",
req: requireLevel(400),
time: CONSTANTS.MillisecondsPer2Hours,
}),
ServerProfiler: new Program("ServerProfiler.exe", {
level: 75,
tooltip:"This program is used to display hacking and Netscript-related information about servers",
req: requireLevel(75),
time: CONSTANTS.MillisecondsPerHalfHour,
}),
AutoLink: new Program("AutoLink.exe", {
level: 25,
tooltip:"This program allows you to directly connect to other servers through the 'scan-analyze' command",
req: requireLevel(25),
time: CONSTANTS.MillisecondsPerQuarterHour,
}),
BitFlume: new Program("b1t_flum3.exe", {
level: 5,
tooltip:"This program creates a portal to the BitNode Nexus (allows you to restart and switch BitNodes)",
req: function() {return Player.sourceFiles.length > 0 && Player.hacking_skill >= 5},
time: CONSTANTS.MillisecondsPerFiveMinutes / 5,
}),
// special because you can't create it.
Flight: new Program("fl1ght.exe"),
};
var nukeALink, bruteSshALink, ftpCrackALink, relaySmtpALink, httpWormALink, sqlInjectALink,
deepscanv1ALink, deepscanv2ALink, servProfilerALink, autolinkALink, bitFlumeALink;
function displayCreateProgramContent() {
nukeALink.style.display = "none";
bruteSshALink.style.display = "none";
ftpCrackALink.style.display = "none";
relaySmtpALink.style.display = "none";
httpWormALink.style.display = "none";
sqlInjectALink.style.display = "none";
deepscanv1ALink.style.display = "none";
deepscanv2ALink.style.display = "none";
servProfilerALink.style.display = "none";
autolinkALink.style.display = "none";
bitFlumeALink.style.display = "none";
// this has the same key as 'Programs', not program names
const aLinks = {};
//NUKE.exe (in case you delete it lol)
if (Player.getHomeComputer().programs.indexOf(Programs.NukeProgram) == -1) {
nukeALink.style.display = "inline-block";
}
//BruteSSH
if (Player.getHomeComputer().programs.indexOf(Programs.BruteSSHProgram) == -1 &&
Player.hacking_skill >= 50) {
bruteSshALink.style.display = "inline-block";
}
//FTPCrack
if (Player.getHomeComputer().programs.indexOf(Programs.FTPCrackProgram) == -1 &&
Player.hacking_skill >= 100) {
ftpCrackALink.style.display = "inline-block";
}
//relaySMTP
if (Player.getHomeComputer().programs.indexOf(Programs.RelaySMTPProgram) == -1 &&
Player.hacking_skill >= 250) {
relaySmtpALink.style.display = "inline-block";
}
//HTTPWorm
if (Player.getHomeComputer().programs.indexOf(Programs.HTTPWormProgram) == -1 &&
Player.hacking_skill >= 500) {
httpWormALink.style.display = "inline-block";
}
//SQLInject
if (Player.getHomeComputer().programs.indexOf(Programs.SQLInjectProgram) == -1 &&
Player.hacking_skill >= 750) {
sqlInjectALink.style.display = "inline-block";
}
//Deepscan V1 and V2
if (!Player.hasProgram(Programs.DeepscanV1) && Player.hacking_skill >= 75) {
deepscanv1ALink.style.display = "inline-block";
}
if (!Player.hasProgram(Programs.DeepscanV2) && Player.hacking_skill >= 400) {
deepscanv2ALink.style.display = "inline-block";
}
//Server profiler
if (!Player.hasProgram(Programs.ServerProfiler) && Player.hacking_skill >= 75) {
servProfilerALink.style.display = "inline-block";
}
//Auto Link
if (!Player.hasProgram(Programs.AutoLink) && Player.hacking_skill >= 25) {
autolinkALink.style.display = "inline-block";
}
//Bit Flume
if (!Player.hasProgram(Programs.BitFlume) && Player.sourceFiles.length > 0 && Player.hacking_skill >= 5) {
bitFlumeALink.style.display = "inline-block";
function displayCreateProgramContent() {
for(const key in aLinks) {
const p = Programs[key]
aLinks[key].style.display = "none";
if(!Player.hasProgram(p.name) && p.create.req()){
aLinks[key].style.display = "inline-block";
}
}
}
//Returns the number of programs that are currently available to be created
function getNumAvailableCreateProgram() {
var count = 0;
//PortHack.exe (in case you delete it lol)
if (Player.getHomeComputer().programs.indexOf(Programs.NukeProgram) == -1) {
++count;
}
//BruteSSH
if (Player.getHomeComputer().programs.indexOf(Programs.BruteSSHProgram) == -1 &&
Player.hacking_skill >= 50) {
++count;
}
//FTPCrack
if (Player.getHomeComputer().programs.indexOf(Programs.FTPCrackProgram) == -1 &&
Player.hacking_skill >= 100) {
++count;
}
//relaySMTP
if (Player.getHomeComputer().programs.indexOf(Programs.RelaySMTPProgram) == -1 &&
Player.hacking_skill >= 250) {
++count;
}
//HTTPWorm
if (Player.getHomeComputer().programs.indexOf(Programs.HTTPWormProgram) == -1 &&
Player.hacking_skill >= 500) {
++count;
}
//SQLInject
if (Player.getHomeComputer().programs.indexOf(Programs.SQLInjectProgram) == -1 &&
Player.hacking_skill >= 750) {
++count;
}
//Deepscan V1 and V2
if (!Player.hasProgram(Programs.DeepscanV1) && Player.hacking_skill >= 75) {
++count;
}
if (!Player.hasProgram(Programs.DeepscanV2) && Player.hacking_skill >= 400) {
++count;
}
//Server profiler
if (!Player.hasProgram(Programs.ServerProfiler) && Player.hacking_skill >= 75) {
++count;
}
//Auto link
if (!Player.hasProgram(Programs.AutoLink) && Player.hacking_skill >= 25) {
++count;
}
//Bit Flume
if (!Player.hasProgram(Programs.BitFlume) && Player.sourceFiles.length > 0 && Player.hacking_skill >= 5) {
++count;
for(const key in Programs) {
if(Programs[key].create === undefined) { // a program we can't create
continue
}
if(Player.hasProgram(Programs[key].name)) { // can't create it twice
continue
}
if(!Programs[key].create.req()) { // if you don't fullfill the creation requirement
continue
}
count++;
}
if (Player.firstProgramAvailable === false && count > 0) {
Player.firstProgramAvailable = true;
document.getElementById("create-program-tab").style.display = "list-item";
@ -145,116 +134,25 @@ function getNumAvailableCreateProgram() {
function initCreateProgramButtons() {
var createProgramList = document.getElementById("create-program-list");
nukeALink = createElement("a", {
class:"a-link-button", id:"create-program-nuke", innerText:Programs.NukeProgram,
tooltip:"This virus is used to gain root access to a machine if enough ports are opened.",
});
createProgramList.appendChild(nukeALink);
for(const key in Programs) {
if(Programs[key].create === undefined) {
continue
}
const elem = createElement("a", {
class: "a-link-button", id: Programs[key].htmlID(), innerText: Programs[key].name,
tooltip: Programs[key].create.tooltip,
});
aLinks[key] = elem;
createProgramList.appendChild(elem);
}
bruteSshALink = createElement("a", {
class:"a-link-button", id:"create-program-brutessh", innerText:Programs.BruteSSHProgram,
tooltip:"This program executes a brute force attack that opens SSH ports"
});
createProgramList.appendChild(bruteSshALink);
ftpCrackALink = createElement("a", {
class:"a-link-button", id:"create-program-ftpcrack", innerText:Programs.FTPCrackProgram,
tooltip:"This program cracks open FTP ports"
});
createProgramList.appendChild(ftpCrackALink);
relaySmtpALink = createElement("a", {
class:"a-link-button", id:"create-program-relaysmtp", innerText:Programs.RelaySMTPProgram,
tooltip:"This program opens SMTP ports by redirecting data"
}) ;
createProgramList.appendChild(relaySmtpALink);
httpWormALink = createElement("a", {
class:"a-link-button", id:"create-program-httpworm", innerText:Programs.HTTPWormProgram,
tooltip:"This virus opens up HTTP ports"
});
createProgramList.appendChild(httpWormALink);
sqlInjectALink = createElement("a", {
class:"a-link-button", id:"create-program-sqlinject", innerText:Programs.SQLInjectProgram,
tooltip:"This virus opens SQL ports"
});
createProgramList.appendChild(sqlInjectALink);
deepscanv1ALink = createElement("a", {
class:"a-link-button", id:"create-program-deepscanv1", innerText:Programs.DeepscanV1,
tooltip:"This program allows you to use the scan-analyze command with a depth up to 5"
});
createProgramList.appendChild(deepscanv1ALink);
deepscanv2ALink = createElement("a", {
class:"a-link-button", id:"create-program-deepscanv2", innerText:Programs.DeepscanV2,
tooltip:"This program allows you to use the scan-analyze command with a depth up to 10"
});
createProgramList.appendChild(deepscanv2ALink);
servProfilerALink = createElement("a", {
class:"a-link-button", id:"create-program-serverprofiler", innerText:Programs.ServerProfiler,
tooltip:"This program is used to display hacking and Netscript-related information about servers"
});
createProgramList.appendChild(servProfilerALink);
bitFlumeALink = createElement("a", {
class:"a-link-button", id:"create-program-bitflume", innerText:Programs.BitFlume,
tooltip:"This program creates a portal to the BitNode Nexus (allows you to restart and switch BitNodes)"
});
createProgramList.appendChild(bitFlumeALink);
autolinkALink = createElement("a", {
class:"a-link-button", id:"create-program-autolink", innerText:"AutoLink.exe",
tooltip:"This program allows you to directly connect to other servers through the 'scan-analyze' command"
});
createProgramList.appendChild(autolinkALink);
nukeALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.NukeProgram, CONSTANTS.MillisecondsPerFiveMinutes, 1);
return false;
});
bruteSshALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.BruteSSHProgram, CONSTANTS.MillisecondsPerFiveMinutes * 2, 50);
return false;
});
ftpCrackALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.FTPCrackProgram, CONSTANTS.MillisecondsPerHalfHour, 100);
return false;
});
relaySmtpALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.RelaySMTPProgram, CONSTANTS.MillisecondsPer2Hours, 250);
return false;
});
httpWormALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.HTTPWormProgram, CONSTANTS.MillisecondsPer4Hours, 500);
return false;
});
sqlInjectALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.SQLInjectProgram, CONSTANTS.MillisecondsPer8Hours, 750);
return false;
});
deepscanv1ALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.DeepscanV1, CONSTANTS.MillisecondsPerQuarterHour, 75);
return false;
});
deepscanv2ALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.DeepscanV2, CONSTANTS.MillisecondsPer2Hours, 400);
return false;
});
servProfilerALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.ServerProfiler, CONSTANTS.MillisecondsPerHalfHour, 75);
return false;
});
autolinkALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.AutoLink, CONSTANTS.MillisecondsPerQuarterHour, 25);
return false;
});
bitFlumeALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.BitFlume, CONSTANTS.MillisecondsPerFiveMinutes / 5, 5);
return false;
});
for(const key in aLinks) {
const p = Programs[key]
aLinks[key].addEventListener("click", function() {
Player.startCreateProgramWork(p.name, p.create.time, p.create.level);
return false;
});
}
}
export {Programs, displayCreateProgramContent, getNumAvailableCreateProgram,

@ -1,6 +1,6 @@
import {CONSTANTS} from "./Constants.js";
import {Player} from "./Player.js";
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {CONSTANTS} from "./Constants";
import {Player} from "./Player";
import {dialogBoxCreate} from "../utils/DialogBox";
function Crime(name, type, time, money, difficulty, karma, params) {

@ -1,10 +1,10 @@
import {Programs} from "./CreateProgram.js";
import {Player} from "./Player.js";
import {SpecialServerIps} from "./SpecialServerIps.js";
import {post} from "./Terminal.js";
import {Programs} from "./CreateProgram";
import {Player} from "./Player";
import {SpecialServerIps} from "./SpecialServerIps";
import {post} from "./Terminal";
import {isValidIPAddress} from "../utils/IPAddress.js";
import {formatNumber} from "../utils/StringHelperFunctions.js";
import {isValidIPAddress} from "../utils/IPAddress";
import {formatNumber} from "../utils/StringHelperFunctions";
/* DarkWeb.js */
@ -102,14 +102,14 @@ DarkWebItem.prototype.toString = function() {
}
const DarkWebItems = {
BruteSSHProgram: new DarkWebItem(Programs.BruteSSHProgram, 500000, "Opens up SSH Ports"),
FTPCrackProgram: new DarkWebItem(Programs.FTPCrackProgram, 1500000, "Opens up FTP Ports"),
RelaySMTPProgram: new DarkWebItem(Programs.RelaySMTPProgram, 5000000, "Opens up SMTP Ports"),
HTTPWormProgram: new DarkWebItem(Programs.HTTPWormProgram, 30000000, "Opens up HTTP Ports"),
SQLInjectProgram: new DarkWebItem(Programs.SQLInjectProgram, 250000000, "Opens up SQL Ports"),
DeepscanV1: new DarkWebItem(Programs.DeepscanV1, 500000, "Enables 'scan-analyze' with a depth up to 5"),
DeepscanV2: new DarkWebItem(Programs.DeepscanV2, 25000000, "Enables 'scan-analyze' with a depth up to 10"),
AutolinkProgram: new DarkWebItem(Programs.AutoLink, 1000000, "Enables direct connect via 'scan-analyze'"),
BruteSSHProgram: new DarkWebItem(Programs.BruteSSHProgram.name, 500000, "Opens up SSH Ports"),
FTPCrackProgram: new DarkWebItem(Programs.FTPCrackProgram.name, 1500000, "Opens up FTP Ports"),
RelaySMTPProgram: new DarkWebItem(Programs.RelaySMTPProgram.name, 5000000, "Opens up SMTP Ports"),
HTTPWormProgram: new DarkWebItem(Programs.HTTPWormProgram.name, 30000000, "Opens up HTTP Ports"),
SQLInjectProgram: new DarkWebItem(Programs.SQLInjectProgram.name, 250000000, "Opens up SQL Ports"),
DeepscanV1: new DarkWebItem(Programs.DeepscanV1.name, 500000, "Enables 'scan-analyze' with a depth up to 5"),
DeepscanV2: new DarkWebItem(Programs.DeepscanV2.name, 25000000, "Enables 'scan-analyze' with a depth up to 10"),
AutolinkProgram: new DarkWebItem(Programs.AutoLink.name, 1000000, "Enables direct connect via 'scan-analyze'"),
};

@ -1,24 +1,24 @@
import {Augmentations, AugmentationNames,
PlayerOwnedAugmentation} from "./Augmentations.js";
import {BitNodeMultipliers} from "./BitNode.js";
import {CONSTANTS} from "./Constants.js";
import {Engine} from "./engine.js";
import {FactionInfos} from "./FactionInfo.js";
import {Locations} from "./Location.js";
import {HackingMission, setInMission} from "./Missions.js";
import {Player} from "./Player.js";
import {Settings} from "./Settings.js";
PlayerOwnedAugmentation} from "./Augmentations";
import {BitNodeMultipliers} from "./BitNode";
import {CONSTANTS} from "./Constants";
import {Engine} from "./engine";
import {FactionInfos} from "./FactionInfo";
import {Locations} from "./Location";
import {HackingMission, setInMission} from "./Missions";
import {Player} from "./Player";
import {Settings} from "./Settings";
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {factionInvitationBoxCreate} from "../utils/FactionInvitationBox.js";
import {dialogBoxCreate} from "../utils/DialogBox";
import {factionInvitationBoxCreate} from "../utils/FactionInvitationBox";
import {clearEventListeners, createElement,
removeChildrenFromElement} from "../utils/HelperFunctions.js";
removeChildrenFromElement} from "../utils/HelperFunctions";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver.js";
Generic_fromJSON} from "../utils/JSONReviver";
import numeral from "numeral/min/numeral.min";
import {formatNumber} from "../utils/StringHelperFunctions.js";
import {formatNumber} from "../utils/StringHelperFunctions";
import {yesNoBoxCreate, yesNoBoxGetYesButton,
yesNoBoxGetNoButton, yesNoBoxClose} from "../utils/YesNoBox.js";
yesNoBoxGetNoButton, yesNoBoxClose} from "../utils/YesNoBox";
function Faction(name="") {
this.name = name;
@ -439,7 +439,6 @@ function displayFactionContent(factionName) {
}
}
var confirmingPurchases = true;
var sortOption = null;
function displayFactionAugmentations(factionName) {
var faction = Factions[factionName];
@ -468,19 +467,6 @@ function displayFactionAugmentations(factionName) {
"Augmentations are powerful upgrades that will enhance your abilities."
}));
//Confirming not confirming button
elements.push(createElement("label", {
for:"faction-augmentations-confirming-checkbox",innerText:"Confirm Purchases",
color:"white", margin:"4px", padding:"4px",
}));
var confirmingPurchasesCheckbox = createElement("input", {
type:"checkbox", id:"faction-augmentations-confirming-checkbox", checked:confirmingPurchases,
margin:"4px", padding:"4px",
clickListener:()=>{
confirmingPurchases = confirmingPurchasesCheckbox.checked;
}
});
elements.push(confirmingPurchasesCheckbox);
elements.push(createElement("br"));
elements.push(createElement("br"));
@ -585,7 +571,8 @@ function createFactionAugmentationDisplayElements(augmentationsList, augs, facti
var aElem = createElement("a", {
innerText:aug.name, display:"inline",
clickListener:()=>{
if (confirmingPurchases) {
console.log('sup buy in fac: '+Settings.SuppressBuyAugmentationConfirmation);
if (!Settings.SuppressBuyAugmentationConfirmation) {
purchaseAugmentationBoxCreate(aug, faction);
} else {
purchaseAugmentation(aug, faction);
@ -723,10 +710,12 @@ function purchaseAugmentation(aug, fac, sing=false) {
if (sing) {
return "You purchased " + aug.name;
} else {
dialogBoxCreate("You purchased " + aug.name + ". It's enhancements will not take " +
"effect until they are installed. To install your augmentations, go to the " +
"'Augmentations' tab on the left-hand navigation menu. Purchasing additional " +
"augmentations will now be more expensive.");
if(!Settings.SuppressBuyAugmentationConfirmation){
dialogBoxCreate("You purchased " + aug.name + ". It's enhancements will not take " +
"effect until they are installed. To install your augmentations, go to the " +
"'Augmentations' tab on the left-hand navigation menu. Purchasing additional " +
"augmentations will now be more expensive.");
}
}
displayFactionAugmentations(fac.name);

@ -1,156 +0,0 @@
//Contains the "information" property for all the Factions, which is just a description
//of each faction
function FactionInfo(infoText, enemies, offerHackingMission, offerHackingWork, offerFieldWork, offerSecurityWork) {
this.infoText = infoText;
this.enemies = enemies;
this.offerHackingMission = offerHackingMission;
this.offerHackingWork = offerHackingWork;
this.offerFieldWork = offerFieldWork;
this.offerSecurityWork = offerSecurityWork;
// these are always all 1 for now.
this.augmentationPriceMult = 1;
this.augmentationRepRequirementMult = 1;
}
const FactionInfos = {
//Endgame
"Illuminati": new FactionInfo("Humanity never changes. No matter how civilized society becomes, it will eventually fall back " +
"into chaos. And from this chaos, we are the Invisible hand that guides them to order. ", [], true, true, true, false),
"Daedalus": new FactionInfo("Yesterday we obeyed kings and bent our necks to emperors. Today we kneel only to truth.", [], true, true, true, false),
"The Covenant": new FactionInfo("Surrender yourself. Give up your empty individuality to become part of something great, something eternal. " +
"Become a slave. Submit your mind, body, and soul. Only then can you set yourself free.<br><br> " +
"Only then can you discover immortality.", [], true, true, true, false),
//Megacorporations, each forms its own faction
"ECorp": new FactionInfo("ECorp's mission is simple: to connect the world of today with the technology of tomorrow. " +
"With our wide range of Internet-related software and commercial hardware, ECorp makes the world's " +
"information universally accessible.", [], true, true, true, true),
"MegaCorp": new FactionInfo("MegaCorp does things that others don't. We imagine. We create. We invent. We build things that " +
"others have never even dreamed of. Our work fills the world's needs for food, water, power, and " +
"transporation on an unprecendented scale, in ways that no other company can.<br><br>" +
"In our labs and factories and on the ground with customers, MegaCorp is ushering in a new era for the world.", [], true, true, true, true),
"Bachman & Associates": new FactionInfo("Where Law and Business meet - thats where we are. <br><br>" +
"Legal Insight - Business Instinct - Experience Innovation", [], true, true, true, true),
"Blade Industries": new FactionInfo("Augmentation is salvation", [], true, true, true, true),
"NWO": new FactionInfo("The human being does not truly desire freedom. It wants " +
"to be observed, understood, and judged. It wants to be given purpose and " +
"direction in its life. That is why humans created God. " +
"And that is why humans created civilization - " +
"not because of willingness, " +
"but because of a need to be incorporated into higher orders of structure and meaning.", [], true, true, true, true),
"Clarke Incorporated": new FactionInfo("Unlocking the power of the genome", [], true, true, true, true),
"OmniTek Incorporated": new FactionInfo("Simply put, our mission is to design and build robots that make a difference", [], true, true, true, true),
"Four Sigma": new FactionInfo("The scientific method is the best way to approach investing. Big strategies backed up with big data. Driven by " +
"deep learning and innovative ideas. And improved by iteration. That's Four Sigma.", [], true, true, true, true),
"KuaiGong International": new FactionInfo("Dream big. Work hard. Make history.", [], true, true, true, true),
//Other Corporations
"Fulcrum Secret Technologies": new FactionInfo("The human organism has an innate desire to worship. " +
"That is why they created gods. If there were no gods, " +
"it would be necessary to create them. And now we can.", [], true, true, false, true),
//Hacker groups
"BitRunners": new FactionInfo("Our entire lives are controlled by bits. All of our actions, our thoughts, our personal information. "+
"It's all transformed into bits, stored in bits, communicated through bits. Its impossible for any person " +
"to move, to live, to operate at any level without the use of bits. " +
"And when a person moves, lives, and operates, they leave behind their bits, mere traces of seemingly " +
"meaningless fragments of information. But these bits can be reconstructed. Transformed. Used.<br><br>" +
"Those who run the bits, run the world", [], true, true, false, false),
"The Black Hand": new FactionInfo("The world, so afraid of strong government, now has no government. Only power - Digital power. Financial power. " +
"Technological power. " +
"And those at the top rule with an invisible hand. They built a society where the rich get richer, " +
"and everyone else suffers.<br><br>" +
"So much pain. So many lives. Their darkness must end.", [], true, true, true, false),
"NiteSec": new FactionInfo(
" __..__ <br>" +
" _.nITESECNIt. <br>" +
" .-'NITESECNITESEc. <br>" +
" .' NITESECNITESECn <br>" +
" / NITESECNITESEC; <br>" +
" : :NITESECNITESEC; <br>" +
" ; $ NITESECNITESECN <br>" +
" : _, ,N'ITESECNITESEC <br>" +
" : .+^^`, : `NITESECNIT <br>" +
" ) /), `-,-=,NITESECNI <br>" +
" / ^ ,-;|NITESECN; <br>" +
" / _.' '-';NITESECN <br>" +
" ( , ,-''`^NITE' <br>" +
" )` :`. .' <br>" +
" )-- ; `- / <br>" +
" \' _.-' : <br>" +
" ( _.-' \. \ <br>" +
" \------. \ \ <br>" +
" \. \ \ <br>" +
" \ _.nIt <br>" +
" \ _.nITESECNi <br>" +
" nITESECNIT^' \ <br>" +
" NITE^' ___ \ <br>" +
" / .gP''''Tp. \ <br>" +
" : d' . `b \ <br>" +
" ; d' o `b ; <br>" +
" / d; `b| <br>" +
" /, $; @ `: <br>" +
" /' $$ ; <br>" +
" .' $$b o | <br>" +
" .' d$$$; : <br>" +
" / .d$$$$; , ; <br>" +
" d .dNITESEC $ | <br>" +
" :bp.__.gNITESEC$$ :$ ; <br>" +
" NITESECNITESECNIT $$b : <br>", [], true, true, false, false),
//City factions, essentially governments
"Chongqing": new FactionInfo("Serve the people", ["Sector-12", "Aevum", "Volhaven"], true, true, true, true),
"Sector-12": new FactionInfo("The City of the Future", ["Chongqing", "New Tokyo", "Ishima", "Volhaven"], true, true, true, true),
"New Tokyo": new FactionInfo("Asia's World City", ["Sector-12", "Aevum", "Volhaven"], true, true, true, true),
"Aevum": new FactionInfo("The Silicon City", ["Chongqing", "New Tokyo", "Ishima", "Volhaven"], true, true, true, true),
"Ishima": new FactionInfo("The East Asian Order of the Future", ["Sector-12", "Aevum", "Volhaven"], true, true, true, true),
"Volhaven": new FactionInfo("Benefit, Honour, and Glory", ["Chongqing", "Sector-12", "New Tokyo", "Aevum", "Ishima"], true, true, true, true),
//Criminal Organizations/Gangs
"Speakers for the Dead": new FactionInfo("It is better to reign in hell than to serve in heaven.", [], true, true, true, true),
"The Dark Army": new FactionInfo("The World doesn't care about right or wrong. It's all about power.", [], true, true, true, false),
"The Syndicate": new FactionInfo("Honor holds you back", [], true, true, true, true),
"Silhouette": new FactionInfo("Corporations have filled the void of power left behind by the collapse of Western government. The issue is they've become so big " +
"that you don't know who they're working for. And if you're employed at one of these corporations, you don't even know who you're working " +
"for.\n\n" +
"That's terror. Terror, fear, and corruption. All born into the system, all propagated by the system.", [], true, true, true, false),
"Tetrads": new FactionInfo("Following the Mandate of Heaven and Carrying out the Way", [], false, false, true, true),
"Slum Snakes": new FactionInfo("Slum Snakes rule!", [], false, false, true, true),
//Earlygame factions - factions the player will prestige with early on that don't
//belong in other categories
"Netburners": new FactionInfo("~~//*>H4CK|\|3T 8URN3R5**>?>\\~~", [], true, true, false, false),
"Tian Di Hui": new FactionInfo("Obey Heaven and Work Righteousness", [], true, true, false, true),
"CyberSec": new FactionInfo("The Internet is the first thing that humanity has built that humanity doesnt understand, " +
"the largest experiment in anarchy that we have ever had. And as the world becomes increasingly " +
"dominated by the internet, society approaches the brink of total chaos. " +
"We serve only to protect society, to protect humanity, to protect the world from its imminent collapse.", [], true, true, false, false),
//Special Factions
"Bladeburners": new FactionInfo("It's too bad they won't live. But then again, who does?<br><br>" +
"Note that for this faction, reputation can only be gained through Bladeburner actions. Completing " +
"Bladeburner contracts/operations will increase your reputation.", [], false, false, false, false),
}
export {FactionInfos};

193
src/FactionInfo.ts Normal file

@ -0,0 +1,193 @@
// Contains the "information" property for all the Factions, which is just a description of each faction
class FactionInfo {
augmentationPriceMult: number;
augmentationRepRequirementMult: number;
enemies: string[];
infoText: string;
offerFieldWork: boolean;
offerHackingMission: boolean;
offerHackingWork: boolean;
offerSecurityWork: boolean;
constructor(infoText: string, enemies: string[], offerHackingMission: boolean, offerHackingWork: boolean,
offerFieldWork: boolean, offerSecurityWork: boolean) {
this.infoText = infoText;
this.enemies = enemies;
this.offerHackingMission = offerHackingMission;
this.offerHackingWork = offerHackingWork;
this.offerFieldWork = offerFieldWork;
this.offerSecurityWork = offerSecurityWork;
// These are always all 1 for now.
this.augmentationPriceMult = 1;
this.augmentationRepRequirementMult = 1;
}
}
const FactionInfos = {
// Endgame
Illuminati: new FactionInfo("Humanity never changes. No matter how civilized society becomes, it will eventually" +
"fall back into chaos. And from this chaos, we are the Invisible hand that guides them to order. ",
[], true, true, true, false),
Daedalus: new FactionInfo("Yesterday we obeyed kings and bent our necks to emperors. Today we kneel only to truth.",
[], true, true, true, false),
"The Covenant": new FactionInfo("Surrender yourself. Give up your empty individuality to become part of something" +
"great, something eternal. Become a slave. Submit your mind, body, and soul. Only" +
"then can you set yourself free.<br><br> Only then can you discover immortality.",
[], true, true, true, false),
// Megacorporations, each forms its own faction
ECorp: new FactionInfo("ECorp's mission is simple: to connect the world of today with the technology of tomorrow." +
"With our wide range of Internet-related software and commercial hardware, ECorp makes" +
"the world's information universally accessible.",
[], true, true, true, true),
MegaCorp: new FactionInfo("MegaCorp does things that others don't. We imagine. We create. We invent. We build" +
"things that others have never even dreamed of. Our work fills the world's needs for" +
"food, water, power, and transporation on an unprecendented scale, in ways that no" +
"other company can.<br><br>In our labs and factories and on the ground with customers," +
"MegaCorp is ushering in a new era for the world.",
[], true, true, true, true),
"Bachman & Associates": new FactionInfo("Where Law and Business meet - thats where we are. <br><br>" +
"Legal Insight - Business Instinct - Experience Innovation",
[], true, true, true, true),
"Blade Industries": new FactionInfo("Augmentation is salvation", [], true, true, true, true),
NWO: new FactionInfo("The human being does not truly desire freedom. It wants " +
"to be observed, understood, and judged. It wants to be given purpose and " +
"direction in its life. That is why humans created God. " +
"And that is why humans created civilization - " +
"not because of willingness, " +
"but because of a need to be incorporated into higher orders of structure and meaning.",
[], true, true, true, true),
"Clarke Incorporated": new FactionInfo("Unlocking the power of the genome",
[], true, true, true, true),
"OmniTek Incorporated": new FactionInfo("Simply put, our mission is to design and build robots that make a" +
"difference",
[], true, true, true, true),
"Four Sigma": new FactionInfo("The scientific method is the best way to approach investing. Big strategies backed" +
"up with big data. Driven by deep learning and innovative ideas. And improved by iteration. That's Four Sigma.",
[], true, true, true, true),
"KuaiGong International": new FactionInfo("Dream big. Work hard. Make history.",
[], true, true, true, true),
// Other Corporations
"Fulcrum Secret Technologies": new FactionInfo("The human organism has an innate desire to worship. " +
"That is why they created gods. If there were no gods, " +
"it would be necessary to create them. And now we can.",
[], true, true, false, true),
// Hacker groups
BitRunners: new FactionInfo("Our entire lives are controlled by bits. All of our actions, our thoughts, our" +
"personal information. It's all transformed into bits, stored in bits, communicated through bits." +
"Its impossible for any person to move, to live, to operate at any level without the use of" +
"bits. And when a person moves, lives, and operates, they leave behind their bits, mere traces of" +
"seemingly meaningless fragments of information. But these bits can be reconstructed." +
"Transformed. Used.<br><br>Those who run the bits, run the world",
[], true, true, false, false),
"The Black Hand": new FactionInfo("The world, so afraid of strong government, now has no government." +
"Only power - Digital power. Financial power. Technological power. And those at the top rule with" +
"an invisible hand. They built a society where the rich get richer, and everyone else suffers." +
"<br><br>So much pain. So many lives. Their darkness must end.",
[], true, true, true, false),
NiteSec: new FactionInfo(
" __..__ <br>" +
" _.nITESECNIt. <br>" +
" .-'NITESECNITESEc. <br>" +
" .' NITESECNITESECn <br>" +
" / NITESECNITESEC; <br>" +
" : :NITESECNITESEC; <br>" +
" ; $ NITESECNITESECN <br>" +
" : _, ,N'ITESECNITESEC <br>" +
" : .+^^`, : `NITESECNIT <br>" +
" ) /), `-,-=,NITESECNI <br>" +
" / ^ ,-;|NITESECN; <br>" +
" / _.' '-';NITESECN <br>" +
" ( , ,-''`^NITE' <br>" +
" )` :`. .' <br>" +
" )-- ; `- / <br>" +
" \' _.-' : <br>" +
" ( _.-' \. \ <br>" +
" \------. \ \ <br>" +
" \. \ \ <br>" +
" \ _.nIt <br>" +
" \ _.nITESECNi <br>" +
" nITESECNIT^' \ <br>" +
" NITE^' ___ \ <br>" +
" / .gP''''Tp. \ <br>" +
" : d' . `b \ <br>" +
" ; d' o `b ; <br>" +
" / d; `b| <br>" +
" /, $; @ `: <br>" +
" /' $$ ; <br>" +
" .' $$b o | <br>" +
" .' d$$$; : <br>" +
" / .d$$$$; , ; <br>" +
" d .dNITESEC $ | <br>" +
" :bp.__.gNITESEC$$ :$ ; <br>" +
" NITESECNITESECNIT $$b : <br>",
[], true, true, false, false),
// City factions, essentially governments
Aevum: new FactionInfo("The Silicon City",
["Chongqing", "New Tokyo", "Ishima", "Volhaven"], true, true, true, true),
Chongqing: new FactionInfo("Serve the people",
["Sector-12", "Aevum", "Volhaven"], true, true, true, true),
Ishima: new FactionInfo("The East Asian Order of the Future",
["Sector-12", "Aevum", "Volhaven"], true, true, true, true),
"New Tokyo": new FactionInfo("Asia's World City",
["Sector-12", "Aevum", "Volhaven"], true, true, true, true),
"Sector-12": new FactionInfo("The City of the Future",
["Chongqing", "New Tokyo", "Ishima", "Volhaven"], true, true, true, true),
Volhaven: new FactionInfo("Benefit, Honour, and Glory",
["Chongqing", "Sector-12", "New Tokyo", "Aevum", "Ishima"], true, true, true, true),
// Criminal Organizations/Gangs
"Speakers for the Dead": new FactionInfo("It is better to reign in hell than to serve in heaven.",
[], true, true, true, true),
"The Dark Army": new FactionInfo("The World doesn't care about right or wrong. It's all about power.",
[], true, true, true, false),
"The Syndicate": new FactionInfo("Honor holds you back", [], true, true, true, true),
Silhouette: new FactionInfo("Corporations have filled the void of power left behind by the collapse of Western" +
"government. The issue is they've become so big that you don't know who they're working for. And" +
"if you're employed at one of these corporations, you don't even know who you're working for.\n\n" +
"That's terror. Terror, fear, and corruption. All born into the system, all propagated by the" +
"system.",
[], true, true, true, false),
Tetrads: new FactionInfo("Following the Mandate of Heaven and Carrying out the Way", [], false, false, true, true),
"Slum Snakes": new FactionInfo("Slum Snakes rule!", [], false, false, true, true),
// Earlygame factions - factions the player will prestige with early on that don't belong in other categories.
Netburners: new FactionInfo("~~//*>H4CK|\|3T 8URN3R5**>?>\\~~", [], true, true, false, false),
"Tian Di Hui": new FactionInfo("Obey Heaven and Work Righteousness", [], true, true, false, true),
CyberSec: new FactionInfo("The Internet is the first thing that humanity has built that humanity doesnt" +
"understand, the largest experiment in anarchy that we have ever had. And as the world becomes" +
"increasingly dominated by the internet, society approaches the brink of total chaos. We serve only" +
"to protect society, to protect humanity, to protect the world from its imminent collapse.",
[], true, true, false, false),
// Special Factions
Bladeburners: new FactionInfo("It's too bad they won't live. But then again, who does?<br><br>Note that for this" +
"faction, reputation can only be gained through Bladeburner actions. Completing " +
"Bladeburner contracts/operations will increase your reputation.",
[], false, false, false, false),
};
export {FactionInfos};

@ -1,4 +1,4 @@
import {parse, Node} from "../utils/acorn.js";
import {parse, Node} from "../utils/acorn";
var FconfSettings = {
ENABLE_BASH_HOTKEYS: false,

@ -1,22 +1,22 @@
import {CONSTANTS} from "./Constants.js";
import {Engine} from "./engine.js";
import {CONSTANTS} from "./Constants";
import {Engine} from "./engine";
import {Faction, Factions,
displayFactionContent} from "./Faction.js";
import {Player} from "./Player.js";
import {dialogBoxCreate} from "../utils/DialogBox.js";
displayFactionContent} from "./Faction";
import {Player} from "./Player";
import {dialogBoxCreate} from "../utils/DialogBox";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver.js";
Generic_fromJSON} from "../utils/JSONReviver";
import {getRandomInt, createElement,
removeChildrenFromElement,
createAccordionElement, createPopup,
removeElementById, removeElement} from "../utils/HelperFunctions.js";
removeElementById, removeElement} from "../utils/HelperFunctions";
import numeral from "numeral/min/numeral.min";
import {formatNumber} from "../utils/StringHelperFunctions.js";
import {formatNumber} from "../utils/StringHelperFunctions";
import {yesNoBoxCreate, yesNoTxtInpBoxCreate,
yesNoBoxGetYesButton, yesNoBoxGetNoButton,
yesNoTxtInpBoxGetYesButton, yesNoTxtInpBoxGetNoButton,
yesNoTxtInpBoxGetInput, yesNoBoxClose,
yesNoTxtInpBoxClose, yesNoBoxOpen} from "../utils/YesNoBox.js";
yesNoTxtInpBoxClose, yesNoBoxOpen} from "../utils/YesNoBox";
/* Gang.js */
//Switch between territory and management screen with 1 and 2

@ -1,15 +1,15 @@
import {BitNodeMultipliers} from "./BitNode.js";
import {CONSTANTS} from "./Constants.js";
import {Engine} from "./engine.js";
import {BitNodeMultipliers} from "./BitNode";
import {CONSTANTS} from "./Constants";
import {Engine} from "./engine";
import {iTutorialSteps, iTutorialNextStep,
iTutorialIsRunning, currITutorialStep} from "./InteractiveTutorial.js";
import {Player} from "./Player.js";
import {dialogBoxCreate} from "../utils/DialogBox.js";
iTutorialIsRunning, currITutorialStep} from "./InteractiveTutorial";
import {Player} from "./Player";
import {dialogBoxCreate} from "../utils/DialogBox";
import {clearEventListeners, createElement,
getElementById} from "../utils/HelperFunctions.js";
getElementById} from "../utils/HelperFunctions";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver.js";
import {formatNumber} from "../utils/StringHelperFunctions.js";
Generic_fromJSON} from "../utils/JSONReviver";
import {formatNumber} from "../utils/StringHelperFunctions";
/**
* Overwrites the inner text of the specified HTML element if it is different from what currently exists.

@ -1,11 +1,11 @@
import {BitNodeMultipliers} from "./BitNode.js";
import {CONSTANTS} from "./Constants.js";
import {Engine} from "./engine.js";
import {Player} from "./Player.js";
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {clearEventListeners, getRandomInt} from "../utils/HelperFunctions.js";
import {infiltrationBoxCreate} from "../utils/InfiltrationBox.js";
import {formatNumber} from "../utils/StringHelperFunctions.js";
import {BitNodeMultipliers} from "./BitNode";
import {CONSTANTS} from "./Constants";
import {Engine} from "./engine";
import {Player} from "./Player";
import {dialogBoxCreate} from "../utils/DialogBox";
import {clearEventListeners, getRandomInt} from "../utils/HelperFunctions";
import {infiltrationBoxCreate} from "../utils/InfiltrationBox";
import {formatNumber} from "../utils/StringHelperFunctions";
/* Infiltration.js
*
@ -594,10 +594,10 @@ let intWgt = CONSTANTS.IntelligenceInfiltrationWeight;
//Success: 5%, Failure 10%, -Karma
function attemptInfiltrationKill(inst) {
var chance = getInfiltrationKillChance(inst);
inst.gainStrengthExp(inst.securityLevel / 85) * Player.strength_exp_mult;
inst.gainDefenseExp(inst.securityLevel / 85) * Player.defense_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 85) * Player.dexterity_exp_mult;
inst.gainAgilityExp(inst.securityLevel / 85) * Player.agility_exp_mult;
inst.gainStrengthExp(inst.securityLevel / 75) * Player.strength_exp_mult;
inst.gainDefenseExp(inst.securityLevel / 75) * Player.defense_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 75) * Player.dexterity_exp_mult;
inst.gainAgilityExp(inst.securityLevel / 75) * Player.agility_exp_mult;
if (Math.random() <= chance) {
inst.securityLevel *= 1.05;
return [true, 1.05];
@ -620,10 +620,10 @@ function getInfiltrationKillChance(inst) {
//Success: 3%, Failure: 10%
function attemptInfiltrationKnockout(inst) {
var chance = getInfiltrationKnockoutChance(inst);
inst.gainStrengthExp(inst.securityLevel / 80) * Player.strength_exp_mult;
inst.gainDefenseExp(inst.securityLevel / 80) * Player.defense_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 80) * Player.dexterity_exp_mult;
inst.gainAgilityExp(inst.securityLevel / 80) * Player.agility_exp_mult;
inst.gainStrengthExp(inst.securityLevel / 70) * Player.strength_exp_mult;
inst.gainDefenseExp(inst.securityLevel / 70) * Player.defense_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 70) * Player.dexterity_exp_mult;
inst.gainAgilityExp(inst.securityLevel / 70) * Player.agility_exp_mult;
if (Math.random() <= chance) {
inst.securityLevel *= 1.03;
return [true, 1.03];
@ -645,9 +645,9 @@ function getInfiltrationKnockoutChance(inst) {
//Success: 0%, Failure: 10%
function attemptInfiltrationStealthKnockout(inst) {
var chance = getInfiltrationStealthKnockoutChance(inst);
inst.gainStrengthExp(inst.securityLevel / 85) * Player.strength_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 65) * Player.dexterity_exp_mult;
inst.gainAgilityExp(inst.securityLevel / 65) * Player.agility_exp_mult;
inst.gainStrengthExp(inst.securityLevel / 75) * Player.strength_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 60) * Player.dexterity_exp_mult;
inst.gainAgilityExp(inst.securityLevel / 60) * Player.agility_exp_mult;
if (Math.random() <= chance) {
return [true, 1];
} else {
@ -669,9 +669,9 @@ function getInfiltrationStealthKnockoutChance(inst) {
//Success: 0%, Failure: 5%, -Karma
function attemptInfiltrationAssassinate(inst) {
var chance = getInfiltrationAssassinateChance(inst);
inst.gainStrengthExp(inst.securityLevel / 85) * Player.strength_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 65) * Player.dexterity_exp_mult;
inst.gainAgilityExp(inst.securityLevel / 65) * Player.agility_exp_mult;
inst.gainStrengthExp(inst.securityLevel / 75) * Player.strength_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 55) * Player.dexterity_exp_mult;
inst.gainAgilityExp(inst.securityLevel / 55) * Player.agility_exp_mult;
if (Math.random() <= chance) {
return [true, 1];
} else {
@ -693,10 +693,10 @@ function getInfiltrationAssassinateChance(inst) {
//Success: 5%, Failure: 10%
function attemptInfiltrationDestroySecurity(inst) {
var chance = getInfiltrationDestroySecurityChance(inst);
inst.gainStrengthExp(inst.securityLevel / 85) * Player.strength_exp_mult;
inst.gainDefenseExp(inst.securityLevel / 85) * Player.defense_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 85) * Player.dexterity_exp_mult;
inst.gainAgilityExp(inst.securityLevel / 85) * Player.agility_exp_mult;
inst.gainStrengthExp(inst.securityLevel / 75) * Player.strength_exp_mult;
inst.gainDefenseExp(inst.securityLevel / 75) * Player.defense_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 75) * Player.dexterity_exp_mult;
inst.gainAgilityExp(inst.securityLevel / 75) * Player.agility_exp_mult;
if (Math.random() <= chance) {
inst.securityLevel *= 1.05;
return [true, 1.05];
@ -720,8 +720,8 @@ function getInfiltrationDestroySecurityChance(inst) {
//Success: 3%, Failure: 5%
function attemptInfiltrationHack(inst) {
var chance = getInfiltrationHackChance(inst);
inst.gainHackingExp(inst.securityLevel / 40) * Player.hacking_exp_mult;
inst.gainIntelligenceExp(inst.securityLevel / 690);
inst.gainHackingExp(inst.securityLevel / 30) * Player.hacking_exp_mult;
inst.gainIntelligenceExp(inst.securityLevel / 680);
if (Math.random() <= chance) {
inst.securityLevel *= 1.03;
return [true, 1.03];
@ -743,7 +743,7 @@ function getInfiltrationHackChance(inst) {
//Success: 0%, Failure: 8%
function attemptInfiltrationSneak(inst) {
var chance = getInfiltrationSneakChance(inst);
inst.gainAgilityExp(inst.securityLevel / 40) * Player.agility_exp_mult;
inst.gainAgilityExp(inst.securityLevel / 30) * Player.agility_exp_mult;
if (Math.random() <= chance) {
return [true, 1];
} else {
@ -764,7 +764,7 @@ function getInfiltrationSneakChance(inst) {
//Success: 1%, Failure: 3%
function attemptInfiltrationPickLockedDoor(inst) {
var chance = getInfiltrationPickLockedDoorChance(inst);
inst.gainDexterityExp(inst.securityLevel / 30) * Player.dexterity_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 25) * Player.dexterity_exp_mult;
if (Math.random() <= chance) {
inst.securityLevel *= 1.01;
return [true, 1.01];
@ -785,7 +785,7 @@ function getInfiltrationPickLockedDoorChance(inst) {
//Success: 0%, Failure: 15%,
function attemptInfiltrationBribe(inst) {
var chance = getInfiltrationBribeChance(inst);
inst.gainCharismaExp(inst.securityLevel / 10) * Player.charisma_exp_mult;
inst.gainCharismaExp(inst.securityLevel / 8) * Player.charisma_exp_mult;
if (Math.random() <= chance) {
return [true, 1];
} else {
@ -804,8 +804,8 @@ function getInfiltrationBribeChance(inst) {
//Failure: 5%
function attemptInfiltrationEscape(inst) {
var chance = getInfiltrationEscapeChance(inst);
inst.gainAgilityExp(inst.securityLevel / 35) * Player.agility_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 35) * Player.dexterity_exp_mult;
inst.gainAgilityExp(inst.securityLevel / 30) * Player.agility_exp_mult;
inst.gainDexterityExp(inst.securityLevel / 30) * Player.dexterity_exp_mult;
if (Math.random() <= chance) {
return [true, 1];
} else {

@ -1,7 +1,7 @@
import {Engine} from "./engine.js";
import {Player} from "./Player.js";
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {clearEventListeners} from "../utils/HelperFunctions.js";
import {Engine} from "./engine";
import {Player} from "./Player";
import {dialogBoxCreate} from "../utils/DialogBox";
import {clearEventListeners} from "../utils/HelperFunctions";
/* InteractiveTutorial.js */
let iTutorialSteps = {

@ -1,4 +1,4 @@
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {dialogBoxCreate} from "../utils/DialogBox";
/* Literature.js
* Lore / world building literature that can be found on servers

@ -1,29 +1,29 @@
import {Bladeburner} from "./Bladeburner.js";
import {Bladeburner} from "./Bladeburner";
import {CompanyPositions, initCompanies,
Companies, getJobRequirementText} from "./Company.js";
import {Corporation} from "./CompanyManagement.js";
import {CONSTANTS} from "./Constants.js";
import {Crimes} from "./Crimes.js";
import {Engine} from "./engine.js";
import {beginInfiltration} from "./Infiltration.js";
import {hasBladeburnerSF} from "./NetscriptFunctions.js";
import {Player} from "./Player.js";
import {Server, AllServers, AddToAllServers} from "./Server.js";
Companies, getJobRequirementText} from "./Company";
import {Corporation} from "./CompanyManagement";
import {CONSTANTS} from "./Constants";
import {Crimes} from "./Crimes";
import {Engine} from "./engine";
import {beginInfiltration} from "./Infiltration";
import {hasBladeburnerSF} from "./NetscriptFunctions";
import {Player} from "./Player";
import {Server, AllServers, AddToAllServers} from "./Server";
import {purchaseServer,
purchaseRamForHomeComputer} from "./ServerPurchases.js";
import {Settings} from "./Settings.js";
import {SpecialServerNames, SpecialServerIps} from "./SpecialServerIps.js";
purchaseRamForHomeComputer} from "./ServerPurchases";
import {Settings} from "./Settings";
import {SpecialServerNames, SpecialServerIps} from "./SpecialServerIps";
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {clearEventListeners, createElement} from "../utils/HelperFunctions.js";
import {createRandomIp} from "../utils/IPAddress.js";
import {dialogBoxCreate} from "../utils/DialogBox";
import {clearEventListeners, createElement} from "../utils/HelperFunctions";
import {createRandomIp} from "../utils/IPAddress";
import numeral from "numeral/min/numeral.min";
import {formatNumber} from "../utils/StringHelperFunctions.js";
import {formatNumber} from "../utils/StringHelperFunctions";
import {yesNoBoxCreate, yesNoTxtInpBoxCreate,
yesNoBoxGetYesButton, yesNoBoxGetNoButton,
yesNoTxtInpBoxGetYesButton, yesNoTxtInpBoxGetNoButton,
yesNoTxtInpBoxGetInput, yesNoBoxClose,
yesNoTxtInpBoxClose} from "../utils/YesNoBox.js";
yesNoTxtInpBoxClose} from "../utils/YesNoBox";
/* Display Location Content when visiting somewhere in the World*/
var Locations = {
@ -280,7 +280,13 @@ function displayLocationContent() {
purchase512gb.innerHTML = "Purchase 512GB Server - $" + formatNumber(512*CONSTANTS.BaseCostFor1GBOfRamServer, 2);
purchase1tb.innerHTML = "Purchase 1TB Server - $" + formatNumber(1024*CONSTANTS.BaseCostFor1GBOfRamServer, 2);
if (!SpecialServerIps.hasOwnProperty("Darkweb Server")) {
purchaseTor.classList.add("a-link-button");
purchaseTor.classList.remove("a-link-button-bought");
purchaseTor.innerHTML = "Purchase TOR Router - $" + formatNumber(CONSTANTS.TorRouterCost, 2);
} else {
purchaseTor.classList.remove("a-link-button");
purchaseTor.classList.add("a-link-button-bought");
purchaseTor.innerHTML = "TOR Router - Purchased";
}
@ -432,7 +438,7 @@ function displayLocationContent() {
purchaseHomeRam.style.display = "block";
purchaseHomeCores.style.display = "block";
setInfiltrateButton(infiltrate, Locations.AevumECorp,
6000, 116, 150, 8.5);
5400, 116, 150, 6);
break;
case Locations.AevumBachmanAndAssociates:
@ -445,7 +451,7 @@ function displayLocationContent() {
businessJob.style.display = "block";
securityJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.AevumBachmanAndAssociates,
1500, 42, 60, 5.75);
1500, 42, 60, 4.1);
break;
case Locations.AevumClarkeIncorporated:
@ -458,7 +464,7 @@ function displayLocationContent() {
businessJob.style.display = "block";
securityJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.AevumClarkeIncorporated,
2400, 34, 75, 5.4);
2000, 34, 75, 3.6);
break;
case Locations.AevumFulcrumTechnologies:
@ -478,7 +484,7 @@ function displayLocationContent() {
purchaseHomeRam.style.display = "block";
purchaseHomeCores.style.display = "block";
setInfiltrateButton(infiltrate, Locations.AevumFulcrumTechnologies,
6000, 96, 100, 9);
4600, 96, 100, 6.2);
break;
case Locations.AevumAeroCorp:
@ -490,7 +496,7 @@ function displayLocationContent() {
networkEngineerJob.style.display = "block";
securityJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.AevumAeroCorp,
2000, 32, 50, 6.3);
1500, 32, 50, 4.4);
break;
case Locations.AevumGalacticCybersystems:
@ -503,7 +509,7 @@ function displayLocationContent() {
networkEngineerJob.style.display = "block";
businessJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.AevumGalacticCybersystems,
1400, 30, 50, 5.3);
1400, 30, 50, 3.95);
break;
case Locations.AevumWatchdogSecurity:
@ -517,7 +523,7 @@ function displayLocationContent() {
securityJob.style.display = "block";
agentJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.AevumWatchdogSecurity,
850, 16, 30, 4.5);
765, 20, 30, 3);
break;
case Locations.AevumRhoConstruction:
@ -526,7 +532,7 @@ function displayLocationContent() {
softwareJob.style.display = "block";
businessJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.AevumRhoConstruction,
600, 12, 20, 2.7);
540, 16, 20, 1.9);
break;
case Locations.AevumPolice:
@ -535,7 +541,7 @@ function displayLocationContent() {
softwareJob.style.display = "block";
securityJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.AevumPolice,
700, 14, 25, 3.2);
630, 18, 25, 2.2);
break;
case Locations.AevumNetLinkTechnologies:
@ -554,7 +560,7 @@ function displayLocationContent() {
purchaseHomeRam.style.display = "block";
purchaseHomeCores.style.display = "block";
setInfiltrateButton(infiltrate, Locations.AevumNetLinkTechnologies,
160, 10, 15, 1.8);
144, 10, 15, 1.4);
break;
case Locations.AevumCrushFitnessGym:
@ -588,7 +594,7 @@ function displayLocationContent() {
businessJob.style.display = "block";
securityJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.ChongqingKuaiGongInternational,
5500, 48, 100, 9);
4950, 100, 100, 6.1);
break;
case Locations.ChongqingSolarisSpaceSystems:
@ -600,7 +606,7 @@ function displayLocationContent() {
networkEngineerJob.style.display = "block";
securityJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.ChongqingSolarisSpaceSystems,
3600, 26, 75, 8.6);
3240, 52, 75, 6);
break;
@ -629,7 +635,7 @@ function displayLocationContent() {
businessJob.style.display = "block";
securityJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.Sector12MegaCorp,
6000, 114, 125, 9.8);
5000, 114, 125, 6.75);
break;
case Locations.Sector12BladeIndustries:
@ -642,7 +648,7 @@ function displayLocationContent() {
businessJob.style.display = "block";
securityJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.Sector12BladeIndustries,
3000, 46, 100, 6.7);
2400, 46, 100, 4.2);
break;
case Locations.Sector12FourSigma:
@ -655,7 +661,7 @@ function displayLocationContent() {
businessJob.style.display = "block";
securityJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.Sector12FourSigma,
1500, 58, 100, 10.2);
1500, 58, 100, 7);
break;
case Locations.Sector12IcarusMicrosystems:
@ -668,7 +674,7 @@ function displayLocationContent() {
networkEngineerJob.style.display = "block";
businessJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.Sector12IcarusMicrosystems,
900, 32, 70, 7.8);
810, 32, 70, 5.4);
break;
case Locations.Sector12UniversalEnergy:
@ -681,7 +687,7 @@ function displayLocationContent() {
networkEngineerJob.style.display = "block";
businessJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.Sector12UniversalEnergy,
775, 24, 50, 6.3);
775, 24, 50, 4.3);
break;
case Locations.Sector12DeltaOne:
@ -693,7 +699,7 @@ function displayLocationContent() {
networkEngineerJob.style.display = "block";
securityJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.Sector12DeltaOne,
1200, 38, 75, 6.3);
1080, 38, 75, 4.5);
break;
case Locations.Sector12CIA:
@ -706,7 +712,7 @@ function displayLocationContent() {
securityJob.style.display = "block";
agentJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.Sector12CIA,
1450, 44, 80, 7.6);
1305, 44, 80, 4.6);
break;
case Locations.Sector12NSA:
@ -725,13 +731,13 @@ function displayLocationContent() {
nsaBladeburner.innerText = "Enter Bladeburner Headquarters";
} else {
setInfiltrateButton(infiltrate, Locations.Sector12NSA,
1400, 40, 80, 7.2);
1260, 40, 80, 5);
nsaBladeburner.innerText = "Apply to Bladeburner Division";
}
nsaBladeburner.style.display = "block";
} else {
setInfiltrateButton(infiltrate, Locations.Sector12NSA,
1400, 40, 80, 7.2);
1260, 40, 80, 5);
}
break;
@ -747,7 +753,7 @@ function displayLocationContent() {
purchaseHomeRam.style.display = "block";
purchaseHomeCores.style.display = "block";
setInfiltrateButton(infiltrate, Locations.Sector12AlphaEnterprises,
250, 14, 40, 2.7);
225, 14, 40, 2.25);
break;
case Locations.Sector12CarmichaelSecurity:
@ -761,7 +767,7 @@ function displayLocationContent() {
securityJob.style.display = "block";
agentJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.Sector12CarmichaelSecurity,
500, 18, 60, 2.7);
450, 18, 60, 2.5);
break;
case Locations.Sector12FoodNStuff:
@ -777,7 +783,7 @@ function displayLocationContent() {
employeeJob.style.display = "block";
employeePartTimeJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.Sector12JoesGuns,
120, 8, 20, 2.2);
120, 8, 20, 1.8);
break;
case Locations.Sector12IronGym:
@ -819,7 +825,7 @@ function displayLocationContent() {
securityEngineerJob.style.display = "block";
networkEngineerJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.NewTokyoDefComm,
1300, 28, 70, 5.4);
1170, 28, 70, 4);
break;
case Locations.NewTokyoVitaLife:
@ -832,7 +838,7 @@ function displayLocationContent() {
networkEngineerJob.style.display = "block";
businessJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.NewTokyoVitaLife,
750, 22, 100, 5);
675, 22, 100, 3.5);
break;
case Locations.NewTokyoGlobalPharmaceuticals:
@ -846,7 +852,7 @@ function displayLocationContent() {
businessJob.style.display = "block";
securityJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.NewTokyoGlobalPharmaceuticals,
900, 24, 80, 5.4);
775, 24, 80, 3.8);
break;
case Locations.NewTokyoNoodleBar:
@ -886,7 +892,7 @@ function displayLocationContent() {
purchaseHomeRam.style.display = "block";
purchaseHomeCores.style.display = "block";
setInfiltrateButton(infiltrate, Locations.IshimaStormTechnologies,
700, 24, 100, 5.9);
630, 24, 100, 4.1);
break;
case Locations.IshimaNovaMedical:
@ -899,7 +905,7 @@ function displayLocationContent() {
networkEngineerJob.style.display = "block";
businessJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.IshimaNovaMedical,
600, 20, 50, 4.5);
540, 20, 50, 3.2);
break;
case Locations.IshimaOmegaSoftware:
@ -918,7 +924,7 @@ function displayLocationContent() {
purchaseHomeRam.style.display = "block";
purchaseHomeCores.style.display = "block";
setInfiltrateButton(infiltrate, Locations.IshimaOmegaSoftware,
200, 10, 40, 2.3);
130, 10, 40, 1.6);
break;
case Locations.VolhavenTravelAgency:
@ -951,7 +957,7 @@ function displayLocationContent() {
purchase512gb.style.display = "block";
purchase1tb.style.display = "block";
setInfiltrateButton(infiltrate, Locations.VolhavenOmniTekIncorporated,
1500, 44, 100, 6.3);
1350, 44, 100, 4.4);
break;
case Locations.VolhavenNWO:
@ -964,7 +970,7 @@ function displayLocationContent() {
businessJob.style.display = "block";
securityJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.VolhavenNWO,
1800, 56, 200, 7.2);
1620, 56, 200, 6.8);
break;
case Locations.VolhavenHeliosLabs:
@ -976,7 +982,7 @@ function displayLocationContent() {
securityEngineerJob.style.display = "block";
networkEngineerJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.VolhavenHeliosLabs,
1200, 28, 75, 5.4);
1200, 28, 75, 3);
break;
case Locations.VolhavenOmniaCybersystems:
@ -988,7 +994,7 @@ function displayLocationContent() {
networkEngineerJob.style.display = "block";
securityJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.VolhavenOmniaCybersystems,
900, 28, 90, 5.8);
810, 28, 90, 4.9);
break;
case Locations.VolhavenLexoCorp:
@ -1002,7 +1008,7 @@ function displayLocationContent() {
businessJob.style.display = "block";
securityJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.VolhavenLexoCorp,
500, 14, 40, 3.1);
375, 14, 60, 2);
break;
case Locations.VolhavenSysCoreSecurities:
@ -1013,7 +1019,7 @@ function displayLocationContent() {
securityEngineerJob.style.display = "block";
networkEngineerJob.style.display = "block";
setInfiltrateButton(infiltrate, Locations.VolhavenSysCoreSecurities,
600, 16, 50, 3.6);
480, 18, 75, 2.4);
break;
case Locations.VolhavenCompuTek:
@ -1035,7 +1041,7 @@ function displayLocationContent() {
purchaseHomeRam.style.display = "block";
purchaseHomeCores.style.display = "block";
setInfiltrateButton(infiltrate, Locations.VolhavenCompuTek,
300, 12, 35, 3.1);
215, 12, 60, 2.1);
break;
case Locations.VolhavenMilleniumFitnessGym:

@ -1,14 +1,14 @@
import {Augmentations, Augmentation,
AugmentationNames} from "./Augmentations.js";
import {Programs} from "./CreateProgram.js";
import {inMission} from "./Missions.js";
import {Player} from "./Player.js";
import {redPillFlag} from "./RedPill.js";
import {GetServerByHostname} from "./Server.js";
import {Settings} from "./Settings.js";
import {dialogBoxCreate, dialogBoxOpened} from "../utils/DialogBox.js";
AugmentationNames} from "./Augmentations";
import {Programs} from "./CreateProgram";
import {inMission} from "./Missions";
import {Player} from "./Player";
import {redPillFlag} from "./RedPill";
import {GetServerByHostname} from "./Server";
import {Settings} from "./Settings";
import {dialogBoxCreate, dialogBoxOpened} from "../utils/DialogBox";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver.js";
Generic_fromJSON} from "../utils/JSONReviver";
/* Message.js */
function Message(filename="", msg="") {
@ -88,7 +88,7 @@ function checkForMessagesToSend() {
}
} else if (jumper0 && !jumper0.recvd && Player.hacking_skill >= 25) {
sendMessage(jumper0);
Player.getHomeComputer().programs.push(Programs.Flight);
Player.getHomeComputer().programs.push(Programs.Flight.name);
} else if (jumper1 && !jumper1.recvd && Player.hacking_skill >= 40) {
sendMessage(jumper1);
} else if (cybersecTest && !cybersecTest.recvd && Player.hacking_skill >= 50) {

@ -1,12 +1,12 @@
import {CONSTANTS} from "./Constants.js";
import {Engine} from "./engine.js";
import {displayFactionContent} from "./Faction.js";
import {Player} from "./Player.js";
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {CONSTANTS} from "./Constants";
import {Engine} from "./engine";
import {displayFactionContent} from "./Faction";
import {Player} from "./Player";
import {dialogBoxCreate} from "../utils/DialogBox";
import {addOffset, getRandomInt,
clearEventListenersEl,
clearEventListeners} from "../utils/HelperFunctions.js";
import {formatNumber, isString} from "../utils/StringHelperFunctions.js";
clearEventListeners} from "../utils/HelperFunctions";
import {formatNumber, isString} from "../utils/StringHelperFunctions";
import jsplumb from 'jsplumb'
let inMission = false; //Flag to denote whether a mission is running

@ -1,6 +1,6 @@
import {HacknetNode} from "./HacknetNode.js";
import {NetscriptFunctions} from "./NetscriptFunctions.js";
import {NetscriptPort} from "./NetscriptPort.js";
import {HacknetNode} from "./HacknetNode";
import {NetscriptFunctions} from "./NetscriptFunctions";
import {NetscriptPort} from "./NetscriptPort";
/* Environment
* NetScript program environment

@ -1,17 +1,17 @@
import {BitNodeMultipliers} from "./BitNode.js";
import {CONSTANTS} from "./Constants.js";
import {Player} from "./Player.js";
import {Environment} from "./NetscriptEnvironment.js";
import {WorkerScript, addWorkerScript} from "./NetscriptWorker.js";
import {Server, getServer} from "./Server.js";
import {Settings} from "./Settings.js";
import {BitNodeMultipliers} from "./BitNode";
import {CONSTANTS} from "./Constants";
import {Player} from "./Player";
import {Environment} from "./NetscriptEnvironment";
import {WorkerScript, addWorkerScript} from "./NetscriptWorker";
import {Server, getServer} from "./Server";
import {Settings} from "./Settings";
import {Script, findRunningScript,
RunningScript} from "./Script.js";
RunningScript} from "./Script";
import {parse, Node} from "../utils/acorn.js";
import {printArray} from "../utils/HelperFunctions.js";
import {isValidIPAddress} from "../utils/IPAddress.js";
import {isString} from "../utils/StringHelperFunctions.js";
import {parse, Node} from "../utils/acorn";
import {printArray} from "../utils/HelperFunctions";
import {isValidIPAddress} from "../utils/IPAddress";
import {isString} from "../utils/StringHelperFunctions";
var Promise = require("bluebird");

@ -1,60 +1,60 @@
var sprintf = require('sprintf-js').sprintf,
vsprintf = require('sprintf-js').vsprintf
import {updateActiveScriptsItems} from "./ActiveScriptsUI.js";
import {updateActiveScriptsItems} from "./ActiveScriptsUI";
import {Augmentations, Augmentation,
augmentationExists, installAugmentations,
AugmentationNames} from "./Augmentations.js";
import {BitNodeMultipliers} from "./BitNode.js";
import {determineCrimeSuccess, findCrime} from "./Crimes.js";
import {Bladeburner} from "./Bladeburner.js";
AugmentationNames} from "./Augmentations";
import {BitNodeMultipliers} from "./BitNode";
import {determineCrimeSuccess, findCrime} from "./Crimes";
import {Bladeburner} from "./Bladeburner";
import {Companies, Company, CompanyPosition,
CompanyPositions, companyExists} from "./Company.js";
import {CONSTANTS} from "./Constants.js";
import {Programs} from "./CreateProgram.js";
import {DarkWebItems} from "./DarkWeb.js";
import {Engine} from "./engine.js";
import {AllGangs} from "./Gang.js";
CompanyPositions, companyExists} from "./Company";
import {CONSTANTS} from "./Constants";
import {Programs} from "./CreateProgram";
import {DarkWebItems} from "./DarkWeb";
import {Engine} from "./engine";
import {AllGangs} from "./Gang";
import {Factions, Faction, joinFaction,
factionExists, purchaseAugmentation} from "./Faction.js";
import {getCostOfNextHacknetNode, purchaseHacknet} from "./HacknetNode.js";
import {Locations} from "./Location.js";
import {Message, Messages} from "./Message.js";
import {inMission} from "./Missions.js";
import {Player} from "./Player.js";
factionExists, purchaseAugmentation} from "./Faction";
import {getCostOfNextHacknetNode, purchaseHacknet} from "./HacknetNode";
import {Locations} from "./Location";
import {Message, Messages} from "./Message";
import {inMission} from "./Missions";
import {Player} from "./Player";
import {Script, findRunningScript, RunningScript,
isScriptFilename} from "./Script.js";
isScriptFilename} from "./Script";
import {Server, getServer, AddToAllServers,
AllServers, processSingleServerGrowth,
GetServerByHostname} from "./Server.js";
import {Settings} from "./Settings.js";
import {SpecialServerIps} from "./SpecialServerIps.js";
GetServerByHostname} from "./Server";
import {Settings} from "./Settings";
import {SpecialServerIps} from "./SpecialServerIps";
import {StockMarket, StockSymbols, SymbolToStockMap, initStockSymbols,
initStockMarket, initSymbolToStockMap, stockMarketCycle, buyStock,
sellStock, updateStockPrices, displayStockMarketContent,
updateStockTicker, updateStockPlayerPosition,
Stock, shortStock, sellShort, OrderTypes,
PositionTypes, placeOrder, cancelOrder} from "./StockMarket.js";
import {post} from "./Terminal.js";
PositionTypes, placeOrder, cancelOrder} from "./StockMarket";
import {post} from "./Terminal";
import {TextFile, getTextFile, createTextFile} from "./TextFile";
import {WorkerScript, workerScripts,
killWorkerScript, NetscriptPorts} from "./NetscriptWorker.js";
killWorkerScript, NetscriptPorts} from "./NetscriptWorker";
import {makeRuntimeRejectMsg, netscriptDelay, runScriptFromScript,
scriptCalculateHackingChance, scriptCalculateHackingTime,
scriptCalculateExpGain, scriptCalculatePercentMoneyHacked,
scriptCalculateGrowTime, scriptCalculateWeakenTime} from "./NetscriptEvaluator.js";
import {Environment} from "./NetscriptEnvironment.js";
import {NetscriptPort} from "./NetscriptPort.js";
scriptCalculateGrowTime, scriptCalculateWeakenTime} from "./NetscriptEvaluator";
import {Environment} from "./NetscriptEnvironment";
import {NetscriptPort} from "./NetscriptPort";
import Decimal from "decimal.js";
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {printArray, powerOfTwo} from "../utils/HelperFunctions.js";
import {createRandomIp} from "../utils/IPAddress.js";
import {formatNumber, isString, isHTML} from "../utils/StringHelperFunctions.js";
import {dialogBoxCreate} from "../utils/DialogBox";
import {printArray, powerOfTwo} from "../utils/HelperFunctions";
import {createRandomIp} from "../utils/IPAddress";
import {formatNumber, isString, isHTML} from "../utils/StringHelperFunctions";
import {yesNoBoxClose, yesNoBoxGetYesButton,
yesNoBoxGetNoButton, yesNoBoxCreate,
yesNoBoxOpen} from "../utils/YesNoBox.js";
yesNoBoxOpen} from "../utils/YesNoBox";
var hasCorporationSF = false, //Source-File 3
hasSingularitySF = false, //Source-File 4
@ -430,7 +430,7 @@ function NetscriptFunctions(workerScript) {
workerScript.scriptRef.log("Cannot call nuke(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call nuke(). Invalid IP or hostname passed in: " + ip);
}
if (!Player.hasProgram(Programs.NukeProgram)) {
if (!Player.hasProgram(Programs.NukeProgram.name)) {
throw makeRuntimeRejectMsg(workerScript, "You do not have the NUKE.exe virus!");
}
if (server.openPortCount < server.numOpenPortsRequired) {
@ -461,7 +461,7 @@ function NetscriptFunctions(workerScript) {
workerScript.scriptRef.log("Cannot call brutessh(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call brutessh(). Invalid IP or hostname passed in: " + ip);
}
if (!Player.hasProgram(Programs.BruteSSHProgram)) {
if (!Player.hasProgram(Programs.BruteSSHProgram.name)) {
workerScript.scriptRef.log("You do not have the BruteSSH.exe program!");
throw makeRuntimeRejectMsg(workerScript, "You do not have the BruteSSH.exe program!");
}
@ -491,7 +491,7 @@ function NetscriptFunctions(workerScript) {
workerScript.scriptRef.log("Cannot call ftpcrack(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call ftpcrack(). Invalid IP or hostname passed in: " + ip);
}
if (!Player.hasProgram(Programs.FTPCrackProgram)) {
if (!Player.hasProgram(Programs.FTPCrackProgram.name)) {
throw makeRuntimeRejectMsg(workerScript, "You do not have the FTPCrack.exe program!");
}
if (!server.ftpPortOpen) {
@ -520,7 +520,7 @@ function NetscriptFunctions(workerScript) {
workerScript.scriptRef.log("Cannot call relaysmtp(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call relaysmtp(). Invalid IP or hostname passed in: " + ip);
}
if (!Player.hasProgram(Programs.RelaySMTPProgram)) {
if (!Player.hasProgram(Programs.RelaySMTPProgram.name)) {
throw makeRuntimeRejectMsg(workerScript, "You do not have the relaySMTP.exe program!");
}
if (!server.smtpPortOpen) {
@ -549,7 +549,7 @@ function NetscriptFunctions(workerScript) {
workerScript.scriptRef.log("Cannot call httpworm(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call httpworm(). Invalid IP or hostname passed in: " + ip);
}
if (!Player.hasProgram(Programs.HTTPWormProgram)) {
if (!Player.hasProgram(Programs.HTTPWormProgram.name)) {
throw makeRuntimeRejectMsg(workerScript, "You do not have the HTTPWorm.exe program!");
}
if (!server.httpPortOpen) {
@ -578,7 +578,7 @@ function NetscriptFunctions(workerScript) {
workerScript.scriptRef.log("Cannot call sqlinject(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call sqlinject(). Invalid IP or hostname passed in: " + ip);
}
if (!Player.hasProgram(Programs.SQLInjectProgram)) {
if (!Player.hasProgram(Programs.SQLInjectProgram.name)) {
throw makeRuntimeRejectMsg(workerScript, "You do not have the SQLInject.exe program!");
}
if (!server.sqlPortOpen) {
@ -2900,78 +2900,34 @@ function NetscriptFunctions(workerScript) {
}
}
switch(name.toLowerCase()) {
case Programs.NukeProgram.toLowerCase():
Player.startCreateProgramWork(Programs.NukeProgram, CONSTANTS.MillisecondsPerFiveMinutes, 1);
break;
case Programs.BruteSSHProgram.toLowerCase():
if (Player.hacking_skill < 50) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create BruteSSH (level 50 req)");
return false;
}
Player.startCreateProgramWork(Programs.BruteSSHProgram, CONSTANTS.MillisecondsPerFiveMinutes * 2, 50);
break;
case Programs.FTPCrackProgram.toLowerCase():
if (Player.hacking_skill < 100) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create FTPCrack (level 100 req)");
return false;
}
Player.startCreateProgramWork(Programs.FTPCrackProgram, CONSTANTS.MillisecondsPerHalfHour, 100);
break;
case Programs.RelaySMTPProgram.toLowerCase():
if (Player.hacking_skill < 250) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create relaySMTP (level 250 req)");
return false;
}
Player.startCreateProgramWork(Programs.RelaySMTPProgram, CONSTANTS.MillisecondsPer2Hours, 250);
break;
case Programs.HTTPWormProgram.toLowerCase():
if (Player.hacking_skill < 500) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create HTTPWorm (level 500 req)");
return false;
}
Player.startCreateProgramWork(Programs.HTTPWormProgram, CONSTANTS.MillisecondsPer4Hours, 500);
break;
case Programs.SQLInjectProgram.toLowerCase():
if (Player.hacking_skill < 750) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create SQLInject (level 750 req)");
return false;
}
Player.startCreateProgramWork(Programs.SQLInjectProgram, CONSTANTS.MillisecondsPer8Hours, 750);
break;
case Programs.DeepscanV1.toLowerCase():
if (Player.hacking_skill < 75) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create DeepscanV1 (level 75 req)");
return false;
}
Player.startCreateProgramWork(Programs.DeepscanV1, CONSTANTS.MillisecondsPerQuarterHour, 75);
break;
case Programs.DeepscanV2.toLowerCase():
if (Player.hacking_skill < 400) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create DeepscanV2 (level 400 req)");
return false;
}
Player.startCreateProgramWork(Programs.DeepscanV2, CONSTANTS.MillisecondsPer2Hours, 400);
break;
case Programs.ServerProfiler.toLowerCase():
if (Player.hacking_skill < 75) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create ServerProfiler (level 75 req)");
return false;
}
Player.startCreateProgramWork(Programs.ServerProfiler, CONSTANTS.MillisecondsPerHalfHour, 75);
break;
case Programs.AutoLink.toLowerCase():
if (Player.hacking_skill < 25) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create AutoLink (level 25 req)");
return false;
}
Player.startCreateProgramWork(Programs.AutoLink, CONSTANTS.MillisecondsPerQuarterHour, 25);
break;
default:
workerScript.scriptRef.log("ERROR: createProgram() failed because the specified program does not exist: " + name);
return false;
name = name.toLowerCase();
let p = null;
for (const key in Programs) {
if(Programs[key].name.toLowerCase() == name) {
p = Programs[key];
}
}
if (p == null) {
workerScript.scriptRef.log("ERROR: createProgram() failed because the specified program does not exist: " + name);
return false;
}
if (Player.hasProgram(p.name)) {
workerScript.scriptRef.log('ERROR: createProgram() failed because you already have the ' + p.name + ' program');
return false;
}
if (!p.create.req()) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create " + p.name + " (level " + p.create.level + " req)");
return false
}
Player.startCreateProgramWork(p.name, p.create.time, p.create.level);
if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.createProgram == null) {
workerScript.scriptRef.log("Began creating program: " + name);
}
workerScript.scriptRef.log("Began creating program: " + name);
return true;
},
commitCrime : function(crimeRoughName) {
@ -3215,57 +3171,57 @@ function NetscriptFunctions(workerScript) {
//Bladeburner API
bladeburner : {
getContractNames : function(name) {
getContractNames : function() {
if (workerScript.checkingRam) {
return updateStaticRam("getContractNames", CONSTANTS.ScriptBladeburnerApiBaseRamCost / 10);
}
updateDynamicRam("getContractNames", CONSTANTS.ScriptBladeburnerApiBaseRamCost / 10);
if (Player.bladeburner instanceof Bladeburner && (Player.bitNodeN === 7 || hasBladeburner2079SF)) {
return Player.bladeburner.getContractNamesNetscriptFn(name);
return Player.bladeburner.getContractNamesNetscriptFn();
}
throw makeRuntimeRejectMsg(workerScript, "getContractNames() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7");
},
getOperationNames : function(name) {
getOperationNames : function() {
if (workerScript.checkingRam) {
return updateStaticRam("getOperationNames", CONSTANTS.ScriptBladeburnerApiBaseRamCost / 10);
}
updateDynamicRam("getOperationNames", CONSTANTS.ScriptBladeburnerApiBaseRamCost / 10);
if (Player.bladeburner instanceof Bladeburner && (Player.bitNodeN === 7 || hasBladeburner2079SF)) {
return Player.bladeburner.getOperationNamesNetscriptFn(name);
return Player.bladeburner.getOperationNamesNetscriptFn();
}
throw makeRuntimeRejectMsg(workerScript, "getOperationNames() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7");
},
getBlackOpNames : function(name) {
getBlackOpNames : function() {
if (workerScript.checkingRam) {
return updateStaticRam("getBlackOpNames", CONSTANTS.ScriptBladeburnerApiBaseRamCost / 10);
}
updateDynamicRam("getBlackOpNames", CONSTANTS.ScriptBladeburnerApiBaseRamCost / 10);
if (Player.bladeburner instanceof Bladeburner && (Player.bitNodeN === 7 || hasBladeburner2079SF)) {
return Player.bladeburner.getBlackOpNamesNetscriptFn(name);
return Player.bladeburner.getBlackOpNamesNetscriptFn();
}
throw makeRuntimeRejectMsg(workerScript, "getBlackOpNames() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7");
},
getGeneralActionNames : function(name) {
getGeneralActionNames : function() {
if (workerScript.checkingRam) {
return updateStaticRam("getGeneralActionNames", CONSTANTS.ScriptBladeburnerApiBaseRamCost / 10);
}
updateDynamicRam("getGeneralActionNames", CONSTANTS.ScriptBladeburnerApiBaseRamCost / 10);
if (Player.bladeburner instanceof Bladeburner && (Player.bitNodeN === 7 || hasBladeburner2079SF)) {
return Player.bladeburner.getGeneralActionNamesNetscriptFn(name);
return Player.bladeburner.getGeneralActionNamesNetscriptFn();
}
throw makeRuntimeRejectMsg(workerScript, "getGeneralActionNames() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7");
},
getSkillNames : function(name) {
getSkillNames : function() {
if (workerScript.checkingRam) {
return updateStaticRam("getSkillNames", CONSTANTS.ScriptBladeburnerApiBaseRamCost / 10);
}
updateDynamicRam("getSkillNames", CONSTANTS.ScriptBladeburnerApiBaseRamCost / 10);
if (Player.bladeburner instanceof Bladeburner && (Player.bitNodeN === 7 || hasBladeburner2079SF)) {
return Player.bladeburner.getSkillNamesNetscriptFn(name);
return Player.bladeburner.getSkillNamesNetscriptFn();
}
throw makeRuntimeRejectMsg(workerScript, "getSkillNames() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7");

@ -1,5 +1,5 @@
import {registerEnv, unregisterEnv, makeEnvHeader} from "./NetscriptJSPreamble.js";
import {makeRuntimeRejectMsg} from "./NetscriptEvaluator.js";
import {registerEnv, unregisterEnv, makeEnvHeader} from "./NetscriptJSPreamble";
import {makeRuntimeRejectMsg} from "./NetscriptEvaluator";
// Makes a blob that contains the code of a given script.
export function makeScriptBlob(code) {

@ -1,4 +1,4 @@
import {Settings} from "./Settings.js";
import {Settings} from "./Settings";
function NetscriptPort() {
this.data = [];

@ -1,20 +1,20 @@
import {addActiveScriptsItem,
deleteActiveScriptsItem,
updateActiveScriptsItems} from "./ActiveScriptsUI.js";
import {CONSTANTS} from "./Constants.js";
import {Engine} from "./engine.js";
import {Environment} from "./NetscriptEnvironment.js";
updateActiveScriptsItems} from "./ActiveScriptsUI";
import {CONSTANTS} from "./Constants";
import {Engine} from "./engine";
import {Environment} from "./NetscriptEnvironment";
import {evaluate, isScriptErrorMessage,
makeRuntimeRejectMsg,
killNetscriptDelay} from "./NetscriptEvaluator.js";
import {executeJSScript} from "./NetscriptJSEvaluator.js";
import {NetscriptPort} from "./NetscriptPort.js";
import {AllServers} from "./Server.js";
import {Settings} from "./Settings.js";
killNetscriptDelay} from "./NetscriptEvaluator";
import {executeJSScript} from "./NetscriptJSEvaluator";
import {NetscriptPort} from "./NetscriptPort";
import {AllServers} from "./Server";
import {Settings} from "./Settings";
import {parse} from "../utils/acorn.js";
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {compareArrays, printArray} from "../utils/HelperFunctions.js";
import {parse} from "../utils/acorn";
import {dialogBoxCreate} from "../utils/DialogBox";
import {compareArrays, printArray} from "../utils/HelperFunctions";
function WorkerScript(runningScriptObj) {
this.name = runningScriptObj.filename;

@ -1,33 +1,33 @@
import {Augmentations, applyAugmentation,
AugmentationNames,
PlayerOwnedAugmentation} from "./Augmentations.js";
import {BitNodes, BitNode, BitNodeMultipliers} from "./BitNode.js";
PlayerOwnedAugmentation} from "./Augmentations";
import {BitNodes, BitNode, BitNodeMultipliers} from "./BitNode";
import {Company, Companies, getNextCompanyPosition,
getJobRequirementText, CompanyPosition,
CompanyPositions} from "./Company.js";
import {CONSTANTS} from "./Constants.js";
import {Corporation} from "./CompanyManagement.js";
import {Programs} from "./CreateProgram.js";
import {determineCrimeSuccess, Crimes} from "./Crimes.js";
import {Engine} from "./engine.js";
CompanyPositions} from "./Company";
import {CONSTANTS} from "./Constants";
import {Corporation} from "./CompanyManagement";
import {Programs} from "./CreateProgram";
import {determineCrimeSuccess, Crimes} from "./Crimes";
import {Engine} from "./engine";
import {Factions, Faction,
displayFactionContent} from "./Faction.js";
import {Gang, resetGangs} from "./Gang.js";
import {Locations} from "./Location.js";
import {hasBn11SF, hasWallStreetSF,hasAISF} from "./NetscriptFunctions.js";
import {AllServers, Server, AddToAllServers} from "./Server.js";
import {SpecialServerIps, SpecialServerNames} from "./SpecialServerIps.js";
import {SourceFiles, applySourceFile} from "./SourceFile.js";
displayFactionContent} from "./Faction";
import {Gang, resetGangs} from "./Gang";
import {Locations} from "./Location";
import {hasBn11SF, hasWallStreetSF,hasAISF} from "./NetscriptFunctions";
import {AllServers, Server, AddToAllServers} from "./Server";
import {SpecialServerIps, SpecialServerNames} from "./SpecialServerIps";
import {SourceFiles, applySourceFile} from "./SourceFile";
import Decimal from "decimal.js";
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {clearEventListeners} from "../utils/HelperFunctions.js";
import {createRandomIp} from "../utils/IPAddress.js";
import {dialogBoxCreate} from "../utils/DialogBox";
import {clearEventListeners} from "../utils/HelperFunctions";
import {createRandomIp} from "../utils/IPAddress";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver.js";
Generic_fromJSON} from "../utils/JSONReviver";
import numeral from "numeral/min/numeral.min";
import {formatNumber,
convertTimeMsToTimeElapsedString} from "../utils/StringHelperFunctions.js";
convertTimeMsToTimeElapsedString} from "../utils/StringHelperFunctions";
function PlayerObject() {
//Skills and stats
@ -220,7 +220,7 @@ PlayerObject.prototype.init = function() {
this.currentServer = t_homeComp.ip;
AddToAllServers(t_homeComp);
this.getHomeComputer().programs.push(Programs.NukeProgram);
this.getHomeComputer().programs.push(Programs.NukeProgram.name);
}
PlayerObject.prototype.prestigeAugmentation = function() {

@ -1,39 +1,39 @@
import {deleteActiveScriptsItem} from "./ActiveScriptsUI.js";
import {deleteActiveScriptsItem} from "./ActiveScriptsUI";
import {Augmentations, augmentationExists,
initAugmentations, AugmentationNames} from "./Augmentations.js";
import {initBitNodeMultipliers} from "./BitNode.js";
import {Bladeburner} from "./Bladeburner.js";
import {writeCinematicText} from "./CinematicText.js";
import {Companies, Company, initCompanies} from "./Company.js";
import {Programs} from "./CreateProgram.js";
import {Engine} from "./engine.js";
initAugmentations, AugmentationNames} from "./Augmentations";
import {initBitNodeMultipliers} from "./BitNode";
import {Bladeburner} from "./Bladeburner";
import {writeCinematicText} from "./CinematicText";
import {Companies, Company, initCompanies} from "./Company";
import {Programs} from "./CreateProgram";
import {Engine} from "./engine";
import {Factions, Faction, initFactions,
joinFaction} from "./Faction.js";
import {deleteGangDisplayContent} from "./Gang.js";
import {Locations} from "./Location.js";
import {initMessages, Messages, Message} from "./Message.js";
import {initSingularitySFFlags, hasWallStreetSF}from "./NetscriptFunctions.js";
joinFaction} from "./Faction";
import {deleteGangDisplayContent} from "./Gang";
import {Locations} from "./Location";
import {initMessages, Messages, Message} from "./Message";
import {initSingularitySFFlags, hasWallStreetSF}from "./NetscriptFunctions";
import {WorkerScript, workerScripts,
prestigeWorkerScripts} from "./NetscriptWorker.js";
import {Player} from "./Player.js";
prestigeWorkerScripts} from "./NetscriptWorker";
import {Player} from "./Player";
import {AllServers, AddToAllServers,
initForeignServers, Server,
prestigeAllServers,
prestigeHomeComputer} from "./Server.js";
prestigeHomeComputer} from "./Server";
import {SpecialServerIps, SpecialServerIpsMap,
prestigeSpecialServerIps,
SpecialServerNames} from "./SpecialServerIps.js";
SpecialServerNames} from "./SpecialServerIps";
import {initStockMarket, initSymbolToStockMap,
stockMarketContentCreated,
setStockMarketContentCreated} from "./StockMarket.js";
import {Terminal, postNetburnerText} from "./Terminal.js";
setStockMarketContentCreated} from "./StockMarket";
import {Terminal, postNetburnerText} from "./Terminal";
import Decimal from "decimal.js";
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {dialogBoxCreate} from "../utils/DialogBox";
import {createPopup, createElement,
removeElementById, exceptionAlert} from "../utils/HelperFunctions.js";
removeElementById, exceptionAlert} from "../utils/HelperFunctions";
import {yesNoBoxCreate, yesNoBoxGetYesButton,
yesNoBoxGetNoButton, yesNoBoxClose} from "../utils/YesNoBox.js";
yesNoBoxGetNoButton, yesNoBoxClose} from "../utils/YesNoBox";
let BitNode8StartingMoney = 250e6;
@ -59,13 +59,13 @@ function prestigeAugmentation() {
if (augmentationExists(AugmentationNames.Neurolink) &&
Augmentations[AugmentationNames.Neurolink].owned) {
homeComp.programs.push(Programs.FTPCrackProgram);
homeComp.programs.push(Programs.RelaySMTPProgram);
homeComp.programs.push(Programs.FTPCrackProgram.name);
homeComp.programs.push(Programs.RelaySMTPProgram.name);
}
if (augmentationExists(AugmentationNames.CashRoot) &&
Augmentations[AugmentationNames.CashRoot].owned) {
Player.setMoney(new Decimal(1000000));
homeComp.programs.push(Programs.BruteSSHProgram);
homeComp.programs.push(Programs.BruteSSHProgram.name);
}
//Re-create foreign servers
@ -191,9 +191,6 @@ function prestigeSourceFile() {
}
homeComp.cpuCores = 1;
//Darkweb is purchase-able
document.getElementById("location-purchase-tor").setAttribute("class", "a-link-button");
//Reset favor for Companies
for (var member in Companies) {
if (Companies.hasOwnProperty(member)) {

@ -1,16 +1,16 @@
import {BitNode, BitNodes} from "./BitNode.js";
import {Engine} from "./engine.js";
import {Player} from "./Player.js";
import {prestigeSourceFile} from "./Prestige.js";
import {BitNode, BitNodes} from "./BitNode";
import {Engine} from "./engine";
import {Player} from "./Player";
import {prestigeSourceFile} from "./Prestige";
import {SourceFiles, SourceFile,
PlayerOwnedSourceFile} from "./SourceFile.js";
import {Terminal} from "./Terminal.js";
PlayerOwnedSourceFile} from "./SourceFile";
import {Terminal} from "./Terminal";
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {dialogBoxCreate} from "../utils/DialogBox";
import {clearEventListeners,
removeChildrenFromElement} from "../utils/HelperFunctions.js";
removeChildrenFromElement} from "../utils/HelperFunctions";
import {yesNoBoxCreate, yesNoBoxGetYesButton,
yesNoBoxGetNoButton, yesNoBoxClose} from "../utils/YesNoBox.js";
yesNoBoxGetNoButton, yesNoBoxClose} from "../utils/YesNoBox";
/* RedPill.js
* Implements what happens when you have Red Pill augmentation and then hack the world daemon */

@ -1,29 +1,29 @@
import {loadAliases, loadGlobalAliases,
Aliases, GlobalAliases} from "./Alias.js";
Aliases, GlobalAliases} from "./Alias";
import {loadCompanies, Companies,
CompanyPositions} from "./Company.js";
import {CONSTANTS} from "./Constants.js";
import {Engine} from "./engine.js";
CompanyPositions} from "./Company";
import {CONSTANTS} from "./Constants";
import {Engine} from "./engine";
import {loadFactions, Factions,
processPassiveFactionRepGain} from "./Faction.js";
import {FconfSettings, loadFconf} from "./Fconf.js";
import {loadAllGangs, AllGangs} from "./Gang.js";
processPassiveFactionRepGain} from "./Faction";
import {FconfSettings, loadFconf} from "./Fconf";
import {loadAllGangs, AllGangs} from "./Gang";
import {processAllHacknetNodeEarnings,
createPlayerHacknetNodeWrappers} from "./HacknetNode.js";
import {loadMessages, initMessages, Messages} from "./Message.js";
import {Player, loadPlayer} from "./Player.js";
import {loadAllRunningScripts} from "./Script.js";
import {AllServers, loadAllServers} from "./Server.js";
import {loadSettings, initSettings, Settings} from "./Settings.js";
import {loadSpecialServerIps, SpecialServerIps} from "./SpecialServerIps.js";
import {loadStockMarket, StockMarket} from "./StockMarket.js";
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {gameOptionsBoxClose} from "../utils/GameOptions.js";
createPlayerHacknetNodeWrappers} from "./HacknetNode";
import {loadMessages, initMessages, Messages} from "./Message";
import {Player, loadPlayer} from "./Player";
import {loadAllRunningScripts} from "./Script";
import {AllServers, loadAllServers} from "./Server";
import {loadSettings, initSettings, Settings} from "./Settings";
import {loadSpecialServerIps, SpecialServerIps} from "./SpecialServerIps";
import {loadStockMarket, StockMarket} from "./StockMarket";
import {dialogBoxCreate} from "../utils/DialogBox";
import {gameOptionsBoxClose} from "../utils/GameOptions";
import {clearEventListeners, createElement,
createPopup, removeElementById} from "../utils/HelperFunctions.js";
createPopup, removeElementById} from "../utils/HelperFunctions";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver.js";
import {formatNumber} from "../utils/StringHelperFunctions.js";
Generic_fromJSON} from "../utils/JSONReviver";
import {formatNumber} from "../utils/StringHelperFunctions";
import Decimal from "decimal.js";

@ -17,28 +17,28 @@ require("brace/ext/language_tools");
// Importing this doesn't work for some reason.
const walk = require("acorn/dist/walk");
import {CONSTANTS} from "./Constants.js";
import {Engine} from "./engine.js";
import {FconfSettings, parseFconfSettings} from "./Fconf.js";
import {CONSTANTS} from "./Constants";
import {Engine} from "./engine";
import {FconfSettings, parseFconfSettings} from "./Fconf";
import {iTutorialSteps, iTutorialNextStep,
iTutorialIsRunning, currITutorialStep} from "./InteractiveTutorial.js";
import {evaluateImport} from "./NetscriptEvaluator.js";
import {NetscriptFunctions} from "./NetscriptFunctions.js";
iTutorialIsRunning, currITutorialStep} from "./InteractiveTutorial";
import {evaluateImport} from "./NetscriptEvaluator";
import {NetscriptFunctions} from "./NetscriptFunctions";
import {addWorkerScript, killWorkerScript,
WorkerScript} from "./NetscriptWorker.js";
import {Player} from "./Player.js";
import {AllServers, processSingleServerGrowth} from "./Server.js";
import {Settings} from "./Settings.js";
import {post, Terminal} from "./Terminal.js";
WorkerScript} from "./NetscriptWorker";
import {Player} from "./Player";
import {AllServers, processSingleServerGrowth} from "./Server";
import {Settings} from "./Settings";
import {post, Terminal} from "./Terminal";
import {TextFile} from "./TextFile";
import {parse, Node} from "../utils/acorn.js";
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {parse, Node} from "../utils/acorn";
import {dialogBoxCreate} from "../utils/DialogBox";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver.js";
import {compareArrays, createElement} from "../utils/HelperFunctions.js";
Generic_fromJSON} from "../utils/JSONReviver";
import {compareArrays, createElement} from "../utils/HelperFunctions";
import {formatNumber, numOccurrences,
numNetscriptOperators} from "../utils/StringHelperFunctions.js";
numNetscriptOperators} from "../utils/StringHelperFunctions";
var keybindings = {
ace: null,

@ -1,13 +1,13 @@
import {BitNodeMultipliers} from "./BitNode.js";
import {CONSTANTS} from "./Constants.js";
import {Programs} from "./CreateProgram.js";
import {Player} from "./Player.js";
import {RunningScript, Script} from "./Script.js";
import {SpecialServerNames, SpecialServerIps} from "./SpecialServerIps.js";
import {getRandomInt} from "../utils/HelperFunctions.js";
import {createRandomIp, isValidIPAddress, ipExists} from "../utils/IPAddress.js";
import {BitNodeMultipliers} from "./BitNode";
import {CONSTANTS} from "./Constants";
import {Programs} from "./CreateProgram";
import {Player} from "./Player";
import {RunningScript, Script} from "./Script";
import {SpecialServerNames, SpecialServerIps} from "./SpecialServerIps";
import {getRandomInt} from "../utils/HelperFunctions";
import {createRandomIp, isValidIPAddress, ipExists} from "../utils/IPAddress";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver.js";
Generic_fromJSON} from "../utils/JSONReviver";
function Server(params={ip:createRandomIp(), hostname:""}) {
/* Properties */
@ -93,18 +93,23 @@ Server.prototype.getScript = function(scriptName) {
return null;
}
//Strengthens a server's security level (difficulty) by the specified amount
Server.prototype.fortify = function(amt) {
this.hackDifficulty += amt;
Server.prototype.capDifficulty = function() {
if (this.hackDifficulty < this.minDifficulty) {this.hackDifficulty = this.minDifficulty;}
if (this.hackDifficulty < 1) {this.hackDifficulty = 1;}
//Place some arbitrarily limit that realistically should never happen unless someone is
//screwing around with the game
if (this.hackDifficulty > 1000000) {this.hackDifficulty = 1000000;}
}
//Strengthens a server's security level (difficulty) by the specified amount
Server.prototype.fortify = function(amt) {
this.hackDifficulty += amt;
this.capDifficulty();
}
Server.prototype.weaken = function(amt) {
this.hackDifficulty -= (amt * BitNodeMultipliers.ServerWeakenRate);
if (this.hackDifficulty < this.minDifficulty) {this.hackDifficulty = this.minDifficulty;}
if (this.hackDifficulty < 1) {this.hackDifficulty = 1;}
this.capDifficulty();
}
//Functions for loading and saving a Server
@ -817,7 +822,8 @@ function processSingleServerGrowth(server, numCycles) {
// if there was any growth at all, increase security
if(oldMoneyAvailable !== server.moneyAvailable) {
//Growing increases server security twice as much as hacking
const usedCycles = numCycleForGrowth(server, server.moneyAvailable / oldMoneyAvailable);
let usedCycles = numCycleForGrowth(server, server.moneyAvailable / oldMoneyAvailable);
usedCycles = Math.max(0, usedCycles);
server.fortify(2 * CONSTANTS.ServerFortifyAmount * Math.ceil(usedCycles));
}
return server.moneyAvailable / oldMoneyAvailable;
@ -829,7 +835,7 @@ function prestigeHomeComputer(homeComp) {
homeComp.serversOnNetwork = [];
homeComp.isConnectedTo = true;
homeComp.ramUsed = 0;
homeComp.programs.push(Programs.NukeProgram);
homeComp.programs.push(Programs.NukeProgram.name);
//Update RAM usage on all scripts
homeComp.scripts.forEach(function(script) {

@ -1,9 +1,9 @@
import {CONSTANTS} from "./Constants.js";
import {Player} from "./Player.js";
import {Server, AllServers, AddToAllServers} from "./Server.js";
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {createRandomIp} from "../utils/IPAddress.js";
import {yesNoTxtInpBoxGetInput} from "../utils/YesNoBox.js";
import {CONSTANTS} from "./Constants";
import {Player} from "./Player";
import {Server, AllServers, AddToAllServers} from "./Server";
import {dialogBoxCreate} from "../utils/DialogBox";
import {createRandomIp} from "../utils/IPAddress";
import {yesNoTxtInpBoxGetInput} from "../utils/YesNoBox";
/* Functions to handle any server-related purchasing:

@ -1,20 +1,21 @@
import {Engine} from "./engine.js";
import {Engine} from "./engine";
/* Settings.js */
let Settings = {
CodeInstructionRunTime: 50,
MaxLogCapacity: 50,
MaxPortCapacity: 50,
SuppressMessages: false,
SuppressFactionInvites: false,
SuppressTravelConfirmation: false,
AutosaveInterval: 60,
DisableHotkeys: false,
ThemeHighlightColor: "#ffffff",
ThemeFontColor: "#66ff33",
ThemeBackgroundColor: "#000000",
EditorTheme: "Monokai",
EditorKeybinding: "ace",
CodeInstructionRunTime: 50,
MaxLogCapacity: 50,
MaxPortCapacity: 50,
SuppressMessages: false,
SuppressFactionInvites: false,
SuppressTravelConfirmation: false,
SuppressBuyAugmentationConfirmation: false,
AutosaveInterval: 60,
DisableHotkeys: false,
ThemeHighlightColor: "#ffffff",
ThemeFontColor: "#66ff33",
ThemeBackgroundColor: "#000000",
EditorTheme: "Monokai",
EditorKeybinding: "ace",
}
function loadSettings(saveString) {
@ -28,6 +29,7 @@ function initSettings() {
Settings.SuppressMessages = false;
Settings.SuppressFactionInvites = false;
Settings.SuppressTravelConfirmation = false;
Settings.SuppressBuyAugmentationConfirmation = false;
Settings.AutosaveInterval = 60;
Settings.DisableHotkeys = false;
}
@ -39,6 +41,7 @@ function setSettingsLabels() {
var suppressMsgs = document.getElementById("settingsSuppressMessages");
var suppressFactionInv = document.getElementById("settingsSuppressFactionInvites")
var suppressTravelConfirmation = document.getElementById("settingsSuppressTravelConfirmation");
var suppressBuyAugmentationConfirmation = document.getElementById("settingsSuppressBuyAugmentationConfirmation");
var autosaveInterval = document.getElementById("settingsAutosaveIntervalValLabel");
var disableHotkeys = document.getElementById("settingsDisableHotkeys");
@ -49,6 +52,7 @@ function setSettingsLabels() {
suppressMsgs.checked = Settings.SuppressMessages;
suppressFactionInv.checked = Settings.SuppressFactionInvites;
suppressTravelConfirmation.checked = Settings.SuppressTravelConfirmation;
suppressBuyAugmentationConfirmation.checked = Settings.SuppressBuyAugmentationConfirmation;
autosaveInterval.innerHTML = Settings.AutosaveInterval;
disableHotkeys.checked = Settings.DisableHotkeys;
@ -99,6 +103,11 @@ function setSettingsLabels() {
Settings.SuppressTravelConfirmation = this.checked;
};
suppressBuyAugmentationConfirmation.onclick = function() {
Settings.SuppressBuyAugmentationConfirmation = this.checked;
console.log('sup buy: '+Settings.SuppressBuyAugmentationConfirmation);
};
disableHotkeys.onclick = function() {
Settings.DisableHotkeys = this.checked;
}

@ -1,5 +1,5 @@
import {Player} from "./Player.js";
import {BitNode, BitNodes} from "./BitNode.js";
import {Player} from "./Player";
import {BitNode, BitNodes} from "./BitNode";
/* SourceFile.js */
//Each SourceFile corresponds to a BitNode with the same number

@ -1,5 +1,5 @@
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver.js";
Generic_fromJSON} from "../utils/JSONReviver";
/* Holds IP of Special Servers */
let SpecialServerNames = {

@ -1,23 +1,23 @@
import {CONSTANTS} from "./Constants.js";
import {Engine} from "./engine.js";
import {Locations} from "./Location.js";
import {hasWallStreetSF, wallStreetSFLvl} from "./NetscriptFunctions.js";
import {WorkerScript} from "./NetscriptWorker.js";
import {Player} from "./Player.js";
import {CONSTANTS} from "./Constants";
import {Engine} from "./engine";
import {Locations} from "./Location";
import {hasWallStreetSF, wallStreetSFLvl} from "./NetscriptFunctions";
import {WorkerScript} from "./NetscriptWorker";
import {Player} from "./Player";
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {dialogBoxCreate} from "../utils/DialogBox";
import {clearEventListeners, getRandomInt,
removeElementById,
clearEventListenersEl} from "../utils/HelperFunctions.js";
clearEventListenersEl} from "../utils/HelperFunctions";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver.js";
Generic_fromJSON} from "../utils/JSONReviver";
import numeral from "numeral/min/numeral.min";
import {formatNumber} from "../utils/StringHelperFunctions.js";
import {formatNumber} from "../utils/StringHelperFunctions";
import {yesNoBoxCreate, yesNoTxtInpBoxCreate,
yesNoBoxGetYesButton, yesNoBoxGetNoButton,
yesNoTxtInpBoxGetYesButton, yesNoTxtInpBoxGetNoButton,
yesNoTxtInpBoxGetInput, yesNoBoxClose,
yesNoTxtInpBoxClose, yesNoBoxOpen} from "../utils/YesNoBox.js";
yesNoTxtInpBoxClose, yesNoBoxOpen} from "../utils/YesNoBox";
let StockPriceCap = 1e9; //Put a limit on how high a price can go

@ -1,44 +1,45 @@
import {substituteAliases, printAliases,
parseAliasDeclaration,
removeAlias, GlobalAliases,
Aliases} from "./Alias.js";
import {CONSTANTS} from "./Constants.js";
import {Programs} from "./CreateProgram.js";
Aliases} from "./Alias";
import {CONSTANTS} from "./Constants";
import {Programs} from "./CreateProgram";
import {executeDarkwebTerminalCommand,
checkIfConnectedToDarkweb,
DarkWebItems} from "./DarkWeb.js";
import {Engine} from "./engine.js";
DarkWebItems} from "./DarkWeb";
import {Engine} from "./engine";
import {FconfSettings, parseFconfSettings,
createFconf} from "./Fconf.js";
createFconf} from "./Fconf";
import {TerminalHelpText, HelpTexts} from "./HelpText";
import {iTutorialNextStep, iTutorialSteps,
iTutorialIsRunning,
currITutorialStep} from "./InteractiveTutorial.js";
import {showLiterature} from "./Literature.js";
import {showMessage, Message} from "./Message.js";
currITutorialStep} from "./InteractiveTutorial";
import {showLiterature} from "./Literature";
import {showMessage, Message} from "./Message";
import {scriptCalculateHackingTime,
scriptCalculateGrowTime,
scriptCalculateWeakenTime} from "./NetscriptEvaluator.js";
import {killWorkerScript, addWorkerScript} from "./NetscriptWorker.js";
import {Player} from "./Player.js";
import {hackWorldDaemon} from "./RedPill.js";
scriptCalculateWeakenTime} from "./NetscriptEvaluator";
import {killWorkerScript, addWorkerScript} from "./NetscriptWorker";
import numeral from "numeral/min/numeral.min";
import {Player} from "./Player";
import {hackWorldDaemon} from "./RedPill";
import {findRunningScript, RunningScript,
AllServersMap, Script,
isScriptFilename} from "./Script.js";
isScriptFilename} from "./Script";
import {AllServers, GetServerByHostname,
getServer, Server} from "./Server.js";
import {Settings} from "./Settings.js";
getServer, Server} from "./Server";
import {Settings} from "./Settings";
import {SpecialServerIps,
SpecialServerNames} from "./SpecialServerIps.js";
SpecialServerNames} from "./SpecialServerIps";
import {TextFile, getTextFile} from "./TextFile";
import {containsAllStrings, longestCommonStart,
formatNumber, isString} from "../utils/StringHelperFunctions.js";
import {addOffset, printArray} from "../utils/HelperFunctions.js";
import {logBoxCreate} from "../utils/LogBox.js";
formatNumber, isString} from "../utils/StringHelperFunctions";
import {addOffset, printArray} from "../utils/HelperFunctions";
import {logBoxCreate} from "../utils/LogBox";
import {yesNoBoxCreate,
yesNoBoxGetYesButton,
yesNoBoxGetNoButton, yesNoBoxClose} from "../utils/YesNoBox.js";
yesNoBoxGetNoButton, yesNoBoxClose} from "../utils/YesNoBox";
import * as JSZip from 'jszip';
import * as FileSaver from 'file-saver';
@ -1355,11 +1356,11 @@ let Terminal = {
post("Incorrect usage of scan-analyze command. depth argument must be positive numeric");
return;
}
if (depth > 3 && !Player.hasProgram(Programs.DeepscanV1) &&
!Player.hasProgram(Programs.DeepscanV2)) {
if (depth > 3 && !Player.hasProgram(Programs.DeepscanV1.name) &&
!Player.hasProgram(Programs.DeepscanV2.name)) {
post("You cannot scan-analyze with that high of a depth. Maximum depth is 3");
return;
} else if (depth > 5 && !Player.hasProgram(Programs.DeepscanV2)) {
} else if (depth > 5 && !Player.hasProgram(Programs.DeepscanV2.name)) {
post("You cannot scan-analyze with that high of a depth. Maximum depth is 5");
return;
} else if (depth > 10) {
@ -1760,7 +1761,7 @@ let Terminal = {
}
if (d == 0) {continue;} //Don't print current server
var titleDashes = Array((d-1) * 4 + 1).join("-");
if (Player.hasProgram(Programs.AutoLink)) {
if (Player.hasProgram(Programs.AutoLink.name)) {
post("<strong>" + titleDashes + "> <a class='scan-analyze-link'>" + s.hostname + "</a></strong>", false);
} else {
post("<strong>" + titleDashes + ">" + s.hostname + "</strong>");
@ -1825,7 +1826,7 @@ let Terminal = {
programName = splitArgs[0];
}
switch (programName) {
case Programs.NukeProgram:
case Programs.NukeProgram.name:
if (s.hasAdminRights) {
post("You already have root access to this computer. There is no reason to run NUKE.exe");
} else {
@ -1838,7 +1839,7 @@ let Terminal = {
}
}
break;
case Programs.BruteSSHProgram:
case Programs.BruteSSHProgram.name:
if (s.sshPortOpen) {
post("SSH Port (22) is already open!");
} else {
@ -1847,7 +1848,7 @@ let Terminal = {
++s.openPortCount;
}
break;
case Programs.FTPCrackProgram:
case Programs.FTPCrackProgram.name:
if (s.ftpPortOpen) {
post("FTP Port (21) is already open!");
} else {
@ -1856,7 +1857,7 @@ let Terminal = {
++s.openPortCount;
}
break;
case Programs.RelaySMTPProgram:
case Programs.RelaySMTPProgram.name:
if (s.smtpPortOpen) {
post("SMTP Port (25) is already open!");
} else {
@ -1865,7 +1866,7 @@ let Terminal = {
++s.openPortCount;
}
break;
case Programs.HTTPWormProgram:
case Programs.HTTPWormProgram.name:
if (s.httpPortOpen) {
post("HTTP Port (80) is already open!");
} else {
@ -1874,7 +1875,7 @@ let Terminal = {
++s.openPortCount;
}
break;
case Programs.SQLInjectProgram:
case Programs.SQLInjectProgram.name:
if (s.sqlPortOpen) {
post("SQL Port (1433) is already open!");
} else {
@ -1883,7 +1884,7 @@ let Terminal = {
++s.openPortCount;
}
break;
case Programs.ServerProfiler:
case Programs.ServerProfiler.name:
if (splitArgs.length != 2) {
post("Must pass a server hostname or IP as an argument for ServerProfiler.exe");
return;
@ -1901,22 +1902,23 @@ let Terminal = {
post("Netscript grow() execution time: " + formatNumber(scriptCalculateGrowTime(serv)/1000, 1) + "s");
post("Netscript weaken() execution time: " + formatNumber(scriptCalculateWeakenTime(serv)/1000, 1) + "s");
break;
case Programs.AutoLink:
case Programs.AutoLink.name:
post("This executable cannot be run.");
post("AutoLink.exe lets you automatically connect to other servers when using 'scan-analyze'.");
post("When using scan-analyze, click on a server's hostname to connect to it.");
break;
case Programs.DeepscanV1:
case Programs.DeepscanV1.name:
post("This executable cannot be run.");
post("DeepscanV1.exe lets you run 'scan-analyze' with a depth up to 5.");
break;
case Programs.DeepscanV2:
case Programs.DeepscanV2.name:
post("This executable cannot be run.");
post("DeepscanV2.exe lets you run 'scan-analyze' with a depth up to 10.");
break;
case Programs.Flight:
case Programs.Flight.name:
post("Augmentations: " + Player.augmentations.length + " / 30");
post("Money: $" + formatNumber(Player.money.toNumber(), 2) + " / $" + formatNumber(100000000000, 2));
post("Money: " + numeral(Player.money.toNumber()).format('($0.000a)') + " / " + numeral(1e11).format('($0.000a)'));
post("One path below must be fulfilled...");
post("----------HACKING PATH----------");
post("Hacking skill: " + Player.hacking_skill + " / 2500");
@ -1926,7 +1928,7 @@ let Terminal = {
post("Dexterity: " + Player.dexterity + " / 1500");
post("Agility: " + Player.agility + " / 1500");
break;
case Programs.BitFlume:
case Programs.BitFlume.name:
var yesBtn = yesNoBoxGetYesButton(),
noBtn = yesNoBoxGetNoButton();
yesBtn.innerHTML = "Travel to BitNode Nexus";

@ -1,65 +1,67 @@
import {dialogBoxCreate} from "../utils/DialogBox.js";
import {gameOptionsBoxOpen, gameOptionsBoxClose}from "../utils/GameOptions.js";
import {dialogBoxCreate} from "../utils/DialogBox";
import {gameOptionsBoxOpen, gameOptionsBoxClose}from "../utils/GameOptions";
import {clearEventListeners, createElement,
removeChildrenFromElement,
exceptionAlert} from "../utils/HelperFunctions.js";
exceptionAlert} from "../utils/HelperFunctions";
import numeral from "numeral/min/numeral.min";
import {formatNumber,
convertTimeMsToTimeElapsedString} from "../utils/StringHelperFunctions.js";
convertTimeMsToTimeElapsedString,
replaceAt} from "../utils/StringHelperFunctions";
import {loxBoxCreate, logBoxUpdateText,
logBoxOpened} from "../utils/LogBox.js";
logBoxOpened} from "../utils/LogBox";
import {updateActiveScriptsItems} from "./ActiveScriptsUI.js";
import {updateActiveScriptsItems} from "./ActiveScriptsUI";
import {Augmentations, installAugmentations,
initAugmentations, AugmentationNames,
displayAugmentationsContent,
PlayerOwnedAugmentation} from "./Augmentations.js";
PlayerOwnedAugmentation} from "./Augmentations";
import {BitNodes, initBitNodes,
initBitNodeMultipliers} from "./BitNode.js";
import {Bladeburner} from "./Bladeburner.js";
import {cinematicTextFlag} from "./CinematicText.js";
import {CompanyPositions, initCompanies} from "./Company.js";
import {Corporation} from "./CompanyManagement.js";
import {CONSTANTS} from "./Constants.js";
import {Programs, displayCreateProgramContent,
initBitNodeMultipliers} from "./BitNode";
import {Bladeburner} from "./Bladeburner";
import {cinematicTextFlag} from "./CinematicText";
import {CompanyPositions, initCompanies} from "./Company";
import {Corporation} from "./CompanyManagement";
import {CONSTANTS} from "./Constants";
import {displayCreateProgramContent,
getNumAvailableCreateProgram,
initCreateProgramButtons} from "./CreateProgram.js";
initCreateProgramButtons,
Programs} from "./CreateProgram";
import {displayFactionContent, joinFaction,
processPassiveFactionRepGain, Factions,
inviteToFaction, initFactions} from "./Faction.js";
import {FconfSettings} from "./Fconf.js";
inviteToFaction, initFactions} from "./Faction";
import {FconfSettings} from "./Fconf";
import {Locations, displayLocationContent,
initLocationButtons} from "./Location.js";
initLocationButtons} from "./Location";
import {displayGangContent, updateGangContent,
Gang} from "./Gang.js";
Gang} from "./Gang";
import {displayHacknetNodesContent, processAllHacknetNodeEarnings,
updateHacknetNodesContent} from "./HacknetNode.js";
import {iTutorialStart} from "./InteractiveTutorial.js";
import {initLiterature} from "./Literature.js";
import {checkForMessagesToSend, initMessages} from "./Message.js";
import {inMission, currMission} from "./Missions.js";
updateHacknetNodesContent} from "./HacknetNode";
import {iTutorialStart} from "./InteractiveTutorial";
import {initLiterature} from "./Literature";
import {checkForMessagesToSend, initMessages} from "./Message";
import {inMission, currMission} from "./Missions";
import {initSingularitySFFlags,
hasSingularitySF, hasCorporationSF} from "./NetscriptFunctions.js";
hasSingularitySF, hasCorporationSF} from "./NetscriptFunctions";
import {updateOnlineScriptTimes,
runScriptsLoop} from "./NetscriptWorker.js";
import {Player} from "./Player.js";
runScriptsLoop} from "./NetscriptWorker";
import {Player} from "./Player";
import {prestigeAugmentation,
prestigeSourceFile} from "./Prestige.js";
import {redPillFlag, hackWorldDaemon} from "./RedPill.js";
import {saveObject, loadGame} from "./SaveObject.js";
prestigeSourceFile} from "./Prestige";
import {redPillFlag, hackWorldDaemon} from "./RedPill";
import {saveObject, loadGame} from "./SaveObject";
import {loadAllRunningScripts, scriptEditorInit,
updateScriptEditorContent} from "./Script.js";
import {AllServers, Server, initForeignServers} from "./Server.js";
import {Settings, setSettingsLabels} from "./Settings.js";
updateScriptEditorContent} from "./Script";
import {AllServers, Server, initForeignServers} from "./Server";
import {Settings, setSettingsLabels} from "./Settings";
import {initSourceFiles, SourceFiles,
PlayerOwnedSourceFile} from "./SourceFile.js";
import {SpecialServerIps, initSpecialServerIps} from "./SpecialServerIps.js";
PlayerOwnedSourceFile} from "./SourceFile";
import {SpecialServerIps, initSpecialServerIps} from "./SpecialServerIps";
import {StockMarket, StockSymbols,
SymbolToStockMap, initStockSymbols,
initSymbolToStockMap, stockMarketCycle,
updateStockPrices,
displayStockMarketContent} from "./StockMarket.js";
import {Terminal, postNetburnerText, post, KEY} from "./Terminal.js";
displayStockMarketContent} from "./StockMarket";
import {Terminal, postNetburnerText, post, KEY} from "./Terminal";
/* Shortcuts to navigate through the game
* Alt-t - Terminal
@ -1170,7 +1172,7 @@ let Engine = {
//Update progress bar
while (Engine._actionProgressBarCount * 2 <= percent) {
Engine._actionProgressStr = Engine._actionProgressStr.replaceAt(Engine._actionProgressBarCount, "|");
Engine._actionProgressStr = replaceAt(Engine._actionProgressStr, Engine._actionProgressBarCount, "|");
Engine._actionProgressBarCount += 1;
}
@ -1736,13 +1738,6 @@ let Engine = {
Player.sourceFiles[sfIndex].lvl=sfLvl;
}
});
//If DarkWeb already purchased, disable the button
if (SpecialServerIps.hasOwnProperty("Darkweb Server")) {
const purchaseTor = document.getElementById("location-purchase-tor");
purchaseTor.setAttribute("class", "a-link-button-bought");
purchaseTor.innerHTML = "TOR Router - Purchased";
}
},
/* Initialization */

323
stylelint.config.js Normal file

@ -0,0 +1,323 @@
/* eslint-disable spaced-comment */
module.exports = {
plugins: [
"stylelint-declaration-use-variable",
"stylelint-order" /*,
"stylelint-scss" */
],
rules: {
"at-rule-blacklist": [],
// "at-rule-empty-line-before": [
// "always",
// {
// except: [
// "inside-block", "blockless-after-same-name-blockless"
// ],
// ignore: [
// "after-comment"
// ]
// }
// ],
"at-rule-name-case": "lower",
"at-rule-name-newline-after": "always-multi-line",
"at-rule-name-space-after": "always",
// "at-rule-no-vendor-prefix": true,
"at-rule-semicolon-newline-after": "always",
"at-rule-semicolon-space-before": "never",
// "at-rule-whitelist": [
// "content",
// "else",
// "function",
// "if",
// "import",
// "include",
// "keyframes",
// "mixin",
// "return"
// ],
"block-closing-brace-empty-line-before": "never",
"block-closing-brace-newline-after": "always",
"block-closing-brace-newline-before": "always-multi-line",
"block-no-empty": true,
// "block-opening-brace-newline-after": "always",
// "block-opening-brace-newline-before": "never-single-line",
// "block-opening-brace-space-before": "always",
// "color-hex-case": "lower",
// "color-hex-length": "short",
// "color-named": "never",
//"color-no-hex": true,
"color-no-invalid-hex": true,
// "comment-empty-line-before": "always",
"comment-no-empty": true,
// "comment-whitespace-inside": "always",
"comment-word-blacklist": [],
"custom-media-pattern": ".+",
"custom-property-empty-line-before": "never",
"custom-property-pattern": "my-.+",
"declaration-bang-space-after": "never",
// "declaration-bang-space-before": "always",
// "declaration-block-no-duplicate-properties": true,
"declaration-block-no-redundant-longhand-properties": true,
"declaration-block-no-shorthand-property-overrides": true,
// "declaration-block-semicolon-newline-after": "always",
"declaration-block-semicolon-newline-before": "never-multi-line",
"declaration-block-semicolon-space-before": "never",
// "declaration-block-single-line-max-declarations": 1,
"declaration-block-trailing-semicolon": "always",
"declaration-colon-newline-after": "always-multi-line",
// "declaration-colon-space-after": "always-single-line",
"declaration-colon-space-before": "never",
// "declaration-empty-line-before": "never",
//"declaration-no-important": true,
"declaration-property-unit-blacklist": {},
"declaration-property-unit-whitelist": {},
"declaration-property-value-blacklist": {},
"declaration-property-value-whitelist": {},
// "font-family-name-quotes": "always-where-recommended",
"font-family-no-duplicate-names": true,
"font-family-no-missing-generic-family-keyword": true,
// "font-weight-notation": "numeric",
"function-blacklist": [],
"function-calc-no-unspaced-operator": true,
"function-comma-newline-after": "always-multi-line",
"function-comma-newline-before": "never-multi-line",
// "function-comma-space-after": "always-single-line",
"function-comma-space-before": "never",
"function-linear-gradient-no-nonstandard-direction": true,
"function-max-empty-lines": 1,
"function-name-case": "lower",
"function-parentheses-newline-inside": "never-multi-line",
"function-parentheses-space-inside": "never",
"function-url-no-scheme-relative": true,
"function-url-quotes": "always",
"function-url-scheme-blacklist": [],
"function-url-scheme-whitelist": [],
// "function-whitelist": [
// "box-shadow-args",
// "map-get",
// "rgba",
// "skew",
// "var"
// ],
"function-whitespace-after": "always",
// "indentation": 4,
"keyframe-declaration-no-important": true,
// "length-zero-no-unit": true,
// "max-empty-lines": 1,
"max-line-length": 160,
"max-nesting-depth": 99,
"media-feature-colon-space-after": "always",
"media-feature-colon-space-before": "never",
"media-feature-name-blacklist": [],
"media-feature-name-case": "lower",
"media-feature-name-no-unknown": true,
"media-feature-name-no-vendor-prefix": true,
"media-feature-name-whitelist": [],
"media-feature-parentheses-space-inside": "never",
"media-feature-range-operator-space-after": "always",
"media-feature-range-operator-space-before": "always",
"media-query-list-comma-newline-after": "always-multi-line",
"media-query-list-comma-newline-before": "never-multi-line",
"media-query-list-comma-space-after": "always-single-line",
"media-query-list-comma-space-before": "never",
// "no-descending-specificity": true,
"no-duplicate-at-import-rules": true,
// "no-duplicate-selectors": true,
"no-empty-source": true,
"no-eol-whitespace": true,
// "no-extra-semicolons": true,
"no-invalid-double-slash-comments": true,
// "no-missing-end-of-source-newline": true,
"no-unknown-animations": true,
"number-leading-zero": "always",
"number-max-precision": [3, { ignoreUnits: [ "%" ] }],
// "number-no-trailing-zeros": true,
"order/order": [
[
"dollar-variables",
"at-variables",
"custom-properties",
{
type: "at-rule",
name: "include"
},
"declarations",
"rules",
"at-rules",
"less-mixins"
],
{
unspecified: "bottom"
}
],
// "order/properties-order": [
// []
// ],
// "order/properties-alphabetical-order": true,
"property-blacklist": [
"grid-area",
"grid-template",
"grid-column",
"grid-row"
],
"property-case": "lower",
"property-no-unknown": true,
// "property-no-vendor-prefix": true,
/*"property-whitelist": [
"/animation$/",
"/box-shadow$/",
"/keyframes$/",
"/transform$/",
"display",
"font-size"
], */
// "rule-empty-line-before": ["always", { except: [ "after-single-line-comment" ] }],
/*"scss/at-else-closing-brace-newline-after": "always-last-in-chain",
"scss/at-else-empty-line-before": "never",
"scss/at-else-if-parentheses-space-before": "always",
"scss/at-extend-no-missing-placeholder": true,
"scss/at-function-named-arguments": "never",
"scss/at-function-parentheses-space-before": "never",
"scss/at-function-pattern": /.+/,
"scss/at-if-closing-brace-newline-after": "always-last-in-chain",
"scss/at-import-no-partial-leading-underscore": true,
"scss/at-import-partial-extension-blacklist": [
[]
],
"scss/at-import-partial-extension-whitelist": [
[]
],
"scss/at-mixin-argumentless-call-parentheses": "always",
"scss/at-mixin-named-arguments": "never",
"scss/at-mixin-parentheses-space-before": "never",
"scss/at-mixin-pattern": /.+/,
"scss/at-rule-no-unknown": [
true,
{
ignoreAtRules: []
}
],
"scss/dollar-variable-colon-newline-after": "always-multi-line",
"scss/dollar-variable-colon-space-after": "always-single-line",
"scss/dollar-variable-colon-space-before": "never",
"scss/dollar-variable-default": [
true,
{
ignore: "local"
}
],
"scss/dollar-variable-empty-line-before": "never",
"scss/dollar-variable-no-missing-interpolation": true,
"scss/dollar-variable-pattern": /.+/,
"scss/percent-placeholder-pattern": /.+/,
"scss/double-slash-comment-inline": [
"always",
{
ignore: [
"stylelint-commands"
]
}
],
"scss/double-slash-comment-whitespace-inside": "always",
"scss/declaration-nested-properties": "never",
"scss/media-feature-value-dollar-variable": "always",
"scss/operator-no-newline-after": true,
"scss/operator-no-newline-before": true,
"scss/operator-no-unspaced": true,
"scss/partial-no-import": true,
"scss/selector-no-redundant-nesting-selector": true,*/
"selector-attribute-brackets-space-inside": "never",
"selector-attribute-operator-blacklist": [],
// "selector-attribute-operator-space-after": "always",
// "selector-attribute-operator-space-before": "always",
"selector-attribute-operator-whitelist": [
"="
],
"selector-attribute-quotes": "always",
"selector-class-pattern": ".+",
//"selector-combinator-blacklist": [],
// "selector-combinator-space-after": "always",
// "selector-combinator-space-before": "always",
//"selector-combinator-whitelist": [],
"selector-descendant-combinator-no-non-space": true,
"selector-id-pattern": ".+",
"selector-list-comma-newline-after": "always-multi-line",
"selector-list-comma-newline-before": "never-multi-line",
"selector-list-comma-space-after": "always-single-line",
"selector-list-comma-space-before": "never",
"selector-max-attribute": 99,
"selector-max-class": 99,
"selector-max-combinators": 99,
"selector-max-compound-selectors": 99,
"selector-max-empty-lines": 1,
"selector-max-id": 1,
//"selector-max-specificity": "0,0,0",
"selector-max-type": 99,
"selector-max-universal": 1,
"selector-nested-pattern": ".+",
"selector-no-qualifying-type": [
true,
{
ignore: [
"attribute", "class"
]
}
],
"selector-no-vendor-prefix": true,
"selector-pseudo-class-blacklist": [],
"selector-pseudo-class-case": "lower",
"selector-pseudo-class-no-unknown": true,
"selector-pseudo-class-parentheses-space-inside": "never",
"selector-pseudo-class-whitelist": [
"active",
"after",
"before",
"focus",
"hover",
"link",
"not",
"last-child",
"root",
"visited"
],
//"selector-pseudo-element-blacklist": [],
"selector-pseudo-element-case": "lower",
// "selector-pseudo-element-colon-notation": "double",
"selector-pseudo-element-no-unknown": true,
//"selector-pseudo-element-whitelist": [],
"selector-type-case": "lower",
"selector-type-no-unknown": true,
// "shorthand-property-no-redundant-values": true,
// "sh-waqar/declaration-use-variable": [
// [
// "color",
// "background-color",
// "font-family"
// ]
// ],
"string-no-newline": true,
// "string-quotes": "double",
"time-min-milliseconds": 50,
"unit-blacklist": [],
"unit-case": "lower",
"unit-no-unknown": true,
"unit-whitelist": [
"deg",
"fr",
"px",
"rem",
"ms",
"s",
"vw",
"%"
],
// "value-keyword-case": "lower",
"value-list-comma-newline-after": "always-multi-line",
"value-list-comma-newline-before": "never-multi-line",
"value-list-comma-space-after": "always-single-line",
"value-list-comma-space-before": "never",
"value-list-max-empty-lines": 0,
"value-no-vendor-prefix": true
}
};

@ -44,7 +44,7 @@
],
"no-any": false,
"no-inferrable-types": [
true,
false,
"ignore-params",
"ignore-properties"
],

@ -1,7 +1,7 @@
import {Faction, joinFaction} from "../src/Faction.js";
import {Engine} from "../src/engine.js";
import {Player} from "../src/Player.js";
import {clearEventListeners} from "./HelperFunctions.js";
import {Faction, joinFaction} from "../src/Faction";
import {Engine} from "../src/engine";
import {Player} from "../src/Player";
import {clearEventListeners} from "./HelperFunctions";
/* Faction Invitation Pop-up box */
function factionInvitationBoxClose() {

@ -1,6 +1,6 @@
//General helper functions
import {isString} from "./StringHelperFunctions.js";
import {dialogBoxCreate} from "./DialogBox.js";
import {isString} from "./StringHelperFunctions";
import {dialogBoxCreate} from "./DialogBox";
//Returns the size (number of keys) of an object
function sizeOfObject(obj) {

@ -1,4 +1,4 @@
import {AllServers} from "../src/Server.js";
import {AllServers} from "../src/Server";
/* Functions to deal with manipulating IP addresses*/
//Generate a random IP address

@ -1,10 +1,10 @@
import {BitNodeMultipliers} from "../src/BitNode.js";
import {CONSTANTS} from "../src/Constants.js";
import {Factions, Faction} from "../src/Faction.js";
import {Player} from "../src/Player.js";
import {dialogBoxCreate} from "./DialogBox.js";
import {clearEventListeners} from "./HelperFunctions.js";
import {formatNumber} from "./StringHelperFunctions.js";
import {BitNodeMultipliers} from "../src/BitNode";
import {CONSTANTS} from "../src/Constants";
import {Factions, Faction} from "../src/Faction";
import {Player} from "../src/Player";
import {dialogBoxCreate} from "./DialogBox";
import {clearEventListeners} from "./HelperFunctions";
import {formatNumber} from "./StringHelperFunctions";
/* InfiltrationBox.js */
function infiltrationBoxClose() {

@ -1,5 +1,5 @@
import {killWorkerScript} from "../src/NetscriptWorker.js";
import {printArray, clearEventListeners} from "./HelperFunctions.js";
import {killWorkerScript} from "../src/NetscriptWorker";
import {printArray, clearEventListeners} from "./HelperFunctions";
$(document).keydown(function(event) {
if (logBoxOpened && event.keyCode == 27) {

@ -1,150 +0,0 @@
import {dialogBoxCreate} from "./DialogBox.js";
//Netburner String helper functions
//Searches for every occurence of searchStr within str and returns an array of the indices of
//all these occurences
function getIndicesOf(searchStr, str, caseSensitive) {
var searchStrLen = searchStr.length;
if (searchStrLen == 0) {
return [];
}
var startIndex = 0, index, indices = [];
if (!caseSensitive) {
str = str.toLowerCase();
searchStr = searchStr.toLowerCase();
}
while ((index = str.indexOf(searchStr, startIndex)) > -1) {
indices.push(index);
startIndex = index + searchStrLen;
}
return indices;
}
//Replaces the character at an index with a new character
String.prototype.replaceAt=function(index, character) {
return this.substr(0, index) + character + this.substr(index+character.length);
}
//Converts a date representing time in milliseconds to a string with the format
// H hours M minutes and S seconds
// e.g. 10000 -> "0 hours 0 minutes and 10 seconds"
// 120000 -> "0 0 hours 2 minutes and 0 seconds"
function convertTimeMsToTimeElapsedString(time) {
//Convert ms to seconds, since we only have second-level precision
time = Math.floor(time / 1000);
var days = Math.floor(time / 86400);
time %= 86400;
var hours = Math.floor(time / 3600);
time %= 3600;
var minutes = Math.floor(time / 60);
time %= 60;
var seconds = time;
var res = "";
if (days) {res += days + " days ";}
if (hours) {res += hours + " hours ";}
if (minutes) {res += minutes + " minutes ";}
res += seconds + " seconds ";
return res;
}
//Finds the longest common starting substring in a set of strings
function longestCommonStart(strings) {
if (!containsAllStrings(strings)) {return;}
if (strings.length == 0) {return;}
var A = strings.concat().sort(),
a1= A[0], a2= A[A.length-1], L= a1.length, i= 0;
while(i<L && a1.charAt(i).toLowerCase() === a2.charAt(i).toLowerCase()) i++;
return a1.substring(0, i);
}
//Returns whether a variable is a string
function isString(str) {
return (typeof str === 'string' || str instanceof String);
}
//Returns whether an array contains entirely of string objects
function containsAllStrings(arr) {
return arr.every(isString);
}
//Formats a number with commas and a specific number of decimal digits
function formatNumber(num, numFractionDigits) {
return num.toLocaleString(undefined, {
minimumFractionDigits: numFractionDigits,
maximumFractionDigits: numFractionDigits
});
}
//Count the number of times a substring occurs in a string
function numOccurrences(string, subString) {
string += "";
subString += "";
if (subString.length <= 0) return (string.length + 1);
var n = 0, pos = 0, step = subString.length;
while (true) {
pos = string.indexOf(subString, pos);
if (pos >= 0) {
++n;
pos += step;
} else break;
}
return n;
}
//Counters the number of Netscript operators in a string
function numNetscriptOperators(string) {
var total = 0;
total += numOccurrences(string, "+");
total += numOccurrences(string, "-");
total += numOccurrences(string, "*");
total += numOccurrences(string, "/");
total += numOccurrences(string, "%");
total += numOccurrences(string, "&&");
total += numOccurrences(string, "||");
total += numOccurrences(string, "<");
total += numOccurrences(string, ">");
total += numOccurrences(string, "<=");
total += numOccurrences(string, ">=");
total += numOccurrences(string, "==");
total += numOccurrences(string, "!=");
if (isNaN(total)) {
dialogBoxCreate("ERROR in counting number of operators in script. This is a bug, please report to game developer");
total = 0;
}
return total;
}
//Checks if a string contains HTML elements
function isHTML(str) {
var a = document.createElement('div');
a.innerHTML = str;
for (var c = a.childNodes, i = c.length; i--; ) {
if (c[i].nodeType == 1) return true;
}
return false;
}
//Generates a random alphanumeric string with N characters
function generateRandomString(n) {
var str = "",
chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < n; i++)
str += chars.charAt(Math.floor(Math.random() * chars.length));
return str;
}
export {getIndicesOf, convertTimeMsToTimeElapsedString, longestCommonStart,
isString, containsAllStrings, formatNumber,
numOccurrences, numNetscriptOperators, isHTML, generateRandomString};

@ -0,0 +1,151 @@
import { dialogBoxCreate } from "./DialogBox";
// Netburner String helper functions
// Replaces the character at an index with a new character
function replaceAt(base: string, index: number, character: string): string {
return base.substr(0, index) + character + base.substr(index + character.length);
}
/*
Converts a date representing time in milliseconds to a string with the format H hours M minutes and S seconds
e.g. 10000 -> "0 hours 0 minutes and 10 seconds"
120000 -> "0 0 hours 2 minutes and 0 seconds"
*/
function convertTimeMsToTimeElapsedString(time: number): string {
const millisecondsPerSecond = 1000;
const secondPerMinute = 60;
const minutesPerHours = 60;
const secondPerHours: number = secondPerMinute * minutesPerHours;
const hoursPerDays = 24;
const secondPerDay: number = secondPerHours * hoursPerDays;
// Convert ms to seconds, since we only have second-level precision
const totalSeconds: number = Math.floor(time / millisecondsPerSecond);
const days: number = Math.floor(totalSeconds / secondPerDay);
const secTruncDays: number = totalSeconds % secondPerDay;
const hours: number = Math.floor(secTruncDays / secondPerHours);
const secTruncHours: number = secTruncDays % secondPerHours;
const minutes: number = Math.floor(secTruncHours / secondPerMinute);
const secTruncMinutes: number = secTruncHours % secondPerMinute;
const seconds: number = secTruncMinutes;
let res = "";
if (days) {res += `${days} days `; }
if (hours) {res += `${hours} hours `; }
if (minutes) {res += `${minutes} minutes `; }
res += `${seconds} seconds `;
return res;
}
// Finds the longest common starting substring in a set of strings
function longestCommonStart(strings: string[]): string {
if (!containsAllStrings(strings)) {return ""; }
if (strings.length == 0) {return ""; }
const A: string[] = strings.concat().sort();
const a1: string = A[0];
const a2: string = A[A.length - 1];
const L: number = a1.length;
let i = 0;
while (i < L && a1.charAt(i).toLowerCase() === a2.charAt(i).toLowerCase()) { i++; }
return a1.substring(0, i);
}
// Returns whether a variable is a string
function isString(str: any): boolean {
return (typeof str === "string" || str instanceof String);
}
// Returns whether an array contains entirely of string objects
function containsAllStrings(arr: string[]): boolean {
return arr.every(isString);
}
// Formats a number with commas and a specific number of decimal digits
function formatNumber(num: number, numFractionDigits: number): string {
return num.toLocaleString(undefined, {
maximumFractionDigits: numFractionDigits,
minimumFractionDigits: numFractionDigits,
});
}
// Count the number of times a substring occurs in a string
function numOccurrences(text: string, subString: string): number {
text += "";
subString += "";
if (subString.length <= 0) { return (text.length + 1); }
let n = 0;
let pos = 0;
const step: number = subString.length;
while (true) {
pos = text.indexOf(subString, pos);
if (pos >= 0) {
++n;
pos += step;
} else { break; }
}
return n;
}
// Counters the number of Netscript operators in a string
function numNetscriptOperators(text: string): number {
const total: number = numOccurrences(text, "+") +
numOccurrences(text, "-") +
numOccurrences(text, "*") +
numOccurrences(text, "/") +
numOccurrences(text, "%") +
numOccurrences(text, "&&") +
numOccurrences(text, "||") +
numOccurrences(text, "<") +
numOccurrences(text, ">") +
numOccurrences(text, "<=") +
numOccurrences(text, ">=") +
numOccurrences(text, "==") +
numOccurrences(text, "!=");
if (isNaN(total)) {
const message = "ERROR in counting number of operators in script. This is a bug, please report to game developer";
dialogBoxCreate(message, false);
return 0;
}
return total;
}
// Checks if a string contains HTML elements
function isHTML(str: string): boolean {
const a = document.createElement("div");
a.innerHTML = str;
const c = a.childNodes;
for (let i = c.length; i--;) {
if (c[i].nodeType == 1) { return true; }
}
return false;
}
// Generates a random alphanumeric string with N characters
function generateRandomString(n: number): string {
let str = "";
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (let i = 0; i < n; i++) {
str += chars.charAt(Math.floor(Math.random() * chars.length));
}
return str;
}
export {convertTimeMsToTimeElapsedString, longestCommonStart,
isString, containsAllStrings, formatNumber,
numOccurrences, numNetscriptOperators, isHTML, generateRandomString, replaceAt};

@ -1,4 +1,4 @@
import {clearEventListeners} from "./HelperFunctions.js";
import {clearEventListeners} from "./HelperFunctions";
/* Generic Yes-No Pop-up box
* Can be used to create pop-up boxes that require a yes/no response from player
*/