mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-11-18 05:33:54 +01:00
Fixed loading issue due to GangMemberTask reviver throwing error
This commit is contained in:
commit
22d2738206
@ -22,6 +22,9 @@ heard:
|
||||
The recommended method for reporting a bug is by opening a
|
||||
[Github Issue](https://github.com/danielyxie/bitburner/issues).
|
||||
|
||||
Alternatively, you can post a bug by creating a post on the
|
||||
[game's subreddit](https://www.reddit.com/r/Bitburner/).
|
||||
|
||||
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).
|
||||
|
||||
@ -29,6 +32,7 @@ already been reported as an [Issue](https://github.com/danielyxie/bitburner/issu
|
||||
|
||||
* **Use a clear and descriptive title** for the issue
|
||||
* **State your browser, your browser's version, and your computer's OS**
|
||||
* **Attach your save file**, if you think it would help solve the issue
|
||||
* **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
|
||||
|
@ -82,3 +82,27 @@ button {
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This is a button that is meant to be used on accordions (accordion-header and accordion-panel classes)
|
||||
* It has a black background so it does not clash with the default accordion coloring
|
||||
*/
|
||||
.accordion-button {
|
||||
@include borderRadius(12px);
|
||||
@include boxShadow(1px 1px 3px #000);
|
||||
|
||||
color: #aaa;
|
||||
font-size: $defaultFontSize;
|
||||
font-weight: bold;
|
||||
margin: 4px;
|
||||
padding: 4px;
|
||||
background-color: #000;
|
||||
|
||||
&:hover,
|
||||
&:active {
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
/* TODO focus selector? */
|
||||
}
|
||||
|
48
css/gang.scss
Normal file
48
css/gang.scss
Normal file
@ -0,0 +1,48 @@
|
||||
@import "mixins";
|
||||
@import "theme";
|
||||
|
||||
/**
|
||||
* Styling for the Gang mechanic UI (BitNode-2)
|
||||
*/
|
||||
|
||||
#gang-container {
|
||||
position: fixed;
|
||||
padding: 6px;
|
||||
|
||||
p, pre {
|
||||
font-size: $defaultFontSize * 0.9375;
|
||||
}
|
||||
|
||||
select {
|
||||
background-color: black;
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
|
||||
#gang-management-subpage > p {
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.gang-member-info-div {
|
||||
background-color: #555;
|
||||
display: inline;
|
||||
float: left;
|
||||
width: 30%;
|
||||
}
|
||||
|
||||
/**
|
||||
* Showing owned upgrades in the Equipment Box
|
||||
*/
|
||||
|
||||
.gang-owned-upgrades-div {
|
||||
display: inline-block;
|
||||
margin-left: 6px;
|
||||
width: 75%;
|
||||
}
|
||||
|
||||
.gang-owned-upgrade {
|
||||
border: 1px solid white;
|
||||
font-size: 12px;
|
||||
margin: 1px;
|
||||
padding: 1px;
|
||||
}
|
@ -248,25 +248,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
.active-scripts-button {
|
||||
@include borderRadius(12px);
|
||||
@include boxShadow(1px 1px 3px #000);
|
||||
|
||||
color: #aaa;
|
||||
font-size: $defaultFontSize;
|
||||
font-weight: bold;
|
||||
margin: 4px;
|
||||
padding: 4px;
|
||||
background-color: #000;
|
||||
|
||||
&:hover,
|
||||
&:focus {
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
/* Hacknet Nodes */
|
||||
#hacknet-nodes-container {
|
||||
position: fixed;
|
||||
@ -623,18 +604,3 @@
|
||||
margin: 2px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* Gang */
|
||||
#gang-container {
|
||||
position: fixed;
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
#gang-management-subpage > p {
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.gang-member-info-div {
|
||||
float: left;
|
||||
background-color: #555;
|
||||
}
|
||||
|
@ -114,6 +114,29 @@ a:visited {
|
||||
position: absolute;
|
||||
z-index: 99;
|
||||
}
|
||||
|
||||
/* Positioned to left of element rather than right */
|
||||
.tooltiptextleft {
|
||||
visibility: hidden;
|
||||
width: 300px;
|
||||
background-color: var(--my-background-color);
|
||||
border: 2px solid var(--my-highlight-color);
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
padding: 4px;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-100%, -100%);
|
||||
|
||||
/* Backwards compatibility */
|
||||
-webkit-transform: translate(-100%, -100%);
|
||||
-moz-transform: translate(-100%, -100%);
|
||||
-o-transform: translate(-100%, -100%);
|
||||
-ms-transform: translate(-100%, -100%);
|
||||
|
||||
position: absolute;
|
||||
z-index: 99;
|
||||
}
|
||||
}
|
||||
|
||||
/* Same thing as a normal tooltip except its a bit higher */
|
||||
@ -132,23 +155,6 @@ a:visited {
|
||||
z-index: 99;
|
||||
}
|
||||
|
||||
/* Similar to a normal tooltip except its positioned on the left of the element
|
||||
rather than the right to avoid exceeding the elements normal width */
|
||||
.tooltip .tooltiptextleft {
|
||||
visibility: hidden;
|
||||
width: 300px;
|
||||
background-color: var(--my-background-color);
|
||||
border: 2px solid var(--my-highlight-color);
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
padding: 4px;
|
||||
left: 40%;
|
||||
bottom: -10%;
|
||||
|
||||
position: absolute;
|
||||
z-index: 99;
|
||||
}
|
||||
|
||||
.tooltip:hover .tooltiptext,
|
||||
.tooltip:hover .tooltiptexthigh,
|
||||
.tooltip:hover .tooltiptextleft {
|
||||
@ -157,13 +163,14 @@ a:visited {
|
||||
|
||||
/* help tip. Question mark that opens popup with info/details */
|
||||
.help-tip {
|
||||
content: '?';
|
||||
padding: 1px;
|
||||
margin-left: 3px;
|
||||
color: #fff;
|
||||
background-color: black;
|
||||
border: 1px solid #fff;
|
||||
border-radius: 5px;
|
||||
color: #fff;
|
||||
content: '?';
|
||||
display: inline-block;
|
||||
margin-left: 3px;
|
||||
padding: 1px;
|
||||
}
|
||||
|
||||
.help-tip-big {
|
||||
@ -412,7 +419,7 @@ a:visited {
|
||||
|
||||
&:after {
|
||||
content: '\02795'; /* "plus" sign (+) */
|
||||
font-size: $defaultFontSize * 0.8125;
|
||||
font-size: $defaultFontSize * 0.875;
|
||||
float: right;
|
||||
color: transparent;
|
||||
text-shadow: 0 0 0 #fff;
|
||||
@ -479,3 +486,7 @@ a:visited {
|
||||
.charisma-purple {
|
||||
color: $my-stat-cha-color;
|
||||
}
|
||||
|
||||
.smallfont {
|
||||
font-size: $defaultFontSize * 0.8125;
|
||||
}
|
||||
|
56266
dist/engine.bundle.js
vendored
56266
dist/engine.bundle.js
vendored
File diff suppressed because one or more lines are too long
142
dist/engine.css
vendored
142
dist/engine.css
vendored
@ -94,7 +94,8 @@ a:visited {
|
||||
/* Tool tips (when hovering over an element */
|
||||
.tooltip {
|
||||
display: inline-block;
|
||||
position: relative; }
|
||||
position: relative;
|
||||
/* Positioned to left of element rather than right */ }
|
||||
.tooltip .tooltiptext {
|
||||
visibility: hidden;
|
||||
width: 300px;
|
||||
@ -107,6 +108,24 @@ a:visited {
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
z-index: 99; }
|
||||
.tooltip .tooltiptextleft {
|
||||
visibility: hidden;
|
||||
width: 300px;
|
||||
background-color: var(--my-background-color);
|
||||
border: 2px solid var(--my-highlight-color);
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
padding: 4px;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-100%, -100%);
|
||||
/* Backwards compatibility */
|
||||
-webkit-transform: translate(-100%, -100%);
|
||||
-moz-transform: translate(-100%, -100%);
|
||||
-o-transform: translate(-100%, -100%);
|
||||
-ms-transform: translate(-100%, -100%);
|
||||
position: absolute;
|
||||
z-index: 99; }
|
||||
|
||||
/* Same thing as a normal tooltip except its a bit higher */
|
||||
.tooltip .tooltiptexthigh {
|
||||
@ -122,21 +141,6 @@ a:visited {
|
||||
position: absolute;
|
||||
z-index: 99; }
|
||||
|
||||
/* Similar to a normal tooltip except its positioned on the left of the element
|
||||
rather than the right to avoid exceeding the elements normal width */
|
||||
.tooltip .tooltiptextleft {
|
||||
visibility: hidden;
|
||||
width: 300px;
|
||||
background-color: var(--my-background-color);
|
||||
border: 2px solid var(--my-highlight-color);
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
padding: 4px;
|
||||
left: 40%;
|
||||
bottom: -10%;
|
||||
position: absolute;
|
||||
z-index: 99; }
|
||||
|
||||
.tooltip:hover .tooltiptext,
|
||||
.tooltip:hover .tooltiptexthigh,
|
||||
.tooltip:hover .tooltiptextleft {
|
||||
@ -144,13 +148,14 @@ a:visited {
|
||||
|
||||
/* help tip. Question mark that opens popup with info/details */
|
||||
.help-tip {
|
||||
content: '?';
|
||||
padding: 1px;
|
||||
margin-left: 3px;
|
||||
color: #fff;
|
||||
background-color: black;
|
||||
border: 1px solid #fff;
|
||||
border-radius: 5px;
|
||||
display: inline-block; }
|
||||
color: #fff;
|
||||
content: '?';
|
||||
display: inline-block;
|
||||
margin-left: 3px;
|
||||
padding: 1px; }
|
||||
|
||||
.help-tip-big {
|
||||
content: '?';
|
||||
@ -418,7 +423,7 @@ a:visited {
|
||||
.accordion-header:after {
|
||||
content: '\2795';
|
||||
/* "plus" sign (+) */
|
||||
font-size: 13px;
|
||||
font-size: 14px;
|
||||
float: right;
|
||||
color: transparent;
|
||||
text-shadow: 0 0 0 #fff;
|
||||
@ -472,6 +477,9 @@ a:visited {
|
||||
.charisma-purple {
|
||||
color: #a671d1; }
|
||||
|
||||
.smallfont {
|
||||
font-size: 13px; }
|
||||
|
||||
/* COLORS */
|
||||
/* Attributes */
|
||||
/**
|
||||
@ -546,6 +554,29 @@ button {
|
||||
.std-button-bought:active {
|
||||
pointer-events: none; }
|
||||
|
||||
/**
|
||||
* This is a button that is meant to be used on accordions (accordion-header and accordion-panel classes)
|
||||
* It has a black background so it does not clash with the default accordion coloring
|
||||
*/
|
||||
.accordion-button {
|
||||
-webkit-border-radius: 12px;
|
||||
-moz-border-radius: 12px;
|
||||
border-radius: 12px;
|
||||
-webkit-box-shadow: 1px 1px 3px #000;
|
||||
-moz-box-shadow: 1px 1px 3px #000;
|
||||
box-shadow: 1px 1px 3px #000;
|
||||
color: #aaa;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
margin: 4px;
|
||||
padding: 4px;
|
||||
background-color: #000;
|
||||
/* TODO focus selector? */ }
|
||||
.accordion-button:hover, .accordion-button:active {
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
cursor: pointer; }
|
||||
|
||||
/* COLORS */
|
||||
/* Attributes */
|
||||
/**
|
||||
@ -921,24 +952,6 @@ button {
|
||||
color: #fff;
|
||||
margin-left: 5%; }
|
||||
|
||||
.active-scripts-button {
|
||||
-webkit-border-radius: 12px;
|
||||
-moz-border-radius: 12px;
|
||||
border-radius: 12px;
|
||||
-webkit-box-shadow: 1px 1px 3px #000;
|
||||
-moz-box-shadow: 1px 1px 3px #000;
|
||||
box-shadow: 1px 1px 3px #000;
|
||||
color: #aaa;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
margin: 4px;
|
||||
padding: 4px;
|
||||
background-color: #000; }
|
||||
.active-scripts-button:hover, .active-scripts-button:focus {
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
cursor: pointer; }
|
||||
|
||||
/* Hacknet Nodes */
|
||||
#hacknet-nodes-container {
|
||||
position: fixed;
|
||||
@ -1227,18 +1240,6 @@ button {
|
||||
margin: 2px;
|
||||
padding: 0; }
|
||||
|
||||
/* Gang */
|
||||
#gang-container {
|
||||
position: fixed;
|
||||
padding: 6px; }
|
||||
|
||||
#gang-management-subpage > p {
|
||||
padding: 4px; }
|
||||
|
||||
.gang-member-info-div {
|
||||
float: left;
|
||||
background-color: #555; }
|
||||
|
||||
/* COLORS */
|
||||
/* Attributes */
|
||||
/* Both Work in progress and BitNode stuff */
|
||||
@ -2040,5 +2041,42 @@ button {
|
||||
-webkit-hyphens: auto;
|
||||
-moz-hyphens: auto; }
|
||||
|
||||
/* COLORS */
|
||||
/* Attributes */
|
||||
/**
|
||||
* Styling for the Gang mechanic UI (BitNode-2)
|
||||
*/
|
||||
#gang-container {
|
||||
position: fixed;
|
||||
padding: 6px; }
|
||||
#gang-container p, #gang-container pre {
|
||||
font-size: 15px; }
|
||||
#gang-container select {
|
||||
background-color: black;
|
||||
color: white; }
|
||||
|
||||
#gang-management-subpage > p {
|
||||
padding: 4px; }
|
||||
|
||||
.gang-member-info-div {
|
||||
background-color: #555;
|
||||
display: inline;
|
||||
float: left;
|
||||
width: 30%; }
|
||||
|
||||
/**
|
||||
* Showing owned upgrades in the Equipment Box
|
||||
*/
|
||||
.gang-owned-upgrades-div {
|
||||
display: inline-block;
|
||||
margin-left: 6px;
|
||||
width: 75%; }
|
||||
|
||||
.gang-owned-upgrade {
|
||||
border: 1px solid white;
|
||||
font-size: 12px;
|
||||
margin: 1px;
|
||||
padding: 1px; }
|
||||
|
||||
|
||||
/*# sourceMappingURL=engine.css.map*/
|
111041
dist/vendor.bundle.js
vendored
111041
dist/vendor.bundle.js
vendored
File diff suppressed because one or more lines are too long
@ -3,6 +3,40 @@
|
||||
Changelog
|
||||
=========
|
||||
|
||||
v0.41.0 - 10/29/2018
|
||||
--------------------
|
||||
* WARNING: In NetscriptJS, defining a function called print() is no longer possible
|
||||
* Gang Mechanic Changes (BitNode-2):
|
||||
* Added a Gang Netscript API
|
||||
* Added new 'ascension' mechanic for Gang Members
|
||||
* The first three gang members are now 'free' (can be recruited instantly)
|
||||
* Maximum number of increased Gang Members increased from 20 to 30
|
||||
* Changed the formula for calculating respect needed to recruit the next gang member
|
||||
* Added a new category of upgrades for Gang Members: Augmentations
|
||||
* Non-Augmentation Gang member upgrades are now significantly weaker
|
||||
* Reputation for your Gang faction can no longer be gained through Infiltration
|
||||
* Re-worked the territory 'warfare' mechanic so that player can choose when to engage in it
|
||||
* Gang Members can now be killed during territory 'warfare'
|
||||
* Changed BitNode-2 Multipliers to make hacking slightly less profitable
|
||||
* Gang Member Equipment + Upgrades now get cheaper as your gang grows in power and respect
|
||||
* The effects of Source-File 2 are now slightly more powerful
|
||||
* RAM Cost of accessing the global document object lowered from 100 GB to 25 GB
|
||||
* RAM Cost to use Singularity Functions outside of BitNode-4 lowered by 75%. They now only cost twice as much as they do in BitNode-4
|
||||
* b1t_flum3.exe now takes significantly less time to create
|
||||
* Crimes commited through Singularity function no longer give half money/exp
|
||||
* Improved number formatting for Player 'work' actions (including crimes, etc.). These numbers should also adhere to locale settings now (by Kline-)
|
||||
* The order that Augmentations are listed in (when purchasing from Faction and viewing your Augmentations) is now saved and persists when choosing different orders
|
||||
* getCharacterInformation() Singularity function now returns multiplier information (from Augmentations/Source Files)
|
||||
* Bug Fix: Calling print() in NetscriptJS no longer brings up the print dialog
|
||||
* Bug Fix: Fixed a bug that sometimes caused a blank black screen when destroying/resetting/switching BitNodes
|
||||
* Bug Fix: Netscript calls that throw errors will now no longer cause the 'concurrent calls' error if they are caught in the script. i.e. try/catch should now work properly in scripts
|
||||
* Bug Fix: Fixed a bug where sometimes the NeuroFlux Governor Augmentation level would be incorrectly calculated when the game was loaded
|
||||
* Bug Fix: Fixed a bug where calling the scp() Netscript function with invalid hostname/ips would throw an unclear error message
|
||||
* Bug Fix: Bladeburner API function getActionCountRemaining() should now work properly for BlackOps
|
||||
* Bug Fix: Black Ops can no longer be attempted out-of-order or without the required rank via Bladeburner API
|
||||
* Bug Fix: Dynamic RAM Calculation now properly accounts for number of threads
|
||||
* RAM cost for basic Netscript functions added to documentation (by CBJamo)
|
||||
|
||||
v0.40.5 - 10/09/2018
|
||||
--------------------
|
||||
* Added codingcontract.getContractType() Netscript function
|
||||
|
26
doc/source/gamefrozen.rst
Normal file
26
doc/source/gamefrozen.rst
Normal file
@ -0,0 +1,26 @@
|
||||
Game Frozen or Stuck?
|
||||
=====================
|
||||
|
||||
Infinite Loop in NetscriptJS
|
||||
----------------------------
|
||||
|
||||
If your game is frozen or stuck in any way, then the most likely culprit is an
|
||||
infinitely running loop in :ref:`netscriptjs`. To get past the freezing, run the game with
|
||||
`?noScripts` in the URL:
|
||||
|
||||
`https://danielyxie.github.io/bitburner/?noScripts <https://danielyxie.github.io/bitburner/?noScripts>`_
|
||||
|
||||
Then, to fix your script, make sure you have a sleep or any other timed function like `hack()` or
|
||||
`grow()` in any infinite loops::
|
||||
|
||||
while(true) {
|
||||
// This is an infinite loop that does something
|
||||
...
|
||||
await ns.sleep(1000); // Add a 1s sleep to prevent freezing
|
||||
}
|
||||
|
||||
Bug
|
||||
---
|
||||
|
||||
Otherwise, the game is probably frozen/stuck due to a bug. To report a bug, follow
|
||||
the guidelines `here <https://github.com/danielyxie/bitburner/blob/master/CONTRIBUTING.md#reporting-bugs>`_.
|
@ -23,9 +23,9 @@ secrets that you've been searching for.
|
||||
Terminal <terminal>
|
||||
Coding Contracts <codingcontracts>
|
||||
Keyboard Shortcuts <shortcuts>
|
||||
Game Frozen or Stuck? <gamefrozen>
|
||||
Changelog <changelog>
|
||||
|
||||
|
||||
Indices and tables
|
||||
==================
|
||||
|
||||
|
@ -25,5 +25,6 @@ to reach out to the developer!
|
||||
Trade Information eXchange (TIX) API <netscriptixapi>
|
||||
Singularity Functions <netscriptsingularityfunctions>
|
||||
Bladeburner API <netscriptbladeburnerapi>
|
||||
Gang API <netscriptgangapi>
|
||||
Coding Contract API <netscriptcodingcontractapi>
|
||||
Miscellaneous <netscriptmisc>
|
||||
|
@ -13,6 +13,7 @@ hack
|
||||
|
||||
:param string hostname/ip: IP or hostname of the target server to hack
|
||||
:returns: The amount of money stolen if the hack is successful, and zero otherwise
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Function that is used to try and hack servers to steal money and gain hacking experience. The runtime for this command depends
|
||||
on your hacking level and the target server's security level. In order to hack a server you must first gain root access
|
||||
@ -35,6 +36,7 @@ grow
|
||||
|
||||
:param string hostname/ip: IP or hostname of the target server to grow
|
||||
:returns: The number by which the money on the server was multiplied for the growth
|
||||
:RAM cost: 0.15 GB
|
||||
|
||||
Use your hacking skills to increase the amount of money available on a server. The runtime for this command depends on your hacking
|
||||
level and the target server's security level. When grow() completes, the money available on a target server will be increased by a
|
||||
@ -57,6 +59,7 @@ weaken
|
||||
:param string hostname.ip: IP or hostname of the target server to weaken
|
||||
:returns: The amount by which the target server's security level was decreased. This is equivalent to 0.05 multiplied
|
||||
by the number of script threads
|
||||
:RAM cost: 0.15 GB
|
||||
|
||||
Use your hacking skills to attack a server's security, lowering the server's security level. The runtime for this command
|
||||
depends on your hacking level and the target server's security level. This function lowers the security level of the target
|
||||
@ -75,6 +78,7 @@ sleep
|
||||
.. js:function:: sleep(n)
|
||||
|
||||
:param number n: Number of milliseconds to sleep
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Suspends the script for n milliseconds.
|
||||
|
||||
@ -84,6 +88,7 @@ print
|
||||
.. js:function:: print(x)
|
||||
|
||||
:param x: Value to be printed
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Prints a value or a variable to the script's logs.
|
||||
|
||||
@ -93,6 +98,7 @@ tprint
|
||||
.. js:function:: tprint(x)
|
||||
|
||||
:param x: Value to be printed
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Prints a value or a variable to the Terminal
|
||||
|
||||
@ -101,6 +107,8 @@ clearLog
|
||||
|
||||
.. js:function:: clearLog()
|
||||
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Clears the script's logs
|
||||
|
||||
disableLog
|
||||
@ -109,6 +117,7 @@ disableLog
|
||||
.. js:function:: disableLog(fn)
|
||||
|
||||
:param string fn: Name of function for which to disable logging
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Disables logging for the given function. Logging can be disabled for
|
||||
all functions by passing 'ALL' as the argument.
|
||||
@ -125,6 +134,7 @@ enableLog
|
||||
.. js:function:: enableLog(fn)
|
||||
|
||||
:param string fn: Name of function for which to enable logging
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Re-enables logging for the given function. If 'ALL' is passed into this function
|
||||
as an argument, then it will revert the effects of disableLog('ALL')
|
||||
@ -135,6 +145,7 @@ isLogEnabled
|
||||
.. js:function:: isLogEnabled(fn)
|
||||
|
||||
:param string fn: Name of function to check
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Returns a boolean indicating whether or not logging is enabled for that
|
||||
function (or 'ALL')
|
||||
@ -144,6 +155,8 @@ getScriptLogs
|
||||
|
||||
.. js:function:: getScriptLogs()
|
||||
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Returns the script's logs. The logs are returned as an array, where each
|
||||
line is an element in the array. The most recently logged line is at the
|
||||
end of the array.
|
||||
@ -158,6 +171,7 @@ scan
|
||||
|
||||
:param string hostname/ip: IP or hostname of the server to scan
|
||||
:param boolean: Optional boolean specifying whether the function should output hostnames (if true) or IP addresses (if false)
|
||||
:RAM cost: 0.2 GB
|
||||
|
||||
Returns an array containing the hostnames or IPs of all servers that are one node way from the specified target server. The
|
||||
hostnames/IPs in the returned array are strings.
|
||||
@ -168,6 +182,7 @@ nuke
|
||||
.. js:function:: nuke(hostname/ip)
|
||||
|
||||
:param string hostname/ip: IP or hostname of the target server
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Runs the NUKE.exe program on the target server. NUKE.exe must exist on your home computer.
|
||||
|
||||
@ -181,6 +196,7 @@ brutessh
|
||||
.. js:function:: brutessh(hostname/ip)
|
||||
|
||||
:param string hostname/ip: IP or hostname of the target server
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Runs the BruteSSH.exe program on the target server. BruteSSH.exe must exist on your home computer.
|
||||
|
||||
@ -194,6 +210,7 @@ ftpcrack
|
||||
.. js:function:: ftpcrack(hostname/ip)
|
||||
|
||||
:param string hostname/ip: IP or hostname of the target server
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Runs the FTPCrack.exe program on the target server. FTPCrack.exe must exist on your home computer.
|
||||
|
||||
@ -207,6 +224,7 @@ relaysmtp
|
||||
.. js:function:: relaysmtp(hostname/ip)
|
||||
|
||||
:param string hostname/ip: IP or hostname of the target server
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Runs the relaySMTP.exe program on the target server. relaySMTP.exe must exist on your home computer.
|
||||
|
||||
@ -220,6 +238,7 @@ httpworm
|
||||
.. js:function:: httpworm(hostname/ip)
|
||||
|
||||
:param string hostname/ip: IP or hostname of the target server
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Runs the HTTPWorm.exe program on the target server. HTTPWorm.exe must exist on your home computer.
|
||||
|
||||
@ -233,6 +252,7 @@ sqlinject
|
||||
.. js:function:: sqlinject(hostname/ip)
|
||||
|
||||
:param string hostname/ip: IP or hostname of the target server
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Runs the SQLInject.exe program on the target server. SQLInject.exe must exist on your home computer.
|
||||
|
||||
@ -250,6 +270,7 @@ run
|
||||
:param args...:
|
||||
Additional arguments to pass into the new script that is being run. Note that if any arguments are being
|
||||
passed into the new script, then the second argument *numThreads* must be filled in with a value.
|
||||
:RAM cost: 1 GB
|
||||
|
||||
Run a script as a separate process. This function can only be used to run scripts located on the current server (the server
|
||||
running the script that calls this function).
|
||||
@ -282,6 +303,7 @@ exec
|
||||
:param args...:
|
||||
Additional arguments to pass into the new script that is being run. Note that if any arguments are being
|
||||
passed into the new script, then the third argument *numThreads* must be filled in with a value.
|
||||
:RAM cost: 1.3 GB
|
||||
|
||||
Run a script as a separate process on a specified server. This is similar to the *run* function except
|
||||
that it can be used to run a script on any server, instead of just the current server.
|
||||
@ -311,6 +333,7 @@ spawn
|
||||
:param number numThreads: Number of threads to spawn new script with. Will be rounded to nearest integer
|
||||
:param args...:
|
||||
Additional arguments to pass into the new script that is being run.
|
||||
:RAM cost: 2 GB
|
||||
|
||||
Terminates the current script, and then after a delay of about 20 seconds it will execute the newly-specified script.
|
||||
The purpose of this function is to execute a new script without being constrained by the RAM usage of the current one.
|
||||
@ -330,6 +353,7 @@ kill
|
||||
:param string script: Filename of the script to kill
|
||||
:param string hostname/ip: IP or hostname of the server on which to kill the script
|
||||
:param args...: Arguments to identify which script to kill
|
||||
:RAM cost: 0.5 GB
|
||||
|
||||
Kills the script on the target server specified by the script's name and arguments. Remember that scripts
|
||||
are uniquely identified by both their name and arguments. For example, if *foo.script* is run with the argument 1, then this
|
||||
@ -357,6 +381,7 @@ killall
|
||||
.. js:function:: killall(hostname/ip)
|
||||
|
||||
:param string hostname/ip: IP or hostname of the server on which to kill all scripts
|
||||
:RAM cost: 0.5 GB
|
||||
|
||||
Kills all running scripts on the specified server. This function returns true if any scripts were killed, and
|
||||
false otherwise. In other words, it will return true if there are any scripts running on the target server.
|
||||
@ -367,6 +392,8 @@ exit
|
||||
|
||||
.. js:function:: exit()
|
||||
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Terminates the current script immediately
|
||||
|
||||
scp
|
||||
@ -379,6 +406,7 @@ scp
|
||||
Hostname or IP of the source server, which is the server from which the file will be copied.
|
||||
This argument is optional and if it's omitted the source will be the current server.
|
||||
:param string destination: Hostname or IP of the destination server, which is the server to which the file will be copied.
|
||||
:RAM cost: 0.6 GB
|
||||
|
||||
Copies a script or literature (.lit) file(s) to another server. The *files* argument can be either a string specifying a
|
||||
single file to copy, or an array of strings specifying multiple files to copy.
|
||||
@ -405,6 +433,7 @@ ls
|
||||
|
||||
:param string hostname/ip: Hostname or IP of the target server
|
||||
:param string grep: a substring to search for in the filename
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Returns an array with the filenames of all files on the specified server (as strings). The returned array
|
||||
is sorted in alphabetic order
|
||||
@ -416,6 +445,7 @@ ps
|
||||
|
||||
:param string ip: Hostname or IP address of the target server.
|
||||
If not specified, it will be the current server's IP by default
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Returns an array with general information about all scripts running on the specified
|
||||
target server. The information for each server is given in an object with
|
||||
@ -443,6 +473,7 @@ hasRootAccess
|
||||
.. js:function:: hasRootAccess(hostname/ip)
|
||||
|
||||
:param string hostname/ip: Hostname or IP of the target server
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Returns a boolean indicating whether or not the player has root access to the specified target server.
|
||||
|
||||
@ -457,6 +488,8 @@ getHostname
|
||||
|
||||
.. js:function:: getHostname()
|
||||
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Returns a string with the hostname of the server that the script is running on
|
||||
|
||||
getHackingLevel
|
||||
@ -464,6 +497,8 @@ getHackingLevel
|
||||
|
||||
.. js:function:: getHackingLevel()
|
||||
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Returns the player's current hacking level
|
||||
|
||||
getHackingMultipliers
|
||||
@ -471,8 +506,10 @@ getHackingMultipliers
|
||||
|
||||
.. js:function:: getHackingMultipliers()
|
||||
|
||||
:RAM cost: 4 GB
|
||||
|
||||
Returns an object containing the Player's hacking related multipliers. These multipliers are
|
||||
returned in fractional forms, not percentages (e.g. 1.5 instead of 150%). The object has the following structure::
|
||||
returned in decimal forms, not percentages (e.g. 1.5 instead of 150%). The object has the following structure::
|
||||
|
||||
{
|
||||
chance: Player's hacking chance multiplier,
|
||||
@ -492,8 +529,10 @@ getHacknetMultipliers
|
||||
|
||||
.. js:function:: getHacknetMultipliers()
|
||||
|
||||
:RAM cost: 4 GB
|
||||
|
||||
Returns an object containing the Player's hacknet related multipliers. These multipliers are
|
||||
returned in fractional forms, not percentages (e.g. 1.5 instead of 150%). The object has the following structure::
|
||||
returned in decimal forms, not percentages (e.g. 1.5 instead of 150%). The object has the following structure::
|
||||
|
||||
{
|
||||
production: Player's hacknet production multiplier,
|
||||
@ -517,6 +556,7 @@ getServerMoneyAvailable
|
||||
.. js:function:: getServerMoneyAvailable(hostname/ip)
|
||||
|
||||
:param string hostname/ip: Hostname or IP of target server
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Returns the amount of money available on a server. **Running this function on the home computer will return
|
||||
the player's money.**
|
||||
@ -532,6 +572,7 @@ getServerMaxMoney
|
||||
.. js:function:: getServerMaxMoney(hostname/ip)
|
||||
|
||||
:param string hostname/ip: Hostname or IP of target server
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Returns the maximum amount of money that can be available on a server
|
||||
|
||||
@ -541,6 +582,7 @@ getServerGrowth
|
||||
.. js:function:: getServerGrowth(hostname/ip)
|
||||
|
||||
:param string hostname/ip: Hostname or IP of target server
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Returns the server's instrinsic "growth parameter". This growth parameter is a number
|
||||
between 1 and 100 that represents how quickly the server's money grows. This parameter affects the
|
||||
@ -553,6 +595,7 @@ getServerSecurityLevel
|
||||
.. js:function:: getServerSecurityLevel(hostname/ip)
|
||||
|
||||
:param string hostname/ip: Hostname or IP of target server
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Returns the security level of the target server. A server's security level is denoted by a number, typically
|
||||
between 1 and 100 (but it can go above 100).
|
||||
@ -563,6 +606,7 @@ getServerBaseSecurityLevel
|
||||
.. js:function:: getServerBaseSecurityLevel(hostname/ip)
|
||||
|
||||
:param string hostname/ip: Hostname or IP of target server
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Returns the base security level of the target server. This is the security level that the server starts out with.
|
||||
This is different than *getServerSecurityLevel()* because *getServerSecurityLevel()* returns the current
|
||||
@ -575,6 +619,7 @@ getServerMinSecurityLevel
|
||||
.. js:function:: getServerMinSecurityLevel(hostname/ip)
|
||||
|
||||
:param string hostname/ip: Hostname or IP of target server
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Returns the minimum security level of the target server
|
||||
|
||||
@ -584,6 +629,7 @@ getServerRequiredHackingLevel
|
||||
.. js:function:: getServerRequiredHackingLevel(hostname/ip)
|
||||
|
||||
:param string hostname/ip: Hostname or IP of target server
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Returns the required hacking level of the target server
|
||||
|
||||
@ -593,6 +639,7 @@ getServerNumPortsRequired
|
||||
.. js:function:: getServerNumPortsRequired(hostname/ip)
|
||||
|
||||
:param string hostname/ip: Hostname or IP of target server
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Returns the number of open ports required to successfully run NUKE.exe on the specified server.
|
||||
|
||||
@ -602,6 +649,7 @@ getServerRam
|
||||
.. js:function:: getServerRam(hostname/ip)
|
||||
|
||||
:param string hostname/ip: Hostname or IP of target server
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Returns an array with two elements that gives information about a server's memory (RAM). The first
|
||||
element in the array is the amount of RAM that the server has total (in GB). The second element in
|
||||
@ -619,6 +667,7 @@ serverExists
|
||||
.. js:function:: serverExists(hostname/ip)
|
||||
|
||||
:param string hostname/ip: Hostname or IP of target server
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Returns a boolean denoting whether or not the specified server exists
|
||||
|
||||
@ -631,6 +680,7 @@ fileExists
|
||||
:param string hostname/ip:
|
||||
Hostname or IP of target server. This is optional. If it is not specified then the
|
||||
function will use the current server as the target server
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Returns a boolean indicating whether the specified file exists on the target server. The filename
|
||||
for scripts is case-sensitive, but for other types of files it is not. For example, *fileExists("brutessh.exe")*
|
||||
@ -655,6 +705,7 @@ isRunning
|
||||
:param string filename: Filename of script to check. This is case-sensitive.
|
||||
:param string hostname/ip: Hostname or IP of target server
|
||||
:param args...: Arguments to specify/identify which scripts to search for
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Returns a boolean indicating whether the specified script is running on the target server. Remember that a script is
|
||||
uniquely identified by both its name and its arguments.
|
||||
@ -681,6 +732,8 @@ getNextHacknetNodeCost
|
||||
|
||||
.. js:function:: getNextHacknetNodeCost()
|
||||
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Deprecated (no longer usable). See :doc:`netscripthacknetnodeapi`
|
||||
|
||||
purchaseHacknetNode
|
||||
@ -688,6 +741,8 @@ purchaseHacknetNode
|
||||
|
||||
.. js:function:: purchaseHacknetNode()
|
||||
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Deprecated (no longer usable). See :doc:`netscripthacknetnodeapi`
|
||||
|
||||
getPurchasedServerCost
|
||||
@ -695,6 +750,8 @@ getPurchasedServerCost
|
||||
|
||||
.. js:function:: getPurchasedServerCost(ram)
|
||||
|
||||
:RAM cost: 0.25 GB
|
||||
|
||||
:param number ram: Amount of RAM of a potential purchased server. Must be a power of 2 (2, 4, 8, 16, etc.). Maximum value of 1048576 (2^20)
|
||||
|
||||
Returns the cost to purchase a server with the specified amount of *ram*.
|
||||
@ -712,6 +769,7 @@ purchaseServer
|
||||
|
||||
:param string hostname: Hostname of the purchased server
|
||||
:param number ram: Amount of RAM of the purchased server. Must be a power of 2 (2, 4, 8, 16, etc.). Maximum value of 1048576 (2^20)
|
||||
:RAM cost: 2.25 GB
|
||||
|
||||
Purchased a server with the specified hostname and amount of RAM.
|
||||
|
||||
@ -741,6 +799,7 @@ deleteServer
|
||||
.. js:function:: deleteServer(hostname)
|
||||
|
||||
:param string hostname: Hostname of the server to delete
|
||||
:RAM cost: 2.25 GB
|
||||
|
||||
Deletes one of your purchased servers, which is specified by its hostname.
|
||||
|
||||
@ -757,6 +816,7 @@ getPurchasedServers
|
||||
:param boolean hostname:
|
||||
Specifies whether hostnames or IP addresses should be returned. If it's true then hostnames will be returned, and if false
|
||||
then IPs will be returned. If this argument is omitted then it is true by default
|
||||
:RAM cost: 2.25 GB
|
||||
|
||||
Returns an array with either the hostnames or IPs of all of the servers you have purchased.
|
||||
|
||||
@ -765,6 +825,8 @@ getPurchasedServerLimit
|
||||
|
||||
.. js:function:: getPurchasedServerLimit()
|
||||
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Returns the maximum number of servers you can purchase
|
||||
|
||||
getPurchasedServerMaxRam
|
||||
@ -772,6 +834,8 @@ getPurchasedServerMaxRam
|
||||
|
||||
.. js:function:: getPurchasedServerMaxRam()
|
||||
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Returns the maximum RAM that a purchased server can have
|
||||
|
||||
write
|
||||
@ -782,6 +846,7 @@ write
|
||||
:param string/number port/fn: Port or text file/script that will be written to
|
||||
:param string data: Data to write
|
||||
:param string mode: Defines the write mode. Only valid when writing to text files or scripts.
|
||||
:RAM cost: 1 GB
|
||||
|
||||
This function can be used to either write data to a port, a text file (.txt), or a script (.script, .js, .ns)
|
||||
|
||||
@ -802,6 +867,7 @@ tryWrite
|
||||
:param number port: Port to be written to
|
||||
:param string data: Data to try to write
|
||||
:returns: True if the data is successfully written to the port, and false otherwise
|
||||
:RAM cost: 1 GB
|
||||
|
||||
Attempts to write data to the specified Netscript Port. If the port is full, the data will
|
||||
not be written. Otherwise, the data will be written normally
|
||||
@ -812,6 +878,7 @@ read
|
||||
.. js:function:: read(port/fn)
|
||||
|
||||
:param string/number port/fn: Port or text file to read from
|
||||
:RAM cost: 1 GB
|
||||
|
||||
This function is used to read data from a port, a text file (.txt), or a script (.script, .js, .ns)
|
||||
|
||||
@ -828,6 +895,7 @@ peek
|
||||
.. js:function:: peek(port)
|
||||
|
||||
:param number port: Port to peek. Must be an integer between 1 and 20
|
||||
:RAM cost: 1 GB
|
||||
|
||||
This function is used to peek at the data from a port. It returns the first element in the specified port
|
||||
without removing that element. If the port is empty, the string "NULL PORT DATA" will be returned.
|
||||
@ -840,6 +908,7 @@ clear
|
||||
.. js:function:: clear(port/fn)
|
||||
|
||||
:param string/number port/fn: Port or text file to clear
|
||||
:RAM cost: 1 GB
|
||||
|
||||
This function is used to clear data in a `Netscript Ports <http://bitburner.wikia.com/wiki/Netscript_Ports>`_ or a text file.
|
||||
|
||||
@ -853,6 +922,7 @@ getPortHandle
|
||||
.. js:function:: getPortHandle(port)
|
||||
|
||||
:param number port: Port number
|
||||
:RAM cost: 10 GB
|
||||
|
||||
Get a handle to a Netscript Port. See more details here: :ref:`netscript_ports`
|
||||
|
||||
@ -865,6 +935,7 @@ rm
|
||||
|
||||
:param string fn: Filename of file to remove. Must include the extension
|
||||
:returns: True if it successfully deletes the file, and false otherwise
|
||||
:RAM cost: 1 GB
|
||||
|
||||
Removes the specified file from the current server. This function works for every file type except message (.msg) files.
|
||||
|
||||
@ -875,6 +946,7 @@ scriptRunning
|
||||
|
||||
:param string scriptname: Filename of script to check. This is case-sensitive.
|
||||
:param string hostname/ip: Hostname or IP of target server
|
||||
:RAM cost: 1 GB
|
||||
|
||||
Returns a boolean indicating whether any instance of the specified script is running on the target server, regardless of
|
||||
its arguments.
|
||||
@ -899,6 +971,7 @@ scriptKill
|
||||
|
||||
:param string scriptname: Filename of script to kill. This is case-sensitive.
|
||||
:param string hostname/ip: Hostname or IP of target server
|
||||
:RAM cost: 1 GB
|
||||
|
||||
Kills all scripts with the specified filename on the target server specified by *hostname/ip*, regardless of arguments. Returns
|
||||
true if one or more scripts were successfully killed, and false if none were.
|
||||
@ -908,6 +981,8 @@ getScriptName
|
||||
|
||||
.. js:function:: getScriptName()
|
||||
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Returns the current script name
|
||||
|
||||
getScriptRam
|
||||
@ -917,6 +992,7 @@ getScriptRam
|
||||
|
||||
:param string scriptname: Filename of script. This is case-sensitive.
|
||||
:param string hostname/ip: Hostname or IP of target server the script is located on. This is optional, If it is not specified then the function will se the current server as the target server.
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Returns the amount of RAM required to run the specified script on the target server. Returns
|
||||
0 if the script does not exist.
|
||||
@ -928,6 +1004,7 @@ getHackTime
|
||||
|
||||
:param string hostname/ip: Hostname or IP of target server
|
||||
:param number hackLvl: Optional hacking level for the calculation. Defaults to player's current hacking level
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Returns the amount of time in seconds it takes to execute the *hack()* Netscript function on the target server.
|
||||
|
||||
@ -941,6 +1018,7 @@ getGrowTime
|
||||
|
||||
:param string hostname/ip: Hostname or IP of target server
|
||||
:param number hackLvl: Optional hacking level for the calculation. Defaults to player's current hacking level
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Returns the amount of time in seconds it takes to execute the *grow()* Netscript function on the target server.
|
||||
|
||||
@ -954,6 +1032,7 @@ getWeakenTime
|
||||
|
||||
:param string hostname/ip: Hostname or IP of target server
|
||||
:param number hackLvl: Optional hacking level for the calculation. Defaults to player's current hacking level
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Returns the amount of time in seconds it takes to execute the *weaken()* Netscript function on the target server.
|
||||
|
||||
@ -968,6 +1047,7 @@ getScriptIncome
|
||||
:param string scriptname: Filename of script
|
||||
:param string hostname/ip: Server on which script is running
|
||||
:param args...: Arguments that the script is running with
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Returns the amount of income the specified script generates while online (when the game is open, does not apply for offline income).
|
||||
Remember that a script is uniquely identified by both its name and its arguments. So for example if you ran a script with the arguments
|
||||
@ -986,6 +1066,7 @@ getScriptExpGain
|
||||
:param string scriptname: Filename of script
|
||||
:param string hostname/ip: Server on which script is running
|
||||
:param args...: Arguments that the script is running with
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Returns the amount of hacking experience the specified script generates while online (when the game is open, does not apply for offline experience gains).
|
||||
Remember that a script is uniquely identified by both its name and its arguments.
|
||||
@ -997,6 +1078,8 @@ getTimeSinceLastAug
|
||||
|
||||
.. js:function:: getTimeSinceLastAug()
|
||||
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Returns the amount of time in milliseconds that have passed since you last installed Augmentations
|
||||
|
||||
sprintf
|
||||
@ -1004,6 +1087,8 @@ sprintf
|
||||
|
||||
.. js:function:: sprintf()
|
||||
|
||||
:RAM cost: 0 GB
|
||||
|
||||
See `this link <https://github.com/alexei/sprintf.js>`_ for details.
|
||||
|
||||
vsprintf
|
||||
@ -1011,6 +1096,8 @@ vsprintf
|
||||
|
||||
.. js:function:: vsprintf()
|
||||
|
||||
:RAM cost: 0 GB
|
||||
|
||||
See `this link <https://github.com/alexei/sprintf.js>`_ for details.
|
||||
|
||||
prompt
|
||||
@ -1019,6 +1106,7 @@ prompt
|
||||
.. js:function:: prompt(txt)
|
||||
|
||||
:param string txt: Text to appear in the prompt dialog box
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Prompts the player with a dialog box with two options: "Yes" and "No". This function will return true if the player click "Yes" and
|
||||
false if the player clicks "No". The script's execution is halted until the player selects one of the options.
|
||||
@ -1031,6 +1119,7 @@ wget
|
||||
:param string url: URL to pull data from
|
||||
:param string target: Filename to write data to. Must be script or text file
|
||||
:param string ip: Optional hostname/ip of server for target file.
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Retrieves data from a URL and downloads it to a file on the specified server. The data can only
|
||||
be downloaded to a script (.script, .ns, .js) or a text file (.txt). If the file already exists,
|
||||
@ -1057,4 +1146,6 @@ wget
|
||||
getFavorToDonate
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Returns the amount of Faction favor required to be able to donate to a faction.
|
||||
|
249
doc/source/netscriptgangapi.rst
Normal file
249
doc/source/netscriptgangapi.rst
Normal file
@ -0,0 +1,249 @@
|
||||
Netscript Gang API
|
||||
==================
|
||||
|
||||
Netscript provides the following API for interacting with the game's Gang mechanic.
|
||||
|
||||
The Gang API is **not** immediately available to the player and must be unlocked
|
||||
later in the game
|
||||
|
||||
**WARNING: This page contains spoilers for the game**
|
||||
|
||||
The Gang API is unlocked in BitNode-2. Currently, BitNode-2 is the only location
|
||||
where the Gang mechanic is accessible. This may change in the future
|
||||
|
||||
**Gang API functions must be accessed through the 'gang' namespace**
|
||||
|
||||
In :ref:`netscript1`::
|
||||
|
||||
gang.getMemberNames();
|
||||
gang.recruitMember("Fry");
|
||||
|
||||
In :ref:`netscriptjs`::
|
||||
|
||||
ns.gang.getMemberNames();
|
||||
ns.gang.recruitMember("Fry");
|
||||
|
||||
getMemberNames
|
||||
--------------
|
||||
|
||||
.. js:function:: getMemberNames()
|
||||
|
||||
Get the names of all Gang members
|
||||
|
||||
:returns: An array of the names of all Gang members as strings
|
||||
|
||||
getGangInformation
|
||||
------------------
|
||||
|
||||
.. js:function:: getGangInformation()
|
||||
|
||||
Get general information about the gang
|
||||
|
||||
:returns: An object with the gang information.
|
||||
|
||||
The object has the following structure::
|
||||
|
||||
{
|
||||
faction: Name of faction that the gang belongs to ("Slum Snakes", etc.)
|
||||
isHacking: Boolean indicating whether or not its a hacking gang
|
||||
moneyGainRate: Money earned per second
|
||||
power: Gang's power for territory warfare
|
||||
respect: Gang's respect
|
||||
respectGainRate: Respect earned per second
|
||||
territory: Amount of territory held. Returned in decimal form, not percentage
|
||||
territoryClashChance: Clash chance. Returned in decimal form, not percentage
|
||||
wantedLevel: Gang's wanted level
|
||||
wantedLevelGainRate: Wanted level gained/lost per second (negative for losses)
|
||||
}
|
||||
|
||||
getOtherGangInformation
|
||||
-----------------------
|
||||
|
||||
.. js:function:: getOtherGangInformation()
|
||||
|
||||
Get territory and power information about all gangs
|
||||
|
||||
:returns: An object with information about all gangs
|
||||
|
||||
The object has the following structure::
|
||||
|
||||
{
|
||||
"Slum Snakes" : {
|
||||
power: Slum Snakes' power
|
||||
territory: Slum Snakes' territory, in decimal form
|
||||
},
|
||||
"Tetrads" : {
|
||||
power: ...
|
||||
territory: ...
|
||||
},
|
||||
"The Syndicate" : {
|
||||
power: ...
|
||||
territory: ...
|
||||
},
|
||||
... (for all six gangs)
|
||||
}
|
||||
|
||||
getMemberInformation
|
||||
--------------------
|
||||
|
||||
.. js:function:: getMemberInformation(name)
|
||||
|
||||
:param string name: Name of member
|
||||
|
||||
Get stat and equipment-related information about a Gang Member
|
||||
|
||||
:returns: An object with the gang member information.
|
||||
|
||||
The object has the following structure::
|
||||
|
||||
{
|
||||
agility: Agility stat
|
||||
agilityEquipMult: Agility multiplier from equipment. Decimal form
|
||||
agilityAscensionMult: Agility multiplier from ascension. Decimal form
|
||||
augmentation: Array of names of all owned Augmentations
|
||||
charisma: Charisma stat
|
||||
charismaEquipMult: Charisma multiplier from equipment. Decimal form
|
||||
charismaAscensionMult: Charisma multiplier from ascension. Decimal form
|
||||
defense: Defense stat
|
||||
defenseEquipMult: Defense multiplier from equipment. Decimal form
|
||||
defenseAscensionMult: Defense multiplier from ascension. Decimal form
|
||||
dexterity: Dexterity stat
|
||||
dexterityEquipMult: Dexterity multiplier from equipment. Decimal form
|
||||
dexterityAscensionMult: Dexterity multiplier from ascension. Decimal form
|
||||
equipment: Array of names of all owned Non-Augmentation Equipment
|
||||
hacking: Hacking stat
|
||||
hackingEquipMult: Hacking multiplier from equipment. Decimal form
|
||||
hackingAscensionMult: Hacking multiplier from ascension. Decimal form
|
||||
strength: Strength stat
|
||||
strengthEquipMult: Strength multiplier from equipment. Decimal form
|
||||
strengthAscensionMult: Strength multiplier from ascension. Decimal form
|
||||
task: Name of currently assigned task
|
||||
}
|
||||
|
||||
canRecruitMember
|
||||
----------------
|
||||
|
||||
.. js:function:: canRecruitMember()
|
||||
|
||||
:returns: Boolean indicating whether a member can currently be recruited
|
||||
|
||||
recruitMember
|
||||
-------------
|
||||
|
||||
.. js:function:: recruitMember(name)
|
||||
|
||||
:param string name: Name of member to recruit
|
||||
|
||||
Attempt to recruit a new gang member.
|
||||
|
||||
Possible reasons for failure:
|
||||
* Cannot currently recruit a new member
|
||||
* There already exists a member with the specified name
|
||||
|
||||
:returns: True if the member was successfully recruited. False otherwise
|
||||
|
||||
getTaskNames
|
||||
------------
|
||||
|
||||
.. js:function:: getTaskNames()
|
||||
|
||||
Get the name of all valid tasks that Gang members can be assigned to
|
||||
|
||||
:returns: Array of strings of all task names
|
||||
|
||||
setMemberTask
|
||||
-------------
|
||||
|
||||
.. js:function:: setMemberTask(memberName, taskName)
|
||||
|
||||
:param string memberName: Name of Gang member to assign
|
||||
:param string taskName: Task to assign
|
||||
|
||||
Attempts to assign the specified Gang Member to the specified task.
|
||||
If an invalid task is specified, the Gang member will be set to idle ("Unassigned")
|
||||
|
||||
:returns: True if the Gang Member was successfully assigned to the task. False otherwise
|
||||
|
||||
getEquipmentNames
|
||||
-----------------
|
||||
|
||||
.. js:function:: getEquipmentNames()
|
||||
|
||||
Get the name of all possible equipment/upgrades you can purchase for your
|
||||
Gang Members. This includes Augmentations.
|
||||
|
||||
:returns: Array of strings of the names of all Equpiment/Augmentations
|
||||
|
||||
getEquipmentCost
|
||||
----------------
|
||||
|
||||
.. js:function:: getEquipmentCost(equipName)
|
||||
|
||||
:param string equipName: Name of equipment
|
||||
|
||||
Get the amount of money it takes to purchase a piece of Equipment or an Augmentation.
|
||||
If an invalid Equipment/Augmentation is specified, this function will return Infinity.
|
||||
|
||||
:returns: Cost to purchase the specified Equipment/Augmentation (number). Infinity
|
||||
for invalid arguments
|
||||
|
||||
purchaseEquipment
|
||||
-----------------
|
||||
|
||||
.. js:function:: purchaseEquipment(memberName, equipName)
|
||||
|
||||
:param string memberName: Name of Gang member to purchase the equipment for
|
||||
:param string equipName: Name of Equipment/Augmentation to purchase
|
||||
|
||||
Attempt to purchase the specified Equipment/Augmentation for the specified
|
||||
Gang member.
|
||||
|
||||
:returns: True if the equipment was successfully purchased. False otherwise
|
||||
|
||||
|
||||
ascendMember
|
||||
------------
|
||||
|
||||
.. js:function:: ascendMember(name)
|
||||
|
||||
:param string name: Name of member to ascend
|
||||
|
||||
Ascend the specified Gang Member.
|
||||
|
||||
:returns: An object with info about the ascension results.
|
||||
|
||||
The object has the following structure::
|
||||
|
||||
{
|
||||
respect: Amount of respect lost from ascending
|
||||
hack: Hacking multiplier gained from ascending. Decimal form
|
||||
str: Strength multiplier gained from ascending. Decimal form
|
||||
def: Defense multiplier gained from ascending. Decimal form
|
||||
dex: Dexterity multiplier gained from ascending. Decimal form
|
||||
agi: Agility multiplier gained from ascending. Decimal form
|
||||
cha: Charisma multiplier gained from ascending. Decimal form
|
||||
}
|
||||
|
||||
|
||||
setTerritoryWarfare
|
||||
-------------------
|
||||
|
||||
.. js:function:: setTerritoryWarfare(engage)
|
||||
|
||||
:param bool engage: Whether or not to engage in territory warfare
|
||||
|
||||
Set whether or not the gang should engage in territory warfare
|
||||
|
||||
getBonusTime
|
||||
------------
|
||||
|
||||
.. js:function:: getBonusTime()
|
||||
|
||||
Returns the amount of accumulated "bonus time" (seconds) for the Gang mechanic.
|
||||
|
||||
"Bonus time" is accumulated when the game is offline or if the game is
|
||||
inactive in the browser.
|
||||
|
||||
"Bonus time" makes the game progress faster, up to 10x the normal speed.
|
||||
|
||||
:returns: Bonus time for the Gang mechanic in seconds
|
@ -14,7 +14,7 @@ You can use the Singularity Functions in other BitNodes if and only if you have
|
||||
Source-File 4 will open up additional Singularity Functions that you can use in other BitNodes. If your Source-File 4 is upgraded all the way to
|
||||
level 3, then you will be able to access all of the Singularity Functions.
|
||||
|
||||
Note that Singularity Functions require a lot of RAM outside of BitNode-4 (their RAM costs are multiplied by 10 if you are not in BitNode-4)
|
||||
Note that Singularity Functions require twice as much RAM outside of BitNode-4
|
||||
|
||||
universityCourse
|
||||
----------------
|
||||
@ -163,14 +163,33 @@ getCharacterInformation
|
||||
|
||||
{
|
||||
bitnode: Current BitNode number
|
||||
company: Name of company
|
||||
jobTitle: Name of job
|
||||
city: Name of city you are currently in
|
||||
company: Name of company
|
||||
factions: Array of factions you are currently a member of
|
||||
jobTitle: Name of job
|
||||
tor: Boolean indicating whether or not you have a tor router
|
||||
|
||||
//The following apply to when the character is performing
|
||||
//some type of working action, such as working for a company/faction
|
||||
// The following is an object with many of the player's multipliers from Augmentations/Source Files
|
||||
mult: {
|
||||
agility: Agility stat
|
||||
agilityExp: Agility exp
|
||||
companyRep: Company reputation
|
||||
crimeMoney: Money earned from crimes
|
||||
crimeSuccess: Crime success chance
|
||||
defense: Defense stat
|
||||
defenseExp: Defense exp
|
||||
dexterity: Dexterity stat
|
||||
dexterityExp: Dexterity exp
|
||||
factionRep: Faction reputation
|
||||
hacking: Hacking stat
|
||||
hackingExp: Hacking exp
|
||||
strength: Strength stat
|
||||
strengthExp: Strength exp
|
||||
workMoney: Money earned from jobs
|
||||
},
|
||||
|
||||
// The following apply only to when the character is performing
|
||||
// some type of working action, such as working for a company/faction
|
||||
timeWorked: Timed worked in ms
|
||||
workHackExpGain: Hacking experience earned so far from work
|
||||
workStrExpGain: Str experience earned so far from work
|
||||
|
106
index.html
106
index.html
@ -2,7 +2,7 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Bitburner - development</title>
|
||||
<title>Bitburner</title>
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="dist/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="dist/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="dist/favicon-16x16.png">
|
||||
@ -109,7 +109,7 @@
|
||||
|
||||
<div id="script-editor-filename-wrapper">
|
||||
<p id="script-editor-filename-tag"> <strong style="background-color:#555;">Script name: </strong></p>
|
||||
<input id="script-editor-filename" type="text" maxlength="30" tabindex="1" />
|
||||
<input id="script-editor-filename" type="text" maxlength="30" tabindex="1"/>
|
||||
</div>
|
||||
|
||||
<div id="javascript-editor"></div>
|
||||
@ -159,7 +159,7 @@
|
||||
|
||||
<fieldset>
|
||||
<label for="script-editor-option-maxerr" class="tooltip">Max Error Count</label>
|
||||
<input type="range" max="1000" min="50" value="200" step="1" name="script-editor-option-maxerr" id="script-editor-option-maxerr" />
|
||||
<input type="range" max="1000" min="50" value="200" step="1" name="script-editor-option-maxerr" id="script-editor-option-maxerr"/>
|
||||
<em id="script-editor-option-maxerror-value-label" style="font-style: normal;"></em>
|
||||
</fieldset>
|
||||
</div> <!-- End script editor options panel -->
|
||||
@ -170,7 +170,7 @@
|
||||
<table id="terminal">
|
||||
<tr id="terminal-input">
|
||||
<td id="terminal-input-td" tabindex="2">$
|
||||
<input type="text" id="terminal-input-text-box" class="terminal-input" tabindex="1" onfocus="this.value = this.value;" />
|
||||
<input type="text" id="terminal-input-text-box" class="terminal-input" tabindex="1" onfocus="this.value = this.value;"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@ -187,7 +187,7 @@
|
||||
provides information about each script's production. The scripts are categorized by the hostname of the servers on which
|
||||
they are running. </p>
|
||||
<p id="active-scripts-total-prod">Total online production of
|
||||
Active scripts: <span class="money-gold"><span id="active-scripts-total-production-active">$0.000</span> / sec</span><br />
|
||||
Active scripts: <span class="money-gold"><span id="active-scripts-total-production-active">$0.000</span> / sec</span><br/>
|
||||
Total online production since last Aug installation: <span id="active-scripts-total-prod-aug-total" class="money-gold">$0.000</span>
|
||||
(<span class="money-gold"><span id="active-scripts-total-prod-aug-avg" class="money-gold">$0.000</span> / sec</span>)</p>
|
||||
<ul class="active-scripts-list" id="active-scripts-list" style="list-style: none;">
|
||||
@ -201,19 +201,19 @@
|
||||
The Hacknet is a global, decentralized network of machines. It is used by hackers all around
|
||||
the world to anonymously share computing power and perform distributed cyberattacks without the
|
||||
fear of being traced.
|
||||
<br /><br />
|
||||
<br/><br/>
|
||||
Here, you can purchase a Hacknet Node, a specialized machine that can connect and contribute its
|
||||
resources to the Hacknet network. This allows you to take a small percentage of profits
|
||||
from hacks performed on the network. Essentially, you are renting out your Node's computing power.
|
||||
<br /><br />
|
||||
<br/><br/>
|
||||
Each Hacknet Node you purchase will passively earn you money. Each Hacknet Node can be upgraded
|
||||
in order to increase its computing power and thereby increase the profit you earn from it.
|
||||
</p>
|
||||
<a id="hacknet-nodes-purchase-button" class="a-link-button"> Purchase Hacknet Node </a>
|
||||
<br />
|
||||
<br/>
|
||||
<div id="hacknet-nodes-money-multipliers-div">
|
||||
<p id="hacknet-nodes-money">
|
||||
<span>Money:</span><span id="hacknet-nodes-player-money" class="money-gold"></span><br />
|
||||
<span>Money:</span><span id="hacknet-nodes-player-money" class="money-gold"></span><br/>
|
||||
<span>Total Hacknet Node Production:</span><span id="hacknet-nodes-total-production" class="money-gold"></span>
|
||||
</p>
|
||||
<span id="hacknet-nodes-multipliers">
|
||||
@ -471,8 +471,7 @@
|
||||
|
||||
<!-- Tutorial content -->
|
||||
<div id="tutorial-container" class="generic-menupage-container">
|
||||
<a id="tutorial-getting-started-link" class="a-link-button"
|
||||
href="http://bitburner.wikia.com/wiki/Chapt3rs_Guide_to_Getting_Started_with_Bitburner" target="_blank"> Getting Started </a>
|
||||
<a id="tutorial-getting-started-link" class="a-link-button" href="http://bitburner.wikia.com/wiki/Chapt3rs_Guide_to_Getting_Started_with_Bitburner" target="_blank"> Getting Started </a>
|
||||
<a id="tutorial-networking-link" class="a-link-button"> Servers & Networking </a>
|
||||
<a id="tutorial-hacking-link" class="a-link-button"> Hacking </a>
|
||||
<a id="tutorial-scripts-link" class="a-link-button"> Scripts </a>
|
||||
@ -481,65 +480,12 @@
|
||||
<a id="tutorial-jobs-link" class="a-link-button"> Companies and Infiltration </a>
|
||||
<a id="tutorial-factions-link" class="a-link-button"> Factions </a>
|
||||
<a id="tutorial-augmentations-link" class="a-link-button"> Augmentations </a>
|
||||
<a id="tutorial-shortcuts-link" class="a-link-button"
|
||||
href="https://bitburner.wikia.com/wiki/Shortcuts" target="_blank"> Keyboard Shortcuts </a>
|
||||
<a id="tutorial-shortcuts-link" class="a-link-button" href="https://bitburner.wikia.com/wiki/Shortcuts" target="_blank"> Keyboard Shortcuts </a>
|
||||
|
||||
<a id="tutorial-back-button" class="a-link-button"> Back </a>
|
||||
<p id="tutorial-text"> </p>
|
||||
</div>
|
||||
|
||||
<!-- dev menu -->
|
||||
<div id="dev-menu-container" class="generic-menupage-container">
|
||||
<p id="dev-menu-text">If you see this menu you can pretty much break the game. It's recommended that you use this menu only to setup a save file appropriate to test a new feature or bug fix.</p>
|
||||
|
||||
<p id="dev-menu-text">Generic</p>
|
||||
<a id="dev-need-money" class="a-link-button">Add $1000t</a>
|
||||
<a id="dev-need-ram" class="a-link-button">Double home RAM</a>
|
||||
|
||||
<p id="dev-menu-text">Augmentation related: </p>
|
||||
<!-- gets populated with the list of all augments -->
|
||||
<select id="dev-menu-aug-dropdown" class="dropdown"></select>
|
||||
<a id="dev-add-aug" class="a-link-button tooltip">Queue Augmentation<span class="tooltiptext">May require save + reload</span></a>
|
||||
|
||||
<input id="dev-sf-n" type="number" class="text-input" placeholder="SourceFile-N"><input id="dev-sf-lvl" type="number" class="text-input" placeholder="SourceFile-Lvl"><a id="dev-add-source-file" class="a-link-button tooltip"> Add/Remove source file <span class="tooltiptext">If Lvl == 0 the sf will be removed, calling it with another level will replace your current source file. You CAN set a source file higher than it's maximum level.</span></a>
|
||||
|
||||
<p id="dev-menu-text">Faction related: </p>
|
||||
<select id="dev-menu-faction-dropdown" class="dropdown"></select>
|
||||
<a id="dev-add-faction" class="a-link-button tooltip">Receive invite<span class="tooltiptext">May require save + reload</span></a>
|
||||
|
||||
<p id="dev-menu-text">Program related: </p>
|
||||
<select id="dev-menu-connect-dropdown" class="dropdown"></select>
|
||||
<a id="dev-connect" class="a-link-button tooltip">Connect<span class="tooltiptext">Connect to the target server.</span></a>
|
||||
|
||||
<select id="dev-menu-add-program-dropdown" class="dropdown"></select>
|
||||
<a id="dev-add-program" class="a-link-button tooltip">Add Program<span class="tooltiptext">Add this program to the player home server, won't add the same program twice.</span></a>
|
||||
|
||||
<a id="dev-bit-flume" class="a-link-button tooltip">Trigger BitFlume<span class="tooltiptext">Quick escape to change BN, does not give SFs</span></a>
|
||||
|
||||
<p id="dev-menu-text">Server related: </p>
|
||||
<a id="dev-open-all" class="a-link-button tooltip">NUKE + ports all servers<span class="tooltiptext">Opens all ports, nukes all servers, gains root access to everything (still need the appropriate hacking level)</span></a>
|
||||
<a id="dev-min-security" class="a-link-button tooltip">minimize all servers security<span class="tooltiptext">All servers security will be set to their minimum security</span></a>
|
||||
<a id="dev-max-money" class="a-link-button tooltip">maximize all servers money<span class="tooltiptext">Set all servers available money to maximum for that server</span></a>
|
||||
|
||||
<p id="dev-menu-text">Exp/stats related: </p>
|
||||
<input id="dev-hacking-exp" type="number" class="text-input" placeholder="+exp/-exp (int)">
|
||||
<a id="dev-add-hacking" class="a-link-button tooltip">add hacking exp<span class="tooltiptext">Add that many hacking experience point, use negative numbers to remove, don't worry about going under 0 exp</span></a>
|
||||
<input id="dev-strength-exp" type="number" class="text-input" placeholder="+exp/-exp (int)">
|
||||
<a id="dev-add-strength" class="a-link-button tooltip">add strength exp<span class="tooltiptext">Add that many strength experience point, use negative numbers to remove, don't worry about going under 0 exp</span></a>
|
||||
<input id="dev-defense-exp" type="number" class="text-input" placeholder="+exp/-exp (int)">
|
||||
<a id="dev-add-defense" class="a-link-button tooltip">add defense exp<span class="tooltiptext">Add that many defense experience point, use negative numbers to remove, don't worry about going under 0 exp</span></a>
|
||||
<input id="dev-dexterity-exp" type="number" class="text-input" placeholder="+exp/-exp (int)">
|
||||
<a id="dev-add-dexterity" class="a-link-button tooltip">add dexterity exp<span class="tooltiptext">Add that many dexterity experience point, use negative numbers to remove, don't worry about going under 0 exp</span></a>
|
||||
<input id="dev-agility-exp" type="number" class="text-input" placeholder="+exp/-exp (int)">
|
||||
<a id="dev-add-agility" class="a-link-button tooltip">add agility exp<span class="tooltiptext">Add that many agility experience point, use negative numbers to remove, don't worry about going under 0 exp</span></a>
|
||||
<input id="dev-charisma-exp" type="number" class="text-input" placeholder="+exp/-exp (int)">
|
||||
<a id="dev-add-charisma" class="a-link-button tooltip">add charisma exp<span class="tooltiptext">Add that many charisma experience point, use negative numbers to remove, don't worry about going under 0 exp</span></a>
|
||||
<input id="dev-intelligence-exp" type="number" class="text-input" placeholder="+exp/-exp (int)">
|
||||
<a id="dev-add-intelligence" class="a-link-button tooltip">add intelligence exp<span class="tooltiptext">Add that many intelligence experience point, use negative numbers to remove, don't worry about going under 0 exp</span></a>
|
||||
<a id="dev-enable-intelligence" class="a-link-button tooltip"> enable intelligence<span class="tooltiptext">Enables the intelligence stat</span></a>
|
||||
<a id="dev-disable-intelligence" class="a-link-button tooltip"> disable intelligence<span class="tooltiptext">Disables the intelligence stat</span></a>
|
||||
</div>
|
||||
|
||||
<!-- Location (visiting a location in World) -->
|
||||
<div id="location-container" class="generic-menupage-container">
|
||||
<a id="location-return-to-world-button" class="a-link-button"> Return to World </a>
|
||||
@ -625,7 +571,7 @@
|
||||
<p id="location-slums-description">
|
||||
You have entered the Slums, a poverty-ridden district filled with gangs, criminals, and
|
||||
other shadowy entities. The city's government and police have neglected this area for years...
|
||||
<br /><br /><br />
|
||||
<br/><br/><br/>
|
||||
In the Slums, you can commit crimes to earn money and experience. Crime attempts are not always
|
||||
successful. Your chance at successfully committing a crime is determined by your stats.
|
||||
</p>
|
||||
@ -672,7 +618,7 @@
|
||||
|
||||
<div id="stock-market-container" class="generic-menupage-container">
|
||||
<p>
|
||||
Welcome to the World Stock Exchange (WSE)! <br /><br />
|
||||
Welcome to the World Stock Exchange (WSE)! <br/><br/>
|
||||
|
||||
To begin trading, you must first purchase an account. WSE accounts will persist
|
||||
after you 'reset' by installing Augmentations.
|
||||
@ -685,7 +631,7 @@
|
||||
TIX, short for Trade Information eXchange, is the communications protocol supported by the WSE.
|
||||
Purchasing access to the TIX API lets you write code to create your own algorithmic/automated
|
||||
trading strategies.
|
||||
<br /><br />
|
||||
<br/><br/>
|
||||
If you purchase access to the TIX API, you will retain that access even after
|
||||
you 'reset' by installing Augmentations.
|
||||
</p>
|
||||
@ -695,7 +641,7 @@
|
||||
<p>
|
||||
Four Sigma's (4S) Market Data Feed provides information about stocks
|
||||
that will help your trading strategies.
|
||||
<br /><br />
|
||||
<br/><br/>
|
||||
If you purchase access to 4S Market Data and/or the 4S TIX API, you will
|
||||
retain that access even after you 'reset' by installing Augmentations.
|
||||
</p>
|
||||
@ -713,7 +659,7 @@
|
||||
<a id="stock-market-mode" class="a-link-button tooltip"></a>
|
||||
<a id="stock-market-expand-tickers" class="a-link-button tooltip">Expand tickers</a>
|
||||
<a id="stock-market-collapse-tickers" class="a-link-button tooltip">Collapse tickers</a>
|
||||
<br /><br />
|
||||
<br/><br/>
|
||||
<input id="stock-market-watchlist-filter" type="text" placeholder="Filter Stocks by symbol (comma-separated list)"/>
|
||||
<a id="stock-market-watchlist-filter-update" class="a-link-button"> Update Watchlist </a>
|
||||
<ul id="stock-market-list" style="list-style:none;">
|
||||
@ -743,7 +689,7 @@
|
||||
<div id="yes-no-text-input-box-container" class="popup-box-container">
|
||||
<div id="yes-no-text-input-box-content" class="popup-box-content">
|
||||
<p id="yes-no-text-input-box-text"> </p>
|
||||
<input type="text" id="yes-no-text-input-box-input" pattern="[a-zA-Z0-9-_]" maxlength="30" />
|
||||
<input type="text" id="yes-no-text-input-box-input" pattern="[a-zA-Z0-9-_]" maxlength="30"/>
|
||||
<button id="yes-no-text-input-box-yes" class="popup-box-button"> Yes </button>
|
||||
<button id="yes-no-text-input-box-no" class="popup-box-button"> No </button>
|
||||
</div>
|
||||
@ -755,7 +701,7 @@
|
||||
<p id="faction-invitation-box-text"> </p>
|
||||
<p id="faction-invitation-box-message"> </p>
|
||||
<p id="faction-invitation-box-warning">
|
||||
Would you like to join? <br /> <br />
|
||||
Would you like to join? <br/> <br/>
|
||||
Warning: Joining this faction may prevent you from joining other factions during this run!
|
||||
</p>
|
||||
<button id="faction-invitation-box-yes" class="popup-box-button"> Yes </button>
|
||||
@ -768,8 +714,8 @@
|
||||
<div id="infiltration-box-content" class="popup-box-content">
|
||||
<p id="infiltration-box-text"> </p>
|
||||
|
||||
<button id="infiltration-box-sell" class="a-link-button"> Sell on Black Market </button> <br /><br />
|
||||
<select id="infiltration-faction-select"> </select> <br />
|
||||
<button id="infiltration-box-sell" class="a-link-button"> Sell on Black Market </button> <br/><br/>
|
||||
<select id="infiltration-faction-select"> </select> <br/>
|
||||
<button id="infiltration-box-faction" class="a-link-button"> Give to Faction for Reputation </button>
|
||||
|
||||
</div>
|
||||
@ -855,7 +801,7 @@
|
||||
<div id="game-options-content" class="game-options-box">
|
||||
<button id="game-options-close-button">×</button>
|
||||
<h1> Game Options </h1>
|
||||
<br />
|
||||
<br/>
|
||||
<div id="game-options-left-panel">
|
||||
<!-- Netscript execution time -->
|
||||
<fieldset>
|
||||
@ -867,7 +813,7 @@
|
||||
</span>
|
||||
</label>
|
||||
|
||||
<input type ="range" max="100" min="10" step="1" name="settingsNSExecTimeRangeVal" id="settingsNSExecTimeRangeVal" value="25" />
|
||||
<input type="range" max="100" min="10" step="1" name="settingsNSExecTimeRangeVal" id="settingsNSExecTimeRangeVal" value="25"/>
|
||||
<em id="settingsNSExecTimeRangeValLabel" style="font-style: normal;"></em>
|
||||
</fieldset>
|
||||
|
||||
@ -881,7 +827,7 @@
|
||||
</span>
|
||||
</label>
|
||||
|
||||
<input type="range" max="100" min="20" step="1" name="settingsNSLogRangeVal" id="settingsNSLogRangeVal" value="50" />
|
||||
<input type="range" max="100" min="20" step="1" name="settingsNSLogRangeVal" id="settingsNSLogRangeVal" value="50"/>
|
||||
<em id="settingsNSLogRangeValLabel" style="font-style: normal;"></em>
|
||||
</fieldset>
|
||||
|
||||
@ -895,7 +841,7 @@
|
||||
</span>
|
||||
</label>
|
||||
|
||||
<input type="range" max="100" min="20" step="1" name="settingsNSPortRangeVal" id="settingsNSPortRangeVal" value="50" />
|
||||
<input type="range" max="100" min="20" step="1" name="settingsNSPortRangeVal" id="settingsNSPortRangeVal" value="50"/>
|
||||
<em id="settingsNSPortRangeValLabel" style="font-style: normal;"></em>
|
||||
</fieldset>
|
||||
|
||||
@ -907,7 +853,7 @@
|
||||
</span>
|
||||
</label>
|
||||
|
||||
<input type="range" max="600" min="0" step="1" name="settingsAutosaveIntervalVal" id="settingsAutosaveIntervalVal" value="60" />
|
||||
<input type="range" max="600" min="0" step="1" name="settingsAutosaveIntervalVal" id="settingsAutosaveIntervalVal" value="60"/>
|
||||
<em id="settingsAutosaveIntervalValLabel" style="font-style: normal;"></em>
|
||||
</fieldset>
|
||||
|
||||
@ -1019,7 +965,7 @@
|
||||
<a id="save-game-link" class="a-link-button" style="display:inline-block;width:46%;"> Save Game </a>
|
||||
<a id="delete-game-link" class="a-link-button" style="display:inline-block;width:46%;"> Delete Game </a>
|
||||
<a id="export-game-link" class="a-link-button" style="display:inline-block;width:46%;"> Export Game </a>
|
||||
<input type="file" id="import-game-file-selector" name="file" />
|
||||
<input type="file" id="import-game-file-selector" name="file"/>
|
||||
<a id="import-game-link" class="a-link-button" style="display:inline-block;width:46%;"> Import Game </a>
|
||||
<a id="debug-delete-scripts-link" class="a-link-button tooltip" style="display:block;width:46%;">
|
||||
(DEBUG) Delete Active Scripts
|
||||
|
@ -101,7 +101,14 @@ let NetscriptFunctions =
|
||||
"upgradeLevel|upgradeRam|upgradeCore|getLevelUpgradeCost|" +
|
||||
"getRamUpgradeCost|getCoreUpgradeCost|" +
|
||||
|
||||
// Bladeburner functions
|
||||
// Gang API
|
||||
"gang|" +
|
||||
"getMemberNames|getGangInformation|getMemberInformation|canRecruitMember|" +
|
||||
"recruitMember|getTaskNames|setMemberTask|getEquipmentNames|" +
|
||||
"getEquipmentCost|purchaseEquipment|ascendMember|setTerritoryWarfare|" +
|
||||
"getBonusTime|" +
|
||||
|
||||
// Bladeburner API
|
||||
"bladeburner|getContractNames|getOperationNames|getBlackOpNames|" +
|
||||
"getGeneralActionNames|getSkillNames|startAction|stopBladeburnerAction|" +
|
||||
"getActionTime|getActionEstimatedSuccessChance|getActionCountRemaining|" +
|
||||
|
@ -152,7 +152,7 @@ function addActiveScriptsItem(workerscript) {
|
||||
panel.appendChild(createElement("br"));
|
||||
panel.appendChild(createElement("span", {
|
||||
innerText: "Log",
|
||||
class: "active-scripts-button",
|
||||
class: "accordion-button",
|
||||
margin: "4px",
|
||||
padding: "4px",
|
||||
clickListener: () => {
|
||||
@ -162,7 +162,7 @@ function addActiveScriptsItem(workerscript) {
|
||||
}));
|
||||
panel.appendChild(createElement("span", {
|
||||
innerText: "Kill Script",
|
||||
class: "active-scripts-button",
|
||||
class: "accordion-button",
|
||||
margin: "4px",
|
||||
padding: "4px",
|
||||
clickListener: () => {
|
||||
|
@ -9,6 +9,9 @@ import {prestigeAugmentation} from "./Prestige";
|
||||
import {saveObject} from "./SaveObject";
|
||||
import {Script, RunningScript} from "./Script";
|
||||
import {Server} from "./Server";
|
||||
import {OwnedAugmentationsOrderSetting} from "./SettingEnums";
|
||||
import {Settings} from "./Settings";
|
||||
|
||||
import {SourceFiles} from "./SourceFile";
|
||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||
import {createAccordionElement} from "../utils/uiHelpers/createAccordionElement";
|
||||
@ -2570,7 +2573,7 @@ function displayAugmentationsContent() {
|
||||
}));
|
||||
|
||||
//Sort Buttons
|
||||
Engine.Display.augmentationsContent.appendChild(createElement("a", {
|
||||
const sortInOrderButton = createElement("a", {
|
||||
class:"a-link-button", fontSize:"14px", innerText:"Sort in Order",
|
||||
tooltip:"Sorts the Augmentations alphabetically and Source Files in numerical order (1, 2, 3,...)",
|
||||
clickListener:()=>{
|
||||
@ -2587,22 +2590,31 @@ function displayAugmentationsContent() {
|
||||
});
|
||||
displaySourceFiles(augmentationsList, sourceFiles);
|
||||
displayAugmentations(augmentationsList, augs);
|
||||
}
|
||||
}));
|
||||
|
||||
Engine.Display.augmentationsContent.appendChild(createElement("a", {
|
||||
Settings.OwnedAugmentationsOrder = OwnedAugmentationsOrderSetting.Alphabetically;
|
||||
}
|
||||
});
|
||||
Engine.Display.augmentationsContent.appendChild(sortInOrderButton);
|
||||
|
||||
const sortByAcquirementTimeButton = createElement("a", {
|
||||
class:"a-link-button", fontSize:"14px", innerText:"Sort by Acquirement Time",
|
||||
tooltip:"Sorts the Augmentations and Source Files based on when you acquired them (same as default)",
|
||||
clickListener:()=>{
|
||||
removeChildrenFromElement(augmentationsList);
|
||||
displaySourceFiles(augmentationsList, Player.sourceFiles);
|
||||
displayAugmentations(augmentationsList, Player.augmentations);
|
||||
|
||||
Settings.OwnedAugmentationsOrder = OwnedAugmentationsOrderSetting.AcquirementTime;
|
||||
}
|
||||
}));
|
||||
});
|
||||
Engine.Display.augmentationsContent.appendChild(sortByAcquirementTimeButton);
|
||||
|
||||
//Source Files - Temporary...Will probably put in a separate pane Later
|
||||
displaySourceFiles(augmentationsList, Player.sourceFiles);
|
||||
displayAugmentations(augmentationsList, Player.augmentations);
|
||||
if (Settings.OwnedAugmentationsOrder === OwnedAugmentationsOrderSetting.Alphabetically) {
|
||||
sortInOrderButton.click();
|
||||
} else {
|
||||
sortByAcquirementTimeButton.click();
|
||||
}
|
||||
Engine.Display.augmentationsContent.appendChild(augmentationsList);
|
||||
}
|
||||
|
||||
|
@ -28,7 +28,9 @@ function initBitNodes() {
|
||||
"left behind from the collapse of Western government in the 2050's. As society and civlization broke down, " +
|
||||
"people quickly succumbed to the innate human impulse of evil and savagery. The organized crime " +
|
||||
"factions quickly rose to the top of the modern world.<br><br>" +
|
||||
"In this BitNode:<br><br>The maximum amount of money available on a server is significantly decreased<br>" +
|
||||
"In this BitNode:<br><br>" +
|
||||
"Your hacking level is reduced by 20%<br>" +
|
||||
"The growth rate and maximum amount of money available on servers are significantly decreased<br>" +
|
||||
"The amount of money gained from crimes and Infiltration is tripled<br>" +
|
||||
"Certain Factions (Slum Snakes, Tetrads, The Syndicate, The Dark Army, Speakers for the Dead, " +
|
||||
"NiteSec, The Black Hand) give the player the ability to form and manage their own gangs. These gangs " +
|
||||
@ -214,6 +216,8 @@ function initBitNodeMultipliers() {
|
||||
case 1: //Source Genesis (every multiplier is 1)
|
||||
break;
|
||||
case 2: //Rise of the Underworld
|
||||
BitNodeMultipliers.HackingLevelMultiplier = 0.8;
|
||||
BitNodeMultipliers.ServerGrowthRate = 0.8;
|
||||
BitNodeMultipliers.ServerMaxMoney = 0.2;
|
||||
BitNodeMultipliers.ServerStartingMoney = 0.4;
|
||||
BitNodeMultipliers.CrimeMoney = 3;
|
||||
|
@ -1768,8 +1768,9 @@ Bladeburner.prototype.createOverviewContent = function() {
|
||||
});
|
||||
|
||||
DomElems.overviewStaminaHelpTip = createElement("div", {
|
||||
innerText:"?", class:"help-tip",
|
||||
clickListener:()=>{
|
||||
class:"help-tip",
|
||||
innerText:"?",
|
||||
clickListener: ()=> {
|
||||
dialogBoxCreate("Performing actions will use up your stamina.<br><br>" +
|
||||
"Your max stamina is determined primarily by your agility stat.<br><br>" +
|
||||
"Your stamina gain rate is determined by both your agility and your " +
|
||||
@ -1781,7 +1782,7 @@ Bladeburner.prototype.createOverviewContent = function() {
|
||||
"your success rate would be multipled by 85% (100 - 15).<br><br>" +
|
||||
"Your max stamina and stamina gain rate can also be increased by " +
|
||||
"training, or through skills and Augmentation upgrades.");
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
DomElems.overviewGen1 = createElement("p", {
|
||||
@ -3335,6 +3336,38 @@ Bladeburner.prototype.startActionNetscriptFn = function(type, name, workerScript
|
||||
return false;
|
||||
}
|
||||
|
||||
// Special logic for Black Ops
|
||||
if (actionId.type === ActionTypes["BlackOp"]) {
|
||||
// Can't start a BlackOp if you don't have the required rank
|
||||
let action = this.getActionObject(actionId);
|
||||
if (action.reqdRank > this.rank) {
|
||||
workerScript.log(`Failed to start Black Op ${actionId.name} due to insufficient rank`);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Can't start a BlackOp if you haven't done the one before it
|
||||
var blackops = [];
|
||||
for (const nm in BlackOperations) {
|
||||
if (BlackOperations.hasOwnProperty(nm)) {
|
||||
blackops.push(nm);
|
||||
}
|
||||
}
|
||||
blackops.sort(function(a, b) {
|
||||
return (BlackOperations[a].reqdRank - BlackOperations[b].reqdRank); // Sort black ops in intended order
|
||||
});
|
||||
|
||||
let i = blackops.indexOf(actionId.name);
|
||||
if (i === -1) {
|
||||
workerScript.log("ERROR: Invalid Black Operation name passed into bladeburner.startAction(). Note that this name is case-sensitive & whitespace-sensitive");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (i > 0 && this.blackops[blackops[i-1]] == null) {
|
||||
workerScript.log(`ERROR: Cannot attempt Black Operation ${actionId.name} because you have not done the preceding one`);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
this.startAction(actionId);
|
||||
if (workerScript.shouldLog("startAction")) {
|
||||
@ -3436,9 +3469,14 @@ Bladeburner.prototype.getActionCountRemainingNetscriptFn = function(type, name,
|
||||
switch (actionId.type) {
|
||||
case ActionTypes["Contract"]:
|
||||
case ActionTypes["Operation"]:
|
||||
return actionObj.count;
|
||||
case ActionTypes["BlackOp"]:
|
||||
case ActionTypes["BlackOperation"]:
|
||||
return actionObj.count;
|
||||
if (this.blackops[name] != null) {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
case ActionTypes["Training"]:
|
||||
case ActionTypes["Field Analysis"]:
|
||||
case ActionTypes["FieldAnalysis"]:
|
||||
|
158
src/CodingContractGenerator.js
Normal file
158
src/CodingContractGenerator.js
Normal file
@ -0,0 +1,158 @@
|
||||
import {CodingContract,
|
||||
CodingContractRewardType,
|
||||
CodingContractTypes} from "./CodingContracts";
|
||||
import {Factions} from "./Faction";
|
||||
import {Player} from "./Player";
|
||||
import {GetServerByHostname,
|
||||
AllServers} from "./Server";
|
||||
|
||||
import {getRandomInt} from "../utils/helpers/getRandomInt";
|
||||
|
||||
export function generateRandomContract() {
|
||||
// First select a random problem type
|
||||
const problemTypes = Object.keys(CodingContractTypes);
|
||||
let randIndex = getRandomInt(0, problemTypes.length - 1);
|
||||
let problemType = problemTypes[randIndex];
|
||||
|
||||
// Then select a random reward type. 'Money' will always be the last reward type
|
||||
const reward = getRandomReward();
|
||||
|
||||
// Choose random server
|
||||
const randServer = getRandomServer();
|
||||
|
||||
let contractFn = getRandomFilename(randServer, reward);
|
||||
let contract = new CodingContract(contractFn, problemType, reward);
|
||||
|
||||
randServer.addContract(contract);
|
||||
}
|
||||
|
||||
export function generateContract(params) {
|
||||
// Problem Type
|
||||
let problemType;
|
||||
const problemTypes = Object.keys(CodingContractTypes);
|
||||
if (params.problemType != null && problemTypes.includes(params.problemType)) {
|
||||
problemType = params.problemType;
|
||||
} else {
|
||||
let randIndex = getRandomInt(0, problemTypes.length - 1);
|
||||
problemType = problemTypes[randIndex];
|
||||
}
|
||||
|
||||
// Reward Type - This is always random for now
|
||||
const reward = getRandomReward();
|
||||
|
||||
// Server
|
||||
let server;
|
||||
if (params.server != null) {
|
||||
server = GetServerByHostname(params.server);
|
||||
if (server == null) {
|
||||
server = AllServers[param.server];
|
||||
}
|
||||
if (server == null) {
|
||||
server = getRandomServer();
|
||||
}
|
||||
} else {
|
||||
server = getRandomServer();
|
||||
}
|
||||
|
||||
// Filename
|
||||
let fn;
|
||||
if (params.fn != null) {
|
||||
fn = params.fn;
|
||||
} else {
|
||||
fn = getRandomFilename(server, reward);
|
||||
}
|
||||
|
||||
let contract = new CodingContract(fn, problemType, reward);
|
||||
server.addContract(contract);
|
||||
}
|
||||
|
||||
// Ensures that a contract's reward type is valid
|
||||
function sanitizeRewardType(rewardType) {
|
||||
let type = rewardType; // Create copy
|
||||
|
||||
const factionsThatAllowHacking = Player.factions.filter((fac) => {
|
||||
try {
|
||||
return Factions[fac].getInfo().offerHackingWork;
|
||||
} catch (e) {
|
||||
console.error(`Error when trying to filter Hacking Factions for Coding Contract Generation: ${e}`);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
if (type === CodingContractRewardType.FactionReputation && factionsThatAllowHacking.length === 0) {
|
||||
type = CodingContractRewardType.CompanyReputation;
|
||||
}
|
||||
if (type === CodingContractRewardType.FactionReputationAll && factionsThatAllowHacking.length === 0) {
|
||||
type = CodingContractRewardType.CompanyReputation;
|
||||
}
|
||||
if (type === CodingContractRewardType.CompanyReputation && Player.companyName === "") {
|
||||
type = CodingContractRewardType.Money;
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
function getRandomReward() {
|
||||
let reward = {};
|
||||
reward.type = getRandomInt(0, CodingContractRewardType.Money);
|
||||
reward.type = sanitizeRewardType(reward.type);
|
||||
|
||||
// Add additional information based on the reward type
|
||||
const factionsThatAllowHacking = Player.factions.filter((fac) => {
|
||||
try {
|
||||
return Factions[fac].getInfo().offerHackingWork;
|
||||
} catch (e) {
|
||||
console.error(`Error when trying to filter Hacking Factions for Coding Contract Generation: ${e}`);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
switch (reward.type) {
|
||||
case CodingContractRewardType.FactionReputation:
|
||||
// Get a random faction that player is a part of. That
|
||||
// faction must allow hacking contracts
|
||||
var numFactions = factionsThatAllowHacking.length;
|
||||
var randFaction = factionsThatAllowHacking[getRandomInt(0, numFactions - 1)];
|
||||
reward.name = randFaction;
|
||||
break;
|
||||
case CodingContractRewardType.CompanyReputation:
|
||||
if (Player.companyName !== "") {
|
||||
reward.name = Player.companyName;
|
||||
} else {
|
||||
reward.type = CodingContractRewardType.Money;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return reward;
|
||||
}
|
||||
|
||||
function getRandomServer() {
|
||||
const servers = Object.keys(AllServers);
|
||||
let randIndex = getRandomInt(0, servers.length - 1);
|
||||
let randServer = AllServers[servers[randIndex]];
|
||||
|
||||
// An infinite loop shouldn't ever happen, but to be safe we'll use
|
||||
// a for loop with a limited number of tries
|
||||
for (let i = 0; i < 200; ++i) {
|
||||
if (randServer.purchasedByPlayer === false) { break; }
|
||||
randIndex = getRandomInt(0, servers.length - 1);
|
||||
randServer = AllServers[servers[randIndex]];
|
||||
}
|
||||
|
||||
return randServer;
|
||||
}
|
||||
|
||||
function getRandomFilename(server, reward) {
|
||||
let contractFn = `contract-${getRandomInt(0, 1e6)}`;
|
||||
|
||||
for (let i = 0; i < 1000; ++i) {
|
||||
if (server.contracts.filter((c) => {return c.fn === contractFn}).length <= 0) { break; }
|
||||
contractFn = `contract-${getRandomInt(0, 1e6)}`;
|
||||
}
|
||||
|
||||
if (reward.name) { contractFn += `-${reward.name.replace(/\s/g, "")}`; }
|
||||
|
||||
return contractFn;
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
let CONSTANTS = {
|
||||
Version: "0.40.5",
|
||||
Version: "0.41.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
|
||||
@ -48,7 +48,7 @@ let CONSTANTS = {
|
||||
/* Netscript Constants */
|
||||
//RAM Costs for different commands
|
||||
ScriptBaseRamCost: 1.6,
|
||||
ScriptDomRamCost: 100,
|
||||
ScriptDomRamCost: 25,
|
||||
ScriptWhileRamCost: 0,
|
||||
ScriptForRamCost: 0,
|
||||
ScriptIfRamCost: 0,
|
||||
@ -91,6 +91,10 @@ let CONSTANTS = {
|
||||
ScriptSingularityFn2RamCost: 2,
|
||||
ScriptSingularityFn3RamCost: 3,
|
||||
|
||||
ScriptSingularityFnRamMult: 2, // Multiplier for RAM cost outside of BN-4
|
||||
|
||||
ScriptGangApiBaseRamCost: 4,
|
||||
|
||||
ScriptBladeburnerApiBaseRamCost: 4,
|
||||
|
||||
NumNetscriptPorts: 20,
|
||||
@ -191,13 +195,6 @@ let CONSTANTS = {
|
||||
"-Miscellaneous Nodes slowly raise their defense over time<br><br>" +
|
||||
"-Nodes slowly regenerate health over time.",
|
||||
|
||||
|
||||
/* Gang constant */
|
||||
GangRespectToReputationRatio: 2, //Respect is divided by this to get rep gain
|
||||
MaximumGangMembers: 20,
|
||||
GangRecruitCostMultiplier: 2,
|
||||
GangTerritoryUpdateTimer: 150,
|
||||
|
||||
/* Time Constants */
|
||||
MillisecondsPer20Hours: 72000000,
|
||||
GameCyclesPer20Hours: 72000000 / 200,
|
||||
@ -256,7 +253,6 @@ let CONSTANTS = {
|
||||
ClassLeadershipBaseCost: 320,
|
||||
ClassGymBaseCost: 120,
|
||||
|
||||
CrimeSingFnDivider: 2, //Factor by which exp/profit is reduced when commiting crime through Sing Fn
|
||||
CrimeShoplift: "shoplift",
|
||||
CrimeRobStore: "rob a store",
|
||||
CrimeMug: "mug someone",
|
||||
@ -507,11 +503,37 @@ let CONSTANTS = {
|
||||
LatestUpdate:
|
||||
`
|
||||
v0.41.0
|
||||
* WARNING: In NetscriptJS, defining a function called print() is no longer possible
|
||||
* Gang Mechanic Changes (BitNode-2):
|
||||
*** Added a Gang Netscript API
|
||||
*** Added new 'ascension' mechanic for Gang Members
|
||||
*** The first three gang members are now 'free' (can be recruited instantly)
|
||||
*** Maximum number of increased Gang Members increased from 20 to 30
|
||||
*** Changed the formula for calculating respect needed to recruit the next gang member
|
||||
*** Added a new category of upgrades for Gang Members: Augmentations
|
||||
*** Non-Augmentation Gang member upgrades are now significantly weaker
|
||||
*** Reputation for your Gang faction can no longer be gained through Infiltration
|
||||
*** Re-worked the territory 'warfare' mechanic so that player can choose when to engage in it
|
||||
*** Gang Members can now be killed during territory 'warfare'
|
||||
*** Changed BitNode-2 Multipliers to make hacking slightly less profitable
|
||||
*** Gang Member Equipment + Upgrades now get cheaper as your gang grows in power and respect
|
||||
*** The effects of Source-File 2 are now slightly more powerful
|
||||
* RAM Cost of accessing the global document object lowered from 100 GB to 25 GB
|
||||
* RAM Cost to use Singularity Functions outside of BitNode-4 lowered by 75%. They now only cost twice as much as they do in BitNode-4
|
||||
* b1t_flum3.exe now takes significantly less time to create
|
||||
* Crimes commited through Singularity function no longer give half money/exp
|
||||
* Improved number formatting for Player 'work' actions (including crimes, etc.). These numbers should also adhere to locale settings now (by Kline-)
|
||||
* The order that Augmentations are listed in (when purchasing from Faction and viewing your Augmentations) is now saved and persists when choosing different orders
|
||||
* getCharacterInformation() Singularity function now returns multiplier information (from Augmentations/Source Files)
|
||||
* Bug Fix: Calling print() in NetscriptJS no longer brings up the print dialog
|
||||
* Bug Fix: Fixed a bug that sometimes caused a blank black screen when destroying/resetting/switching BitNodes
|
||||
* Bug Fix: Netscript calls that throw errors will now no longer cause the 'concurrent calls' error if they are caught in the script. i.e. try/catch should now work properly in scripts
|
||||
* Bug Fix: Fixed a bug where sometimes the NeuroFlux Governor Augmentation level would be incorrectly calculated when the game was loaded
|
||||
* Bug Fix: Fixed a bug where calling the scp() Netscript function with invalid hostname/ips would throw an unclear error message
|
||||
* Bug Fix: Bladeburner API function getActionCountRemaining() should now work properly for BlackOps
|
||||
* Bug Fix: Black Ops can no longer be attempted out-of-order or without the required rank via Bladeburner API
|
||||
* Bug Fix: Dynamic RAM Calculation now properly accounts for number of threads
|
||||
* RAM cost for basic Netscript functions added to documentation (by CBJamo)
|
||||
`
|
||||
|
||||
}
|
||||
|
446
src/DevMenu.js
Normal file
446
src/DevMenu.js
Normal file
@ -0,0 +1,446 @@
|
||||
import {AugmentationNames} from "./Augmentations";
|
||||
import {generateRandomContract} from "./CodingContractGenerator";
|
||||
import {Programs} from "./CreateProgram";
|
||||
import {Factions} from "./Faction";
|
||||
import {Player} from "./Player";
|
||||
import {AllServers} from "./Server";
|
||||
import {hackWorldDaemon} from "./RedPill";
|
||||
import {Terminal} from "./Terminal";
|
||||
import {exceptionAlert} from "../utils/helpers/exceptionAlert";
|
||||
import {createElement} from "../utils/uiHelpers/createElement";
|
||||
import {removeElementById} from "../utils/uiHelpers/removeElementById";
|
||||
|
||||
const devMenuContainerId = "dev-menu-container";
|
||||
|
||||
export function createDevMenu() {
|
||||
if (process.env.NODE_ENV !== "development") {
|
||||
throw new Error("Cannot create Dev Menu because you are not in a dev build");
|
||||
}
|
||||
|
||||
const devMenuText = createElement("h1", {
|
||||
display: "block",
|
||||
innerText: "Development Menu - Only meant to be used for testing/debugging",
|
||||
});
|
||||
|
||||
// Generic
|
||||
const genericHeader = createElement("h2", {
|
||||
display: "block",
|
||||
innerText: "Generic"
|
||||
});
|
||||
|
||||
const addMoney = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
Player.gainMoney(1e15);
|
||||
},
|
||||
display: "block",
|
||||
innerText: "Add $1000t",
|
||||
});
|
||||
|
||||
const addRam = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
Player.getHomeComputer().maxRam *= 2;
|
||||
},
|
||||
display: "block",
|
||||
innerText: "Double Home Computer RAM",
|
||||
});
|
||||
|
||||
const triggerBitflume = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
hackWorldDaemon(Player.bitNodeN, true);
|
||||
},
|
||||
innerText: "Trigger BitFlume",
|
||||
});
|
||||
|
||||
const destroyCurrentBitnode = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
hackWorldDaemon(Player.bitNodeN);
|
||||
},
|
||||
innerText: "Destroy Current BitNode",
|
||||
tooltip: "Will grant Source-File for the BitNode",
|
||||
});
|
||||
|
||||
// Experience / stats
|
||||
const statsHeader = createElement("h2", {
|
||||
display: "block",
|
||||
innerText: "Experience/Stats"
|
||||
});
|
||||
|
||||
const statsHackingExpInput = createElement("input", {
|
||||
class: "text-input",
|
||||
margin: "5px",
|
||||
placeholder: "+/- hacking exp",
|
||||
type: "number",
|
||||
});
|
||||
const statsHackingExpButton = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
const exp = parseInt(statsHackingExpInput.value);
|
||||
Player.gainHackingExp(exp);
|
||||
Player.updateSkillLevels();
|
||||
},
|
||||
innerText: "Add Hacking Exp",
|
||||
});
|
||||
|
||||
const statsStrengthExpInput = createElement("input", {
|
||||
class: "text-input",
|
||||
margin: "5px",
|
||||
placeholder: "+/- strength exp",
|
||||
type: "number",
|
||||
});
|
||||
const statsStrengthExpButton = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
const exp = parseInt(statsStrengthExpInput.value);
|
||||
Player.gainStrengthExp(exp);
|
||||
Player.updateSkillLevels();
|
||||
},
|
||||
innerText: "Add Strength Exp",
|
||||
});
|
||||
|
||||
const statsDefenseExpInput = createElement("input", {
|
||||
class: "text-input",
|
||||
margin: "5px",
|
||||
placeholder: "+/- defense exp",
|
||||
type: "number",
|
||||
});
|
||||
const statsDefenseExpButton = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
const exp = parseInt(statsDefenseExpInput.value);
|
||||
Player.gainDefenseExp(exp);
|
||||
Player.updateSkillLevels();
|
||||
},
|
||||
innerText: "Add Defense Exp",
|
||||
});
|
||||
|
||||
const statsDexterityExpInput = createElement("input", {
|
||||
class: "text-input",
|
||||
margin: "5px",
|
||||
placeholder: "+/- dexterity exp",
|
||||
type: "number",
|
||||
});
|
||||
const statsDexterityExpButton = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
const exp = parseInt(statsDexterityExpInput.value);
|
||||
Player.gainDexterityExp(exp);
|
||||
Player.updateSkillLevels();
|
||||
},
|
||||
innerText: "Add Dexterity Exp",
|
||||
});
|
||||
|
||||
const statsAgilityExpInput = createElement("input", {
|
||||
class: "text-input",
|
||||
margin: "5px",
|
||||
placeholder: "+/- agility exp",
|
||||
type: "number",
|
||||
});
|
||||
const statsAgilityExpButton = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
const exp = parseInt(statsAgilityExpInput.value);
|
||||
Player.gainAgilityExp(exp);
|
||||
Player.updateSkillLevels();
|
||||
},
|
||||
innerText: "Add Agility Exp",
|
||||
});
|
||||
|
||||
const statsCharismaExpInput = createElement("input", {
|
||||
class: "text-input",
|
||||
margin: "5px",
|
||||
placeholder: "+/- charisma exp",
|
||||
type: "number",
|
||||
});
|
||||
const statsCharismaExpButton = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
const exp = parseInt(statsCharismaExpInput.value);
|
||||
Player.gainCharismaExp(exp);
|
||||
Player.updateSkillLevels();
|
||||
},
|
||||
innerText: "Add Charisma Exp",
|
||||
});
|
||||
|
||||
const statsIntelligenceExpInput = createElement("input", {
|
||||
class: "text-input",
|
||||
margin: "5px",
|
||||
placeholder: "+/- intelligence exp",
|
||||
type: "number",
|
||||
});
|
||||
const statsIntelligenceExpButton = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
const exp = parseInt(statsIntelligenceExpInput.value);
|
||||
Player.gainIntelligenceExp(exp);
|
||||
Player.updateSkillLevels();
|
||||
},
|
||||
innerText: "Add Intelligence Exp",
|
||||
});
|
||||
|
||||
const statsEnableIntelligenceButton = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
Player.intelligence = 1;
|
||||
},
|
||||
innerText: "Enable Intelligence"
|
||||
});
|
||||
|
||||
const statsDisableIntelligenceButton = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
Player.intelligence = 0;
|
||||
},
|
||||
innerText: "Disable Intelligence"
|
||||
});
|
||||
|
||||
// Factions
|
||||
const factionsHeader = createElement("h2", {innerText: "Factions"});
|
||||
|
||||
const factionsDropdown = createElement("select", {
|
||||
class: "dropdown",
|
||||
margin: "5px",
|
||||
});
|
||||
for (const i in Factions) {
|
||||
factionsDropdown.options[factionsDropdown.options.length] = new Option(Factions[i].name, Factions[i].name);
|
||||
}
|
||||
|
||||
const factionsAddButton = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
const facName = factionsDropdown.options[factionsDropdown.selectedIndex].value;
|
||||
Player.receiveInvite(facName);
|
||||
},
|
||||
innerText: "Receive Invite to Faction",
|
||||
});
|
||||
|
||||
// Augmentations / Source Files
|
||||
const augmentationsHeader = createElement("h2", {innerText: "Augmentations"});
|
||||
|
||||
const augmentationsDropdown = createElement("select", {
|
||||
class: "dropdown",
|
||||
margin: "5px",
|
||||
});
|
||||
for (const i in AugmentationNames) {
|
||||
const augName = AugmentationNames[i];
|
||||
augmentationsDropdown.options[augmentationsDropdown.options.length] = new Option(augName, augName);
|
||||
}
|
||||
|
||||
const augmentationsQueueButton = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
Player.queueAugmentation(augmentationsDropdown.options[augmentationsDropdown.selectedIndex].value);
|
||||
},
|
||||
innerText: "Queue Augmentation",
|
||||
})
|
||||
|
||||
// Programs
|
||||
const programsHeader = createElement("h2", {innerText: "Programs"});
|
||||
|
||||
const programsAddDropdown = createElement("select", {
|
||||
class: "dropdown",
|
||||
margin: "5px",
|
||||
});
|
||||
for (const i in Programs) {
|
||||
const progName = Programs[i].name;
|
||||
programsAddDropdown.options[programsAddDropdown.options.length] = new Option(progName, progName);
|
||||
}
|
||||
|
||||
const programsAddButton = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
const program = programsAddDropdown.options[programsAddDropdown.selectedIndex].value;
|
||||
if(!Player.hasProgram(program)) {
|
||||
Player.getHomeComputer().programs.push(program);
|
||||
}
|
||||
},
|
||||
innerText: "Add Program",
|
||||
})
|
||||
|
||||
// Servers
|
||||
const serversHeader = createElement("h2", {innerText: "Servers"});
|
||||
|
||||
const serversOpenAll = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
for (const i in AllServers) {
|
||||
AllServers[i].hasAdminRights = true;
|
||||
AllServers[i].sshPortOpen = true;
|
||||
AllServers[i].ftpPortOpen = true;
|
||||
AllServers[i].smtpPortOpen = true;
|
||||
AllServers[i].httpPortOpen = true;
|
||||
AllServers[i].sqlPortOpen = true;
|
||||
AllServers[i].openPortCount = 5;
|
||||
}
|
||||
},
|
||||
display: "block",
|
||||
innerText: "Get Admin Rights to all servers",
|
||||
});
|
||||
|
||||
const serversMinSecurityAll = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
for (const i in AllServers) {
|
||||
AllServers[i].hackDifficulty = AllServers[i].minDifficulty;
|
||||
}
|
||||
},
|
||||
display: "block",
|
||||
innerText: "Set all servers to min security",
|
||||
});
|
||||
|
||||
const serversMaxMoneyAll = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
for (const i in AllServers) {
|
||||
AllServers[i].moneyAvailable = AllServers[i].moneyMax;
|
||||
}
|
||||
},
|
||||
display: "block",
|
||||
innerText: "Set all servers to max money",
|
||||
});
|
||||
|
||||
const serversConnectToDropdown = createElement("select", {class: "dropdown"});
|
||||
for (const i in AllServers) {
|
||||
const hn = AllServers[i].hostname;
|
||||
serversConnectToDropdown.options[serversConnectToDropdown.options.length] = new Option(hn, hn);
|
||||
}
|
||||
|
||||
const serversConnectToButton = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
const host = serversConnectToDropdown.options[serversConnectToDropdown.selectedIndex].value;
|
||||
Terminal.connectToServer(host);
|
||||
},
|
||||
innerText: "Connect to server",
|
||||
});
|
||||
|
||||
// Bladeburner
|
||||
const bladeburnerHeader = createElement("h2", {innerText: "Bladeburner"});
|
||||
|
||||
const bladeburnerGainRankInput = createElement("input", {
|
||||
class: "text-input",
|
||||
placeholder: "Rank to gain (or negative to lose rank)",
|
||||
type: "number",
|
||||
});
|
||||
|
||||
const bladeburnerGainRankButton = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
try {
|
||||
const rank = parseInt(bladeburnerGainRankInput.value);
|
||||
Player.bladeburner.changeRank(rank);
|
||||
} catch(e) {
|
||||
exceptionAlert(`Failed to change Bladeburner Rank in dev menu: ${e}`);
|
||||
}
|
||||
},
|
||||
innerText: "Gain Bladeburner Rank",
|
||||
});
|
||||
|
||||
// Gang
|
||||
const gangHeader = createElement("h2", {innerText: "Gang"});
|
||||
|
||||
const gangStoredCyclesInput = createElement("input", {
|
||||
class: "text-input",
|
||||
placeholder: "# Cycles to add",
|
||||
type: "number",
|
||||
});
|
||||
|
||||
const gangAddStoredCycles = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
try {
|
||||
const cycles = parseInt(gangStoredCyclesInput.value);
|
||||
Player.gang.storedCycles += cycles;
|
||||
} catch(e) {
|
||||
exceptionAlert(`Failed to add stored cycles to gang mechanic: ${e}`);
|
||||
}
|
||||
},
|
||||
innerText: "Add cycles to Gang mechanic",
|
||||
});
|
||||
|
||||
// Coding Contracts
|
||||
const contractsHeader = createElement("h2", {innerText: "Coding Contracts"});
|
||||
|
||||
const generateRandomContractBtn = createElement("button", {
|
||||
class: "std-button",
|
||||
clickListener: () => {
|
||||
generateRandomContract();
|
||||
},
|
||||
innerText: "Generate Random Contract",
|
||||
});
|
||||
|
||||
// Add everything to container, then append to main menu
|
||||
const devMenuContainer = createElement("div", {
|
||||
class: "generic-menupage-container",
|
||||
id: devMenuContainerId,
|
||||
});
|
||||
|
||||
devMenuContainer.appendChild(devMenuText);
|
||||
devMenuContainer.appendChild(genericHeader);
|
||||
devMenuContainer.appendChild(addMoney);
|
||||
devMenuContainer.appendChild(addRam);
|
||||
devMenuContainer.appendChild(triggerBitflume);
|
||||
devMenuContainer.appendChild(destroyCurrentBitnode);
|
||||
devMenuContainer.appendChild(statsHeader);
|
||||
devMenuContainer.appendChild(statsHackingExpInput);
|
||||
devMenuContainer.appendChild(statsHackingExpButton);
|
||||
devMenuContainer.appendChild(createElement("br"));
|
||||
devMenuContainer.appendChild(statsStrengthExpInput);
|
||||
devMenuContainer.appendChild(statsStrengthExpButton);
|
||||
devMenuContainer.appendChild(createElement("br"));
|
||||
devMenuContainer.appendChild(statsDefenseExpInput);
|
||||
devMenuContainer.appendChild(statsDefenseExpButton);
|
||||
devMenuContainer.appendChild(createElement("br"));
|
||||
devMenuContainer.appendChild(statsDexterityExpInput);
|
||||
devMenuContainer.appendChild(statsDexterityExpButton);
|
||||
devMenuContainer.appendChild(createElement("br"));
|
||||
devMenuContainer.appendChild(statsAgilityExpInput);
|
||||
devMenuContainer.appendChild(statsAgilityExpButton);
|
||||
devMenuContainer.appendChild(createElement("br"));
|
||||
devMenuContainer.appendChild(statsCharismaExpInput);
|
||||
devMenuContainer.appendChild(statsCharismaExpButton);
|
||||
devMenuContainer.appendChild(createElement("br"));
|
||||
devMenuContainer.appendChild(statsIntelligenceExpInput);
|
||||
devMenuContainer.appendChild(statsIntelligenceExpButton);
|
||||
devMenuContainer.appendChild(createElement("br"));
|
||||
devMenuContainer.appendChild(statsEnableIntelligenceButton);
|
||||
devMenuContainer.appendChild(statsDisableIntelligenceButton);
|
||||
devMenuContainer.appendChild(factionsHeader);
|
||||
devMenuContainer.appendChild(factionsDropdown);
|
||||
devMenuContainer.appendChild(factionsAddButton);
|
||||
devMenuContainer.appendChild(augmentationsHeader);
|
||||
devMenuContainer.appendChild(augmentationsDropdown);
|
||||
devMenuContainer.appendChild(augmentationsQueueButton);
|
||||
devMenuContainer.appendChild(programsHeader);
|
||||
devMenuContainer.appendChild(programsAddDropdown);
|
||||
devMenuContainer.appendChild(programsAddButton);
|
||||
devMenuContainer.appendChild(serversHeader);
|
||||
devMenuContainer.appendChild(serversOpenAll);
|
||||
devMenuContainer.appendChild(serversMinSecurityAll);
|
||||
devMenuContainer.appendChild(serversMaxMoneyAll);
|
||||
devMenuContainer.appendChild(serversConnectToDropdown);
|
||||
devMenuContainer.appendChild(serversConnectToButton);
|
||||
devMenuContainer.appendChild(bladeburnerHeader);
|
||||
devMenuContainer.appendChild(bladeburnerGainRankInput);
|
||||
devMenuContainer.appendChild(bladeburnerGainRankButton);
|
||||
devMenuContainer.appendChild(createElement("br"));
|
||||
devMenuContainer.appendChild(gangHeader);
|
||||
devMenuContainer.appendChild(gangStoredCyclesInput);
|
||||
devMenuContainer.appendChild(gangAddStoredCycles);
|
||||
devMenuContainer.appendChild(createElement("br"));
|
||||
devMenuContainer.appendChild(contractsHeader);
|
||||
devMenuContainer.appendChild(generateRandomContractBtn);
|
||||
|
||||
const entireGameContainer = document.getElementById("entire-game-container");
|
||||
if (entireGameContainer == null) {
|
||||
throw new Error("Could not find entire-game-container DOM element");
|
||||
}
|
||||
entireGameContainer.appendChild(devMenuContainer);
|
||||
}
|
||||
|
||||
export function closeDevMenu() {
|
||||
removeElementById(devMenuContainerId);
|
||||
}
|
@ -7,6 +7,7 @@ import {FactionInfos} from "./FactionInfo";
|
||||
import {Locations} from "./Location";
|
||||
import {HackingMission, setInMission} from "./Missions";
|
||||
import {Player} from "./Player";
|
||||
import {PurchaseAugmentationsOrderSetting} from "./SettingEnums";
|
||||
import {Settings} from "./Settings";
|
||||
|
||||
import {Page, routing} from "./ui/navigationTracking";
|
||||
@ -446,7 +447,6 @@ function displayFactionContent(factionName) {
|
||||
}
|
||||
}
|
||||
|
||||
var sortOption = null;
|
||||
function displayFactionAugmentations(factionName) {
|
||||
var faction = Factions[factionName];
|
||||
if (faction == null) {
|
||||
@ -481,10 +481,10 @@ function displayFactionAugmentations(factionName) {
|
||||
var augmentationsList = createElement("ul");
|
||||
|
||||
//Sort buttons
|
||||
var sortByCostBtn = createElement("a", {
|
||||
const sortByCostBtn = createElement("a", {
|
||||
innerText:"Sort by Cost", class:"a-link-button",
|
||||
clickListener:()=>{
|
||||
sortOption = "cost";
|
||||
Settings.PurchaseAugmentationsOrder = PurchaseAugmentationsOrderSetting.Cost;
|
||||
var augs = faction.augmentations.slice();
|
||||
augs.sort((augName1, augName2)=>{
|
||||
var aug1 = Augmentations[augName1], aug2 = Augmentations[augName2];
|
||||
@ -497,10 +497,10 @@ function displayFactionAugmentations(factionName) {
|
||||
createFactionAugmentationDisplayElements(augmentationsList, augs, faction);
|
||||
}
|
||||
});
|
||||
var sortByRepBtn = createElement("a", {
|
||||
const sortByRepBtn = createElement("a", {
|
||||
innerText:"Sort by Reputation", class:"a-link-button",
|
||||
clickListener:()=>{
|
||||
sortOption = "reputation";
|
||||
Settings.PurchaseAugmentationsOrder = PurchaseAugmentationsOrderSetting.Reputation;
|
||||
var augs = faction.augmentations.slice();
|
||||
augs.sort((augName1, augName2)=>{
|
||||
var aug1 = Augmentations[augName1], aug2 = Augmentations[augName2];
|
||||
@ -513,10 +513,10 @@ function displayFactionAugmentations(factionName) {
|
||||
createFactionAugmentationDisplayElements(augmentationsList, augs, faction);
|
||||
}
|
||||
});
|
||||
var defaultSortBtn = createElement("a", {
|
||||
const defaultSortBtn = createElement("a", {
|
||||
innerText:"Sort by Default Order", class:"a-link-button",
|
||||
clickListener:()=>{
|
||||
sortOption = "default";
|
||||
Settings.PurchaseAugmentationsOrder = PurchaseAugmentationsOrderSetting.Default;
|
||||
removeChildrenFromElement(augmentationsList);
|
||||
createFactionAugmentationDisplayElements(augmentationsList, faction.augmentations, faction);
|
||||
}
|
||||
@ -524,11 +524,11 @@ function displayFactionAugmentations(factionName) {
|
||||
elements.push(sortByCostBtn);
|
||||
elements.push(sortByRepBtn);
|
||||
elements.push(defaultSortBtn);
|
||||
switch(sortOption) {
|
||||
case "cost":
|
||||
switch(Settings.PurchaseAugmentationsOrder) {
|
||||
case PurchaseAugmentationsOrderSetting.Cost:
|
||||
sortByCostBtn.click();
|
||||
break;
|
||||
case "reputation":
|
||||
case PurchaseAugmentationsOrderSetting.Reputation:
|
||||
sortByRepBtn.click();
|
||||
break;
|
||||
default:
|
||||
|
2000
src/Gang.js
2000
src/Gang.js
File diff suppressed because it is too large
Load Diff
@ -28,10 +28,6 @@ import {yesNoBoxCreate, yesNoTxtInpBoxCreate,
|
||||
yesNoTxtInpBoxClose} from "../utils/YesNoBox";
|
||||
|
||||
function displayLocationContent() {
|
||||
if (Engine.Debug) {
|
||||
console.log("displayLocationContent() called with location " + Player.location)
|
||||
}
|
||||
|
||||
var returnToWorld = document.getElementById("location-return-to-world-button");
|
||||
|
||||
var locationName = document.getElementById("location-name");
|
||||
|
@ -9,7 +9,7 @@ function unknownBladeburnerActionErrorMessage(functionName, actionType, actionNa
|
||||
}
|
||||
|
||||
function unknownBladeburnerExceptionMessage(functionName, err) {
|
||||
return `Bladeburner.${functionName}() failed with exception: ` + err;
|
||||
return `bladeburner.${functionName}() failed with exception: ` + err;
|
||||
}
|
||||
|
||||
function checkBladeburnerAccess(workerScript, functionName) {
|
||||
|
@ -46,7 +46,8 @@ import {TextFile, getTextFile, createTextFile} from "./TextFile";
|
||||
|
||||
import {unknownBladeburnerActionErrorMessage,
|
||||
unknownBladeburnerExceptionMessage,
|
||||
checkBladeburnerAccess} from "./NetscriptBladeburner.js";
|
||||
checkBladeburnerAccess} from "./NetscriptBladeburner";
|
||||
import * as nsGang from "./NetscriptGang";
|
||||
import {WorkerScript, workerScripts,
|
||||
killWorkerScript, NetscriptPorts} from "./NetscriptWorker";
|
||||
import {makeRuntimeRejectMsg, netscriptDelay,
|
||||
@ -106,8 +107,13 @@ var possibleLogs = {
|
||||
getServerGrowth: true,
|
||||
getServerNumPortsRequired: true,
|
||||
getServerRam: true,
|
||||
// TIX API
|
||||
buyStock: true,
|
||||
sellStock: true,
|
||||
shortStock: true,
|
||||
sellShort: true,
|
||||
|
||||
// Singularity Functions
|
||||
purchaseServer: true,
|
||||
deleteServer: true,
|
||||
universityCourse: true,
|
||||
@ -124,12 +130,18 @@ var possibleLogs = {
|
||||
donateToFaction: true,
|
||||
createProgram: true,
|
||||
commitCrime: true,
|
||||
shortStock: true,
|
||||
sellShort: true,
|
||||
|
||||
// Bladeburner API
|
||||
startAction: true,
|
||||
upgradeSkill: true,
|
||||
setTeamSize: true,
|
||||
joinBladeburnerFaction: true,
|
||||
|
||||
// Gang API
|
||||
recruitMember: true,
|
||||
setMemberTask: true,
|
||||
purchaseEquipment: true,
|
||||
setTerritoryWarfare: true,
|
||||
}
|
||||
|
||||
//Used to check and set flags for every Source File, despite the name of the function
|
||||
@ -155,7 +167,14 @@ function NetscriptFunctions(workerScript) {
|
||||
var updateDynamicRam = function(fnName, ramCost) {
|
||||
if (workerScript.dynamicLoadedFns[fnName]) {return;}
|
||||
workerScript.dynamicLoadedFns[fnName] = true;
|
||||
workerScript.dynamicRamUsage += ramCost;
|
||||
|
||||
const threads = workerScript.scriptRef.threads;
|
||||
if (typeof threads !== 'number') {
|
||||
console.warn(`WorkerScript detected NaN for threadcount for ${workerScript.name} on ${workerScript.serverIp}`);
|
||||
threads = 1;
|
||||
}
|
||||
|
||||
workerScript.dynamicRamUsage += (ramCost * threads);
|
||||
if (workerScript.dynamicRamUsage > 1.01 * workerScript.ramUsage) {
|
||||
throw makeRuntimeRejectMsg(workerScript,
|
||||
"Dynamic RAM usage calculated to be greater than initial RAM usage on fn: " + fnName +
|
||||
@ -1101,7 +1120,7 @@ function NetscriptFunctions(workerScript) {
|
||||
throw makeRuntimeRejectMsg(workerScript, "ps() failed. Invalid IP or hostname passed in: " + ip);
|
||||
}
|
||||
const processes = [];
|
||||
for(const i in server.runningScripts) {
|
||||
for (const i in server.runningScripts) {
|
||||
const script = server.runningScripts[i];
|
||||
processes.push({filename:script.filename, threads: script.threads, args: script.args.slice()})
|
||||
}
|
||||
@ -2313,7 +2332,7 @@ function NetscriptFunctions(workerScript) {
|
||||
/* Singularity Functions */
|
||||
universityCourse : function(universityName, className) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn1RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("universityCourse", ramCost);
|
||||
}
|
||||
@ -2402,7 +2421,7 @@ function NetscriptFunctions(workerScript) {
|
||||
|
||||
gymWorkout : function(gymName, stat) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn1RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("gymWorkout", ramCost);
|
||||
}
|
||||
@ -2504,7 +2523,7 @@ function NetscriptFunctions(workerScript) {
|
||||
|
||||
travelToCity(cityname) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn1RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("travelToCity", ramCost);
|
||||
}
|
||||
@ -2541,7 +2560,7 @@ function NetscriptFunctions(workerScript) {
|
||||
|
||||
purchaseTor() {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn1RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("purchaseTor", ramCost);
|
||||
}
|
||||
@ -2585,7 +2604,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
purchaseProgram(programName) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn1RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("purchaseProgram", ramCost);
|
||||
}
|
||||
@ -2637,7 +2656,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
getStats : function() {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn1RamCost / 4;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getStats", ramCost);
|
||||
}
|
||||
@ -2661,7 +2680,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
getCharacterInformation : function() {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn1RamCost / 4;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getCharacterInformation", ramCost);
|
||||
}
|
||||
@ -2679,12 +2698,29 @@ function NetscriptFunctions(workerScript) {
|
||||
}
|
||||
return {
|
||||
bitnode: Player.bitNodeN,
|
||||
company: Player.companyName,
|
||||
jobTitle: companyPositionTitle,
|
||||
city: Player.city,
|
||||
company: Player.companyName,
|
||||
factions: Player.factions.slice(),
|
||||
tor: SpecialServerIps.hasOwnProperty("Darkweb Server"),
|
||||
jobTitle: companyPositionTitle,
|
||||
mult: {
|
||||
agility: Player.agility_mult,
|
||||
agilityExp: Player.agility_exp_mult,
|
||||
companyRep: Player.company_rep_mult,
|
||||
crimeMoney: Player.crime_money_mult,
|
||||
crimeSuccess: Player.crime_success_mult,
|
||||
defense: Player.defense_mult,
|
||||
defenseExp: Player.defense_exp_mult,
|
||||
dexterity: Player.dexterity_mult,
|
||||
dexterityExp: Player.dexterity_exp_mult,
|
||||
factionRep: Player.faction_rep_mult,
|
||||
hacking: Player.hacking_mult,
|
||||
hackingExp: Player.hacking_exp_mult,
|
||||
strength: Player.strength_mult,
|
||||
strengthExp: Player.strength_exp_mult,
|
||||
workMoney: Player.work_money_mult,
|
||||
},
|
||||
timeWorked: Player.timeWorked,
|
||||
tor: SpecialServerIps.hasOwnProperty("Darkweb Server"),
|
||||
workHackExpGain: Player.workHackExpGained,
|
||||
workStrExpGain: Player.workStrExpGained,
|
||||
workDefExpGain: Player.workDefExpGained,
|
||||
@ -2697,7 +2733,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
isBusy : function() {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn1RamCost / 4;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("isBusy", ramCost);
|
||||
}
|
||||
@ -2712,7 +2748,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
stopAction : function() {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn1RamCost / 2;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("stopAction", ramCost);
|
||||
}
|
||||
@ -2734,7 +2770,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
upgradeHomeRam : function() {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn2RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("upgradeHomeRam", ramCost);
|
||||
}
|
||||
@ -2766,7 +2802,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
getUpgradeHomeRamCost : function() {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn2RamCost / 2;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getUpgradeHomeRamCost", ramCost);
|
||||
}
|
||||
@ -2782,7 +2818,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
workForCompany : function() {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn2RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("workForCompany", ramCost);
|
||||
}
|
||||
@ -2823,7 +2859,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
applyToCompany : function(companyName, field) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn2RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("applyToCompany", ramCost);
|
||||
}
|
||||
@ -2904,7 +2940,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
getCompanyRep : function(companyName) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn2RamCost / 2;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getCompanyRep", ramCost);
|
||||
}
|
||||
@ -2925,7 +2961,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
getCompanyFavor : function(companyName) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn2RamCost / 4;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getCompanyFavor", ramCost);
|
||||
}
|
||||
@ -2946,7 +2982,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
getCompanyFavorGain : function(companyName) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn2RamCost / 4;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getCompanyFavorGain", ramCost);
|
||||
}
|
||||
@ -2967,7 +3003,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
checkFactionInvitations : function() {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn2RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("checkFactionInvitations", ramCost);
|
||||
}
|
||||
@ -2983,7 +3019,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
joinFaction : function(name) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn2RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("joinFaction", ramCost);
|
||||
}
|
||||
@ -3022,7 +3058,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
workForFaction : function(name, type) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn2RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("workForFaction", ramCost);
|
||||
}
|
||||
@ -3122,7 +3158,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
getFactionRep : function(name) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn2RamCost / 4;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getFactionRep", ramCost);
|
||||
}
|
||||
@ -3143,7 +3179,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
getFactionFavor : function(name) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn2RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getFactionFavor", ramCost);
|
||||
}
|
||||
@ -3164,7 +3200,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
getFactionFavorGain: function(name) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn2RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getFactionFavorGain", ramCost);
|
||||
}
|
||||
@ -3185,7 +3221,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
donateToFaction : function(name, amt) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn3RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("donateToFaction", ramCost);
|
||||
}
|
||||
@ -3224,7 +3260,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
createProgram : function(name) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn3RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("createProgram", ramCost);
|
||||
}
|
||||
@ -3278,7 +3314,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
commitCrime : function(crimeRoughName) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn3RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("commitCrime", ramCost);
|
||||
}
|
||||
@ -3331,11 +3367,11 @@ function NetscriptFunctions(workerScript) {
|
||||
if(workerScript.disableLogs.ALL == null && workerScript.disableLogs.commitCrime == null) {
|
||||
workerScript.scriptRef.log("Attempting to commit crime: "+crime.name+"...");
|
||||
}
|
||||
return crime.commit(CONSTANTS.CrimeSingFnDivider, {workerscript: workerScript});
|
||||
return crime.commit(1, {workerscript: workerScript});
|
||||
},
|
||||
getCrimeChance : function(crimeRoughName) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn3RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getCrimeChance", ramCost);
|
||||
}
|
||||
@ -3356,7 +3392,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
getOwnedAugmentations : function(purchased=false) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn3RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getOwnedAugmentations", ramCost);
|
||||
}
|
||||
@ -3380,7 +3416,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
getOwnedSourceFiles : function() {
|
||||
let ramCost = CONSTANTS.ScriptSingularityFn3RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getOwnedSourceFiles", ramCost);
|
||||
}
|
||||
@ -3399,7 +3435,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
getAugmentationsFromFaction : function(facname) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn3RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getAugmentationsFromFaction", ramCost);
|
||||
}
|
||||
@ -3425,7 +3461,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
getAugmentationCost : function(name) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn3RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getAugmentationCost", ramCost);
|
||||
}
|
||||
@ -3447,7 +3483,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
purchaseAugmentation : function(faction, name) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn3RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("purchaseAugmentation", ramCost);
|
||||
}
|
||||
@ -3512,7 +3548,7 @@ function NetscriptFunctions(workerScript) {
|
||||
},
|
||||
installAugmentations : function(cbScript) {
|
||||
var ramCost = CONSTANTS.ScriptSingularityFn3RamCost;
|
||||
if (Player.bitNodeN !== 4) {ramCost *= 8;}
|
||||
if (Player.bitNodeN !== 4) {ramCost *= CONSTANTS.ScriptSingularityFnRamMult;}
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("installAugmentations", ramCost);
|
||||
}
|
||||
@ -3534,7 +3570,295 @@ function NetscriptFunctions(workerScript) {
|
||||
return true;
|
||||
},
|
||||
|
||||
//Bladeburner API
|
||||
// Gang API
|
||||
gang : {
|
||||
getMemberNames : function() {
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getMemberNames", CONSTANTS.ScriptGangApiBaseRamCost / 4);
|
||||
}
|
||||
updateDynamicRam("getMemberNames", CONSTANTS.ScriptGangApiBaseRamCost / 4);
|
||||
nsGang.checkGangApiAccess(workerScript, "getMemberNames");
|
||||
|
||||
try {
|
||||
const names = [];
|
||||
for (const member of Player.gang.members) {
|
||||
names.push(member.name);
|
||||
}
|
||||
return names;
|
||||
} catch(e) {
|
||||
throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("getMemberNames", e));
|
||||
}
|
||||
},
|
||||
getGangInformation : function() {
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getGangInformation", CONSTANTS.ScriptGangApiBaseRamCost / 2);
|
||||
}
|
||||
updateDynamicRam("getGangInformation", CONSTANTS.ScriptGangApiBaseRamCost / 2);
|
||||
nsGang.checkGangApiAccess(workerScript, "getGangInformation");
|
||||
|
||||
try {
|
||||
return {
|
||||
faction: Player.gang.facName,
|
||||
isHacking: Player.gang.isHackingGang,
|
||||
moneyGainRate: Player.gang.moneyGainRate,
|
||||
power: Player.gang.getPower(),
|
||||
respect: Player.gang.respect,
|
||||
respectGainRate: Player.gang.respectGainRate,
|
||||
territory: Player.gang.getTerritory(),
|
||||
territoryClashChance: Player.gang.territoryClashChance,
|
||||
territoryWarfareEngaged: Player.gang.territoryWarfareEngaged,
|
||||
wantedLevel: Player.gang.wanted,
|
||||
wantedLevelGainRate: Player.gang.wantedGainRate,
|
||||
}
|
||||
} catch(e) {
|
||||
throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("getGangInformation", e));
|
||||
}
|
||||
},
|
||||
getOtherGangInformation : function() {
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getOtherGangInformation", CONSTANTS.ScriptGangApiBaseRamCost / 2);
|
||||
}
|
||||
updateDynamicRam("getOtherGangInformation", CONSTANTS.ScriptGangApiBaseRamCost / 2);
|
||||
nsGang.checkGangApiAccess(workerScript, "getOtherGangInformation");
|
||||
|
||||
try {
|
||||
return Object.assign(AllGangs);
|
||||
} catch(e) {
|
||||
throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("getOtherGangInformation", e));
|
||||
}
|
||||
},
|
||||
getMemberInformation : function(name) {
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getMemberInformation", CONSTANTS.ScriptGangApiBaseRamCost / 2);
|
||||
}
|
||||
updateDynamicRam("getMemberInformation", CONSTANTS.ScriptGangApiBaseRamCost / 2);
|
||||
nsGang.checkGangApiAccess(workerScript, "getMemberInformation");
|
||||
|
||||
try {
|
||||
for (const member of Player.gang.members) {
|
||||
if (member.name === name) {
|
||||
return {
|
||||
agility: member.agi,
|
||||
agilityEquipMult: member.agi_mult,
|
||||
agilityAscensionMult: member.agi_asc_mult,
|
||||
augmentations: member.augmentations.slice(),
|
||||
charisma: member.cha,
|
||||
charismaEquipMult: member.cha_mult,
|
||||
charismaAscensionMult: member.cha_asc_mult,
|
||||
defense: member.def,
|
||||
defenseEquipMult: member.def_mult,
|
||||
defenseAscensionMult: member.def_asc_mult,
|
||||
dexterity: member.dex,
|
||||
dexterityEquipMult: member.dex_mult,
|
||||
dexterityAscensionMult: member.dex_asc_mult,
|
||||
equipment: member.upgrades.slice(),
|
||||
hacking: member.hack,
|
||||
hackingEquipMult: member.hack_mult,
|
||||
hackingAscensionMult: member.hack_asc_mult,
|
||||
strength: member.str,
|
||||
strengthEquipMult: member.str_mult,
|
||||
strengthAscensionMult: member.str_asc_mult,
|
||||
task: member.task,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
workerScript.log(`Invalid argument passed to gang.getMemberInformation(). No gang member could be found with name ${name}`);
|
||||
return {}; // Member could not be found
|
||||
} catch(e) {
|
||||
throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("getMemberInformation", e));
|
||||
}
|
||||
},
|
||||
canRecruitMember : function() {
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("canRecruitMember", CONSTANTS.ScriptGangApiBaseRamCost / 4);
|
||||
}
|
||||
updateDynamicRam("canRecruitMember", CONSTANTS.ScriptGangApiBaseRamCost / 4);
|
||||
nsGang.checkGangApiAccess(workerScript, "canRecruitMember");
|
||||
|
||||
try {
|
||||
return Player.gang.canRecruitMember();
|
||||
} catch(e) {
|
||||
throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("canRecruitMember", e));
|
||||
}
|
||||
},
|
||||
recruitMember : function(name) {
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("recruitMember", CONSTANTS.ScriptGangApiBaseRamCost / 2);
|
||||
}
|
||||
updateDynamicRam("recruitMember", CONSTANTS.ScriptGangApiBaseRamCost / 2);
|
||||
nsGang.checkGangApiAccess(workerScript, "recruitMember");
|
||||
|
||||
try {
|
||||
const res = Player.gang.recruitMember(name);
|
||||
if (workerScript.shouldLog("recruitMember")) {
|
||||
if (res) {
|
||||
workerScript.log(`Successfully recruited Gang Member ${name}`);
|
||||
} else {
|
||||
workerScript.log(`Failed to recruit Gang Member ${name}`);
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
} catch(e) {
|
||||
throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("recruitMember", e));
|
||||
}
|
||||
},
|
||||
getTaskNames : function() {
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getTaskNames", CONSTANTS.ScriptGangApiBaseRamCost / 4);
|
||||
}
|
||||
updateDynamicRam("getTaskNames", CONSTANTS.ScriptGangApiBaseRamCost / 4);
|
||||
nsGang.checkGangApiAccess(workerScript, "getTaskNames");
|
||||
|
||||
try {
|
||||
const tasks = Player.gang.getAllTaskNames();
|
||||
tasks.unshift("Unassigned");
|
||||
return tasks;
|
||||
} catch(e) {
|
||||
throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("getTaskNames", e));
|
||||
}
|
||||
},
|
||||
setMemberTask : function(memberName, taskName) {
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("setMemberTask", CONSTANTS.ScriptGangApiBaseRamCost / 2);
|
||||
}
|
||||
updateDynamicRam("setMemberTask", CONSTANTS.ScriptGangApiBaseRamCost / 2);
|
||||
nsGang.checkGangApiAccess(workerScript, "setMemberTask");
|
||||
|
||||
try {
|
||||
for (const member of Player.gang.members) {
|
||||
if (member.name === memberName) {
|
||||
const res = member.assignToTask(taskName);
|
||||
if (workerScript.shouldLog("setMemberTask")) {
|
||||
if (res) {
|
||||
workerScript.log(`Successfully assigned Gang Member ${memberName} to ${taskName} task`);
|
||||
} else {
|
||||
workerScript.log(`Failed to assign Gang Member ${memberName} to ${taskName} task. ${memberName} is now Unassigned`);
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
workerScript.log(`Invalid argument passed to gang.setMemberTask(). No gang member could be found with name ${memberName}`);
|
||||
return false;
|
||||
} catch(e) {
|
||||
throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("setMemberTask", e));
|
||||
}
|
||||
},
|
||||
getEquipmentNames : function() {
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getEquipmentNames", CONSTANTS.ScriptGangApiBaseRamCost / 4);
|
||||
}
|
||||
updateDynamicRam("getEquipmentNames", CONSTANTS.ScriptGangApiBaseRamCost / 4);
|
||||
nsGang.checkGangApiAccess(workerScript, "getEquipmentNames");
|
||||
|
||||
try {
|
||||
return Player.gang.getAllUpgradeNames();
|
||||
} catch(e) {
|
||||
throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("getEquipmentNames", e));
|
||||
}
|
||||
},
|
||||
getEquipmentCost : function(equipName) {
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("getEquipmentCost", CONSTANTS.ScriptGangApiBaseRamCost / 2);
|
||||
}
|
||||
updateDynamicRam("getEquipmentCost", CONSTANTS.ScriptGangApiBaseRamCost / 2);
|
||||
nsGang.checkGangApiAccess(workerScript, "getEquipmentCost");
|
||||
|
||||
try {
|
||||
return Player.gang.getUpgradeCost(equipName);
|
||||
} catch(e) {
|
||||
throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("getEquipmentCost", e));
|
||||
}
|
||||
},
|
||||
purchaseEquipment : function(memberName, equipName) {
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("purchaseEquipment", CONSTANTS.ScriptGangApiBaseRamCost);
|
||||
}
|
||||
updateDynamicRam("purchaseEquipment", CONSTANTS.ScriptGangApiBaseRamCost);
|
||||
nsGang.checkGangApiAccess(workerScript, "purchaseEquipment");
|
||||
|
||||
try {
|
||||
for (const member in Player.gang.members) {
|
||||
if (member.name === memberName) {
|
||||
const res = member.buyUpgrade(equipName, Player, Player.gang);
|
||||
if (workerScript.shouldLog("purchaseEquipment")) {
|
||||
if (res) {
|
||||
workerScript.log(`Purchased ${equipName} for Gang member ${memberName}`);
|
||||
} else {
|
||||
workerScript.log(`Failed to purchase ${equipName} for Gang member ${memberName}`);
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
workerScript.log(`Invalid argument passed to gang.purchaseEquipment(). No gang member could be found with name ${memberName}`);
|
||||
return false;
|
||||
} catch(e) {
|
||||
throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("purchaseEquipment", e));
|
||||
}
|
||||
},
|
||||
ascendMember : function(name) {
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("ascendMember", CONSTANTS.ScriptGangApiBaseRamCost);
|
||||
}
|
||||
updateDynamicRam("ascendMember", CONSTANTS.ScriptGangApiBaseRamCost);
|
||||
nsGang.checkGangApiAccess(workerScript, "ascendMember");
|
||||
|
||||
try {
|
||||
for (const member in Player.gang.members) {
|
||||
if (member.name === name) {
|
||||
return Player.gang.ascendMember(member, workerScript);
|
||||
}
|
||||
}
|
||||
|
||||
workerScript.log(`Invalid argument passed to gang.ascendMember(). No gang member could be found with name ${memberName}`);
|
||||
return false;
|
||||
} catch(e) {
|
||||
throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("ascendMember", e));
|
||||
}
|
||||
},
|
||||
setTerritoryWarfare : function(engage) {
|
||||
if (workerScript.checkingRam) {
|
||||
return updateStaticRam("setTerritoryWarfare", CONSTANTS.ScriptGangApiBaseRamCost / 2);
|
||||
}
|
||||
updateDynamicRam("setTerritoryWarfare", CONSTANTS.ScriptGangApiBaseRamCost / 2);
|
||||
nsGang.checkGangApiAccess(workerScript, "setTerritoryWarfare");
|
||||
|
||||
try {
|
||||
if (engage) {
|
||||
Player.gang.territoryWarfareEngaged = true;
|
||||
if (workerScript.shouldLog("setTerritoryWarfare")) {
|
||||
workerScript.log("Engaging in Gang Territory Warfare");
|
||||
}
|
||||
} else {
|
||||
Player.gang.territoryWarfareEngaged = false;
|
||||
if (workerScript.shouldLog("setTerritoryWarfare")) {
|
||||
workerScript.log("Disengaging in Gang Territory Warfare");
|
||||
}
|
||||
}
|
||||
} catch(e) {
|
||||
throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("setTerritoryWarfare", e));
|
||||
}
|
||||
},
|
||||
getBonusTime : function() {
|
||||
if (workerScript.checkingRam) { return 0; }
|
||||
nsGang.checkGangApiAccess(workerScript, "getBonusTime");
|
||||
|
||||
try {
|
||||
return Math.round(Player.gang.storedCycles / 5);
|
||||
} catch(e) {
|
||||
throw makeRuntimeRejectMsg(workerScript, nsGang.unknownGangApiExceptionMessage("getBonusTime", e));
|
||||
}
|
||||
},
|
||||
}, // end gang namespace
|
||||
|
||||
// Bladeburner API
|
||||
bladeburner : {
|
||||
getContractNames : function() {
|
||||
if (workerScript.checkingRam) {
|
||||
|
15
src/NetscriptGang.js
Normal file
15
src/NetscriptGang.js
Normal file
@ -0,0 +1,15 @@
|
||||
import {Player} from "./Player";
|
||||
import {Gang} from "./Gang";
|
||||
import {makeRuntimeRejectMsg} from "./NetscriptEvaluator";
|
||||
|
||||
export function unknownGangApiExceptionMessage(functionName, err) {
|
||||
return `gang.${functionName}() failed with exception: ` + err;
|
||||
}
|
||||
|
||||
export function checkGangApiAccess(workerScript, functionName) {
|
||||
const accessDenied = `gang.${functionName}() failed because you do not currently have a Gang`;
|
||||
const hasAccess = Player.gang instanceof Gang;
|
||||
if (!hasAccess) {
|
||||
throw makeRuntimeRejectMsg(workerScript, accessDenied);
|
||||
}
|
||||
}
|
@ -31,8 +31,6 @@ export async function executeJSScript(scripts = [], workerScript) {
|
||||
loadedModule = script.module;
|
||||
|
||||
let ns = workerScript.env.vars;
|
||||
//ns.threads = workerScript.threads;
|
||||
//ns.args = workerScript.args;
|
||||
|
||||
try {
|
||||
// TODO: putting await in a non-async function yields unhelpful
|
||||
@ -75,7 +73,7 @@ export function _getScriptUrls(script, scripts, seen) {
|
||||
// import {foo} from "blob://<uuid>"
|
||||
//
|
||||
// Where the blob URL contains the script content.
|
||||
const transformedCode = script.code.replace(/((?:from|import)\s+(?:'|"))([^'"]+)('|";)/g,
|
||||
let transformedCode = script.code.replace(/((?:from|import)\s+(?:'|"))([^'"]+)('|";)/g,
|
||||
(unmodified, prefix, filename, suffix) => {
|
||||
const isAllowedImport = scripts.some(s => s.filename == filename);
|
||||
if (!isAllowedImport) return unmodified;
|
||||
@ -92,6 +90,9 @@ export function _getScriptUrls(script, scripts, seen) {
|
||||
}
|
||||
);
|
||||
|
||||
// We automatically define a print function() in the NetscriptJS module so that
|
||||
// accidental calls to window.print() do not bring up the "print screen" dialog
|
||||
transformedCode += `\n\nfunction print() {throw new Error("Invalid call to window.print(). Did you mean to use Netscript's print()?");}`
|
||||
|
||||
// If we successfully transformed the code, create a blob url for it and
|
||||
// push that URL onto the top of the stack.
|
||||
|
@ -14,7 +14,6 @@ import {NetscriptPort} from "./NetscriptPort";
|
||||
import {AllServers} from "./Server";
|
||||
import {Settings} from "./Settings";
|
||||
|
||||
//TODO Maybe escodegen might be better?
|
||||
import {generate} from 'escodegen';
|
||||
|
||||
import {parse, Node} from "../utils/acorn";
|
||||
|
245
src/Player.js
245
src/Player.js
@ -20,17 +20,14 @@ import {AllServers, Server, AddToAllServers} from "./Server";
|
||||
import {Settings} from "./Settings";
|
||||
import {SpecialServerIps, SpecialServerNames} from "./SpecialServerIps";
|
||||
import {SourceFiles, applySourceFile} from "./SourceFile";
|
||||
|
||||
import Decimal from "decimal.js";
|
||||
import {numeralWrapper} from "./ui/numeralFormat";
|
||||
|
||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||
import {clearEventListeners} from "../utils/uiHelpers/clearEventListeners";
|
||||
import {createRandomIp} from "../utils/IPAddress";
|
||||
import {Reviver, Generic_toJSON,
|
||||
Generic_fromJSON} from "../utils/JSONReviver";
|
||||
import {formatNumber,
|
||||
convertTimeMsToTimeElapsedString} from "../utils/StringHelperFunctions";
|
||||
import {convertTimeMsToTimeElapsedString} from "../utils/StringHelperFunctions";
|
||||
|
||||
const CYCLES_PER_SEC = 1000 / CONSTANTS.MilliPerCycle;
|
||||
|
||||
@ -721,17 +718,17 @@ PlayerObject.prototype.work = function(numCycles) {
|
||||
var txt = document.getElementById("work-in-progress-text");
|
||||
txt.innerHTML = "You are currently working as a " + this.companyPosition.positionName +
|
||||
" at " + this.companyName + " (Current Company Reputation: " +
|
||||
formatNumber(companyRep, 0) + ")<br><br>" +
|
||||
numeralWrapper.format(companyRep, '0,0') + ")<br><br>" +
|
||||
"You have been working for " + convertTimeMsToTimeElapsedString(this.timeWorked) + "<br><br>" +
|
||||
"You have earned: <br><br>" +
|
||||
"$" + formatNumber(this.workMoneyGained, 2) + " ($" + formatNumber(this.workMoneyGainRate * CYCLES_PER_SEC, 2) + " / sec) <br><br>" +
|
||||
formatNumber(this.workRepGained, 4) + " (" + formatNumber(this.workRepGainRate * CYCLES_PER_SEC, 4) + " / sec) reputation for this company <br><br>" +
|
||||
formatNumber(this.workHackExpGained, 4) + " (" + formatNumber(this.workHackExpGainRate * CYCLES_PER_SEC, 4) + " / sec) hacking exp <br><br>" +
|
||||
formatNumber(this.workStrExpGained, 4) + " (" + formatNumber(this.workStrExpGainRate * CYCLES_PER_SEC, 4) + " / sec) strength exp <br>" +
|
||||
formatNumber(this.workDefExpGained, 4) + " (" + formatNumber(this.workDefExpGainRate * CYCLES_PER_SEC, 4) + " / sec) defense exp <br>" +
|
||||
formatNumber(this.workDexExpGained, 4) + " (" + formatNumber(this.workDexExpGainRate * CYCLES_PER_SEC, 4) + " / sec) dexterity exp <br>" +
|
||||
formatNumber(this.workAgiExpGained, 4) + " (" + formatNumber(this.workAgiExpGainRate * CYCLES_PER_SEC, 4) + " / sec) agility exp <br><br> " +
|
||||
formatNumber(this.workChaExpGained, 4) + " (" + formatNumber(this.workChaExpGainRate * CYCLES_PER_SEC, 4) + " / sec) charisma exp <br><br>" +
|
||||
"$" + numeralWrapper.format(this.workMoneyGained, '0,0.00') + " ($" + numeralWrapper.format(this.workMoneyGainRate * CYCLES_PER_SEC, '0,0.00') + " / sec) <br><br>" +
|
||||
numeralWrapper.format(this.workRepGained, '0,0.0000') + " (" + numeralWrapper.format(this.workRepGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) reputation for this company <br><br>" +
|
||||
numeralWrapper.format(this.workHackExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workHackExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) hacking exp <br><br>" +
|
||||
numeralWrapper.format(this.workStrExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workStrExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) strength exp <br>" +
|
||||
numeralWrapper.format(this.workDefExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workDefExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) defense exp <br>" +
|
||||
numeralWrapper.format(this.workDexExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workDexExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) dexterity exp <br>" +
|
||||
numeralWrapper.format(this.workAgiExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workAgiExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) agility exp <br><br> " +
|
||||
numeralWrapper.format(this.workChaExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workChaExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) charisma exp <br><br>" +
|
||||
"You will automatically finish after working for 8 hours. You can cancel earlier if you wish, " +
|
||||
"but you will only gain half of the reputation you've earned so far."
|
||||
}
|
||||
@ -750,14 +747,14 @@ PlayerObject.prototype.finishWork = function(cancelled, sing=false) {
|
||||
this.updateSkillLevels();
|
||||
|
||||
var txt = "You earned a total of: <br>" +
|
||||
"$" + formatNumber(this.workMoneyGained, 2) + "<br>" +
|
||||
formatNumber(this.workRepGained, 4) + " reputation for the company <br>" +
|
||||
formatNumber(this.workHackExpGained, 4) + " hacking exp <br>" +
|
||||
formatNumber(this.workStrExpGained, 4) + " strength exp <br>" +
|
||||
formatNumber(this.workDefExpGained, 4) + " defense exp <br>" +
|
||||
formatNumber(this.workDexExpGained, 4) + " dexterity exp <br>" +
|
||||
formatNumber(this.workAgiExpGained, 4) + " agility exp <br>" +
|
||||
formatNumber(this.workChaExpGained, 4) + " charisma exp<br>";
|
||||
"$" + numeralWrapper.format(this.workMoneyGained, '0,0.00') + "<br>" +
|
||||
numeralWrapper.format(this.workRepGained, '0,0.0000') + " reputation for the company <br>" +
|
||||
numeralWrapper.format(this.workHackExpGained, '0,0.0000') + " hacking exp <br>" +
|
||||
numeralWrapper.format(this.workStrExpGained, '0,0.0000') + " strength exp <br>" +
|
||||
numeralWrapper.format(this.workDefExpGained, '0,0.0000') + " defense exp <br>" +
|
||||
numeralWrapper.format(this.workDexExpGained, '0,0.0000') + " dexterity exp <br>" +
|
||||
numeralWrapper.format(this.workAgiExpGained, '0,0.0000') + " agility exp <br>" +
|
||||
numeralWrapper.format(this.workChaExpGained, '0,0.0000') + " charisma exp<br>";
|
||||
|
||||
if (cancelled) {
|
||||
txt = "You worked a short shift of " + convertTimeMsToTimeElapsedString(this.timeWorked) + " <br><br> " +
|
||||
@ -774,14 +771,14 @@ PlayerObject.prototype.finishWork = function(cancelled, sing=false) {
|
||||
|
||||
if (sing) {
|
||||
var res = "You worked a short shift of " + convertTimeMsToTimeElapsedString(this.timeWorked) + " and " +
|
||||
"earned $" + formatNumber(this.workMoneyGained, 2) + ", " +
|
||||
formatNumber(this.workRepGained, 4) + " reputation, " +
|
||||
formatNumber(this.workHackExpGained, 4) + " hacking exp, " +
|
||||
formatNumber(this.workStrExpGained, 4) + " strength exp, " +
|
||||
formatNumber(this.workDefExpGained, 4) + " defense exp, " +
|
||||
formatNumber(this.workDexExpGained, 4) + " dexterity exp, " +
|
||||
formatNumber(this.workAgiExpGained, 4) + " agility exp, and " +
|
||||
formatNumber(this.workChaExpGained, 4) + " charisma exp.";
|
||||
"earned $" + numeralWrapper.format(this.workMoneyGained, '0,0.00') + ", " +
|
||||
numeralWrapper.format(this.workRepGained, '0,0.0000') + " reputation, " +
|
||||
numeralWrapper.format(this.workHackExpGained, '0,0.0000') + " hacking exp, " +
|
||||
numeralWrapper.format(this.workStrExpGained, '0,0.0000') + " strength exp, " +
|
||||
numeralWrapper.format(this.workDefExpGained, '0,0.0000') + " defense exp, " +
|
||||
numeralWrapper.format(this.workDexExpGained, '0,0.0000') + " dexterity exp, " +
|
||||
numeralWrapper.format(this.workAgiExpGained, '0,0.0000') + " agility exp, and " +
|
||||
numeralWrapper.format(this.workChaExpGained, '0,0.0000') + " charisma exp.";
|
||||
this.resetWorkStatus();
|
||||
return res;
|
||||
}
|
||||
@ -843,17 +840,17 @@ PlayerObject.prototype.workPartTime = function(numCycles) {
|
||||
var txt = document.getElementById("work-in-progress-text");
|
||||
txt.innerHTML = "You are currently working as a " + this.companyPosition.positionName +
|
||||
" at " + Player.companyName + " (Current Company Reputation: " +
|
||||
formatNumber(companyRep, 0) + ")<br><br>" +
|
||||
numeralWrapper.format(companyRep, '0,0') + ")<br><br>" +
|
||||
"You have been working for " + convertTimeMsToTimeElapsedString(this.timeWorked) + "<br><br>" +
|
||||
"You have earned: <br><br>" +
|
||||
"$" + formatNumber(this.workMoneyGained, 2) + " ($" + formatNumber(this.workMoneyGainRate * CYCLES_PER_SEC, 2) + " / sec) <br><br>" +
|
||||
formatNumber(this.workRepGained, 4) + " (" + formatNumber(this.workRepGainRate * CYCLES_PER_SEC, 4) + " / sec) reputation for this company <br><br>" +
|
||||
formatNumber(this.workHackExpGained, 4) + " (" + formatNumber(this.workHackExpGainRate * CYCLES_PER_SEC, 4) + " / sec) hacking exp <br><br>" +
|
||||
formatNumber(this.workStrExpGained, 4) + " (" + formatNumber(this.workStrExpGainRate * CYCLES_PER_SEC, 4) + " / sec) strength exp <br>" +
|
||||
formatNumber(this.workDefExpGained, 4) + " (" + formatNumber(this.workDefExpGainRate * CYCLES_PER_SEC, 4) + " / sec) defense exp <br>" +
|
||||
formatNumber(this.workDexExpGained, 4) + " (" + formatNumber(this.workDexExpGainRate * CYCLES_PER_SEC, 4) + " / sec) dexterity exp <br>" +
|
||||
formatNumber(this.workAgiExpGained, 4) + " (" + formatNumber(this.workAgiExpGainRate * CYCLES_PER_SEC, 4) + " / sec) agility exp <br><br> " +
|
||||
formatNumber(this.workChaExpGained, 4) + " (" + formatNumber(this.workChaExpGainRate * CYCLES_PER_SEC, 4) + " / sec) charisma exp <br><br>" +
|
||||
"$" + numeralWrapper.format(this.workMoneyGained, '0,0.00') + " ($" + numeralWrapper.format(this.workMoneyGainRate * CYCLES_PER_SEC, '0,0.00') + " / sec) <br><br>" +
|
||||
numeralWrapper.format(this.workRepGained, '0,0.0000') + " (" + numeralWrapper.format(this.workRepGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) reputation for this company <br><br>" +
|
||||
numeralWrapper.format(this.workHackExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workHackExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) hacking exp <br><br>" +
|
||||
numeralWrapper.format(this.workStrExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workStrExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) strength exp <br>" +
|
||||
numeralWrapper.format(this.workDefExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workDefExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) defense exp <br>" +
|
||||
numeralWrapper.format(this.workDexExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workDexExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) dexterity exp <br>" +
|
||||
numeralWrapper.format(this.workAgiExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workAgiExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) agility exp <br><br> " +
|
||||
numeralWrapper.format(this.workChaExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workChaExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) charisma exp <br><br>" +
|
||||
"You will automatically finish after working for 8 hours. You can cancel earlier if you wish, <br>" +
|
||||
"and there will be no penalty because this is a part-time job.";
|
||||
|
||||
@ -868,14 +865,14 @@ PlayerObject.prototype.finishWorkPartTime = function(sing=false) {
|
||||
this.updateSkillLevels();
|
||||
|
||||
var txt = "You earned a total of: <br>" +
|
||||
"$" + formatNumber(this.workMoneyGained, 2) + "<br>" +
|
||||
formatNumber(this.workRepGained, 4) + " reputation for the company <br>" +
|
||||
formatNumber(this.workHackExpGained, 4) + " hacking exp <br>" +
|
||||
formatNumber(this.workStrExpGained, 4) + " strength exp <br>" +
|
||||
formatNumber(this.workDefExpGained, 4) + " defense exp <br>" +
|
||||
formatNumber(this.workDexExpGained, 4) + " dexterity exp <br>" +
|
||||
formatNumber(this.workAgiExpGained, 4) + " agility exp <br>" +
|
||||
formatNumber(this.workChaExpGained, 4) + " charisma exp<br>";
|
||||
"$" + numeralWrapper.format(this.workMoneyGained, '0,0.00') + "<br>" +
|
||||
numeralWrapper.format(this.workRepGained, '0,0.0000') + " reputation for the company <br>" +
|
||||
numeralWrapper.format(this.workHackExpGained, '0,0.0000') + " hacking exp <br>" +
|
||||
numeralWrapper.format(this.workStrExpGained, '0,0.0000') + " strength exp <br>" +
|
||||
numeralWrapper.format(this.workDefExpGained, '0,0.0000') + " defense exp <br>" +
|
||||
numeralWrapper.format(this.workDexExpGained, '0,0.0000') + " dexterity exp <br>" +
|
||||
numeralWrapper.format(this.workAgiExpGained, '0,0.0000') + " agility exp <br>" +
|
||||
numeralWrapper.format(this.workChaExpGained, '0,0.0000') + " charisma exp<br>";
|
||||
txt = "You worked for " + convertTimeMsToTimeElapsedString(this.timeWorked) + "<br><br> " + txt;
|
||||
if (!sing) {dialogBoxCreate(txt);}
|
||||
|
||||
@ -886,14 +883,14 @@ PlayerObject.prototype.finishWorkPartTime = function(sing=false) {
|
||||
if (sing) {
|
||||
var res = "You worked for " + convertTimeMsToTimeElapsedString(this.timeWorked) + " and " +
|
||||
"earned a total of " +
|
||||
"$" + formatNumber(this.workMoneyGained, 2) + ", " +
|
||||
formatNumber(this.workRepGained, 4) + " reputation, " +
|
||||
formatNumber(this.workHackExpGained, 4) + " hacking exp, " +
|
||||
formatNumber(this.workStrExpGained, 4) + " strength exp, " +
|
||||
formatNumber(this.workDefExpGained, 4) + " defense exp, " +
|
||||
formatNumber(this.workDexExpGained, 4) + " dexterity exp, " +
|
||||
formatNumber(this.workAgiExpGained, 4) + " agility exp, and " +
|
||||
formatNumber(this.workChaExpGained, 4) + " charisma exp";
|
||||
"$" + numeralWrapper.format(this.workMoneyGained, '0,0.00') + ", " +
|
||||
numeralWrapper.format(this.workRepGained, '0,0.0000') + " reputation, " +
|
||||
numeralWrapper.format(this.workHackExpGained, '0,0.0000') + " hacking exp, " +
|
||||
numeralWrapper.format(this.workStrExpGained, '0,0.0000') + " strength exp, " +
|
||||
numeralWrapper.format(this.workDefExpGained, '0,0.0000') + " defense exp, " +
|
||||
numeralWrapper.format(this.workDexExpGained, '0,0.0000') + " dexterity exp, " +
|
||||
numeralWrapper.format(this.workAgiExpGained, '0,0.0000') + " agility exp, and " +
|
||||
numeralWrapper.format(this.workChaExpGained, '0,0.0000') + " charisma exp";
|
||||
this.resetWorkStatus();
|
||||
return res;
|
||||
}
|
||||
@ -1012,17 +1009,17 @@ PlayerObject.prototype.workForFaction = function(numCycles) {
|
||||
|
||||
var txt = document.getElementById("work-in-progress-text");
|
||||
txt.innerHTML = "You are currently " + this.currentWorkFactionDescription + " for your faction " + faction.name +
|
||||
" (Current Faction Reputation: " + formatNumber(faction.playerReputation, 0) + "). <br>" +
|
||||
" (Current Faction Reputation: " + numeralWrapper.format(faction.playerReputation, '0,0') + "). <br>" +
|
||||
"You have been doing this for " + convertTimeMsToTimeElapsedString(this.timeWorked) + "<br><br>" +
|
||||
"You have earned: <br><br>" +
|
||||
"$" + formatNumber(this.workMoneyGained, 2) + " (" + formatNumber(this.workMoneyGainRate * CYCLES_PER_SEC, 2) + " / sec) <br><br>" +
|
||||
formatNumber(this.workRepGained, 4) + " (" + formatNumber(this.workRepGainRate * CYCLES_PER_SEC, 4) + " / sec) reputation for this faction <br><br>" +
|
||||
formatNumber(this.workHackExpGained, 4) + " (" + formatNumber(this.workHackExpGainRate * CYCLES_PER_SEC, 4) + " / sec) hacking exp <br><br>" +
|
||||
formatNumber(this.workStrExpGained, 4) + " (" + formatNumber(this.workStrExpGainRate * CYCLES_PER_SEC, 4) + " / sec) strength exp <br>" +
|
||||
formatNumber(this.workDefExpGained, 4) + " (" + formatNumber(this.workDefExpGainRate * CYCLES_PER_SEC, 4) + " / sec) defense exp <br>" +
|
||||
formatNumber(this.workDexExpGained, 4) + " (" + formatNumber(this.workDexExpGainRate * CYCLES_PER_SEC, 4) + " / sec) dexterity exp <br>" +
|
||||
formatNumber(this.workAgiExpGained, 4) + " (" + formatNumber(this.workAgiExpGainRate * CYCLES_PER_SEC, 4) + " / sec) agility exp <br><br> " +
|
||||
formatNumber(this.workChaExpGained, 4) + " (" + formatNumber(this.workChaExpGainRate * CYCLES_PER_SEC, 4) + " / sec) charisma exp <br><br>" +
|
||||
"$" + numeralWrapper.format(this.workMoneyGained, '0,0.00') + " (" + numeralWrapper.format(this.workMoneyGainRate * CYCLES_PER_SEC, '0,0.00') + " / sec) <br><br>" +
|
||||
numeralWrapper.format(this.workRepGained, '0,0.0000') + " (" + numeralWrapper.format(this.workRepGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) reputation for this faction <br><br>" +
|
||||
numeralWrapper.format(this.workHackExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workHackExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) hacking exp <br><br>" +
|
||||
numeralWrapper.format(this.workStrExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workStrExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) strength exp <br>" +
|
||||
numeralWrapper.format(this.workDefExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workDefExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) defense exp <br>" +
|
||||
numeralWrapper.format(this.workDexExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workDexExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) dexterity exp <br>" +
|
||||
numeralWrapper.format(this.workAgiExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workAgiExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) agility exp <br><br> " +
|
||||
numeralWrapper.format(this.workChaExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workChaExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) charisma exp <br><br>" +
|
||||
|
||||
"You will automatically finish after working for 20 hours. You can cancel earlier if you wish.<br>" +
|
||||
"There is no penalty for cancelling earlier.";
|
||||
@ -1038,14 +1035,14 @@ PlayerObject.prototype.finishFactionWork = function(cancelled, sing=false) {
|
||||
|
||||
var txt = "You worked for your faction " + faction.name + " for a total of " + convertTimeMsToTimeElapsedString(this.timeWorked) + " <br><br> " +
|
||||
"You earned a total of: <br>" +
|
||||
"$" + formatNumber(this.workMoneyGained, 2) + "<br>" +
|
||||
formatNumber(this.workRepGained, 4) + " reputation for the faction <br>" +
|
||||
formatNumber(this.workHackExpGained, 4) + " hacking exp <br>" +
|
||||
formatNumber(this.workStrExpGained, 4) + " strength exp <br>" +
|
||||
formatNumber(this.workDefExpGained, 4) + " defense exp <br>" +
|
||||
formatNumber(this.workDexExpGained, 4) + " dexterity exp <br>" +
|
||||
formatNumber(this.workAgiExpGained, 4) + " agility exp <br>" +
|
||||
formatNumber(this.workChaExpGained, 4) + " charisma exp<br>";
|
||||
"$" + numeralWrapper.format(this.workMoneyGained, '0,0.00') + "<br>" +
|
||||
numeralWrapper.format(this.workRepGained, '0,0.0000') + " reputation for the faction <br>" +
|
||||
numeralWrapper.format(this.workHackExpGained, '0,0.0000') + " hacking exp <br>" +
|
||||
numeralWrapper.format(this.workStrExpGained, '0,0.0000') + " strength exp <br>" +
|
||||
numeralWrapper.format(this.workDefExpGained, '0,0.0000') + " defense exp <br>" +
|
||||
numeralWrapper.format(this.workDexExpGained, '0,0.0000') + " dexterity exp <br>" +
|
||||
numeralWrapper.format(this.workAgiExpGained, '0,0.0000') + " agility exp <br>" +
|
||||
numeralWrapper.format(this.workChaExpGained, '0,0.0000') + " charisma exp<br>";
|
||||
if (!sing) {dialogBoxCreate(txt);}
|
||||
|
||||
var mainMenu = document.getElementById("mainmenu-container");
|
||||
@ -1058,13 +1055,13 @@ PlayerObject.prototype.finishFactionWork = function(cancelled, sing=false) {
|
||||
if (sing) {
|
||||
var res="You worked for your faction " + faction.name + " for a total of " + convertTimeMsToTimeElapsedString(this.timeWorked) + ". " +
|
||||
"You earned " +
|
||||
formatNumber(this.workRepGained, 4) + " rep, " +
|
||||
formatNumber(this.workHackExpGained, 4) + " hacking exp, " +
|
||||
formatNumber(this.workStrExpGained, 4) + " str exp, " +
|
||||
formatNumber(this.workDefExpGained, 4) + " def exp, " +
|
||||
formatNumber(this.workDexExpGained, 4) + " dex exp, " +
|
||||
formatNumber(this.workAgiExpGained, 4) + " agi exp, and " +
|
||||
formatNumber(this.workChaExpGained, 4) + " cha exp.";
|
||||
numeralWrapper.format(this.workRepGained, '0,0.0000') + " rep, " +
|
||||
numeralWrapper.format(this.workHackExpGained, '0,0.0000') + " hacking exp, " +
|
||||
numeralWrapper.format(this.workStrExpGained, '0,0.0000') + " str exp, " +
|
||||
numeralWrapper.format(this.workDefExpGained, '0,0.0000') + " def exp, " +
|
||||
numeralWrapper.format(this.workDexExpGained, '0,0.0000') + " dex exp, " +
|
||||
numeralWrapper.format(this.workAgiExpGained, '0,0.0000') + " agi exp, and " +
|
||||
numeralWrapper.format(this.workChaExpGained, '0,0.0000') + " cha exp.";
|
||||
this.resetWorkStatus();
|
||||
return res;
|
||||
}
|
||||
@ -1350,14 +1347,14 @@ PlayerObject.prototype.takeClass = function(numCycles) {
|
||||
var txt = document.getElementById("work-in-progress-text");
|
||||
txt.innerHTML = "You have been " + className + " for " + convertTimeMsToTimeElapsedString(this.timeWorked) + "<br><br>" +
|
||||
"This has cost you: <br>" +
|
||||
"$" + formatNumber(this.workMoneyGained, 2) + " ($" + formatNumber(this.workMoneyLossRate * CYCLES_PER_SEC, 2) + " / sec) <br><br>" +
|
||||
"$" + numeralWrapper.format(this.workMoneyGained, '0,0.00') + " ($" + numeralWrapper.format(this.workMoneyLossRate * CYCLES_PER_SEC, '0,0.00') + " / sec) <br><br>" +
|
||||
"You have gained: <br>" +
|
||||
formatNumber(this.workHackExpGained, 4) + " (" + formatNumber(this.workHackExpGainRate * CYCLES_PER_SEC, 4) + " / sec) hacking exp <br>" +
|
||||
formatNumber(this.workStrExpGained, 4) + " (" + formatNumber(this.workStrExpGainRate * CYCLES_PER_SEC, 4) + " / sec) strength exp <br>" +
|
||||
formatNumber(this.workDefExpGained, 4) + " (" + formatNumber(this.workDefExpGainRate * CYCLES_PER_SEC, 4) + " / sec) defense exp <br>" +
|
||||
formatNumber(this.workDexExpGained, 4) + " (" + formatNumber(this.workDexExpGainRate * CYCLES_PER_SEC, 4) + " / sec) dexterity exp <br>" +
|
||||
formatNumber(this.workAgiExpGained, 4) + " (" + formatNumber(this.workAgiExpGainRate * CYCLES_PER_SEC, 4) + " / sec) agility exp <br>" +
|
||||
formatNumber(this.workChaExpGained, 4) + " (" + formatNumber(this.workChaExpGainRate * CYCLES_PER_SEC, 4) + " / sec) charisma exp <br>" +
|
||||
numeralWrapper.format(this.workHackExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workHackExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) hacking exp <br>" +
|
||||
numeralWrapper.format(this.workStrExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workStrExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) strength exp <br>" +
|
||||
numeralWrapper.format(this.workDefExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workDefExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) defense exp <br>" +
|
||||
numeralWrapper.format(this.workDexExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workDexExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) dexterity exp <br>" +
|
||||
numeralWrapper.format(this.workAgiExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workAgiExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) agility exp <br>" +
|
||||
numeralWrapper.format(this.workChaExpGained, '0,0.0000') + " (" + numeralWrapper.format(this.workChaExpGainRate * CYCLES_PER_SEC, '0,0.0000') + " / sec) charisma exp <br>" +
|
||||
"You may cancel at any time";
|
||||
}
|
||||
|
||||
@ -1373,14 +1370,14 @@ PlayerObject.prototype.finishClass = function(sing=false) {
|
||||
|
||||
this.updateSkillLevels();
|
||||
var txt = "After " + this.className + " for " + convertTimeMsToTimeElapsedString(this.timeWorked) + ", <br>" +
|
||||
"you spent a total of $" + formatNumber(this.workMoneyGained * -1, 2) + ". <br><br>" +
|
||||
"you spent a total of $" + numeralWrapper.format(this.workMoneyGained * -1, '0,0.00') + ". <br><br>" +
|
||||
"You earned a total of: <br>" +
|
||||
formatNumber(this.workHackExpGained, 4) + " hacking exp <br>" +
|
||||
formatNumber(this.workStrExpGained, 4) + " strength exp <br>" +
|
||||
formatNumber(this.workDefExpGained, 4) + " defense exp <br>" +
|
||||
formatNumber(this.workDexExpGained, 4) + " dexterity exp <br>" +
|
||||
formatNumber(this.workAgiExpGained, 4) + " agility exp <br>" +
|
||||
formatNumber(this.workChaExpGained, 4) + " charisma exp<br>";
|
||||
numeralWrapper.format(this.workHackExpGained, '0,0.0000') + " hacking exp <br>" +
|
||||
numeralWrapper.format(this.workStrExpGained, '0,0.0000') + " strength exp <br>" +
|
||||
numeralWrapper.format(this.workDefExpGained, '0,0.0000') + " defense exp <br>" +
|
||||
numeralWrapper.format(this.workDexExpGained, '0,0.0000') + " dexterity exp <br>" +
|
||||
numeralWrapper.format(this.workAgiExpGained, '0,0.0000') + " agility exp <br>" +
|
||||
numeralWrapper.format(this.workChaExpGained, '0,0.0000') + " charisma exp<br>";
|
||||
if (!sing) {dialogBoxCreate(txt);}
|
||||
|
||||
var mainMenu = document.getElementById("mainmenu-container");
|
||||
@ -1391,14 +1388,14 @@ PlayerObject.prototype.finishClass = function(sing=false) {
|
||||
Engine.loadLocationContent();
|
||||
if (sing) {
|
||||
var res="After " + this.className + " for " + convertTimeMsToTimeElapsedString(this.timeWorked) + ", " +
|
||||
"you spent a total of $" + formatNumber(this.workMoneyGained * -1, 2) + ". " +
|
||||
"you spent a total of $" + numeralWrapper.format(this.workMoneyGained * -1, '0,0.00') + ". " +
|
||||
"You earned a total of: " +
|
||||
formatNumber(this.workHackExpGained, 3) + " hacking exp, " +
|
||||
formatNumber(this.workStrExpGained, 3) + " strength exp, " +
|
||||
formatNumber(this.workDefExpGained, 3) + " defense exp, " +
|
||||
formatNumber(this.workDexExpGained, 3) + " dexterity exp, " +
|
||||
formatNumber(this.workAgiExpGained, 3) + " agility exp, and " +
|
||||
formatNumber(this.workChaExpGained, 3) + " charisma exp";
|
||||
numeralWrapper.format(this.workHackExpGained, '0,0.0000') + " hacking exp, " +
|
||||
numeralWrapper.format(this.workStrExpGained, '0,0.0000') + " strength exp, " +
|
||||
numeralWrapper.format(this.workDefExpGained, '0,0.0000') + " defense exp, " +
|
||||
numeralWrapper.format(this.workDexExpGained, '0,0.0000') + " dexterity exp, " +
|
||||
numeralWrapper.format(this.workAgiExpGained, '0,0.0000') + " agility exp, and " +
|
||||
numeralWrapper.format(this.workChaExpGained, '0,0.0000') + " charisma exp";
|
||||
this.resetWorkStatus();
|
||||
return res;
|
||||
}
|
||||
@ -1489,23 +1486,23 @@ PlayerObject.prototype.finishCrime = function(cancelled) {
|
||||
if(this.singFnCrimeWorkerScript.disableLogs.ALL == null && this.singFnCrimeWorkerScript.disableLogs.commitCrime == null) {
|
||||
this.singFnCrimeWorkerScript.scriptRef.log("Crime successful! Gained " +
|
||||
numeralWrapper.format(this.workMoneyGained, "$0.000a") + ", " +
|
||||
formatNumber(this.workHackExpGained, 3) + " hack exp, " +
|
||||
formatNumber(this.workStrExpGained, 3) + " str exp, " +
|
||||
formatNumber(this.workDefExpGained, 3) + " def exp, " +
|
||||
formatNumber(this.workDexExpGained, 3) + " dex exp, " +
|
||||
formatNumber(this.workAgiExpGained, 3) + " agi exp, " +
|
||||
formatNumber(this.workChaExpGained, 3) + " cha exp.");
|
||||
numeralWrapper.format(this.workHackExpGained, '0,0.0000') + " hack exp, " +
|
||||
numeralWrapper.format(this.workStrExpGained, '0,0.0000') + " str exp, " +
|
||||
numeralWrapper.format(this.workDefExpGained, '0,0.0000') + " def exp, " +
|
||||
numeralWrapper.format(this.workDexExpGained, '0,0.0000') + " dex exp, " +
|
||||
numeralWrapper.format(this.workAgiExpGained, '0,0.0000') + " agi exp, " +
|
||||
numeralWrapper.format(this.workChaExpGained, '0,0.0000') + " cha exp.");
|
||||
}
|
||||
} else {
|
||||
dialogBoxCreate("Crime successful! <br><br>" +
|
||||
"You gained:<br>"+
|
||||
"$" + formatNumber(this.workMoneyGained, 2) + "<br>" +
|
||||
formatNumber(this.workHackExpGained, 4) + " hacking experience <br>" +
|
||||
formatNumber(this.workStrExpGained, 4) + " strength experience<br>" +
|
||||
formatNumber(this.workDefExpGained, 4) + " defense experience<br>" +
|
||||
formatNumber(this.workDexExpGained, 4) + " dexterity experience<br>" +
|
||||
formatNumber(this.workAgiExpGained, 4) + " agility experience<br>" +
|
||||
formatNumber(this.workChaExpGained, 4) + " charisma experience");
|
||||
"$" + numeralWrapper.format(this.workMoneyGained, '0,0.00') + "<br>" +
|
||||
numeralWrapper.format(this.workHackExpGained, '0,0.0000') + " hacking experience <br>" +
|
||||
numeralWrapper.format(this.workStrExpGained, '0,0.0000') + " strength experience<br>" +
|
||||
numeralWrapper.format(this.workDefExpGained, '0,0.0000') + " defense experience<br>" +
|
||||
numeralWrapper.format(this.workDexExpGained, '0,0.0000') + " dexterity experience<br>" +
|
||||
numeralWrapper.format(this.workAgiExpGained, '0,0.0000') + " agility experience<br>" +
|
||||
numeralWrapper.format(this.workChaExpGained, '0,0.0000') + " charisma experience");
|
||||
}
|
||||
|
||||
} else {
|
||||
@ -1519,22 +1516,22 @@ PlayerObject.prototype.finishCrime = function(cancelled) {
|
||||
if (this.committingCrimeThruSingFn) {
|
||||
if(this.singFnCrimeWorkerScript.disableLogs.ALL == null && this.singFnCrimeWorkerScript.disableLogs.commitCrime == null) {
|
||||
this.singFnCrimeWorkerScript.scriptRef.log("Crime failed! Gained " +
|
||||
formatNumber(this.workHackExpGained, 3) + " hack exp, " +
|
||||
formatNumber(this.workStrExpGained, 3) + " str exp, " +
|
||||
formatNumber(this.workDefExpGained, 3) + " def exp, " +
|
||||
formatNumber(this.workDexExpGained, 3) + " dex exp, " +
|
||||
formatNumber(this.workAgiExpGained, 3) + " agi exp, " +
|
||||
formatNumber(this.workChaExpGained, 3) + " cha exp.");
|
||||
numeralWrapper.format(this.workHackExpGained, '0,0.0000') + " hack exp, " +
|
||||
numeralWrapper.format(this.workStrExpGained, '0,0.0000') + " str exp, " +
|
||||
numeralWrapper.format(this.workDefExpGained, '0,0.0000') + " def exp, " +
|
||||
numeralWrapper.format(this.workDexExpGained, '0,0.0000') + " dex exp, " +
|
||||
numeralWrapper.format(this.workAgiExpGained, '0,0.0000') + " agi exp, " +
|
||||
numeralWrapper.format(this.workChaExpGained, '0,0.0000') + " cha exp.");
|
||||
}
|
||||
} else {
|
||||
dialogBoxCreate("Crime failed! <br><br>" +
|
||||
"You gained:<br>"+
|
||||
formatNumber(this.workHackExpGained, 4) + " hacking experience <br>" +
|
||||
formatNumber(this.workStrExpGained, 4) + " strength experience<br>" +
|
||||
formatNumber(this.workDefExpGained, 4) + " defense experience<br>" +
|
||||
formatNumber(this.workDexExpGained, 4) + " dexterity experience<br>" +
|
||||
formatNumber(this.workAgiExpGained, 4) + " agility experience<br>" +
|
||||
formatNumber(this.workChaExpGained, 4) + " charisma experience");
|
||||
numeralWrapper.format(this.workHackExpGained, '0,0.0000') + " hacking experience <br>" +
|
||||
numeralWrapper.format(this.workStrExpGained, '0,0.0000') + " strength experience<br>" +
|
||||
numeralWrapper.format(this.workDefExpGained, '0,0.0000') + " defense experience<br>" +
|
||||
numeralWrapper.format(this.workDexExpGained, '0,0.0000') + " dexterity experience<br>" +
|
||||
numeralWrapper.format(this.workAgiExpGained, '0,0.0000') + " agility experience<br>" +
|
||||
numeralWrapper.format(this.workChaExpGained, '0,0.0000') + " charisma experience");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -314,8 +314,8 @@ function prestigeSourceFile() {
|
||||
stockMarketList.removeChild(stockMarketList.firstChild);
|
||||
}
|
||||
|
||||
if (Player.inGang()) { Player.gang.clearUI(); }
|
||||
Player.gang = null;
|
||||
deleteGangDisplayContent();
|
||||
Player.corporation = null;
|
||||
Player.bladeburner = null;
|
||||
|
||||
|
6
src/SaveObject.js
Normal file → Executable file
6
src/SaveObject.js
Normal file → Executable file
@ -24,7 +24,7 @@ import {Reviver, Generic_toJSON,
|
||||
import {createElement} from "../utils/uiHelpers/createElement";
|
||||
import {createPopup} from "../utils/uiHelpers/createPopup";
|
||||
import {createStatusText} from "./ui/createStatusText";
|
||||
import {formatNumber} from "../utils/StringHelperFunctions";
|
||||
import {numeralWrapper} from "./ui/numeralFormat";
|
||||
import {removeElementById} from "../utils/uiHelpers/removeElementById";
|
||||
|
||||
import Decimal from "decimal.js";
|
||||
@ -517,8 +517,8 @@ function loadImportedGame(saveObj, saveString) {
|
||||
Player.lastUpdate = Engine._lastUpdate;
|
||||
Engine.start(); //Run main game loop and Scripts loop
|
||||
dialogBoxCreate("While you were offline, your scripts generated <span class='money-gold'>$" +
|
||||
formatNumber(offlineProductionFromScripts, 2) + "</span> and your Hacknet Nodes generated <span class='money-gold'>$" +
|
||||
formatNumber(offlineProductionFromHacknetNodes, 2) + "</span>");
|
||||
numeralWrapper.format(offlineProductionFromScripts, '0,0.00') + "</span> and your Hacknet Nodes generated <span class='money-gold'>$" +
|
||||
numeralWrapper.format(offlineProductionFromHacknetNodes, '0,0.00') + "</span>");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -219,7 +219,8 @@ function scriptEditorInit() {
|
||||
});
|
||||
|
||||
//Get functions from namespaces
|
||||
if (name === "bladeburner" || name === "hacknet") {
|
||||
const namespaces = ["bladeburner", "hacknet", "codingcontract", "gang"];
|
||||
if (namespaces.includes(name)) {
|
||||
let namespace = fns[name];
|
||||
if (typeof namespace !== "object") {continue;}
|
||||
let namespaceFns = Object.keys(namespace);
|
||||
@ -557,6 +558,8 @@ async function parseOnlyRamCalculate(server, code, workerScript) {
|
||||
func = workerScript.env.vars.bladeburner[ref];
|
||||
} else if (ref in workerScript.env.vars.codingcontract) {
|
||||
func = workerScript.env.vars.codingcontract[ref];
|
||||
} else if (ref in workerScript.env.vars.gang) {
|
||||
func = workerScript.env.vars.gang[ref];
|
||||
} else {
|
||||
func = workerScript.env.get(ref);
|
||||
}
|
||||
|
16
src/SettingEnums.ts
Normal file
16
src/SettingEnums.ts
Normal file
@ -0,0 +1,16 @@
|
||||
/**
|
||||
* Enum Of allowed values for the 'OwnedAugmentationsOrder' setting
|
||||
*/
|
||||
export enum OwnedAugmentationsOrderSetting {
|
||||
Alphabetically,
|
||||
AcquirementTime,
|
||||
}
|
||||
|
||||
/**
|
||||
* Enum Of allowed values for the 'OwnedAugmentationsOrder' setting
|
||||
*/
|
||||
export enum PurchaseAugmentationsOrderSetting {
|
||||
Cost,
|
||||
Default,
|
||||
Reputation,
|
||||
}
|
@ -1,4 +1,5 @@
|
||||
import { ISelfInitializer, ISelfLoading } from "./types";
|
||||
import { OwnedAugmentationsOrderSetting, PurchaseAugmentationsOrderSetting } from "./SettingEnums";
|
||||
|
||||
/**
|
||||
* Represents the default settings the player could customize.
|
||||
@ -75,6 +76,16 @@ interface ISettings extends IDefaultSettings {
|
||||
* TODO: This should really be an enum of allowed values.
|
||||
*/
|
||||
EditorTheme: string;
|
||||
|
||||
/**
|
||||
* What order the player's owned Augmentations/Source Files should be displayed in
|
||||
*/
|
||||
OwnedAugmentationsOrder: OwnedAugmentationsOrderSetting;
|
||||
|
||||
/**
|
||||
* What order the Augmentations should be displayed in when purchasing from a Faction
|
||||
*/
|
||||
PurchaseAugmentationsOrder: PurchaseAugmentationsOrderSetting;
|
||||
}
|
||||
|
||||
const defaultSettings: IDefaultSettings = {
|
||||
@ -104,6 +115,8 @@ export const Settings: ISettings & ISelfInitializer & ISelfLoading = {
|
||||
Locale: "en",
|
||||
MaxLogCapacity: defaultSettings.MaxLogCapacity,
|
||||
MaxPortCapacity: defaultSettings.MaxPortCapacity,
|
||||
OwnedAugmentationsOrder: OwnedAugmentationsOrderSetting.AcquirementTime,
|
||||
PurchaseAugmentationsOrder: PurchaseAugmentationsOrderSetting.Default,
|
||||
SuppressBuyAugmentationConfirmation: defaultSettings.SuppressBuyAugmentationConfirmation,
|
||||
SuppressFactionInvites: defaultSettings.SuppressFactionInvites,
|
||||
SuppressHospitalizationPopup: defaultSettings.SuppressHospitalizationPopup,
|
||||
|
@ -27,9 +27,9 @@ function initSourceFiles() {
|
||||
"Level 3: 28%");
|
||||
SourceFiles["SourceFile2"] = new SourceFile(2, "This Source-File increases the player's crime success rate, crime money, and charisma " +
|
||||
"multipliers by:<br><br>" +
|
||||
"Level 1: 20%<br>" +
|
||||
"Level 2: 30%<br>" +
|
||||
"Level 3: 35%");
|
||||
"Level 1: 24%<br>" +
|
||||
"Level 2: 36%<br>" +
|
||||
"Level 3: 42%");
|
||||
SourceFiles["SourceFile3"] = new SourceFile(3,"This Source-File lets you create corporations on other BitNodes (although " +
|
||||
"some BitNodes will disable this mechanic). This Source-File also increases your charisma and company salary multipliers by:<br>" +
|
||||
"Level 1: 8%<br>" +
|
||||
@ -126,7 +126,7 @@ function applySourceFile(srcFile) {
|
||||
case 2: //Rise of the Underworld
|
||||
var mult = 0;
|
||||
for (var i = 0; i < srcFile.lvl; ++i) {
|
||||
mult += (20 / (Math.pow(2, i)));
|
||||
mult += (24 / (Math.pow(2, i)));
|
||||
}
|
||||
var incMult = 1 + (mult / 100);
|
||||
Player.crime_money_mult *= incMult;
|
||||
|
@ -230,8 +230,11 @@ export const codingContractTypesMetadata: ICodingContractTypeMetadata[] = [
|
||||
desc: (arr: number[]) => {
|
||||
return ["You are given the following array of integers:\n\n",
|
||||
`${arr}\n\n`,
|
||||
"Each element in the array represents your maximum jump length",
|
||||
"at that position. Assuming you are initially positioned",
|
||||
"Each element in the array represents your MAXIMUM jump length",
|
||||
"at that position. This means that if you are at position i and your",
|
||||
"maximum jump length is n, you can jump to any position from",
|
||||
"i to i+n.",
|
||||
"\n\nAssuming you are initially positioned",
|
||||
"at the start of the array, determine whether you are",
|
||||
"able to reach the last index exactly.\n\n",
|
||||
"Your answer should be submitted as 1 or 0, representing true and false respectively"].join(" ");
|
||||
@ -242,7 +245,11 @@ export const codingContractTypesMetadata: ICodingContractTypeMetadata[] = [
|
||||
const arr: number[] = [];
|
||||
arr.length = len;
|
||||
for (let i: number = 0; i < arr.length; ++i) {
|
||||
arr[i] = getRandomInt(0, 24);
|
||||
if (Math.random() < 0.2) {
|
||||
arr[i] = 0; // 20% chance of being 0
|
||||
} else {
|
||||
arr[i] = getRandomInt(0, 10);
|
||||
}
|
||||
}
|
||||
|
||||
return arr;
|
||||
@ -278,7 +285,7 @@ export const codingContractTypesMetadata: ICodingContractTypeMetadata[] = [
|
||||
difficulty: 3,
|
||||
gen: () => {
|
||||
const intervals: number[][] = [];
|
||||
const numIntervals: number = getRandomInt(1, 15);
|
||||
const numIntervals: number = getRandomInt(1, 20);
|
||||
for (let i: number = 0; i < numIntervals; ++i) {
|
||||
const start: number = getRandomInt(1, 25);
|
||||
const end: number = start + getRandomInt(1, 10);
|
||||
@ -322,8 +329,11 @@ export const codingContractTypesMetadata: ICodingContractTypeMetadata[] = [
|
||||
"an array with all possible valid IP address combinations",
|
||||
"that can be created from the string:\n\n",
|
||||
`${data}\n\n`,
|
||||
"Example:\n\n",
|
||||
"25525511135 -> [255.255.11.135, 255.255.111.35]"].join(" ");
|
||||
"Note that an octet cannot begin with a '0' unless the number",
|
||||
"itself is actually 0. For example, '192.168.010.1' is not a valid IP.\n\n",
|
||||
"Examples:\n\n",
|
||||
"25525511135 -> [255.255.11.135, 255.255.111.35]\n",
|
||||
"1938718066 -> [193.87.180.66]"].join(" ");
|
||||
},
|
||||
difficulty: 3,
|
||||
gen: () => {
|
||||
|
284
src/data/gangmembertasks.ts
Normal file
284
src/data/gangmembertasks.ts
Normal file
@ -0,0 +1,284 @@
|
||||
/* tslint:disable:max-line-length */
|
||||
|
||||
/**
|
||||
* Defines the parameters that can be used to initialize and describe a GangMemberTask
|
||||
* (defined in Gang.js)
|
||||
*/
|
||||
export interface IGangMemberTaskMetadata {
|
||||
/**
|
||||
* Description of the task
|
||||
*/
|
||||
desc: string;
|
||||
|
||||
/**
|
||||
* Whether or not this task is meant for Combat-type gangs
|
||||
*/
|
||||
isCombat: boolean;
|
||||
|
||||
/**
|
||||
* Whether or not this task is for Hacking-type gangs
|
||||
*/
|
||||
isHacking: boolean;
|
||||
|
||||
/**
|
||||
* Name of the task
|
||||
*/
|
||||
name: string;
|
||||
|
||||
/**
|
||||
* An object containing weighting parameters for the task. These parameters are used for
|
||||
* various calculations (respect gain, wanted gain, etc.)
|
||||
*/
|
||||
params?: any;
|
||||
}
|
||||
|
||||
/**
|
||||
* Array of metadata for all Gang Member tasks. Used to construct the global GangMemberTask
|
||||
* objects in Gang.js
|
||||
*/
|
||||
export const gangMemberTasksMetadata: IGangMemberTaskMetadata[] = [
|
||||
{
|
||||
desc: "This gang member is currently idle",
|
||||
isCombat: true,
|
||||
isHacking: true,
|
||||
name: "Unassigned",
|
||||
params: {hackWeight: 100}, // This is just to get by the weight check in the GangMemberTask constructor
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to create and distribute ransomware<br><br>Earns money - Slightly increases respect - Slightly increases wanted level",
|
||||
isCombat: false,
|
||||
isHacking: true,
|
||||
name: "Ransomware",
|
||||
params: {baseRespect: 0.00005, baseWanted: 0.00001, baseMoney: 1, hackWeight: 100, difficulty: 1},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to attempt phishing scams and attacks<br><br>Earns money - Slightly increases respect - Slightly increases wanted level",
|
||||
isCombat: false,
|
||||
isHacking: true,
|
||||
name: "Phishing",
|
||||
params: {baseRespect: 0.00008, baseWanted: 0.001, baseMoney: 2.5, hackWeight: 85, chaWeight: 15, difficulty: 3.5},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to attempt identity theft<br><br>Earns money - Increases respect - Increases wanted level",
|
||||
isCombat: false,
|
||||
isHacking: true,
|
||||
name: "Identity Theft",
|
||||
params: {baseRespect: 0.0001, baseWanted: 0.01, baseMoney: 6, hackWeight: 80, chaWeight: 20, difficulty: 5},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to carry out DDoS attacks<br><br>Increases respect - Increases wanted level",
|
||||
isCombat: false,
|
||||
isHacking: true,
|
||||
name: "DDoS Attacks",
|
||||
params: {baseRespect: 0.0004, baseWanted: 0.05, hackWeight: 100, difficulty: 8},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to create and distribute malicious viruses<br><br>Increases respect - Increases wanted level",
|
||||
isCombat: false,
|
||||
isHacking: true,
|
||||
name: "Plant Virus",
|
||||
params: {baseRespect: 0.0006, baseWanted: 0.05, hackWeight: 100, difficulty: 12},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to commit financial fraud and digital counterfeiting<br><br>Earns money - Slightly increases respect - Slightly increases wanted level",
|
||||
isCombat: false,
|
||||
isHacking: true,
|
||||
name: "Fraud & Counterfeiting",
|
||||
params: {baseRespect: 0.0005, baseWanted: 0.1, baseMoney: 15, hackWeight: 80, chaWeight: 20, difficulty: 20},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to launder money<br><br>Earns money - Increases respect - Increases wanted level",
|
||||
isCombat: false,
|
||||
isHacking: true,
|
||||
name: "Money Laundering",
|
||||
params: {baseRespect: 0.0006, baseWanted: 0.2, baseMoney: 40, hackWeight: 75, chaWeight: 25, difficulty: 25},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to commit acts of cyberterrorism<br><br>Greatly increases respect - Greatly increases wanted level",
|
||||
isCombat: false,
|
||||
isHacking: true,
|
||||
name: "Cyberterrorism",
|
||||
params: {baseRespect: 0.001, baseWanted: 0.5, hackWeight: 80, chaWeight: 20, difficulty: 36},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to be an ethical hacker for corporations<br><br>Earns money - Lowers wanted level",
|
||||
isCombat: false,
|
||||
isHacking: true,
|
||||
name: "Ethical Hacking",
|
||||
params: {baseWanted: -0.001, baseMoney: 1, hackWeight: 90, chaWeight: 10, difficulty: 1},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to mug random people on the streets<br><br>Earns money - Slightly increases respect - Very slightly increases wanted level",
|
||||
isCombat: true,
|
||||
isHacking: false,
|
||||
name: "Mug People",
|
||||
params: {
|
||||
baseRespect: 0.00005, baseWanted: 0.00005, baseMoney: 1.2,
|
||||
strWeight: 25, defWeight: 25, dexWeight: 25, agiWeight: 10, chaWeight: 15,
|
||||
difficulty: 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to sell drugs<br><br>Earns money - Slightly increases respect - Slightly increases wanted level - Scales slightly with territory",
|
||||
isCombat: true,
|
||||
isHacking: false,
|
||||
name: "Deal Drugs",
|
||||
params: {
|
||||
baseRespect: 0.00006, baseWanted: 0.002, baseMoney: 5,
|
||||
agiWeight: 20, dexWeight: 20, chaWeight: 60,
|
||||
difficulty: 3.5,
|
||||
territory: {
|
||||
money: 1.2,
|
||||
respect: 1,
|
||||
wanted: 1.15,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to extort civilians in your territory<br><br>Earns money - Slightly increases respect - Increases wanted - Scales heavily with territory",
|
||||
isCombat: true,
|
||||
isHacking: false,
|
||||
name: "Strongarm Civilians",
|
||||
params: {
|
||||
baseRespect: 0.00004, baseWanted: 0.0035, baseMoney: 2.5,
|
||||
hackWeight: 10, strWeight: 25, defWeight: 25, dexWeight: 20, agiWeight: 10, chaWeight: 10,
|
||||
difficulty: 5,
|
||||
territory: {
|
||||
money: 1.6,
|
||||
respect: 1.1,
|
||||
wanted: 1.5
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to run cons<br><br>Earns money - Increases respect - Increases wanted level",
|
||||
isCombat: true,
|
||||
isHacking: false,
|
||||
name: "Run a Con",
|
||||
params: {
|
||||
baseRespect: 0.00012, baseWanted: 0.04, baseMoney: 15,
|
||||
strWeight: 5, defWeight: 5, agiWeight: 25, dexWeight: 25, chaWeight: 40,
|
||||
difficulty: 14,
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to commit armed robbery on stores, banks and armored cars<br><br>Earns money - Increases respect - Increases wanted level",
|
||||
isCombat: true,
|
||||
isHacking: false,
|
||||
name: "Armed Robbery",
|
||||
params: {
|
||||
baseRespect: 0.00014, baseWanted: 0.08, baseMoney: 38,
|
||||
hackWeight: 20, strWeight: 15, defWeight: 15, agiWeight: 10, dexWeight: 20, chaWeight: 20,
|
||||
difficulty: 20,
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to traffick illegal arms<br><br>Earns money - Increases respect - Increases wanted level - Scales heavily with territory",
|
||||
isCombat: true,
|
||||
isHacking: false,
|
||||
name: "Traffick Illegal Arms",
|
||||
params: {
|
||||
baseRespect: 0.0002, baseWanted: 0.18, baseMoney: 58,
|
||||
hackWeight: 15, strWeight: 20, defWeight: 20, dexWeight: 20, chaWeight: 25,
|
||||
difficulty: 32,
|
||||
territory: {
|
||||
money: 1.4,
|
||||
respect: 1.3,
|
||||
wanted: 1.25,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to threaten and black mail high-profile targets<br><br>Earns money - Slightly increases respect - Slightly increases wanted level",
|
||||
isCombat: true,
|
||||
isHacking: false,
|
||||
name: "Threaten & Blackmail",
|
||||
params: {
|
||||
baseRespect: 0.0002, baseWanted: 0.1, baseMoney: 24,
|
||||
hackWeight: 25, strWeight: 25, dexWeight: 25, chaWeight: 25,
|
||||
difficulty: 28,
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to engage in human trafficking operations<br><br>Earns money - Increases respect - Increases wanted level - Scales heavily with territory",
|
||||
isCombat: true,
|
||||
isHacking: false,
|
||||
name: "Human Trafficking",
|
||||
params: {
|
||||
baseRespect: 0.004, baseWanted: 1, baseMoney: 120,
|
||||
hackWeight: 30, strWeight: 5, defWeight: 5, dexWeight: 30, chaWeight: 30,
|
||||
difficulty: 36,
|
||||
territory: {
|
||||
money: 1.5,
|
||||
respect: 1.5,
|
||||
wanted: 1.6,
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to commit acts of terrorism<br><br>Greatly increases respect - Greatly increases wanted level - Scales heavily with territory",
|
||||
isCombat: true,
|
||||
isHacking: false,
|
||||
name: "Terrorism",
|
||||
params: {
|
||||
baseRespect: 0.01, baseWanted: 5,
|
||||
hackWeight: 20, strWeight: 20, defWeight: 20, dexWeight: 20, chaWeight: 20,
|
||||
difficulty: 36,
|
||||
territory: {
|
||||
money: 1,
|
||||
respect: 2,
|
||||
wanted: 2,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to be a vigilante and protect the city from criminals<br><br>Decreases wanted level",
|
||||
isCombat: true,
|
||||
isHacking: true,
|
||||
name: "Vigilante Justice",
|
||||
params: {
|
||||
baseWanted: -0.001,
|
||||
hackWeight: 20, strWeight: 20, defWeight: 20, dexWeight: 20, agiWeight: 20,
|
||||
difficulty: 1,
|
||||
territory: {
|
||||
money: 1,
|
||||
respect: 1,
|
||||
wanted: 0.9, // Gets harder with more territory
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to increase their combat stats (str, def, dex, agi)",
|
||||
isCombat: true,
|
||||
isHacking: true,
|
||||
name: "Train Combat",
|
||||
params: {
|
||||
strWeight: 25, defWeight: 25, dexWeight: 25, agiWeight: 25,
|
||||
difficulty: 5
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to train their hacking skills",
|
||||
isCombat: true,
|
||||
isHacking: true,
|
||||
name: "Train Hacking",
|
||||
params: {hackWeight: 100, difficulty: 8},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to train their charisma",
|
||||
isCombat: true,
|
||||
isHacking: true,
|
||||
name: "Train Charisma",
|
||||
params: {chaWeight: 100, difficulty: 8},
|
||||
},
|
||||
{
|
||||
desc: "Assign this gang member to engage in territorial warfare with other gangs. Members assigned to this task will help increase your gang's territory and will defend your territory from being taken.",
|
||||
isCombat: true,
|
||||
isHacking: true,
|
||||
name: "Territory Warfare",
|
||||
params: {
|
||||
hackWeight: 15, strWeight: 20, defWeight: 20, dexWeight: 20, agiWeight: 20, chaWeight: 5,
|
||||
difficulty: 5
|
||||
},
|
||||
},
|
||||
];
|
191
src/data/gangmemberupgrades.ts
Normal file
191
src/data/gangmemberupgrades.ts
Normal file
@ -0,0 +1,191 @@
|
||||
/**
|
||||
* Defines the parameters that can be used to initialize and describe a GangMemberUpgrade
|
||||
* (defined in Gang.js)
|
||||
*/
|
||||
export interface IGangMemberUpgradeMetadata {
|
||||
cost: number;
|
||||
mults: any;
|
||||
name: string;
|
||||
upgType: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Array of metadata for all Gang Member upgrades. Used to construct the global GangMemberUpgrade
|
||||
* objects in Gang.js
|
||||
*/
|
||||
export const gangMemberUpgradesMetadata: IGangMemberUpgradeMetadata[] = [
|
||||
{
|
||||
cost: 1e6,
|
||||
mults: {str: 1.04, def: 1.04},
|
||||
name: "Baseball Bat",
|
||||
upgType: "w",
|
||||
},
|
||||
{
|
||||
cost: 12e6,
|
||||
mults: {str: 1.08, def: 1.08, dex: 1.08},
|
||||
name: "Katana",
|
||||
upgType: "w",
|
||||
},
|
||||
{
|
||||
cost: 25e6,
|
||||
mults: {str: 1.1, def: 1.1, dex: 1.1, agi: 1.1},
|
||||
name: "Glock 18C",
|
||||
upgType: "w",
|
||||
},
|
||||
{
|
||||
cost: 50e6,
|
||||
mults: {str: 1.12, def: 1.12, agi: 1.1},
|
||||
name: "P90C",
|
||||
upgType: "w",
|
||||
},
|
||||
{
|
||||
cost: 60e6,
|
||||
mults: {str: 1.2, def: 1.2},
|
||||
name: "Steyr AUG",
|
||||
upgType: "w",
|
||||
},
|
||||
{
|
||||
cost: 100e6,
|
||||
mults: {str: 1.25, def: 1.25},
|
||||
name: "AK-47",
|
||||
upgType: "w",
|
||||
},
|
||||
{
|
||||
cost: 150e6,
|
||||
mults: {str: 1.3, def: 1.3},
|
||||
name: "M15A10 Assault Rifle",
|
||||
upgType: "w",
|
||||
},
|
||||
{
|
||||
cost: 225e6,
|
||||
mults: {str: 1.3, dex: 1.3, agi: 1.3},
|
||||
name: "AWM Sniper Rifle",
|
||||
upgType: "w",
|
||||
},
|
||||
{
|
||||
cost: 2e6,
|
||||
mults: {def: 1.04},
|
||||
name: "Bulletproof Vest",
|
||||
upgType: "a",
|
||||
},
|
||||
{
|
||||
cost: 5e6,
|
||||
mults: {def: 1.08},
|
||||
name: "Full Body Armor",
|
||||
upgType: "a",
|
||||
},
|
||||
{
|
||||
cost: 25e6,
|
||||
mults: {def: 1.15, agi: 1.15},
|
||||
name: "Liquid Body Armor",
|
||||
upgType: "a",
|
||||
},
|
||||
{
|
||||
cost: 40e6,
|
||||
mults: {def: 1.2},
|
||||
name: "Graphene Plating Armor",
|
||||
upgType: "a",
|
||||
},
|
||||
{
|
||||
cost: 3e6,
|
||||
mults: {agi: 1.04, cha: 1.04},
|
||||
name: "Ford Flex V20",
|
||||
upgType: "v",
|
||||
},
|
||||
{
|
||||
cost: 9e6,
|
||||
mults: {agi: 1.08, cha: 1.08},
|
||||
name: "ATX1070 Superbike",
|
||||
upgType: "v",
|
||||
},
|
||||
{
|
||||
cost: 18e6,
|
||||
mults: {agi: 1.12, cha: 1.12},
|
||||
name: "Mercedes-Benz S9001",
|
||||
upgType: "v",
|
||||
},
|
||||
{
|
||||
cost: 30e6,
|
||||
mults: {agi: 1.16, cha: 1.16},
|
||||
name: "White Ferrari",
|
||||
upgType: "v",
|
||||
},
|
||||
{
|
||||
cost: 5e6,
|
||||
mults: {hack: 1.05},
|
||||
name: "NUKE Rootkit",
|
||||
upgType: "r",
|
||||
},
|
||||
{
|
||||
cost: 15e6,
|
||||
mults: {hack: 1.1},
|
||||
name: "Soulstealer Rootkit",
|
||||
upgType: "r",
|
||||
},
|
||||
{
|
||||
cost: 50e6,
|
||||
mults: {hack: 1.15},
|
||||
name: "Demon Rootkit",
|
||||
upgType: "r",
|
||||
},
|
||||
{
|
||||
cost: 10e9,
|
||||
mults: {str: 1.3, dex: 1.3},
|
||||
name: "Bionic Arms",
|
||||
upgType: "g",
|
||||
},
|
||||
{
|
||||
cost: 10e9,
|
||||
mults: {agi: 1.6},
|
||||
name: "Bionic Legs",
|
||||
upgType: "g",
|
||||
},
|
||||
{
|
||||
cost: 15e9,
|
||||
mults: {str: 1.15, def: 1.15, dex: 1.15, agi: 1.15},
|
||||
name: "Bionic Spine",
|
||||
upgType: "g",
|
||||
},
|
||||
{
|
||||
cost: 20e9,
|
||||
mults: {str: 1.4, def: 1.4},
|
||||
name: "BrachiBlades",
|
||||
upgType: "g",
|
||||
},
|
||||
{
|
||||
cost: 12e9,
|
||||
mults: {str: 1.2, def: 1.2},
|
||||
name: "Nanofiber Weave",
|
||||
upgType: "g",
|
||||
},
|
||||
{
|
||||
cost: 25e9,
|
||||
mults: {str: 1.5, agi: 1.5},
|
||||
name: "Synthetic Heart",
|
||||
upgType: "g",
|
||||
},
|
||||
{
|
||||
cost: 15e9,
|
||||
mults: {str: 1.3, def: 1.3},
|
||||
name: "Synfibril Muscle",
|
||||
upgType: "g",
|
||||
},
|
||||
{
|
||||
cost: 5e9,
|
||||
mults: {hack: 1.05},
|
||||
name: "BitWire",
|
||||
upgType: "g",
|
||||
},
|
||||
{
|
||||
cost: 10e9,
|
||||
mults: {hack: 1.15},
|
||||
name: "Neuralstimulator",
|
||||
upgType: "g",
|
||||
},
|
||||
{
|
||||
cost: 50e9,
|
||||
mults: {str: 1.7, def: 1.7},
|
||||
name: "Graphene Bone Lacings",
|
||||
upgType: "g",
|
||||
},
|
||||
];
|
356
src/engine.js
356
src/engine.js
@ -24,8 +24,7 @@ import {BitNodes, initBitNodes,
|
||||
import {Bladeburner} from "./Bladeburner";
|
||||
import {CharacterOverview} from "./CharacterOverview";
|
||||
import {cinematicTextFlag} from "./CinematicText";
|
||||
import {CodingContract, CodingContractRewardType,
|
||||
CodingContractTypes} from "./CodingContracts";
|
||||
import {generateRandomContract} from "./CodingContractGenerator";
|
||||
import {CompanyPositions, initCompanies} from "./Company";
|
||||
import {Corporation} from "./CompanyManagement";
|
||||
import {CONSTANTS} from "./Constants";
|
||||
@ -33,6 +32,7 @@ import {displayCreateProgramContent,
|
||||
getNumAvailableCreateProgram,
|
||||
initCreateProgramButtons,
|
||||
Programs} from "./CreateProgram";
|
||||
import {createDevMenu, closeDevMenu} from "./DevMenu";
|
||||
import {displayFactionContent, joinFaction,
|
||||
processPassiveFactionRepGain, Factions,
|
||||
inviteToFaction, initFactions} from "./Faction";
|
||||
@ -40,8 +40,6 @@ import {FconfSettings} from "./Fconf";
|
||||
import {displayLocationContent,
|
||||
initLocationButtons} from "./Location";
|
||||
import {Locations} from "./Locations";
|
||||
import {displayGangContent, updateGangContent,
|
||||
Gang} from "./Gang";
|
||||
import {displayHacknetNodesContent, processAllHacknetNodeEarnings,
|
||||
updateHacknetNodesContent} from "./HacknetNode";
|
||||
import {iTutorialStart} from "./InteractiveTutorial";
|
||||
@ -89,6 +87,7 @@ import "../css/loader.scss";
|
||||
import "../css/missions.scss";
|
||||
import "../css/companymanagement.scss";
|
||||
import "../css/bladeburner.scss";
|
||||
import "../css/gang.scss";
|
||||
|
||||
/* Shortcuts to navigate through the game
|
||||
* Alt-t - Terminal
|
||||
@ -194,41 +193,6 @@ const Engine = {
|
||||
tutorialFactionsButton: null,
|
||||
tutorialAugmentationsButton: null,
|
||||
tutorialBackButton: null,
|
||||
|
||||
//Dev menu
|
||||
devMenuGiveMoney: null,
|
||||
devMenuGiveRam: null,
|
||||
devMenuAugDropdown: null,
|
||||
devMenuAddAug: null,
|
||||
devMenuTriggerBitFlume: null,
|
||||
devMenuFactionDropdown: null,
|
||||
devMenuAddFaction: null,
|
||||
devMenuOpen: null,
|
||||
devMenuMinSecurity: null,
|
||||
devMenuMaxMoney: null,
|
||||
devMenuConnectDropdown: null,
|
||||
devMenuConnect: null,
|
||||
devMenuProgramsDropdown: null,
|
||||
devMenuAddProgram: null,
|
||||
devMenuHackingExp: null,
|
||||
devMenuAddHacking: null,
|
||||
devMenuStrengthExp: null,
|
||||
devMenuAddStrength: null,
|
||||
devMenuDefenseExp: null,
|
||||
devMenuAddDefense: null,
|
||||
devMenuDexterityExp: null,
|
||||
devMenuAddDexterity: null,
|
||||
devMenuAgilityExp: null,
|
||||
devMenuAddAgility: null,
|
||||
devMenuCharismaExp: null,
|
||||
devMenuAddCharisma: null,
|
||||
devMenuIntelligenceExp: null,
|
||||
devMenuAddIntelligence: null,
|
||||
devMenuEnableIntelligence: null,
|
||||
devMenuDisableIntelligence: null,
|
||||
devMenuSFN: null,
|
||||
devMenuSFLvl: null,
|
||||
devMenuAddSF: null,
|
||||
},
|
||||
|
||||
//Display objects
|
||||
@ -254,7 +218,6 @@ const Engine = {
|
||||
factionAugmentationsContent: null,
|
||||
augmentationsContent: null,
|
||||
tutorialContent: null,
|
||||
devMenuContent: null,
|
||||
infiltrationContent: null,
|
||||
stockMarketContent: null,
|
||||
locationContent: null,
|
||||
@ -365,8 +328,7 @@ const Engine = {
|
||||
|
||||
loadDevMenuContent: function() {
|
||||
Engine.hideAllContent();
|
||||
Engine.Display.devMenuContent.style.display = "block";
|
||||
Engine.displayDevMenuContent();
|
||||
createDevMenu();
|
||||
routing.navigateTo(Page.DevMenu);
|
||||
document.getElementById("dev-menu-link").classList.add("active");
|
||||
},
|
||||
@ -456,7 +418,7 @@ const Engine = {
|
||||
loadGangContent: function() {
|
||||
Engine.hideAllContent();
|
||||
if (document.getElementById("gang-container") || Player.inGang()) {
|
||||
displayGangContent();
|
||||
Player.gang.displayGangContent(Player);
|
||||
routing.navigateTo(Page.Gang);
|
||||
} else {
|
||||
Engine.loadTerminalContent();
|
||||
@ -507,7 +469,6 @@ const Engine = {
|
||||
Engine.Display.factionAugmentationsContent.style.display = "none";
|
||||
Engine.Display.augmentationsContent.style.display = "none";
|
||||
Engine.Display.tutorialContent.style.display = "none";
|
||||
Engine.Display.devMenuContent.style.display = "none";
|
||||
Engine.Display.locationContent.style.display = "none";
|
||||
Engine.Display.workInProgressContent.style.display = "none";
|
||||
Engine.Display.redPillContent.style.display = "none";
|
||||
@ -519,6 +480,9 @@ const Engine = {
|
||||
document.getElementById("gang-container").style.display = "none";
|
||||
}
|
||||
|
||||
if (Player.inGang()) {
|
||||
Player.gang.clearUI();
|
||||
}
|
||||
if (Player.corporation instanceof Corporation) {
|
||||
Player.corporation.clearUI();
|
||||
}
|
||||
@ -551,12 +515,14 @@ const Engine = {
|
||||
document.getElementById("bladeburner-menu-link").classList.remove("active");
|
||||
document.getElementById("corporation-menu-link").classList.remove("active");
|
||||
document.getElementById("gang-menu-link").classList.remove("active");
|
||||
|
||||
// Close dev menu
|
||||
closeDevMenu();
|
||||
},
|
||||
|
||||
displayCharacterOverviewInfo: function() {
|
||||
Engine.overview.update();
|
||||
|
||||
|
||||
const save = document.getElementById("character-overview-save-button");
|
||||
const flashClass = "flashing-button";
|
||||
if(!Settings.AutosaveInterval) {
|
||||
@ -844,43 +810,6 @@ const Engine = {
|
||||
document.getElementById("tutorial-text").style.display = "none";
|
||||
},
|
||||
|
||||
displayDevMenuContent: function() {
|
||||
Engine.Clickables.devMenuGiveMoney.style.display = "block";
|
||||
Engine.Clickables.devMenuGiveRam.style.display = "block";
|
||||
Engine.Clickables.devMenuAugDropdown.style.display = "block";
|
||||
Engine.Clickables.devMenuAddAug.style.display = "block";
|
||||
Engine.Clickables.devMenuTriggerBitFlume.style.display = "block";
|
||||
Engine.Clickables.devMenuFactionDropdown.style.display = "block";
|
||||
Engine.Clickables.devMenuAddFaction.style.display = "block";
|
||||
Engine.Clickables.devMenuOpen.style.display = "block";
|
||||
Engine.Clickables.devMenuMinSecurity.style.display = "block";
|
||||
Engine.Clickables.devMenuMaxMoney.style.display = "block";
|
||||
Engine.Clickables.devMenuConnectDropdown.style.display = "block";
|
||||
Engine.Clickables.devMenuConnect.style.display = "block";
|
||||
Engine.Clickables.devMenuProgramsDropdown.style.display = "block";
|
||||
Engine.Clickables.devMenuAddProgram.style.display = "block";
|
||||
|
||||
Engine.Clickables.devMenuHackingExp.style.display = "block";
|
||||
Engine.Clickables.devMenuAddHacking.style.display = "block";
|
||||
Engine.Clickables.devMenuStrengthExp.style.display = "block";
|
||||
Engine.Clickables.devMenuAddStrength.style.display = "block";
|
||||
Engine.Clickables.devMenuDefenseExp.style.display = "block";
|
||||
Engine.Clickables.devMenuAddDefense.style.display = "block";
|
||||
Engine.Clickables.devMenuDexterityExp.style.display = "block";
|
||||
Engine.Clickables.devMenuAddDexterity.style.display = "block";
|
||||
Engine.Clickables.devMenuAgilityExp.style.display = "block";
|
||||
Engine.Clickables.devMenuAddAgility.style.display = "block";
|
||||
Engine.Clickables.devMenuCharismaExp.style.display = "block";
|
||||
Engine.Clickables.devMenuAddCharisma.style.display = "block";
|
||||
Engine.Clickables.devMenuIntelligenceExp.style.display = "block";
|
||||
Engine.Clickables.devMenuAddIntelligence.style.display = "block";
|
||||
Engine.Clickables.devMenuEnableIntelligence.style.display = "block";
|
||||
Engine.Clickables.devMenuDisableIntelligence.style.display = "block";
|
||||
Engine.Clickables.devMenuSFN.style.display = "block";
|
||||
Engine.Clickables.devMenuSFLvl.style.display = "block";
|
||||
Engine.Clickables.devMenuAddSF.style.display = "block";
|
||||
},
|
||||
|
||||
//Displays the text when a section of the Tutorial is opened
|
||||
displayTutorialPage: function(text) {
|
||||
document.getElementById("tutorial-getting-started-link").style.display = "none";
|
||||
@ -958,7 +887,7 @@ const Engine = {
|
||||
|
||||
//Gang, if applicable
|
||||
if (Player.bitNodeN == 2 && Player.inGang()) {
|
||||
Player.gang.process(numCycles);
|
||||
Player.gang.process(numCycles, Player);
|
||||
}
|
||||
|
||||
//Mission
|
||||
@ -1075,8 +1004,8 @@ const Engine = {
|
||||
}
|
||||
|
||||
if (Engine.Counters.updateDisplaysLong <= 0) {
|
||||
if (routing.isOn(Page.Gang)) {
|
||||
updateGangContent();
|
||||
if (routing.isOn(Page.Gang) && Player.inGang()) {
|
||||
Player.gang.updateGangContent();
|
||||
} else if (routing.isOn(Page.ScriptEditor)) {
|
||||
updateScriptEditorContent();
|
||||
}
|
||||
@ -1159,71 +1088,7 @@ const Engine = {
|
||||
if (Engine.Counters.contractGeneration <= 0) {
|
||||
// X% chance of a contract being generated
|
||||
if (Math.random() <= 0.25) {
|
||||
// First select a random problem type
|
||||
const problemTypes = Object.keys(CodingContractTypes);
|
||||
let randIndex = getRandomInt(0, problemTypes.length - 1);
|
||||
let problemType = problemTypes[randIndex];
|
||||
|
||||
// Then select a random reward type. 'Money' will always be the last reward type
|
||||
var reward = {};
|
||||
reward.type = getRandomInt(0, CodingContractRewardType.Money);
|
||||
|
||||
// Change type based on certain conditions
|
||||
var factionsThatAllowHacking = Player.factions.filter((fac) => {
|
||||
try {
|
||||
return Factions[fac].getInfo().offerHackingWork;
|
||||
} catch (e) {
|
||||
console.error(`Error when trying to filter Hacking Factions for Coding Contract Generation: ${e}`);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
if (reward.type === CodingContractRewardType.FactionReputation && factionsThatAllowHacking.length === 0) {
|
||||
reward.type = CodingContractRewardType.CompanyReputation;
|
||||
}
|
||||
if (reward.type === CodingContractRewardType.FactionReputationAll && factionsThatAllowHacking.length === 0) {
|
||||
reward.type = CodingContractRewardType.CompanyReputation;
|
||||
}
|
||||
if (reward.type === CodingContractRewardType.CompanyReputation && Player.companyName === "") {
|
||||
reward.type = CodingContractRewardType.Money;
|
||||
}
|
||||
|
||||
// Add additional information based on the reward type
|
||||
switch (reward.type) {
|
||||
case CodingContractRewardType.FactionReputation:
|
||||
// Get a random faction that player is a part of. That
|
||||
// faction must allow hacking contracts
|
||||
var numFactions = factionsThatAllowHacking.length;
|
||||
var randFaction = factionsThatAllowHacking[getRandomInt(0, numFactions - 1)];
|
||||
reward.name = randFaction;
|
||||
break;
|
||||
case CodingContractRewardType.CompanyReputation:
|
||||
if (Player.companyName !== "") {
|
||||
reward.name = Player.companyName;
|
||||
} else {
|
||||
reward.type = CodingContractRewardType.Money;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// Choose random server
|
||||
const servers = Object.keys(AllServers);
|
||||
randIndex = getRandomInt(0, servers.length - 1);
|
||||
var randServer = AllServers[servers[randIndex]];
|
||||
while (randServer.purchasedByPlayer === true) {
|
||||
randIndex = getRandomInt(0, servers.length - 1);
|
||||
randServer = AllServers[servers[randIndex]];
|
||||
}
|
||||
|
||||
let contractFn = `contract-${getRandomInt(0, 1e6)}`;
|
||||
while (randServer.contracts.filter((c) => {return c.fn === contractFn}).length > 0) {
|
||||
contractFn = `contract-${getRandomInt(0, 1e6)}`;
|
||||
}
|
||||
if (reward.name) { contractFn += `-${reward.name.replace(/\s/g, "")}`; }
|
||||
let contract = new CodingContract(contractFn, problemType, reward);
|
||||
|
||||
randServer.addContract(contract);
|
||||
generateRandomContract();
|
||||
}
|
||||
Engine.Counters.contractGeneration = 3000;
|
||||
}
|
||||
@ -1383,7 +1248,7 @@ const Engine = {
|
||||
|
||||
//Gang progress for BitNode 2
|
||||
if (Player.bitNodeN != null && Player.bitNodeN === 2 && Player.inGang()) {
|
||||
Player.gang.process(numCyclesOffline);
|
||||
Player.gang.process(numCyclesOffline, Player);
|
||||
}
|
||||
|
||||
//Bladeburner offline progress
|
||||
@ -1525,9 +1390,6 @@ const Engine = {
|
||||
Engine.Display.tutorialContent = document.getElementById("tutorial-container");
|
||||
Engine.Display.tutorialContent.style.display = "none";
|
||||
|
||||
Engine.Display.devMenuContent = document.getElementById("dev-menu-container");
|
||||
Engine.Display.devMenuContent.style.display = "none";
|
||||
|
||||
Engine.Display.infiltrationContent = document.getElementById("infiltration-container");
|
||||
Engine.Display.infiltrationContent.style.display = "none";
|
||||
|
||||
@ -1614,190 +1476,6 @@ const Engine = {
|
||||
Engine.Clickables.tutorialBackButton.addEventListener("click", function() {
|
||||
Engine.displayTutorialContent();
|
||||
});
|
||||
|
||||
// dev menu buttons
|
||||
Engine.Clickables.devMenuGiveMoney = document.getElementById("dev-need-money");
|
||||
Engine.Clickables.devMenuGiveMoney.addEventListener("click", function() {
|
||||
Player.gainMoney(1e15);
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuGiveRam = document.getElementById("dev-need-ram");
|
||||
Engine.Clickables.devMenuGiveRam.addEventListener("click", function() {
|
||||
Player.getHomeComputer().maxRam *= 2;
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuAugDropdown = document.getElementById("dev-menu-aug-dropdown");
|
||||
const augDD = Engine.Clickables.devMenuAugDropdown;
|
||||
for(const i in AugmentationNames) {
|
||||
augDD.options[augDD.options.length] = new Option(AugmentationNames[i], AugmentationNames[i]);
|
||||
}
|
||||
|
||||
Engine.Clickables.devMenuAddAug = document.getElementById("dev-add-aug");
|
||||
Engine.Clickables.devMenuAddAug.addEventListener("click", function() {
|
||||
Player.queueAugmentation(augDD.options[augDD.selectedIndex].value);
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuTriggerBitFlume = document.getElementById("dev-bit-flume");
|
||||
Engine.Clickables.devMenuTriggerBitFlume.addEventListener("click", function() {
|
||||
hackWorldDaemon(Player.bitNodeN, true);
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuFactionDropdown = document.getElementById("dev-menu-faction-dropdown");
|
||||
const facDD = Engine.Clickables.devMenuFactionDropdown;
|
||||
for(const i in Factions) {
|
||||
facDD.options[facDD.options.length] = new Option(Factions[i].name, Factions[i].name);
|
||||
}
|
||||
|
||||
Engine.Clickables.devMenuAddFaction = document.getElementById("dev-add-faction");
|
||||
Engine.Clickables.devMenuAddFaction.addEventListener("click", function() {
|
||||
const factionName = facDD.options[facDD.selectedIndex].value;
|
||||
Player.receiveInvite(factionName);
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuOpen = document.getElementById("dev-open-all");
|
||||
Engine.Clickables.devMenuOpen.addEventListener("click", function() {
|
||||
for(const i in AllServers) {
|
||||
AllServers[i].hasAdminRights = true;
|
||||
AllServers[i].sshPortOpen = true;
|
||||
AllServers[i].ftpPortOpen = true;
|
||||
AllServers[i].smtpPortOpen = true;
|
||||
AllServers[i].httpPortOpen = true;
|
||||
AllServers[i].sqlPortOpen = true;
|
||||
AllServers[i].openPortCount = 5;
|
||||
}
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuMinSecurity = document.getElementById("dev-min-security");
|
||||
Engine.Clickables.devMenuMinSecurity.addEventListener("click", function() {
|
||||
for(const i in AllServers) {
|
||||
AllServers[i].hackDifficulty = AllServers[i].minDifficulty;
|
||||
}
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuMaxMoney = document.getElementById("dev-max-money");
|
||||
Engine.Clickables.devMenuMaxMoney.addEventListener("click", function() {
|
||||
for(const i in AllServers) {
|
||||
AllServers[i].moneyAvailable = AllServers[i].moneyMax;
|
||||
}
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuConnectDropdown = document.getElementById("dev-menu-connect-dropdown");
|
||||
const connectDD = Engine.Clickables.devMenuConnectDropdown;
|
||||
for(const i in AllServers) {
|
||||
connectDD.options[connectDD.options.length] = new Option(AllServers[i].hostname, AllServers[i].hostname);
|
||||
}
|
||||
|
||||
Engine.Clickables.devMenuConnect = document.getElementById("dev-connect");
|
||||
Engine.Clickables.devMenuConnect.addEventListener("click", function() {
|
||||
const host = connectDD.options[connectDD.selectedIndex].value;
|
||||
Terminal.connectToServer(host);
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuProgramsDropdown = document.getElementById("dev-menu-add-program-dropdown");
|
||||
const programsDD = Engine.Clickables.devMenuProgramsDropdown;
|
||||
for(const i in Programs) {
|
||||
programsDD.options[programsDD.options.length] = new Option(Programs[i].name, Programs[i].name);
|
||||
}
|
||||
|
||||
Engine.Clickables.devMenuAddProgram = document.getElementById("dev-add-program");
|
||||
Engine.Clickables.devMenuAddProgram.addEventListener("click", function() {
|
||||
const program = programsDD.options[programsDD.selectedIndex].value;
|
||||
if(!Player.hasProgram(program)) {
|
||||
Player.getHomeComputer().programs.push(program);
|
||||
}
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuHackingExp = document.getElementById("dev-hacking-exp");
|
||||
Engine.Clickables.devMenuAddHacking = document.getElementById("dev-add-hacking");
|
||||
Engine.Clickables.devMenuAddHacking.addEventListener("click", function() {
|
||||
const exp = parseInt(Engine.Clickables.devMenuHackingExp.value);
|
||||
Player.gainHackingExp(exp);
|
||||
Player.updateSkillLevels();
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuStrengthExp = document.getElementById("dev-strength-exp");
|
||||
Engine.Clickables.devMenuAddStrength = document.getElementById("dev-add-strength");
|
||||
Engine.Clickables.devMenuAddStrength.addEventListener("click", function() {
|
||||
const exp = parseInt(Engine.Clickables.devMenuStrengthExp.value);
|
||||
Player.gainStrengthExp(exp);
|
||||
Player.updateSkillLevels();
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuDefenseExp = document.getElementById("dev-defense-exp");
|
||||
Engine.Clickables.devMenuAddDefense = document.getElementById("dev-add-defense");
|
||||
Engine.Clickables.devMenuAddDefense.addEventListener("click", function() {
|
||||
const exp = parseInt(Engine.Clickables.devMenuDefenseExp.value);
|
||||
Player.gainDefenseExp(exp);
|
||||
Player.updateSkillLevels();
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuDexterityExp = document.getElementById("dev-dexterity-exp");
|
||||
Engine.Clickables.devMenuAddDexterity = document.getElementById("dev-add-dexterity");
|
||||
Engine.Clickables.devMenuAddDexterity.addEventListener("click", function() {
|
||||
const exp = parseInt(Engine.Clickables.devMenuDexterityExp.value);
|
||||
Player.gainDexterityExp(exp);
|
||||
Player.updateSkillLevels();
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuAgilityExp = document.getElementById("dev-agility-exp");
|
||||
Engine.Clickables.devMenuAddAgility = document.getElementById("dev-add-agility");
|
||||
Engine.Clickables.devMenuAddAgility.addEventListener("click", function() {
|
||||
const exp = parseInt(Engine.Clickables.devMenuAgilityExp.value);
|
||||
Player.gainAgilityExp(exp);
|
||||
Player.updateSkillLevels();
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuCharismaExp = document.getElementById("dev-charisma-exp");
|
||||
Engine.Clickables.devMenuAddCharisma = document.getElementById("dev-add-charisma");
|
||||
Engine.Clickables.devMenuAddCharisma.addEventListener("click", function() {
|
||||
const exp = parseInt(Engine.Clickables.devMenuCharismaExp.value);
|
||||
Player.gainCharismaExp(exp);
|
||||
Player.updateSkillLevels();
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuIntelligenceExp = document.getElementById("dev-intelligence-exp");
|
||||
Engine.Clickables.devMenuAddIntelligence = document.getElementById("dev-add-intelligence");
|
||||
Engine.Clickables.devMenuAddIntelligence.addEventListener("click", function() {
|
||||
const exp = parseInt(Engine.Clickables.devMenuIntelligenceExp.value);
|
||||
Player.gainIntelligenceExp(exp);
|
||||
Player.updateSkillLevels();
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuEnableIntelligence = document.getElementById("dev-enable-intelligence");
|
||||
Engine.Clickables.devMenuEnableIntelligence.addEventListener("click", function() {
|
||||
Player.intelligence = 1;
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuDisableIntelligence = document.getElementById("dev-disable-intelligence");
|
||||
Engine.Clickables.devMenuDisableIntelligence.addEventListener("click", function() {
|
||||
Player.intelligence = 0;
|
||||
});
|
||||
|
||||
Engine.Clickables.devMenuSFN = document.getElementById("dev-sf-n");
|
||||
Engine.Clickables.devMenuSFLvl = document.getElementById("dev-sf-lvl");
|
||||
Engine.Clickables.devMenuAddSF = document.getElementById("dev-add-source-file");
|
||||
Engine.Clickables.devMenuAddSF.addEventListener("click", function() {
|
||||
const sfN = parseInt(Engine.Clickables.devMenuSFN.value);
|
||||
const sfLvl = parseInt(Engine.Clickables.devMenuSFLvl.value);
|
||||
let sfIndex = -1;
|
||||
for(const i in Player.sourceFiles) {
|
||||
if(Player.sourceFiles[i].n === sfN) {
|
||||
sfIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(sfIndex === -1) { // add fresh source file
|
||||
Player.sourceFiles.push(new PlayerOwnedSourceFile(sfN, sfLvl));
|
||||
} else if(sfLvl === 0) { // remove a source file.
|
||||
if(sfIndex === -1) { // doesn't have it anyway.
|
||||
return;
|
||||
}
|
||||
Player.sourceFiles.splice(sfIndex, 1);
|
||||
} else { // set source file level
|
||||
Player.sourceFiles[sfIndex].lvl=sfLvl;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/* Initialization */
|
||||
@ -1899,7 +1577,7 @@ const Engine = {
|
||||
this.classList.toggle("opened");
|
||||
const elems = [tutorial, options];
|
||||
const links = [tutorialLink, optionsLink];
|
||||
if(process.env.NODE_ENV === "development") {
|
||||
if (process.env.NODE_ENV === "development") {
|
||||
elems.push(document.getElementById("dev-tab"));
|
||||
links.push(document.getElementById("dev-menu-link"));
|
||||
}
|
||||
|
@ -490,58 +490,6 @@ if (htmlWebpackPlugin.options.googleAnalytics.trackingId) { %>
|
||||
<p id="tutorial-text"> </p>
|
||||
</div>
|
||||
|
||||
<!-- dev menu -->
|
||||
<div id="dev-menu-container" class="generic-menupage-container">
|
||||
<p id="dev-menu-text">If you see this menu you can pretty much break the game. It's recommended that you use this menu only to setup a save file appropriate to test a new feature or bug fix.</p>
|
||||
|
||||
<p id="dev-menu-text">Generic</p>
|
||||
<a id="dev-need-money" class="a-link-button">Add $1000t</a>
|
||||
<a id="dev-need-ram" class="a-link-button">Double home RAM</a>
|
||||
|
||||
<p id="dev-menu-text">Augmentation related: </p>
|
||||
<!-- gets populated with the list of all augments -->
|
||||
<select id="dev-menu-aug-dropdown" class="dropdown"></select>
|
||||
<a id="dev-add-aug" class="a-link-button tooltip">Queue Augmentation<span class="tooltiptext">May require save + reload</span></a>
|
||||
|
||||
<input id="dev-sf-n" type="number" class="text-input" placeholder="SourceFile-N"><input id="dev-sf-lvl" type="number" class="text-input" placeholder="SourceFile-Lvl"><a id="dev-add-source-file" class="a-link-button tooltip"> Add/Remove source file <span class="tooltiptext">If Lvl == 0 the sf will be removed, calling it with another level will replace your current source file. You CAN set a source file higher than it's maximum level.</span></a>
|
||||
|
||||
<p id="dev-menu-text">Faction related: </p>
|
||||
<select id="dev-menu-faction-dropdown" class="dropdown"></select>
|
||||
<a id="dev-add-faction" class="a-link-button tooltip">Receive invite<span class="tooltiptext">May require save + reload</span></a>
|
||||
|
||||
<p id="dev-menu-text">Program related: </p>
|
||||
<select id="dev-menu-connect-dropdown" class="dropdown"></select>
|
||||
<a id="dev-connect" class="a-link-button tooltip">Connect<span class="tooltiptext">Connect to the target server.</span></a>
|
||||
|
||||
<select id="dev-menu-add-program-dropdown" class="dropdown"></select>
|
||||
<a id="dev-add-program" class="a-link-button tooltip">Add Program<span class="tooltiptext">Add this program to the player home server, won't add the same program twice.</span></a>
|
||||
|
||||
<a id="dev-bit-flume" class="a-link-button tooltip">Trigger BitFlume<span class="tooltiptext">Quick escape to change BN, does not give SFs</span></a>
|
||||
|
||||
<p id="dev-menu-text">Server related: </p>
|
||||
<a id="dev-open-all" class="a-link-button tooltip">NUKE + ports all servers<span class="tooltiptext">Opens all ports, nukes all servers, gains root access to everything (still need the appropriate hacking level)</span></a>
|
||||
<a id="dev-min-security" class="a-link-button tooltip">minimize all servers security<span class="tooltiptext">All servers security will be set to their minimum security</span></a>
|
||||
<a id="dev-max-money" class="a-link-button tooltip">maximize all servers money<span class="tooltiptext">Set all servers available money to maximum for that server</span></a>
|
||||
|
||||
<p id="dev-menu-text">Exp/stats related: </p>
|
||||
<input id="dev-hacking-exp" type="number" class="text-input" placeholder="+exp/-exp (int)">
|
||||
<a id="dev-add-hacking" class="a-link-button tooltip">add hacking exp<span class="tooltiptext">Add that many hacking experience point, use negative numbers to remove, don't worry about going under 0 exp</span></a>
|
||||
<input id="dev-strength-exp" type="number" class="text-input" placeholder="+exp/-exp (int)">
|
||||
<a id="dev-add-strength" class="a-link-button tooltip">add strength exp<span class="tooltiptext">Add that many strength experience point, use negative numbers to remove, don't worry about going under 0 exp</span></a>
|
||||
<input id="dev-defense-exp" type="number" class="text-input" placeholder="+exp/-exp (int)">
|
||||
<a id="dev-add-defense" class="a-link-button tooltip">add defense exp<span class="tooltiptext">Add that many defense experience point, use negative numbers to remove, don't worry about going under 0 exp</span></a>
|
||||
<input id="dev-dexterity-exp" type="number" class="text-input" placeholder="+exp/-exp (int)">
|
||||
<a id="dev-add-dexterity" class="a-link-button tooltip">add dexterity exp<span class="tooltiptext">Add that many dexterity experience point, use negative numbers to remove, don't worry about going under 0 exp</span></a>
|
||||
<input id="dev-agility-exp" type="number" class="text-input" placeholder="+exp/-exp (int)">
|
||||
<a id="dev-add-agility" class="a-link-button tooltip">add agility exp<span class="tooltiptext">Add that many agility experience point, use negative numbers to remove, don't worry about going under 0 exp</span></a>
|
||||
<input id="dev-charisma-exp" type="number" class="text-input" placeholder="+exp/-exp (int)">
|
||||
<a id="dev-add-charisma" class="a-link-button tooltip">add charisma exp<span class="tooltiptext">Add that many charisma experience point, use negative numbers to remove, don't worry about going under 0 exp</span></a>
|
||||
<input id="dev-intelligence-exp" type="number" class="text-input" placeholder="+exp/-exp (int)">
|
||||
<a id="dev-add-intelligence" class="a-link-button tooltip">add intelligence exp<span class="tooltiptext">Add that many intelligence experience point, use negative numbers to remove, don't worry about going under 0 exp</span></a>
|
||||
<a id="dev-enable-intelligence" class="a-link-button tooltip"> enable intelligence<span class="tooltiptext">Enables the intelligence stat</span></a>
|
||||
<a id="dev-disable-intelligence" class="a-link-button tooltip"> disable intelligence<span class="tooltiptext">Disables the intelligence stat</span></a>
|
||||
</div>
|
||||
|
||||
<!-- Location (visiting a location in World) -->
|
||||
<div id="location-container" class="generic-menupage-container">
|
||||
<a id="location-return-to-world-button" class="a-link-button"> Return to World </a>
|
||||
|
@ -65,7 +65,8 @@ function infiltrationBoxCreate(inst) {
|
||||
var selector = document.getElementById("infiltration-faction-select");
|
||||
selector.innerHTML = "";
|
||||
for (let i = 0; i < Player.factions.length; ++i) {
|
||||
if (Player.factions[i] === "Bladeburners") {continue;}
|
||||
if (Player.factions[i] === "Bladeburners") { continue; }
|
||||
if (Player.inGang() && Player.gang.facName === Player.factions[i]) { continue; }
|
||||
selector.innerHTML += "<option value='" + Player.factions[i] +
|
||||
"'>" + Player.factions[i] + "</option>";
|
||||
}
|
||||
|
@ -27,4 +27,6 @@ export const KEY: IMap<number> = {
|
||||
U: 85,
|
||||
UPARROW: 38,
|
||||
W: 87,
|
||||
"1": 49,
|
||||
"2": 50,
|
||||
};
|
||||
|
@ -66,6 +66,7 @@ interface ICreateElementStyleOptions {
|
||||
interface ICreateElementTooltipOptions {
|
||||
tooltip?: string;
|
||||
tooltipleft?: string;
|
||||
tooltipsmall?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -216,6 +217,12 @@ function setElementTooltip(el: HTMLElement, params: ICreateElementTooltipOptions
|
||||
class: "tooltiptextleft",
|
||||
innerHTML: params.tooltipleft,
|
||||
}));
|
||||
} else if (params.tooltipsmall !== undefined) {
|
||||
el.className += " tooltip";
|
||||
el.appendChild(createElement("span", {
|
||||
class: "tooltiptext smallfont",
|
||||
innerHTML: params.tooltipsmall,
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user