mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2026-04-16 14:28:36 +02:00
Compare commits
319 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a00c253dcb | ||
|
|
123628ec0b | ||
|
|
cae28e2d25 | ||
|
|
486d025572 | ||
|
|
d4816ad0c4 | ||
|
|
e7dbc08e18 | ||
|
|
0483c809ff | ||
|
|
cd972dabe3 | ||
|
|
e2a353fc8a | ||
|
|
1b8214b6fa | ||
|
|
af584e8c87 | ||
|
|
250841df66 | ||
|
|
d9aef91ea3 | ||
|
|
c285d494b9 | ||
|
|
316a1aa475 | ||
|
|
56a3660d38 | ||
|
|
e1aec379c1 | ||
|
|
381ea915f7 | ||
|
|
619db14622 | ||
|
|
84423e6309 | ||
|
|
1d2136da4b | ||
|
|
56441b8e34 | ||
|
|
5106315128 | ||
|
|
6ca7f10faf | ||
|
|
56802fc85e | ||
|
|
700583a739 | ||
|
|
a290b0bef5 | ||
|
|
79a06dd91c | ||
|
|
6cd6f28820 | ||
|
|
dabb5016fc | ||
|
|
58e38faad6 | ||
|
|
31e8ca8c8d | ||
|
|
c72519e3ea | ||
|
|
58333c1b46 | ||
|
|
f0ad090cdc | ||
|
|
4bd1fce1f6 | ||
|
|
b35e25e5dc | ||
|
|
a8bb345c88 | ||
|
|
bbe4f9c286 | ||
|
|
f9dcefd6ea | ||
|
|
44c2bab557 | ||
|
|
fbca5a4d8f | ||
|
|
c2ceaa9bdd | ||
|
|
dc402bef68 | ||
|
|
64272c99fb | ||
|
|
c8377c0bb3 | ||
|
|
4145ddad39 | ||
|
|
e9dfe3c389 | ||
|
|
f9162e4d30 | ||
|
|
b97fab2bf4 | ||
|
|
3c9ebb75fe | ||
|
|
434a522429 | ||
|
|
49fa63971b | ||
|
|
8dfc563c86 | ||
|
|
dded9103cb | ||
|
|
741f57e9e2 | ||
|
|
59cf1d5baf | ||
|
|
916ef06913 | ||
|
|
91ee65a101 | ||
|
|
042f926700 | ||
|
|
c0432359c3 | ||
|
|
fbf5545708 | ||
|
|
6ae7b0136c | ||
|
|
200ccd3ad0 | ||
|
|
31f97f74fd | ||
|
|
4cabd2e4ed | ||
|
|
8be7fa9157 | ||
|
|
8ddf7dfbd4 | ||
|
|
571ddb109a | ||
|
|
b2772bbfc1 | ||
|
|
57815ac6a0 | ||
|
|
758f329d14 | ||
|
|
096f984d6b | ||
|
|
06cd584f10 | ||
|
|
4f2f75762c | ||
|
|
d94516f39b | ||
|
|
b479a3570e | ||
|
|
ac49b8074f | ||
|
|
7a49a5b3e8 | ||
|
|
6d9e6e6466 | ||
|
|
2d179199ed | ||
|
|
dc928828e2 | ||
|
|
658df9fb01 | ||
|
|
44bf3cb101 | ||
|
|
b82d7c12af | ||
|
|
4476d6b258 | ||
|
|
433b399de9 | ||
|
|
58d04c0cbb | ||
|
|
e3a74f23a1 | ||
|
|
3a374de210 | ||
|
|
4cc6437408 | ||
|
|
821725cf4d | ||
|
|
931de230ae | ||
|
|
7301946236 | ||
|
|
a15041da75 | ||
|
|
00f8c0a51f | ||
|
|
63483837bc | ||
|
|
dc5f4e6694 | ||
|
|
35f8a5115a | ||
|
|
8398fd47f0 | ||
|
|
9d7c869c0a | ||
|
|
74587f269e | ||
|
|
6a3ffff3ad | ||
|
|
2f8eac07ee | ||
|
|
3eaefa01f9 | ||
|
|
b250af913d | ||
|
|
0b4968d148 | ||
|
|
8817d179c6 | ||
|
|
e5e3fec1a9 | ||
|
|
eecb0c0f01 | ||
|
|
d45689c7df | ||
|
|
2201dfc371 | ||
|
|
3ef9042051 | ||
|
|
1236ad252b | ||
|
|
65331ab22e | ||
|
|
c485fdfa87 | ||
|
|
6effda29a9 | ||
|
|
7035154454 | ||
|
|
d7f3ab9177 | ||
|
|
3660dde75f | ||
|
|
99688b78c7 | ||
|
|
6841f24932 | ||
|
|
9f94d0838a | ||
|
|
086fc67ecc | ||
|
|
a2551f98c2 | ||
|
|
95c928afc9 | ||
|
|
8a00e6e532 | ||
|
|
287a97aea6 | ||
|
|
664267bff0 | ||
|
|
2597b33f81 | ||
|
|
9442b348e6 | ||
|
|
3b7f9c9fb0 | ||
|
|
20ca7533b0 | ||
|
|
15a324a946 | ||
|
|
94175877d7 | ||
|
|
c1ec3c5eba | ||
|
|
42804b0cd3 | ||
|
|
b1248521f3 | ||
|
|
b744997c72 | ||
|
|
2d37409392 | ||
|
|
bd02e724e5 | ||
|
|
fef7aaba8f | ||
|
|
1775ea86ff | ||
|
|
b0918d7bd3 | ||
|
|
29e0ce5f96 | ||
|
|
44c26165f4 | ||
|
|
9dd68947f1 | ||
|
|
db5fdb1fcb | ||
|
|
74e72854d8 | ||
|
|
ece246b391 | ||
|
|
cdb5dfec62 | ||
|
|
8a5b6f6cbc | ||
|
|
585e1ac7aa | ||
|
|
8726946d4a | ||
|
|
064008d200 | ||
|
|
d955280f90 | ||
|
|
580a7fac24 | ||
|
|
9df054dd0c | ||
|
|
8fa7b112e1 | ||
|
|
dd9df0a18c | ||
|
|
3a601a015d | ||
|
|
87b4698d5b | ||
|
|
67632ced09 | ||
|
|
d7fb335815 | ||
|
|
4809a21e38 | ||
|
|
6b3646e981 | ||
|
|
0c64bf470a | ||
|
|
99e034921e | ||
|
|
7a3a3de7d1 | ||
|
|
f91c5bd7b9 | ||
|
|
bcb198220d | ||
|
|
bf1af6a68c | ||
|
|
3dd2975c61 | ||
|
|
33f1e0cb3c | ||
|
|
7514f63dcd | ||
|
|
b6ff73391d | ||
|
|
369ea8d381 | ||
|
|
a7296c512c | ||
|
|
8f70817c10 | ||
|
|
7417fb6ef8 | ||
|
|
d044739f1c | ||
|
|
3d1684f825 | ||
|
|
f6af9e94ab | ||
|
|
215cf59e0b | ||
|
|
0d14cd6e7e | ||
|
|
98a04e4932 | ||
|
|
8d33c5b571 | ||
|
|
221b81d802 | ||
|
|
df89cc5002 | ||
|
|
3b6b37f8a6 | ||
|
|
cf2acb8844 | ||
|
|
2e9b028174 | ||
|
|
c56645c794 | ||
|
|
3ce2e83dd8 | ||
|
|
3241945452 | ||
|
|
fb857642e8 | ||
|
|
cc0e6548ff | ||
|
|
6c3c569a44 | ||
|
|
b5ebbba43d | ||
|
|
bf9b837e31 | ||
|
|
7f88ade30e | ||
|
|
36499ae9f2 | ||
|
|
4b95ba9ed1 | ||
|
|
804e4c23e3 | ||
|
|
b6b6d8e9fa | ||
|
|
c566c838be | ||
|
|
51d9274626 | ||
|
|
c8b478c208 | ||
|
|
18a3f061b4 | ||
|
|
3f8b9e4a32 | ||
|
|
e63ad76701 | ||
|
|
cb66ad9628 | ||
|
|
971bfbada4 | ||
|
|
b646c15521 | ||
|
|
92f7d12c0e | ||
|
|
7172f4e527 | ||
|
|
5592a8bc96 | ||
|
|
c4cb7daac5 | ||
|
|
75bc34208c | ||
|
|
83fc4d81b2 | ||
|
|
3cf18f100a | ||
|
|
8fbb072596 | ||
|
|
ea7f0752cb | ||
|
|
0f8f572519 | ||
|
|
52b6defebd | ||
|
|
34d749809a | ||
|
|
2ce4af2498 | ||
|
|
227bcf146e | ||
|
|
139a5add20 | ||
|
|
3a61a5cfa1 | ||
|
|
29c5c9b99d | ||
|
|
49dc9b7cb0 | ||
|
|
856d02a129 | ||
|
|
9542879f86 | ||
|
|
1034f7cac5 | ||
|
|
9a7061503a | ||
|
|
449605d330 | ||
|
|
3556d6a1ff | ||
|
|
4858dabe99 | ||
|
|
d54439be8b | ||
|
|
31e703d126 | ||
|
|
2754a644ae | ||
|
|
b7170e4ded | ||
|
|
4df6638444 | ||
|
|
d4c72474cb | ||
|
|
1c0201534b | ||
|
|
fa14bb5362 | ||
|
|
f88c585714 | ||
|
|
8514104560 | ||
|
|
5b7743967e | ||
|
|
2e9fe02023 | ||
|
|
b8bdf0da82 | ||
|
|
1f639c6a3a | ||
|
|
035cdb8b0d | ||
|
|
2ba7ac82eb | ||
|
|
96db360a36 | ||
|
|
77571543f2 | ||
|
|
3f312d0ce6 | ||
|
|
4bdb34bc7b | ||
|
|
f7fd3c859f | ||
|
|
dfd7aa2d2e | ||
|
|
0df437ef35 | ||
|
|
bedd615c0e | ||
|
|
1f4f6bd179 | ||
|
|
d75ff5d95b | ||
|
|
c3bc6a0c28 | ||
|
|
066ccf343a | ||
|
|
c973663dc2 | ||
|
|
08136524be | ||
|
|
261abdea78 | ||
|
|
b132efbded | ||
|
|
f8f4299ed5 | ||
|
|
9f715020df | ||
|
|
060e0f7bfc | ||
|
|
8df7f8de4b | ||
|
|
e6c5ff7ab7 | ||
|
|
a28fe7ab9f | ||
|
|
c3ecc189fd | ||
|
|
b4057fcb26 | ||
|
|
8470f307ac | ||
|
|
8eecb1539c | ||
|
|
5230837dad | ||
|
|
da97c1b4b9 | ||
|
|
963cb0039d | ||
|
|
3e10f5de6d | ||
|
|
6969a8f92c | ||
|
|
2198bfd962 | ||
|
|
d4d5202cbd | ||
|
|
cde2c9e615 | ||
|
|
59018d9902 | ||
|
|
c378400a10 | ||
|
|
58062bf421 | ||
|
|
f3dbdad011 | ||
|
|
d9ee715bc7 | ||
|
|
bd13234f06 | ||
|
|
fa4e98d06c | ||
|
|
cca32923e3 | ||
|
|
f2b4ae8692 | ||
|
|
a22bfb5015 | ||
|
|
18d8b2ecd4 | ||
|
|
9879d07d7c | ||
|
|
d54e39c9c6 | ||
|
|
67d083772a | ||
|
|
e6a3794849 | ||
|
|
d9c818777b | ||
|
|
473f0f1447 | ||
|
|
e1b8a23f1e | ||
|
|
8e4c7beb1a | ||
|
|
af3323a111 | ||
|
|
31ed986b8f | ||
|
|
1d07ca4ffb | ||
|
|
ddfae56e34 | ||
|
|
b0ba3b2ea4 | ||
|
|
a277810095 | ||
|
|
78c631751e | ||
|
|
610b644fb1 | ||
|
|
b26568bf7d | ||
|
|
29075acffe | ||
|
|
3d76390c2c |
6
.gitignore
vendored
6
.gitignore
vendored
@@ -3,6 +3,6 @@ Netburner.txt
|
||||
/doc/build
|
||||
/node_modules
|
||||
/dist/*.map
|
||||
/tests/*.map
|
||||
/tests/*.bundle.*
|
||||
/tests/*.css
|
||||
/test/*.map
|
||||
/test/*.bundle.*
|
||||
/test/*.css
|
||||
|
||||
14
README.md
14
README.md
@@ -1,11 +1,12 @@
|
||||
# Bitburner
|
||||
Bitburner is a cyberpunk hacking-themed incremental game. The game can be
|
||||
played at https://danielyxie.github.io/bitburner.
|
||||
Bitburner is a programming-based [incremental game](https://en.wikipedia.org/wiki/Incremental_game)
|
||||
that revolves around hacking and cyberpunk themes.
|
||||
The game can be played at https://danielyxie.github.io/bitburner.
|
||||
|
||||
# Documentation
|
||||
The game's official documentation can be found on [Read The
|
||||
Docs](http://bitburner.readthedocs.io/). Please note that this is still a
|
||||
work-in-progress and is in its early stages.
|
||||
work-in-progress.
|
||||
|
||||
The documentation is created using [Sphinx](http://www.sphinx-doc.org).
|
||||
|
||||
@@ -14,11 +15,6 @@ files](/doc/source) and then making a pull request with your contributions.
|
||||
For further guidance, please refer to the "As A Documentor" section of
|
||||
[CONTRIBUTING](CONTRIBUTING.md).
|
||||
|
||||
# Wiki
|
||||
The game's wiki can be found on [Wikia](http://bitburner.wikia.com/). Please
|
||||
note that the wiki is in the process of being deprecated. Eventually all of
|
||||
the wiki content will be moved into the Read The Docs documentation.
|
||||
|
||||
# Contribution
|
||||
There are many ways to contribute to the game. It can be as simple as fixing
|
||||
a typo, correcting a bug, or improving the UI. For guidance on doing so,
|
||||
@@ -32,4 +28,4 @@ publish, and distribute your contributions to the project. A formal
|
||||
Contributor's License Agreement will be drawn up in the future.
|
||||
|
||||
If you would like to make significant contributions to the project as a
|
||||
collaborator, please reach out to @danielyxie to help coordinate the effort.
|
||||
collaborator, please reach out to @danielyxie to help coordinate the effort.
|
||||
|
||||
126
css/activescripts.scss
Normal file
126
css/activescripts.scss
Normal file
@@ -0,0 +1,126 @@
|
||||
@import "theme";
|
||||
|
||||
.active-scripts-list {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
#active-scripts-container {
|
||||
position: fixed;
|
||||
padding-top: 10px;
|
||||
|
||||
> p {
|
||||
width: 70%;
|
||||
margin: 6px;
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.accordion-header {
|
||||
> pre {
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.active-scripts-server-header {
|
||||
background-color: #444;
|
||||
font-size: $defaultFontSize * 1.25;
|
||||
color: #fff;
|
||||
margin: 6px 6px 0 6px;
|
||||
padding: 6px;
|
||||
cursor: pointer;
|
||||
width: 60%;
|
||||
text-align: left;
|
||||
border: none;
|
||||
outline: none;
|
||||
|
||||
&:after {
|
||||
content: '\02795'; /* "plus" sign (+) */
|
||||
font-size: $defaultFontSize * 0.8125;
|
||||
color: #fff;
|
||||
float: right;
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
&.active, &:hover {
|
||||
background-color: #555;
|
||||
}
|
||||
}
|
||||
|
||||
.active-scripts-server-header.active {
|
||||
&:after {
|
||||
content: "\2796"; /* "minus" sign (-) */
|
||||
font-size: $defaultFontSize * 0.8125;
|
||||
color: #fff;
|
||||
float: right;
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background-color: #666;
|
||||
}
|
||||
}
|
||||
|
||||
.active-scripts-server-panel {
|
||||
margin: 0 6px 6px 6px;
|
||||
padding: 0 6px 6px 6px;
|
||||
width: 55%;
|
||||
margin-left: 5%;
|
||||
display: none;
|
||||
|
||||
div, ul, ul > li {
|
||||
background-color: #555;
|
||||
}
|
||||
}
|
||||
|
||||
.active-scripts-script-header {
|
||||
background-color: #555;
|
||||
border: none;
|
||||
color: var(--my-font-color);
|
||||
cursor: pointer;
|
||||
display: block;
|
||||
outline: none;
|
||||
padding: 4px 25px 4px 10px;
|
||||
position: relative;
|
||||
text-align: left;
|
||||
width: auto;
|
||||
|
||||
&:after {
|
||||
content: '\02795'; /* "plus" sign (+) */
|
||||
font-size: $defaultFontSize * 0.8125;
|
||||
float: right;
|
||||
margin-left: 5px;
|
||||
color: transparent;
|
||||
text-shadow: 0 0 0 var(--my-font-color);
|
||||
position: absolute;
|
||||
bottom: 4px;
|
||||
}
|
||||
|
||||
&.active:after {
|
||||
content: "\2796"; /* "minus" sign (-) */
|
||||
}
|
||||
|
||||
&:hover,
|
||||
&.active:hover {
|
||||
background-color: #666;
|
||||
}
|
||||
|
||||
&.active {
|
||||
background-color: #555;
|
||||
}
|
||||
}
|
||||
|
||||
.active-scripts-script-panel {
|
||||
background-color: #555;
|
||||
display: none;
|
||||
font-size: 14px;
|
||||
margin-bottom: 6px;
|
||||
padding: 0 18px;
|
||||
width: auto;
|
||||
|
||||
pre, h2, ul, li {
|
||||
background-color: #555;
|
||||
width: auto;
|
||||
color: #fff;
|
||||
margin-left: 5%;
|
||||
}
|
||||
}
|
||||
31
css/augmentations.scss
Normal file
31
css/augmentations.scss
Normal file
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* Styling for the Augmentations UI. This is the page that displays all of the
|
||||
* player's owned and purchased Augmentations and Source-Files. It also allows
|
||||
* the player to install Augmentations
|
||||
*/
|
||||
@import "theme";
|
||||
|
||||
#augmentations-container {
|
||||
position: fixed;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
#augmentations-content {
|
||||
> p {
|
||||
font-size: $defaultFontSize * 0.875;
|
||||
width: 70%;
|
||||
}
|
||||
}
|
||||
|
||||
.augmentations-list {
|
||||
button,
|
||||
div {
|
||||
color: var(--my-font-color);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
button {
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -51,6 +51,44 @@
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
/* Checkbox for (de)selecting autoleveling */
|
||||
.bbcheckbox {
|
||||
position: relative;
|
||||
display: inline;
|
||||
label {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
cursor: pointer;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
background: black;
|
||||
border-width: 1px;
|
||||
border-color: white;
|
||||
border-style: solid;
|
||||
&:after {
|
||||
content: '';
|
||||
width: 9px;
|
||||
height: 5px;
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
left: 5px;
|
||||
border: 3px solid white;
|
||||
border-top: none;
|
||||
border-right: none;
|
||||
opacity: 0;
|
||||
transform: rotate(-45deg);
|
||||
}
|
||||
}
|
||||
input[type=checkbox] {
|
||||
margin: 3px;
|
||||
visibility: hidden;
|
||||
&:checked + label:after {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Bladeburner Console */
|
||||
.bladeburner-console-div {
|
||||
display: inline-block;
|
||||
|
||||
@@ -38,6 +38,7 @@ button {
|
||||
}
|
||||
|
||||
.a-link-button-inactive,
|
||||
.std-button-disabled,
|
||||
.std-button:disabled {
|
||||
text-decoration: none;
|
||||
background-color: #333;
|
||||
@@ -47,6 +48,11 @@ button {
|
||||
border: 1px solid #333;
|
||||
cursor: default;
|
||||
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-webkit-user-select: none;
|
||||
|
||||
&:hover {
|
||||
.tooltiptext,
|
||||
.tooltiptexthigh,
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
@import "theme";
|
||||
|
||||
/**
|
||||
* Styling for the Character Overview Panel (top-right)
|
||||
* Styling for the Character Overview Panel (top-right panel)
|
||||
*/
|
||||
|
||||
#character-overview-wrapper {
|
||||
@@ -59,10 +59,16 @@
|
||||
}
|
||||
|
||||
#character-hp-wrapper { color: $my-stat-hp-color; }
|
||||
.character-hp-cell { color: $my-stat-hp-color; }
|
||||
#character-money-wrapper { color: $my-stat-money-color; }
|
||||
.character-money-cell { color: $my-stat-money-color; }
|
||||
#character-hack-wrapper { color: $my-stat-hack-color; }
|
||||
.character-hack-cell { color: $my-stat-hack-color; }
|
||||
#character-cha-wrapper { color: $my-stat-cha-color; }
|
||||
.character-cha-cell { color: $my-stat-cha-color; }
|
||||
#character-int-wrapper { color: $my-stat-int-color; }
|
||||
.character-int-cell { color: $my-stat-int-color; }
|
||||
.character-combat-cell { color: $my-stat-physical; }
|
||||
|
||||
.character-overview-btn {
|
||||
@include borderRadius(12px);
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
|
||||
#cmpy-mgmt-container p,
|
||||
#cmpy-mgmt-container a,
|
||||
#cmpy-mgmt-container div {
|
||||
#cmpy-mgmt-container div,
|
||||
#cmpy-mgmt-container br {
|
||||
font-size: $defaultFontSize * 0.8125;
|
||||
}
|
||||
|
||||
@@ -56,29 +57,33 @@
|
||||
.cmpy-mgmt-industry-left-panel,
|
||||
.cmpy-mgmt-industry-right-panel {
|
||||
display: inline-block;
|
||||
width: 45%;
|
||||
height: 100%;
|
||||
top: 10px;
|
||||
overflow-y: auto;
|
||||
overflow-x: auto;
|
||||
overflow: visible;
|
||||
top: 10px;
|
||||
width: 45%;
|
||||
}
|
||||
|
||||
.cmpy-mgmt-industry-overview-panel {
|
||||
border: 1px solid #fff;
|
||||
color: var(--my-font-color);
|
||||
display: inline-block;
|
||||
padding: 3px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.cmpy-mgmt-employee-panel {
|
||||
border: 1px solid #fff;
|
||||
display: block;
|
||||
padding: 3px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.cmpy-mgmt-warehouse-panel {
|
||||
border: 1px solid #fff;
|
||||
display: inline-block;
|
||||
padding: 3px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@@ -115,13 +120,18 @@
|
||||
background-color: #333;
|
||||
}
|
||||
|
||||
/* Upgrades */
|
||||
/* Corporation Upgrades */
|
||||
.cmpy-mgmt-upgrade-container {
|
||||
border: 1px solid #fff;
|
||||
width: 60%;
|
||||
margin: 4px;
|
||||
}
|
||||
|
||||
.cmpy-mgmt-upgrade-header {
|
||||
margin: 6px;
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
.cmpy-mgmt-upgrade-div {
|
||||
display: inline-block;
|
||||
border: 1px solid #fff;
|
||||
@@ -136,10 +146,20 @@
|
||||
background-color: #333;
|
||||
}
|
||||
|
||||
/* Industry Upgrades */
|
||||
.industry-purchases-and-upgrades-header {
|
||||
font-size: 14px;
|
||||
margin: 2px;
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
/* Advertising */
|
||||
.cmpy-mgmt-advertising-info {
|
||||
font-size: $defaultFontSize * 0.75;
|
||||
}
|
||||
|
||||
/* Research */
|
||||
#corporation-research-popup-box-content {
|
||||
overflow-x: visible !important;
|
||||
overflow-x: auto !important;
|
||||
overflow-y: auto !important;
|
||||
}
|
||||
|
||||
36
css/dev-menu.css
Normal file
36
css/dev-menu.css
Normal file
@@ -0,0 +1,36 @@
|
||||
.add-exp-button {
|
||||
margin-right: 0px;
|
||||
}
|
||||
|
||||
.remove-exp-button {
|
||||
margin-left:0px;
|
||||
}
|
||||
|
||||
.exp-input {
|
||||
margin-right: 0px;
|
||||
margin-left:0px;
|
||||
|
||||
margin-top: 5px;
|
||||
margin-bottom: 5px;
|
||||
|
||||
padding: 2px 5px;
|
||||
}
|
||||
|
||||
.text-center {
|
||||
margin: auto;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.touch-right {
|
||||
margin-right: 0px;
|
||||
}
|
||||
|
||||
.touch-left {
|
||||
margin-left: 0px;
|
||||
}
|
||||
|
||||
.touch-sides {
|
||||
margin-left: 0px;
|
||||
margin-right: 0px;
|
||||
}
|
||||
6
css/grid.min.css
vendored
Normal file
6
css/grid.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
75
css/hacknetnodes.scss
Normal file
75
css/hacknetnodes.scss
Normal file
@@ -0,0 +1,75 @@
|
||||
@import "mixins";
|
||||
@import "theme";
|
||||
|
||||
/**
|
||||
* Styling for the Hacknet Nodes UI Page
|
||||
*/
|
||||
|
||||
#hacknet-nodes-container {
|
||||
position: fixed;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.hacknet-general-info {
|
||||
margin: 10px;
|
||||
width: 70vw;
|
||||
}
|
||||
|
||||
#hacknet-nodes-container li {
|
||||
float: left;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
|
||||
&.hacknet-node {
|
||||
$boxShadowArgs: inset 0 0 8px rgba(0, 0, 0, 0.1), 0 0 16px rgba(0, 0, 0, 0.1);
|
||||
@include boxShadow($boxShadowArgs);
|
||||
|
||||
margin: 6px;
|
||||
padding: 7px;
|
||||
width: 35vw;
|
||||
border: 2px solid var(--my-highlight-color);
|
||||
}
|
||||
}
|
||||
|
||||
#hacknet-nodes-list {
|
||||
list-style: none;
|
||||
width: 82vw;
|
||||
}
|
||||
|
||||
#hacknet-nodes-money {
|
||||
margin: 10px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
#hacknet-nodes-money-multipliers-div {
|
||||
display: inline-block;
|
||||
width: 70vw;
|
||||
}
|
||||
|
||||
#hacknet-nodes-multipliers {
|
||||
float: right;
|
||||
}
|
||||
|
||||
#hacknet-nodes-purchase-button {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.hacknet-node-container {
|
||||
display: inline-table;
|
||||
|
||||
.row {
|
||||
display: table-row;
|
||||
height: 30px;
|
||||
|
||||
p {
|
||||
display: table-cell;
|
||||
}
|
||||
}
|
||||
|
||||
.upgradable-info {
|
||||
display: inline-block;
|
||||
margin: 0 4px; /* Don't want the vertical margin/padding, just left & right */
|
||||
padding: 0 4px;
|
||||
width: $defaultFontSize * 4;
|
||||
}
|
||||
}
|
||||
@@ -18,201 +18,6 @@
|
||||
position: fixed;
|
||||
}
|
||||
|
||||
/* Active scripts */
|
||||
.active-scripts-list {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
#active-scripts-container {
|
||||
position: fixed;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
#active-scripts-text,
|
||||
#active-scripts-total-prod {
|
||||
width: 70%;
|
||||
margin: 6px;
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.active-scripts-server-header {
|
||||
background-color: #444;
|
||||
font-size: $defaultFontSize * 1.25;
|
||||
color: #fff;
|
||||
margin: 6px 6px 0 6px;
|
||||
padding: 6px;
|
||||
cursor: pointer;
|
||||
width: 60%;
|
||||
text-align: left;
|
||||
border: none;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.active-scripts-server-header.active,
|
||||
.active-scripts-server-header:hover {
|
||||
background-color: #555;
|
||||
}
|
||||
|
||||
.active-scripts-server-header.active:hover {
|
||||
background-color: #666;
|
||||
}
|
||||
|
||||
.active-scripts-server-header:after {
|
||||
content: '\02795'; /* "plus" sign (+) */
|
||||
font-size: $defaultFontSize * 0.8125;
|
||||
color: #fff;
|
||||
float: right;
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.active-scripts-server-header.active:after {
|
||||
content: "\2796"; /* "minus" sign (-) */
|
||||
font-size: $defaultFontSize * 0.8125;
|
||||
color: #fff;
|
||||
float: right;
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.active-scripts-server-panel {
|
||||
margin: 0 6px 6px 6px;
|
||||
padding: 0 6px 6px 6px;
|
||||
width: 55%;
|
||||
margin-left: 5%;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.active-scripts-server-panel div,
|
||||
.active-scripts-server-panel ul,
|
||||
.active-scripts-server-panel ul > li {
|
||||
background-color: #555;
|
||||
}
|
||||
|
||||
.active-scripts-script-header {
|
||||
background-color: #555;
|
||||
color: var(--my-font-color);
|
||||
padding: 4px 25px 4px 10px;
|
||||
cursor: pointer;
|
||||
width: auto;
|
||||
text-align: left;
|
||||
border: none;
|
||||
outline: none;
|
||||
position: relative;
|
||||
|
||||
&:after {
|
||||
content: '\02795'; /* "plus" sign (+) */
|
||||
font-size: $defaultFontSize * 0.8125;
|
||||
float: right;
|
||||
margin-left: 5px;
|
||||
color: transparent;
|
||||
text-shadow: 0 0 0 var(--my-font-color);
|
||||
position: absolute;
|
||||
bottom: 4px;
|
||||
}
|
||||
|
||||
&.active:after {
|
||||
content: "\2796"; /* "minus" sign (-) */
|
||||
}
|
||||
|
||||
&:hover,
|
||||
&.active:hover {
|
||||
background-color: #666;
|
||||
}
|
||||
|
||||
&.active {
|
||||
background-color: #555;
|
||||
}
|
||||
}
|
||||
|
||||
.active-scripts-script-panel {
|
||||
padding: 0 18px;
|
||||
background-color: #555;
|
||||
width: auto;
|
||||
display: none;
|
||||
margin-bottom: 6px;
|
||||
|
||||
p, h2, ul, li {
|
||||
background-color: #555;
|
||||
width: auto;
|
||||
color: #fff;
|
||||
margin-left: 5%;
|
||||
}
|
||||
}
|
||||
|
||||
/* Hacknet Nodes */
|
||||
#hacknet-nodes-container {
|
||||
position: fixed;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
#hacknet-nodes-text,
|
||||
#hacknet-nodes-container li {
|
||||
margin: 10px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
#hacknet-nodes-container li {
|
||||
float: left;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
|
||||
&.hacknet-node {
|
||||
$boxShadowArgs: inset 0 0 8px rgba(0, 0, 0, 0.1), 0 0 16px rgba(0, 0, 0, 0.1);
|
||||
@include boxShadow($boxShadowArgs);
|
||||
|
||||
margin: 6px;
|
||||
padding: 7px;
|
||||
width: 35vw;
|
||||
border: 2px solid var(--my-highlight-color);
|
||||
}
|
||||
}
|
||||
|
||||
#hacknet-nodes-list {
|
||||
list-style: none;
|
||||
width: 82vw;
|
||||
}
|
||||
|
||||
#hacknet-nodes-money {
|
||||
margin: 10px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
#hacknet-nodes-money-multipliers-div {
|
||||
display: inline-block;
|
||||
width: 70vw;
|
||||
}
|
||||
|
||||
#hacknet-nodes-multipliers {
|
||||
float: right;
|
||||
}
|
||||
|
||||
#hacknet-nodes-purchase-button {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.hacknet-node-container {
|
||||
display: inline-table;
|
||||
|
||||
.row {
|
||||
display: table-row;
|
||||
height: 30px;
|
||||
|
||||
p {
|
||||
display: table-cell;
|
||||
}
|
||||
}
|
||||
|
||||
.upgradable-info {
|
||||
display: inline-block;
|
||||
margin: 0 4px; /* Don't want the vertical margin/padding, just left & right */
|
||||
padding: 0 4px;
|
||||
width: $defaultFontSize * 4;
|
||||
}
|
||||
}
|
||||
|
||||
.menu-page-text {
|
||||
width: 70vw;
|
||||
}
|
||||
|
||||
/* World */
|
||||
#world-container {
|
||||
position: fixed;
|
||||
@@ -260,19 +65,6 @@
|
||||
width: 70%;
|
||||
}
|
||||
|
||||
#faction-donate-amount-txt,
|
||||
#faction-donate-input {
|
||||
padding: 6px;
|
||||
margin: 6px;
|
||||
display: inline-block;
|
||||
color: var(--my-font-color);
|
||||
background-color: #000;
|
||||
}
|
||||
|
||||
#faction-donate-amount-txt {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
#faction-container p,
|
||||
#faction-container pre {
|
||||
padding: 4px 6px;
|
||||
@@ -288,45 +80,12 @@
|
||||
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
||||
}
|
||||
|
||||
/* Faction Augmentations */
|
||||
#faction-augmentations-container {
|
||||
position: fixed;
|
||||
padding-top: 10px;
|
||||
|
||||
p, a, ul, h1 {
|
||||
margin: 8px;
|
||||
padding: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
/* World */
|
||||
#world-container li {
|
||||
margin: 0 0 15px 0;
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
/* Augmentations */
|
||||
#augmentations-container {
|
||||
position: fixed;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
.augmentations-list {
|
||||
button,
|
||||
div {
|
||||
color: var(--my-font-color);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
button {
|
||||
padding: 2px 5px;
|
||||
}
|
||||
|
||||
div {
|
||||
padding: 6px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Tutorial */
|
||||
#tutorial-container {
|
||||
position: fixed;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
/* Pop-up boxes */
|
||||
.popup-box-container {
|
||||
display: none; /* Hidden by default */
|
||||
display: none; /* Initially hidden */
|
||||
position: fixed; /* Stay in place */
|
||||
z-index: 10; /* Sit on top */
|
||||
left: 0;
|
||||
|
||||
@@ -7,16 +7,28 @@
|
||||
position: fixed;
|
||||
}
|
||||
|
||||
|
||||
.bitnode {
|
||||
color: #00f;
|
||||
}
|
||||
&.level-0 {
|
||||
color: red;
|
||||
}
|
||||
|
||||
.bitnode-destroyed {
|
||||
color: #f00;
|
||||
}
|
||||
&.level-1 {
|
||||
color: yellow;
|
||||
}
|
||||
|
||||
.bitnode:hover,
|
||||
.bitnode-destroyed:hover {
|
||||
color: #fff;
|
||||
&.level-2 {
|
||||
color: #48D1CC;
|
||||
}
|
||||
|
||||
&.level-3 {
|
||||
color: blue;
|
||||
}
|
||||
|
||||
&.unimplemented {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,13 +68,14 @@
|
||||
@include boxShadow($boxShadowArgs);
|
||||
|
||||
background-color: #555;
|
||||
border: 2px solid var(--my-highlight-color);
|
||||
color: #fff;
|
||||
display: inline-block;
|
||||
float: center;
|
||||
resize: none;
|
||||
color: #fff;
|
||||
margin: 4px;
|
||||
padding: 2px;
|
||||
border: 2px solid var(--my-highlight-color);
|
||||
resize: none;
|
||||
width: 60%;
|
||||
}
|
||||
|
||||
#script-editor-status {
|
||||
|
||||
@@ -7,35 +7,45 @@
|
||||
p {
|
||||
font-size: $defaultFontSize * 0.8125;
|
||||
}
|
||||
|
||||
a {
|
||||
font-size: $defaultFontSize * 0.875;
|
||||
}
|
||||
h2 {
|
||||
}
|
||||
|
||||
.stock-market-info-and-purchases {
|
||||
> h2 {
|
||||
display: block;
|
||||
margin-top: 10px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
> p {
|
||||
display: block;
|
||||
margin-left: 10px;
|
||||
width: 70%;
|
||||
}
|
||||
|
||||
> a, > button {
|
||||
margin: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
#stock-market-list li {
|
||||
button {
|
||||
font-size: $defaultFontSize;
|
||||
#stock-market-list {
|
||||
list-style: none;
|
||||
|
||||
li {
|
||||
button {
|
||||
font-size: $defaultFontSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#stock-market-container p {
|
||||
padding: 6px;
|
||||
margin: 6px;
|
||||
width: 70%;
|
||||
}
|
||||
|
||||
#stock-market-container a {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
#stock-market-watchlist-filter {
|
||||
display: block;
|
||||
margin: 5px 5px 5px 10px;
|
||||
padding: 4px;
|
||||
width: 50%;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.stock-market-input {
|
||||
@@ -47,14 +57,36 @@
|
||||
color: var(--my-font-color);
|
||||
}
|
||||
|
||||
.stock-market-price-movement-warning {
|
||||
border: 1px solid white;
|
||||
color: red;
|
||||
margin: 2px;
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
.stock-market-position-text {
|
||||
color: #fff;
|
||||
display: inline-block;
|
||||
display: block;
|
||||
|
||||
p {
|
||||
color: #fff;
|
||||
display: inline-block;
|
||||
margin: 4px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
margin: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
.stock-market-order-list {
|
||||
overflow-y: auto;
|
||||
max-height: 100px;
|
||||
|
||||
li {
|
||||
color: #fff;
|
||||
padding: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
.stock-market-order-cancel-btn {
|
||||
|
||||
@@ -17,7 +17,8 @@ body {
|
||||
p,
|
||||
pre,
|
||||
h2,
|
||||
.text {
|
||||
.text,
|
||||
td {
|
||||
color: var(--my-font-color);
|
||||
}
|
||||
|
||||
@@ -62,6 +63,9 @@ a:visited {
|
||||
.text-input {
|
||||
color: #fff;
|
||||
background-color: #000;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-color: white;
|
||||
}
|
||||
|
||||
/* Notification icon (for create program right now only) */
|
||||
@@ -76,6 +80,28 @@ a:visited {
|
||||
right: 0;
|
||||
}
|
||||
|
||||
#factions-tab {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#factions-notification {
|
||||
font-size: $defaultFontSize * 0.625;
|
||||
position: absolute; /* Position the badge within the relatively positioned button */
|
||||
top: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
#augmentations-tab {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#augmentations-notification {
|
||||
font-size: $defaultFontSize * 0.625;
|
||||
position: absolute; /* Position the badge within the relatively positioned button */
|
||||
top: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.notification-on {
|
||||
background-color: #fa3e3e;
|
||||
color: #fff;
|
||||
@@ -203,7 +229,6 @@ a:visited {
|
||||
|
||||
.status-text {
|
||||
display: inline-block;
|
||||
height: 15%;
|
||||
position: fixed;
|
||||
z-index: 2;
|
||||
-webkit-animation: status-text 3s 1;
|
||||
@@ -215,10 +240,12 @@ a:visited {
|
||||
|
||||
#status-text {
|
||||
background-color: transparent;
|
||||
font-size: $defaultFontSize * 1.25;
|
||||
bottom: 0;
|
||||
color: #fff;
|
||||
display: none;
|
||||
font-size: $defaultFontSize * 1.25;
|
||||
margin-right: 14px;
|
||||
opacity: 0;
|
||||
padding: 4px;
|
||||
right: 0;
|
||||
top: 0;
|
||||
@@ -239,8 +266,8 @@ a:visited {
|
||||
/* Accordion menus (Header with collapsible panel) */
|
||||
.accordion-header {
|
||||
background-color: #444;
|
||||
font-size: $defaultFontSize * 1.25;
|
||||
color: #fff;
|
||||
font-size: $defaultFontSize * 1.25;
|
||||
margin: 6px 6px 0 6px;
|
||||
padding: 4px 6px;
|
||||
cursor: pointer;
|
||||
@@ -332,3 +359,38 @@ a:visited {
|
||||
.smallfont {
|
||||
font-size: $defaultFontSize * 0.8125;
|
||||
}
|
||||
|
||||
|
||||
.optionCheckbox {
|
||||
filter: invert(1) sepia(1) hue-rotate(41deg) brightness(100%) saturate(10);
|
||||
margin: 5px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.optionRange {
|
||||
-webkit-appearance: none;
|
||||
background: #777;
|
||||
outline: none;
|
||||
opacity: 0.7;
|
||||
height: 10px;
|
||||
-webkit-transition: .2s;
|
||||
transition: opacity .2s;
|
||||
margin: 3px;
|
||||
}
|
||||
|
||||
|
||||
.optionRange::-webkit-slider-thumb {
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
background: var(--my-font-color);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.optionRange::-moz-range-thumb {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
background: var(--my-font-color);
|
||||
cursor: pointer;
|
||||
}
|
||||
20
dist/engine.bundle.js
vendored
20
dist/engine.bundle.js
vendored
File diff suppressed because one or more lines are too long
2305
dist/engine.css
vendored
2305
dist/engine.css
vendored
File diff suppressed because it is too large
Load Diff
2
dist/engineStyle.bundle.js
vendored
Normal file
2
dist/engineStyle.bundle.js
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
!function(n){function t(t){for(var e,i,f=t[0],c=t[1],l=t[2],p=0,s=[];p<f.length;p++)i=f[p],u[i]&&s.push(u[i][0]),u[i]=0;for(e in c)Object.prototype.hasOwnProperty.call(c,e)&&(n[e]=c[e]);for(a&&a(t);s.length;)s.shift()();return r.push.apply(r,l||[]),o()}function o(){for(var n,t=0;t<r.length;t++){for(var o=r[t],e=!0,f=1;f<o.length;f++){var c=o[f];0!==u[c]&&(e=!1)}e&&(r.splice(t--,1),n=i(i.s=o[0]))}return n}var e={},u={1:0},r=[];function i(t){if(e[t])return e[t].exports;var o=e[t]={i:t,l:!1,exports:{}};return n[t].call(o.exports,o,o.exports,i),o.l=!0,o.exports}i.m=n,i.c=e,i.d=function(n,t,o){i.o(n,t)||Object.defineProperty(n,t,{enumerable:!0,get:o})},i.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},i.t=function(n,t){if(1&t&&(n=i(n)),8&t)return n;if(4&t&&"object"==typeof n&&n&&n.__esModule)return n;var o=Object.create(null);if(i.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:n}),2&t&&"string"!=typeof n)for(var e in n)i.d(o,e,function(t){return n[t]}.bind(null,e));return o},i.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return i.d(t,"a",t),t},i.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},i.p="";var f=window.webpackJsonp=window.webpackJsonp||[],c=f.push.bind(f);f.push=t,f=f.slice();for(var l=0;l<f.length;l++)t(f[l]);var a=c;r.push([364,0]),o()}({307:function(n,t,o){},309:function(n,t,o){},311:function(n,t,o){},313:function(n,t,o){},315:function(n,t,o){},317:function(n,t,o){},319:function(n,t,o){},321:function(n,t,o){},323:function(n,t,o){},325:function(n,t,o){},327:function(n,t,o){},329:function(n,t,o){},331:function(n,t,o){},333:function(n,t,o){},335:function(n,t,o){},337:function(n,t,o){},339:function(n,t,o){},341:function(n,t,o){},343:function(n,t,o){},345:function(n,t,o){},347:function(n,t,o){},349:function(n,t,o){},351:function(n,t,o){},353:function(n,t,o){},355:function(n,t,o){},357:function(n,t,o){},359:function(n,t,o){},361:function(n,t,o){},364:function(n,t,o){"use strict";o.r(t);o(363),o(361),o(359),o(357),o(355),o(353),o(351),o(349),o(347),o(345),o(343),o(341),o(339),o(337),o(335),o(333),o(331),o(329),o(327),o(325),o(323),o(321),o(319),o(317),o(315),o(313),o(311),o(309),o(307)}});
|
||||
//# sourceMappingURL=engineStyle.bundle.js.map
|
||||
4950
dist/engineStyle.css
vendored
Normal file
4950
dist/engineStyle.css
vendored
Normal file
File diff suppressed because it is too large
Load Diff
625
dist/vendor.bundle.js
vendored
625
dist/vendor.bundle.js
vendored
File diff suppressed because one or more lines are too long
@@ -14,6 +14,8 @@ Sleeve technology unlocks two different gameplay features:
|
||||
|
||||
Sleeve technology is unlocked in :ref:`BitNode-10 <gameplay_bitnodes>`.
|
||||
|
||||
.. _gameplay_duplicatesleeves:
|
||||
|
||||
Duplicate Sleeves
|
||||
^^^^^^^^^^^^^^^^^
|
||||
Duplicate Sleeves are MK-V Synthoids (synthetic androids) into which your consciuosness
|
||||
@@ -28,6 +30,19 @@ Sleeves are their own individuals, which means they each have their own experien
|
||||
When a sleeve earns experience, it earns experience for itself, the player's
|
||||
original consciousness, as well as all of the player's other sleeves.
|
||||
|
||||
Duplicate Sleeves are **not** reset when installing Augmentations, but they are reset
|
||||
when switching BitNodes.
|
||||
|
||||
Obtaining Duplicate Sleeves
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
There are two methods of obtaining Duplicate Sleeves:
|
||||
|
||||
1. Destroy BitNode-10. Each completion give you one additional Duplicate Sleeve
|
||||
2. Purchase Duplicate Sleeves from :ref:`the faction The Covenant <gameplay_factions>`.
|
||||
This is only available in BitNodes-10 and above, and is only available after defeating
|
||||
BitNode-10 at least once. Sleeves purchased this way are **permanent** (they persist
|
||||
through BitNodes). You can purchase up to 5 Duplicate Sleeves from The Covenant.
|
||||
|
||||
Synchronization
|
||||
~~~~~~~~~~~~~~~
|
||||
Synchronization is a measure of how aligned your consciousness is with that of your
|
||||
@@ -50,6 +65,34 @@ no shock. Shock affects the amount of experience earned by the sleeve.
|
||||
Sleeve shock slowly decreases over time. You can further increase the rate at which
|
||||
it decreases by assigning sleeves to the 'Shock Recovery' task.
|
||||
|
||||
Augmentations
|
||||
~~~~~~~~~~~~~
|
||||
You can purchase :ref:`Augmentations <gameplay_augmentations>` for your Duplicate
|
||||
Sleeves. In order to do this, the Sleeve's Shock must be at 0. Any Augmentation
|
||||
that is currently available to you through a faction is also available for your
|
||||
Duplicate Sleeves. There are a few Augmentations, such as NeuroFlux Governor and
|
||||
Bladeburner-specific ones, that cannot be purchased for a Duplicate Sleeve.
|
||||
|
||||
When you purchase an Augmentation for a Duplicate Sleeve, it is instantly installed.
|
||||
When this happens, the Sleeve's stats are instantly reset back to 0, similar to
|
||||
when you normally install Augmentations.
|
||||
|
||||
The cost of purchasing an Augmentation for a Duplicate Sleeve is **not** affected
|
||||
by how many Augmentations you have purchased for yourself, and vice versa.
|
||||
|
||||
Memory
|
||||
~~~~~~
|
||||
Sleeve memory dictates what a sleeve's synchronization will be when its reset by
|
||||
switching BitNodes. For example, if a sleeve has a memory of 10, then when you
|
||||
switch BitNodes its synchronization will initially be set to 10, rather than 1.
|
||||
|
||||
Memory can only be increased by purchasing upgrades from The Covenant. Just like
|
||||
the ability to purchase additional sleeves, this is only available in BitNodes-10
|
||||
and above, and is only available after defeating BitNode-10 at least once.
|
||||
|
||||
Memory is a persistent stat, meaning it never gets reset back to 1.
|
||||
The maximum possible value for a sleeve's memory is 100.
|
||||
|
||||
Re-sleeving
|
||||
^^^^^^^^^^^
|
||||
Re-sleeving is the process of digitizing and transferring your consciousness into a
|
||||
@@ -64,4 +107,4 @@ Note that resleeving **REMOVES** all of your currently-installed Augmentations,
|
||||
and replaces them with the ones provided by the purchased sleeve. However,
|
||||
Augmentations that are purchased but not installed will **not** be removed. If you have purchased
|
||||
an Augmentation and then re-sleeve into a body which already has that Augmentation,
|
||||
it will be removed since you cannot have duplicate Augmentations.
|
||||
it will be removed since you cannot have duplicate Augmentations.
|
||||
|
||||
@@ -48,6 +48,7 @@ List of all Source-Files
|
||||
| BitNode-9: Coming Soon | |
|
||||
+------------------------------------+-------------------------------------------------------------------------------------+
|
||||
| BitNode-10: Digital Carbon | * Each level of this grants a Duplicate Sleeve |
|
||||
| | * Allows the player to access the :ref:`netscript_sleeveapi` in other BitNodes |
|
||||
+------------------------------------+-------------------------------------------------------------------------------------+
|
||||
| BitNode-11: The Big Crash | * Company favor increases both the player's salary and reputation gain at that |
|
||||
| | company by 1% per favor (rather than just the reputation gain) |
|
||||
|
||||
@@ -23,6 +23,8 @@ enough reputation in it, you will be able to purchase its Augmentations.
|
||||
Different Factions offer different Augmentations. Augmentations must be
|
||||
purchased in order to be installed, and they are fairly expensive.
|
||||
|
||||
.. _gameplay_augmentations_installing:
|
||||
|
||||
Installing Augmentations
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
You will not gain the benefits of your purchased Augmentations until you
|
||||
@@ -57,6 +59,8 @@ Here is everything you will KEEP when you install an Augmentation:
|
||||
* RAM Upgrades on your home computer
|
||||
* World Stock Exchange account and TIX API Access
|
||||
|
||||
.. _gameplay_augmentations_purchasingmultiple:
|
||||
|
||||
Purchasing Multiple Augmentations
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
You do not have to install an Augmentation right after you purchase it.
|
||||
|
||||
@@ -40,7 +40,7 @@ solutions. Some may be numbers, others may be strings or arrays.
|
||||
If a contract asks for a specific solution format, then
|
||||
use that. Otherwise, follow these rules when submitting solutions:
|
||||
|
||||
* String-type solutions should not have quotation marks surrounding
|
||||
* String-type solutions should **not** have quotation marks surrounding
|
||||
the string (unless specifically asked for). Only quotation
|
||||
marks that are part of the actual string solution should be included.
|
||||
* Array-type solutions should be submitted with each element
|
||||
@@ -204,8 +204,8 @@ The list contains the name of (i.e. the value returned by
|
||||
| | | the string, the result should be an array with only an empty string. |
|
||||
| | | |
|
||||
| | | Examples: |
|
||||
| | | ()())() -> ["()()()", "(())()"] |
|
||||
| | | (a)())() -> ["(a)()()", "(a())()"] |
|
||||
| | | ()())() -> [()()(), (())()] |
|
||||
| | | (a)())() -> [(a)()(), (a())()] |
|
||||
| | | )( -> [""] |
|
||||
+------------------------------------+------------------------------------------------------------------------------------------+
|
||||
| Find All Valid Math Expressions | | You are given a string which contains only digits between 0 and 9 as well as a target |
|
||||
@@ -214,10 +214,12 @@ The list contains the name of (i.e. the value returned by
|
||||
| | | |
|
||||
| | | The answer should be provided as an array of strings containing the valid expressions. |
|
||||
| | | |
|
||||
| | | NOTE: Numbers in an expression cannot have leading 0's |
|
||||
| | | |
|
||||
| | | Examples: |
|
||||
| | | Input: digits = "123", target = 6 |
|
||||
| | | Output: ["1+2+3", "1*2*3"] |
|
||||
| | | Output: [1+2+3, 1*2*3] |
|
||||
| | | |
|
||||
| | | Input: digits = "105", target = 5 |
|
||||
| | | Output: ["1*0+5", "10-5"] |
|
||||
| | | Output: [1*0+5, 10-5] |
|
||||
+------------------------------------+------------------------------------------------------------------------------------------+
|
||||
|
||||
@@ -49,6 +49,8 @@ on a server in order to successfully NUKE it:**
|
||||
Once you have enough ports opened on a server and have ran the NUKE virus
|
||||
to gain root access, you will be able to hack it.
|
||||
|
||||
.. _gameplay_hacking_generalhackingmechanics:
|
||||
|
||||
General Hacking Mechanics
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
When you execute the hack command, either manually through the terminal
|
||||
@@ -73,6 +75,8 @@ in your hacking (since you are only hacking a certain percentage).
|
||||
You can increase the amount of money on a server using a script and
|
||||
the :js:func:`grow` function in Netscript.
|
||||
|
||||
.. _gameplay_hacking_serversecurity:
|
||||
|
||||
Server Security
|
||||
^^^^^^^^^^^^^^^
|
||||
Each server has a security level, typically between 1 and 100.
|
||||
|
||||
@@ -37,6 +37,8 @@ name and the arguments that it was run with.**
|
||||
The arguments must be an **exact** match. This means that both
|
||||
the order and type of the arguments matter.
|
||||
|
||||
.. _gameplay_scripts_multithreadingscripts:
|
||||
|
||||
Multithreading scripts
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
A script can be run with multiple threads. This is also called multithreading.
|
||||
|
||||
@@ -7,6 +7,15 @@ buy and sell stocks in order to make money.
|
||||
|
||||
The WSE can be found in the 'City' tab, and is accessible in every city.
|
||||
|
||||
Fundamentals
|
||||
------------
|
||||
The Stock Market is not as simple as "buy at price X and sell at price Y". The following
|
||||
are several fundamental concepts you need to understand about the stock market.
|
||||
|
||||
.. note:: For those that have experience with finance/trading/investing, please be aware
|
||||
that the game's stock market does not function exactly like it does in the real
|
||||
world. So these concepts below should seem similar, but won't be exactly the same.
|
||||
|
||||
Positions: Long vs Short
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
When making a transaction on the stock market, there are two types of positions:
|
||||
@@ -16,16 +25,73 @@ is the exact opposite. In a Short position you purchase shares of a stock and
|
||||
earn a profit if the price of that stock decreases. This is also called 'shorting'
|
||||
a stock.
|
||||
|
||||
NOTE: Shorting stocks is not available immediately, and must be unlocked later in the
|
||||
game.
|
||||
.. note:: Shorting stocks is not available immediately, and must be unlocked later in the
|
||||
game.
|
||||
|
||||
Forecast & Second-Order Forecast
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
A stock's forecast is its likelihood of increasing or decreasing in value. The
|
||||
forecast is typically represented by its probability of increasing in either
|
||||
a decimal or percentage form. For example, a forecast of 70% means the stock
|
||||
has a 70% chance of increasing and a 30% chance of decreasing.
|
||||
|
||||
A stock's second-order forecast is the target value that its forecast trends towards.
|
||||
For example, if a stock has a forecast of 60% and a second-order forecast of 70%,
|
||||
then the stock's forecast should slowly trend towards 70% over time. However, this is
|
||||
determined by RNG so there is a chance that it may never reach 70%.
|
||||
|
||||
Both the forecast and the second-order forecast change over time.
|
||||
|
||||
A stock's forecast can be viewed after purchasing Four Sigma (4S) Market Data
|
||||
access. This lets you see the forecast info on the Stock Market UI. If you also
|
||||
purchase access to the 4S Market Data TIX API, then you can view a stock's forecast
|
||||
using the :js:func:`getStockForecast` function.
|
||||
|
||||
A stock's second-order forecast is always hidden.
|
||||
|
||||
.. _gameplay_stock_market_spread:
|
||||
|
||||
Spread (Bid Price & Ask Price)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
The **bid price** is the maximum price at which someone will buy a stock on the
|
||||
stock market.
|
||||
|
||||
The **ask price** is the minimum price that a seller is willing to receive for a stock
|
||||
on the stock market
|
||||
|
||||
The ask price will always be higher than the bid price (This is because if a seller
|
||||
is willing to receive less than the bid price, that transaction is guaranteed to
|
||||
happen). The difference between the bid and ask price is known as the **spread**.
|
||||
A stock's "price" will be the average of the bid and ask price.
|
||||
|
||||
The bid and ask price are important because these are the prices at which a
|
||||
transaction actually occurs. If you purchase a stock in the long position, the cost
|
||||
of your purchase depends on that stock's ask price. If you then try to sell that
|
||||
stock (still in the long position), the price at which you sell is the stock's
|
||||
bid price. Note that this is reversed for a short position. Purchasing a stock
|
||||
in the short position will occur at the stock's bid price, and selling a stock
|
||||
in the short position will occur at the stock's ask price.
|
||||
|
||||
Transactions Influencing Stock Forecast
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Buying or selling a large number of shares
|
||||
of a stock will influence that stock's forecast & second-order forecast.
|
||||
The forecast is the likelihood that the stock will increase or decrease in price.
|
||||
The magnitude of this effect depends on the number of shares being transacted.
|
||||
More shares will have a bigger effect.
|
||||
|
||||
The effect that transactions have on a stock's second-order forecast is
|
||||
significantly smaller than the effect on its forecast.
|
||||
|
||||
.. _gameplay_stock_market_order_types:
|
||||
|
||||
Order Types
|
||||
^^^^^^^^^^^
|
||||
There are three different types of orders you can make to buy or sell stocks on the exchange:
|
||||
Market Order, Limit Order, and Stop Order.
|
||||
|
||||
Note that Limit Orders and Stop Orders are not available immediately, and must be unlocked
|
||||
later in the game.
|
||||
.. note:: Limit Orders and Stop Orders are not available immediately, and must be unlocked
|
||||
later in the game.
|
||||
|
||||
When you place a Market Order to buy or sell a stock, the order executes immediately at
|
||||
whatever the current price of the stock is. For example if you choose to short a stock
|
||||
@@ -66,3 +132,77 @@ A Limit Order to sell will execute if the stock's price <= order's price
|
||||
A Stop Order to buy will execute if the stock's price <= order's price
|
||||
|
||||
A Stop Order to sell will execute if the stock's price >= order's price.
|
||||
|
||||
.. _gameplay_stock_market_player_actions_influencing_stock:
|
||||
|
||||
Player Actions Influencing Stocks
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
It is possible for your actions elsewhere in the game to influence the stock market.
|
||||
|
||||
Hacking
|
||||
If a server has a corresponding stock (e.g. *foodnstuff* server -> FoodNStuff
|
||||
stock), then hacking that server can decrease the stock's second-order
|
||||
forecast. This causes the corresponding stock's forecast to trend downwards in value
|
||||
over time.
|
||||
|
||||
This effect only occurs if you set the *stock* option to
|
||||
true when calling the :js:func:`hack` function. The chance that hacking a
|
||||
server will cause this effect is based on what percentage of the
|
||||
server's total money you steal.
|
||||
|
||||
A single hack will have a minor
|
||||
effect, but continuously hacking a server for lots of money over time
|
||||
will have a noticeable effect in making the stock's forecast trend downwards.
|
||||
|
||||
Growing
|
||||
If a server has a corresponding stock (e.g. *foodnstuff* server -> FoodNStuff
|
||||
stock), then growing that server's money can increase the stock's
|
||||
second-order forecast. This causes the corresponding stock's
|
||||
forecast to trend upwards in value over time.
|
||||
|
||||
This effect only occurs if you set the *stock* option to true when calling the
|
||||
:js:func:`grow` function. The chance that growing a server will cause this
|
||||
effect is based on what percentage of the server's total money to add to it.
|
||||
|
||||
A single grow operation will have a minor effect, but continuously growing
|
||||
a server for lots of money over time will have a noticeable effect in making
|
||||
the stock's forecast trend upwards.
|
||||
|
||||
Working for a Company
|
||||
If a company has a corresponding stock, then working for that company will
|
||||
increase the corresponding stock's second-order forecast. This will
|
||||
cause the stock's forecast to (slowly) trend upwards in value
|
||||
over time.
|
||||
|
||||
The potency of this effect is based on how "effective" you are when you work
|
||||
(i.e. its based on your stats and multipliers).
|
||||
|
||||
Automating the Stock Market
|
||||
---------------------------
|
||||
You can write scripts to perform automatic and algorithmic trading on the Stock Market.
|
||||
See :ref:`netscript_tixapi` for more details.
|
||||
|
||||
Under the Hood
|
||||
--------------
|
||||
Stock prices are updated every ~6 seconds.
|
||||
|
||||
Whether a stock's price moves up or down is determined by RNG. However,
|
||||
stocks have properties that can influence the way their price moves. These properties
|
||||
are hidden, although some of them can be made visible by purchasing the
|
||||
Four Sigma (4S) Market Data upgrade. Some examples of these properties are:
|
||||
|
||||
* Volatility
|
||||
* Likelihood of increasing or decreasing (i.e. the stock's forecast)
|
||||
* Likelihood of forecast increasing or decreasing (i.e. the stock's second-order forecast)
|
||||
* How easily a stock's price/forecast is influenced by transactions
|
||||
* Spread percentage
|
||||
* Maximum price (not a real maximum, more of a "soft cap")
|
||||
|
||||
Each stock has its own unique values for these properties.
|
||||
|
||||
Offline Progression
|
||||
-------------------
|
||||
The Stock Market does not change or process anything while the game has closed.
|
||||
However, it does accumulate time when offline. This accumulated time allows
|
||||
the stock market to run 50% faster when the game is opened again. This means
|
||||
that stock prices will update every ~4 seconds instead of 6.
|
||||
|
||||
@@ -16,6 +16,85 @@ the terminal and enter::
|
||||
|
||||
nano .fconf
|
||||
|
||||
|
||||
.. _terminal_filesystem:
|
||||
|
||||
Filesystem (Directories)
|
||||
------------------------
|
||||
The Terminal contains a **very** basic filesystem that allows you to store and
|
||||
organize your files into different directories. Note that this is **not** a true
|
||||
filesystem implementation. Instead, it is done almost entirely using string manipulation.
|
||||
For this reason, many of the nice & useful features you'd find in a real
|
||||
filesystem do not exist.
|
||||
|
||||
Here are the Terminal commands you'll commonly use when dealing with the filesystem.
|
||||
|
||||
* :ref:`ls_terminal_command`
|
||||
* :ref:`cd_terminal_command`
|
||||
* :ref:`mv_terminal_command`
|
||||
|
||||
Directories
|
||||
^^^^^^^^^^^
|
||||
In order to create a directory, simply name a file using a full absolute Linux-style path::
|
||||
|
||||
/scripts/myScript.js
|
||||
|
||||
This will automatically create a "directory" called :code:`scripts`. This will also work
|
||||
for subdirectories::
|
||||
|
||||
/scripts/hacking/helpers/myHelperScripts.script
|
||||
|
||||
Files in the root directory do not need to begin with a forward slash::
|
||||
|
||||
thisIsAFileInTheRootDirectory.txt
|
||||
|
||||
Note that there is no way to manually create or remove directories. The creation and
|
||||
deletion of directories is automatically handled as you name/rename/delete
|
||||
files.
|
||||
|
||||
Absolute vs Relative Paths
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Many Terminal commands accept absolute both absolute and relative paths for specifying a
|
||||
file.
|
||||
|
||||
An absolute path specifies the location of the file from the root directory (/).
|
||||
Any path that begins with the forward slash is an absolute path::
|
||||
|
||||
$ nano /scripts/myScript.js
|
||||
$ cat /serverList.txt
|
||||
|
||||
A relative path specifies the location of the file relative to the current working directory.
|
||||
Any path that does **not** begin with a forward slash is a relative path. Note that the
|
||||
Linux-style dot symbols will work for relative paths::
|
||||
|
||||
. (a single dot) - represents the current directory
|
||||
.. (two dots) - represents the parent directory
|
||||
|
||||
$ cd ..
|
||||
$ nano ../scripts/myScript.js
|
||||
$ nano ../../helper.js
|
||||
|
||||
Netscript
|
||||
^^^^^^^^^
|
||||
Note that in order to reference a file, :ref:`netscript` functions require the
|
||||
**full** absolute file path. For example
|
||||
|
||||
.. code:: javascript
|
||||
|
||||
run("/scripts/hacking/helpers.myHelperScripts.script");
|
||||
rm("/logs/myHackingLogs.txt");
|
||||
rm("thisIsAFileInTheRootDirectory.txt");
|
||||
|
||||
.. note:: A full file path **must** begin with a forward slash (/) if that file
|
||||
is not in the root directory.
|
||||
|
||||
Missing Features
|
||||
^^^^^^^^^^^^^^^^
|
||||
These features that are typically in Linux filesystems have not yet been added to the game:
|
||||
|
||||
* Tab autocompletion does not work with relative paths
|
||||
* :code:`mv` only accepts full filepaths for the destination argument. It does not accept directories
|
||||
|
||||
Commands
|
||||
--------
|
||||
|
||||
@@ -98,6 +177,25 @@ Display a message (.msg), literature (.lit), or text (.txt) file::
|
||||
$ cat foo.lit
|
||||
$ cat servers.txt
|
||||
|
||||
.. _cd_terminal_command:
|
||||
|
||||
cd
|
||||
^^
|
||||
|
||||
$ cd [dir]
|
||||
|
||||
Change to the specified directory.
|
||||
|
||||
See :ref:`terminal_filesystem` for details on directories.
|
||||
|
||||
Note that this command works even for directories that don't exist. If you change
|
||||
to a directory that doesn't exist, it will not be created. A directory is only created
|
||||
once there is a file in it::
|
||||
|
||||
$ cd scripts/hacking
|
||||
$ cd /logs
|
||||
$ cd ..
|
||||
|
||||
check
|
||||
^^^^^
|
||||
|
||||
@@ -126,6 +224,8 @@ Both 'clear' and 'cls' do the same thing::
|
||||
$ clear
|
||||
$ cls
|
||||
|
||||
.. _connect_terminal_command:
|
||||
|
||||
connect
|
||||
^^^^^^^
|
||||
|
||||
@@ -165,8 +265,6 @@ Examples::
|
||||
$ expr 3 ** 3
|
||||
|
||||
|
||||
Evalutes a
|
||||
|
||||
free
|
||||
^^^^
|
||||
|
||||
@@ -193,6 +291,7 @@ detailed information about the Terminal command. Examples::
|
||||
$ help alias
|
||||
$ help scan-analyze
|
||||
|
||||
.. _home_terminal_command:
|
||||
|
||||
home
|
||||
^^^^
|
||||
@@ -213,9 +312,12 @@ kill
|
||||
^^^^
|
||||
|
||||
$ kill [script name] [args...]
|
||||
$ kill [pid]
|
||||
|
||||
Kill the script specified by the script name and arguments. Each argument must
|
||||
be separated by a space. Remember that a running script is uniquely identified
|
||||
Kill the script specified by the script filename and arguments OR by its PID.
|
||||
|
||||
If you are killing the script using its filename and arguments, then each argument
|
||||
must be separated by a space. Remember that a running script is uniquely identified
|
||||
by both its name and the arguments that are used to start it. So, if a script
|
||||
was ran with the following arguments::
|
||||
|
||||
@@ -225,35 +327,42 @@ Then to kill this script the same arguments would have to be used::
|
||||
|
||||
$ kill foo.script 50e3 sigma-cosmetics
|
||||
|
||||
Note that after issuing the 'kill' command for a script, it may take a few seconds for
|
||||
the script to actually stop running.
|
||||
If you are killing the script using its PID, then the PID argument must be numeric.
|
||||
|
||||
killall
|
||||
^^^^^^^
|
||||
|
||||
Kills all scripts on the current server.
|
||||
|
||||
.. _ls_terminal_command:
|
||||
|
||||
ls
|
||||
^^
|
||||
|
||||
$ ls [| grep pattern]
|
||||
$ ls [dir] [| grep pattern]
|
||||
|
||||
Prints files on the current server to the Terminal screen.
|
||||
Prints files and directories on the current server to the Terminal screen.
|
||||
|
||||
If this command is run with no arguments, then it prints all files on the current
|
||||
server to the Terminal screen. The files will be displayed in alphabetical
|
||||
order.
|
||||
If this command is run with no arguments, then it prints all files and directories on the current
|
||||
server to the Terminal screen. Directories will be printed first in alphabetical order,
|
||||
followed by the files (also in alphabetical order).
|
||||
|
||||
The '| grep pattern' is an optional parameter that can be used to only display files
|
||||
whose filenames match the specified pattern. For example, if you wanted to only display
|
||||
files with the .script extension, you could use::
|
||||
The :code:`dir` optional parameter allows you to specify the directory for which to display
|
||||
files.
|
||||
|
||||
The :code:`| grep pattern` optional parameter allows you to only display files and directories
|
||||
with a certain pattern in their names.
|
||||
|
||||
Examples::
|
||||
|
||||
// List files/directories with the '.script' extension in the current directory
|
||||
$ ls | grep .script
|
||||
|
||||
Alternatively, if you wanted to display all files with the word *purchase* in the filename,
|
||||
you could use::
|
||||
// List files/directories with the '.js' extension in the root directory
|
||||
$ ls / | grep .js
|
||||
|
||||
$ ls | grep purchase
|
||||
// List files/directories with the word 'purchase' in the name, in the :code:`scripts` directory
|
||||
$ ls scripts | grep purchase
|
||||
|
||||
|
||||
lscpu
|
||||
@@ -281,6 +390,28 @@ The first example above will print the amount of RAM needed to run 'foo.script'
|
||||
with a single thread. The second example above will print the amount of RAM needed
|
||||
to run 'foo.script' with 50 threads.
|
||||
|
||||
.. _mv_terminal_command:
|
||||
|
||||
mv
|
||||
^^
|
||||
|
||||
$ mv [source] [destination]
|
||||
|
||||
Move the source file to the specified destination in the filesystem.
|
||||
See :ref:`terminal_filesystem` for more details about the Terminal's filesystem.
|
||||
This command only works for scripts and text files (.txt). It cannot, however, be used
|
||||
to convert from script to text file, or vice versa.
|
||||
|
||||
This function can also be used to rename files.
|
||||
|
||||
.. note:: Unlike the Linux :code:`mv` command, the *destination* argument must be the
|
||||
full filepath. It cannot be a directory.
|
||||
|
||||
Examples::
|
||||
|
||||
$ mv hacking.script scripts/hacking.script
|
||||
$ mv myScript.js myOldScript.js
|
||||
|
||||
nano
|
||||
^^^^
|
||||
|
||||
@@ -346,6 +477,9 @@ scan
|
||||
Prints all immediately-available network connections. This will print a list
|
||||
of all servers that you can currently connect to using the 'connect' Terminal command.
|
||||
|
||||
|
||||
.. _scan_analyze_terminal_command:
|
||||
|
||||
scan-analyze
|
||||
^^^^^^^^^^^^
|
||||
|
||||
@@ -364,6 +498,8 @@ The information 'scan-analyze' displays about each server includes whether or
|
||||
not you have root access to it, its required hacking level, the number of open
|
||||
ports required to run NUKE.exe on it, and how much RAM it has.
|
||||
|
||||
.. _scp_terminal_command:
|
||||
|
||||
scp
|
||||
^^^
|
||||
|
||||
@@ -377,6 +513,8 @@ sudov
|
||||
|
||||
Prints whether or not you have root access to the current server.
|
||||
|
||||
.. _tail_terminal_command:
|
||||
|
||||
tail
|
||||
^^^^
|
||||
|
||||
@@ -450,7 +588,7 @@ The data can only be downloaded to a script (.script, .ns, .js) or a text file
|
||||
(.txt). If the target file already exists, it will be overwritten by this command.
|
||||
|
||||
Note that will not be possible to download data from many websites because they
|
||||
do not allow cross-origin origin sharing (CORS). This includes websites such
|
||||
do not allow cross-origin resource sharing (CORS). This includes websites such
|
||||
as gist and pastebin. One notable site it will work on is rawgithub. Example::
|
||||
|
||||
$ wget https://raw.githubusercontent.com/danielyxie/bitburner/master/README.md game_readme.txt
|
||||
|
||||
@@ -3,25 +3,294 @@
|
||||
Changelog
|
||||
=========
|
||||
|
||||
v0.49.0 - 2021-03-11 Source-File -1 (hydroflame)
|
||||
-------
|
||||
|
||||
**Source-File -1**
|
||||
|
||||
* For advanced players: The game now embraces exploits and will reward
|
||||
players for doing so.
|
||||
|
||||
**Gang**
|
||||
|
||||
* ascension is less effective as the ascension multiplier goes up.
|
||||
* territory gain scales with power difference.
|
||||
|
||||
**Netscript**
|
||||
|
||||
* 'gang.getEquipmentStats' returns the stats of the equipment.
|
||||
* 'gang.getTaskStats' returns the stats of a task.
|
||||
* 'getCrimeStats' returns the stats of a crime.
|
||||
* Crashes should now print the ns stack trace.
|
||||
* Log messages are now more consistent.
|
||||
* 'softReset' now accepts a callback script like 'installAugmentations'
|
||||
|
||||
**Misc.**
|
||||
|
||||
* Minor formatting under Hacking>Active Scripts
|
||||
* option menu colors now match the rest of the game, kinda.
|
||||
|
||||
|
||||
v0.48.0 - ASCII - 2021-03-07 (hydroflame)
|
||||
-------
|
||||
|
||||
**ASCII**
|
||||
|
||||
* Travel Agency now displays a world map
|
||||
* Cities are now top view of metro station maps
|
||||
|
||||
**Netscript**
|
||||
|
||||
* 'softReset' is a new netscript function that performs a soft reset
|
||||
regardless of if the player has bought augmentations or not.
|
||||
* 'getAugmentationStats' is a new netscript function that returns the stats of
|
||||
an augmentation.
|
||||
* getCharacterInformation now additionally returns exp
|
||||
* pid resets back to 1 when installing or destroying a BitNode.
|
||||
* New '.ns' scripts start with a main function.
|
||||
* 'hacknet.maxNumNodes' returns the maximum number of hacknet nodes.
|
||||
|
||||
**Bladeburner**
|
||||
|
||||
* Current stamina will scale as max stamina increases, this prevents players
|
||||
from having very high penalty when they gain huge amount of exp at the
|
||||
start of a reset.
|
||||
|
||||
**Misc.**
|
||||
|
||||
* Fixed an issue where SF3 was listed as infinitly repeatable and SF12 as
|
||||
having a limit of 3.
|
||||
* Fixed an issue where the gang equipment screen would freeze the game if a
|
||||
script installed augmentations while it is open.
|
||||
* All BonusTime now displays in the 'H M S' format.
|
||||
* Donation textbox style updated to match the rest of the game.
|
||||
* Corporation name style updated to match the rest of the game.
|
||||
* minor formatting under Hacking>Active Scripts
|
||||
* typo in BN12 description
|
||||
* BN12 now reduces contract money
|
||||
* Character>Stats percentages are aligned, server and hacknet limit are
|
||||
displayed, if the player has SF5 the reduces stats are shown.
|
||||
* Character>Augmentations now displays by how much the player stats will
|
||||
increase.
|
||||
* Character>Augmentations has a badge indicating how many augs the player
|
||||
has bought but not installed
|
||||
* Character>Factions has a badge indicating how many factions have pending
|
||||
invites.
|
||||
|
||||
v0.47.2 - 7/15/2019
|
||||
-------------------
|
||||
|
||||
**Netscript Changes**
|
||||
|
||||
* Added tail() Netscript function
|
||||
* hacknet.getNodeStats() function now returns an additional property for Hacknet Servers: hashCapacity
|
||||
* When writing to a file, the write() function now casts the data being written to a string (using String())
|
||||
* BitNode-selection page now shows what Source-File level you have for each BitNode
|
||||
* Overloaded kill() function so that you can kill a script by its PID
|
||||
* spawn() now only takes 10 seconds to run (decreased from 20 seconds)
|
||||
* run() and exec() now return the PID of the newly-executed scripts, rather than a boolean
|
||||
* (A PID is just a positive integer)
|
||||
* run(), exec(), and spawn() no longer need to be await-ed in NetscriptJS
|
||||
* Script parsing and RAM calculations now support ES9
|
||||
* installAugmentations() no longer has a return value since it causes all scripts to die
|
||||
* isBusy() now returns true if you are in a Hacking Mission
|
||||
* Bug fix: workForFaction() function now properly accounts for disabled logs
|
||||
* Bug fix: RAM should now be properly calculated when running a callback script with installAugmentations()
|
||||
* Bug fix: Fixed bug that caused scripts killed by exit()/spawn() to "clean up" twice
|
||||
|
||||
**Misc Changes**
|
||||
|
||||
* The 'kill' Terminal command can now kill a script by its PID
|
||||
* Added 'Solarized Dark' theme to CodeMirror editor
|
||||
* After Infiltration, you will now return to the company page rather than the city page
|
||||
* Bug fix: Stock Market UI should no longer crash for certain locale settings
|
||||
* Bug fix: You can now properly remove unfinished programs (the *.exe-N%-INC files)
|
||||
* Bug fix: Fixed an issue that allowed you to increase money on servers with a 'maxMoney' of 0 (like CSEC)
|
||||
* Bug fix: Scripts no longer persist if they were started with syntax/import errors
|
||||
* Bug fix: 'hack' and 'analyze' Terminal commands are now blocking
|
||||
* Bug fix: Exp earned by duplicate sleeves at universities/gyms now takes hash upgrades into account
|
||||
|
||||
v0.47.1 - 6/27/2019
|
||||
-------------------
|
||||
* Stock Market changes:
|
||||
* Transactions no longer influence stock prices (but they still influence forecast)
|
||||
* Changed the way stocks behave, particularly with regard to how the stock forecast occasionally "flips"
|
||||
* Hacking & growing a server can potentially affect the way the corresponding stock's forecast changes
|
||||
* Working for a company positively affects the way the corresponding stock's forecast changes
|
||||
|
||||
* Scripts now start/stop instantly
|
||||
* Improved performance when starting up many copies of a new NetscriptJS script (by Ornedan)
|
||||
* Improved performance when killing scripts
|
||||
* Dialog boxes can now be closed with the ESC key (by jaguilar)
|
||||
* NetscriptJS scripts should now be "re-compiled" if their dependencies change (by jaguilar)
|
||||
* write() function should now properly cause NetscriptJS scripts to "re-compile" (by jaguilar)
|
||||
|
||||
v0.47.0 - 5/17/2019
|
||||
-------------------
|
||||
* Stock Market changes:
|
||||
* Implemented spread. Stock's now have bid and ask prices at which transactions occur
|
||||
* Large transactions will now influence a stock's price and forecast
|
||||
* This "influencing" can take effect in the middle of a transaction
|
||||
* See documentation for more details on these changes
|
||||
* Added getStockAskPrice(), getStockBidPrice() Netscript functions to the TIX API
|
||||
* Added getStockPurchaseCost(), getStockSaleGain() Netscript functions to the TIX API
|
||||
|
||||
* Re-sleeves can no longer have the NeuroFlux Governor augmentation
|
||||
* This is just a temporary patch until the mechanic gets re-worked
|
||||
|
||||
* hack(), grow(), and weaken() functions now take optional arguments for number of threads to use (by MasonD)
|
||||
* codingcontract.attempt() now takes an optional argument that allows you to configure the function to return a contract's reward
|
||||
* Adjusted RAM costs of Netscript Singularity functions (mostly increased)
|
||||
* Adjusted RAM cost of codingcontract.getNumTriesRemaining() Netscript function
|
||||
* Netscript Singularity functions no longer cost extra RAM outside of BitNode-4
|
||||
* Corporation employees no longer have an "age" stat
|
||||
* Gang Wanted level gain rate capped at 100 (per employee)
|
||||
* Script startup/kill is now processed every 3 seconds, instead of 6 seconds
|
||||
* getHackTime(), getGrowTime(), and getWeakenTime() now return Infinity if called on a Hacknet Server
|
||||
* Money/Income tracker now displays money lost from hospitalizations
|
||||
* Exported saves now have a unique filename based on current BitNode and timestamp
|
||||
* Maximum number of Hacknet Servers decreased from 25 to 20
|
||||
* Bug Fix: Corporation employees stats should no longer become negative
|
||||
* Bug Fix: Fixed sleeve.getInformation() throwing error in certain scenarios
|
||||
* Bug Fix: Coding contracts should no longer generate on the w0r1d_d43m0n server
|
||||
* Bug Fix: Duplicate Sleeves now properly have access to all Augmentations if you have a gang
|
||||
* Bug Fix: getAugmentationsFromFaction() & purchaseAugmentation() functions should now work properly if you have a gang
|
||||
* Bug Fix: Fixed issue that caused messages (.msg) to be sent when refreshing/reloading the game
|
||||
* Bug Fix: Purchasing hash upgrades for Bladeburner/Corporation when you don't actually have access to those mechanics no longer gives hashes
|
||||
* Bug Fix: run(), exec(), and spawn() Netscript functions now throw if called with 0 threads
|
||||
* Bug Fix: Faction UI should now automatically update reputation
|
||||
* Bug Fix: Fixed purchase4SMarketData()
|
||||
* Bug Fix: Netscript1.0 now works properly for multiple 'namespace' imports (import * as namespace from "script")
|
||||
* Bug Fix: Terminal 'wget' command now correctly evaluates directory paths
|
||||
* Bug Fix: wget(), write(), and scp() Netscript functions now fail if an invalid filepath is passed in
|
||||
* Bug Fix: Having Corporation warehouses at full capacity should no longer freeze game in certain conditions
|
||||
* Bug Fix: Prevented an exploit that allows you to buy multiple copies of an Augmentation by holding the 'Enter' button
|
||||
* Bug Fix: gang.getOtherGangInformation() now properly returns a deep copy
|
||||
* Bug Fix: Fixed getScriptIncome() returning an undefined value
|
||||
* Bug Fix: Fixed an issue with Hacknet Server hash rate not always updating
|
||||
|
||||
v0.46.3 - 4/20/2019
|
||||
-------------------
|
||||
* Added a new Augmentation: The Shadow's Simulacrum
|
||||
* Improved tab autocompletion feature in Terminal so that it works better with directories
|
||||
* Bug Fix: Tech vendor location UI now properly refreshed when purchasing a TOR router
|
||||
* Bug Fix: Fixed UI issue with faction donations
|
||||
* Bug Fix: The money statistics & breakdown should now properly track money earned from Hacknet Server (hashes -> money)
|
||||
* Bug Fix: Fixed issue with changing input in 'Minimum Path Sum in a Triangle' coding contract problem
|
||||
* Fixed several typos in various places
|
||||
|
||||
v0.46.2 - 4/14/2019
|
||||
-------------------
|
||||
* Source-File 2 now allows you to form gangs in other BitNodes when your karma reaches a very large negative value
|
||||
* (Karma is a hidden stat and is lowered by committing crimes)
|
||||
|
||||
* Gang changes:
|
||||
* Bug Fix: Gangs can no longer clash with themselve
|
||||
* Bug Fix: Winning against another gang should properly reduce their power
|
||||
|
||||
* Bug Fix: Terminal 'wget' command now works properly
|
||||
* Bug Fix: Hacknet Server Hash upgrades now properly reset upon installing Augs/switching BitNodes
|
||||
* Bug Fix: Fixed button for creating Corporations
|
||||
|
||||
v0.46.1 - 4/12/2019
|
||||
-------------------
|
||||
* Added a very rudimentary directory system to the Terminal
|
||||
* Details here: https://bitburner.readthedocs.io/en/latest/basicgameplay/terminal.html#filesystem-directories
|
||||
|
||||
* Added numHashes(), hashCost(), and spendHashes() functions to the Netscript Hacknet Node API
|
||||
* 'Generate Coding Contract' hash upgrade is now more expensive
|
||||
* 'Generate Coding Contract' hash upgrade now generates the contract randomly on the server, rather than on home computer
|
||||
* The cost of selling hashes for money no longer increases each time
|
||||
* Selling hashes for money now costs 4 hashes (in exchange for $1m)
|
||||
* Bug Fix: Hacknet Node earnings should work properly when game is inactive/offline
|
||||
* Bug Fix: Duplicate Sleeve augmentations are now properly reset when switching to a new BitNode
|
||||
|
||||
v0.46.0 - 4/3/2019
|
||||
------------------
|
||||
* Added BitNode-9: Hacktocracy
|
||||
* Changed BitNode-11's multipliers to make it slightly harder overall
|
||||
* Source-File 11 is now slightly stronger
|
||||
* Added several functions to Netscript Sleeve API for buying Sleeve augmentations (by hydroflame)
|
||||
* Added a new stat for Duplicate Sleeves: Memory
|
||||
* Increase baseline experience earned from Infiltration, but it now gives diminishing returns (on exp) as you get to higher difficulties/levels
|
||||
* In Bladeburner, stamina gained from Hyperbolic Regeneration Chamber is now a percentage of your max stamina
|
||||
|
||||
* Corporation Changes:
|
||||
* 'Demand' value of products decreases more slowly
|
||||
* Bug Fix: Fixed a Corporation issue that broke the Market-TA2 Research
|
||||
* Bug Fix: Issuing New Shares now works properly
|
||||
|
||||
* Bug Fix: Money Statistics tracker was incorrectly recording profits when selling stocks manually
|
||||
* Bug Fix: Fixed an issue with the job requirement tooltip for security jobs
|
||||
|
||||
v0.45.1 - 3/23/2019
|
||||
-------------------
|
||||
* Added two new Corporation Researches
|
||||
* General UI improvements (by hydroflame and koriar)
|
||||
* Bug Fix: Sleeve Netscript API should no longer cause Dynamic RAM errors
|
||||
* Bug Fix: sleeve.getSleeveStats() should now work properly
|
||||
|
||||
v0.45.0 - 3/22/2019
|
||||
-------------------
|
||||
* Corporation changes:
|
||||
* Decreased the time of a full market cycle from 15 seconds to 10 seconds.
|
||||
* This means that each Corporation 'state' will now only take 2 seconds, rather than 3
|
||||
* Increased initial salaries for newly-hired employees
|
||||
* Increased the cost multiplier for upgrading office size (the cost will increase faster)
|
||||
* The stats of your employees now has a slightly larger effect on production & sales
|
||||
* Added several new Research upgrades
|
||||
* Market-TA research now allows you to automatically set sale price at optimal values
|
||||
* Market-TA research now works for Products (not just Materials)
|
||||
* Reduced the amount of Scientific Research needed to unlock the Hi-Tech R&D Laboratory from 10k to 5k
|
||||
* Energy Material requirement of the Software industry reduced from 1 to 0.5
|
||||
* It is now slightly easier to increase the Software industry's production multiplier
|
||||
* Industries now have a maximum number of allowed products, starting at 3. This can be increased through research.
|
||||
* You can now see an approximation of how each material affects an industry's production multiplier by clicking the "?" help tip next to it
|
||||
* Significantly changed the effects of the different employee positions. See updated descriptions
|
||||
* Reduced the amount of money you gain from private investors
|
||||
* Training employees is now 3x more effective
|
||||
* Bug Fix: An industry's products are now properly separated between different cities
|
||||
|
||||
* The QLink Augemntation is now significantly stronger, but also significantly more expensive (by hydroflame)
|
||||
* Added a Netscript API for Duplicate Sleeves (by hydroflame)
|
||||
* Modified the multipliers of BitNode-3 and BitNode-8 to make them slightly harder
|
||||
* After installing Augmentations, Duplicate Sleeves will now default to Synchronize if their Shock is 0
|
||||
* Bug Fix: Bladeburner's Hyperbolic Regeneration Chamber should no longer instantly refill all stamina
|
||||
* Bug Fix: growthAnalyze() function now properly accounts for BitNode multipliers
|
||||
* Bug Fix: The cost of purchasing Augmentations for Duplicate Sleeves no longer scales with how many Augs you've purchased for yourself
|
||||
|
||||
v0.44.1 - 3/4/2019
|
||||
------------------
|
||||
* Duplicate Sleeve changes:
|
||||
* You can now purchase Augmentations for your Duplicate Sleeves
|
||||
* Sleeves are now assigned to Shock Recovery task by default
|
||||
* Shock Recovery and Synchronize tasks are now twice as effective
|
||||
|
||||
* Changed documentation so that Netscript functions are own their own pages. Sorry if this is annoying, it was necessary for properly cross-referencing
|
||||
* Officially deprecated the Wiki (the fandom site). Use the 'readthedocs' Documentation instead
|
||||
* Bug Fix: 'rm' Terminal and Netscript commands now work on non-program files that have '.exe' in the name (by Github user MasonD)
|
||||
* Bug Fix: The 'Find All Valid Math Expressions' Coding Contract should now properly ignore whitespace in answers
|
||||
* Bug Fix: The 'Merge Overlapping Intervals' Coding Contract should now properly accept 2D arrays when being attempted through Netscript
|
||||
|
||||
v0.44.0 - 2/26/2019
|
||||
-------------------
|
||||
* Bladeburner Changes:
|
||||
** Reduced the amount of rank needed to earn a skill point
|
||||
** Reduced the effects of the "Reaper" and "Evasive System" skills
|
||||
** Increased the effect of the "Hyperdrive" and "Hands of Midas" skills
|
||||
** Slightly increased the rate which the skill point cost rises for almost all skills
|
||||
** The "Overlock" Skill now has a maximum level of 90 instead of 95
|
||||
** Money earned from Contracts increased by 400%
|
||||
** Changed the way population affects success rate. Extreme populations now have less dramatic effects
|
||||
** Added two new General Actions: Diplomacy and Hyperbolic Regeneration Chamber
|
||||
** Lowered the rep and money cost of the "Blade's Simulacrum" augmentation
|
||||
** Significantly decreased the initial amount of Contracts/Operations (the "Contracts/Operations remaining" value)
|
||||
** Decreased the rate at which the amount of Contracts/Operations increases over time
|
||||
** Decreased the number of successes you need to increase the max level of a Contract/Operation
|
||||
** Increased the average number of Synthoid communities each city has
|
||||
** Reduced the amount by which a successful raid will decrease the population of a city
|
||||
** The "riots" event will now increase the chaos of a city by a greater amount
|
||||
** Significantly increased the effect that Agility and Dexterity have on action time
|
||||
* Reduced the amount of rank needed to earn a skill point
|
||||
* Reduced the effects of the "Reaper" and "Evasive System" skills
|
||||
* Increased the effect of the "Hyperdrive" and "Hands of Midas" skills
|
||||
* Slightly increased the rate which the skill point cost rises for almost all skills
|
||||
* The "Overlock" Skill now has a maximum level of 90 instead of 95
|
||||
* Money earned from Contracts increased by 400%
|
||||
* Changed the way population affects success rate. Extreme populations now have less dramatic effects
|
||||
* Added two new General Actions: Diplomacy and Hyperbolic Regeneration Chamber
|
||||
* Lowered the rep and money cost of the "Blade's Simulacrum" augmentation
|
||||
* Significantly decreased the initial amount of Contracts/Operations (the "Contracts/Operations remaining" value)
|
||||
* Decreased the rate at which the amount of Contracts/Operations increases over time
|
||||
* Decreased the number of successes you need to increase the max level of a Contract/Operation
|
||||
* Increased the average number of Synthoid communities each city has
|
||||
* Reduced the amount by which a successful raid will decrease the population of a city
|
||||
* The "riots" event will now increase the chaos of a city by a greater amount
|
||||
* Significantly increased the effect that Agility and Dexterity have on action time
|
||||
* Added new BitNode multipliers:
|
||||
* HomeComputerRamCost - Affects how much it costs to upgrade home computer's RAM
|
||||
* DaedalusAugsRequirement - Affects how many Augmentations you need in order to get invited to Daedalus
|
||||
|
||||
@@ -64,9 +64,9 @@ documentation_title = '{0} Documentation'.format(project)
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = '0.43'
|
||||
version = '0.47'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = '0.43.0'
|
||||
release = '0.47.0'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
Guides & Tips
|
||||
=============
|
||||
|
||||
Getting Started Guide for Intermediate Programmers
|
||||
|
||||
Beginners FAQ
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 3
|
||||
|
||||
Getting Started Guide for Beginner Programmers
|
||||
Getting Started Guide for Intermediate Programmers
|
||||
What BitNode should I do?
|
||||
Getting Started Guide for Beginner Programmers <guidesandtips/gettingstartedguideforbeginnerprogrammers>
|
||||
What BitNode should I do?<guidesandtips/recommendedbitnodeorder>
|
||||
|
||||
@@ -0,0 +1,877 @@
|
||||
Getting Started Guide for Beginner Programmers
|
||||
==============================================
|
||||
|
||||
.. note:: Note that the scripts and strategies given in this guide aren't necessarily
|
||||
optimal. They're just meant to introduce you to the game and help you get
|
||||
started.
|
||||
|
||||
This is an introductory guide to getting started with Bitburner. It is not meant to be a
|
||||
comprehensive guide for the entire game, only the early stages. If you are confused
|
||||
or overwhelmed by the game, especially the programming and scripting aspects, this
|
||||
guide is perfect for you!
|
||||
|
||||
Note that this guide is tailored towards those with minimal programming experience.
|
||||
|
||||
Introduction
|
||||
------------
|
||||
Bitburner is a cyberpunk-themed incremental RPG. The player progresses by raising
|
||||
their :ref:`gameplay_stats`, earning money, and :ref:`climbing the corporate ladder <gameplay_companies>`.
|
||||
Eventually, after reaching certain criteria, the player will begin receiving invitations
|
||||
from :ref:`gameplay_factions`. Joining these factions and working for them will unlock
|
||||
:ref:`gameplay_augmentations`. Purchasing and installing Augmentations provide persistent
|
||||
upgrades and are necessary for progressing in the game.
|
||||
|
||||
The game has a minimal story/quest-line that can be followed to reach the end of the game.
|
||||
Since this guide is only about getting started with Bitburner, it will not cover the
|
||||
entire "quest-line".
|
||||
|
||||
First Steps
|
||||
-----------
|
||||
I'm going to assume you followed the introductory tutorial when you first began the game.
|
||||
In this introductory tutorial you created a script called :code:`foodnstuff.script` and ran it
|
||||
on the :code:`foodnstuff` server. Right now, we'll kill this script. There are two ways
|
||||
to do this:
|
||||
|
||||
1. You can go to the Terminal and enter::
|
||||
|
||||
$ kill foodnstuff.script
|
||||
|
||||
2. You can go to the :code:`Active Scripts` page (|Keyboard shortcut| Alt + s) and
|
||||
press the "Kill Script" button for :code:`foodnstuff.script`.
|
||||
|
||||
If you skipped the introductory tutorial, then ignore the part above. Instead, go to the
|
||||
:code:`Hacknet Nodes` page (|Keyboard shortcut| Alt + h) and purchase a
|
||||
Hacknet Node to start generating some passive income.
|
||||
|
||||
Creating our First Script
|
||||
-------------------------
|
||||
Now, we'll create a generic hacking script that can be used early on in the game (or throughout the
|
||||
entire game, if you want).
|
||||
|
||||
Before we write the script, here are some things you'll want to familiarize yourself with:
|
||||
|
||||
* :ref:`gameplay_hacking_generalhackingmechanics`
|
||||
* :ref:`gameplay_hacking_serversecurity`
|
||||
* :js:func:`hack`
|
||||
* :js:func:`grow`
|
||||
* :js:func:`weaken`
|
||||
* :js:func:`brutessh`
|
||||
* :js:func:`nuke`
|
||||
|
||||
To briefly summarize the information from the links above: Each server has a
|
||||
security level that affects how difficult it is to hack. Each server also has a
|
||||
certain amount of money, as well as a maximum amount of money it can hold. Hacking a
|
||||
server steals a percentage of that server's money. The :js:func:`hack` Netscript function
|
||||
is used to hack server. The :js:func:`grow` Netscript function is used to increase
|
||||
the amount of money available on a server. The :js:func:`weaken` Netscript function is
|
||||
used to decrease a server's security level.
|
||||
|
||||
Now let's move on to actually creating the script.
|
||||
Go to your home computer and then create a script called :code:`early-hack-template.script` by
|
||||
going to Terminal and entering the following two commands::
|
||||
|
||||
$ home
|
||||
$ nano early-hack-template.script
|
||||
|
||||
This will take you to the script editor, which you can use to code and create
|
||||
:ref:`gameplay_scripts`. It will be helpful to consult the :ref:`netscript` documentation.
|
||||
Specifically, you'll want to take a look at :ref:`netscriptfunctions`.
|
||||
|
||||
Enter the following code in the script editor:
|
||||
|
||||
.. code:: javascript
|
||||
|
||||
// Defines the "target server", which is the server
|
||||
// that we're going to hack. In this case, it's "foodnstuff"
|
||||
var target = "foodnstuff";
|
||||
|
||||
// Defines how much money a server should have before we hack it
|
||||
// In this case, it is set to 75% of the server's max money
|
||||
var moneyThresh = getServerMaxMoney(target) * 0.75;
|
||||
|
||||
// Defines the maximum security level the target server can
|
||||
// have. If the target's security level is higher than this,
|
||||
// we'll weaken it before doing anything else
|
||||
var securityThresh = getServerMinSecurityLevel(target) + 5;
|
||||
|
||||
// If we have the BruteSSH.exe program, use it to open the SSH Port
|
||||
// on the target server
|
||||
if (fileExists("BruteSSH.exe", "home")) {
|
||||
brutessh(target);
|
||||
}
|
||||
|
||||
// Get root access to target server
|
||||
nuke(target);
|
||||
|
||||
// Infinite loop that continously hacks/grows/weakens the target server
|
||||
while(true) {
|
||||
if (getServerSecurityLevel(target) > securityThresh) {
|
||||
// If the server's security level is above our threshold, weaken it
|
||||
weaken(target);
|
||||
} else if (getServerMoneyAvailable(target) < moneyThresh) {
|
||||
// If the server's money is less than our threshold, grow it
|
||||
grow(target);
|
||||
} else {
|
||||
// Otherwise, hack it
|
||||
hack(target);
|
||||
}
|
||||
}
|
||||
|
||||
The script above contains comments that document what it does, but let's go through it
|
||||
step-by-step anyways.
|
||||
|
||||
.. code:: javascript
|
||||
|
||||
var target = "foodnstuff";
|
||||
|
||||
This first command defines a string which contains our target server. That's the server
|
||||
that we're going to hack. For now, it's set to `foodnstuff` because that's the only
|
||||
server with a required hacking level of 1. If you want to hack a different server,
|
||||
simply change this
|
||||
variable to be the hostname of another server.
|
||||
|
||||
.. code:: javascript
|
||||
|
||||
var moneyThresh = getServerMaxMoney(target) * 0.75;
|
||||
|
||||
This second command defines a numerical value representing the minimum
|
||||
amount of money that must be available on the target server in order for our script
|
||||
to hack it. If the money available on the target server is less than this value,
|
||||
then our script will :js:func:`grow` the server rather than hacking it.
|
||||
It is set to 75% of the maximum amount of money that can be available on the server.
|
||||
The :js:func:`getServerMaxMoney` Netscript function is used to find this value
|
||||
|
||||
.. code:: javascript
|
||||
|
||||
var securityThresh = getServerMinSecurityLevel(target) + 5;
|
||||
|
||||
This third command defines a numerical value representing the maximum security level
|
||||
the target server can have. If the target server's security level is higher than
|
||||
this value, then our script will :js:func:`weaken` the script before doing anything else.
|
||||
|
||||
.. code:: javascript
|
||||
|
||||
if (fileExists("BruteSSH.exe", "home")) {
|
||||
brutessh(target);
|
||||
}
|
||||
|
||||
nuke(target);
|
||||
|
||||
This section of code is used to gain root access on the target server. This is
|
||||
necessary for hacking. See :ref:`here for more details <gameplay_hacking>`.
|
||||
|
||||
.. code:: javascript
|
||||
|
||||
while (true) {
|
||||
if (getServerSecurityLevel(target) > securityThresh) {
|
||||
// If the server's security level is above our threshold, weaken it
|
||||
weaken(target);
|
||||
} else if (getServerMoneyAvailable(target) < moneyThresh) {
|
||||
// Otherwise, if the server's money is less than our threshold, grow it
|
||||
grow(target);
|
||||
} else {
|
||||
// Otherwise, hack it
|
||||
hack(target);
|
||||
}
|
||||
}
|
||||
|
||||
This is the main section that drives our script. It dictates the script's logic
|
||||
and carries out the hacking operations. The `while (true)` creates an infinite loop
|
||||
that will continuously run the hacking logic until the the script is killed.
|
||||
|
||||
Running our Scripts
|
||||
-------------------
|
||||
Now we want to start running our hacking script so that it can start earning us
|
||||
money and experience. Our home computer only has 8GB of RAM and we'll be using it for
|
||||
something else later. So instead, we'll take advantage of the RAM on other machines.
|
||||
|
||||
Go to |Terminal| and enter the following command::
|
||||
|
||||
$ scan-analyze 2
|
||||
|
||||
This will show detailed information about some servers on the network. The
|
||||
**network is randomized so it will be different for every person**.
|
||||
Here's what mine showed at the time I made this::
|
||||
|
||||
[home ~]> scan-analyze 2
|
||||
~~~~~~~~~~ Beginning scan-analyze ~~~~~~~~~~
|
||||
|
||||
>foodnstuff
|
||||
--Root Access: NO, Required hacking skill: 1
|
||||
--Number of open ports required to NUKE: 0
|
||||
--RAM: 16
|
||||
|
||||
>sigma-cosmetics
|
||||
--Root Access: NO, Required hacking skill: 5
|
||||
--Number of open ports required to NUKE: 0
|
||||
--RAM: 16
|
||||
|
||||
>joesguns
|
||||
--Root Access: NO, Required hacking skill: 10
|
||||
--Number of open ports required to NUKE: 0
|
||||
--RAM: 16
|
||||
|
||||
---->max-hardware
|
||||
------Root Access: NO, Required hacking skill: 80
|
||||
------Number of open ports required to NUKE: 1
|
||||
------RAM: 32
|
||||
|
||||
>hong-fang-tea
|
||||
--Root Access: NO, Required hacking skill: 30
|
||||
--Number of open ports required to NUKE: 0
|
||||
--RAM: 16
|
||||
|
||||
---->nectar-net
|
||||
------Root Access: NO, Required hacking skill: 20
|
||||
------Number of open ports required to NUKE: 0
|
||||
------RAM: 16
|
||||
|
||||
>harakiri-sushi
|
||||
--Root Access: NO, Required hacking skill: 40
|
||||
--Number of open ports required to NUKE: 0
|
||||
--RAM: 16
|
||||
|
||||
>iron-gym
|
||||
--Root Access: NO, Required hacking skill: 100
|
||||
--Number of open ports required to NUKE: 1
|
||||
--RAM: 32
|
||||
|
||||
---->zer0
|
||||
------Root Access: NO, Required hacking skill: 75
|
||||
------Number of open ports required to NUKE: 1
|
||||
------RAM: 32
|
||||
|
||||
---->CSEC
|
||||
------Root Access: NO, Required hacking skill: 54
|
||||
------Number of open ports required to NUKE: 1
|
||||
------RAM: 8
|
||||
|
||||
Take note of the following servers:
|
||||
|
||||
* |foodnstuff|
|
||||
* |sigma-cosmetics|
|
||||
* |joesguns|
|
||||
* |nectar-net|
|
||||
* |hong-fang-tea|
|
||||
* |harakiri-sushi|
|
||||
|
||||
All of these servers have 16GB of RAM. Furthermore, all of these servers do not require
|
||||
any open ports in order to NUKE. In other words, we can gain root access to all of these
|
||||
servers and then run scripts on them.
|
||||
|
||||
First, let's determine how many threads of our hacking script we can run.
|
||||
:ref:`Read more about multithreading scripts here <gameplay_scripts_multithreadingscripts>`
|
||||
The script we wrote
|
||||
uses 2.6GB of RAM. You can check this using the following |Terminal| command::
|
||||
|
||||
$ mem early-hack-template.script
|
||||
|
||||
This means we can run 6 threads on a 16GB server. Now, to run our scripts on all of these
|
||||
servers, we have to do the following:
|
||||
|
||||
1. Use the :ref:`scp_terminal_command` |Terminal| command to copy our script to each server.
|
||||
2. Use the :ref:`connect_terminal_command` |Terminal| command to connect to a server.
|
||||
3. Use the :ref:`run_terminal_command` |Terminal| command to run the `NUKE.exe` program and
|
||||
gain root access.
|
||||
4. Use the :ref:`run_terminal_command` |Terminal| command again to run our script.
|
||||
5. Repeat steps 2-4 for each server.
|
||||
|
||||
Here's the sequence of |Terminal| commands I used in order to achieve this::
|
||||
|
||||
$ home
|
||||
$ scp early-hack-template.script foodnstuff
|
||||
$ scp early-hack-template.script sigma-cosmetics
|
||||
$ scp early-hack-template.script joesguns
|
||||
$ scp early-hack-template.script nectar-net
|
||||
$ scp early-hack-template.script hong-fang-tea
|
||||
$ scp early-hack-template.script harakiri-sushi
|
||||
$ connect foodnstuff
|
||||
$ run NUKE.exe
|
||||
$ run early-hack-template.script -t 6
|
||||
$ home
|
||||
$ connect sigma-cosmetics
|
||||
$ run NUKE.exe
|
||||
$ run early-hack-template.script -t 6
|
||||
$ home
|
||||
$ connect joesguns
|
||||
$ run NUKE.exe
|
||||
$ run early-hack-template.script -t 6
|
||||
$ home
|
||||
$ connect hong-fang-tea
|
||||
$ run NUKE.exe
|
||||
$ run early-hack-template.script -t 6
|
||||
$ home
|
||||
$ connect harakiri-sushi
|
||||
$ run NUKE.exe
|
||||
$ run early-hack-template.script -t 6
|
||||
$ home
|
||||
$ connect hong-fang-tea
|
||||
$ connect nectar-net
|
||||
$ run NUKE.exe
|
||||
$ run early-hack-template.script -t 6
|
||||
|
||||
.. note::
|
||||
|
||||
Pressing the :code:`Tab` key in the middle of a Terminal command will attempt to
|
||||
auto-complete the command. For example, if you type in :code:`scp ea` and then
|
||||
hit :code:`Tab`, the rest of the script's name should automatically be filled in.
|
||||
This works for most commands in the game!
|
||||
|
||||
The :ref:`home_terminal_command` |Terminal| command is used to connect to the home
|
||||
computer. When running our scripts with the :code:`run early-hack-template.script -t 6`
|
||||
command, the :code:`-t 6` specifies that the script should be run with 6 threads.
|
||||
|
||||
Note that the |nectar-net| server isn't in the home computer's immediate network.
|
||||
This means you can't directly connect to it from home. You will have to search for it
|
||||
inside the network. The results of the `scan-analyze 2` command we ran before
|
||||
will show where it is. In my case, I could connect to it by going from
|
||||
`hong-fang-tea -> nectar-net`. However, this will probably be different for you.
|
||||
|
||||
After running all of these |Terminal| commands, our scripts are now up and running.
|
||||
These will earn money and hacking experience over time. These gains will be
|
||||
really slow right now, but they will increase once our hacking skill rises and
|
||||
we start running more scripts.
|
||||
|
||||
Increasing Hacking Level
|
||||
------------------------
|
||||
There are many servers besides |foodnstuff| that can be hacked, but they have
|
||||
higher required hacking levels. Therefore, we should raise our hacking level. Not only
|
||||
will this let us hack more servers, but it will also increase the effectiveness of our hacking
|
||||
against |foodnstuff|.
|
||||
|
||||
The easiest way to train your hacking level is to visit Rothman University. You can do this by
|
||||
clicking the `City` tab on the left-hand navigation menu, or you can use the
|
||||
:ref:`keyboard shortcut <shortcuts>` Alt + w. Rothman University should be one of the buttons
|
||||
near the top. Click the button to go to the location.
|
||||
|
||||
Once you go to Rothman University, you should see a screen with several options. These
|
||||
options describe different courses you can take. You should click the first button, which
|
||||
says: "Study Computer Science (free)".
|
||||
|
||||
After you click the button, you will start studying and earning hacking experience. While you
|
||||
are doing this, you cannot interact with any other part of the game until you click the button
|
||||
that says "Stop taking course".
|
||||
|
||||
Right now, we want a hacking level of 10. You need approximately 174 hacking experience to reach
|
||||
level 10. You can check how much hacking experience you have by clicking the `Stats` tab
|
||||
on the left-hand navigation menu, or by using |Keyboard shortcut| Alt + c.
|
||||
Since studying at Rothman University earns you 1 experience per second, this will take
|
||||
174 seconds, or approximately 3 minutes. Feel free to do something in the meantime!
|
||||
|
||||
Editing our Hacking Script
|
||||
--------------------------
|
||||
Now that we have a hacking level of 10, we can hack the :code:`joesguns` server. This server
|
||||
will be slightly more profitable than :code:`foodnstuff`. Therefore, we want to change our hacking
|
||||
script to target :code:`joesguns` instead of :code:`foodnstuff`.
|
||||
|
||||
Go to |Terminal| and edit the hacking script by entering::
|
||||
|
||||
$ home
|
||||
$ nano early-hack-template.script
|
||||
|
||||
At the top of the script, change the `target` variable to be `joesguns`:
|
||||
|
||||
.. code:: javascript
|
||||
|
||||
var target = "joesguns";
|
||||
|
||||
Note that this will **NOT** affect any instances of the script that are already running.
|
||||
This will only affect instances of the script that are ran from this point forward.
|
||||
|
||||
Creating a New Script to Purchase New Servers
|
||||
---------------------------------------------
|
||||
Next, we're going to create a script that automatically purchases additional servers. These
|
||||
servers will be used to run many scripts. Running this script will initially be very
|
||||
expensive since purchasing a server costs money, but it will pay off in the long run.
|
||||
|
||||
In order to create this script, you should familiarize yourself with the following
|
||||
Netscript functions:
|
||||
|
||||
* :js:func:`purchaseServer`
|
||||
* :js:func:`getPurchasedServerCost`
|
||||
* :js:func:`getPurchasedServerLimit`
|
||||
* :js:func:`getServerMoneyAvailable`
|
||||
* :js:func:`scp`
|
||||
* :js:func:`exec`
|
||||
|
||||
Create the script by going to |Terminal| and typing::
|
||||
|
||||
$ home
|
||||
$ nano purchase-server-8gb.script
|
||||
|
||||
Paste the following code into the script editor:
|
||||
|
||||
.. code:: javascript
|
||||
|
||||
// How much RAM each purchased server will have. In this case, it'll
|
||||
// be 8GB.
|
||||
var ram = 8;
|
||||
|
||||
// Iterator we'll use for our loop
|
||||
var i = 0;
|
||||
|
||||
// Continuously try to purchase servers until we've reached the maximum
|
||||
// amount of servers
|
||||
while (i < getPurchasedServerLimit()) {
|
||||
// Check if we have enough money to purchase a server
|
||||
if (getServerMoneyAvailable("home") > getPurchasedServerCost(ram)) {
|
||||
// If we have enough money, then:
|
||||
// 1. Purchase the server
|
||||
// 2. Copy our hacking script onto the newly-purchased server
|
||||
// 3. Run our hacking script on the newly-purchased server with 3 threads
|
||||
// 4. Increment our iterator to indicate that we've bought a new server
|
||||
var hostname = purchaseServer("pserv-" + i, ram);
|
||||
scp("early-hack-template.script", hostname);
|
||||
exec("early-hack-template.script", hostname, 3);
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
This code uses a while loop to purchase the maximum amount of servers using the
|
||||
:js:func:`purchaseServer` Netscript function. Each of these servers will have
|
||||
8GB of RAM, as defined in the :code:`ram` variable. Note that the script uses the command
|
||||
:code:`getServerMoneyAvailable("home")` to get the amount of money you currently have.
|
||||
This is then used to check if you can afford to purchase a server.
|
||||
|
||||
Whenever the script purchases a new server, it uses the :js:func:`scp` function to copy
|
||||
our script onto that new server, and then it uses the :js:func:`exec` function to
|
||||
execute it on that server.
|
||||
|
||||
To run this script, go to |Terminal| and type::
|
||||
|
||||
$ run purchase-server-8gb.script
|
||||
|
||||
This purchase will continuously run until it has purchased the maximum number of servers.
|
||||
When this happens, it'll mean that you have a bunch of new servers that are all running
|
||||
hacking scripts against the :code:`joesguns` server!
|
||||
|
||||
.. note::
|
||||
|
||||
The reason we're using so many scripts to hack :code:`joesguns` instead of targeting other
|
||||
servers is because it's more effective. This early in the game, we don't have enough RAM
|
||||
to efficiently hack multiple targets, and trying to do so would be slow as we'd be spread
|
||||
too thin. You should definitely do this later on, though!
|
||||
|
||||
Note that purchasing a server is fairly expensive, and purchasing the maximum amount of
|
||||
servers even more so. At the time of writing this guide, the script above requires
|
||||
$11 million in order to finish purchasing all of the 8GB servers.
|
||||
Therefore, we need to find additional ways to make money to speed
|
||||
up the process! These are covered in the next section.
|
||||
|
||||
Additional Sources of Income
|
||||
----------------------------
|
||||
There are other ways to gain money in this game besides scripts & hacking.
|
||||
|
||||
Hacknet Nodes
|
||||
^^^^^^^^^^^^^
|
||||
If you completed the introductory tutorial, you were already introduced to this method: Hacknet Nodes.
|
||||
Once you have enough money, you can start upgrading your Hacknet Nodes in order to increase
|
||||
your passive income stream. This is completely optional. Since each Hacknet Node upgrade
|
||||
takes a certain amount of time to "pay itself off", it may not necessarily be in your best
|
||||
interest to use these.
|
||||
|
||||
Nonetheless, Hacknet Nodes are a good source of income early in the game, although
|
||||
their effectiveness tapers off later on. If you do wind up purchasing and upgrading Hacknet Nodes,
|
||||
I would suggest only upgrading their levels for now. I wouldn't bother with RAM and Core
|
||||
upgrades until later on.
|
||||
|
||||
Crime
|
||||
^^^^^
|
||||
The best source of income right now is from :ref:`committing crimes <gameplay_crimes>`.
|
||||
This is because it not only gives you a large amount of money, but it also raises your
|
||||
hacking level. To commit crimes, click on the :code:`City` tab on the left-hand
|
||||
navigation menu or use the |Keyboard shortcut| Alt + w.
|
||||
Then, click on the link that says :code:`The Slums`.
|
||||
|
||||
In the Slums, you can attempt to commit a variety of crimes, each of which gives certain
|
||||
types of experience and money if successful. See :ref:`gameplay_crimes` for more details.
|
||||
|
||||
.. note::
|
||||
|
||||
You are not always successful when you attempt to commit a crime. Nothing bad happens
|
||||
if you fail a crime, but you won't earn any money and the experience gained will be
|
||||
reduced. Raising your stats improves your chance of successfully committing a crime.
|
||||
|
||||
Right now, the best option is the :code:`Rob Store` crime. This takes 60 seconds to attempt
|
||||
and gives $400k if successful. I suggest this crime because you don't have to click or check
|
||||
in too often since it takes a whole minute to attempt. Furthermore, it gives hacking experience,
|
||||
which is very important right now.
|
||||
|
||||
Alternatively, you can also use the :code:`Shoplift` crime. This takes 2 seconds to attempt
|
||||
and gives $15k if successful. This crime is slightly easier and is more profitable
|
||||
than :code:`Rob Store`, but it requires constant clicking and it doesn't give
|
||||
hacking experience.
|
||||
|
||||
Work for a Company
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
If you don't want to constantly check in on the game to commit crimes, there's another option
|
||||
that's much more passive: working for a :ref:`company <gameplay_companies>`.
|
||||
This will not be nearly as profitable as crimes, but it's completely passive.
|
||||
|
||||
Go to the :code:`City` tab on the left-hand navigation menu and then go to
|
||||
:code:`Joe's Guns`. At :code:`Joe's Guns`, there will be an option that says
|
||||
:code:`Apply to be an Employee`. Click this to get the job. Then, a new option
|
||||
will appear that simply says :code:`Work`. Click this to start working.
|
||||
Working at :code:`Joe's Guns` earns $110 per second and also grants some experience
|
||||
for every stat except hacking.
|
||||
|
||||
Working for a company is completely passive. However, you will not be able to do anything
|
||||
else in the game while you work. You can cancel working at any time. You'll notice that
|
||||
cancelling your work early causes you to lose out on some reputation gains, but
|
||||
you shouldn't worry about this. Company reputation isn't important right now.
|
||||
|
||||
Once your hacking hits level 75, you can visit :code:`Carmichael Security` in the city
|
||||
and get a software job there. This job offers higher pay and also earns you
|
||||
hacking experience.
|
||||
|
||||
There are many more companies in the |City tab| that offer more pay and also more gameplay
|
||||
features. Feel free to explore!
|
||||
|
||||
After you Purchase your New Servers
|
||||
-----------------------------------
|
||||
After you've made a total of $11 million, your automatic server-purchasing script should
|
||||
finish running. This will free up some RAM on your home computer. We don't want this RAM
|
||||
to go to waste, so we'll make use of it. Go to |Terminal| and enter the following commands::
|
||||
|
||||
$ home
|
||||
$ run early-hack-template.script -t 3
|
||||
|
||||
Reaching a Hacking Level of 50
|
||||
------------------------------
|
||||
Once you reach a hacking level of 50, two new important parts of the game open up.
|
||||
|
||||
Creating your first program: BruteSSH.exe
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
On the left-hand navigation menu you will notice a :code:`Create Programs` tab with a
|
||||
red notification icon. This indicates that there are programs available to be created.
|
||||
Click on that tab (or use |Keyboard shortcut| Alt + p) and you'll see a
|
||||
list of all the programs you can currently create. Hovering over a program will give a
|
||||
brief description of its function. Simply click on a program to start creating it.
|
||||
|
||||
Right now, the program we want to create is :code:`BruteSSH.exe`. This program is used
|
||||
to open up SSH ports on servers. This will allow you to hack more servers,
|
||||
as many servers in the game require a certain number of opened ports in order for
|
||||
:code:`NUKE.exe` to gain root access.
|
||||
|
||||
When you are creating a program, you cannot interact with any other part of the game.
|
||||
Feel free to cancel your work on creating a program at any time, as your progress will
|
||||
be saved and can be picked back up later. :code:`BruteSSH.exe` takes about
|
||||
10 minutes to complete.
|
||||
|
||||
Optional: Create AutoLink.exe
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
On the :code:`Create Programs` page, you will notice another program you can create
|
||||
called :code:`AutoLink.exe`. If you don't mind waiting another 10-15 minutes, you should
|
||||
go ahead and create this program. It makes it much less tedious to connect to other servers,
|
||||
but it's not necessary for progressing.
|
||||
|
||||
Joining your first faction: CyberSec
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Shortly after you reached level 50 hacking, you should have received a message that
|
||||
said this::
|
||||
|
||||
Message received from unknown sender:
|
||||
|
||||
We've been watching you. Your skills are very impressive. But you're wasting
|
||||
your talents. If you join us, you can put your skills to good use and change
|
||||
the world for the better. If you join us, we can unlock your full potential.
|
||||
But first, you must pass our test. Find and hack our server using the Terminal.
|
||||
|
||||
-CyberSec
|
||||
|
||||
This message was saved as csec-test.msg onto your home computer.
|
||||
|
||||
If you didn't, or if you accidentally closed it, that's okay! Messages get saved onto
|
||||
your home computer. Enter the following |Terminal| commands to view the message::
|
||||
|
||||
$ home
|
||||
$ cat csec-test.msg
|
||||
|
||||
This message is part of the game's main "quest-line". It is a message from the
|
||||
|CyberSec faction| that is asking you to pass their test.
|
||||
Passing their test is simple, you just have to find their server and hack it through
|
||||
the |Terminal|. Their server is called :code:`CSEC`.
|
||||
To do this, we'll use the :ref:`scan_analyze_terminal_command`
|
||||
Terminal command, just like we did before::
|
||||
|
||||
$ home
|
||||
$ scan-analyze 2
|
||||
|
||||
This will show you the network for all servers that are up to 2 "nodes" away from
|
||||
your home computer. Remember that the network is randomly generated so it'll look
|
||||
different for everyone. Here's the relevant part of my :code:`scan-analyze` results::
|
||||
|
||||
>iron-gym
|
||||
--Root Access: NO, Required hacking skill: 100
|
||||
--Number of open ports required to NUKE: 1
|
||||
--RAM: 32
|
||||
|
||||
---->zer0
|
||||
------Root Access: NO, Required hacking skill: 75
|
||||
------Number of open ports required to NUKE: 1
|
||||
------RAM: 32
|
||||
|
||||
---->CSEC
|
||||
------Root Access: NO, Required hacking skill: 54
|
||||
------Number of open ports required to NUKE: 1
|
||||
------RAM: 8
|
||||
|
||||
This tells me that I can reach :code:`CSEC` by going through :code:`iron-gym`::
|
||||
|
||||
$ connect iron-gym
|
||||
$ connect CSEC
|
||||
|
||||
.. note::
|
||||
|
||||
If you created the :code:`AutoLink.exe` program earlier, then there is an easier
|
||||
method of connecting to :code:`CSEC`. You'll notice that in the :code:`scan-analyze`
|
||||
results, all of the server hostnames are white and underlined. You can simply
|
||||
click one of the server hostnames in order to connect to it. So, simply click
|
||||
:code:`CSEC`!
|
||||
|
||||
.. note::
|
||||
|
||||
Make sure you notice the required hacking skill for the :code:`CSEC` server.
|
||||
This is a random value between 51 and 60. Although you receive the message
|
||||
from CSEC once you hit 50 hacking, you cannot actually pass their test
|
||||
until your hacking is high enough to hack their server.
|
||||
|
||||
After you are connected to the :code:`CSEC` server, you can hack it. Note that this
|
||||
server requires one open port in order to gain root access. We can open the SSH port
|
||||
using the :code:`BruteSSH.exe` program we created earlier. In |Terminal|::
|
||||
|
||||
$ run BruteSSH.exe
|
||||
$ run NUKE.exe
|
||||
$ hack
|
||||
|
||||
Keep hacking the server until you are successful. After you successfully hack it, you should
|
||||
receive a faction invitation from |CyberSec| shortly afterwards. Accept it. If you accidentally
|
||||
reject the invitation, that's okay. Just go to the :code:`Factions` tab
|
||||
(|Keyboard shortcut| Alt + f) and you should see an option that lets you
|
||||
accept the invitation.
|
||||
|
||||
Congrats! You just joined your first faction. Don't worry about doing anything
|
||||
with this faction yet, we can come back to it later.
|
||||
|
||||
Using Additional Servers to Hack Joesguns
|
||||
-----------------------------------------
|
||||
Once you have the |BruteSSH| program, you will be able to gain root access
|
||||
to several additional servers. These servers have more RAM that you can use to
|
||||
run scripts. We'll use the RAM on these servers to run more scripts that target
|
||||
:code:`joesguns`.
|
||||
|
||||
Copying our Scripts
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
The server's we'll be using to run our scripts are:
|
||||
|
||||
* :code:`neo-net`
|
||||
* :code:`zer0`
|
||||
* :code:`max-hardware`
|
||||
* :code:`iron-gym`
|
||||
|
||||
All of these servers have 32GB of RAM. You can use the |Terminal| command
|
||||
:code:`scan-analyze 3` to see for yourself. To copy our hacking scripts onto these servers,
|
||||
go to |Terminal| and run::
|
||||
|
||||
$ home
|
||||
$ scp early-hack-template.script neo-net
|
||||
$ scp early-hack-template.script zer0
|
||||
$ scp early-hack-template.script max-hardware
|
||||
$ scp early-hack-template.script iron-gym
|
||||
|
||||
Since each of these servers has 32GB of RAM, we can run our hacking script with 12 threads
|
||||
on each server. By now, you should know how to connect to servers. So find and connect to
|
||||
each of the servers above using the :code:`scan-analyze 3` |Terminal| command. Then, use
|
||||
following |Terminal| command to run our hacking
|
||||
script with 12 threads::
|
||||
|
||||
$ run early-hack-template.script -t 12
|
||||
|
||||
Remember that if you have the |AutoLink| program, you can simply click on the hostname of a server
|
||||
after running :ref:`scan_analyze_terminal_command` to connect to it.
|
||||
|
||||
Profiting from Scripts & Gaining Reputation with CyberSec
|
||||
---------------------------------------------------------
|
||||
Now it's time to play the waiting game. It will take some time for your scripts to start
|
||||
earning money. Remember that most of your scripts are targeting |joesguns|. It will take a
|
||||
bit for them to :js:func:`grow` and :js:func:`weaken` the server to the appropriate values
|
||||
before they start hacking it. Once they do, however, the scripts will be very profitable.
|
||||
|
||||
.. note::
|
||||
|
||||
For reference, in about two hours after starting my first script, my scripts had a
|
||||
production rate of $20k per second and had earned a total of $70 million.
|
||||
(You can see these stats on the :code:`Active Scripts` tab).
|
||||
|
||||
After another 15 minutes, the production rate had increased to $25k per second
|
||||
and the scripts had made an additional $55 million.
|
||||
|
||||
Your results will vary based on how fast you earned money from crime/working/hacknet nodes,
|
||||
but this will hopefully give you a good indication of how much the scripts can earn.
|
||||
|
||||
In the meantime, we are going to be gaining reputation with the |CyberSec faction|.
|
||||
Go to the |Factions tab| on the left-hand
|
||||
navigation menu, and from there select |CyberSec|. In the middle of
|
||||
the page there should be a button for :code:`Hacking Contracts`.
|
||||
Click it to start earning reputation for the |CyberSec| faction (as well
|
||||
as some hacking experience). The higher your hacking level, the more reputation you
|
||||
will gain. Note that while you are working for a faction, you cannot interact with
|
||||
the rest of the game in any way. You can cancel your faction work at any time
|
||||
with no penalty.
|
||||
|
||||
Purchasing Upgrades and Augmentations
|
||||
-------------------------------------
|
||||
As I mentioned before, within 1-2 hours I had earned over $200 million. Now, it's time
|
||||
to spend all of this money on some persistent upgrades to help progress!
|
||||
|
||||
Upgrading RAM on Home computer
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
The most important thing to upgrade right now is the RAM on your home computer. This
|
||||
will allow you to run more scripts.
|
||||
|
||||
To upgrade your RAM, go to the |City tab| and visit the company |Alpha Enterprises|.
|
||||
There will be an option that says :code:`Purchase additional RAM for Home Computer`.
|
||||
Click it and follow the dialog box to upgrade your RAM.
|
||||
|
||||
I recommend getting your home computer's RAM to *at least* 128GB. Getting it even
|
||||
higher would be better.
|
||||
|
||||
Purchasing your First Augmentations
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Once you get ~1000 reputation with the |CyberSec faction|, you can purchase
|
||||
your first :ref:`Augmentation <gameplay_augmentations>` from them.
|
||||
|
||||
To do this, go to the |Factions tab| on the left-hand navigation menu
|
||||
(|Keyboard shortcut| Alt + f) and select |CyberSec|. There is an button
|
||||
near the bottom that says :code:`Purchase Augmentations`. This will bring up a
|
||||
page that displays all of the Augmentations available from |CyberSec|. Some of them
|
||||
may be locked right now. To unlock these, you will need to earn more
|
||||
reputation with |CyberSec|.
|
||||
|
||||
Augmentations give persistent upgrades in the form of multipliers. These aren't very
|
||||
powerful early in the game because the multipliers are small. However, the effects
|
||||
of Augmentations stack multiplicatively **with each other**, so as you continue to install
|
||||
many Augmentations their effects will increase significantly.
|
||||
|
||||
Because of this, I would recommend investing more in RAM upgrades for your home computer rather
|
||||
than Augmentations early on. Having enough RAM to run many scripts will allow you to make
|
||||
much more money, and then you can come back later on and get all these Augmentations.
|
||||
|
||||
Right now, I suggest purchasing at the very least the :code:`Neurotrainer I` Augmentation from
|
||||
|CyberSec|. If you have the money to spare, I would also suggest getting :code:`BitWire` and
|
||||
several levels of the :code:`NeuroFlux Governor` Augmentations. Note that each time
|
||||
you purchase an Augmentation,
|
||||
:ref:`the price of purchasing another increases by 90% <gameplay_augmentations_purchasingmultiple>`,
|
||||
so make sure you buy the most expensive Augmentation first. Don't worry, once you choose to
|
||||
install Augmentations, their prices will reset back to their original values.
|
||||
|
||||
Next Steps
|
||||
----------
|
||||
That's the end of the walkthrough portion of this guide! You should continue to explore
|
||||
what the game has to offer. There's quite a few features that aren't covered or mentioned
|
||||
in this guide, and even more that get unlocked as you continue to play!
|
||||
|
||||
Also, check out the :ref:`netscript` documentation to see what it has to offer. Writing
|
||||
scripts to perform and automate various tasks is where most of the fun in the game comes
|
||||
from (in my opinion)!
|
||||
|
||||
The following are a few things you may want to consider doing in the near future.
|
||||
|
||||
Installing Augmentations (and Resetting)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
If you've purchased any :ref:`gameplay_augmentations`, you'll need to install them before you
|
||||
actually gain their effects. Installing Augmentations is the game's "soft-reset" or "prestige"
|
||||
mechanic. You can :ref:`read more details about it here <gameplay_augmentations_installing>`.
|
||||
|
||||
To install your Augmentations, click the |Augmentations tab| on the left-hand navigation
|
||||
menu (|Keyboard shortcut| Alt + a). You will see a list of all of the Augmentations
|
||||
you have purchased. Below that, you will see a button that says :code:`Install Augmentations`.
|
||||
Be warned, after clicking this there is no way to undo it (unless you load an earlier save).
|
||||
|
||||
Automating the Script Startup Process
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Whenever you install Augmentations, all of your scripts are killed and you'll have to
|
||||
re-run them. Doing this every time you install Augmentations would be very tedious and annoying,
|
||||
so you should write a script to automate the process. Here's a simple example for a
|
||||
startup script. Feel free to adjust it to your liking.
|
||||
|
||||
.. code:: javascript
|
||||
|
||||
// Array of all servers that don't need any ports opened
|
||||
// to gain root access. These have 16 GB of RAM
|
||||
var servers0Port = ["foodnstuff",
|
||||
"sigma-cosmetics",
|
||||
"joesguns",
|
||||
"nectar-net",
|
||||
"hong-fang-tea",
|
||||
"harakiri-sushi"];
|
||||
|
||||
// Array of all servers that only need 1 port opened
|
||||
// to gain root access. These have 32 GB of RAM
|
||||
var servers1Port = ["neo-net",
|
||||
"zer0",
|
||||
"max-hardware",
|
||||
"iron-gym"];
|
||||
|
||||
// Copy our scripts onto each server that requires 0 ports
|
||||
// to gain root access. Then use nuke() to gain admin access and
|
||||
// run the scripts.
|
||||
for (var i = 0; i < servers0Port.length; ++i) {
|
||||
var serv = servers0Port[i];
|
||||
|
||||
scp("early-hack-template.script", serv);
|
||||
nuke(serv);
|
||||
exec("early-hack-template.script", serv, 6);
|
||||
}
|
||||
|
||||
// Wait until we acquire the "BruteSSH.exe" program
|
||||
while (!fileExists("BruteSSH.exe")) {
|
||||
sleep(60000);
|
||||
}
|
||||
|
||||
// Copy our scripts onto each server that requires 1 port
|
||||
// to gain root access. Then use brutessh() and nuke()
|
||||
// to gain admin access and run the scripts.
|
||||
for (var i = 0; i < servers1Port.length; ++i) {
|
||||
var serv = servers1Port[i];
|
||||
|
||||
scp("early-hack-template.script", serv);
|
||||
brutessh(serv);
|
||||
nuke(serv);
|
||||
exec("early-hack-template.script", serv, 12);
|
||||
}
|
||||
|
||||
Random Tips
|
||||
-----------
|
||||
* Early on in the game, it's better to spend your money on upgrading RAM and purchasing
|
||||
new servers rather than spending it on Augmentations
|
||||
* The more money available on a server, the more effective the :js:func:`hack` and
|
||||
:js:func:`grow` Netscript functions will be. This is because both of these functions
|
||||
use percentages rather than flat values. :js:func:`hack` steals a percentage of a server's
|
||||
total available money, and :js:func:`grow` increases a server's money by X%.
|
||||
* There is a limit to how much money can exist on a server. This value is different for each
|
||||
server. The :js:func:`getServerMaxMoney` function will tell you this maximum value.
|
||||
* At this stage in the game, your combat stats (strength, defense, etc.) are not nearly
|
||||
as useful as your hacking stat. Do not invest too much time or money into gaining combat
|
||||
stat exp.
|
||||
|
||||
|
||||
|
||||
.. Substitution definitions
|
||||
.. |Alpha Enterprises| replace:: :code:`Alpha Enterprises`
|
||||
.. |Augmentations tab| replace:: :code:`Augmentations` tab
|
||||
.. |AutoLink| replace:: :code:`NUKE.exe`
|
||||
.. |BruteSSH| replace:: :code:`BruteSSH.exe`
|
||||
.. |City tab| replace:: :code:`City` tab
|
||||
.. |CyberSec| replace:: :code:`CyberSec`
|
||||
.. |CyberSec faction| replace:: :code:`CyberSec` :ref:`faction <gameplay_factions>`
|
||||
.. |Factions tab| replace:: :code:`Factions` tab
|
||||
.. |Keyboard shortcut| replace:: :ref:`Keyboard shortcut <shortcuts>`
|
||||
.. |NUKE| replace:: :code:`NUKE.exe`
|
||||
.. |Terminal| replace:: :code:`Terminal`
|
||||
.. |foodnstuff| replace:: :code:`foodnstuff`
|
||||
.. |harakiri-sushi| replace:: :code:`harakiri-sushi`
|
||||
.. |hong-fang-tea| replace:: :code:`hong-fang-tea`
|
||||
.. |joesguns| replace:: :code:`joesguns`
|
||||
.. |nectar-net| replace:: :code:`nectar-net`
|
||||
.. |sigma-cosmetics| replace:: :code:`sigma-cosmetics`
|
||||
490
doc/source/guidesandtips/recommendedbitnodeorder.rst
Normal file
490
doc/source/guidesandtips/recommendedbitnodeorder.rst
Normal file
@@ -0,0 +1,490 @@
|
||||
What BitNode should I do?
|
||||
=========================
|
||||
|
||||
.. warning:: This page contains spoilers regarding the game's story/plot-line.
|
||||
|
||||
After destroying their first :ref:`BitNode <gameplay_bitnodes>`, many players
|
||||
wonder which BitNode they should tackle next. This guide hopefully helps answer
|
||||
that question.
|
||||
|
||||
Overview of each BitNode
|
||||
------------------------
|
||||
|
||||
BitNode-1: Source Genesis
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Description
|
||||
The first BitNode created by the Enders to imprison the minds of humans. It became
|
||||
the prototype and testing-grounds for all of the BitNodes that followed.
|
||||
This is the first BitNode that you play through. It has no special
|
||||
modifications or mechanics.
|
||||
|
||||
Source-File
|
||||
:Max Level: 3
|
||||
|
||||
This Source-File lets the player start with 32GB of RAM on his/her home computer when
|
||||
entering a new BitNode, and also increases all of the player's multipliers by:
|
||||
|
||||
* Level 1: 16%
|
||||
* Level 2: 24%
|
||||
* Level 3: 28%
|
||||
|
||||
Difficulty
|
||||
The easiest BitNode
|
||||
|
||||
BitNode-2: Rise of the Underworld
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Description
|
||||
Organized crime groups quickly filled the void of power left behind from the collapse of
|
||||
Western government in the 2050s. 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.
|
||||
|
||||
In this BitNode:
|
||||
|
||||
* Your hacking level is reduced by 20%
|
||||
* The growth rate and maximum amount of money available on servers are significantly decreased
|
||||
* The amount of money gained from crimes and Infiltration is tripled
|
||||
* 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
|
||||
will earn the player money and reputation with the corresponding Faction
|
||||
* Every Augmentation in the game will be available through the Factions listed above
|
||||
* For every Faction NOT listed above, reputation gains are halved
|
||||
* You will no longer gain passive reputation with Factions
|
||||
|
||||
Source-File
|
||||
:Max Level: 3
|
||||
|
||||
This Source-File allows you to form gangs in other BitNodes once your karma decreases to a certain value.
|
||||
It also increases the player's crime success rate, crime money, and charisma multipliers by:
|
||||
|
||||
* Level 1: 24%
|
||||
* Level 2: 36%
|
||||
* Level 3: 42%
|
||||
|
||||
Difficulty
|
||||
Fairly easy, as hacking is still very profitable and the costs of various purchases/upgrades
|
||||
is not increased. The gang mechanic may seem strange as its very different from anything
|
||||
else, but it can be very powerful once you get the hang of it.
|
||||
|
||||
BitNode-3: Corporatocracy
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Description
|
||||
Our greatest illusion is that a healthy society can revolve around a
|
||||
single-minded pursuit of wealth.
|
||||
Sometime in the early 21st century economic and political globalization turned
|
||||
the world into a corporatocracy, and it never looked back. Now, the privileged
|
||||
elite will happily bankrupt their own countrymen, decimate their own community,
|
||||
and evict their neighbors from houses in their desperate bid to increase their wealth.
|
||||
In this BitNode you can create and manage your own corporation. Running a successful corporation
|
||||
has the potential of generating massive profits. All other forms of income are reduced by 75%. Furthermore:
|
||||
|
||||
* The price and reputation cost of all Augmentations is tripled
|
||||
* The starting and maximum amount of money on servers is reduced by 75%
|
||||
* Server growth rate is reduced by 80%
|
||||
* You now only need 75 favour with a faction in order to donate to it, rather than 150
|
||||
|
||||
Source-File
|
||||
:Max Level: 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:
|
||||
|
||||
* Level 1: 8%
|
||||
* Level 2: 12%
|
||||
* Level 3: 14%
|
||||
|
||||
Difficulty
|
||||
Somewhat-steep learning curve as you learn how to use and manage Corporations. Afterwards,
|
||||
however, the BitNode is easy as Corporations can be very profitable.
|
||||
|
||||
BitNode-4: The Singularity
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Description
|
||||
The Singularity has arrived. The human race is gone, replaced by artificially superintelligent
|
||||
beings that are more machine than man.
|
||||
|
||||
In this BitNode, progressing is significantly harder:
|
||||
|
||||
* Experience gain rates for all stats are reduced.
|
||||
* Most methods of earning money will now give significantly less.
|
||||
|
||||
In this BitNode you will gain access to a new set of Netscript Functions known as Singularity Functions.
|
||||
These functions allow you to control most aspects of the game through scripts, including
|
||||
working for factions/companies, purchasing/installing Augmentations, and creating programs.
|
||||
|
||||
Source-File
|
||||
:Max Level: 3
|
||||
|
||||
This Source-File lets you access and use the Singularity Functions in other BitNodes.
|
||||
Each level of this Source-File will open up more Singularity Functions that you can use.
|
||||
|
||||
Difficulty:
|
||||
Depending on what Source-Files you have unlocked before attempting this BitNode,
|
||||
it can range from easy to moderate.
|
||||
|
||||
BitNode-5: Artificial Intelligence
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Description
|
||||
They said it couldn't be done. They said the human brain,
|
||||
along with its consciousness and intelligence, couldn't be replicated. They said the complexity
|
||||
of the brain results from unpredictable, nonlinear interactions that couldn't be modeled
|
||||
by 1's and 0's. They were wrong.
|
||||
|
||||
In this BitNode:
|
||||
|
||||
* The base security level of servers is doubled
|
||||
* The starting money on servers is halved, but the maximum money remains the same
|
||||
* Most methods of earning money now give significantly less
|
||||
* Infiltration gives 50% more reputation and money
|
||||
* Corporations have 50% lower valuations and are therefore less profitable
|
||||
* Augmentations are more expensive
|
||||
* Hacking experience gain rates are reduced
|
||||
|
||||
Source-File
|
||||
:Max Level: 3
|
||||
|
||||
This Source-File grants you a special new stat called Intelligence.
|
||||
|
||||
Intelligence is unique because it is permanent and persistent (it never gets reset back to 1). However
|
||||
gaining Intelligence experience is much slower than other stats, and it is also hidden (you won't know
|
||||
when you gain experience and how much). Higher Intelligence levels will boost your production for many actions
|
||||
in the game.
|
||||
|
||||
In addition, this Source-File will unlock the :js:func:`getBitNodeMultipliers()` Netscript function,
|
||||
and will also raise all of your hacking-related multipliers by:
|
||||
|
||||
* Level 1: 8%
|
||||
* Level 2: 12%
|
||||
* Level 3: 14%
|
||||
|
||||
Difficulty
|
||||
Depending on what Source-Files you have unlocked before attempting this BitNode, it
|
||||
can range from easy to moderate.
|
||||
|
||||
BitNode-6: Bladeburners
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Description
|
||||
In the middle of the 21st century, OmniTek Incorporated began designing and manufacturing advanced synthetic
|
||||
androids, or Synthoids for short. They achieved a major technological breakthrough in the sixth generation
|
||||
of their Synthoid design, called MK-VI, by developing a hyperintelligent AI. Many argue that this was
|
||||
the first sentient AI ever created. This resulted in Synthoid models that were stronger, faster, and more intelligent
|
||||
than the humans that had created them.
|
||||
|
||||
In this BitNode you will be able to access the Bladeburner Division at the NSA, which provides
|
||||
a new mechanic for progression. Furthermore:
|
||||
|
||||
* Hacking and Hacknet Nodes will be less profitable
|
||||
* Your hacking level is reduced by 65%
|
||||
* Hacking experience gain from scripts is reduced by 75%
|
||||
* Corporations have 80% lower valuations and are therefore less profitable
|
||||
* Working for companies is 50% less profitable
|
||||
* Crimes and Infiltration are 25% less profitable
|
||||
|
||||
Source-File
|
||||
:Max Level: 3
|
||||
|
||||
This Source-File allows you to access the NSA's Bladeburner Division in other
|
||||
BitNodes. In addition, this Source-File will raise both the level and experience
|
||||
gain rate of all your combat stats by:
|
||||
|
||||
* Level 1: 8%
|
||||
* Level 2: 12%
|
||||
* Level 3: 14%
|
||||
|
||||
Difficulty
|
||||
Initially difficult due to the fact that hacking is no longer profitable and you have
|
||||
to learn a new mechanic. After you get the hang of the Bladeburner mechanic, however,
|
||||
it becomes moderately easy.
|
||||
|
||||
BitNode-7: Bladeburners 2079
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Description
|
||||
In the middle of the 21st century, you were doing cutting-edge work at OmniTek Incorporated
|
||||
as part of the AI design team for advanced synthetic androids, or Synthoids for short. You helped
|
||||
achieve a major technological breakthrough in the sixth generation of the company's Synthoid
|
||||
design, called MK-VI, by developing a hyperintelligent AI. Many argue that this was the first
|
||||
sentient AI ever created. This resulted in Synthoid models that were stronger, faster,
|
||||
and more intelligent than the humans that had created them.
|
||||
|
||||
In this BitNode you will be able to access the Bladeburner API, which allows you to access
|
||||
Bladeburner functionality through Netscript. Furthermore:
|
||||
|
||||
* The rank you gain from Bladeburner contracts/operations is reduced by 40%
|
||||
* Bladeburner skills cost twice as many skill points
|
||||
* Augmentations are 3x more expensive
|
||||
* Hacking and Hacknet Nodes will be significantly less profitable
|
||||
* Your hacking level is reduced by 65%
|
||||
* Hacking experience gain from scripts is reduced by 75%
|
||||
* Corporations have 80% lower valuations and are therefore less profitable
|
||||
* Working for companies is 50% less profitable
|
||||
* Crimes and Infiltration are 25% less profitable
|
||||
|
||||
Source-File
|
||||
:Max Level: 3
|
||||
|
||||
This Source-File allows you to access the Bladeburner Netscript API in other
|
||||
BitNodes. In addition, this Source-File will increase all of your Bladeburner multipliers by:
|
||||
|
||||
* Level 1: 8%
|
||||
* Level 2: 12%
|
||||
* Level 3: 14%
|
||||
|
||||
Difficulty
|
||||
Slightly more difficult than BitNode-6. However, you will be able to automate more
|
||||
aspects of the Bladeburner feature, which means it will be more passive.
|
||||
|
||||
BitNode-8: Ghost of Wall Street
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Description
|
||||
You are trying to make a name for yourself as an up-and-coming hedge fund manager on Wall Street.
|
||||
|
||||
In this BitNode:
|
||||
|
||||
* You start with $250 million
|
||||
* The only way to earn money is by trading on the stock market
|
||||
* You start with a WSE membership and access to the TIX API
|
||||
* You are able to short stocks and place different types of orders (limit/stop)
|
||||
* You can immediately donate to factions to gain reputation
|
||||
|
||||
Source-File
|
||||
:Max Level: 3
|
||||
|
||||
This Source-File grants the following benefits:
|
||||
|
||||
* Level 1: Permanent access to WSE and TIX API
|
||||
* Level 2: Ability to short stocks in other BitNodes
|
||||
* Level 3: Ability to use limit/stop orders in other BitNodes
|
||||
|
||||
This Source-File also increases your hacking growth multipliers by:
|
||||
|
||||
* Level 1: 12%
|
||||
* Level 2: 18%
|
||||
* Level 3: 21%
|
||||
|
||||
Difficulty
|
||||
Very difficult until you unlock the Four Sigma (4S) Market Data API. After you
|
||||
unlock the API however, it becomes moderately easy.
|
||||
|
||||
BitNode-9: Hacktocracy
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
Description
|
||||
When Fulcrum Technologies released their open-source Linux distro Chapeau, it quickly
|
||||
became the OS of choice for the underground hacking community. Chapeau became especially
|
||||
notorious for powering the Hacknet, a global, decentralized network used for nefarious
|
||||
purposes. Fulcrum quickly abandoned the project and dissociated themselves from it.
|
||||
|
||||
This BitNode unlocks the Hacknet Server, an upgraded version of the Hacknet Node. Hacknet Servers generate
|
||||
hashes, which can be spent on a variety of different upgrades.
|
||||
|
||||
In this BitNode:
|
||||
* Your stats are significantly decreased
|
||||
* You cannnot purchase additional servers
|
||||
* Hacking is significantly less profitable
|
||||
|
||||
Source-File
|
||||
:Max Level: 3
|
||||
|
||||
This Source-File grants the following benefits:
|
||||
|
||||
* Level 1: Permanently unlocks the Hacknet Server in other BitNodes
|
||||
* Level 2: You start with 128GB of RAM on your home computer when entering a new BitNode
|
||||
* Level 3: Grants a highly-upgraded Hacknet Server when entering a new BitNode
|
||||
|
||||
(Note that the Level 3 effect of this Source-File only applies when entering a new BitNode, NOT
|
||||
when installing Augmentation
|
||||
|
||||
Difficulty
|
||||
Hard
|
||||
|
||||
BitNode-10: Digital Carbon
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Description
|
||||
In 2084, VitaLife unveiled to the world the Persona Core, a technology that allowed people
|
||||
to digitize their consciousness. Their consciousness could then be transferred into Synthoids
|
||||
or other bodies by trasmitting the digitized data. Human bodies became nothing more than 'sleeves'
|
||||
for the human consciousness. Mankind had finally achieved immortality - at least for those
|
||||
that could afford it.
|
||||
|
||||
This BitNode unlocks Sleeve technology. Sleeve technology allows you to:
|
||||
|
||||
1. Re-sleeve: Purchase and transfer your consciousness into a new body
|
||||
2. Duplicate Sleeves: Duplicate your consciousness into Synthoids, allowing you to perform different tasks synchronously
|
||||
|
||||
In this BitNode:
|
||||
* Your stats are significantly decreased
|
||||
* All methods of gaining money are half as profitable (except Stock Market)
|
||||
* Purchased servers are more expensive, have less max RAM, and a lower maximum limit
|
||||
* Augmentations are 5x as expensive and require twice as much reputation
|
||||
|
||||
Source-File
|
||||
:Max Level: 3
|
||||
|
||||
This Source-File unlocks Sleeve technology in other BitNodes.
|
||||
Each level of this Source-File also grants you a Duplicate Sleeve
|
||||
|
||||
Difficulty
|
||||
Hard
|
||||
|
||||
BitNode-11: The Big Crash
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Description
|
||||
The 2050s was defined by the massive amounts of violent civil unrest and anarchic rebellion that rose all around the world. It was this period
|
||||
of disorder that eventually lead to the governmental reformation of many global superpowers, most notably
|
||||
the USA and China. But just as the world was slowly beginning to recover from these dark times, financial catastrophe hit.
|
||||
In many countries, the high cost of trying to deal with the civil disorder bankrupted the governments. In all of this chaos and confusion, hackers
|
||||
were able to steal billions of dollars from the world's largest electronic banks, prompting an international banking crisis as
|
||||
governments were unable to bail out insolvent banks. Now, the world is slowly crumbling in the middle of the biggest economic crisis of all time.
|
||||
|
||||
In this BitNode:
|
||||
|
||||
* Your hacking stat and experience gain are halved
|
||||
* The starting and maximum amount of money available on servers is significantly decreased
|
||||
* The growth rate of servers is significantly reduced
|
||||
* Weakening a server is twice as effective
|
||||
* Company wages are decreased by 50%
|
||||
* Corporation valuations are 99% lower and are therefore significantly less profitable
|
||||
* Hacknet Node production is significantly decreased
|
||||
* Crime and Infiltration are more lucrative
|
||||
* Augmentations are twice as expensive
|
||||
|
||||
Source-File
|
||||
:Max Level: 3
|
||||
|
||||
Destroying this BitNode will give you Source-File 11, or if you already have this Source-File it will
|
||||
upgrade its level up to a maximum of 3. This Source-File makes it so that company favor increases BOTH
|
||||
the player's salary and reputation gain rate at that company by 1% per favor (rather than just the reputation gain).
|
||||
This Source-File also increases the player's company salary and reputation gain multipliers by:
|
||||
|
||||
* Level 1: 32%
|
||||
* Level 2: 48%
|
||||
* Level 3: 56%
|
||||
|
||||
Difficulty
|
||||
Hard
|
||||
|
||||
BitNode-12: The Recursion
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Description
|
||||
Every time this BitNode is destroyed, it becomes slightly harder.
|
||||
|
||||
Source-File
|
||||
:Max Level: Infinity
|
||||
|
||||
Each level of Source-File 12 will increase all of your multipliers by 1%. This effect
|
||||
is multiplicative with itself. In other words, level N of this Source-File will result
|
||||
in a multiplier of 1.01^N (or 0.99^N for multipliers that decrease)
|
||||
|
||||
Difficulty
|
||||
Initially very easy, but then it (obviously) becomes harder as you continue to do it.
|
||||
|
||||
Recommended BitNodes
|
||||
--------------------
|
||||
As a player, you are not forced to tackle the BitNodes in any particular order. You are
|
||||
free to choose whichever ones you want. The "best" order can vary between players,
|
||||
depending on what you like to do any what kind of player you are. In general, here
|
||||
are the recommended BitNodes for different things:
|
||||
|
||||
For fast progression
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
.. note:: This does not recommend the absolute fastest path, as I don't know what
|
||||
exactly the fastest path is. But it does recommend the BitNodes that are
|
||||
commonly considered to be optimal by players.
|
||||
|
||||
1. Repeat **BitNode-1: Source Genesis** until you max out its Source-File. Its Source-File
|
||||
is extremely powerful, as it raises all multipliers by a significant amount.
|
||||
|
||||
2. Repeat **BitNode-12: The Recursion** several times. This BitNode will be extremely easy the
|
||||
first few times you tackle it, and its Source-File raises all multipliers. Furthermore,
|
||||
its effect stacks multiplicatively with itself and other Source-Files/Augmentations,
|
||||
which gets better as time goes on
|
||||
|
||||
3. Do **BitNode-5: Artificial Intelligence** once or twice. The intelligence stat it unlocks
|
||||
will gradually build up as you continue to play the game, and will be helpful
|
||||
in the future. The Source-File also provides hacking multipliers, which are
|
||||
strong because hacking is typically one of the best ways of earning money.
|
||||
|
||||
4. (Optional) Consider doing **BitNode-4: The Singularity**. Its Source-File does not directly make you
|
||||
more powerful in any way, but it does unlock :ref:`netscript_singularityfunctions` which
|
||||
let you automate significantly more aspects of the game.
|
||||
|
||||
5. Do **BitNode-3: Corporatocracy** once to unlock the Corporation mechanic. This mechanic
|
||||
has high profit potential.
|
||||
|
||||
6. Do **BitNode-6: Bladeburners** once to unlock the Bladeburners mechanic. The Bladeburner
|
||||
mechanic is useful for some of the future BitNodes (such as 9 and 10).
|
||||
|
||||
7. Do **BitNode-9: Hacktocracy** to unlock the Hacknet Server mechanic. You can
|
||||
consider repeating it as well, as its Level 2 and 3 effects are pretty helpful as well.
|
||||
|
||||
.. todo:: To be continued as more BitNodes get added
|
||||
|
||||
For the strongest Source-Files
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Note that the strongest Source-Files are typically rewarded by the hardest BitNodes.
|
||||
|
||||
The strongest Source-File is that from **BitNode-1: Source Genesis**, as it raises
|
||||
all multipliers by a significant amount.
|
||||
|
||||
Similarly, the Source-File from **BitNode-12: The Recursion** is also very strong
|
||||
because it raises all multipliers. Each level of Source-File 12 is fairly weak,
|
||||
but its effectiveness gets better over time since the effects of Source-Files and
|
||||
Augmentations are multiplicative with each other.
|
||||
|
||||
The Source-File from **BitNode-9: Hacktocracy** is good because it unlocks the Hacknet
|
||||
Server mechanic. The Hacknet Server mechanic causes Hacknet Nodes to produce a new
|
||||
currency called *hashes*, rather than money. *Hashes* can be spent on powerful upgrades
|
||||
that benefit your hacking, Corporation, Bladeburner, etc.
|
||||
|
||||
The Duplicate Sleeves granted by the Source-File from **BitNode-10: Digital Carbon**
|
||||
are strong, but only after you have several of them and have spent some time/money upgrading
|
||||
them.
|
||||
|
||||
For more scripting/hacking
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
**BitNode-4: The Singularity** unlocks the :ref:`netscript_singularityfunctions`, which
|
||||
can be used to automate many different aspects of the game, including working for factions/companies,
|
||||
purchasing & installing Augmentations, and creating programs
|
||||
|
||||
**BitNode-6** and **BitNode-7** unlock Bladeburner and its corresponding
|
||||
:ref:`Netscript API <netscript_bladeburnerapi>`. This allows you to automate an entire
|
||||
new mechanic.
|
||||
|
||||
**BitNode-2: Rise of the Underworld** also unlocks a new mechanic and Netscript API for automating
|
||||
it (the Gang mechanic). However, it is not as interesting as Bladeburner (in my opinion)
|
||||
|
||||
**BitNode-9: Hacktocracy** unlocks the Hacknet Server mechanic and several new
|
||||
functions in the :ref:`Hacknet Node API <netscript_hacknetnodeapi>` for using it.
|
||||
|
||||
For new mechanics
|
||||
^^^^^^^^^^^^^^^^^
|
||||
**BitNode-2: Rise of the Underworld** unlocks a new mechanic in which you can
|
||||
manage a gang. Gangs earn you money and can be very profitable once they get large
|
||||
and powerful. The biggest benefit of gangs, however, is that they make all
|
||||
Augmentations available to you through their corresponding faction.
|
||||
|
||||
**BitNode-3: Corporatocracy** unlocks a new mechanic in which you can manage a
|
||||
corporation. You can earn money through Corporations by selling your stocks, or by
|
||||
configuring your corporation to pay dividends to shareholders. If your Corporation
|
||||
gets big enough, it can also bribe factions in exchange for faction reputation.
|
||||
|
||||
**BitNode-6: Bladeburners** unlocks a new mechanic that centers around combat rather
|
||||
than hacking. The main benefit of the Bladeburner mechanic is that it offers a new
|
||||
method of destroying a BitNode.
|
||||
|
||||
**BitNode-9: Hacktocracy** unlocks the Hacknet Server, which is an upgraded version of a
|
||||
Hacknet Node. The Hacknet Server generates a computational unit called a *hash*. *Hashes*
|
||||
can be spent on a variety of different upgrades that can benefit your hacking,
|
||||
Corporation, Bladeburner progress, and more. It transforms the Hacknet Node from a
|
||||
simple money-generator to a more interesting mechanic.
|
||||
|
||||
**BitNode-10: Digital Carbon** unlocks two new mechanics: Re-Sleeving and
|
||||
Duplicate Sleeves.
|
||||
|
||||
For a Challenge
|
||||
^^^^^^^^^^^^^^^
|
||||
In general, the higher BitNodes are more difficult than the lower ones.
|
||||
**BitNode-12: The Recursion** is an obvious exception as it gets progressively harder.
|
||||
|
||||
**BitNode-8: Ghost of Wall Street** provides a unique challenge as the only method
|
||||
of earning money in that BitNode is through trading at the stock market.
|
||||
@@ -5,8 +5,9 @@
|
||||
|
||||
Welcome to Bitburner's documentation!
|
||||
=====================================
|
||||
Bitburner is a cyberpunk-themed `incremental game <https://en.wikipedia.org/wiki/Incremental_game>`_ that is currently in the
|
||||
early beta stage of development. The game `can be played here <https://danielyxie.github.io/bitburner/>`_.
|
||||
Bitburner is a programming-based `incremental game <https://en.wikipedia.org/wiki/Incremental_game>`_
|
||||
that revolves around hacking and cyberpunk themes. The game is currently in the
|
||||
early beta stage of development. It `can be played here <https://danielyxie.github.io/bitburner/>`_.
|
||||
|
||||
What is Bitburner?
|
||||
------------------
|
||||
@@ -26,6 +27,7 @@ secrets that you've been searching for.
|
||||
Script Editors <scripteditors>
|
||||
Game Frozen or Stuck? <gamefrozen>
|
||||
Guides & Tips <guidesandtips>
|
||||
Tools & Resources <toolsandresources>
|
||||
Changelog <changelog>
|
||||
Donate <https://paypal.me/danielyxie>
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ Netscript
|
||||
Netscript is the programming language used in the world of Bitburner.
|
||||
|
||||
When you write scripts in Bitburner, they are written in the Netscript language.
|
||||
Netscript is simply a subset of `JavaScript <https://developer.mozilla.org/en-US/docs/Web/JavaScript>`_,.
|
||||
Netscript is simply a subset of `JavaScript <https://developer.mozilla.org/en-US/docs/Web/JavaScript>`_.
|
||||
This means that Netscript's syntax is
|
||||
identical to that of JavaScript, but it does not implement some of the features
|
||||
that JavaScript has.
|
||||
@@ -29,4 +29,5 @@ to reach out to the developer!
|
||||
Bladeburner API <netscript/netscriptbladeburnerapi>
|
||||
Gang API <netscript/netscriptgangapi>
|
||||
Coding Contract API <netscript/netscriptcodingcontractapi>
|
||||
Sleeve API <netscript/netscriptsleeveapi>
|
||||
Miscellaneous <netscript/netscriptmisc>
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
getBitNodeMultipliers() Netscript Function
|
||||
==========================================
|
||||
|
||||
.. js:function:: getBitNodeMultipliers()
|
||||
|
||||
Returns an object containing the current BitNode multipliers. This function requires Source-File 5 in order
|
||||
to run. The multipliers are returned in decimal forms (e.g. 1.5 instead of 150%). The multipliers represent
|
||||
the difference between the current BitNode and the original BitNode (BitNode-1). For example, if the
|
||||
*CrimeMoney* multiplier has a value of 0.1, then that means that committing crimes in the current BitNode
|
||||
will only give 10% of the money you would have received in BitNode-1.
|
||||
|
||||
The structure of the returned object is subject to change as BitNode multipliers get added to the game.
|
||||
Refer to the `source code here <https://github.com/danielyxie/bitburner/blob/master/src/BitNode/BitNodeMultipliers.ts>`_
|
||||
to see the name of the BitNode multipliers.
|
||||
|
||||
Example::
|
||||
|
||||
mults = getBitNodeMultipliers();
|
||||
print(mults.ServerMaxMoney);
|
||||
print(mults.HackExpGain);
|
||||
|
||||
:RAM cost: 4 GB
|
||||
@@ -0,0 +1,15 @@
|
||||
getHackTime(), getGrowTime(), & getWeakenTime()
|
||||
===============================================
|
||||
|
||||
The :js:func:`getHackTime`, :js:func:`getGrowTime`, and :js:func:`getWeakenTime`
|
||||
all take an additional third optional parameter for specifying a specific intelligence
|
||||
level to see how that would affect the hack/grow/weaken times. This parameter
|
||||
defaults to your current intelligence level.
|
||||
|
||||
(Intelligence is unlocked after obtaining Source-File 5).
|
||||
|
||||
The function signatures are then::
|
||||
|
||||
getHackTime(hostname/ip[, hackLvl=current level, intLvl=current level])
|
||||
getGrowTime(hostname/ip[, hackLvl=current level, intLvl=current level])
|
||||
getWeakenTime(hostname/ip[, hackLvl=current level, intLvl=current level])
|
||||
13
doc/source/netscript/basicfunctions/brutessh.rst
Normal file
13
doc/source/netscript/basicfunctions/brutessh.rst
Normal file
@@ -0,0 +1,13 @@
|
||||
brutessh() Netscript Function
|
||||
=============================
|
||||
|
||||
.. js:function:: brutessh(hostname/ip)
|
||||
|
||||
:param string hostname/ip: IP or hostname of the target server
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Runs the BruteSSH.exe program on the target server. BruteSSH.exe must exist on your home computer.
|
||||
|
||||
Example::
|
||||
|
||||
brutessh("foodnstuff");
|
||||
13
doc/source/netscript/basicfunctions/clear.rst
Normal file
13
doc/source/netscript/basicfunctions/clear.rst
Normal file
@@ -0,0 +1,13 @@
|
||||
clear() Netscript Function
|
||||
==========================
|
||||
|
||||
.. 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 :ref:`Netscript Port <netscript_ports>` or a text file.
|
||||
|
||||
If the *port/fn* argument is a number between 1 and 20, then it specifies a port and will clear it (deleting all data from the underlying queue).
|
||||
|
||||
If the *port/fn* argument is a string, then it specifies the name of a text file (.txt) and will delete all data from that text file.
|
||||
8
doc/source/netscript/basicfunctions/clearLog.rst
Normal file
8
doc/source/netscript/basicfunctions/clearLog.rst
Normal file
@@ -0,0 +1,8 @@
|
||||
clearLog() Netscript Function
|
||||
=============================
|
||||
|
||||
.. js:function:: clearLog()
|
||||
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Clears the script's logs
|
||||
14
doc/source/netscript/basicfunctions/deleteServer.rst
Normal file
14
doc/source/netscript/basicfunctions/deleteServer.rst
Normal file
@@ -0,0 +1,14 @@
|
||||
deleteServer() Netscript Function
|
||||
=================================
|
||||
|
||||
.. 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.
|
||||
|
||||
The *hostname* argument can be any data type, but it will be converted to a string. Whitespace is automatically removed from
|
||||
the string. This function will not delete a server that still has scripts running on it.
|
||||
|
||||
Returns true if successful, and false otherwise.
|
||||
16
doc/source/netscript/basicfunctions/disableLog.rst
Normal file
16
doc/source/netscript/basicfunctions/disableLog.rst
Normal file
@@ -0,0 +1,16 @@
|
||||
disableLog() Netscript Function
|
||||
===============================
|
||||
|
||||
.. 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.
|
||||
|
||||
Note that this does not completely remove all logging functionality.
|
||||
This only stops a function from logging
|
||||
when the function is successful. If the function fails, it will still log the reason for failure.
|
||||
|
||||
Notable functions that cannot have their logs disabled: run, exec, exit
|
||||
10
doc/source/netscript/basicfunctions/enableLog.rst
Normal file
10
doc/source/netscript/basicfunctions/enableLog.rst
Normal file
@@ -0,0 +1,10 @@
|
||||
enableLog() Netscript Function
|
||||
==============================
|
||||
|
||||
.. 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')
|
||||
39
doc/source/netscript/basicfunctions/exec.rst
Normal file
39
doc/source/netscript/basicfunctions/exec.rst
Normal file
@@ -0,0 +1,39 @@
|
||||
exec() Netscript Function
|
||||
=========================
|
||||
|
||||
.. js:function:: exec(script, hostname/ip, [numThreads=1], [args...])
|
||||
|
||||
:param string script: Filename of script to execute
|
||||
:param string hostname/ip: IP or hostname of the 'target server' on which to execute the script
|
||||
:param number numThreads: Optional thread count for new script. Set to 1 by default. Will be rounded to nearest integer
|
||||
:param args...:
|
||||
Additional arguments to pass into the new script that is being run. Note that if any arguments are being
|
||||
passed into the new script, then the third argument *numThreads* must be filled in with a value.
|
||||
: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.
|
||||
|
||||
If the script was successfully started, then this functions returns the PID
|
||||
of that script. Otherwise, it returns 0.
|
||||
|
||||
.. note:: PID stands for Process ID. The PID is a unique identifier for each script.
|
||||
The PID will always be a positive integer.
|
||||
|
||||
.. warning:: Running this function with a *numThreads* argument of 0 will return 0 without
|
||||
running the script. However, running this function with a negative *numThreads*
|
||||
argument will cause a runtime error.
|
||||
|
||||
The simplest way to use the *exec* command is to call it with just the script name and the target server.
|
||||
The following example will try to run *generic-hack.script* on the *foodnstuff* server::
|
||||
|
||||
exec("generic-hack.script", "foodnstuff");
|
||||
|
||||
The following example will try to run the script *generic-hack.script* on the *joesguns* server with 10 threads::
|
||||
|
||||
exec("generic-hack.script", "joesguns", 10);
|
||||
|
||||
This last example will try to run the script *foo.script* on the *foodnstuff* server with 5 threads. It will also pass
|
||||
the number 1 and the string "test" in as arguments to the script::
|
||||
|
||||
exec("foo.script", "foodnstuff", 5, 1, "test");
|
||||
8
doc/source/netscript/basicfunctions/exit.rst
Normal file
8
doc/source/netscript/basicfunctions/exit.rst
Normal file
@@ -0,0 +1,8 @@
|
||||
exit() Netscript Function
|
||||
=========================
|
||||
|
||||
.. js:function:: exit()
|
||||
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Terminates the current script immediately
|
||||
25
doc/source/netscript/basicfunctions/fileExists.rst
Normal file
25
doc/source/netscript/basicfunctions/fileExists.rst
Normal file
@@ -0,0 +1,25 @@
|
||||
fileExists() Netscript Function
|
||||
===============================
|
||||
|
||||
.. js:function:: fileExists(filename, [hostname/ip])
|
||||
|
||||
:param string filename: Filename of file to check
|
||||
:param string hostname/ip:
|
||||
Hostname or IP of target server. This is optional. If it is not specified then the
|
||||
function will use the current server as the target server
|
||||
: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")*
|
||||
will work fine, even though the actual program is named "BruteSSH.exe".
|
||||
|
||||
If the *hostname/ip* argument is omitted, then the function will search through the current server (the server
|
||||
running the script that calls this function) for the file.
|
||||
|
||||
Examples::
|
||||
|
||||
fileExists("foo.script", "foodnstuff");
|
||||
fileExists("ftpcrack.exe");
|
||||
|
||||
The first example above will return true if the script named *foo.script* exists on the *foodnstuff* server, and false otherwise.
|
||||
The second example above will return true if the current server contains the *FTPCrack.exe* program, and false otherwise.
|
||||
13
doc/source/netscript/basicfunctions/ftpcrack.rst
Normal file
13
doc/source/netscript/basicfunctions/ftpcrack.rst
Normal file
@@ -0,0 +1,13 @@
|
||||
ftpcrack() Netscript Function
|
||||
=============================
|
||||
|
||||
.. js:function:: ftpcrack(hostname/ip)
|
||||
|
||||
:param string hostname/ip: IP or hostname of the target server
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Runs the FTPCrack.exe program on the target server. FTPCrack.exe must exist on your home computer.
|
||||
|
||||
Example::
|
||||
|
||||
ftpcrack("foodnstuff");
|
||||
8
doc/source/netscript/basicfunctions/getFavorToDonate.rst
Normal file
8
doc/source/netscript/basicfunctions/getFavorToDonate.rst
Normal file
@@ -0,0 +1,8 @@
|
||||
getFavorToDonate() Netscript Function
|
||||
=====================================
|
||||
|
||||
.. js:function:: getFavorToDonate()
|
||||
|
||||
:RAM cost: 0.1 GB
|
||||
|
||||
Returns the amount of Faction favor required to be able to donate to a faction.
|
||||
16
doc/source/netscript/basicfunctions/getGrowTime.rst
Normal file
16
doc/source/netscript/basicfunctions/getGrowTime.rst
Normal file
@@ -0,0 +1,16 @@
|
||||
getGrowTime() Netscript Function
|
||||
================================
|
||||
|
||||
.. js:function:: getGrowTime(hostname/ip[, hackLvl=current level])
|
||||
|
||||
: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.
|
||||
|
||||
The function takes in an optional *hackLvl* parameter that can be specified
|
||||
to see what the grow time would be at different hacking levels.
|
||||
|
||||
.. note:: For Hacknet Servers (the upgraded version of a Hacknet Node), this function will
|
||||
return :code:`Infinity`.
|
||||
16
doc/source/netscript/basicfunctions/getHackTime.rst
Normal file
16
doc/source/netscript/basicfunctions/getHackTime.rst
Normal file
@@ -0,0 +1,16 @@
|
||||
getHackTime() Netscript Function
|
||||
================================
|
||||
|
||||
.. js:function:: getHackTime(hostname/ip[, hackLvl=current level])
|
||||
|
||||
: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.
|
||||
|
||||
The function takes in an optional *hackLvl* parameter that can be specified
|
||||
to see what the hack time would be at different hacking levels.
|
||||
|
||||
.. note:: For Hacknet Servers (the upgraded version of a Hacknet Node), this function will
|
||||
return :code:`Infinity`.
|
||||
8
doc/source/netscript/basicfunctions/getHackingLevel.rst
Normal file
8
doc/source/netscript/basicfunctions/getHackingLevel.rst
Normal file
@@ -0,0 +1,8 @@
|
||||
getHackingLevel() Netscript Function
|
||||
====================================
|
||||
|
||||
.. js:function:: getHackingLevel()
|
||||
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Returns the player's current hacking level
|
||||
@@ -0,0 +1,22 @@
|
||||
getHackingMultipliers() Netscript Function
|
||||
==========================================
|
||||
|
||||
.. js:function:: getHackingMultipliers()
|
||||
|
||||
:RAM cost: 4 GB
|
||||
|
||||
Returns an object containing the Player's hacking related multipliers. These multipliers are
|
||||
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,
|
||||
speed: Player's hacking speed multiplier,
|
||||
money: Player's hacking money stolen multiplier,
|
||||
growth: Player's hacking growth multiplier
|
||||
}
|
||||
|
||||
Example of how this can be used::
|
||||
|
||||
mults = getHackingMultipliers();
|
||||
print(mults.chance);
|
||||
print(mults.growth);
|
||||
@@ -0,0 +1,23 @@
|
||||
getHacknetMultipliers() Netscript Function
|
||||
==========================================
|
||||
|
||||
.. js:function:: getHacknetMultipliers()
|
||||
|
||||
:RAM cost: 4 GB
|
||||
|
||||
Returns an object containing the Player's hacknet related multipliers. These multipliers are
|
||||
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,
|
||||
purchaseCost: Player's hacknet purchase cost multiplier,
|
||||
ramCost: Player's hacknet ram cost multiplier,
|
||||
coreCost: Player's hacknet core cost multiplier,
|
||||
levelCost: Player's hacknet level cost multiplier
|
||||
}
|
||||
|
||||
Example of how this can be used::
|
||||
|
||||
mults = getHacknetMultipliers();
|
||||
print(mults.production);
|
||||
print(mults.purchaseCost);
|
||||
8
doc/source/netscript/basicfunctions/getHostname.rst
Normal file
8
doc/source/netscript/basicfunctions/getHostname.rst
Normal file
@@ -0,0 +1,8 @@
|
||||
getHostname() Netscript Function
|
||||
================================
|
||||
|
||||
.. js:function:: getHostname()
|
||||
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Returns a string with the hostname of the server that the script is running on
|
||||
11
doc/source/netscript/basicfunctions/getPortHandle.rst
Normal file
11
doc/source/netscript/basicfunctions/getPortHandle.rst
Normal file
@@ -0,0 +1,11 @@
|
||||
getPortHandle() Netscript Function
|
||||
==================================
|
||||
|
||||
.. 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`
|
||||
|
||||
**WARNING:** Port Handles only work in :ref:`netscriptjs`. They will not work in :ref:`netscript1`.
|
||||
@@ -0,0 +1,16 @@
|
||||
getPurchasedServerCost() Netscript Function
|
||||
===========================================
|
||||
|
||||
.. 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*.
|
||||
|
||||
Examples::
|
||||
|
||||
for (i = 1; i <= 20; i++) {
|
||||
tprint(i + " -- " + getPurchasedServerCost(Math.pow(2, i)));
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
getPurchasedServerLimit() Netscript Function
|
||||
============================================
|
||||
|
||||
.. js:function:: getPurchasedServerLimit()
|
||||
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Returns the maximum number of servers you can purchase
|
||||
@@ -0,0 +1,8 @@
|
||||
getPurchasedServerMaxRam() Netscript Function
|
||||
=============================================
|
||||
|
||||
.. js:function:: getPurchasedServerMaxRam()
|
||||
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Returns the maximum RAM that a purchased server can have
|
||||
11
doc/source/netscript/basicfunctions/getPurchasedServers.rst
Normal file
11
doc/source/netscript/basicfunctions/getPurchasedServers.rst
Normal file
@@ -0,0 +1,11 @@
|
||||
getPurchasedServers() Netscript Function
|
||||
========================================
|
||||
|
||||
.. js:function:: getPurchasedServers([hostname=true])
|
||||
|
||||
:param boolean hostname:
|
||||
Specifies whether hostnames or IP addresses should be returned. If it's true then hostnames will be returned, and if false
|
||||
then IPs will be returned. If this argument is omitted then it is true by default
|
||||
:RAM cost: 2.25 GB
|
||||
|
||||
Returns an array with either the hostnames or IPs of all of the servers you have purchased.
|
||||
14
doc/source/netscript/basicfunctions/getScriptExpGain.rst
Normal file
14
doc/source/netscript/basicfunctions/getScriptExpGain.rst
Normal file
@@ -0,0 +1,14 @@
|
||||
getScriptExpGain() Netscript Function
|
||||
=====================================
|
||||
|
||||
.. js:function:: getScriptExpGain([scriptname], [hostname/ip], [args...])
|
||||
|
||||
:param string scriptname: Filename of script
|
||||
:param string hostname/ip: Server on which script is running
|
||||
:param args...: Arguments that the script is running with
|
||||
: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.
|
||||
|
||||
This function can also return the total experience gain rate of all of your active scripts by running the function with no arguments.
|
||||
18
doc/source/netscript/basicfunctions/getScriptIncome.rst
Normal file
18
doc/source/netscript/basicfunctions/getScriptIncome.rst
Normal file
@@ -0,0 +1,18 @@
|
||||
getScriptIncome() Netscript Function
|
||||
====================================
|
||||
|
||||
.. js:function:: getScriptIncome([scriptname], [hostname/ip], [args...])
|
||||
|
||||
:param string scriptname: Filename of script
|
||||
:param string hostname/ip: Server on which script is running
|
||||
:param args...: Arguments that the script is running with
|
||||
: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
|
||||
"foodnstuff" and "5" then in order to use this function to get that script's income you must specify those same arguments in the same order
|
||||
in this function call.
|
||||
|
||||
This function can also be called with no arguments. If called with no arguments, then this function will return an array of two values. The
|
||||
first value is the total income ($ / second) of all of your active scripts (scripts that are currently running on any server). The second value
|
||||
is the total income ($ / second) that you've earned from scripts since you last installed Augmentations.
|
||||
33
doc/source/netscript/basicfunctions/getScriptLogs.rst
Normal file
33
doc/source/netscript/basicfunctions/getScriptLogs.rst
Normal file
@@ -0,0 +1,33 @@
|
||||
getScriptLogs() Netscript Function
|
||||
==================================
|
||||
|
||||
.. js:function:: getScriptLogs([fn], [hostname/ip=current ip], [args...])
|
||||
|
||||
:param string fn: Optional. Filename of script to get logs from.
|
||||
:param string ip: Optional. IP or hostname of the server that the script is on
|
||||
:param args...: Arguments to identify which scripts to get logs for
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Returns a 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.
|
||||
|
||||
Note that there is a maximum number of lines that a script stores in its logs.
|
||||
This is configurable in the game's options.
|
||||
|
||||
If the function is called with no arguments, it will return the current script's logs.
|
||||
|
||||
Otherwise, the `fn`, `hostname/ip,` and `args...` arguments can be used to get the logs
|
||||
from another script. Remember that scripts are uniquely identified by both
|
||||
their names and arguments.
|
||||
|
||||
Examples::
|
||||
|
||||
// Get logs from foo.script on the current server that was run with no args
|
||||
getScriptLogs("foo.script");
|
||||
|
||||
// Get logs from foo.script on the foodnstuff server that was run with no args
|
||||
getScriptLogs("foo.script", "foodnstuff");
|
||||
|
||||
// Get logs from foo.script on the foodnstuff server that was run with the arguments [1, "test"]
|
||||
getScriptLogs("foo.script", "foodnstuff", 1, "test");
|
||||
8
doc/source/netscript/basicfunctions/getScriptName.rst
Normal file
8
doc/source/netscript/basicfunctions/getScriptName.rst
Normal file
@@ -0,0 +1,8 @@
|
||||
getScriptName() Netscript Function
|
||||
==================================
|
||||
|
||||
.. js:function:: getScriptName()
|
||||
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Returns the current script name
|
||||
11
doc/source/netscript/basicfunctions/getScriptRam.rst
Normal file
11
doc/source/netscript/basicfunctions/getScriptRam.rst
Normal file
@@ -0,0 +1,11 @@
|
||||
getScriptRam() Netscript Function
|
||||
=================================
|
||||
|
||||
.. js:function:: getScriptRam(scriptname[, hostname/ip])
|
||||
|
||||
:param string scriptname: Filename of script. This is case-sensitive.
|
||||
:param string hostname/ip: Hostname or IP of target server the script is located on. This is optional, If it is not specified then the function will set 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.
|
||||
@@ -0,0 +1,12 @@
|
||||
getServerBaseSecurityLevel() Netscript Function
|
||||
===============================================
|
||||
|
||||
.. 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
|
||||
security level of a server, which can constantly change due to *hack()*, *grow()*, and *weaken()*, calls on that
|
||||
server. The base security level will stay the same until you reset by installing an Augmentation(s).
|
||||
12
doc/source/netscript/basicfunctions/getServerGrowth.rst
Normal file
12
doc/source/netscript/basicfunctions/getServerGrowth.rst
Normal file
@@ -0,0 +1,12 @@
|
||||
getServerGrowth() Netscript Function
|
||||
====================================
|
||||
|
||||
.. 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
|
||||
percentage by which the server's money is increased when using the *grow()* function. A higher
|
||||
growth parameter will result in a higher percentage increase from *grow()*.
|
||||
@@ -0,0 +1,9 @@
|
||||
getServerMaxMoney() Netscript Function
|
||||
======================================
|
||||
|
||||
.. 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
|
||||
@@ -0,0 +1,9 @@
|
||||
getServerMinSecurityLevel() Netscript Function
|
||||
==============================================
|
||||
|
||||
.. 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
|
||||
@@ -0,0 +1,15 @@
|
||||
getServerMoneyAvailable() Netscript Function
|
||||
============================================
|
||||
|
||||
.. 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.**
|
||||
|
||||
Example::
|
||||
|
||||
getServerMoneyAvailable("foodnstuff");
|
||||
getServerMoneyAvailable("home"); //Returns player's money
|
||||
@@ -0,0 +1,9 @@
|
||||
getServerNumPortsRequired() Netscript Function
|
||||
==============================================
|
||||
|
||||
.. 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.
|
||||
17
doc/source/netscript/basicfunctions/getServerRam.rst
Normal file
17
doc/source/netscript/basicfunctions/getServerRam.rst
Normal file
@@ -0,0 +1,17 @@
|
||||
getServerRam() Netscript Function
|
||||
=================================
|
||||
|
||||
.. 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
|
||||
the array is the amount of RAM that is currently being used on the server (in GB).
|
||||
|
||||
Example::
|
||||
|
||||
res = getServerRam("helios");
|
||||
totalRam = res[0];
|
||||
ramUsed = res[1];
|
||||
@@ -0,0 +1,9 @@
|
||||
getServerRequiredHackingLevel() Netscript Function
|
||||
==================================================
|
||||
|
||||
.. 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
|
||||
@@ -0,0 +1,10 @@
|
||||
getServerSecurityLevel() Netscript Function
|
||||
===========================================
|
||||
|
||||
.. 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).
|
||||
@@ -0,0 +1,8 @@
|
||||
getTimeSinceLastAug() Netscript Function
|
||||
========================================
|
||||
|
||||
.. js:function:: getTimeSinceLastAug()
|
||||
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Returns the amount of time in milliseconds that have passed since you last installed Augmentations
|
||||
16
doc/source/netscript/basicfunctions/getWeakenTime.rst
Normal file
16
doc/source/netscript/basicfunctions/getWeakenTime.rst
Normal file
@@ -0,0 +1,16 @@
|
||||
getWeakenTime() Netscript Function
|
||||
==================================
|
||||
|
||||
.. js:function:: getWeakenTime(hostname/ip[, hackLvl=current level])
|
||||
|
||||
: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.
|
||||
|
||||
The function takes in an optional *hackLvl* parameter that can be specified
|
||||
to see what the weaken time would be at different hacking levels.
|
||||
|
||||
.. note:: For Hacknet Servers (the upgraded version of a Hacknet Node), this function will
|
||||
return :code:`Infinity`.
|
||||
29
doc/source/netscript/basicfunctions/grow.rst
Normal file
29
doc/source/netscript/basicfunctions/grow.rst
Normal file
@@ -0,0 +1,29 @@
|
||||
grow() Netscript Function
|
||||
=========================
|
||||
|
||||
.. js:function:: grow(hostname/ip[, opts={}])
|
||||
|
||||
:param string hostname/ip: IP or hostname of the target server to grow
|
||||
:param object opts: Optional parameters for configuring function behavior. Properties:
|
||||
|
||||
* threads (*number*) - Number of threads to use for this function.
|
||||
Must be less than or equal to the number of threads the script is running with.
|
||||
* stock (*boolean*) - If true, the function can affect the stock market. See
|
||||
:ref:`gameplay_stock_market_player_actions_influencing_stock`
|
||||
|
||||
: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
|
||||
certain, fixed percentage. This percentage is determined by the target server's growth rate (which varies between servers) and security level.
|
||||
Generally, higher-level servers have higher growth rates. The getServerGrowth() function can be used to obtain a server's growth rate.
|
||||
|
||||
Like hack(), grow() can be called on any server, regardless of where the script is running. The grow() command requires
|
||||
root access to the target server, but there is no required hacking level to run the command. It also raises the security level
|
||||
of the target server by 0.004.
|
||||
|
||||
Example::
|
||||
|
||||
grow("foodnstuff");
|
||||
grow("foodnstuff", { threads: 5 }); // Only use 5 threads to grow
|
||||
24
doc/source/netscript/basicfunctions/growthAnalyze.rst
Normal file
24
doc/source/netscript/basicfunctions/growthAnalyze.rst
Normal file
@@ -0,0 +1,24 @@
|
||||
growthAnalyze() Netscript Function
|
||||
==================================
|
||||
|
||||
.. js:function:: growthAnalyze(hostname/ip, growthAmount)
|
||||
|
||||
:param string hostname/ip: IP or hostname of server to analyze
|
||||
:param number growthAmount: Multiplicative factor by which the server is grown. Decimal form. Must be >= 1.
|
||||
:returns: The amount of grow() calls needed to grow the specified server by the specified amount
|
||||
:RAM cost: 1 GB
|
||||
|
||||
This function returns the number of "growths" needed in order to increase the amount
|
||||
of money available on the specified server by the specified amount.
|
||||
|
||||
The specified amount is multiplicative and is in decimal form, not percentage.
|
||||
|
||||
For example, if you want to determine how many `grow()` calls you need
|
||||
to double the amount of money on `foodnstuff`, you would use::
|
||||
|
||||
growthAnalyze("foodnstuff", 2);
|
||||
|
||||
If this returns 100, then this means you need to call `grow()` 100 times
|
||||
in order to double the money (or once with 100 threads).
|
||||
|
||||
**Warning**: The value returned by this function isn't necessarily a whole number.
|
||||
30
doc/source/netscript/basicfunctions/hack.rst
Normal file
30
doc/source/netscript/basicfunctions/hack.rst
Normal file
@@ -0,0 +1,30 @@
|
||||
hack() Netscript Function
|
||||
=========================
|
||||
|
||||
.. js:function:: hack(hostname/ip[, opts={}])
|
||||
|
||||
:param string hostname/ip: IP or hostname of the target server to hack
|
||||
:param object opts: Optional parameters for configuring function behavior. Properties:
|
||||
|
||||
* threads (*number*) - Number of threads to use for this function.
|
||||
Must be less than or equal to the number of threads the script is running with.
|
||||
* stock (*boolean*) - If true, the function can affect the stock market. See
|
||||
:ref:`gameplay_stock_market_player_actions_influencing_stock`
|
||||
|
||||
: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
|
||||
to that server and also have the required hacking level.
|
||||
|
||||
A script can hack a server from anywhere. It does not need to be running on the same server to hack that server. For example,
|
||||
you can create a script that hacks the 'foodnstuff' server and run that script on any server in the game.
|
||||
|
||||
A successful hack() on a server will raise that server's security level by 0.002.
|
||||
|
||||
Example::
|
||||
|
||||
hack("foodnstuff");
|
||||
hack("10.1.2.3");
|
||||
hack("foodnstuff", { threads: 5 }); // Only use 5 threads to hack
|
||||
20
doc/source/netscript/basicfunctions/hackAnalyzePercent.rst
Normal file
20
doc/source/netscript/basicfunctions/hackAnalyzePercent.rst
Normal file
@@ -0,0 +1,20 @@
|
||||
hackAnalyzePercent() Netscript Function
|
||||
=======================================
|
||||
|
||||
.. js:function:: hackAnalyzePercent(hostname/ip)
|
||||
|
||||
:param string hostname/ip: IP or hostname of target server
|
||||
:returns: The percentage of money you will steal from the target server with a single hack
|
||||
:RAM cost: 1 GB
|
||||
|
||||
Returns the percentage of the specified server's money you will steal with a
|
||||
single hack. This value is returned in **percentage form, not decimal (Netscript
|
||||
functions typically return in decimal form, but not this one).**
|
||||
|
||||
For example, assume the following returns 1::
|
||||
|
||||
hackAnalyzePercent("foodnstuff");
|
||||
|
||||
This means that if hack the `foodnstuff` server, then you will steal 1% of its
|
||||
total money. If you `hack()` using N threads, then you will steal N% of its total
|
||||
money.
|
||||
33
doc/source/netscript/basicfunctions/hackAnalyzeThreads.rst
Normal file
33
doc/source/netscript/basicfunctions/hackAnalyzeThreads.rst
Normal file
@@ -0,0 +1,33 @@
|
||||
hackAnalyzeThreads() Netscript Function
|
||||
=======================================
|
||||
|
||||
.. js:function:: hackAnalyzeThreads(hostname/ip, hackAmount)
|
||||
|
||||
:param string hostname/ip: IP or hostname of server to analyze
|
||||
:param number hackAmount: Amount of money you want to hack from the server
|
||||
:returns: The number of threads needed to hack() the server for *hackAmount* money
|
||||
:RAM cost: 1 GB
|
||||
|
||||
This function returns the number of script threads you need when running
|
||||
the `hack()` command to steal the specified amount of money from the target server.
|
||||
|
||||
If `hackAmount` is less than zero or greater than the amount of money available
|
||||
on the server, then this function returns -1.
|
||||
|
||||
For example, let's say the `foodnstuff` server has $10m and you run::
|
||||
|
||||
hackAnalyzeThreads("foodnstuff", 1e6);
|
||||
|
||||
If this function returns 50, this means that if your next `hack()` call
|
||||
is run on a script with 50 threads, it will steal $1m from the `foodnstuff` server.
|
||||
|
||||
.. warning:: The value returned by this function isn't necessarily a whole number.
|
||||
.. warning:: It is possible for this function to return :code:`Infinity` or :code:`NaN` in
|
||||
certain uncommon scenarios. This is because in JavaScript:
|
||||
|
||||
* :code:`0 / 0 = NaN`
|
||||
* :code:`N / 0 = Infinity` for 0 < N < Infinity.
|
||||
|
||||
For example, if a server has no money available and you want to hack some positive
|
||||
amount from it, then the function would return :code:`Infinity` because
|
||||
this would be impossible.
|
||||
11
doc/source/netscript/basicfunctions/hackChance.rst
Normal file
11
doc/source/netscript/basicfunctions/hackChance.rst
Normal file
@@ -0,0 +1,11 @@
|
||||
hackChance() Netscript Function
|
||||
===============================
|
||||
|
||||
.. js:function:: hackChance(hostname/ip)
|
||||
|
||||
:param string hostname/ip: IP or hostname of target server
|
||||
:returns: The chance you have of successfully hacking the target server
|
||||
:RAM cost: 1 GB
|
||||
|
||||
Returns the chance you have of successfully hacking the specified server. This
|
||||
returned value is in decimal form, not percentage.
|
||||
15
doc/source/netscript/basicfunctions/hasRootAccess.rst
Normal file
15
doc/source/netscript/basicfunctions/hasRootAccess.rst
Normal file
@@ -0,0 +1,15 @@
|
||||
hasRootAccess() Netscript Function
|
||||
==================================
|
||||
|
||||
.. 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.
|
||||
|
||||
Example::
|
||||
|
||||
if (hasRootAccess("foodnstuff") == false) {
|
||||
nuke("foodnstuff");
|
||||
}
|
||||
13
doc/source/netscript/basicfunctions/httpworm.rst
Normal file
13
doc/source/netscript/basicfunctions/httpworm.rst
Normal file
@@ -0,0 +1,13 @@
|
||||
httpworm() Netscript Function
|
||||
=============================
|
||||
|
||||
.. js:function:: httpworm(hostname/ip)
|
||||
|
||||
:param string hostname/ip: IP or hostname of the target server
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Runs the HTTPWorm.exe program on the target server. HTTPWorm.exe must exist on your home computer.
|
||||
|
||||
Example::
|
||||
|
||||
httpworm("foodnstuff");
|
||||
10
doc/source/netscript/basicfunctions/isLogEnabled.rst
Normal file
10
doc/source/netscript/basicfunctions/isLogEnabled.rst
Normal file
@@ -0,0 +1,10 @@
|
||||
isLogEnabled() Netscript Function
|
||||
=================================
|
||||
|
||||
.. 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')
|
||||
29
doc/source/netscript/basicfunctions/isRunning.rst
Normal file
29
doc/source/netscript/basicfunctions/isRunning.rst
Normal file
@@ -0,0 +1,29 @@
|
||||
isRunning() Netscript Function
|
||||
==============================
|
||||
|
||||
.. js:function:: isRunning(filename, hostname/ip, [args...])
|
||||
|
||||
:param string filename: Filename of script to check. This is case-sensitive.
|
||||
:param string hostname/ip: Hostname or IP of target server
|
||||
:param args...: Arguments to specify/identify which scripts to search for
|
||||
: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.
|
||||
|
||||
**Examples:**
|
||||
|
||||
In this first example below, the function call will return true if there is a script named *foo.script* with no arguments
|
||||
running on the *foodnstuff* server, and false otherwise::
|
||||
|
||||
isRunning("foo.script", "foodnstuff");
|
||||
|
||||
In this second example below, the function call will return true if there is a script named *foo.script* with no arguments
|
||||
running on the current server, and false otherwise::
|
||||
|
||||
isRunning("foo.script", getHostname());
|
||||
|
||||
In this next example below, the function call will return true if there is a script named *foo.script* running with the arguments
|
||||
1, 5, and "test" (in that order) on the *joesguns* server, and false otherwise::
|
||||
|
||||
isRunning("foo.script", "joesguns", 1, 5, "test");
|
||||
48
doc/source/netscript/basicfunctions/kill.rst
Normal file
48
doc/source/netscript/basicfunctions/kill.rst
Normal file
@@ -0,0 +1,48 @@
|
||||
kill() Netscript Function
|
||||
=========================
|
||||
|
||||
.. js:function:: kill(script, hostname/ip, [args...])
|
||||
|
||||
:param string script: Filename of the script to kill
|
||||
:param string hostname/ip: IP or hostname of the server on which to kill the script
|
||||
:param args...: Arguments to identify which script to kill
|
||||
: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
|
||||
is not the same as *foo.script* run with the argument 2, even though they have the same code.
|
||||
|
||||
If this function successfully kills the specified script, then it will return true. Otherwise, it will return false.
|
||||
|
||||
Examples:
|
||||
|
||||
The following example will try to kill a script named *foo.script* on the *foodnstuff* server that was ran with no arguments::
|
||||
|
||||
kill("foo.script", "foodnstuff");
|
||||
|
||||
The following will try to kill a script named *foo.script* on the current server that was ran with no arguments::
|
||||
|
||||
kill("foo.script", getHostname());
|
||||
|
||||
The following will try to kill a script named *foo.script* on the current server that was ran with the arguments 1 and "foodnstuff"::
|
||||
|
||||
kill("foo.script", getHostname(), 1, "foodnstuff");
|
||||
|
||||
.. js:function:: kill(scriptPid)
|
||||
|
||||
:param number scriptPid: PID of the script to kill
|
||||
:RAM cost: 0.5 GB
|
||||
|
||||
Kills the script with the specified PID. Killing a script by its PID will typically
|
||||
have better performance, especially if you have many scripts running.
|
||||
|
||||
If this function successfully kills the specified script, then it will return true.
|
||||
Otherwise, it will return false.
|
||||
|
||||
*Examples:*
|
||||
|
||||
The following example will try to kill the script with the PID 10::
|
||||
|
||||
if (kill(10)) {
|
||||
print("Killed script with PID 10!");
|
||||
}
|
||||
10
doc/source/netscript/basicfunctions/killall.rst
Normal file
10
doc/source/netscript/basicfunctions/killall.rst
Normal file
@@ -0,0 +1,10 @@
|
||||
killall() Netscript Function
|
||||
============================
|
||||
|
||||
.. 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.
|
||||
11
doc/source/netscript/basicfunctions/ls.rst
Normal file
11
doc/source/netscript/basicfunctions/ls.rst
Normal file
@@ -0,0 +1,11 @@
|
||||
ls() Netscript Function
|
||||
=======================
|
||||
|
||||
.. js:function:: ls(hostname/ip, [grep])
|
||||
|
||||
: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.2 GB
|
||||
|
||||
Returns an array with the filenames of all files on the specified server (as strings). The returned array
|
||||
is sorted in alphabetic order
|
||||
20
doc/source/netscript/basicfunctions/nFormat.rst
Normal file
20
doc/source/netscript/basicfunctions/nFormat.rst
Normal file
@@ -0,0 +1,20 @@
|
||||
nFormat() Netscript Function
|
||||
============================
|
||||
|
||||
.. js:function:: nFormat(n, format)
|
||||
|
||||
:param number n: Number to format
|
||||
:param string format: Formatter
|
||||
:RAM cost: 0 GB
|
||||
|
||||
Converts a number into a string with the specified formatter. This uses the
|
||||
`numeraljs <http://numeraljs.com/>`_ library, so the formatters must be compatible
|
||||
with that.
|
||||
|
||||
This is the same function that the game itself uses to display numbers.
|
||||
|
||||
Examples::
|
||||
|
||||
nFormat(1.23e9, "$0.000a"); // Returns "$1.230b"
|
||||
nFormat(12345.678, "0,0"); // Returns "12,346"
|
||||
nFormat(0.84, "0.0%"); // Returns "84.0%
|
||||
13
doc/source/netscript/basicfunctions/nuke.rst
Normal file
13
doc/source/netscript/basicfunctions/nuke.rst
Normal file
@@ -0,0 +1,13 @@
|
||||
nuke() Netscript Function
|
||||
=========================
|
||||
|
||||
.. js:function:: nuke(hostname/ip)
|
||||
|
||||
:param string hostname/ip: IP or hostname of the target server
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Runs the NUKE.exe program on the target server. NUKE.exe must exist on your home computer.
|
||||
|
||||
Example::
|
||||
|
||||
nuke("foodnstuff");
|
||||
12
doc/source/netscript/basicfunctions/peek.rst
Normal file
12
doc/source/netscript/basicfunctions/peek.rst
Normal file
@@ -0,0 +1,12 @@
|
||||
peek() Netscript Function
|
||||
=========================
|
||||
|
||||
.. 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.
|
||||
|
||||
Read about how :ref:`netscript_ports` work here
|
||||
9
doc/source/netscript/basicfunctions/print.rst
Normal file
9
doc/source/netscript/basicfunctions/print.rst
Normal file
@@ -0,0 +1,9 @@
|
||||
print() Netscript Function
|
||||
===========================
|
||||
|
||||
.. 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.
|
||||
10
doc/source/netscript/basicfunctions/prompt.rst
Normal file
10
doc/source/netscript/basicfunctions/prompt.rst
Normal file
@@ -0,0 +1,10 @@
|
||||
prompt() Netscript Function
|
||||
===========================
|
||||
|
||||
.. 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.
|
||||
28
doc/source/netscript/basicfunctions/ps.rst
Normal file
28
doc/source/netscript/basicfunctions/ps.rst
Normal file
@@ -0,0 +1,28 @@
|
||||
ps() Netscript Function
|
||||
=======================
|
||||
|
||||
.. js:function:: ps(hostname/ip=current ip)
|
||||
|
||||
: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.2 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
|
||||
the following structure::
|
||||
|
||||
{
|
||||
filename: Script name,
|
||||
threads: Number of threads script is running with,
|
||||
args: Script's arguments
|
||||
}
|
||||
|
||||
Example usage (using :ref:`netscriptjs`)::
|
||||
|
||||
export async function main(ns) {
|
||||
const ps = ns.ps("home");
|
||||
for (let i = 0; i < ps.length; ++i) {
|
||||
ns.tprint(ps[i].filename + ' ' + ps[i].threads);
|
||||
ns.tprint(ps[i].args);
|
||||
}
|
||||
}
|
||||
30
doc/source/netscript/basicfunctions/purchaseServer.rst
Normal file
30
doc/source/netscript/basicfunctions/purchaseServer.rst
Normal file
@@ -0,0 +1,30 @@
|
||||
purchaseServer() Netscript Function
|
||||
===================================
|
||||
|
||||
.. js:function:: purchaseServer(hostname, ram)
|
||||
|
||||
:param string hostname: Hostname of the purchased server
|
||||
:param number ram: Amount of RAM of the purchased server. Must be a power of 2. Maximum value of :js:func:`getPurchasedServerMaxRam`
|
||||
:RAM cost: 2.25 GB
|
||||
|
||||
Purchased a server with the specified hostname and amount of RAM.
|
||||
|
||||
The *hostname* argument can be any data type, but it will be converted to a string and have whitespace removed. Anything that resolves to an empty string will
|
||||
cause the function to fail. If there is already a server with the specified hostname, then the function will automatically append
|
||||
a number at the end of the *hostname* argument value until it finds a unique hostname. For example, if the script calls
|
||||
*purchaseServer("foo", 4)* but a server named "foo" already exists, the it will automatically change the hostname to "foo-0". If there is already
|
||||
a server with the hostname "foo-0", then it will change the hostname to "foo-1", and so on.
|
||||
|
||||
Note that there is a maximum limit to the amount of servers you can purchase.
|
||||
|
||||
Returns the hostname of the newly purchased server as a string. If the function fails to purchase a server, then it will return an
|
||||
empty string. The function will fail if the arguments passed in are invalid, if the player does not have enough money to purchase
|
||||
the specified server, or if the player has exceeded the maximum amount of servers.
|
||||
|
||||
Example::
|
||||
|
||||
ram = 64;
|
||||
hn = "pserv-";
|
||||
for (i = 0; i < 5; ++i) {
|
||||
purchaseServer(hn + i, ram);
|
||||
}
|
||||
16
doc/source/netscript/basicfunctions/read.rst
Normal file
16
doc/source/netscript/basicfunctions/read.rst
Normal file
@@ -0,0 +1,16 @@
|
||||
read() Netscript Function
|
||||
=========================
|
||||
|
||||
.. 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)
|
||||
|
||||
If the argument *port/fn* is a number between 1 and 20, then it specifies a port and it will read data from that port. Read
|
||||
about how :ref:`netscript_ports` work here. A port is a serialized queue. This function
|
||||
will remove the first element from that queue and return it. If the queue is empty, then the string "NULL PORT DATA" will be returned.
|
||||
|
||||
If the argument *port/fn* is a string, then it specifies the name of a text file or script and this function will return the data in the specified text file/script. If
|
||||
the text file does not exist, an empty string will be returned.
|
||||
13
doc/source/netscript/basicfunctions/relaysmtp.rst
Normal file
13
doc/source/netscript/basicfunctions/relaysmtp.rst
Normal file
@@ -0,0 +1,13 @@
|
||||
relaysmtp() Netscript Function
|
||||
==============================
|
||||
|
||||
.. js:function:: relaysmtp(hostname/ip)
|
||||
|
||||
:param string hostname/ip: IP or hostname of the target server
|
||||
:RAM cost: 0.05 GB
|
||||
|
||||
Runs the relaySMTP.exe program on the target server. relaySMTP.exe must exist on your home computer.
|
||||
|
||||
Example::
|
||||
|
||||
relaysmtp("foodnstuff");
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user