mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2026-04-25 02:32:55 +02:00
Compare commits
286 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c96c7e3d2e | |||
| 84a1d27b9a | |||
| 99c75baea0 | |||
| 371d41b7c3 | |||
| 02b085cc75 | |||
| e38bfc70cf | |||
| 52a96b94f9 | |||
| 73b9cae203 | |||
| 30588a885b | |||
| 45c46ce2a0 | |||
| 58650c5895 | |||
| 09f621e342 | |||
| 762e7f127c | |||
| d6ea9c55b1 | |||
| 34fa906013 | |||
| 80d197652d | |||
| b5a8ed1d9d | |||
| e047653ed7 | |||
| f645d08a50 | |||
| 515f9e5d4b | |||
| 5e9143371a | |||
| 536b8360cf | |||
| 8b59260bd3 | |||
| 3bd05ea398 | |||
| 79a6c7eb7b | |||
| 1d302a0320 | |||
| d35bac1ace | |||
| e99ffcfe2b | |||
| c1d4ced331 | |||
| 6b0e5416c4 | |||
| 745fb4fdf6 | |||
| af816dbc7e | |||
| 89fa79c4de | |||
| 8819042c0f | |||
| 7417ff8a10 | |||
| e6a4456d81 | |||
| 4603216aa0 | |||
| 3fddb3c9f2 | |||
| fe6473f426 | |||
| 89a6bf175d | |||
| 6b114fab7d | |||
| 542b2d6b8a | |||
| 139ccd11ff | |||
| 38d915372f | |||
| dda6235591 | |||
| 3d97f2d770 | |||
| f60af97e74 | |||
| db9c3193f7 | |||
| c556408208 | |||
| f6ffe5b5be | |||
| cc056ceef4 | |||
| cee716bbb0 | |||
| 737d9e027f | |||
| 63e467986e | |||
| d3fc6a9d48 | |||
| e245c2d3a7 | |||
| 3f1d4875e7 | |||
| 921a1517df | |||
| c4e17c3fb3 | |||
| 2f673b0767 | |||
| b7823f46e4 | |||
| e2c8fed307 | |||
| e436d7f3a0 | |||
| a5a28db47f | |||
| c66a8b5974 | |||
| 3c2a237140 | |||
| 0dbeac52ac | |||
| 6543e73f6f | |||
| 85aa67ac26 | |||
| bf75cf80b8 | |||
| a90575aea9 | |||
| a0baab6f6c | |||
| 83137a2364 | |||
| 78d9c25671 | |||
| 56c8a23631 | |||
| 1d4cf45a92 | |||
| b1e37acaa1 | |||
| 65ee49fb92 | |||
| 6a795a7c50 | |||
| ae33a23db4 | |||
| faad0ae8a7 | |||
| 1ff7f4bcd4 | |||
| 1335ca8e01 | |||
| 8e07cc999d | |||
| 06775b20fa | |||
| 30554560da | |||
| ac3a6b9a6f | |||
| b126bd01ee | |||
| 8f13363466 | |||
| 828c9c2de6 | |||
| dd61fd6efb | |||
| 010f43e5d4 | |||
| 3d36982a56 | |||
| 3fd26bea9b | |||
| e9ba4ae9a2 | |||
| 12b192ab43 | |||
| cdbbc657e2 | |||
| 995a0b11d9 | |||
| 06df10d2f9 | |||
| 01d15176ac | |||
| f9afff57b2 | |||
| 2bf47c60df | |||
| 752534bc4d | |||
| 3346f3539c | |||
| bbf3a1d19a | |||
| a2599f19d7 | |||
| 8e4722c5e7 | |||
| e91c183d37 | |||
| 2ed29e10b3 | |||
| effa9f15af | |||
| 35ebb06761 | |||
| 5d21bd7840 | |||
| 815b04037c | |||
| 3cd0ae51e7 | |||
| ed57a8c4f4 | |||
| 0f7ad063ca | |||
| 809f9117b8 | |||
| 38e165100f | |||
| 7db1164a1a | |||
| 3ca7c49ce8 | |||
| ec3037f8c6 | |||
| 7d0536a4d2 | |||
| 2958034ad4 | |||
| a7dfb1a537 | |||
| be29481689 | |||
| 1d488565c6 | |||
| 42890843fb | |||
| c06aff3437 | |||
| 123f071c12 | |||
| 0edd4ffdf1 | |||
| b1d1de9118 | |||
| 83a84c6d38 | |||
| 75a2742911 | |||
| a420a87eba | |||
| f579ee398b | |||
| 4901c84d34 | |||
| 227fbd7060 | |||
| 70796e7674 | |||
| bb0bdb776b | |||
| 48b839d68c | |||
| c47a5bc8cc | |||
| 33ea31be87 | |||
| 27fc90c87a | |||
| d58e2df9c7 | |||
| c989e6713f | |||
| d21382e96e | |||
| 81fd2c1236 | |||
| bdb10217db | |||
| ab2ffb112f | |||
| ee0532eba7 | |||
| 1a749505e7 | |||
| fae6e6d22f | |||
| 826357e8b8 | |||
| 94550dbaee | |||
| 83c159e901 | |||
| 3f5b412547 | |||
| 1fdb5c33c7 | |||
| 665d25650a | |||
| 447731c5f3 | |||
| cc02701e97 | |||
| 50cf362b3b | |||
| 5ba7b2796d | |||
| 9cbb525da3 | |||
| 0ae8b72188 | |||
| 1e641468f7 | |||
| 3187bb990d | |||
| 4e8bb96f3f | |||
| 97c04a1037 | |||
| 62cd8ffcc6 | |||
| 0d9caac455 | |||
| f701cbffa7 | |||
| 73d0dd98f2 | |||
| c05be66c60 | |||
| b0e4a2a775 | |||
| 86ddc940aa | |||
| 510fcedf90 | |||
| 5cce1c255c | |||
| 854239ceb1 | |||
| 73834d03cd | |||
| cefd499ff6 | |||
| c5713fa6d8 | |||
| b0739f8942 | |||
| a6d7f93111 | |||
| 86678b6290 | |||
| 498a204c88 | |||
| d6584386ff | |||
| b5abbbc240 | |||
| 514b467e27 | |||
| 1fc2e6fd2a | |||
| b758807ba1 | |||
| 14e6dd0158 | |||
| ce578206eb | |||
| 3289f76cd0 | |||
| 3aacab504b | |||
| 6d179be018 | |||
| 86da356478 | |||
| c0e1706128 | |||
| 06f716c0fa | |||
| 07bc697477 | |||
| 60a91cd9f7 | |||
| 97624395c1 | |||
| d49fea4cbc | |||
| 125e9484f7 | |||
| ef17f0d617 | |||
| f7aa393a8f | |||
| 7fb2b8b590 | |||
| cba40c71b2 | |||
| 4254cc2807 | |||
| 8b15adda8a | |||
| b0f20c8c8f | |||
| 5c6c472b64 | |||
| 5170c0e004 | |||
| fe18c55173 | |||
| 69c9b20e68 | |||
| 2d45784102 | |||
| 65cb519801 | |||
| 76e6cb4ecc | |||
| 7b6f9293c7 | |||
| dc2bf871cf | |||
| 1d349c25f7 | |||
| 5484c64a95 | |||
| ec33fb411c | |||
| 2a966d0726 | |||
| 29143999a6 | |||
| a32b8eabe3 | |||
| 43723a3fbb | |||
| ad75fa5ebc | |||
| 4abc1df840 | |||
| da488e586b | |||
| 413333c919 | |||
| 4f219a3214 | |||
| 2e05f14c0d | |||
| 47f54a11c3 | |||
| b8faa9dc0b | |||
| 8fd6b2e7da | |||
| cdd9c174e7 | |||
| e6291a09a0 | |||
| 9ccfca3c72 | |||
| 346024af45 | |||
| 66a2adaeb4 | |||
| c1945ab12e | |||
| 3a7c64872a | |||
| 06edf5b70c | |||
| d2008e86b4 | |||
| 32d1affb50 | |||
| 558b671206 | |||
| a954259e25 | |||
| 64c7831c81 | |||
| 61dd393bb5 | |||
| 28aca06208 | |||
| c79fa240e1 | |||
| e1741778f9 | |||
| 80560ce9f6 | |||
| f9a4eadb71 | |||
| 96f0879230 | |||
| 9c40cf6f28 | |||
| 55901f0574 | |||
| 43f0746be7 | |||
| 8eeed583c2 | |||
| dc518e7032 | |||
| 0c932dd4d1 | |||
| c94ec2f170 | |||
| 6111c50eb1 | |||
| 8977f299e5 | |||
| 2a8b1c2116 | |||
| 9a6b185141 | |||
| 501ce70702 | |||
| 9b94692942 | |||
| 06880c68e1 | |||
| 637f88efcd | |||
| 57a5c8b0b4 | |||
| c3ac16f330 | |||
| c564de40b3 | |||
| 1b26d25a53 | |||
| 7aa2d00460 | |||
| ffa9600302 | |||
| db35fde42e | |||
| d73040fdc5 | |||
| a38df2e613 | |||
| b931ab5566 | |||
| 4e44e784c6 | |||
| aa4451b12d | |||
| 2a52f6fa2b | |||
| 8b7723338b | |||
| 9e62438b43 | |||
| a9c57e23a5 |
@@ -4,3 +4,4 @@ dist/
|
|||||||
tests/*.bundle.*
|
tests/*.bundle.*
|
||||||
src/ThirdParty/*
|
src/ThirdParty/*
|
||||||
src/JSInterpreter.js
|
src/JSInterpreter.js
|
||||||
|
main.bundle.js
|
||||||
@@ -99,7 +99,6 @@ module.exports = {
|
|||||||
"no-catch-shadow": ["error"],
|
"no-catch-shadow": ["error"],
|
||||||
"no-class-assign": ["error"],
|
"no-class-assign": ["error"],
|
||||||
"no-compare-neg-zero": ["error"],
|
"no-compare-neg-zero": ["error"],
|
||||||
"no-cond-assign": ["off", "except-parens"],
|
|
||||||
"no-confusing-arrow": ["error"],
|
"no-confusing-arrow": ["error"],
|
||||||
"no-console": ["off"],
|
"no-console": ["off"],
|
||||||
"no-const-assign": ["error"],
|
"no-const-assign": ["error"],
|
||||||
|
|||||||
@@ -84,6 +84,28 @@ changes are okay to contribute:
|
|||||||
- Changes that directly affect the game's balance
|
- Changes that directly affect the game's balance
|
||||||
- New gameplay mechanics
|
- New gameplay mechanics
|
||||||
|
|
||||||
|
### How to setup fork properly
|
||||||
|
|
||||||
|
Fork and clone the repo
|
||||||
|
|
||||||
|
```
|
||||||
|
# This will add the game original code as a repo in your local copy
|
||||||
|
$ git remote add danielyxie git@github.com:danielyxie/bitburner.git
|
||||||
|
|
||||||
|
# You can verify you did this right by doing the following command
|
||||||
|
$ git remote show
|
||||||
|
danielyxie
|
||||||
|
origin
|
||||||
|
|
||||||
|
# Then download all the branches from the game. (there might be more branches)
|
||||||
|
$ git fetch danielyxie
|
||||||
|
From github.com:danielyxie/bitburner
|
||||||
|
* [new branch] dev -> danielyxie/dev
|
||||||
|
* [new branch] master -> danielyxie/master
|
||||||
|
|
||||||
|
# Makes sure you always start from `danielyxie/dev` to avoid merge conflicts.
|
||||||
|
```
|
||||||
|
|
||||||
#### Submitting a Pull Request
|
#### Submitting a Pull Request
|
||||||
|
|
||||||
When submitting a pull request with your code contributions, please abide by
|
When submitting a pull request with your code contributions, please abide by
|
||||||
|
|||||||
@@ -1,61 +0,0 @@
|
|||||||
@mixin animation($property) {
|
|
||||||
-webkit-animation: $property;
|
|
||||||
-moz-animation: $property;
|
|
||||||
-ms-animation: $property;
|
|
||||||
-o-animation: $property;
|
|
||||||
animation: $property;
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin borderRadius($property) {
|
|
||||||
-webkit-border-radius: $property;
|
|
||||||
-moz-border-radius: $property;
|
|
||||||
border-radius: $property;
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin boxShadow($value) {
|
|
||||||
-webkit-box-shadow: $value;
|
|
||||||
-moz-box-shadow: $value;
|
|
||||||
box-shadow: $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin keyframes($animationName) {
|
|
||||||
@-webkit-keyframes #{$animationName} {
|
|
||||||
$browser: "-webkit-" !global;
|
|
||||||
@content;
|
|
||||||
}
|
|
||||||
|
|
||||||
@-moz-keyframes #{$animationName} {
|
|
||||||
$browser: "-moz-" !global;
|
|
||||||
@content;
|
|
||||||
}
|
|
||||||
|
|
||||||
@-ms-keyframes #{$animationName} {
|
|
||||||
$browser: "-ms-" !global;
|
|
||||||
@content;
|
|
||||||
}
|
|
||||||
|
|
||||||
@-o-keyframes #{$animationName} {
|
|
||||||
$browser: "-o-" !global;
|
|
||||||
@content;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes #{$animationName} {
|
|
||||||
$browser: "" !global;
|
|
||||||
@content;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin transform($property) {
|
|
||||||
-webkit-transform: $property;
|
|
||||||
-moz-transform: $property;
|
|
||||||
-ms-transform: $property;
|
|
||||||
-o-transform: $property;
|
|
||||||
transform: $property;
|
|
||||||
}
|
|
||||||
|
|
||||||
@mixin userSelect($value) {
|
|
||||||
-webkit-user-select: $value;
|
|
||||||
-moz-user-select: $value;
|
|
||||||
-ms-user-select: $value;
|
|
||||||
user-select: $value;
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
@import "theme";
|
|
||||||
|
|
||||||
* {
|
|
||||||
font-size: $defaultFontSize;
|
|
||||||
font-family: $fontFamily;
|
|
||||||
}
|
|
||||||
|
|
||||||
*,
|
|
||||||
*:before,
|
|
||||||
*:after {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
box-sizing: border-box;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
$fontFamily: "Lucida Console", "Lucida Sans Unicode", "Fira Mono", "Consolas", "Courier New", Courier, monospace,
|
|
||||||
"Times New Roman";
|
|
||||||
$defaultFontSize: 16px;
|
|
||||||
|
|
||||||
/* COLORS */
|
|
||||||
$hacker-green: #adff2f;
|
|
||||||
$success-green: #3adb76;
|
|
||||||
$alert-red: #ff2929;
|
|
||||||
$money-gold: #ffd700;
|
|
||||||
$light-yellow: #faffdf;
|
|
||||||
|
|
||||||
/* Attributes */
|
|
||||||
$my-stat-hp-color: #dd3434;
|
|
||||||
$my-stat-money-color: $money-gold;
|
|
||||||
$my-stat-hack-color: $hacker-green;
|
|
||||||
$my-stat-physical: $light-yellow;
|
|
||||||
$my-stat-cha-color: #a671d1;
|
|
||||||
$my-stat-int-color: #6495ed;
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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-content {
|
|
||||||
> p {
|
|
||||||
font-size: $defaultFontSize * 0.875;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.augmentations-list {
|
|
||||||
button,
|
|
||||||
div {
|
|
||||||
color: var(--my-font-color);
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
|
||||||
padding: 4px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,135 +0,0 @@
|
|||||||
@import "theme";
|
|
||||||
|
|
||||||
.bladeburner-container {
|
|
||||||
a,
|
|
||||||
div,
|
|
||||||
p,
|
|
||||||
pre,
|
|
||||||
td {
|
|
||||||
font-size: $defaultFontSize * 0.8125;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.bladeburner-action {
|
|
||||||
border: 1px solid #fff;
|
|
||||||
margin: 7px;
|
|
||||||
padding: 7px;
|
|
||||||
white-space: pre-wrap;
|
|
||||||
|
|
||||||
pre {
|
|
||||||
white-space: pre-wrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Whatever action is currently active */
|
|
||||||
.bladeburner-active-action {
|
|
||||||
border: 4px solid #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Action & Skills panel navigation button */
|
|
||||||
%bladeburner-nav-button {
|
|
||||||
border: 1px solid #fff;
|
|
||||||
margin: 2px;
|
|
||||||
padding: 2px;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bladeburner-nav-button {
|
|
||||||
@extend %bladeburner-nav-button;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: #3d4044;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.bladeburner-nav-button-inactive {
|
|
||||||
@extend %bladeburner-nav-button;
|
|
||||||
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: #555;
|
|
||||||
cursor: default;
|
|
||||||
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;
|
|
||||||
width: 40%;
|
|
||||||
border: 1px solid #fff;
|
|
||||||
overflow: auto;
|
|
||||||
height: 100%;
|
|
||||||
position: absolute;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bladeburner-console-table {
|
|
||||||
height: auto;
|
|
||||||
overflow: auto;
|
|
||||||
table-layout: fixed;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bladeburner-console-input-row {
|
|
||||||
transition: height 1s;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bladeburner-console-input-cell {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bladeburner-console-input {
|
|
||||||
display: inline-block;
|
|
||||||
padding: 0 !important;
|
|
||||||
margin: 0 !important;
|
|
||||||
border: 0;
|
|
||||||
background-color: var(--my-background-color);
|
|
||||||
font-size: $defaultFontSize * 0.8125;
|
|
||||||
outline: none;
|
|
||||||
color: var(--my-font-color);
|
|
||||||
flex: 1 1 auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bladeburner-console-line {
|
|
||||||
word-wrap: break-word;
|
|
||||||
hyphens: auto;
|
|
||||||
-webkit-hyphens: auto;
|
|
||||||
-moz-hyphens: auto;
|
|
||||||
}
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
@import "mixins";
|
|
||||||
@import "theme";
|
|
||||||
@import "styles";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Styling for all buttons
|
|
||||||
*
|
|
||||||
* Includes <button> elements as well as classes that are used
|
|
||||||
* for formatting buttons
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Remove default <button> styling */
|
|
||||||
button {
|
|
||||||
border: none;
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.a-link-button,
|
|
||||||
.std-button {
|
|
||||||
@extend .noselect;
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: #555;
|
|
||||||
color: #fff;
|
|
||||||
padding: 3px 5px;
|
|
||||||
margin: 5px;
|
|
||||||
border: 1px solid #333;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: #666;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
@include boxShadow(inset 0 1px 4px rgba(0, 0, 0, 0.6));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.a-link-button-inactive,
|
|
||||||
.std-button-disabled,
|
|
||||||
.std-button:disabled {
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: #333;
|
|
||||||
color: #fff;
|
|
||||||
padding: 3px 5px;
|
|
||||||
margin: 5px;
|
|
||||||
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,
|
|
||||||
.tooltiptextleft {
|
|
||||||
visibility: visible;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.a-link-button-bought,
|
|
||||||
.std-button-bought {
|
|
||||||
@extend .noselect;
|
|
||||||
text-decoration: none;
|
|
||||||
background-color: #0a0;
|
|
||||||
color: #fff;
|
|
||||||
padding: 3px 5px;
|
|
||||||
margin: 5px;
|
|
||||||
border: 1px solid #0a0;
|
|
||||||
cursor: default;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
.tooltiptext,
|
|
||||||
.tooltiptexthigh,
|
|
||||||
.tooltiptextleft {
|
|
||||||
visibility: visible;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is a button that is meant to be used on accordions (accordion-header and accordion-panel classes)
|
|
||||||
* It has a black background so it does not clash with the default accordion coloring
|
|
||||||
*/
|
|
||||||
.accordion-button {
|
|
||||||
@include borderRadius(12px);
|
|
||||||
@include boxShadow(1px 1px 3px #000);
|
|
||||||
|
|
||||||
color: #aaa;
|
|
||||||
font-size: $defaultFontSize;
|
|
||||||
font-weight: bold;
|
|
||||||
margin: 4px;
|
|
||||||
padding: 4px;
|
|
||||||
background-color: #000;
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:active {
|
|
||||||
color: #fff;
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
/* TODO focus selector? */
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
.casino-card {
|
|
||||||
padding: 10px;
|
|
||||||
border: solid 1px #808080;
|
|
||||||
background-color: white;
|
|
||||||
display: inline-block;
|
|
||||||
border-radius: 10px;
|
|
||||||
font-size: 18.5px;
|
|
||||||
text-align: center;
|
|
||||||
margin: 3px;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.casino-card .value {
|
|
||||||
font-size: 20px;
|
|
||||||
font-family: sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.casino-card.red {
|
|
||||||
color: red;
|
|
||||||
}
|
|
||||||
|
|
||||||
.casino-card.black {
|
|
||||||
color: black;
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
@import "mixins";
|
|
||||||
@import "theme";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Styling for the Character Overview Panel (top-right panel)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#character-overview {
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
@@ -1,168 +0,0 @@
|
|||||||
@import "mixins";
|
|
||||||
@import "theme";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Styling for Corporations
|
|
||||||
* The names/labels refer to "Company Management", which was the old name
|
|
||||||
* for the mechanic before it got changed to avoid confusion with normal
|
|
||||||
* companies
|
|
||||||
*/
|
|
||||||
|
|
||||||
.cmpy-mgmt-container p,
|
|
||||||
.cmpy-mgmt-container a,
|
|
||||||
.cmpy-mgmt-container div,
|
|
||||||
.cmpy-mgmt-container br {
|
|
||||||
font-size: $defaultFontSize * 0.8125;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Header tabs */
|
|
||||||
.cmpy-mgmt-header-tab {
|
|
||||||
display: inline-block;
|
|
||||||
color: #fff;
|
|
||||||
background-color: #555;
|
|
||||||
border: 1px solid #fff;
|
|
||||||
padding: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cmpy-mgmt-header-tab:hover {
|
|
||||||
background-color: #666;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cmpy-mgmt-header-tab.current {
|
|
||||||
background-color: #777;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Switch between Cities */
|
|
||||||
.cmpy-mgmt-city-tab {
|
|
||||||
display: inline-block;
|
|
||||||
color: #fff;
|
|
||||||
background-color: #555;
|
|
||||||
border: 1px solid #fff;
|
|
||||||
padding: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cmpy-mgmt-city-tab:hover {
|
|
||||||
background-color: #666;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cmpy-mgmt-city-tab.current {
|
|
||||||
background-color: #777;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Panels */
|
|
||||||
#cmpy-mgmt-panel {
|
|
||||||
height: 90%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cmpy-mgmt-industry-left-panel,
|
|
||||||
.cmpy-mgmt-industry-right-panel {
|
|
||||||
display: inline-block;
|
|
||||||
height: 100%;
|
|
||||||
overflow-y: auto;
|
|
||||||
overflow-x: auto;
|
|
||||||
overflow: visible;
|
|
||||||
top: 10px;
|
|
||||||
width: 45%;
|
|
||||||
vertical-align: top;
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.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%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hiring new employees */
|
|
||||||
.cmpy-mgmt-find-employee-option {
|
|
||||||
border: 1px solid #fff;
|
|
||||||
margin: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cmpy-mgmt-find-employee-option:hover {
|
|
||||||
background-color: #3d4044;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Warehouse */
|
|
||||||
.cmpy-mgmt-warehouse-material-div {
|
|
||||||
padding: 2px;
|
|
||||||
border: 1px solid #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cmpy-mgmt-warehouse-product-div {
|
|
||||||
padding: 2px;
|
|
||||||
border: 1px solid #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Exporting materials/products */
|
|
||||||
.cmpy-mgmt-existing-export {
|
|
||||||
border: 1px solid #fff;
|
|
||||||
border-radius: 25px;
|
|
||||||
margin: 4px;
|
|
||||||
padding: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cmpy-mgmt-existing-export:hover {
|
|
||||||
background-color: #333;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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 {
|
|
||||||
text-align: left;
|
|
||||||
display: inline-block;
|
|
||||||
border: 1px solid #fff;
|
|
||||||
margin: 2px;
|
|
||||||
padding: 6px;
|
|
||||||
border-radius: 25px;
|
|
||||||
font-size: $defaultFontSize * 0.75;
|
|
||||||
color: var(--my-font-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.cmpy-mgmt-upgrade-div:hover {
|
|
||||||
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: auto !important;
|
|
||||||
overflow-y: auto !important;
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
.add-exp-button {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.remove-exp-button {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.exp-input {
|
|
||||||
margin: 5px 0 5px 0;
|
|
||||||
|
|
||||||
padding: 2px 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-center {
|
|
||||||
margin: auto;
|
|
||||||
text-align: center;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
.touch-right {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.touch-left {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.touch-sides {
|
|
||||||
margin-left: 0;
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
/* Styling for the game options/settings
|
|
||||||
*
|
|
||||||
* Styling for the actual Game Options popup box can be found in popupboxes.scss
|
|
||||||
* This stylesheet is for everything inside the Game Options pop-up box
|
|
||||||
*/
|
|
||||||
|
|
||||||
@import "theme";
|
|
||||||
|
|
||||||
#game-options-right-panel {
|
|
||||||
a {
|
|
||||||
display: block;
|
|
||||||
width: 46%;
|
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
|
||||||
display: inline-block;
|
|
||||||
width: 46%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
@import "mixins";
|
|
||||||
@import "theme";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Styling for the Gang mechanic UI (BitNode-2)
|
|
||||||
*/
|
|
||||||
|
|
||||||
.gang-container {
|
|
||||||
p,
|
|
||||||
pre {
|
|
||||||
font-size: $defaultFontSize * 0.9375;
|
|
||||||
}
|
|
||||||
|
|
||||||
select {
|
|
||||||
background-color: black;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#gang-management-subpage > p {
|
|
||||||
padding: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.gang-member-info-div {
|
|
||||||
background-color: #555;
|
|
||||||
display: inline;
|
|
||||||
float: left;
|
|
||||||
width: 30%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Showing owned upgrades in the Equipment Box
|
|
||||||
*/
|
|
||||||
|
|
||||||
.gang-owned-upgrades-div {
|
|
||||||
display: inline-block;
|
|
||||||
margin-left: 6px;
|
|
||||||
width: 75%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.gang-owned-upgrade {
|
|
||||||
border: 1px solid white;
|
|
||||||
font-size: 12px;
|
|
||||||
margin: 1px;
|
|
||||||
padding: 1px;
|
|
||||||
}
|
|
||||||
Vendored
-3413
File diff suppressed because it is too large
Load Diff
@@ -1,69 +0,0 @@
|
|||||||
@import "mixins";
|
|
||||||
@import "theme";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Styling for the Hacknet Nodes UI Page
|
|
||||||
*/
|
|
||||||
|
|
||||||
.hacknet-general-info {
|
|
||||||
margin: 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
@import "theme";
|
|
||||||
|
|
||||||
.blinking-cursor {
|
|
||||||
font-weight: 100;
|
|
||||||
color: #2e3d48;
|
|
||||||
-webkit-animation: 1s cursorblink step-end infinite;
|
|
||||||
-moz-animation: 1s cursorblink step-end infinite;
|
|
||||||
-ms-animation: 1s cursorblink step-end infinite;
|
|
||||||
-o-animation: 1s cursorblink step-end infinite;
|
|
||||||
animation: 1s cursorblink step-end infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes cursorblink {
|
|
||||||
from,
|
|
||||||
to {
|
|
||||||
color: transparent;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
color: $hacker-green;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@-moz-keyframes cursorblink {
|
|
||||||
from,
|
|
||||||
to {
|
|
||||||
color: transparent;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
color: $hacker-green;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@-webkit-keyframes cursorblink {
|
|
||||||
from,
|
|
||||||
to {
|
|
||||||
color: transparent;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
color: $hacker-green;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@-ms-keyframes cursorblink {
|
|
||||||
from,
|
|
||||||
to {
|
|
||||||
color: transparent;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
color: $hacker-green;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@-o-keyframes cursorblink {
|
|
||||||
from,
|
|
||||||
to {
|
|
||||||
color: transparent;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
color: $hacker-green;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
@import "mixins";
|
|
||||||
@import "theme";
|
|
||||||
|
|
||||||
/* interactivetutorial.css */
|
|
||||||
#interactive-tutorial-wrapper {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
#interactive-tutorial-container {
|
|
||||||
display: none;
|
|
||||||
position: fixed; /* Stay in place */
|
|
||||||
right: 0;
|
|
||||||
top: 0;
|
|
||||||
height: 450px;
|
|
||||||
padding: 10px;
|
|
||||||
border: 5px solid #fff;
|
|
||||||
width: 23%;
|
|
||||||
overflow: hidden;
|
|
||||||
background-color: #444; /* Fallback color */
|
|
||||||
color: #fff;
|
|
||||||
|
|
||||||
> strong {
|
|
||||||
background-color: #444;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#interactive-tutorial-text {
|
|
||||||
padding: 4px;
|
|
||||||
margin: 4px;
|
|
||||||
color: #fff;
|
|
||||||
background-color: #444;
|
|
||||||
font-size: $defaultFontSize * 0.875;
|
|
||||||
max-height: 350px;
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
#interactive-tutorial-exit,
|
|
||||||
#interactive-tutorial-next,
|
|
||||||
#interactive-tutorial-back {
|
|
||||||
@include borderRadius(12px);
|
|
||||||
@include boxShadow(1px 1px 3px #000);
|
|
||||||
|
|
||||||
color: #aaa;
|
|
||||||
font-size: $defaultFontSize * 1.125;
|
|
||||||
font-weight: bold;
|
|
||||||
background-color: #000;
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:focus {
|
|
||||||
color: #fff;
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#interactive-tutorial-exit {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
padding: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#interactive-tutorial-back {
|
|
||||||
float: left;
|
|
||||||
padding: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#interactive-tutorial-next {
|
|
||||||
float: right;
|
|
||||||
padding: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.interactive-tutorial-command {
|
|
||||||
background-color: #000;
|
|
||||||
color: $hacker-green;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.interactive-tutorial-code {
|
|
||||||
background-color: #272822;
|
|
||||||
color: white;
|
|
||||||
padding: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.interactive-tutorial-tab {
|
|
||||||
background-color: #555;
|
|
||||||
color: #e6e6e6;
|
|
||||||
padding: 3px;
|
|
||||||
box-shadow: 0 0 3px #000;
|
|
||||||
}
|
|
||||||
-111
@@ -1,111 +0,0 @@
|
|||||||
@import "mixins";
|
|
||||||
@import "reset";
|
|
||||||
@import "theme";
|
|
||||||
|
|
||||||
@include keyframes(LOADERSPINNER) {
|
|
||||||
0% {
|
|
||||||
#{$browser}transform: translate(-50%, -50%) rotate(0deg);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
#{$browser}transform: translate(-50%, -50%) rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@include keyframes(LOADERLABEL) {
|
|
||||||
0% {
|
|
||||||
opacity: 1;
|
|
||||||
#{$browser}transform: translate(-50%, -50%) scale(1);
|
|
||||||
}
|
|
||||||
5% {
|
|
||||||
opacity: 0.5;
|
|
||||||
#{$browser}transform: translate(-50%, -50%) scale(0.5);
|
|
||||||
}
|
|
||||||
95% {
|
|
||||||
opacity: 0.5;
|
|
||||||
#{$browser}transform: translate(-50%, -50%) scale(0.5);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
opacity: 1;
|
|
||||||
#{$browser}transform: translate(-50%, -50%) scale(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.loaderoverlay {
|
|
||||||
$spinnerBoxSize: 200px;
|
|
||||||
$themeColor: #0c0;
|
|
||||||
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background: #000;
|
|
||||||
color: $themeColor;
|
|
||||||
|
|
||||||
%spinnerBox {
|
|
||||||
border: 20px solid rgba(0, 0, 0, 0);
|
|
||||||
border-top-color: $themeColor;
|
|
||||||
border-bottom-color: $themeColor;
|
|
||||||
border-radius: 1000px;
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.loaderspinner:before,
|
|
||||||
.loaderspinner:after {
|
|
||||||
content: "";
|
|
||||||
}
|
|
||||||
|
|
||||||
.loaderspinner {
|
|
||||||
@extend %spinnerBox;
|
|
||||||
@include animation(LOADERSPINNER 5s linear infinite);
|
|
||||||
|
|
||||||
width: $spinnerBoxSize;
|
|
||||||
height: $spinnerBoxSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
.loaderspinner:before {
|
|
||||||
@extend %spinnerBox;
|
|
||||||
@include animation(LOADERSPINNER 10s linear infinite);
|
|
||||||
|
|
||||||
width: $spinnerBoxSize * 0.8;
|
|
||||||
height: $spinnerBoxSize * 0.8;
|
|
||||||
}
|
|
||||||
|
|
||||||
.loaderspinner:after {
|
|
||||||
@extend %spinnerBox;
|
|
||||||
@include animation(LOADERSPINNER 5s linear infinite);
|
|
||||||
|
|
||||||
width: $spinnerBoxSize * 0.6;
|
|
||||||
height: $spinnerBoxSize * 0.6;
|
|
||||||
}
|
|
||||||
|
|
||||||
.loaderlabel {
|
|
||||||
@include animation(LOADERLABEL 5s linear infinite);
|
|
||||||
|
|
||||||
text-transform: uppercase;
|
|
||||||
font-family: sans-serif;
|
|
||||||
font-size: $defaultFontSize * 1.375;
|
|
||||||
font-weight: 700;
|
|
||||||
letter-spacing: 2px;
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.killAllMessage {
|
|
||||||
position: absolute;
|
|
||||||
top: 95%;
|
|
||||||
left: 50%;
|
|
||||||
-webkit-transform: translateX(-50%);
|
|
||||||
-moz-transform: translateX(-50%);
|
|
||||||
-ms-transform: translateX(-50%);
|
|
||||||
-o-transform: translateX(-50%);
|
|
||||||
transform: translateX(-50%);
|
|
||||||
}
|
|
||||||
.killAllMessageWrapperHidden {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.killAllMessageWrapperShow {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
@@ -1,137 +0,0 @@
|
|||||||
@import "mixins";
|
|
||||||
@import "theme";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Styling for the main navigation menu on the left-hand-side
|
|
||||||
*/
|
|
||||||
|
|
||||||
.mainmenu {
|
|
||||||
list-style-type: none;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
width: 10%;
|
|
||||||
position: fixed;
|
|
||||||
height: 100%;
|
|
||||||
overflow: auto;
|
|
||||||
|
|
||||||
border: 0;
|
|
||||||
border-bottom: 1px solid #000;
|
|
||||||
border-radius: 0;
|
|
||||||
background-color: #333;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Default buttons */
|
|
||||||
.mainmenu > li a,
|
|
||||||
.mainmenu > li button {
|
|
||||||
display: block;
|
|
||||||
color: #e6e6e6;
|
|
||||||
background-color: #555;
|
|
||||||
padding: 12px 8px;
|
|
||||||
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
width: 100%;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mainmenu.classic > li a,
|
|
||||||
.mainmenu.classic > li button {
|
|
||||||
padding: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mainmenu.compact > li a,
|
|
||||||
.mainmenu.compact > li button {
|
|
||||||
display: block;
|
|
||||||
color: #e6e6e6;
|
|
||||||
background-color: #555;
|
|
||||||
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
width: 100%;
|
|
||||||
text-align: left;
|
|
||||||
padding: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hovering makes them lighter */
|
|
||||||
.mainmenu > li a:hover,
|
|
||||||
.mainmenu > li a:hover:not(.active),
|
|
||||||
.mainmenu > li a:focus {
|
|
||||||
background-color: #777;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mainmenu > li button:hover,
|
|
||||||
.mainmenu > li button:hover:not(.active) {
|
|
||||||
background-color: #777;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Panel headers can become active, and they are "lighter" than the rest */
|
|
||||||
.mainmenu > li a.active,
|
|
||||||
.mainmenu > li button.active {
|
|
||||||
background-color: #777;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mainmenu > li a.active:hover,
|
|
||||||
.mainmenu > li button.active:hover {
|
|
||||||
background-color: #aaa;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-header {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
#hacking-menu-header-li,
|
|
||||||
#character-menu-header-li,
|
|
||||||
#world-menu-header-li,
|
|
||||||
#help-menu-header-li {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Accordion Outline */
|
|
||||||
.mainmenu-accordion-header,
|
|
||||||
.mainmenu-accordion-header-compact {
|
|
||||||
outline: 2px solid #fff !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mainmenu-accordion-header-classic {
|
|
||||||
border: 2px solid #fff;
|
|
||||||
padding: 16px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Plus and minus signs */
|
|
||||||
.mainmenu-accordion-header:after,
|
|
||||||
.mainmenu-accordion-header-compact:after {
|
|
||||||
content: "\02795";
|
|
||||||
float: right;
|
|
||||||
font-size: $defaultFontSize * 0.8125;
|
|
||||||
position: absolute;
|
|
||||||
bottom: 25%;
|
|
||||||
right: 3px;
|
|
||||||
color: transparent;
|
|
||||||
text-shadow: 0 0 0 #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mainmenu-accordion-header-classic:after {
|
|
||||||
content: "\02795";
|
|
||||||
float: right;
|
|
||||||
font-size: $defaultFontSize * 0.8125;
|
|
||||||
color: #fff;
|
|
||||||
margin-left: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mainmenu-accordion-header.opened,
|
|
||||||
.mainmenu-accordion-header-classic.opened,
|
|
||||||
.mainmenu-accordion-header-compact.opened {
|
|
||||||
background-color: #222 !important;
|
|
||||||
|
|
||||||
&:after {
|
|
||||||
content: "\2796";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Slide down transition */
|
|
||||||
.mainmenu-accordion-panel {
|
|
||||||
transition: max-height 0.2s ease-out;
|
|
||||||
}
|
|
||||||
@@ -1,128 +0,0 @@
|
|||||||
@import "mixins";
|
|
||||||
@import "theme";
|
|
||||||
|
|
||||||
/* CSS for different main menu pages, such as character info, script editor, etc (but excluding
|
|
||||||
terminal which has its own page) */
|
|
||||||
|
|
||||||
#generic-react-container {
|
|
||||||
-ms-overflow-style: none; /* for Internet Explorer, Edge */
|
|
||||||
scrollbar-width: none; /* for Firefox */
|
|
||||||
flex-grow: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#generic-react-container::-webkit-scrollbar {
|
|
||||||
display: none; /* for Chrome, Safari, and Opera */
|
|
||||||
}
|
|
||||||
|
|
||||||
#world-city-name,
|
|
||||||
#world-city-desc {
|
|
||||||
padding: 4px;
|
|
||||||
margin: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#create-program-page-text,
|
|
||||||
#create-program-list {
|
|
||||||
width: 70%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.faction-work-div {
|
|
||||||
width: 70%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.faction-work-div-wrapper {
|
|
||||||
overflow: hidden;
|
|
||||||
border: 2px solid #333;
|
|
||||||
padding: 6px;
|
|
||||||
margin: 6px;
|
|
||||||
width: 70%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.faction-container p,
|
|
||||||
.faction-container pre {
|
|
||||||
padding: 4px 6px;
|
|
||||||
margin: 4px 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.faction-container pre {
|
|
||||||
width: 70%;
|
|
||||||
white-space: pre-wrap; /* Since CSS 2.1 */
|
|
||||||
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
|
||||||
white-space: -pre-wrap; /* Opera 4-6 */
|
|
||||||
white-space: -o-pre-wrap; /* Opera 7 */
|
|
||||||
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* World */
|
|
||||||
#world-container li {
|
|
||||||
margin: 0 0 15px 0;
|
|
||||||
list-style-type: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Tutorial */
|
|
||||||
#tutorial-container {
|
|
||||||
position: fixed;
|
|
||||||
padding-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#tutorial-text {
|
|
||||||
width: 70%;
|
|
||||||
margin: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#tutorial-container a {
|
|
||||||
width: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Dev menu */
|
|
||||||
#dev-menu-container {
|
|
||||||
position: fixed;
|
|
||||||
padding-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#dev-menu-text {
|
|
||||||
width: 70%;
|
|
||||||
margin: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#dev-menu-container a {
|
|
||||||
width: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Location */
|
|
||||||
#location-container {
|
|
||||||
position: fixed;
|
|
||||||
padding: 6px;
|
|
||||||
overflow-x: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
#location-container a {
|
|
||||||
display: inline-block;
|
|
||||||
width: 30%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#location-slums-description {
|
|
||||||
width: 70%;
|
|
||||||
margin: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#location-return-to-world-button {
|
|
||||||
margin: 10px;
|
|
||||||
padding: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#location-container > * {
|
|
||||||
margin: 10px 5px 10px 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#location-job-reputation,
|
|
||||||
#location-company-favor {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Infiltration */
|
|
||||||
#infiltration-container {
|
|
||||||
position: fixed;
|
|
||||||
margin: 5px;
|
|
||||||
width: 70%;
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
.milestones-container {
|
|
||||||
width: 60%;
|
|
||||||
}
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
@import "mixins";
|
|
||||||
@import "theme";
|
|
||||||
|
|
||||||
/* css for Missions */
|
|
||||||
|
|
||||||
/* Hacking missions */
|
|
||||||
#mission-container {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hack-mission-grid {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
|
|
||||||
grid-template-rows: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
|
|
||||||
grid-gap: 2.5%;
|
|
||||||
height: 90%;
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
overflow-y: auto;
|
|
||||||
padding-right: 10px;
|
|
||||||
|
|
||||||
&::-webkit-scrollbar {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.hack-mission-node {
|
|
||||||
z-index: 5;
|
|
||||||
background-color: #808080;
|
|
||||||
align-self: center;
|
|
||||||
justify-self: center;
|
|
||||||
display: inline-block;
|
|
||||||
|
|
||||||
p {
|
|
||||||
@include userSelect(none);
|
|
||||||
|
|
||||||
margin-top: 8px;
|
|
||||||
color: #fff;
|
|
||||||
font-size: $defaultFontSize * 0.75;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.hack-mission-player-node {
|
|
||||||
color: #fff;
|
|
||||||
background-color: #00f;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hack-mission-player-node-active {
|
|
||||||
border: 2px solid #fff;
|
|
||||||
background-color: #66f;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hack-mission-enemy-node {
|
|
||||||
color: #fff;
|
|
||||||
background-color: #f00;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hack-mission-cpu-node {
|
|
||||||
@include borderRadius(50%);
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hack-mission-firewall-node {
|
|
||||||
width: 90%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hack-mission-database-node {
|
|
||||||
@include transform(skew(20deg));
|
|
||||||
|
|
||||||
width: 100%;
|
|
||||||
height: 90%;
|
|
||||||
|
|
||||||
p {
|
|
||||||
@include transform(skew(-20deg));
|
|
||||||
@include userSelect(none);
|
|
||||||
|
|
||||||
color: #fff;
|
|
||||||
font-size: $defaultFontSize * 0.75;
|
|
||||||
margin-top: 8px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.hack-mission-transfer-node {
|
|
||||||
@include transform(skew(-20deg));
|
|
||||||
|
|
||||||
width: 100%;
|
|
||||||
height: 90%;
|
|
||||||
|
|
||||||
p {
|
|
||||||
@include transform(skew(20deg));
|
|
||||||
@include userSelect(none);
|
|
||||||
|
|
||||||
color: #fff;
|
|
||||||
font-size: $defaultFontSize * 0.75;
|
|
||||||
margin-top: 8px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.hack-mission-spam-node,
|
|
||||||
.hack-mission-shield-node {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Non-map related DOM elements */
|
|
||||||
|
|
||||||
/* Element at the top of the Hacking Mission page (intro page, start button, guide buttons, etc.) */
|
|
||||||
.hack-mission-header-element {
|
|
||||||
margin: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hack-mission-action-buttons-container {
|
|
||||||
border: 2px solid #fff;
|
|
||||||
}
|
|
||||||
@@ -1,244 +0,0 @@
|
|||||||
@import "mixins";
|
|
||||||
@import "theme";
|
|
||||||
@import "styles";
|
|
||||||
|
|
||||||
/* Pop-up boxes */
|
|
||||||
.popup-box-container {
|
|
||||||
display: none; /* Initially hidden */
|
|
||||||
position: fixed; /* Stay in place */
|
|
||||||
z-index: 1300; /* Sit on top */
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background-color: rbga(var(--my-background-color), 0.4);
|
|
||||||
}
|
|
||||||
|
|
||||||
.popup-box-content {
|
|
||||||
background-color: var(--my-background-color);
|
|
||||||
padding: 12px;
|
|
||||||
border: 5px solid var(--my-highlight-color);
|
|
||||||
width: 70%;
|
|
||||||
max-height: 80%;
|
|
||||||
overflow-y: auto;
|
|
||||||
z-index: 11; /* Sit on top of the container */
|
|
||||||
color: var(--my-font-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.popup-box-input-div {
|
|
||||||
margin: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.popup-box-button,
|
|
||||||
.popup-box-button-inactive {
|
|
||||||
color: #aaa;
|
|
||||||
float: right;
|
|
||||||
font-size: $defaultFontSize;
|
|
||||||
font-weight: bold;
|
|
||||||
padding: 2px;
|
|
||||||
margin: 6px;
|
|
||||||
border: 1px solid #fff;
|
|
||||||
background-color: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
.popup-box-button:hover,
|
|
||||||
.popup-box-button:focus {
|
|
||||||
color: var(--my-font-color);
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.popupbox-button-inactive {
|
|
||||||
pointer-events: none;
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
|
|
||||||
#yes-no-text-input-box-input {
|
|
||||||
color: var(--my-font-color);
|
|
||||||
border: 1px solid #fff;
|
|
||||||
background-color: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dialog-box-container {
|
|
||||||
display: block;
|
|
||||||
position: absolute;
|
|
||||||
z-index: 10;
|
|
||||||
width: 50%;
|
|
||||||
height: auto;
|
|
||||||
max-height: 50%;
|
|
||||||
top: 40%;
|
|
||||||
left: 50%;
|
|
||||||
margin: -10% 0 0 -25%;
|
|
||||||
overflow: auto;
|
|
||||||
background-color: var(--my-background-color);
|
|
||||||
border: 5px solid var(--my-highlight-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.log-box-container {
|
|
||||||
display: flex;
|
|
||||||
flex-flow: column;
|
|
||||||
background-color: gray;
|
|
||||||
width: 50%;
|
|
||||||
position: fixed;
|
|
||||||
left: 50%;
|
|
||||||
top: 40%;
|
|
||||||
margin: -10% 0 0 -25%;
|
|
||||||
height: auto;
|
|
||||||
max-height: 50%;
|
|
||||||
z-index: 10;
|
|
||||||
background-color: var(--my-background-color);
|
|
||||||
border: 2px solid var(--my-highlight-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.log-box-header {
|
|
||||||
z-index: 1300;
|
|
||||||
background-color: #333;
|
|
||||||
border: 1px solid var(--my-highlight-color);
|
|
||||||
display: flex;
|
|
||||||
flex: row nowrap;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
|
|
||||||
.log-box-log-container {
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.log-box-button {
|
|
||||||
color: #aaa;
|
|
||||||
font-size: $defaultFontSize;
|
|
||||||
font-weight: bold;
|
|
||||||
padding: 2px;
|
|
||||||
margin: 6px;
|
|
||||||
border: 1px solid #fff;
|
|
||||||
background-color: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
.log-box-button:hover,
|
|
||||||
.log-box-button:focus {
|
|
||||||
color: var(--my-font-color);
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dialog-box-content {
|
|
||||||
z-index: 2;
|
|
||||||
background-color: var(--my-background-color);
|
|
||||||
padding: 10px;
|
|
||||||
|
|
||||||
p span {
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.dialog-box-close-button {
|
|
||||||
@include borderRadius(12px);
|
|
||||||
@include boxShadow(1px 1px 3px #000);
|
|
||||||
@extend .noselect;
|
|
||||||
|
|
||||||
float: right;
|
|
||||||
color: #aaa;
|
|
||||||
font-size: $defaultFontSize * 1.25;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
#log-box-close {
|
|
||||||
position: fixed;
|
|
||||||
right: 27%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#log-box-kill-script {
|
|
||||||
right: 11%;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
#log-box-close,
|
|
||||||
#log-box-kill-script {
|
|
||||||
float: right;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dialog-box-close-button:hover,
|
|
||||||
.dialog-box-close-button:focus {
|
|
||||||
color: #fff;
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Faction invitation box */
|
|
||||||
#faction-invitation-box-container {
|
|
||||||
transition: opacity 400ms ease-in;
|
|
||||||
}
|
|
||||||
#faction-invitation-box-warning {
|
|
||||||
margin: 4px;
|
|
||||||
padding: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Infiltration-box */
|
|
||||||
#infiltration-box-sell,
|
|
||||||
#infiltration-box-faction {
|
|
||||||
display: block;
|
|
||||||
padding: 8px;
|
|
||||||
margin: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#infiltration-box-content span {
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#infiltration-faction-select {
|
|
||||||
background-color: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Game Options */
|
|
||||||
#game-options-container {
|
|
||||||
transition: opacity 400ms ease-in;
|
|
||||||
}
|
|
||||||
|
|
||||||
#game-options-content {
|
|
||||||
background-color: var(--my-background-color);
|
|
||||||
padding: 10px;
|
|
||||||
border: 5px solid var(--my-highlight-color);
|
|
||||||
color: var(--my-font-color);
|
|
||||||
width: 80%;
|
|
||||||
max-height: 80%;
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
#game-options-left-panel,
|
|
||||||
#game-options-right-panel {
|
|
||||||
display: inline-block;
|
|
||||||
width: 49%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#game-options-close-button {
|
|
||||||
@include borderRadius(12px);
|
|
||||||
@include boxShadow(1px 1px 3px #000);
|
|
||||||
|
|
||||||
color: #aaa;
|
|
||||||
float: right;
|
|
||||||
margin: 4px;
|
|
||||||
padding: 4px;
|
|
||||||
font-size: $defaultFontSize * 1.25;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
#game-options-close-button:hover,
|
|
||||||
#game-options-close-button:focus {
|
|
||||||
color: #fff;
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
#game-options-left-panel fieldset {
|
|
||||||
padding: 2px;
|
|
||||||
margin: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#import-game-file-selector {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
@import "theme";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Styling for the Red Pill screen (the BitNode selection UI)
|
|
||||||
*/
|
|
||||||
#red-pill-container {
|
|
||||||
position: fixed;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bitnode {
|
|
||||||
&.level-0 {
|
|
||||||
color: red;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.level-1 {
|
|
||||||
color: yellow;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.level-2 {
|
|
||||||
color: #48d1cc;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.level-3 {
|
|
||||||
color: blue;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.unimplemented {
|
|
||||||
color: gray;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
/**
|
|
||||||
* Styling for the Re-Sleeving Page
|
|
||||||
*/
|
|
||||||
@import "theme";
|
|
||||||
|
|
||||||
.resleeve-elem {
|
|
||||||
border: 1px solid white;
|
|
||||||
margin: 4px;
|
|
||||||
width: 75%;
|
|
||||||
|
|
||||||
p {
|
|
||||||
font-size: $defaultFontSize * 0.8125;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.resleeve-panel {
|
|
||||||
display: inline-block;
|
|
||||||
margin: 0;
|
|
||||||
padding: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.resleeve-aug-selector {
|
|
||||||
font-size: $defaultFontSize * 0.8125;
|
|
||||||
|
|
||||||
option {
|
|
||||||
font-size: $defaultFontSize * 0.8125;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
@import "mixins";
|
|
||||||
@import "theme";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Styling for Script Editor (both Ace and CodeMirror)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#script-editor-buttons-wrapper {
|
|
||||||
width: 100%;
|
|
||||||
padding-right: 0;
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.script-editor-wrapper {
|
|
||||||
height: 110vh;
|
|
||||||
width: 70%;
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
#script-editor-filename-wrapper {
|
|
||||||
background-color: #555;
|
|
||||||
margin-right: 0;
|
|
||||||
padding-left: 6px;
|
|
||||||
width: 100%;
|
|
||||||
border: 2px solid var(--my-highlight-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
#script-editor-filename-tag {
|
|
||||||
display: inline-block;
|
|
||||||
padding-top: 10px;
|
|
||||||
padding-bottom: 0;
|
|
||||||
float: center;
|
|
||||||
background-color: #555;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#script-editor-filename {
|
|
||||||
$boxShadowArgs: inset 0 0 8px rgba(0, 0, 0, 0.1), 0 0 16px rgba(0, 0, 0, 0.1);
|
|
||||||
@include boxShadow($boxShadowArgs);
|
|
||||||
|
|
||||||
background-color: #555;
|
|
||||||
border: 2px solid var(--my-highlight-color);
|
|
||||||
color: #fff;
|
|
||||||
display: inline-block;
|
|
||||||
float: center;
|
|
||||||
margin: 4px;
|
|
||||||
padding: 2px;
|
|
||||||
resize: none;
|
|
||||||
width: 60%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#script-editor-status {
|
|
||||||
float: left;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#script-editor-options-panel {
|
|
||||||
position: absolute;
|
|
||||||
right: 9%;
|
|
||||||
bottom: 15%;
|
|
||||||
border: 2px solid #fff;
|
|
||||||
width: 19%;
|
|
||||||
background-color: #444;
|
|
||||||
padding: 2px;
|
|
||||||
overflow: auto;
|
|
||||||
z-index: 1;
|
|
||||||
color: #fff;
|
|
||||||
max-height: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#script-editor-options-panel fieldset {
|
|
||||||
margin-top: 8px;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
padding: 2px;
|
|
||||||
font-size: $defaultFontSize * 0.75;
|
|
||||||
|
|
||||||
input {
|
|
||||||
margin: 2px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.editor-options-container {
|
|
||||||
display: flex;
|
|
||||||
flex-flow: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
.editor-options-line {
|
|
||||||
display: flex;
|
|
||||||
flex: row nowrap;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: start;
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
/**
|
|
||||||
* Styling for the Sleeves Management page
|
|
||||||
*/
|
|
||||||
@import "theme";
|
|
||||||
|
|
||||||
.sleeve-elem {
|
|
||||||
border: 1px solid white;
|
|
||||||
margin: 4px;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sleeves-page-info {
|
|
||||||
display: "block";
|
|
||||||
width: 75%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sleeve-panel {
|
|
||||||
display: inline-block;
|
|
||||||
margin: 0;
|
|
||||||
padding: 2px;
|
|
||||||
|
|
||||||
select {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
@import "theme";
|
|
||||||
|
|
||||||
.stock-market-container {
|
|
||||||
p {
|
|
||||||
font-size: $defaultFontSize * 0.8125;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
font-size: $defaultFontSize * 0.875;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.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 {
|
|
||||||
list-style: none;
|
|
||||||
|
|
||||||
li {
|
|
||||||
button {
|
|
||||||
font-size: $defaultFontSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#stock-market-watchlist-filter {
|
|
||||||
display: block;
|
|
||||||
margin: 5px 5px 5px 10px;
|
|
||||||
padding: 4px;
|
|
||||||
width: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.stock-market-input {
|
|
||||||
display: inline-block;
|
|
||||||
padding: 4px;
|
|
||||||
margin: 2px;
|
|
||||||
background-color: #000;
|
|
||||||
border: 1px solid #fff;
|
|
||||||
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: 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 {
|
|
||||||
background-color: #000;
|
|
||||||
border: 1px solid #fff;
|
|
||||||
color: var(--my-font-color);
|
|
||||||
margin: 2px;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
-528
@@ -1,528 +0,0 @@
|
|||||||
@import "mixins";
|
|
||||||
@import "theme";
|
|
||||||
|
|
||||||
@import "reset";
|
|
||||||
|
|
||||||
:root {
|
|
||||||
--my-font-color: #0c0;
|
|
||||||
--my-background-color: #000;
|
|
||||||
--my-highlight-color: #fff;
|
|
||||||
--my-prompt-color: #f92672;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
background-color: var(--my-background-color);
|
|
||||||
-ms-overflow-style: none; /* for Internet Explorer, Edge */
|
|
||||||
scrollbar-width: none; /* for Firefox */
|
|
||||||
}
|
|
||||||
|
|
||||||
body::-webkit-scrollbar {
|
|
||||||
display: none; /* for Chrome, Safari, and Opera */
|
|
||||||
}
|
|
||||||
|
|
||||||
p,
|
|
||||||
pre,
|
|
||||||
h2,
|
|
||||||
h3,
|
|
||||||
h4,
|
|
||||||
.text,
|
|
||||||
td {
|
|
||||||
color: var(--my-font-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: $defaultFontSize * 1.375;
|
|
||||||
color: var(--my-font-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
ul {
|
|
||||||
padding: 2px;
|
|
||||||
list-style-type: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
li {
|
|
||||||
list-style-type: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
br {
|
|
||||||
@extend .noselect;
|
|
||||||
}
|
|
||||||
|
|
||||||
#entire-game-container {
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Disable border highlight on elements */
|
|
||||||
input:focus,
|
|
||||||
textarea:focus,
|
|
||||||
button:focus,
|
|
||||||
td:focus,
|
|
||||||
tr:focus {
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make html links ("a" elements) nice looking buttons with this class */
|
|
||||||
a:link,
|
|
||||||
a:visited {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dropdown {
|
|
||||||
color: #fff;
|
|
||||||
background-color: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-input {
|
|
||||||
color: #fff;
|
|
||||||
background-color: #000;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 1px;
|
|
||||||
border-color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Notification icon (for create program right now only) */
|
|
||||||
#create-program-tab {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
#create-program-notification {
|
|
||||||
font-size: $defaultFontSize * 0.625;
|
|
||||||
position: absolute; /* Position the badge within the relatively positioned button */
|
|
||||||
top: 0;
|
|
||||||
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;
|
|
||||||
border-radius: 2px;
|
|
||||||
padding: 1px 3px;
|
|
||||||
font-size: $defaultFontSize * 0.625;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
position: absolute;
|
|
||||||
}
|
|
||||||
|
|
||||||
.notification-off {
|
|
||||||
background-color: #333;
|
|
||||||
color: #333;
|
|
||||||
border-radius: 0;
|
|
||||||
padding: 0;
|
|
||||||
display: "none";
|
|
||||||
}
|
|
||||||
|
|
||||||
.notification {
|
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.notification .badge {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
padding: 2px;
|
|
||||||
background: red;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* help tip. Question mark that opens popup with info/details */
|
|
||||||
.help-tip {
|
|
||||||
background-color: black;
|
|
||||||
border: 1px solid #fff;
|
|
||||||
border-radius: 5px;
|
|
||||||
color: #fff;
|
|
||||||
content: "?";
|
|
||||||
display: inline-block;
|
|
||||||
margin-left: 3px;
|
|
||||||
padding: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.help-tip-big {
|
|
||||||
content: "?";
|
|
||||||
padding: 3px;
|
|
||||||
margin-left: 3px;
|
|
||||||
color: #fff;
|
|
||||||
border: 1px solid #fff;
|
|
||||||
border-radius: 8px;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.help-tip:hover,
|
|
||||||
.help-tip-big:hover {
|
|
||||||
background-color: #888;
|
|
||||||
}
|
|
||||||
|
|
||||||
.help-tip:active,
|
|
||||||
.help-tip-big:active {
|
|
||||||
@include boxShadow(inset 0 1px 4px rgba(0, 0, 0, 0.6));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Flashing button (Red) */
|
|
||||||
@-webkit-keyframes glowing {
|
|
||||||
0% {
|
|
||||||
background-color: #b20000;
|
|
||||||
-webkit-box-shadow: 0 0 3px #b20000;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
background-color: #f00;
|
|
||||||
-webkit-box-shadow: 0 0 40px #f00;
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
background-color: #b20000;
|
|
||||||
-webkit-box-shadow: 0 0 3px #b20000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@-moz-keyframes glowing {
|
|
||||||
0% {
|
|
||||||
background-color: #b20000;
|
|
||||||
-moz-box-shadow: 0 0 3px #b20000;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
background-color: #f00;
|
|
||||||
-moz-box-shadow: 0 0 40px #f00;
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
background-color: #b20000;
|
|
||||||
-moz-box-shadow: 0 0 3px #b20000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@-o-keyframes glowing {
|
|
||||||
0% {
|
|
||||||
background-color: #b20000;
|
|
||||||
box-shadow: 0 0 3px #b20000;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
background-color: #f00;
|
|
||||||
box-shadow: 0 0 40px #f00;
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
background-color: #b20000;
|
|
||||||
box-shadow: 0 0 3px #b20000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes glowing {
|
|
||||||
0% {
|
|
||||||
background-color: #b20000;
|
|
||||||
box-shadow: 0 0 3px #b20000;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
background-color: #f00;
|
|
||||||
box-shadow: 0 0 40px #f00;
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
background-color: #b20000;
|
|
||||||
box-shadow: 0 0 3px #b20000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.flashing-button {
|
|
||||||
-webkit-animation: glowing 1500ms infinite;
|
|
||||||
-moz-animation: glowing 1500ms infinite;
|
|
||||||
-o-animation: glowing 1500ms infinite;
|
|
||||||
animation: glowing 1500ms infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Blinking Cursor */
|
|
||||||
/* ----- blinking cursor animation ----- */
|
|
||||||
.typed-cursor {
|
|
||||||
opacity: 1;
|
|
||||||
-webkit-animation: blink 0.95s infinite;
|
|
||||||
-moz-animation: blink 0.95s infinite;
|
|
||||||
-ms-animation: blink 0.95s infinite;
|
|
||||||
-o-animation: blink 0.95s infinite;
|
|
||||||
animation: blink 0.95s infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
@-keyframes blink {
|
|
||||||
0% {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@-webkit-keyframes blink {
|
|
||||||
0% {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@-moz-keyframes blink {
|
|
||||||
0% {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@-ms-keyframes blink {
|
|
||||||
0% {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@-o-keyframes blink {
|
|
||||||
0% {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Status text */
|
|
||||||
@-webkit-keyframes status-text {
|
|
||||||
from {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
to {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.status-text {
|
|
||||||
z-index: 2;
|
|
||||||
-webkit-animation: status-text 3s 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#status-text-container {
|
|
||||||
background-color: transparent;
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
left: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#status-text {
|
|
||||||
background-color: transparent;
|
|
||||||
bottom: 0;
|
|
||||||
color: #fff;
|
|
||||||
display: none;
|
|
||||||
font-size: $defaultFontSize * 1.25;
|
|
||||||
margin-right: 14px;
|
|
||||||
opacity: 0;
|
|
||||||
padding: 4px;
|
|
||||||
right: 0;
|
|
||||||
top: 0;
|
|
||||||
width: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Scan analyze links from AutoLink */
|
|
||||||
.scan-analyze-link {
|
|
||||||
cursor: pointer;
|
|
||||||
color: #fff;
|
|
||||||
text-decoration: underline;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Accordion menus (Header with collapsible panel) */
|
|
||||||
.accordion-header {
|
|
||||||
background-color: #444;
|
|
||||||
color: #fff;
|
|
||||||
font-size: $defaultFontSize * 1.25;
|
|
||||||
margin: 6px 6px 0 6px;
|
|
||||||
padding: 4px 6px;
|
|
||||||
cursor: pointer;
|
|
||||||
width: 80%;
|
|
||||||
text-align: left;
|
|
||||||
border: none;
|
|
||||||
outline: none;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
&.active,
|
|
||||||
&:hover {
|
|
||||||
background-color: #555;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.active:hover {
|
|
||||||
background-color: #666;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:after {
|
|
||||||
content: "\02795"; /* "plus" sign (+) */
|
|
||||||
font-size: $defaultFontSize * 0.875;
|
|
||||||
float: right;
|
|
||||||
color: transparent;
|
|
||||||
text-shadow: 0 0 0 #fff;
|
|
||||||
position: absolute;
|
|
||||||
bottom: 5px;
|
|
||||||
right: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.active:after {
|
|
||||||
content: "\2796"; /* "minus" sign (-) */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.accordion-panel {
|
|
||||||
margin: 0 6px 6px 6px;
|
|
||||||
padding: 0 6px 6px 6px;
|
|
||||||
width: 75%;
|
|
||||||
margin-left: 5%;
|
|
||||||
display: none;
|
|
||||||
background-color: #555;
|
|
||||||
overflow-y: auto;
|
|
||||||
overflow-x: none;
|
|
||||||
|
|
||||||
div,
|
|
||||||
ul,
|
|
||||||
p,
|
|
||||||
ul > li {
|
|
||||||
background-color: #555;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* override the global <span> styling */
|
|
||||||
#active-scripts-total-production-active,
|
|
||||||
#active-scripts-total-prod-aug-total,
|
|
||||||
#active-scripts-total-prod-aug-avg {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Helper Classes */
|
|
||||||
.hacker-green {
|
|
||||||
color: $hacker-green;
|
|
||||||
}
|
|
||||||
|
|
||||||
.money-gold {
|
|
||||||
color: $money-gold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.light-yellow {
|
|
||||||
color: $light-yellow;
|
|
||||||
}
|
|
||||||
|
|
||||||
.unbuyable {
|
|
||||||
color: #66cfbc;
|
|
||||||
}
|
|
||||||
|
|
||||||
.failure {
|
|
||||||
color: $alert-red;
|
|
||||||
text-shadow: 0 0 0 $alert-red;
|
|
||||||
}
|
|
||||||
|
|
||||||
.success {
|
|
||||||
color: $success-green;
|
|
||||||
text-shadow: 0 0 0 $success-green;
|
|
||||||
}
|
|
||||||
|
|
||||||
.physical-yellow {
|
|
||||||
color: $my-stat-physical;
|
|
||||||
}
|
|
||||||
|
|
||||||
.charisma-purple {
|
|
||||||
color: $my-stat-cha-color;
|
|
||||||
}
|
|
||||||
|
|
||||||
.reputation {
|
|
||||||
color: $light-yellow;
|
|
||||||
}
|
|
||||||
|
|
||||||
.smallfont {
|
|
||||||
font-size: $defaultFontSize * 0.8125;
|
|
||||||
}
|
|
||||||
|
|
||||||
.samefont {
|
|
||||||
font-size: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
.noscrollbar {
|
|
||||||
-ms-overflow-style: none; /* IE and Edge */
|
|
||||||
/* stylelint-disable-next-line property-no-unknown */
|
|
||||||
scrollbar-width: none; /* Firefox https://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-width */
|
|
||||||
}
|
|
||||||
|
|
||||||
.noscrollbar::-webkit-scrollbar {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type="checkbox"] {
|
|
||||||
filter: invert(1) sepia(1) hue-rotate(41deg) brightness(100%) saturate(10);
|
|
||||||
}
|
|
||||||
|
|
||||||
.optionCheckbox {
|
|
||||||
margin: 5px;
|
|
||||||
float: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.optionRange {
|
|
||||||
-webkit-appearance: none;
|
|
||||||
background: #777;
|
|
||||||
outline: none;
|
|
||||||
opacity: 0.7;
|
|
||||||
height: 10px;
|
|
||||||
-webkit-transition: 0.2s;
|
|
||||||
transition: opacity 0.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;
|
|
||||||
}
|
|
||||||
|
|
||||||
.noselect {
|
|
||||||
-moz-user-select: -moz-none;
|
|
||||||
-khtml-user-select: none;
|
|
||||||
-webkit-user-select: none;
|
|
||||||
-ms-user-select: none;
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
@import "theme";
|
|
||||||
|
|
||||||
/* Styling for tooltip-style elements */
|
|
||||||
|
|
||||||
/* Tool tips (when hovering over an element */
|
|
||||||
.tooltip {
|
|
||||||
display: inline-block;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
.tooltiptext {
|
|
||||||
visibility: hidden;
|
|
||||||
width: 300px;
|
|
||||||
background-color: var(--my-background-color);
|
|
||||||
border: 2px solid var(--my-highlight-color);
|
|
||||||
color: #fff;
|
|
||||||
text-align: center;
|
|
||||||
padding: 4px;
|
|
||||||
left: 101%;
|
|
||||||
|
|
||||||
pointer-events: none;
|
|
||||||
position: absolute;
|
|
||||||
z-index: 99;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Positioned to left of element rather than right */
|
|
||||||
.tooltiptextleft {
|
|
||||||
visibility: hidden;
|
|
||||||
width: 300px;
|
|
||||||
background-color: var(--my-background-color);
|
|
||||||
border: 2px solid var(--my-highlight-color);
|
|
||||||
color: #fff;
|
|
||||||
text-align: center;
|
|
||||||
padding: 4px;
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
transform: translate(-100%, -100%);
|
|
||||||
|
|
||||||
/* Backwards compatibility */
|
|
||||||
-webkit-transform: translate(-100%, -100%);
|
|
||||||
-moz-transform: translate(-100%, -100%);
|
|
||||||
-o-transform: translate(-100%, -100%);
|
|
||||||
-ms-transform: translate(-100%, -100%);
|
|
||||||
|
|
||||||
position: absolute;
|
|
||||||
z-index: 99;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Tooltip goes below cursor instead of above */
|
|
||||||
.tooltiptextlow {
|
|
||||||
visibility: hidden;
|
|
||||||
width: 300px;
|
|
||||||
background-color: var(--my-background-color);
|
|
||||||
border: 2px solid var(--my-highlight-color);
|
|
||||||
color: #fff;
|
|
||||||
text-align: center;
|
|
||||||
padding: 4px;
|
|
||||||
left: 101%;
|
|
||||||
|
|
||||||
pointer-events: none;
|
|
||||||
position: absolute;
|
|
||||||
z-index: 99;
|
|
||||||
bottom: 25%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Same thing as a normal tooltip except its a bit higher */
|
|
||||||
.tooltip .tooltiptexthigh {
|
|
||||||
visibility: hidden;
|
|
||||||
width: 300px;
|
|
||||||
background-color: var(--my-background-color);
|
|
||||||
border: 2px solid var(--my-highlight-color);
|
|
||||||
color: #fff;
|
|
||||||
text-align: center;
|
|
||||||
padding: 4px;
|
|
||||||
left: 101%;
|
|
||||||
bottom: -25%;
|
|
||||||
|
|
||||||
position: absolute;
|
|
||||||
z-index: 99;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tooltip:hover .tooltiptext,
|
|
||||||
.tooltip:hover .tooltiptexthigh,
|
|
||||||
.tooltip:hover .tooltiptextleft,
|
|
||||||
.tooltip:hover .tooltiptextlow {
|
|
||||||
visibility: visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
.copy_tooltip {
|
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.copy_tooltip_copied {
|
|
||||||
color: #fff;
|
|
||||||
transition: color 0.3s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.copy_tooltip .copy_tooltip_text {
|
|
||||||
visibility: hidden;
|
|
||||||
font-size: 15px;
|
|
||||||
padding: 5px;
|
|
||||||
background-color: var(--my-background-color);
|
|
||||||
color: #fff;
|
|
||||||
text-align: center;
|
|
||||||
position: absolute;
|
|
||||||
z-index: 1;
|
|
||||||
top: 120%;
|
|
||||||
left: 5%;
|
|
||||||
opacity: 0;
|
|
||||||
border: 2px solid var(--my-highlight-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.copy_tooltip .copy_tooltip_text::after {
|
|
||||||
content: "";
|
|
||||||
position: absolute;
|
|
||||||
bottom: 100%;
|
|
||||||
left: 50%;
|
|
||||||
margin-left: -6px;
|
|
||||||
border-width: 8px;
|
|
||||||
border-style: solid;
|
|
||||||
border-color: transparent transparent white transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.copy_tooltip .copy_tooltip_text_visible {
|
|
||||||
visibility: visible;
|
|
||||||
opacity: 1;
|
|
||||||
transition: opacity 0.3s;
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
/* required LIB STYLES */
|
|
||||||
/* .Treant se automatski dodaje na svaki chart conatiner */
|
|
||||||
.Treant {
|
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
padding: 0 !important;
|
|
||||||
}
|
|
||||||
.Treant > .node,
|
|
||||||
.Treant > .pseudo {
|
|
||||||
position: absolute;
|
|
||||||
display: block;
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
.Treant.Treant-loaded .node,
|
|
||||||
.Treant.Treant-loaded .pseudo {
|
|
||||||
visibility: visible;
|
|
||||||
}
|
|
||||||
.Treant > .pseudo {
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
border: none;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
.Treant .collapse-switch {
|
|
||||||
width: 3px;
|
|
||||||
height: 3px;
|
|
||||||
display: block;
|
|
||||||
border: 1px solid black;
|
|
||||||
position: absolute;
|
|
||||||
top: 1px;
|
|
||||||
right: 1px;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.Treant .collapsed .collapse-switch {
|
|
||||||
background-color: #868dee;
|
|
||||||
}
|
|
||||||
.Treant > .node img {
|
|
||||||
border: none;
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
.Treant > .node {
|
|
||||||
cursor: pointer;
|
|
||||||
padding: 4px;
|
|
||||||
min-width: 60px;
|
|
||||||
text-align: center;
|
|
||||||
border: 2px solid #e8e8e3;
|
|
||||||
border-radius: 2px;
|
|
||||||
box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.Treant > .researched {
|
|
||||||
background-color: #666;
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.Treant > .locked > div {
|
|
||||||
color: red;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.Treant > .node > div {
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.Treant > .unlocked:hover {
|
|
||||||
background-color: #666;
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
@import "mixins";
|
|
||||||
@import "theme";
|
|
||||||
|
|
||||||
/* Both Work in progress and BitNode stuff */
|
|
||||||
.generic-fullscreen-container {
|
|
||||||
color: var(--my-font-color);
|
|
||||||
width: 99%;
|
|
||||||
height: 100%;
|
|
||||||
overflow-y: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.generic-fullscreen-container-scroll {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
overflow: auto;
|
|
||||||
padding-right: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#work-in-progress-container {
|
|
||||||
position: fixed;
|
|
||||||
}
|
|
||||||
|
|
||||||
#work-in-progress-text {
|
|
||||||
color: var(--my-font-color);
|
|
||||||
width: 70%;
|
|
||||||
margin: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.work-button {
|
|
||||||
@include borderRadius(12px);
|
|
||||||
@include boxShadow(1px 1px 3px #000);
|
|
||||||
|
|
||||||
color: #aaa;
|
|
||||||
float: left;
|
|
||||||
font-size: $defaultFontSize * 1.25;
|
|
||||||
font-weight: bold;
|
|
||||||
margin: 10px;
|
|
||||||
padding: 5px;
|
|
||||||
border: 3px solid #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.work-button:hover,
|
|
||||||
.work-button:focus {
|
|
||||||
color: #fff;
|
|
||||||
text-decoration: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
#cinematic-text-container {
|
|
||||||
position: fixed;
|
|
||||||
}
|
|
||||||
Vendored
+82
-65
File diff suppressed because one or more lines are too long
@@ -1,6 +1,6 @@
|
|||||||
.. _gameplay_sourcefiles:
|
.. _gameplay_sourcefiles:
|
||||||
|
|
||||||
.. warning:: This page contains spoilers regarding the game's story/plot-line.
|
.. warning:: This page contains spoilers for the game
|
||||||
|
|
||||||
Source-Files
|
Source-Files
|
||||||
============
|
============
|
||||||
|
|||||||
@@ -3,6 +3,131 @@
|
|||||||
Changelog
|
Changelog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
v0.56.0 - 2021-10-11 Trimming the backlog (hydroflame & community)
|
||||||
|
-------------------------------------------
|
||||||
|
|
||||||
|
** BREAKING **
|
||||||
|
|
||||||
|
* The 'write' function is now async. This helps when making scripts that write scripts.
|
||||||
|
|
||||||
|
** Terminal **
|
||||||
|
|
||||||
|
* 'grow' and 'weaken' have been added as terminal command. This should help player transition
|
||||||
|
from commands to scripts. The tutorial also talks about it.
|
||||||
|
* 'cp' command added
|
||||||
|
* Improved performance by rate limiting refresh.
|
||||||
|
|
||||||
|
** IP vs Hostname **
|
||||||
|
|
||||||
|
* The game now uses hostname as primary key for it's servers (yeah believe it or not IPs were
|
||||||
|
used until then). This has caused some issues with purchased servers (they couldn't be sold).
|
||||||
|
You might need to soft reset for the game to fully convert itself.
|
||||||
|
|
||||||
|
** Sleeve **
|
||||||
|
|
||||||
|
* Fixed bug where they couldn't train at Volhaven.
|
||||||
|
* No longer consume all bonus time at once, making it look buggy.
|
||||||
|
|
||||||
|
** SF9 **
|
||||||
|
|
||||||
|
* Now boosts hacknet production by 8/12/14%
|
||||||
|
|
||||||
|
** Hacknet Servers **
|
||||||
|
|
||||||
|
* production nerfed by 10%
|
||||||
|
* Max money increase gets weaker above 10t max money
|
||||||
|
|
||||||
|
** Corporation **
|
||||||
|
|
||||||
|
* Warehouse tooltip now also displays the amount of space taken by products.
|
||||||
|
* Changed research box completely to avoid dependency on Treant (Treant is a pita)
|
||||||
|
* All textbox should accept MAX/MP case insensitive.
|
||||||
|
* Fixed export popup not refreshing dropdowns correctly.
|
||||||
|
* Fixed product mku becoming zero
|
||||||
|
* Increased scaling of Wilson to avoid feedback loop.
|
||||||
|
* Can no longer get in debt by buying real estate
|
||||||
|
* Bonus time is consumed faster.
|
||||||
|
|
||||||
|
** Netscript **
|
||||||
|
|
||||||
|
* isBusy takes bitverse and infiltration into account
|
||||||
|
* hospitalize can't be called when in infiltration.
|
||||||
|
* setToCommitCrime now accepts crime rough name instead of perfect name.
|
||||||
|
* disableLog All now works for bladeburner functions.
|
||||||
|
* Fixed netscript port for ns1.
|
||||||
|
|
||||||
|
** Augmentation **
|
||||||
|
|
||||||
|
* Added augmentation to Ti Di Hui that removes penalty for being unfocused.
|
||||||
|
* Neuroflux no longer appears in special factions.
|
||||||
|
|
||||||
|
** Script Editor **
|
||||||
|
|
||||||
|
* Ram check is debounced instead of refreshed every second.
|
||||||
|
* Added the vscode extension documentation to the game (it doesn't work well, thought)
|
||||||
|
* Fixed issue where autocomplete list would grow forever
|
||||||
|
* Added semi-monokai as theme.
|
||||||
|
* Fixed issue where modifying filename would mess it up.
|
||||||
|
* Font size can be changed now.
|
||||||
|
|
||||||
|
** Infiltration **
|
||||||
|
|
||||||
|
* Fixed issue where game controls would become unfocused.
|
||||||
|
|
||||||
|
** Misc. **
|
||||||
|
|
||||||
|
* Fixed loader incorrectly assuming some null values are incorrect.
|
||||||
|
* installBackdoor trigger Bitverse sequence
|
||||||
|
* Some improvements to the theme editor
|
||||||
|
* Improved documentation about where to learn javascript.
|
||||||
|
* Added some instructions for contributors.
|
||||||
|
* Fixed typo in corporation sell shares modal (@Saynt_Garmo)
|
||||||
|
* Fixed pagination being black on black in Active Scripts
|
||||||
|
* Create Script tab renamed to Script Editor
|
||||||
|
* Fixed an issue where corp some textbox wouldn't update when changing city.
|
||||||
|
* Fixed an issue where hacknet online time was always 0.
|
||||||
|
* Netscript function prompt fixed.
|
||||||
|
* Fixed miscalculation in growth.
|
||||||
|
* Script with syntax errors will try to be a tad more helpful.
|
||||||
|
* Corporations can no longer bribe bladeburners.
|
||||||
|
* Augmentation Graphene Branchiblade renamed to Brachi, like the rest of them.
|
||||||
|
* All ram is displayed in GB/TB/PB now.
|
||||||
|
* Game now saves when saving a file, this can be turned off.
|
||||||
|
* Several improvement to log window.
|
||||||
|
* Bladeburner current action returns General type instead of the name of the action.
|
||||||
|
* Bladeburner travel and Sleeve travel respect disable ASCII.
|
||||||
|
* Tutorial fits on small screens.
|
||||||
|
* Import is much slower but more consistent now.
|
||||||
|
* Fix intelligence not updating properly.
|
||||||
|
* Added SF -1: Time Compression
|
||||||
|
* ReadTheDoc theme now matches the game.
|
||||||
|
* Logbox should wrap text better
|
||||||
|
* Logbox behavior should feel better.
|
||||||
|
* Fix font for AutoLink.exe
|
||||||
|
* nerf noodle bar
|
||||||
|
|
||||||
|
v0.55.0 - 2021-09-20 Material UI (hydroflame & community)
|
||||||
|
-------------------------------------------
|
||||||
|
|
||||||
|
** Global **
|
||||||
|
|
||||||
|
* The game is now 100% in typescript, react, and Material-UI
|
||||||
|
|
||||||
|
** Misc. **
|
||||||
|
|
||||||
|
* Corporations can no longer bribe special factions
|
||||||
|
* Infiltration can no longer lose focus of the keyboard.
|
||||||
|
* Fix terminal line limit
|
||||||
|
* Added theme editor
|
||||||
|
* Theme applies on game load (@Nolshine)
|
||||||
|
* Sleeves no longer consume all bonus time for some actions
|
||||||
|
* Fix a bug where the autocomlete list would get duplicates
|
||||||
|
* Fix tutorial not scaling properly on small screens
|
||||||
|
* Import should be more consistent
|
||||||
|
* Typo with 'help' command
|
||||||
|
* Fix infinite loop in casino
|
||||||
|
* nerf noodle bar
|
||||||
|
|
||||||
v0.54.0 - 2021-09-20 One big react node (hydroflame & community)
|
v0.54.0 - 2021-09-20 One big react node (hydroflame & community)
|
||||||
-------------------------------------------
|
-------------------------------------------
|
||||||
|
|
||||||
|
|||||||
+3
-2
@@ -64,9 +64,9 @@ documentation_title = '{0} Documentation'.format(project)
|
|||||||
# built documents.
|
# built documents.
|
||||||
#
|
#
|
||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
version = '0.54'
|
version = '0.56'
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = '0.54.0'
|
release = '0.56.0'
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
@@ -189,3 +189,4 @@ intersphinx_mapping = {'https://docs.python.org/': None}
|
|||||||
def setup(app):
|
def setup(app):
|
||||||
print("Initializing (setup())");
|
print("Initializing (setup())");
|
||||||
app.add_stylesheet('maxwidthoverride.css')
|
app.add_stylesheet('maxwidthoverride.css')
|
||||||
|
app.add_stylesheet('dark_theme.css')
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
atExit() Netscript Function
|
||||||
|
============================
|
||||||
|
|
||||||
|
.. js:function:: atExit(f)
|
||||||
|
|
||||||
|
:RAM cost: 0 GB
|
||||||
|
:param function f: function to call when the script dies.
|
||||||
|
|
||||||
|
Runs when the script dies.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
.. code-block:: javascript
|
||||||
|
|
||||||
|
function onDeath() {
|
||||||
|
console.log('I died!!!')
|
||||||
|
}
|
||||||
|
atExit(onDeath);
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
autocomplete() Netscript Function
|
||||||
|
============================
|
||||||
|
|
||||||
|
.. warning:: This feature is not officially supported yet and the API might change.
|
||||||
|
|
||||||
|
.. js:function:: autocomplete(data, args)
|
||||||
|
|
||||||
|
:RAM cost: 0 GB
|
||||||
|
:param Object data: general data about the game you might want to autocomplete.
|
||||||
|
:param string[] args: current arguments.
|
||||||
|
|
||||||
|
data is an object with the following properties::
|
||||||
|
|
||||||
|
{
|
||||||
|
servers: list of all servers in the game.
|
||||||
|
txts: list of all text files on the current server.
|
||||||
|
scripts: list of all scripts on the current server.
|
||||||
|
}
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
.. code-block:: javascript
|
||||||
|
|
||||||
|
export function autocomplete(data, args) {
|
||||||
|
return [...data.servers]; // This script autocompletes the list of servers.
|
||||||
|
return [...data.servers, ...data.scripts]; // Autocomplete servers and scripts
|
||||||
|
return ["low", "medium", "high"]; // Autocomplete 3 specific strings.
|
||||||
|
}
|
||||||
|
|
||||||
|
Terminal:
|
||||||
|
|
||||||
|
.. code-block:: javascript
|
||||||
|
|
||||||
|
$ run demo.ns mega\t
|
||||||
|
// results in
|
||||||
|
$ run demo.ns megacorp
|
||||||
@@ -6,8 +6,6 @@ getServer() Netscript Function
|
|||||||
:RAM cost: 2 GB
|
:RAM cost: 2 GB
|
||||||
:param string hostname: Hostname of the server, defaults to host server.
|
:param string hostname: Hostname of the server, defaults to host server.
|
||||||
|
|
||||||
If you are not in BitNode-5, then you must have Source-File 5-1 in order to run this function.
|
|
||||||
|
|
||||||
This function is meant to be used in conjunction with the :doc:`formulas API<../netscriptformulasapi>`.
|
This function is meant to be used in conjunction with the :doc:`formulas API<../netscriptformulasapi>`.
|
||||||
|
|
||||||
Returns an object with the Server's stats. The object has the following properties::
|
Returns an object with the Server's stats. The object has the following properties::
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
alert() Netscript Function
|
||||||
|
============================
|
||||||
|
|
||||||
|
.. js:function:: alert(message)
|
||||||
|
|
||||||
|
:RAM cost: 0 GB
|
||||||
|
:param string message: message to display
|
||||||
|
|
||||||
|
Spawns an alert box.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
.. code-block:: javascript
|
||||||
|
|
||||||
|
alert("Reached $1b");
|
||||||
@@ -28,6 +28,8 @@ grow() Netscript Function
|
|||||||
server, but there is no required hacking level to run the command. It also
|
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 per thread.
|
raises the security level of the target server by 0.004 per thread.
|
||||||
|
|
||||||
|
Action time is calculated at the start, effect is calculated at the end.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
.. code-block:: javascript
|
.. code-block:: javascript
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
growthAnalyze() Netscript Function
|
growthAnalyze() Netscript Function
|
||||||
==================================
|
==================================
|
||||||
|
|
||||||
.. js:function:: growthAnalyze(hostname, growthAmount)
|
.. js:function:: growthAnalyze(hostname, growthAmount[, cores])
|
||||||
|
|
||||||
:RAM cost: 1 GB
|
:RAM cost: 1 GB
|
||||||
:param string hostname: Hostname of server to analyze.
|
:param string hostname: Hostname of server to analyze.
|
||||||
:param number growthAmount: Multiplicative factor by which the server is
|
:param number growthAmount: Multiplicative factor by which the server is
|
||||||
grown. Decimal form. Must be >= 1.
|
grown. Decimal form. Must be >= 1.
|
||||||
|
:param number cores: Amount of cores on the server that would run the growth, defaults to 1
|
||||||
:returns: The amount of :doc:`grow<grow>` threads needed to grow the specified
|
:returns: The amount of :doc:`grow<grow>` threads needed to grow the specified
|
||||||
server by the specified amount.
|
server by the specified amount.
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ hack() Netscript Function
|
|||||||
A successful :doc:`hack<hack>` on a server will raise that server's security
|
A successful :doc:`hack<hack>` on a server will raise that server's security
|
||||||
level by 0.002.
|
level by 0.002.
|
||||||
|
|
||||||
|
Action time is calculated at the start, effect is calculated at the end.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
.. code-block:: javascript
|
.. code-block:: javascript
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
toast() Netscript Function
|
||||||
|
============================
|
||||||
|
|
||||||
|
.. js:function:: toast(message[, variant])
|
||||||
|
|
||||||
|
:RAM cost: 0 GB
|
||||||
|
:param string message: message to display
|
||||||
|
:param success|info|warning|error variant: color of the toast
|
||||||
|
|
||||||
|
Spawns a toast (those bottom left notifications).
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
.. code-block:: javascript
|
||||||
|
|
||||||
|
toast("Reached $1b");
|
||||||
|
toast("Failed to hack home", "error");
|
||||||
@@ -10,3 +10,4 @@ they contain spoilers for the game.
|
|||||||
|
|
||||||
getBitNodeMultipliers() <advancedfunctions/getBitNodeMultipliers>
|
getBitNodeMultipliers() <advancedfunctions/getBitNodeMultipliers>
|
||||||
getServer() <advancedfunctions/getServer>
|
getServer() <advancedfunctions/getServer>
|
||||||
|
autocomplete() <advancedfunctions/autocomplete>
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ help you learn some basic programming concepts.
|
|||||||
Here are some good tutorials for learning programming/JavaScript as a beginner:
|
Here are some good tutorials for learning programming/JavaScript as a beginner:
|
||||||
|
|
||||||
* `Learn-JS <http://www.learn-js.org/en/Welcome>`_
|
* `Learn-JS <http://www.learn-js.org/en/Welcome>`_
|
||||||
|
* `programiz <https://www.programiz.com/javascript/get-started>`_
|
||||||
* `Speaking JavaScript <http://speakingjs.com/es5/index.html>`_
|
* `Speaking JavaScript <http://speakingjs.com/es5/index.html>`_
|
||||||
This is a bit on the longer side. You can skip all of the historical
|
This is a bit on the longer side. You can skip all of the historical
|
||||||
background stuff. Recommended chapters: 1, 7-18
|
background stuff. Recommended chapters: 1, 7-18
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ The player has access to all of these functions while in BitNode-4. Completing B
|
|||||||
getFactionRep() <singularityfunctions/getFactionRep>
|
getFactionRep() <singularityfunctions/getFactionRep>
|
||||||
getFactionFavor() <singularityfunctions/getFactionFavor>
|
getFactionFavor() <singularityfunctions/getFactionFavor>
|
||||||
getFactionFavorGain() <singularityfunctions/getFactionFavorGain>
|
getFactionFavorGain() <singularityfunctions/getFactionFavorGain>
|
||||||
|
upgradeHomeCores() <singularityfunctions/upgradeHomeCores>
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:caption: Level 3 Functions
|
:caption: Level 3 Functions
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ getAugmentationCost() Netscript Function
|
|||||||
|
|
||||||
.. js:function:: getAugmentationCost(augName)
|
.. js:function:: getAugmentationCost(augName)
|
||||||
|
|
||||||
.. warning:: This function is deprecated.
|
.. warning:: This function is deprecated. It still functions, but new
|
||||||
|
scripts should prefer :doc:`getAugmentationPrice<getAugmentationPrice>`
|
||||||
|
and :doc:`getAugmentationRepReq<getAugmentationRepReq>` instead.
|
||||||
|
|
||||||
:RAM cost: 5 GB
|
:RAM cost: 5 GB
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
upgradeHomeRam() Netscript Function
|
||||||
|
===================================
|
||||||
|
|
||||||
|
.. js:function:: upgradeHomeCores()
|
||||||
|
|
||||||
|
:RAM cost: 3 GB
|
||||||
|
|
||||||
|
If you are not in BitNode-4, then you must have Level 2 of Source-File 4 in order to use this function.
|
||||||
|
|
||||||
|
This function will upgrade amount of CORES on the player's home computer. The cost is the same as if you were to do it manually.
|
||||||
|
|
||||||
|
This function will return true if the player's home computer core count is successfully upgraded, and false otherwise.
|
||||||
@@ -0,0 +1,453 @@
|
|||||||
|
:root {
|
||||||
|
--dark-text-color: #0c0;
|
||||||
|
--dark-link-color: #090;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-nav-content-wrap {
|
||||||
|
background-color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-nav-content {
|
||||||
|
background-color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section {
|
||||||
|
color: var(--dark-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content .highlighted {
|
||||||
|
background: #333;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight {
|
||||||
|
background-color: #17181c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight .nn {
|
||||||
|
color: var(--dark-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight .nb {
|
||||||
|
color: #8bb8df;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight .kn,
|
||||||
|
.highlight .kc,
|
||||||
|
.highlight .k {
|
||||||
|
color: #41c2ea;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight .s1,
|
||||||
|
.highlight .s2 {
|
||||||
|
color: #b3e87f;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight .nt {
|
||||||
|
color: #ccb350;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight .c1 {
|
||||||
|
color: #686868;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content div[class^="highlight"] {
|
||||||
|
border-color: #1a1a1a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon,
|
||||||
|
.icon-home {
|
||||||
|
color: var(--dark-link-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-nav-content a,
|
||||||
|
.wy-nav-content a:visited {
|
||||||
|
color: var(--dark-link-color) !important;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-neutral {
|
||||||
|
background-color: #17181c !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-neutral:hover {
|
||||||
|
background-color: #101114 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-neutral:visited {
|
||||||
|
color: #c1c1c1 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
color: #bdbdbd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-nav-side {
|
||||||
|
background-color: #000;
|
||||||
|
border: 1px solid #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-menu-vertical > a {
|
||||||
|
color: var(--dark-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-menu-vertical li.current {
|
||||||
|
background-color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-menu-vertical li.current > a,
|
||||||
|
.wy-menu-vertical li.on a {
|
||||||
|
background-color: #000;
|
||||||
|
color: var(--dark-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-menu-vertical li.toctree-l1.current > a,
|
||||||
|
.wy-menu-vertical li.current a {
|
||||||
|
border-color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-menu-vertical header,
|
||||||
|
.wy-menu-vertical p.caption {
|
||||||
|
color: var(--dark-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
html.writer-html4 .rst-content dl:not(.docutils) > dt,
|
||||||
|
html.writer-html5
|
||||||
|
.rst-content
|
||||||
|
dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)
|
||||||
|
> dt {
|
||||||
|
background-color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-menu-vertical li.current a {
|
||||||
|
color: #090;
|
||||||
|
}
|
||||||
|
.wy-menu-vertical a {
|
||||||
|
color: var(--dark-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-menu-vertical li.current a:hover {
|
||||||
|
background-color: #222;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-menu-vertical a:hover,
|
||||||
|
.wy-menu-vertical li.current > a:hover,
|
||||||
|
.wy-menu-vertical li.on a:hover {
|
||||||
|
background-color: #000;
|
||||||
|
color: var(--dark-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-menu-vertical li.toctree-l2.current > a,
|
||||||
|
.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a {
|
||||||
|
background-color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-side-nav-search {
|
||||||
|
background-color: #000;
|
||||||
|
color: var(--dark-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-side-nav-search .wy-dropdown > a,
|
||||||
|
.wy-side-nav-search > a {
|
||||||
|
color: var(--dark-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-side-nav-search input[type="text"] {
|
||||||
|
border-left: 0px;
|
||||||
|
border-right: 0px;
|
||||||
|
border-top: 0px;
|
||||||
|
border-radius: 0px;
|
||||||
|
box-shadow: none;
|
||||||
|
border-bottom-color: #0c0;
|
||||||
|
background-color: #333;
|
||||||
|
color: var(--dark-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-switcher {
|
||||||
|
background-color: #0b0c0d;
|
||||||
|
color: var(--dark-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
writer-html4 .rst-content dl:not(.docutils) > dt,
|
||||||
|
writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) > dt {
|
||||||
|
background-color: #0b0b0b;
|
||||||
|
color: #007dce;
|
||||||
|
border-color: #282828;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content code,
|
||||||
|
.rst-content tt {
|
||||||
|
color: var(--dark-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list) > dt,
|
||||||
|
writer-html5
|
||||||
|
.rst-content
|
||||||
|
dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)
|
||||||
|
dl:not(.field-list)
|
||||||
|
> dt {
|
||||||
|
background-color: #0f0f0f;
|
||||||
|
color: #959595;
|
||||||
|
border-color: #2b2b2b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content code,
|
||||||
|
.rst-content tt,
|
||||||
|
code {
|
||||||
|
background-color: #2d2d2d;
|
||||||
|
border-color: #1c1c1c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content code.xref,
|
||||||
|
.rst-content tt.xref,
|
||||||
|
a .rst-content code,
|
||||||
|
a .rst-content tt {
|
||||||
|
color: #cecece;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content .hint,
|
||||||
|
.rst-content .important,
|
||||||
|
.rst-content .tip,
|
||||||
|
.rst-content .wy-alert-success.admonition,
|
||||||
|
.rst-content .wy-alert-success.admonition-todo,
|
||||||
|
.rst-content .wy-alert-success.attention,
|
||||||
|
.rst-content .wy-alert-success.caution,
|
||||||
|
.rst-content .wy-alert-success.danger,
|
||||||
|
.rst-content .wy-alert-success.error,
|
||||||
|
.rst-content .wy-alert-success.note,
|
||||||
|
.rst-content .wy-alert-success.seealso,
|
||||||
|
.rst-content .wy-alert-success.warning,
|
||||||
|
.wy-alert.wy-alert-success {
|
||||||
|
background-color: #00392e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content .hint .admonition-title,
|
||||||
|
.rst-content .hint .wy-alert-title,
|
||||||
|
.rst-content .important .admonition-title,
|
||||||
|
.rst-content .important .wy-alert-title,
|
||||||
|
.rst-content .tip .admonition-title,
|
||||||
|
.rst-content .tip .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-success.admonition-todo .admonition-title,
|
||||||
|
.rst-content .wy-alert-success.admonition-todo .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-success.admonition .admonition-title,
|
||||||
|
.rst-content .wy-alert-success.admonition .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-success.attention .admonition-title,
|
||||||
|
.rst-content .wy-alert-success.attention .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-success.caution .admonition-title,
|
||||||
|
.rst-content .wy-alert-success.caution .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-success.danger .admonition-title,
|
||||||
|
.rst-content .wy-alert-success.danger .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-success.error .admonition-title,
|
||||||
|
.rst-content .wy-alert-success.error .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-success.note .admonition-title,
|
||||||
|
.rst-content .wy-alert-success.note .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-success.seealso .admonition-title,
|
||||||
|
.rst-content .wy-alert-success.seealso .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-success.warning .admonition-title,
|
||||||
|
.rst-content .wy-alert-success.warning .wy-alert-title,
|
||||||
|
.rst-content .wy-alert.wy-alert-success .admonition-title,
|
||||||
|
.wy-alert.wy-alert-success .rst-content .admonition-title,
|
||||||
|
.wy-alert.wy-alert-success .wy-alert-title {
|
||||||
|
background-color: #006a56;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content .note,
|
||||||
|
.rst-content .seealso,
|
||||||
|
.rst-content .wy-alert-info.admonition,
|
||||||
|
.rst-content .wy-alert-info.admonition-todo,
|
||||||
|
.rst-content .wy-alert-info.attention,
|
||||||
|
.rst-content .wy-alert-info.caution,
|
||||||
|
.rst-content .wy-alert-info.danger,
|
||||||
|
.rst-content .wy-alert-info.error,
|
||||||
|
.rst-content .wy-alert-info.hint,
|
||||||
|
.rst-content .wy-alert-info.important,
|
||||||
|
.rst-content .wy-alert-info.tip,
|
||||||
|
.rst-content .wy-alert-info.warning,
|
||||||
|
.wy-alert.wy-alert-info {
|
||||||
|
background-color: #002c4d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content .note .admonition-title,
|
||||||
|
.rst-content .note .wy-alert-title,
|
||||||
|
.rst-content .seealso .admonition-title,
|
||||||
|
.rst-content .seealso .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-info.admonition-todo .admonition-title,
|
||||||
|
.rst-content .wy-alert-info.admonition-todo .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-info.admonition .admonition-title,
|
||||||
|
.rst-content .wy-alert-info.admonition .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-info.attention .admonition-title,
|
||||||
|
.rst-content .wy-alert-info.attention .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-info.caution .admonition-title,
|
||||||
|
.rst-content .wy-alert-info.caution .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-info.danger .admonition-title,
|
||||||
|
.rst-content .wy-alert-info.danger .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-info.error .admonition-title,
|
||||||
|
.rst-content .wy-alert-info.error .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-info.hint .admonition-title,
|
||||||
|
.rst-content .wy-alert-info.hint .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-info.important .admonition-title,
|
||||||
|
.rst-content .wy-alert-info.important .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-info.tip .admonition-title,
|
||||||
|
.rst-content .wy-alert-info.tip .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-info.warning .admonition-title,
|
||||||
|
.rst-content .wy-alert-info.warning .wy-alert-title,
|
||||||
|
.rst-content .wy-alert.wy-alert-info .admonition-title,
|
||||||
|
.wy-alert.wy-alert-info .rst-content .admonition-title,
|
||||||
|
.wy-alert.wy-alert-info .wy-alert-title {
|
||||||
|
background-color: #004a7b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content dl:not(.docutils) dt {
|
||||||
|
background-color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content {
|
||||||
|
color: var(--dark-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content .admonition-todo,
|
||||||
|
.rst-content .attention,
|
||||||
|
.rst-content .caution,
|
||||||
|
.rst-content .warning,
|
||||||
|
.rst-content .wy-alert-warning.admonition,
|
||||||
|
.rst-content .wy-alert-warning.danger,
|
||||||
|
.rst-content .wy-alert-warning.error,
|
||||||
|
.rst-content .wy-alert-warning.hint,
|
||||||
|
.rst-content .wy-alert-warning.important,
|
||||||
|
.rst-content .wy-alert-warning.note,
|
||||||
|
.rst-content .wy-alert-warning.seealso,
|
||||||
|
.rst-content .wy-alert-warning.tip,
|
||||||
|
.wy-alert.wy-alert-warning {
|
||||||
|
background-color: #533500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content .admonition-todo .admonition-title,
|
||||||
|
.rst-content .admonition-todo .wy-alert-title,
|
||||||
|
.rst-content .attention .admonition-title,
|
||||||
|
.rst-content .attention .wy-alert-title,
|
||||||
|
.rst-content .caution .admonition-title,
|
||||||
|
.rst-content .caution .wy-alert-title,
|
||||||
|
.rst-content .warning .admonition-title,
|
||||||
|
.rst-content .warning .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-warning.admonition .admonition-title,
|
||||||
|
.rst-content .wy-alert-warning.admonition .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-warning.danger .admonition-title,
|
||||||
|
.rst-content .wy-alert-warning.danger .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-warning.error .admonition-title,
|
||||||
|
.rst-content .wy-alert-warning.error .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-warning.hint .admonition-title,
|
||||||
|
.rst-content .wy-alert-warning.hint .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-warning.important .admonition-title,
|
||||||
|
.rst-content .wy-alert-warning.important .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-warning.note .admonition-title,
|
||||||
|
.rst-content .wy-alert-warning.note .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-warning.seealso .admonition-title,
|
||||||
|
.rst-content .wy-alert-warning.seealso .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-warning.tip .admonition-title,
|
||||||
|
.rst-content .wy-alert-warning.tip .wy-alert-title,
|
||||||
|
.rst-content .wy-alert.wy-alert-warning .admonition-title,
|
||||||
|
.wy-alert.wy-alert-warning .rst-content .admonition-title,
|
||||||
|
.wy-alert.wy-alert-warning .wy-alert-title {
|
||||||
|
background-color: #803b00;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content .danger,
|
||||||
|
.rst-content .error,
|
||||||
|
.rst-content .wy-alert-danger.admonition,
|
||||||
|
.rst-content .wy-alert-danger.admonition-todo,
|
||||||
|
.rst-content .wy-alert-danger.attention,
|
||||||
|
.rst-content .wy-alert-danger.caution,
|
||||||
|
.rst-content .wy-alert-danger.hint,
|
||||||
|
.rst-content .wy-alert-danger.important,
|
||||||
|
.rst-content .wy-alert-danger.note,
|
||||||
|
.rst-content .wy-alert-danger.seealso,
|
||||||
|
.rst-content .wy-alert-danger.tip,
|
||||||
|
.rst-content .wy-alert-danger.warning,
|
||||||
|
.wy-alert.wy-alert-danger {
|
||||||
|
background-color: #82231a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content .danger .admonition-title,
|
||||||
|
.rst-content .danger .wy-alert-title,
|
||||||
|
.rst-content .error .admonition-title,
|
||||||
|
.rst-content .error .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-danger.admonition-todo .admonition-title,
|
||||||
|
.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-danger.admonition .admonition-title,
|
||||||
|
.rst-content .wy-alert-danger.admonition .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-danger.attention .admonition-title,
|
||||||
|
.rst-content .wy-alert-danger.attention .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-danger.caution .admonition-title,
|
||||||
|
.rst-content .wy-alert-danger.caution .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-danger.hint .admonition-title,
|
||||||
|
.rst-content .wy-alert-danger.hint .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-danger.important .admonition-title,
|
||||||
|
.rst-content .wy-alert-danger.important .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-danger.note .admonition-title,
|
||||||
|
.rst-content .wy-alert-danger.note .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-danger.seealso .admonition-title,
|
||||||
|
.rst-content .wy-alert-danger.seealso .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-danger.tip .admonition-title,
|
||||||
|
.rst-content .wy-alert-danger.tip .wy-alert-title,
|
||||||
|
.rst-content .wy-alert-danger.warning .admonition-title,
|
||||||
|
.rst-content .wy-alert-danger.warning .wy-alert-title,
|
||||||
|
.rst-content .wy-alert.wy-alert-danger .admonition-title,
|
||||||
|
.wy-alert.wy-alert-danger .rst-content .admonition-title,
|
||||||
|
.wy-alert.wy-alert-danger .wy-alert-title {
|
||||||
|
background-color: #b9372b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-nav-top {
|
||||||
|
background-color: #0b152d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content table.docutils thead,
|
||||||
|
.rst-content table.field-list thead,
|
||||||
|
.wy-table thead {
|
||||||
|
color: var(--dark-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,
|
||||||
|
.wy-table-backed,
|
||||||
|
.wy-table-odd td,
|
||||||
|
.wy-table-striped tr:nth-child(2n-1) td {
|
||||||
|
background-color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content table.docutils:not(.field-list) tr:nth-child(2n) td,
|
||||||
|
.wy-table-backed,
|
||||||
|
.wy-table-odd td,
|
||||||
|
.wy-table-striped tr:nth-child(2n) td {
|
||||||
|
background-color: #444;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content table.docutils td,
|
||||||
|
.wy-table-bordered-all td,
|
||||||
|
writer-html5 .rst-content table.docutils th,
|
||||||
|
.rst-content table.docutils,
|
||||||
|
.wy-table-bordered-all {
|
||||||
|
border-color: #262626;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content table.docutils caption,
|
||||||
|
.rst-content table.field-list caption,
|
||||||
|
.wy-table caption {
|
||||||
|
color: var(--dark-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-menu-vertical li.toctree-l3.current > a,
|
||||||
|
.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a {
|
||||||
|
background-color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wy-side-nav-search > div.version {
|
||||||
|
color: var(--dark-text-color);
|
||||||
|
}
|
||||||
+21
-2
@@ -1,10 +1,11 @@
|
|||||||
const { app, BrowserWindow, Menu } = require("electron");
|
const { app, BrowserWindow, Menu, globalShortcut, shell } = require("electron");
|
||||||
|
|
||||||
Menu.setApplicationMenu(false);
|
Menu.setApplicationMenu(false);
|
||||||
function createWindow() {
|
function createWindow() {
|
||||||
const win = new BrowserWindow({
|
const win = new BrowserWindow({
|
||||||
show: false,
|
show: false,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
devTools: false,
|
devTools: true,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -12,6 +13,24 @@ function createWindow() {
|
|||||||
win.maximize();
|
win.maximize();
|
||||||
win.loadFile("index.html");
|
win.loadFile("index.html");
|
||||||
win.show();
|
win.show();
|
||||||
|
win.webContents.openDevTools();
|
||||||
|
globalShortcut.register("f5", function () {
|
||||||
|
win.loadFile("index.html");
|
||||||
|
});
|
||||||
|
globalShortcut.register("f8", function () {
|
||||||
|
win.loadFile("index.html", { query: { noScripts: "true" } });
|
||||||
|
});
|
||||||
|
|
||||||
|
win.webContents.on("new-window", function (e, url) {
|
||||||
|
// make sure local urls stay in electron perimeter
|
||||||
|
if (url.substr(0, "file://".length) === "file://") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// and open every other protocols on the browser
|
||||||
|
e.preventDefault();
|
||||||
|
shell.openExternal(url);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
app.whenReady().then(() => {
|
app.whenReady().then(() => {
|
||||||
|
|||||||
+16
-13
@@ -36,19 +36,22 @@
|
|||||||
ga("send", "pageview");
|
ga("send", "pageview");
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<link rel="shortcut icon" href="favicon.ico"><link href="dist/vendor.css" rel="stylesheet"><link href="main.css" rel="stylesheet"></head>
|
<style>
|
||||||
|
body {
|
||||||
|
background-color: black;
|
||||||
|
}
|
||||||
|
* {
|
||||||
|
-ms-overflow-style: none; /* for Internet Explorer, Edge */
|
||||||
|
scrollbar-width: none; /* for Firefox */
|
||||||
|
}
|
||||||
|
|
||||||
|
*::-webkit-scrollbar {
|
||||||
|
display: none; /* for Chrome, Safari, and Opera */
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<link rel="shortcut icon" href="favicon.ico"></head>
|
||||||
<body>
|
<body>
|
||||||
<div id="entire-game-container">
|
<div id="root"/>
|
||||||
<div id="mainmenu-container" style="display: flex; flex-direction: row"></div>
|
|
||||||
|
|
||||||
<!-- Status text -->
|
|
||||||
<div id="status-text-container">
|
|
||||||
<p id="status-text"></p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="unclickable" style="display: none">Click on this to upgrade your Source-File -1!</div>
|
|
||||||
<script type="text/javascript" src="dist/vendor.bundle.js"></script><script type="text/javascript" src="main.bundle.js"></script></body>
|
<script type="text/javascript" src="dist/vendor.bundle.js"></script><script type="text/javascript" src="main.bundle.js"></script></body>
|
||||||
|
<!-- http://plaza.dsolver.ca/m/hydroflame4418 -->
|
||||||
<script src="src/ThirdParty/raphael.min.js"></script>
|
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+2
-2
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
Generated
+11333
-22731
File diff suppressed because it is too large
Load Diff
+15
-65
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "bitburner",
|
"name": "bitburner",
|
||||||
"license": "SEE LICENSE IN license.txt",
|
"license": "SEE LICENSE IN license.txt",
|
||||||
"version": "0.53.0",
|
"version": "0.56.0",
|
||||||
"main": "electron-main.js",
|
"main": "electron-main.js",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Daniel Xie"
|
"name": "Daniel Xie"
|
||||||
@@ -13,52 +13,34 @@
|
|||||||
"@emotion/react": "^11.4.1",
|
"@emotion/react": "^11.4.1",
|
||||||
"@emotion/styled": "^11.3.0",
|
"@emotion/styled": "^11.3.0",
|
||||||
"@monaco-editor/react": "^4.2.2",
|
"@monaco-editor/react": "^4.2.2",
|
||||||
"@mui/icons-material": "^5.0.0-rc.1",
|
"@mui/icons-material": "^5.0.3",
|
||||||
"@mui/lab": "^5.0.0-alpha.46",
|
"@mui/material": "^5.0.3",
|
||||||
"@mui/material": "^5.0.0-rc.1",
|
"@mui/styles": "^5.0.1",
|
||||||
"@mui/styles": "^5.0.0-rc.1",
|
"@types/escodegen": "^0.0.7",
|
||||||
"@types/js-beautify": "^1.13.2",
|
"@types/js-beautify": "^1.13.2",
|
||||||
"@types/numeral": "0.0.25",
|
"@types/numeral": "0.0.25",
|
||||||
"@types/react": "^17.0.21",
|
"@types/react": "^17.0.21",
|
||||||
"@types/react-dom": "^17.0.9",
|
"@types/react-dom": "^17.0.9",
|
||||||
|
"@types/react-resizable": "^1.7.3",
|
||||||
"acorn": "^8.4.1",
|
"acorn": "^8.4.1",
|
||||||
"acorn-walk": "^8.1.1",
|
"acorn-walk": "^8.1.1",
|
||||||
"ajv": "^5.1.5",
|
|
||||||
"ajv-keywords": "^2.0.0",
|
|
||||||
"arg": "^5.0.0",
|
"arg": "^5.0.0",
|
||||||
"async": "^2.6.1",
|
"better-react-mathjax": "^1.0.3",
|
||||||
"autosize": "^4.0.2",
|
"clsx": "^1.1.1",
|
||||||
"brace": "^0.11.1",
|
|
||||||
"codemirror": "^5.58.2",
|
|
||||||
"decimal.js": "7.2.3",
|
"decimal.js": "7.2.3",
|
||||||
"enhanced-resolve": "^4.0.0",
|
|
||||||
"escodegen": "^1.11.0",
|
"escodegen": "^1.11.0",
|
||||||
"escope": "^3.6.0",
|
|
||||||
"file-saver": "^1.3.8",
|
"file-saver": "^1.3.8",
|
||||||
"interpret": "^1.0.0",
|
|
||||||
"jquery": "^3.5.0",
|
"jquery": "^3.5.0",
|
||||||
"jshint": "^2.10.2",
|
|
||||||
"json-loader": "^0.5.4",
|
|
||||||
"jsplumb": "^2.6.8",
|
|
||||||
"jszip": "^3.7.0",
|
"jszip": "^3.7.0",
|
||||||
"loader-runner": "^2.3.0",
|
"material-ui-color": "^1.2.0",
|
||||||
"loader-utils": "^1.1.0",
|
|
||||||
"mathjax-full": "^3.2.0",
|
|
||||||
"mathjax-react": "^1.0.6",
|
|
||||||
"memory-fs": "~0.4.1",
|
|
||||||
"monaco-editor": "^0.27.0",
|
"monaco-editor": "^0.27.0",
|
||||||
"node-sass": "^6.0.1",
|
"notistack": "^2.0.2",
|
||||||
"normalize.css": "^8.0.0",
|
|
||||||
"numeral": "2.0.6",
|
"numeral": "2.0.6",
|
||||||
"react": "^17.0.2",
|
"react": "^17.0.2",
|
||||||
"react-dom": "^17.0.2",
|
"react-dom": "^17.0.2",
|
||||||
"react-modal": "^3.12.1",
|
"react-draggable": "^4.4.4",
|
||||||
"sprintf-js": "^1.1.1",
|
"react-resizable": "^3.0.4",
|
||||||
"tapable": "^1.0.0",
|
"sprintf-js": "^1.1.1"
|
||||||
"treant-js": "^1.0.1",
|
|
||||||
"unused-webpack-plugin": "^2.4.0",
|
|
||||||
"uuid": "^3.2.1",
|
|
||||||
"w3c-blob": "0.0.1"
|
|
||||||
},
|
},
|
||||||
"description": "A cyberpunk-themed incremental game",
|
"description": "A cyberpunk-themed incremental game",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -69,65 +51,33 @@
|
|||||||
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.1",
|
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.1",
|
||||||
"@testing-library/cypress": "^8.0.1",
|
"@testing-library/cypress": "^8.0.1",
|
||||||
"@types/file-saver": "^2.0.3",
|
"@types/file-saver": "^2.0.3",
|
||||||
"@types/jest": "^27.0.1",
|
|
||||||
"@types/lodash": "^4.14.168",
|
"@types/lodash": "^4.14.168",
|
||||||
"@types/node": "^16.9.1",
|
|
||||||
"@typescript-eslint/eslint-plugin": "^4.22.0",
|
"@typescript-eslint/eslint-plugin": "^4.22.0",
|
||||||
"@typescript-eslint/parser": "^4.22.0",
|
"@typescript-eslint/parser": "^4.22.0",
|
||||||
"babel-jest": "^27.0.6",
|
"babel-jest": "^27.0.6",
|
||||||
"babel-loader": "^8.0.5",
|
"babel-loader": "^8.0.5",
|
||||||
"beautify-lint": "^1.0.3",
|
|
||||||
"benchmark": "^2.1.1",
|
|
||||||
"bundle-loader": "~0.5.0",
|
|
||||||
"css-loader": "^0.28.11",
|
|
||||||
"cypress": "^8.3.1",
|
"cypress": "^8.3.1",
|
||||||
"electron": "^14.0.1",
|
"electron": "^14.0.1",
|
||||||
"electron-packager": "^15.4.0",
|
"electron-packager": "^15.4.0",
|
||||||
"es6-promise-polyfill": "^1.1.1",
|
|
||||||
"eslint": "^7.24.0",
|
"eslint": "^7.24.0",
|
||||||
"eslint-plugin-node": "^11.1.0",
|
|
||||||
"file-loader": "^1.1.11",
|
|
||||||
"fork-ts-checker-webpack-plugin": "^6.3.3",
|
"fork-ts-checker-webpack-plugin": "^6.3.3",
|
||||||
"html-webpack-plugin": "^3.2.0",
|
"html-webpack-plugin": "^3.2.0",
|
||||||
"http-server": "^13.0.1",
|
"http-server": "^13.0.1",
|
||||||
"i18n-webpack-plugin": "^1.0.0",
|
|
||||||
"istanbul": "^0.4.5",
|
|
||||||
"jest": "^27.1.0",
|
"jest": "^27.1.0",
|
||||||
"js-beautify": "^1.5.10",
|
"js-beautify": "^1.5.10",
|
||||||
"jsdom": "^15.0.0",
|
"jsdom": "^15.0.0",
|
||||||
"jsdom-global": "^3.0.2",
|
|
||||||
"json5": "^1.0.1",
|
|
||||||
"less": "^3.9.0",
|
|
||||||
"less-loader": "^4.1.0",
|
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"mini-css-extract-plugin": "^0.4.1",
|
"mini-css-extract-plugin": "^0.4.1",
|
||||||
"mkdirp": "^0.5.1",
|
|
||||||
"null-loader": "^1.0.0",
|
|
||||||
"prettier": "^2.3.2",
|
"prettier": "^2.3.2",
|
||||||
"raw-loader": "~0.5.0",
|
|
||||||
"react-refresh": "^0.10.0",
|
"react-refresh": "^0.10.0",
|
||||||
"regenerator-runtime": "^0.13.9",
|
"regenerator-runtime": "^0.13.9",
|
||||||
"sass-loader": "^7.0.3",
|
|
||||||
"script-loader": "~0.7.0",
|
|
||||||
"should": "^11.1.1",
|
|
||||||
"simple-git": "^1.96.0",
|
|
||||||
"sinon": "^2.3.2",
|
|
||||||
"source-map": "^0.7.3",
|
"source-map": "^0.7.3",
|
||||||
"start-server-and-test": "^1.14.0",
|
"start-server-and-test": "^1.14.0",
|
||||||
"style-loader": "^0.21.0",
|
|
||||||
"stylelint": "^9.2.1",
|
|
||||||
"stylelint-declaration-use-variable": "^1.6.1",
|
|
||||||
"stylelint-order": "^0.8.1",
|
|
||||||
"typescript": "^4.2.4",
|
"typescript": "^4.2.4",
|
||||||
"uglify-es": "^3.3.9",
|
|
||||||
"uglifyjs-webpack-plugin": "^1.3.0",
|
|
||||||
"url-loader": "^1.0.1",
|
|
||||||
"watchpack": "^1.6.0",
|
|
||||||
"webpack": "^4.46.0",
|
"webpack": "^4.46.0",
|
||||||
"webpack-cli": "^3.3.12",
|
"webpack-cli": "^3.3.12",
|
||||||
"webpack-dev-middleware": "^3.7.3",
|
"webpack-dev-middleware": "^3.7.3",
|
||||||
"webpack-dev-server": "^3.11.2",
|
"webpack-dev-server": "^3.11.2"
|
||||||
"worker-loader": "^2.0.0"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8 || <=9"
|
"node": ">=8 || <=9"
|
||||||
@@ -145,12 +95,12 @@
|
|||||||
"format": "prettier --write .",
|
"format": "prettier --write .",
|
||||||
"start": "http-server -p 8000",
|
"start": "http-server -p 8000",
|
||||||
"start:dev": "webpack-dev-server --progress --env.devServer --mode development",
|
"start:dev": "webpack-dev-server --progress --env.devServer --mode development",
|
||||||
|
"start:dev-fast": "webpack-dev-server --progress --env.devServer --mode development --fast true",
|
||||||
"start:container": "webpack-dev-server --progress --env.devServer --mode development --env.runInContainer",
|
"start:container": "webpack-dev-server --progress --env.devServer --mode development --env.runInContainer",
|
||||||
"build": "webpack --mode production",
|
"build": "webpack --mode production",
|
||||||
"build:dev": "webpack --mode development",
|
"build:dev": "webpack --mode development",
|
||||||
"lint": "npm run lint:jsts & npm run lint:style",
|
"lint": "npm run lint:jsts & npm run lint:style",
|
||||||
"lint:jsts": "eslint --fix . --ext js,jsx,ts,tsx",
|
"lint:jsts": "eslint --fix . --ext js,jsx,ts,tsx",
|
||||||
"lint:style": "stylelint --fix ./css/*",
|
|
||||||
"preinstall": "node ./scripts/engines-check.js",
|
"preinstall": "node ./scripts/engines-check.js",
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
"test:watch": "jest --watch",
|
"test:watch": "jest --watch",
|
||||||
|
|||||||
+10
-5
@@ -1,14 +1,19 @@
|
|||||||
# npm install electron --save-dev
|
# npm install electron --save-dev
|
||||||
# npm install electron-packager --save-dev
|
# npm install electron-packager --save-dev
|
||||||
|
|
||||||
mkdir -p .package/dist || true
|
mkdir -p .package/dist/src/ThirdParty || true
|
||||||
|
mkdir -p .package/src/ThirdParty || true
|
||||||
|
|
||||||
cp index.html .package
|
cp index.html .package
|
||||||
cp electron/* .package
|
cp electron/* .package
|
||||||
cp dist/engine.bundle.js .package/dist
|
# The css files
|
||||||
cp dist/engineStyle.css .package/dist
|
|
||||||
cp dist/vendor.css .package/dist
|
cp dist/vendor.css .package/dist
|
||||||
cp dist/engineStyle.bundle.js .package/dist
|
cp main.css .package/main.css
|
||||||
cp dist/vendor.bundle.js .package/dist
|
|
||||||
|
# The js files.
|
||||||
|
cp dist/vendor.bundle.js .package/dist/vendor.bundle.js
|
||||||
|
cp main.bundle.js .package/main.bundle.js
|
||||||
|
|
||||||
|
cp src/ThirdParty/raphael.min.js .package/src/ThirdParty/raphael.min.js
|
||||||
|
|
||||||
npm run package-electron
|
npm run package-electron
|
||||||
@@ -8,11 +8,11 @@ import { Factions } from "../Faction/Factions";
|
|||||||
import { numeralWrapper } from "../ui/numeralFormat";
|
import { numeralWrapper } from "../ui/numeralFormat";
|
||||||
import { Money } from "../ui/React/Money";
|
import { Money } from "../ui/React/Money";
|
||||||
|
|
||||||
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver";
|
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../utils/JSONReviver";
|
||||||
|
|
||||||
interface IConstructorParams {
|
export interface IConstructorParams {
|
||||||
info: string | JSX.Element;
|
info: string | JSX.Element;
|
||||||
stats?: JSX.Element;
|
stats?: JSX.Element | null;
|
||||||
isSpecial?: boolean;
|
isSpecial?: boolean;
|
||||||
moneyCost: number;
|
moneyCost: number;
|
||||||
name: string;
|
name: string;
|
||||||
@@ -369,7 +369,7 @@ export class Augmentation {
|
|||||||
info: string | JSX.Element;
|
info: string | JSX.Element;
|
||||||
|
|
||||||
// Description of the stats, often autogenerated, sometimes manually written.
|
// Description of the stats, often autogenerated, sometimes manually written.
|
||||||
stats: JSX.Element;
|
stats: JSX.Element | null;
|
||||||
|
|
||||||
// Any Augmentation not immediately available in BitNode-1 is special (e.g. Bladeburner augs)
|
// Any Augmentation not immediately available in BitNode-1 is special (e.g. Bladeburner augs)
|
||||||
isSpecial = false;
|
isSpecial = false;
|
||||||
@@ -507,8 +507,9 @@ export class Augmentation {
|
|||||||
this.mults.bladeburner_success_chance_mult = params.bladeburner_success_chance_mult;
|
this.mults.bladeburner_success_chance_mult = params.bladeburner_success_chance_mult;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params.stats) this.stats = params.stats;
|
if (params.stats === undefined)
|
||||||
else this.stats = generateStatsDescription(this.mults, params.programs, params.startingMoney);
|
this.stats = generateStatsDescription(this.mults, params.programs, params.startingMoney);
|
||||||
|
else this.stats = params.stats;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adds this Augmentation to the specified Factions
|
// Adds this Augmentation to the specified Factions
|
||||||
@@ -532,6 +533,7 @@ export class Augmentation {
|
|||||||
console.warn(`Invalid Faction object in addToAllFactions(). Key value: ${fac}`);
|
console.warn(`Invalid Faction object in addToAllFactions(). Key value: ${fac}`);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (facObj.getInfo().special) continue;
|
||||||
facObj.augmentations.push(this.name);
|
facObj.augmentations.push(this.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-2
@@ -1,2 +0,0 @@
|
|||||||
export declare function isRepeatableAug(aug: Augmentation): boolean;
|
|
||||||
export declare function installAugmentations(): void;
|
|
||||||
+49
-29
@@ -1,6 +1,6 @@
|
|||||||
import { Augmentation } from "./Augmentation";
|
import { Augmentation, IConstructorParams } from "./Augmentation";
|
||||||
import { Augmentations } from "./Augmentations";
|
import { Augmentations } from "./Augmentations";
|
||||||
import { PlayerOwnedAugmentation } from "./PlayerOwnedAugmentation";
|
import { PlayerOwnedAugmentation, IPlayerOwnedAugmentation } from "./PlayerOwnedAugmentation";
|
||||||
import { AugmentationNames } from "./data/AugmentationNames";
|
import { AugmentationNames } from "./data/AugmentationNames";
|
||||||
|
|
||||||
import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers";
|
import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers";
|
||||||
@@ -11,20 +11,20 @@ import { prestigeAugmentation } from "../Prestige";
|
|||||||
import { Programs } from "../Programs/Programs";
|
import { Programs } from "../Programs/Programs";
|
||||||
import { SourceFileFlags } from "../SourceFile/SourceFileFlags";
|
import { SourceFileFlags } from "../SourceFile/SourceFileFlags";
|
||||||
|
|
||||||
import { dialogBoxCreate } from "../../utils/DialogBox";
|
import { dialogBoxCreate } from "../ui/React/DialogBox";
|
||||||
import { clearObject } from "../../utils/helpers/clearObject";
|
import { clearObject } from "../utils/helpers/clearObject";
|
||||||
|
|
||||||
import { WHRNG } from "../Casino/RNG";
|
import { WHRNG } from "../Casino/RNG";
|
||||||
|
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
|
||||||
function AddToAugmentations(aug) {
|
function AddToAugmentations(aug: Augmentation): void {
|
||||||
var name = aug.name;
|
const name = aug.name;
|
||||||
Augmentations[name] = aug;
|
Augmentations[name] = aug;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getRandomBonus() {
|
function getRandomBonus(): any {
|
||||||
var bonuses = [
|
const bonuses = [
|
||||||
{
|
{
|
||||||
bonuses: {
|
bonuses: {
|
||||||
hacking_chance_mult: 1.25,
|
hacking_chance_mult: 1.25,
|
||||||
@@ -111,8 +111,8 @@ function getRandomBonus() {
|
|||||||
return bonuses[Math.floor(bonuses.length * randomNumber.random())];
|
return bonuses[Math.floor(bonuses.length * randomNumber.random())];
|
||||||
}
|
}
|
||||||
|
|
||||||
function initAugmentations() {
|
function initAugmentations(): void {
|
||||||
for (var name in Factions) {
|
for (const name in Factions) {
|
||||||
if (Factions.hasOwnProperty(name)) {
|
if (Factions.hasOwnProperty(name)) {
|
||||||
Factions[name].augmentations = [];
|
Factions[name].augmentations = [];
|
||||||
}
|
}
|
||||||
@@ -124,7 +124,7 @@ function initAugmentations() {
|
|||||||
//Time-Based Augment Test
|
//Time-Based Augment Test
|
||||||
const randomBonuses = getRandomBonus();
|
const randomBonuses = getRandomBonus();
|
||||||
|
|
||||||
const UnstableCircadianModulatorParams = {
|
const UnstableCircadianModulatorParams: IConstructorParams = {
|
||||||
name: AugmentationNames.UnstableCircadianModulator,
|
name: AugmentationNames.UnstableCircadianModulator,
|
||||||
moneyCost: 5e9,
|
moneyCost: 5e9,
|
||||||
repCost: 3.625e5,
|
repCost: 3.625e5,
|
||||||
@@ -133,7 +133,7 @@ function initAugmentations() {
|
|||||||
"unpredictable results based on your circadian rhythm.",
|
"unpredictable results based on your circadian rhythm.",
|
||||||
};
|
};
|
||||||
Object.keys(randomBonuses.bonuses).forEach(
|
Object.keys(randomBonuses.bonuses).forEach(
|
||||||
(key) => (UnstableCircadianModulatorParams[key] = randomBonuses.bonuses[key]),
|
(key) => ((UnstableCircadianModulatorParams as any)[key] = randomBonuses.bonuses[key]),
|
||||||
);
|
);
|
||||||
const UnstableCircadianModulator = new Augmentation(UnstableCircadianModulatorParams);
|
const UnstableCircadianModulator = new Augmentation(UnstableCircadianModulatorParams);
|
||||||
|
|
||||||
@@ -211,7 +211,7 @@ function initAugmentations() {
|
|||||||
name: AugmentationNames.Targeting3,
|
name: AugmentationNames.Targeting3,
|
||||||
moneyCost: 1.15e8,
|
moneyCost: 1.15e8,
|
||||||
repCost: 2.75e4,
|
repCost: 2.75e4,
|
||||||
info: "The latest version of the 'Augmented Targeting' implant adds the ability to " + "lock-on and track threats.",
|
info: "The latest version of the 'Augmented Targeting' implant adds the ability to lock-on and track threats.",
|
||||||
prereqs: [AugmentationNames.Targeting2],
|
prereqs: [AugmentationNames.Targeting2],
|
||||||
dexterity_mult: 1.3,
|
dexterity_mult: 1.3,
|
||||||
});
|
});
|
||||||
@@ -735,7 +735,7 @@ function initAugmentations() {
|
|||||||
|
|
||||||
const ENMCore = new Augmentation({
|
const ENMCore = new Augmentation({
|
||||||
name: AugmentationNames.ENMCore,
|
name: AugmentationNames.ENMCore,
|
||||||
repCost: 2.5e5,
|
repCost: 175e3,
|
||||||
moneyCost: 2.5e9,
|
moneyCost: 2.5e9,
|
||||||
info:
|
info:
|
||||||
"The Core library is an implant that upgrades the firmware of the Embedded Netburner Module. " +
|
"The Core library is an implant that upgrades the firmware of the Embedded Netburner Module. " +
|
||||||
@@ -1555,7 +1555,7 @@ function initAugmentations() {
|
|||||||
repCost: 2.5e6,
|
repCost: 2.5e6,
|
||||||
moneyCost: 0,
|
moneyCost: 0,
|
||||||
info: "It's time to leave the cave.",
|
info: "It's time to leave the cave.",
|
||||||
stats: <></>,
|
stats: null,
|
||||||
});
|
});
|
||||||
RedPill.addToFactions(["Daedalus"]);
|
RedPill.addToFactions(["Daedalus"]);
|
||||||
if (augmentationExists(AugmentationNames.TheRedPill)) {
|
if (augmentationExists(AugmentationNames.TheRedPill)) {
|
||||||
@@ -1595,7 +1595,7 @@ function initAugmentations() {
|
|||||||
"exactly the implant does, but they promise that it will greatly " +
|
"exactly the implant does, but they promise that it will greatly " +
|
||||||
"enhance your abilities.",
|
"enhance your abilities.",
|
||||||
hacking_grow_mult: 3,
|
hacking_grow_mult: 3,
|
||||||
stats: <></>,
|
stats: null,
|
||||||
});
|
});
|
||||||
HiveMind.addToFactions(["ECorp"]);
|
HiveMind.addToFactions(["ECorp"]);
|
||||||
if (augmentationExists(AugmentationNames.HiveMind)) {
|
if (augmentationExists(AugmentationNames.HiveMind)) {
|
||||||
@@ -2044,6 +2044,28 @@ function initAugmentations() {
|
|||||||
}
|
}
|
||||||
AddToAugmentations(SNA);
|
AddToAugmentations(SNA);
|
||||||
|
|
||||||
|
const NeuroreceptorManager = new Augmentation({
|
||||||
|
name: AugmentationNames.NeuroreceptorManager,
|
||||||
|
repCost: 0.75e5,
|
||||||
|
moneyCost: 5.5e8,
|
||||||
|
info:
|
||||||
|
"A brain implant carefully assembled around the synapses, which " +
|
||||||
|
"micromanages the activity and levels of various neuroreceptor " +
|
||||||
|
"chemicals and modulates electrical acvitiy to optimize concentration, " +
|
||||||
|
"allowing the user to multitask much more effectively.",
|
||||||
|
stats: (
|
||||||
|
<>
|
||||||
|
This augmentation removes the penalty for not focusing on actions such as working in a job or working for a
|
||||||
|
faction.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
});
|
||||||
|
NeuroreceptorManager.addToFactions(["Tian Di Hui"]);
|
||||||
|
if (augmentationExists(AugmentationNames.NeuroreceptorManager)) {
|
||||||
|
delete Augmentations[AugmentationNames.NeuroreceptorManager];
|
||||||
|
}
|
||||||
|
AddToAugmentations(NeuroreceptorManager);
|
||||||
|
|
||||||
// Special Bladeburner Augmentations
|
// Special Bladeburner Augmentations
|
||||||
const BladeburnersFactionName = "Bladeburners";
|
const BladeburnersFactionName = "Bladeburners";
|
||||||
if (factionExists(BladeburnersFactionName)) {
|
if (factionExists(BladeburnersFactionName)) {
|
||||||
@@ -2349,7 +2371,7 @@ function initAugmentations() {
|
|||||||
CONSTANTS.MultipleAugMultiplier * [1, 0.96, 0.94, 0.93][SourceFileFlags[11]],
|
CONSTANTS.MultipleAugMultiplier * [1, 0.96, 0.94, 0.93][SourceFileFlags[11]],
|
||||||
Player.queuedAugmentations.length,
|
Player.queuedAugmentations.length,
|
||||||
);
|
);
|
||||||
for (var name in Augmentations) {
|
for (const name in Augmentations) {
|
||||||
if (Augmentations.hasOwnProperty(name)) {
|
if (Augmentations.hasOwnProperty(name)) {
|
||||||
Augmentations[name].baseCost *= mult;
|
Augmentations[name].baseCost *= mult;
|
||||||
}
|
}
|
||||||
@@ -2359,29 +2381,26 @@ function initAugmentations() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Resets an Augmentation during (re-initizliation)
|
//Resets an Augmentation during (re-initizliation)
|
||||||
function resetAugmentation(newAugObject) {
|
function resetAugmentation(newAugObject: Augmentation): void {
|
||||||
if (!(newAugObject instanceof Augmentation)) {
|
if (!(newAugObject instanceof Augmentation)) {
|
||||||
throw new Error("Invalid argument 'newAugObject' passed into resetAugmentation");
|
throw new Error("Invalid argument 'newAugObject' passed into resetAugmentation");
|
||||||
}
|
}
|
||||||
var name = newAugObject.name;
|
const name = newAugObject.name;
|
||||||
if (augmentationExists(name)) {
|
if (augmentationExists(name)) {
|
||||||
delete Augmentations[name];
|
delete Augmentations[name];
|
||||||
}
|
}
|
||||||
AddToAugmentations(newAugObject);
|
AddToAugmentations(newAugObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
function applyAugmentation(aug, reapply = false) {
|
function applyAugmentation(aug: IPlayerOwnedAugmentation, reapply = false): void {
|
||||||
Augmentations[aug.name].owned = true;
|
Augmentations[aug.name].owned = true;
|
||||||
|
|
||||||
const augObj = Augmentations[aug.name];
|
const augObj = Augmentations[aug.name];
|
||||||
|
|
||||||
// Apply multipliers
|
// Apply multipliers
|
||||||
for (const mult in augObj.mults) {
|
for (const mult in augObj.mults) {
|
||||||
if (Player[mult] == null) {
|
const v = Player.getMult(mult) * augObj.mults[mult];
|
||||||
console.warn(`Augmentation has unrecognized multiplier property: ${mult}`);
|
Player.setMult(mult, v);
|
||||||
} else {
|
|
||||||
Player[mult] *= augObj.mults[mult];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Special logic for NeuroFlux Governor
|
// Special logic for NeuroFlux Governor
|
||||||
@@ -2400,12 +2419,12 @@ function applyAugmentation(aug, reapply = false) {
|
|||||||
|
|
||||||
// Push onto Player's Augmentation list
|
// Push onto Player's Augmentation list
|
||||||
if (!reapply) {
|
if (!reapply) {
|
||||||
var ownedAug = new PlayerOwnedAugmentation(aug.name);
|
const ownedAug = new PlayerOwnedAugmentation(aug.name);
|
||||||
Player.augmentations.push(ownedAug);
|
Player.augmentations.push(ownedAug);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function installAugmentations() {
|
function installAugmentations(): boolean {
|
||||||
if (Player.queuedAugmentations.length == 0) {
|
if (Player.queuedAugmentations.length == 0) {
|
||||||
dialogBoxCreate("You have not purchased any Augmentations to install!");
|
dialogBoxCreate("You have not purchased any Augmentations to install!");
|
||||||
return false;
|
return false;
|
||||||
@@ -2443,13 +2462,14 @@ function installAugmentations() {
|
|||||||
"<br>You wake up in your home...you feel different...",
|
"<br>You wake up in your home...you feel different...",
|
||||||
);
|
);
|
||||||
prestigeAugmentation();
|
prestigeAugmentation();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function augmentationExists(name) {
|
function augmentationExists(name: string): boolean {
|
||||||
return Augmentations.hasOwnProperty(name);
|
return Augmentations.hasOwnProperty(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isRepeatableAug(aug) {
|
export function isRepeatableAug(aug: Augmentation): boolean {
|
||||||
const augName = aug instanceof Augmentation ? aug.name : aug;
|
const augName = aug instanceof Augmentation ? aug.name : aug;
|
||||||
|
|
||||||
if (augName === AugmentationNames.NeuroFluxGovernor) {
|
if (augName === AugmentationNames.NeuroFluxGovernor) {
|
||||||
@@ -1,6 +1,114 @@
|
|||||||
import { IMap } from "../../types";
|
export const AugmentationNames: {
|
||||||
|
Targeting1: string;
|
||||||
export const AugmentationNames: IMap<string> = {
|
Targeting2: string;
|
||||||
|
Targeting3: string;
|
||||||
|
SyntheticHeart: string;
|
||||||
|
SynfibrilMuscle: string;
|
||||||
|
CombatRib1: string;
|
||||||
|
CombatRib2: string;
|
||||||
|
CombatRib3: string;
|
||||||
|
NanofiberWeave: string;
|
||||||
|
SubdermalArmor: string;
|
||||||
|
WiredReflexes: string;
|
||||||
|
GrapheneBoneLacings: string;
|
||||||
|
BionicSpine: string;
|
||||||
|
GrapheneBionicSpine: string;
|
||||||
|
BionicLegs: string;
|
||||||
|
GrapheneBionicLegs: string;
|
||||||
|
SpeechProcessor: string;
|
||||||
|
TITN41Injection: string;
|
||||||
|
EnhancedSocialInteractionImplant: string;
|
||||||
|
BitWire: string;
|
||||||
|
ArtificialBioNeuralNetwork: string;
|
||||||
|
ArtificialSynapticPotentiation: string;
|
||||||
|
EnhancedMyelinSheathing: string;
|
||||||
|
SynapticEnhancement: string;
|
||||||
|
NeuralRetentionEnhancement: string;
|
||||||
|
DataJack: string;
|
||||||
|
ENM: string;
|
||||||
|
ENMCore: string;
|
||||||
|
ENMCoreV2: string;
|
||||||
|
ENMCoreV3: string;
|
||||||
|
ENMAnalyzeEngine: string;
|
||||||
|
ENMDMA: string;
|
||||||
|
Neuralstimulator: string;
|
||||||
|
NeuralAccelerator: string;
|
||||||
|
CranialSignalProcessorsG1: string;
|
||||||
|
CranialSignalProcessorsG2: string;
|
||||||
|
CranialSignalProcessorsG3: string;
|
||||||
|
CranialSignalProcessorsG4: string;
|
||||||
|
CranialSignalProcessorsG5: string;
|
||||||
|
NeuronalDensification: string;
|
||||||
|
NeuroreceptorManager: string;
|
||||||
|
NuoptimalInjectorImplant: string;
|
||||||
|
SpeechEnhancement: string;
|
||||||
|
FocusWire: string;
|
||||||
|
PCDNI: string;
|
||||||
|
PCDNIOptimizer: string;
|
||||||
|
PCDNINeuralNetwork: string;
|
||||||
|
PCMatrix: string;
|
||||||
|
ADRPheromone1: string;
|
||||||
|
ADRPheromone2: string;
|
||||||
|
ShadowsSimulacrum: string;
|
||||||
|
HacknetNodeCPUUpload: string;
|
||||||
|
HacknetNodeCacheUpload: string;
|
||||||
|
HacknetNodeNICUpload: string;
|
||||||
|
HacknetNodeKernelDNI: string;
|
||||||
|
HacknetNodeCoreDNI: string;
|
||||||
|
NeuroFluxGovernor: string;
|
||||||
|
Neurotrainer1: string;
|
||||||
|
Neurotrainer2: string;
|
||||||
|
Neurotrainer3: string;
|
||||||
|
Hypersight: string;
|
||||||
|
LuminCloaking1: string;
|
||||||
|
LuminCloaking2: string;
|
||||||
|
HemoRecirculator: string;
|
||||||
|
SmartSonar: string;
|
||||||
|
PowerRecirculator: string;
|
||||||
|
QLink: string;
|
||||||
|
TheRedPill: string;
|
||||||
|
SPTN97: string;
|
||||||
|
HiveMind: string;
|
||||||
|
CordiARCReactor: string;
|
||||||
|
SmartJaw: string;
|
||||||
|
Neotra: string;
|
||||||
|
Xanipher: string;
|
||||||
|
nextSENS: string;
|
||||||
|
OmniTekInfoLoad: string;
|
||||||
|
PhotosyntheticCells: string;
|
||||||
|
Neurolink: string;
|
||||||
|
TheBlackHand: string;
|
||||||
|
UnstableCircadianModulator: string;
|
||||||
|
CRTX42AA: string;
|
||||||
|
Neuregen: string;
|
||||||
|
CashRoot: string;
|
||||||
|
NutriGen: string;
|
||||||
|
INFRARet: string;
|
||||||
|
DermaForce: string;
|
||||||
|
GrapheneBrachiBlades: string;
|
||||||
|
GrapheneBionicArms: string;
|
||||||
|
BrachiBlades: string;
|
||||||
|
BionicArms: string;
|
||||||
|
SNA: string;
|
||||||
|
HydroflameLeftArm: string;
|
||||||
|
EsperEyewear: string;
|
||||||
|
EMS4Recombination: string;
|
||||||
|
OrionShoulder: string;
|
||||||
|
HyperionV1: string;
|
||||||
|
HyperionV2: string;
|
||||||
|
GolemSerum: string;
|
||||||
|
VangelisVirus: string;
|
||||||
|
VangelisVirus3: string;
|
||||||
|
INTERLINKED: string;
|
||||||
|
BladeRunner: string;
|
||||||
|
BladeArmor: string;
|
||||||
|
BladeArmorPowerCells: string;
|
||||||
|
BladeArmorEnergyShielding: string;
|
||||||
|
BladeArmorUnibeam: string;
|
||||||
|
BladeArmorOmnibeam: string;
|
||||||
|
BladeArmorIPU: string;
|
||||||
|
BladesSimulacrum: string;
|
||||||
|
} = {
|
||||||
Targeting1: "Augmented Targeting I",
|
Targeting1: "Augmented Targeting I",
|
||||||
Targeting2: "Augmented Targeting II",
|
Targeting2: "Augmented Targeting II",
|
||||||
Targeting3: "Augmented Targeting III",
|
Targeting3: "Augmented Targeting III",
|
||||||
@@ -41,6 +149,7 @@ export const AugmentationNames: IMap<string> = {
|
|||||||
CranialSignalProcessorsG4: "Cranial Signal Processors - Gen IV",
|
CranialSignalProcessorsG4: "Cranial Signal Processors - Gen IV",
|
||||||
CranialSignalProcessorsG5: "Cranial Signal Processors - Gen V",
|
CranialSignalProcessorsG5: "Cranial Signal Processors - Gen V",
|
||||||
NeuronalDensification: "Neuronal Densification",
|
NeuronalDensification: "Neuronal Densification",
|
||||||
|
NeuroreceptorManager: "Neuroreceptor Management Implant",
|
||||||
NuoptimalInjectorImplant: "Nuoptimal Nootropic Injector Implant",
|
NuoptimalInjectorImplant: "Nuoptimal Nootropic Injector Implant",
|
||||||
SpeechEnhancement: "Speech Enhancement",
|
SpeechEnhancement: "Speech Enhancement",
|
||||||
FocusWire: "FocusWire",
|
FocusWire: "FocusWire",
|
||||||
@@ -86,7 +195,7 @@ export const AugmentationNames: IMap<string> = {
|
|||||||
NutriGen: "NutriGen Implant",
|
NutriGen: "NutriGen Implant",
|
||||||
INFRARet: "INFRARET Enhancement",
|
INFRARet: "INFRARET Enhancement",
|
||||||
DermaForce: "DermaForce Particle Barrier",
|
DermaForce: "DermaForce Particle Barrier",
|
||||||
GrapheneBrachiBlades: "Graphene BranchiBlades Upgrade",
|
GrapheneBrachiBlades: "Graphene BrachiBlades Upgrade",
|
||||||
GrapheneBionicArms: "Graphene Bionic Arms Upgrade",
|
GrapheneBionicArms: "Graphene Bionic Arms Upgrade",
|
||||||
BrachiBlades: "BrachiBlades",
|
BrachiBlades: "BrachiBlades",
|
||||||
BionicArms: "Bionic Arms",
|
BionicArms: "Bionic Arms",
|
||||||
|
|||||||
@@ -2,92 +2,98 @@
|
|||||||
* Root React component for the Augmentations UI page that display all of your
|
* Root React component for the Augmentations UI page that display all of your
|
||||||
* owned and purchased Augmentations and Source-Files.
|
* owned and purchased Augmentations and Source-Files.
|
||||||
*/
|
*/
|
||||||
import * as React from "react";
|
import React, { useState, useEffect } from "react";
|
||||||
|
|
||||||
import { InstalledAugmentationsAndSourceFiles } from "./InstalledAugmentationsAndSourceFiles";
|
import { InstalledAugmentations } from "./InstalledAugmentations";
|
||||||
import { PlayerMultipliers } from "./PlayerMultipliers";
|
import { PlayerMultipliers } from "./PlayerMultipliers";
|
||||||
import { PurchasedAugmentations } from "./PurchasedAugmentations";
|
import { PurchasedAugmentations } from "./PurchasedAugmentations";
|
||||||
|
import { SourceFiles } from "./SourceFiles";
|
||||||
|
|
||||||
import { Player } from "../../Player";
|
|
||||||
import { StdButton } from "../../ui/React/StdButton";
|
|
||||||
import { canGetBonus } from "../../ExportBonus";
|
import { canGetBonus } from "../../ExportBonus";
|
||||||
|
import { use } from "../../ui/Context";
|
||||||
|
|
||||||
type IProps = {
|
import Typography from "@mui/material/Typography";
|
||||||
|
import Button from "@mui/material/Button";
|
||||||
|
import Tooltip from "@mui/material/Tooltip";
|
||||||
|
import Box from "@mui/material/Box";
|
||||||
|
|
||||||
|
interface IProps {
|
||||||
exportGameFn: () => void;
|
exportGameFn: () => void;
|
||||||
installAugmentationsFn: () => void;
|
installAugmentationsFn: () => void;
|
||||||
};
|
}
|
||||||
|
|
||||||
type IState = {
|
export function AugmentationsRoot(props: IProps): React.ReactElement {
|
||||||
rerender: boolean;
|
const player = use.Player();
|
||||||
};
|
const setRerender = useState(false)[1];
|
||||||
|
function rerender(): void {
|
||||||
export class AugmentationsRoot extends React.Component<IProps, IState> {
|
setRerender((o) => !o);
|
||||||
constructor(props: IProps) {
|
}
|
||||||
super(props);
|
useEffect(() => {
|
||||||
this.state = {
|
const id = setInterval(rerender, 200);
|
||||||
rerender: false,
|
return () => clearInterval(id);
|
||||||
};
|
}, []);
|
||||||
this.export = this.export.bind(this);
|
|
||||||
}
|
function doExport(): void {
|
||||||
|
props.exportGameFn();
|
||||||
export(): void {
|
rerender();
|
||||||
this.props.exportGameFn();
|
}
|
||||||
this.setState({
|
|
||||||
rerender: !this.state.rerender,
|
function exportBonusStr(): string {
|
||||||
});
|
if (canGetBonus()) return "(+1 favor to all factions)";
|
||||||
}
|
return "";
|
||||||
|
}
|
||||||
render(): React.ReactNode {
|
|
||||||
function exportBonusStr(): string {
|
return (
|
||||||
if (canGetBonus()) return "(+1 favor to all factions)";
|
<>
|
||||||
return "";
|
<Typography variant="h4">Augmentations</Typography>
|
||||||
}
|
<Box mx={2}>
|
||||||
|
<Typography>
|
||||||
return (
|
Below is a list of all Augmentations you have purchased but not yet installed. Click the button below to
|
||||||
<>
|
install them.
|
||||||
<div className="augmentations-content">
|
</Typography>
|
||||||
<h1>Purchased Augmentations</h1>
|
<Typography>WARNING: Installing your Augmentations resets most of your progress, including:</Typography>
|
||||||
<p>
|
<br />
|
||||||
Below is a list of all Augmentations you have purchased but not yet installed. Click the button below to
|
<Typography>- Stats/Skill levels and Experience</Typography>
|
||||||
install them.
|
<Typography>- Money</Typography>
|
||||||
</p>
|
<Typography>- Scripts on every computer but your home computer</Typography>
|
||||||
<p>WARNING: Installing your Augmentations resets most of your progress, including:</p>
|
<Typography>- Purchased servers</Typography>
|
||||||
<br />
|
<Typography>- Hacknet Nodes</Typography>
|
||||||
<p>- Stats/Skill levels and Experience</p>
|
<Typography>- Faction/Company reputation</Typography>
|
||||||
<p>- Money</p>
|
<Typography>- Stocks</Typography>
|
||||||
<p>- Scripts on every computer but your home computer</p>
|
<br />
|
||||||
<p>- Purchased servers</p>
|
<Typography>
|
||||||
<p>- Hacknet Nodes</p>
|
Installing Augmentations lets you start over with the perks and benefits granted by all of the Augmentations
|
||||||
<p>- Faction/Company reputation</p>
|
you have ever installed. Also, you will keep any scripts and RAM/Core upgrades on your home computer (but you
|
||||||
<p>- Stocks</p>
|
will lose all programs besides NUKE.exe)
|
||||||
<br />
|
</Typography>
|
||||||
<p>
|
</Box>
|
||||||
Installing Augmentations lets you start over with the perks and benefits granted by all of the Augmentations
|
<Typography variant="h4" color="primary">
|
||||||
you have ever installed. Also, you will keep any scripts and RAM/Core upgrades on your home computer (but
|
Purchased Augmentations
|
||||||
you will lose all programs besides NUKE.exe)
|
</Typography>
|
||||||
</p>
|
<Box mx={2}>
|
||||||
<StdButton
|
<Tooltip title={<Typography>'I never asked for this'</Typography>}>
|
||||||
onClick={this.props.installAugmentationsFn}
|
<span>
|
||||||
text="Install Augmentations"
|
<Button disabled={player.queuedAugmentations.length === 0} onClick={props.installAugmentationsFn}>
|
||||||
tooltip="'I never asked for this'"
|
Install Augmentations
|
||||||
/>
|
</Button>
|
||||||
<StdButton
|
</span>
|
||||||
addClasses="flashing-button"
|
</Tooltip>
|
||||||
onClick={this.export}
|
<Tooltip title={<Typography>It's always a good idea to backup/export your save!</Typography>}>
|
||||||
text={`Backup Save ${exportBonusStr()}`}
|
<Button sx={{ mx: 2 }} onClick={doExport} color="error">
|
||||||
tooltip="It's always a good idea to backup/export your save!"
|
Backup Save {exportBonusStr()}
|
||||||
/>
|
</Button>
|
||||||
<PurchasedAugmentations />
|
</Tooltip>
|
||||||
<h1>Installed Augmentations</h1>
|
<PurchasedAugmentations />
|
||||||
<p>
|
</Box>
|
||||||
{`List of all Augmentations ${Player.sourceFiles.length > 0 ? "and Source Files " : ""} ` +
|
<Typography variant="h4">Installed Augmentations</Typography>
|
||||||
`that have been installed. You have gained the effects of these.`}
|
<Box mx={2}>
|
||||||
</p>
|
<Typography>
|
||||||
<InstalledAugmentationsAndSourceFiles />
|
List of all Augmentations that have been installed. You have gained the effects of these.
|
||||||
<br /> <br />
|
</Typography>
|
||||||
<PlayerMultipliers />
|
<InstalledAugmentations />
|
||||||
</div>
|
</Box>
|
||||||
</>
|
<PlayerMultipliers />
|
||||||
);
|
<SourceFiles />
|
||||||
}
|
</>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,28 @@
|
|||||||
/**
|
/**
|
||||||
* React Component for displaying a list of the player's installed Augmentations
|
* React Component for displaying all of the player's installed Augmentations and
|
||||||
* on the Augmentations UI
|
* Source-Files.
|
||||||
|
*
|
||||||
|
* It also contains 'configuration' buttons that allow you to change how the
|
||||||
|
* Augs/SF's are displayed
|
||||||
*/
|
*/
|
||||||
import * as React from "react";
|
import React, { useState } from "react";
|
||||||
|
|
||||||
import { Player } from "../../Player";
|
|
||||||
import { Augmentations } from "../../Augmentation/Augmentations";
|
|
||||||
import { AugmentationNames } from "../../Augmentation/data/AugmentationNames";
|
|
||||||
import { Settings } from "../../Settings/Settings";
|
|
||||||
import { OwnedAugmentationsOrderSetting } from "../../Settings/SettingEnums";
|
|
||||||
|
|
||||||
import { AugmentationAccordion } from "../../ui/React/AugmentationAccordion";
|
import { AugmentationAccordion } from "../../ui/React/AugmentationAccordion";
|
||||||
|
import { Augmentations } from "../../Augmentation/Augmentations";
|
||||||
|
import { AugmentationNames } from "../../Augmentation/data/AugmentationNames";
|
||||||
|
|
||||||
|
import { Settings } from "../../Settings/Settings";
|
||||||
|
import { use } from "../../ui/Context";
|
||||||
|
import { OwnedAugmentationsOrderSetting } from "../../Settings/SettingEnums";
|
||||||
|
import Button from "@mui/material/Button";
|
||||||
|
import Tooltip from "@mui/material/Tooltip";
|
||||||
|
import List from "@mui/material/List";
|
||||||
|
|
||||||
export function InstalledAugmentations(): React.ReactElement {
|
export function InstalledAugmentations(): React.ReactElement {
|
||||||
const sourceAugs = Player.augmentations.slice();
|
const setRerender = useState(true)[1];
|
||||||
|
const player = use.Player();
|
||||||
|
|
||||||
|
const sourceAugs = player.augmentations.slice();
|
||||||
|
|
||||||
if (Settings.OwnedAugmentationsOrder === OwnedAugmentationsOrderSetting.Alphabetically) {
|
if (Settings.OwnedAugmentationsOrder === OwnedAugmentationsOrderSetting.Alphabetically) {
|
||||||
sourceAugs.sort((aug1, aug2) => {
|
sourceAugs.sort((aug1, aug2) => {
|
||||||
@@ -21,20 +30,42 @@ export function InstalledAugmentations(): React.ReactElement {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const augs = sourceAugs.map((e) => {
|
function rerender(): void {
|
||||||
const aug = Augmentations[e.name];
|
setRerender((old) => !old);
|
||||||
|
}
|
||||||
|
|
||||||
let level = null;
|
function sortByAcquirementTime(): void {
|
||||||
if (e.name === AugmentationNames.NeuroFluxGovernor) {
|
Settings.OwnedAugmentationsOrder = OwnedAugmentationsOrderSetting.AcquirementTime;
|
||||||
level = e.level;
|
rerender();
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
function sortInOrder(): void {
|
||||||
<li key={e.name}>
|
Settings.OwnedAugmentationsOrder = OwnedAugmentationsOrderSetting.Alphabetically;
|
||||||
<AugmentationAccordion aug={aug} level={level} />
|
rerender();
|
||||||
</li>
|
}
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
return <>{augs}</>;
|
return (
|
||||||
|
<>
|
||||||
|
<Tooltip title={"Sorts the Augmentations alphabetically in numeral order"}>
|
||||||
|
<Button onClick={sortInOrder}>Sort in Order</Button>
|
||||||
|
</Tooltip>
|
||||||
|
<Tooltip title={"Sorts the Augmentations based on when you acquired them (same as default)"}>
|
||||||
|
<Button sx={{ mx: 2 }} onClick={sortByAcquirementTime}>
|
||||||
|
Sort by Acquirement Time
|
||||||
|
</Button>
|
||||||
|
</Tooltip>
|
||||||
|
<List dense>
|
||||||
|
{sourceAugs.map((e) => {
|
||||||
|
const aug = Augmentations[e.name];
|
||||||
|
|
||||||
|
let level = null;
|
||||||
|
if (e.name === AugmentationNames.NeuroFluxGovernor) {
|
||||||
|
level = e.level;
|
||||||
|
}
|
||||||
|
|
||||||
|
return <AugmentationAccordion key={aug.name} aug={aug} level={level} />;
|
||||||
|
})}
|
||||||
|
</List>
|
||||||
|
</>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,115 +0,0 @@
|
|||||||
/**
|
|
||||||
* React Component for displaying all of the player's installed Augmentations and
|
|
||||||
* Source-Files.
|
|
||||||
*
|
|
||||||
* It also contains 'configuration' buttons that allow you to change how the
|
|
||||||
* Augs/SF's are displayed
|
|
||||||
*/
|
|
||||||
import * as React from "react";
|
|
||||||
|
|
||||||
import { InstalledAugmentations } from "./InstalledAugmentations";
|
|
||||||
import { ListConfiguration } from "./ListConfiguration";
|
|
||||||
import { OwnedSourceFiles } from "./OwnedSourceFiles";
|
|
||||||
import { SourceFileMinus1 } from "./SourceFileMinus1";
|
|
||||||
|
|
||||||
import { Settings } from "../../Settings/Settings";
|
|
||||||
import { OwnedAugmentationsOrderSetting } from "../../Settings/SettingEnums";
|
|
||||||
|
|
||||||
type IProps = {
|
|
||||||
// nothing special.
|
|
||||||
};
|
|
||||||
|
|
||||||
type IState = {
|
|
||||||
rerenderFlag: boolean;
|
|
||||||
};
|
|
||||||
|
|
||||||
export class InstalledAugmentationsAndSourceFiles extends React.Component<IProps, IState> {
|
|
||||||
listRef: React.RefObject<HTMLUListElement>;
|
|
||||||
|
|
||||||
constructor(props: IProps) {
|
|
||||||
super(props);
|
|
||||||
|
|
||||||
this.state = {
|
|
||||||
rerenderFlag: false,
|
|
||||||
};
|
|
||||||
|
|
||||||
this.collapseAllHeaders = this.collapseAllHeaders.bind(this);
|
|
||||||
this.expandAllHeaders = this.expandAllHeaders.bind(this);
|
|
||||||
this.sortByAcquirementTime = this.sortByAcquirementTime.bind(this);
|
|
||||||
this.sortInOrder = this.sortInOrder.bind(this);
|
|
||||||
|
|
||||||
this.listRef = React.createRef();
|
|
||||||
}
|
|
||||||
|
|
||||||
collapseAllHeaders(): void {
|
|
||||||
const ul = this.listRef.current;
|
|
||||||
if (ul == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const tickers = ul.getElementsByClassName("accordion-header");
|
|
||||||
for (let i = 0; i < tickers.length; ++i) {
|
|
||||||
const ticker = tickers[i];
|
|
||||||
if (!(ticker instanceof HTMLButtonElement)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ticker.classList.contains("active")) {
|
|
||||||
ticker.click();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
expandAllHeaders(): void {
|
|
||||||
const ul = this.listRef.current;
|
|
||||||
if (ul == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const tickers = ul.getElementsByClassName("accordion-header");
|
|
||||||
for (let i = 0; i < tickers.length; ++i) {
|
|
||||||
const ticker = tickers[i];
|
|
||||||
if (!(ticker instanceof HTMLButtonElement)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ticker.classList.contains("active")) {
|
|
||||||
ticker.click();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rerender(): void {
|
|
||||||
this.setState((prevState) => {
|
|
||||||
return {
|
|
||||||
rerenderFlag: !prevState.rerenderFlag,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
sortByAcquirementTime(): void {
|
|
||||||
Settings.OwnedAugmentationsOrder = OwnedAugmentationsOrderSetting.AcquirementTime;
|
|
||||||
this.rerender();
|
|
||||||
}
|
|
||||||
|
|
||||||
sortInOrder(): void {
|
|
||||||
Settings.OwnedAugmentationsOrder = OwnedAugmentationsOrderSetting.Alphabetically;
|
|
||||||
this.rerender();
|
|
||||||
}
|
|
||||||
|
|
||||||
render(): React.ReactNode {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<ListConfiguration
|
|
||||||
collapseAllButtonsFn={this.collapseAllHeaders}
|
|
||||||
expandAllButtonsFn={this.expandAllHeaders}
|
|
||||||
sortByAcquirementTimeFn={this.sortByAcquirementTime}
|
|
||||||
sortInOrderFn={this.sortInOrder}
|
|
||||||
/>
|
|
||||||
<ul className="augmentations-list" ref={this.listRef}>
|
|
||||||
<SourceFileMinus1 />
|
|
||||||
<OwnedSourceFiles />
|
|
||||||
<InstalledAugmentations />
|
|
||||||
</ul>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
/**
|
|
||||||
* React Component for configuring the way installed augmentations and
|
|
||||||
* Source-Files are displayed in the Augmentations UI
|
|
||||||
*/
|
|
||||||
import * as React from "react";
|
|
||||||
|
|
||||||
import { StdButton } from "../../ui/React/StdButton";
|
|
||||||
|
|
||||||
type IProps = {
|
|
||||||
collapseAllButtonsFn: () => void;
|
|
||||||
expandAllButtonsFn: () => void;
|
|
||||||
sortByAcquirementTimeFn: () => void;
|
|
||||||
sortInOrderFn: () => void;
|
|
||||||
};
|
|
||||||
|
|
||||||
export function ListConfiguration(props: IProps): React.ReactElement {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<StdButton onClick={props.expandAllButtonsFn} text="Expand All" />
|
|
||||||
<StdButton onClick={props.collapseAllButtonsFn} text="Collapse All" />
|
|
||||||
<StdButton
|
|
||||||
onClick={props.sortInOrderFn}
|
|
||||||
text="Sort in Order"
|
|
||||||
tooltip="Sorts the Augmentations alphabetically and Source-Files in numeral order"
|
|
||||||
/>
|
|
||||||
<StdButton
|
|
||||||
onClick={props.sortByAcquirementTimeFn}
|
|
||||||
text="Sort by Acquirement Time"
|
|
||||||
tooltip="Sorts the Augmentations and Source-Files based on when you acquired them (same as default)"
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -20,20 +20,18 @@ export function OwnedSourceFiles(): React.ReactElement {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const sfs = sourceSfs.map((e) => {
|
return (
|
||||||
const srcFileKey = "SourceFile" + e.n;
|
<>
|
||||||
const sfObj = SourceFiles[srcFileKey];
|
{sourceSfs.map((e) => {
|
||||||
if (sfObj == null) {
|
const srcFileKey = "SourceFile" + e.n;
|
||||||
console.error(`Invalid source file number: ${e.n}`);
|
const sfObj = SourceFiles[srcFileKey];
|
||||||
return null;
|
if (sfObj == null) {
|
||||||
}
|
console.error(`Invalid source file number: ${e.n}`);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return <SourceFileAccordion key={e.n} level={e.lvl} sf={sfObj} />;
|
||||||
<li key={e.n}>
|
})}
|
||||||
<SourceFileAccordion level={e.lvl} sf={sfObj} />
|
</>
|
||||||
</li>
|
);
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
return <>{sfs}</>;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,11 @@ import * as React from "react";
|
|||||||
import { Player } from "../../Player";
|
import { Player } from "../../Player";
|
||||||
import { numeralWrapper } from "../../ui/numeralFormat";
|
import { numeralWrapper } from "../../ui/numeralFormat";
|
||||||
import { Augmentations } from "../Augmentations";
|
import { Augmentations } from "../Augmentations";
|
||||||
|
import { Table, TableCell } from "../../ui/React/Table";
|
||||||
|
import TableBody from "@mui/material/TableBody";
|
||||||
|
import TableRow from "@mui/material/TableRow";
|
||||||
|
import Typography from "@mui/material/Typography";
|
||||||
|
import Box from "@mui/material/Box";
|
||||||
|
|
||||||
function calculateAugmentedStats(): any {
|
function calculateAugmentedStats(): any {
|
||||||
const augP: any = {};
|
const augP: any = {};
|
||||||
@@ -19,62 +24,73 @@ function calculateAugmentedStats(): any {
|
|||||||
return augP;
|
return augP;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function PlayerMultipliers(): React.ReactElement {
|
function Improvements({ r }: { r: number }): React.ReactElement {
|
||||||
const mults = calculateAugmentedStats();
|
if (r) {
|
||||||
function MultiplierTable(rows: any[]): React.ReactElement {
|
|
||||||
function improvements(r: number): JSX.Element[] {
|
|
||||||
let elems: JSX.Element[] = [];
|
|
||||||
if (r) {
|
|
||||||
elems = [<td key="2"> {"=>"} </td>, <td key="3">{numeralWrapper.formatPercentage(r)}</td>];
|
|
||||||
}
|
|
||||||
return elems;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<table>
|
<>
|
||||||
<tbody>
|
<TableCell key="2">
|
||||||
{rows.map((r: any) => (
|
<Typography> {"=>"} </Typography>
|
||||||
<tr key={r[0]}>
|
</TableCell>
|
||||||
<td key="0">
|
<TableCell key="3">
|
||||||
<span>{r[0]} multiplier: </span>
|
<Typography>{numeralWrapper.formatPercentage(r)}</Typography>
|
||||||
</td>
|
</TableCell>
|
||||||
<td key="1" style={{ textAlign: "right" }}>
|
</>
|
||||||
{numeralWrapper.formatPercentage(r[1])}
|
|
||||||
</td>
|
|
||||||
{improvements(r[2])}
|
|
||||||
</tr>
|
|
||||||
))}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
return <></>;
|
||||||
|
}
|
||||||
|
|
||||||
|
function MultiplierTable({ rows }: { rows: [string, number, number][] }): React.ReactElement {
|
||||||
|
return (
|
||||||
|
<Table size="small" padding="none">
|
||||||
|
<TableBody>
|
||||||
|
{rows.map((r: any) => (
|
||||||
|
<TableRow key={r[0]}>
|
||||||
|
<TableCell key="0">
|
||||||
|
<Typography noWrap>{r[0]} multiplier: </Typography>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell key="1" style={{ textAlign: "right" }}>
|
||||||
|
<Typography noWrap>{numeralWrapper.formatPercentage(r[1])}</Typography>
|
||||||
|
</TableCell>
|
||||||
|
<Improvements r={r[2]} />
|
||||||
|
</TableRow>
|
||||||
|
))}
|
||||||
|
</TableBody>
|
||||||
|
</Table>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function PlayerMultipliers(): React.ReactElement {
|
||||||
|
const mults = calculateAugmentedStats();
|
||||||
|
|
||||||
function BladeburnerMults(): React.ReactElement {
|
function BladeburnerMults(): React.ReactElement {
|
||||||
if (!Player.canAccessBladeburner()) return <></>;
|
if (!Player.canAccessBladeburner()) return <></>;
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{MultiplierTable([
|
<MultiplierTable
|
||||||
[
|
rows={[
|
||||||
"Bladeburner Success Chance",
|
[
|
||||||
Player.bladeburner_success_chance_mult,
|
"Bladeburner Success Chance",
|
||||||
Player.bladeburner_success_chance_mult * mults.bladeburner_success_chance_mult,
|
Player.bladeburner_success_chance_mult,
|
||||||
],
|
Player.bladeburner_success_chance_mult * mults.bladeburner_success_chance_mult,
|
||||||
[
|
],
|
||||||
"Bladeburner Max Stamina",
|
[
|
||||||
Player.bladeburner_max_stamina_mult,
|
"Bladeburner Max Stamina",
|
||||||
Player.bladeburner_max_stamina_mult * mults.bladeburner_max_stamina_mult,
|
Player.bladeburner_max_stamina_mult,
|
||||||
],
|
Player.bladeburner_max_stamina_mult * mults.bladeburner_max_stamina_mult,
|
||||||
[
|
],
|
||||||
"Bladeburner Stamina Gain",
|
[
|
||||||
Player.bladeburner_stamina_gain_mult,
|
"Bladeburner Stamina Gain",
|
||||||
Player.bladeburner_stamina_gain_mult * mults.bladeburner_stamina_gain_mult,
|
Player.bladeburner_stamina_gain_mult,
|
||||||
],
|
Player.bladeburner_stamina_gain_mult * mults.bladeburner_stamina_gain_mult,
|
||||||
[
|
],
|
||||||
"Bladeburner Field Analysis",
|
[
|
||||||
Player.bladeburner_analysis_mult,
|
"Bladeburner Field Analysis",
|
||||||
Player.bladeburner_analysis_mult * mults.bladeburner_analysis_mult,
|
Player.bladeburner_analysis_mult,
|
||||||
],
|
Player.bladeburner_analysis_mult * mults.bladeburner_analysis_mult,
|
||||||
])}
|
],
|
||||||
|
]}
|
||||||
|
/>
|
||||||
<br />
|
<br />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
@@ -82,99 +98,116 @@ export function PlayerMultipliers(): React.ReactElement {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<p>
|
<Typography variant="h4">Multipliers</Typography>
|
||||||
<strong>
|
<Box mx={2}>
|
||||||
<u>Multipliers:</u>
|
<MultiplierTable
|
||||||
</strong>
|
rows={[
|
||||||
</p>
|
["Hacking Chance ", Player.hacking_chance_mult, Player.hacking_chance_mult * mults.hacking_chance_mult],
|
||||||
<br />
|
["Hacking Speed ", Player.hacking_speed_mult, Player.hacking_speed_mult * mults.hacking_speed_mult],
|
||||||
{MultiplierTable([
|
["Hacking Money ", Player.hacking_money_mult, Player.hacking_money_mult * mults.hacking_money_mult],
|
||||||
["Hacking Chance ", Player.hacking_chance_mult, Player.hacking_chance_mult * mults.hacking_chance_mult],
|
["Hacking Growth ", Player.hacking_grow_mult, Player.hacking_grow_mult * mults.hacking_grow_mult],
|
||||||
["Hacking Speed ", Player.hacking_speed_mult, Player.hacking_speed_mult * mults.hacking_speed_mult],
|
]}
|
||||||
["Hacking Money ", Player.hacking_money_mult, Player.hacking_money_mult * mults.hacking_money_mult],
|
/>
|
||||||
["Hacking Growth ", Player.hacking_grow_mult, Player.hacking_grow_mult * mults.hacking_grow_mult],
|
<br />
|
||||||
])}
|
|
||||||
<br />
|
|
||||||
|
|
||||||
{MultiplierTable([
|
<MultiplierTable
|
||||||
["Hacking Level ", Player.hacking_mult, Player.hacking_mult * mults.hacking_mult],
|
rows={[
|
||||||
["Hacking Experience ", Player.hacking_exp_mult, Player.hacking_exp_mult * mults.hacking_exp_mult],
|
["Hacking Level ", Player.hacking_mult, Player.hacking_mult * mults.hacking_mult],
|
||||||
])}
|
["Hacking Experience ", Player.hacking_exp_mult, Player.hacking_exp_mult * mults.hacking_exp_mult],
|
||||||
<br />
|
]}
|
||||||
|
/>
|
||||||
|
<br />
|
||||||
|
|
||||||
{MultiplierTable([
|
<MultiplierTable
|
||||||
["Strength Level ", Player.strength_mult, Player.strength_mult * mults.strength_mult],
|
rows={[
|
||||||
["Strength Experience ", Player.strength_exp_mult, Player.strength_exp_mult * mults.strength_exp_mult],
|
["Strength Level ", Player.strength_mult, Player.strength_mult * mults.strength_mult],
|
||||||
])}
|
["Strength Experience ", Player.strength_exp_mult, Player.strength_exp_mult * mults.strength_exp_mult],
|
||||||
<br />
|
]}
|
||||||
|
/>
|
||||||
|
<br />
|
||||||
|
|
||||||
{MultiplierTable([
|
<MultiplierTable
|
||||||
["Defense Level ", Player.defense_mult, Player.defense_mult * mults.defense_mult],
|
rows={[
|
||||||
["Defense Experience ", Player.defense_exp_mult, Player.defense_exp_mult * mults.defense_exp_mult],
|
["Defense Level ", Player.defense_mult, Player.defense_mult * mults.defense_mult],
|
||||||
])}
|
["Defense Experience ", Player.defense_exp_mult, Player.defense_exp_mult * mults.defense_exp_mult],
|
||||||
<br />
|
]}
|
||||||
|
/>
|
||||||
|
<br />
|
||||||
|
|
||||||
{MultiplierTable([
|
<MultiplierTable
|
||||||
["Dexterity Level ", Player.dexterity_mult, Player.dexterity_mult * mults.dexterity_mult],
|
rows={[
|
||||||
["Dexterity Experience ", Player.dexterity_exp_mult, Player.dexterity_exp_mult * mults.dexterity_exp_mult],
|
["Dexterity Level ", Player.dexterity_mult, Player.dexterity_mult * mults.dexterity_mult],
|
||||||
])}
|
["Dexterity Experience ", Player.dexterity_exp_mult, Player.dexterity_exp_mult * mults.dexterity_exp_mult],
|
||||||
<br />
|
]}
|
||||||
|
/>
|
||||||
|
<br />
|
||||||
|
|
||||||
{MultiplierTable([
|
<MultiplierTable
|
||||||
["Agility Level ", Player.agility_mult, Player.agility_mult * mults.agility_mult],
|
rows={[
|
||||||
["Agility Experience ", Player.agility_exp_mult, Player.agility_exp_mult * mults.agility_exp_mult],
|
["Agility Level ", Player.agility_mult, Player.agility_mult * mults.agility_mult],
|
||||||
])}
|
["Agility Experience ", Player.agility_exp_mult, Player.agility_exp_mult * mults.agility_exp_mult],
|
||||||
<br />
|
]}
|
||||||
|
/>
|
||||||
|
<br />
|
||||||
|
|
||||||
{MultiplierTable([
|
<MultiplierTable
|
||||||
["Charisma Level ", Player.charisma_mult, Player.charisma_mult * mults.charisma_mult],
|
rows={[
|
||||||
["Charisma Experience ", Player.charisma_exp_mult, Player.charisma_exp_mult * mults.charisma_exp_mult],
|
["Charisma Level ", Player.charisma_mult, Player.charisma_mult * mults.charisma_mult],
|
||||||
])}
|
["Charisma Experience ", Player.charisma_exp_mult, Player.charisma_exp_mult * mults.charisma_exp_mult],
|
||||||
<br />
|
]}
|
||||||
|
/>
|
||||||
|
<br />
|
||||||
|
|
||||||
{MultiplierTable([
|
<MultiplierTable
|
||||||
[
|
rows={[
|
||||||
"Hacknet Node production ",
|
[
|
||||||
Player.hacknet_node_money_mult,
|
"Hacknet Node production ",
|
||||||
Player.hacknet_node_money_mult * mults.hacknet_node_money_mult,
|
Player.hacknet_node_money_mult,
|
||||||
],
|
Player.hacknet_node_money_mult * mults.hacknet_node_money_mult,
|
||||||
[
|
],
|
||||||
"Hacknet Node purchase cost ",
|
[
|
||||||
Player.hacknet_node_purchase_cost_mult,
|
"Hacknet Node purchase cost ",
|
||||||
Player.hacknet_node_purchase_cost_mult * mults.hacknet_node_purchase_cost_mult,
|
Player.hacknet_node_purchase_cost_mult,
|
||||||
],
|
Player.hacknet_node_purchase_cost_mult * mults.hacknet_node_purchase_cost_mult,
|
||||||
[
|
],
|
||||||
"Hacknet Node RAM upgrade cost ",
|
[
|
||||||
Player.hacknet_node_ram_cost_mult,
|
"Hacknet Node RAM upgrade cost ",
|
||||||
Player.hacknet_node_ram_cost_mult * mults.hacknet_node_ram_cost_mult,
|
Player.hacknet_node_ram_cost_mult,
|
||||||
],
|
Player.hacknet_node_ram_cost_mult * mults.hacknet_node_ram_cost_mult,
|
||||||
[
|
],
|
||||||
"Hacknet Node Core purchase cost ",
|
[
|
||||||
Player.hacknet_node_core_cost_mult,
|
"Hacknet Node Core purchase cost ",
|
||||||
Player.hacknet_node_core_cost_mult * mults.hacknet_node_core_cost_mult,
|
Player.hacknet_node_core_cost_mult,
|
||||||
],
|
Player.hacknet_node_core_cost_mult * mults.hacknet_node_core_cost_mult,
|
||||||
[
|
],
|
||||||
"Hacknet Node level upgrade cost ",
|
[
|
||||||
Player.hacknet_node_level_cost_mult,
|
"Hacknet Node level upgrade cost ",
|
||||||
Player.hacknet_node_level_cost_mult * mults.hacknet_node_level_cost_mult,
|
Player.hacknet_node_level_cost_mult,
|
||||||
],
|
Player.hacknet_node_level_cost_mult * mults.hacknet_node_level_cost_mult,
|
||||||
])}
|
],
|
||||||
<br />
|
]}
|
||||||
|
/>
|
||||||
|
<br />
|
||||||
|
|
||||||
{MultiplierTable([
|
<MultiplierTable
|
||||||
["Company reputation gain ", Player.company_rep_mult, Player.company_rep_mult * mults.company_rep_mult],
|
rows={[
|
||||||
["Faction reputation gain ", Player.faction_rep_mult, Player.faction_rep_mult * mults.faction_rep_mult],
|
["Company reputation gain ", Player.company_rep_mult, Player.company_rep_mult * mults.company_rep_mult],
|
||||||
["Salary ", Player.work_money_mult, Player.work_money_mult * mults.work_money_mult],
|
["Faction reputation gain ", Player.faction_rep_mult, Player.faction_rep_mult * mults.faction_rep_mult],
|
||||||
])}
|
["Salary ", Player.work_money_mult, Player.work_money_mult * mults.work_money_mult],
|
||||||
<br />
|
]}
|
||||||
|
/>
|
||||||
|
<br />
|
||||||
|
|
||||||
{MultiplierTable([
|
<MultiplierTable
|
||||||
["Crime success ", Player.crime_success_mult, Player.crime_success_mult * mults.crime_success_mult],
|
rows={[
|
||||||
["Crime money ", Player.crime_money_mult, Player.crime_money_mult * mults.crime_money_mult],
|
["Crime success ", Player.crime_success_mult, Player.crime_success_mult * mults.crime_success_mult],
|
||||||
])}
|
["Crime money ", Player.crime_money_mult, Player.crime_money_mult * mults.crime_money_mult],
|
||||||
<br />
|
]}
|
||||||
|
/>
|
||||||
|
<br />
|
||||||
|
|
||||||
<BladeburnerMults />
|
<BladeburnerMults />
|
||||||
|
</Box>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import { AugmentationNames } from "../../Augmentation/data/AugmentationNames";
|
|||||||
import { Player } from "../../Player";
|
import { Player } from "../../Player";
|
||||||
|
|
||||||
import { AugmentationAccordion } from "../../ui/React/AugmentationAccordion";
|
import { AugmentationAccordion } from "../../ui/React/AugmentationAccordion";
|
||||||
|
import List from "@mui/material/List";
|
||||||
|
|
||||||
export function PurchasedAugmentations(): React.ReactElement {
|
export function PurchasedAugmentations(): React.ReactElement {
|
||||||
const augs: React.ReactElement[] = [];
|
const augs: React.ReactElement[] = [];
|
||||||
@@ -29,12 +30,8 @@ export function PurchasedAugmentations(): React.ReactElement {
|
|||||||
level = ownedAug.level;
|
level = ownedAug.level;
|
||||||
}
|
}
|
||||||
|
|
||||||
augs.push(
|
augs.push(<AugmentationAccordion key={aug.name} aug={aug} level={level} />);
|
||||||
<li key={`${ownedAug.name}${ownedAug.level}`}>
|
|
||||||
<AugmentationAccordion aug={aug} level={level} />
|
|
||||||
</li>,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return <ul className="augmentations-list">{augs}</ul>;
|
return <List dense>{augs}</List>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,14 +2,22 @@
|
|||||||
* React Component for displaying a list of the player's Source-Files
|
* React Component for displaying a list of the player's Source-Files
|
||||||
* on the Augmentations UI
|
* on the Augmentations UI
|
||||||
*/
|
*/
|
||||||
import * as React from "react";
|
import React, { useState } from "react";
|
||||||
|
|
||||||
import { Player } from "../../Player";
|
import { Player } from "../../Player";
|
||||||
import { Exploit, ExploitName } from "../../Exploits/Exploit";
|
import { Exploit, ExploitName } from "../../Exploits/Exploit";
|
||||||
|
|
||||||
import { BBAccordion } from "../../ui/React/BBAccordion";
|
import ListItemButton from "@mui/material/ListItemButton";
|
||||||
|
import ListItemText from "@mui/material/ListItemText";
|
||||||
|
import Box from "@mui/material/Box";
|
||||||
|
import Typography from "@mui/material/Typography";
|
||||||
|
import Paper from "@mui/material/Paper";
|
||||||
|
import Collapse from "@mui/material/Collapse";
|
||||||
|
import ExpandMore from "@mui/icons-material/ExpandMore";
|
||||||
|
import ExpandLess from "@mui/icons-material/ExpandLess";
|
||||||
|
|
||||||
export function SourceFileMinus1(): React.ReactElement {
|
export function SourceFileMinus1(): React.ReactElement {
|
||||||
|
const [open, setOpen] = useState(false);
|
||||||
const exploits = Player.exploits;
|
const exploits = Player.exploits;
|
||||||
|
|
||||||
if (exploits.length === 0) {
|
if (exploits.length === 0) {
|
||||||
@@ -17,33 +25,35 @@ export function SourceFileMinus1(): React.ReactElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<li key={-1}>
|
<Box component={Paper}>
|
||||||
<BBAccordion
|
<ListItemButton onClick={() => setOpen((old) => !old)}>
|
||||||
headerContent={
|
<ListItemText
|
||||||
<>
|
primary={
|
||||||
Source-File -1: Exploits in the BitNodes
|
<Typography style={{ whiteSpace: "pre-wrap" }}>
|
||||||
<br />
|
Source-File -1: Exploits in the BitNodes
|
||||||
Level {exploits.length} / ?
|
<br />
|
||||||
</>
|
Level {exploits.length} / ?
|
||||||
}
|
</Typography>
|
||||||
panelContent={
|
}
|
||||||
<>
|
/>
|
||||||
<p>
|
{open ? <ExpandLess color="primary" /> : <ExpandMore color="primary" />}
|
||||||
This Source-File can only be acquired with obscure knowledge of the game, javascript, and the web
|
</ListItemButton>
|
||||||
ecosystem.
|
<Collapse in={open} unmountOnExit>
|
||||||
</p>
|
<Box m={4}>
|
||||||
<p>It increases all of the player's multipliers by 0.1%</p>
|
<Typography>
|
||||||
<br />
|
This Source-File can only be acquired with obscure knowledge of the game, javascript, and the web ecosystem.
|
||||||
|
</Typography>
|
||||||
|
<Typography>It increases all of the player's multipliers by 0.1%</Typography>
|
||||||
|
<br />
|
||||||
|
|
||||||
<p>You have found the following exploits:</p>
|
<Typography>You have found the following exploits:</Typography>
|
||||||
<ul>
|
<Box mx={2}>
|
||||||
{exploits.map((c: Exploit) => (
|
{exploits.map((c: Exploit) => (
|
||||||
<li key={c}>* {ExploitName(c)}</li>
|
<Typography key={c}>* {ExploitName(c)}</Typography>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</Box>
|
||||||
</>
|
</Box>
|
||||||
}
|
</Collapse>
|
||||||
/>
|
</Box>
|
||||||
</li>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { SourceFileMinus1 } from "./SourceFileMinus1";
|
||||||
|
import { OwnedSourceFiles } from "./OwnedSourceFiles";
|
||||||
|
import List from "@mui/material/List";
|
||||||
|
|
||||||
|
import Typography from "@mui/material/Typography";
|
||||||
|
import Box from "@mui/material/Box";
|
||||||
|
|
||||||
|
export function SourceFiles(): React.ReactElement {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Typography variant="h4">Source Files</Typography>
|
||||||
|
<Box mx={2}>
|
||||||
|
<List dense>
|
||||||
|
<SourceFileMinus1 />
|
||||||
|
<OwnedSourceFiles />
|
||||||
|
</List>
|
||||||
|
</Box>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
+47
-13
@@ -16,8 +16,11 @@ class BitNode {
|
|||||||
// BitNode number
|
// BitNode number
|
||||||
number: number;
|
number: number;
|
||||||
|
|
||||||
constructor(n: number, name: string, desc = "", info: JSX.Element = <></>) {
|
difficulty: 0 | 1 | 2;
|
||||||
|
|
||||||
|
constructor(n: number, difficulty: 0 | 1 | 2, name: string, desc = "", info: JSX.Element = <></>) {
|
||||||
this.number = n;
|
this.number = n;
|
||||||
|
this.difficulty = difficulty;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.desc = desc;
|
this.desc = desc;
|
||||||
this.info = info;
|
this.info = info;
|
||||||
@@ -28,6 +31,7 @@ export const BitNodes: IMap<BitNode> = {};
|
|||||||
|
|
||||||
BitNodes["BitNode1"] = new BitNode(
|
BitNodes["BitNode1"] = new BitNode(
|
||||||
1,
|
1,
|
||||||
|
0,
|
||||||
"Source Genesis",
|
"Source Genesis",
|
||||||
"The original BitNode",
|
"The original BitNode",
|
||||||
(
|
(
|
||||||
@@ -54,6 +58,7 @@ BitNodes["BitNode1"] = new BitNode(
|
|||||||
);
|
);
|
||||||
BitNodes["BitNode2"] = new BitNode(
|
BitNodes["BitNode2"] = new BitNode(
|
||||||
2,
|
2,
|
||||||
|
0,
|
||||||
"Rise of the Underworld",
|
"Rise of the Underworld",
|
||||||
"From the shadows, they rose", //Gangs
|
"From the shadows, they rose", //Gangs
|
||||||
(
|
(
|
||||||
@@ -101,6 +106,7 @@ BitNodes["BitNode2"] = new BitNode(
|
|||||||
);
|
);
|
||||||
BitNodes["BitNode3"] = new BitNode(
|
BitNodes["BitNode3"] = new BitNode(
|
||||||
3,
|
3,
|
||||||
|
0,
|
||||||
"Corporatocracy",
|
"Corporatocracy",
|
||||||
"The Price of Civilization",
|
"The Price of Civilization",
|
||||||
(
|
(
|
||||||
@@ -140,6 +146,7 @@ BitNodes["BitNode3"] = new BitNode(
|
|||||||
);
|
);
|
||||||
BitNodes["BitNode4"] = new BitNode(
|
BitNodes["BitNode4"] = new BitNode(
|
||||||
4,
|
4,
|
||||||
|
1,
|
||||||
"The Singularity",
|
"The Singularity",
|
||||||
"The Man and the Machine",
|
"The Man and the Machine",
|
||||||
(
|
(
|
||||||
@@ -164,6 +171,7 @@ BitNodes["BitNode4"] = new BitNode(
|
|||||||
);
|
);
|
||||||
BitNodes["BitNode5"] = new BitNode(
|
BitNodes["BitNode5"] = new BitNode(
|
||||||
5,
|
5,
|
||||||
|
1,
|
||||||
"Artificial Intelligence",
|
"Artificial Intelligence",
|
||||||
"Posthuman",
|
"Posthuman",
|
||||||
(
|
(
|
||||||
@@ -211,6 +219,7 @@ BitNodes["BitNode5"] = new BitNode(
|
|||||||
);
|
);
|
||||||
BitNodes["BitNode6"] = new BitNode(
|
BitNodes["BitNode6"] = new BitNode(
|
||||||
6,
|
6,
|
||||||
|
1,
|
||||||
"Bladeburners",
|
"Bladeburners",
|
||||||
"Like Tears in Rain",
|
"Like Tears in Rain",
|
||||||
(
|
(
|
||||||
@@ -255,6 +264,7 @@ BitNodes["BitNode6"] = new BitNode(
|
|||||||
);
|
);
|
||||||
BitNodes["BitNode7"] = new BitNode(
|
BitNodes["BitNode7"] = new BitNode(
|
||||||
7,
|
7,
|
||||||
|
2,
|
||||||
"Bladeburners 2079",
|
"Bladeburners 2079",
|
||||||
"More human than humans",
|
"More human than humans",
|
||||||
(
|
(
|
||||||
@@ -303,6 +313,7 @@ BitNodes["BitNode7"] = new BitNode(
|
|||||||
);
|
);
|
||||||
BitNodes["BitNode8"] = new BitNode(
|
BitNodes["BitNode8"] = new BitNode(
|
||||||
8,
|
8,
|
||||||
|
2,
|
||||||
"Ghost of Wall Street",
|
"Ghost of Wall Street",
|
||||||
"Money never sleeps",
|
"Money never sleeps",
|
||||||
(
|
(
|
||||||
@@ -347,6 +358,7 @@ BitNodes["BitNode8"] = new BitNode(
|
|||||||
);
|
);
|
||||||
BitNodes["BitNode9"] = new BitNode(
|
BitNodes["BitNode9"] = new BitNode(
|
||||||
9,
|
9,
|
||||||
|
2,
|
||||||
"Hacktocracy",
|
"Hacktocracy",
|
||||||
"Hacknet Unleashed",
|
"Hacknet Unleashed",
|
||||||
(
|
(
|
||||||
@@ -384,11 +396,21 @@ BitNodes["BitNode9"] = new BitNode(
|
|||||||
<br />
|
<br />
|
||||||
(Note that the Level 3 effect of this Source-File only applies when entering a new BitNode, NOT when installing
|
(Note that the Level 3 effect of this Source-File only applies when entering a new BitNode, NOT when installing
|
||||||
Augmentations)
|
Augmentations)
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
This Source-File also increases your hacknet multipliers by:
|
||||||
|
<br />
|
||||||
|
Level 1: 8%
|
||||||
|
<br />
|
||||||
|
Level 2: 12%
|
||||||
|
<br />
|
||||||
|
Level 3: 14%
|
||||||
</>
|
</>
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
BitNodes["BitNode10"] = new BitNode(
|
BitNodes["BitNode10"] = new BitNode(
|
||||||
10,
|
10,
|
||||||
|
2,
|
||||||
"Digital Carbon",
|
"Digital Carbon",
|
||||||
"Your body is not who you are",
|
"Your body is not who you are",
|
||||||
(
|
(
|
||||||
@@ -428,6 +450,7 @@ BitNodes["BitNode10"] = new BitNode(
|
|||||||
);
|
);
|
||||||
BitNodes["BitNode11"] = new BitNode(
|
BitNodes["BitNode11"] = new BitNode(
|
||||||
11,
|
11,
|
||||||
|
1,
|
||||||
"The Big Crash",
|
"The Big Crash",
|
||||||
"Okay. Sell it all.",
|
"Okay. Sell it all.",
|
||||||
(
|
(
|
||||||
@@ -492,6 +515,7 @@ BitNodes["BitNode11"] = new BitNode(
|
|||||||
);
|
);
|
||||||
BitNodes["BitNode12"] = new BitNode(
|
BitNodes["BitNode12"] = new BitNode(
|
||||||
12,
|
12,
|
||||||
|
0,
|
||||||
"The Recursion",
|
"The Recursion",
|
||||||
"Repeat.",
|
"Repeat.",
|
||||||
(
|
(
|
||||||
@@ -507,18 +531,18 @@ BitNodes["BitNode12"] = new BitNode(
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
// Books: Frontera, Shiner
|
// Books: Frontera, Shiner
|
||||||
BitNodes["BitNode13"] = new BitNode(13, "fOS", "COMING SOON"); //Unlocks the new game mode and the rest of the BitNodes
|
BitNodes["BitNode13"] = new BitNode(13, 2, "fOS", "COMING SOON"); //Unlocks the new game mode and the rest of the BitNodes
|
||||||
BitNodes["BitNode14"] = new BitNode(14, "", "COMING SOON");
|
BitNodes["BitNode14"] = new BitNode(14, 2, "", "COMING SOON");
|
||||||
BitNodes["BitNode15"] = new BitNode(15, "", "COMING SOON");
|
BitNodes["BitNode15"] = new BitNode(15, 2, "", "COMING SOON");
|
||||||
BitNodes["BitNode16"] = new BitNode(16, "", "COMING SOON");
|
BitNodes["BitNode16"] = new BitNode(16, 2, "", "COMING SOON");
|
||||||
BitNodes["BitNode17"] = new BitNode(17, "", "COMING SOON");
|
BitNodes["BitNode17"] = new BitNode(17, 2, "", "COMING SOON");
|
||||||
BitNodes["BitNode18"] = new BitNode(18, "", "COMING SOON");
|
BitNodes["BitNode18"] = new BitNode(18, 2, "", "COMING SOON");
|
||||||
BitNodes["BitNode19"] = new BitNode(19, "", "COMING SOON");
|
BitNodes["BitNode19"] = new BitNode(19, 2, "", "COMING SOON");
|
||||||
BitNodes["BitNode20"] = new BitNode(20, "", "COMING SOON");
|
BitNodes["BitNode20"] = new BitNode(20, 2, "", "COMING SOON");
|
||||||
BitNodes["BitNode21"] = new BitNode(21, "", "COMING SOON");
|
BitNodes["BitNode21"] = new BitNode(21, 2, "", "COMING SOON");
|
||||||
BitNodes["BitNode22"] = new BitNode(22, "", "COMING SOON");
|
BitNodes["BitNode22"] = new BitNode(22, 2, "", "COMING SOON");
|
||||||
BitNodes["BitNode23"] = new BitNode(23, "", "COMING SOON");
|
BitNodes["BitNode23"] = new BitNode(23, 2, "", "COMING SOON");
|
||||||
BitNodes["BitNode24"] = new BitNode(24, "", "COMING SOON");
|
BitNodes["BitNode24"] = new BitNode(24, 2, "", "COMING SOON");
|
||||||
|
|
||||||
export function initBitNodeMultipliers(p: IPlayer): void {
|
export function initBitNodeMultipliers(p: IPlayer): void {
|
||||||
if (p.bitNodeN == null) {
|
if (p.bitNodeN == null) {
|
||||||
@@ -543,6 +567,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
|
|||||||
BitNodeMultipliers.FactionWorkRepGain = 0.5;
|
BitNodeMultipliers.FactionWorkRepGain = 0.5;
|
||||||
BitNodeMultipliers.FactionPassiveRepGain = 0;
|
BitNodeMultipliers.FactionPassiveRepGain = 0;
|
||||||
BitNodeMultipliers.GangKarmaRequirement = 0;
|
BitNodeMultipliers.GangKarmaRequirement = 0;
|
||||||
|
BitNodeMultipliers.PurchasedServerSoftcap = 1.4;
|
||||||
break;
|
break;
|
||||||
case 3: // Corporatocracy
|
case 3: // Corporatocracy
|
||||||
BitNodeMultipliers.HackingLevelMultiplier = 0.8;
|
BitNodeMultipliers.HackingLevelMultiplier = 0.8;
|
||||||
@@ -559,6 +584,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
|
|||||||
BitNodeMultipliers.HomeComputerRamCost = 1.5;
|
BitNodeMultipliers.HomeComputerRamCost = 1.5;
|
||||||
BitNodeMultipliers.PurchasedServerCost = 2;
|
BitNodeMultipliers.PurchasedServerCost = 2;
|
||||||
BitNodeMultipliers.GangKarmaRequirement = 3;
|
BitNodeMultipliers.GangKarmaRequirement = 3;
|
||||||
|
BitNodeMultipliers.PurchasedServerSoftcap = 1.4;
|
||||||
break;
|
break;
|
||||||
case 4: // The Singularity
|
case 4: // The Singularity
|
||||||
BitNodeMultipliers.ServerMaxMoney = 0.15;
|
BitNodeMultipliers.ServerMaxMoney = 0.15;
|
||||||
@@ -573,6 +599,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
|
|||||||
BitNodeMultipliers.HackExpGain = 0.4;
|
BitNodeMultipliers.HackExpGain = 0.4;
|
||||||
BitNodeMultipliers.CrimeExpGain = 0.5;
|
BitNodeMultipliers.CrimeExpGain = 0.5;
|
||||||
BitNodeMultipliers.FactionWorkRepGain = 0.75;
|
BitNodeMultipliers.FactionWorkRepGain = 0.75;
|
||||||
|
BitNodeMultipliers.PurchasedServerSoftcap = 1.3;
|
||||||
break;
|
break;
|
||||||
case 5: // Artificial intelligence
|
case 5: // Artificial intelligence
|
||||||
BitNodeMultipliers.ServerMaxMoney = 2;
|
BitNodeMultipliers.ServerMaxMoney = 2;
|
||||||
@@ -586,6 +613,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
|
|||||||
BitNodeMultipliers.AugmentationMoneyCost = 2;
|
BitNodeMultipliers.AugmentationMoneyCost = 2;
|
||||||
BitNodeMultipliers.HackExpGain = 0.5;
|
BitNodeMultipliers.HackExpGain = 0.5;
|
||||||
BitNodeMultipliers.CorporationValuation = 0.5;
|
BitNodeMultipliers.CorporationValuation = 0.5;
|
||||||
|
BitNodeMultipliers.PurchasedServerSoftcap = 1.3;
|
||||||
break;
|
break;
|
||||||
case 6: // Bladeburner
|
case 6: // Bladeburner
|
||||||
BitNodeMultipliers.HackingLevelMultiplier = 0.35;
|
BitNodeMultipliers.HackingLevelMultiplier = 0.35;
|
||||||
@@ -602,6 +630,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
|
|||||||
BitNodeMultipliers.HackExpGain = 0.25;
|
BitNodeMultipliers.HackExpGain = 0.25;
|
||||||
BitNodeMultipliers.DaedalusAugsRequirement = 1.166; // Results in 35 Augs needed
|
BitNodeMultipliers.DaedalusAugsRequirement = 1.166; // Results in 35 Augs needed
|
||||||
BitNodeMultipliers.GangKarmaRequirement = 5;
|
BitNodeMultipliers.GangKarmaRequirement = 5;
|
||||||
|
BitNodeMultipliers.PurchasedServerSoftcap = 2;
|
||||||
break;
|
break;
|
||||||
case 7: // Bladeburner 2079
|
case 7: // Bladeburner 2079
|
||||||
BitNodeMultipliers.BladeburnerRank = 0.6;
|
BitNodeMultipliers.BladeburnerRank = 0.6;
|
||||||
@@ -623,6 +652,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
|
|||||||
BitNodeMultipliers.FourSigmaMarketDataApiCost = 2;
|
BitNodeMultipliers.FourSigmaMarketDataApiCost = 2;
|
||||||
BitNodeMultipliers.DaedalusAugsRequirement = 1.166; // Results in 35 Augs needed
|
BitNodeMultipliers.DaedalusAugsRequirement = 1.166; // Results in 35 Augs needed
|
||||||
BitNodeMultipliers.GangKarmaRequirement = 5;
|
BitNodeMultipliers.GangKarmaRequirement = 5;
|
||||||
|
BitNodeMultipliers.PurchasedServerSoftcap = 2;
|
||||||
break;
|
break;
|
||||||
case 8: // Ghost of Wall Street
|
case 8: // Ghost of Wall Street
|
||||||
BitNodeMultipliers.ScriptHackMoney = 0.3;
|
BitNodeMultipliers.ScriptHackMoney = 0.3;
|
||||||
@@ -636,6 +666,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
|
|||||||
BitNodeMultipliers.CorporationValuation = 0;
|
BitNodeMultipliers.CorporationValuation = 0;
|
||||||
BitNodeMultipliers.CodingContractMoney = 0;
|
BitNodeMultipliers.CodingContractMoney = 0;
|
||||||
BitNodeMultipliers.GangKarmaRequirement = 10;
|
BitNodeMultipliers.GangKarmaRequirement = 10;
|
||||||
|
BitNodeMultipliers.PurchasedServerSoftcap = 5;
|
||||||
break;
|
break;
|
||||||
case 9: // Hacktocracy
|
case 9: // Hacktocracy
|
||||||
BitNodeMultipliers.HackingLevelMultiplier = 0.4;
|
BitNodeMultipliers.HackingLevelMultiplier = 0.4;
|
||||||
@@ -682,6 +713,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
|
|||||||
BitNodeMultipliers.PurchasedServerMaxRam = 0.5;
|
BitNodeMultipliers.PurchasedServerMaxRam = 0.5;
|
||||||
BitNodeMultipliers.BladeburnerRank = 0.8;
|
BitNodeMultipliers.BladeburnerRank = 0.8;
|
||||||
BitNodeMultipliers.GangKarmaRequirement = 3;
|
BitNodeMultipliers.GangKarmaRequirement = 3;
|
||||||
|
BitNodeMultipliers.PurchasedServerSoftcap = 1.2;
|
||||||
break;
|
break;
|
||||||
case 11: //The Big Crash
|
case 11: //The Big Crash
|
||||||
BitNodeMultipliers.HackingLevelMultiplier = 0.5;
|
BitNodeMultipliers.HackingLevelMultiplier = 0.5;
|
||||||
@@ -700,6 +732,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
|
|||||||
BitNodeMultipliers.CodingContractMoney = 0.25;
|
BitNodeMultipliers.CodingContractMoney = 0.25;
|
||||||
BitNodeMultipliers.FourSigmaMarketDataCost = 4;
|
BitNodeMultipliers.FourSigmaMarketDataCost = 4;
|
||||||
BitNodeMultipliers.FourSigmaMarketDataApiCost = 4;
|
BitNodeMultipliers.FourSigmaMarketDataApiCost = 4;
|
||||||
|
BitNodeMultipliers.PurchasedServerSoftcap = 2.2;
|
||||||
break;
|
break;
|
||||||
case 12: {
|
case 12: {
|
||||||
//The Recursion
|
//The Recursion
|
||||||
@@ -736,6 +769,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
|
|||||||
BitNodeMultipliers.PurchasedServerCost = inc;
|
BitNodeMultipliers.PurchasedServerCost = inc;
|
||||||
BitNodeMultipliers.PurchasedServerLimit = dec;
|
BitNodeMultipliers.PurchasedServerLimit = dec;
|
||||||
BitNodeMultipliers.PurchasedServerMaxRam = dec;
|
BitNodeMultipliers.PurchasedServerMaxRam = dec;
|
||||||
|
BitNodeMultipliers.PurchasedServerSoftcap = inc;
|
||||||
|
|
||||||
BitNodeMultipliers.ManualHackMoney = dec;
|
BitNodeMultipliers.ManualHackMoney = dec;
|
||||||
BitNodeMultipliers.ScriptHackMoney = dec;
|
BitNodeMultipliers.ScriptHackMoney = dec;
|
||||||
|
|||||||
@@ -156,6 +156,11 @@ interface IBitNodeMultipliers {
|
|||||||
*/
|
*/
|
||||||
PurchasedServerCost: number;
|
PurchasedServerCost: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Influence how much it costs to purchase a server
|
||||||
|
*/
|
||||||
|
PurchasedServerSoftcap: number;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Influences the maximum number of purchased servers you can have
|
* Influences the maximum number of purchased servers you can have
|
||||||
*/
|
*/
|
||||||
@@ -237,6 +242,7 @@ export const BitNodeMultipliers: IBitNodeMultipliers = {
|
|||||||
HomeComputerRamCost: 1,
|
HomeComputerRamCost: 1,
|
||||||
|
|
||||||
PurchasedServerCost: 1,
|
PurchasedServerCost: 1,
|
||||||
|
PurchasedServerSoftcap: 1,
|
||||||
PurchasedServerLimit: 1,
|
PurchasedServerLimit: 1,
|
||||||
PurchasedServerMaxRam: 1,
|
PurchasedServerMaxRam: 1,
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
import React, { useState, useEffect } from "react";
|
||||||
|
import { Modal } from "../../ui/React/Modal";
|
||||||
|
import { use } from "../../ui/Context";
|
||||||
|
import { EventEmitter } from "../../utils/EventEmitter";
|
||||||
|
import Typography from "@mui/material/Typography";
|
||||||
|
import Button from "@mui/material/Button";
|
||||||
|
|
||||||
|
export const BitFlumeEvent = new EventEmitter<[]>();
|
||||||
|
|
||||||
|
export function BitFlumeModal(): React.ReactElement {
|
||||||
|
const router = use.Router();
|
||||||
|
const [open, setOpen] = useState(false);
|
||||||
|
function flume(): void {
|
||||||
|
router.toBitVerse(true, false);
|
||||||
|
setOpen(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => BitFlumeEvent.subscribe(() => setOpen(true)), []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal open={open} onClose={() => setOpen(false)}>
|
||||||
|
<Typography>
|
||||||
|
WARNING: USING THIS PROGRAM WILL CAUSE YOU TO LOSE ALL OF YOUR PROGRESS ON THE CURRENT BITNODE.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Do you want to travel to the BitNode Nexus? This allows you to reset the current BitNode and select a new one.
|
||||||
|
</Typography>
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<Button onClick={flume}>Travel to the BitVerse</Button>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
import { IPlayer } from "../../PersonObjects/IPlayer";
|
|
||||||
import { IRouter } from "../../ui/Router";
|
|
||||||
import { removePopup } from "../../ui/React/createPopup";
|
|
||||||
|
|
||||||
interface IProps {
|
|
||||||
player: IPlayer;
|
|
||||||
router: IRouter;
|
|
||||||
popupId: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function BitFlumePopup(props: IProps): React.ReactElement {
|
|
||||||
function flume(): void {
|
|
||||||
props.router.toBitVerse(true, false);
|
|
||||||
removePopup(props.popupId);
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
WARNING: USING THIS PROGRAM WILL CAUSE YOU TO LOSE ALL OF YOUR PROGRESS ON THE CURRENT BITNODE.
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
Do you want to travel to the BitNode Nexus? This allows you to reset the current BitNode and select a new one.
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
<button className="std-button" onClick={flume}>
|
|
||||||
Travel to the BitVerse
|
|
||||||
</button>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -2,11 +2,43 @@ import React, { useState } from "react";
|
|||||||
import { SourceFileFlags } from "../../SourceFile/SourceFileFlags";
|
import { SourceFileFlags } from "../../SourceFile/SourceFileFlags";
|
||||||
import { IRouter } from "../../ui/Router";
|
import { IRouter } from "../../ui/Router";
|
||||||
import { BitNodes } from "../BitNode";
|
import { BitNodes } from "../BitNode";
|
||||||
import { enterBitNode } from "../../RedPill";
|
import { enterBitNode, setRedPillFlag } from "../../RedPill";
|
||||||
import { PortalPopup } from "./PortalPopup";
|
import { PortalModal } from "./PortalModal";
|
||||||
import { createPopup } from "../../ui/React/createPopup";
|
|
||||||
import { CinematicText } from "../../ui/React/CinematicText";
|
import { CinematicText } from "../../ui/React/CinematicText";
|
||||||
import { use } from "../../ui/Context";
|
import { use } from "../../ui/Context";
|
||||||
|
import makeStyles from "@mui/styles/makeStyles";
|
||||||
|
import createStyles from "@mui/styles/createStyles";
|
||||||
|
import Typography from "@mui/material/Typography";
|
||||||
|
import Tooltip from "@mui/material/Tooltip";
|
||||||
|
|
||||||
|
const useStyles = makeStyles(() =>
|
||||||
|
createStyles({
|
||||||
|
level0: {
|
||||||
|
color: "red",
|
||||||
|
"&:hover": {
|
||||||
|
color: "#fff",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
level1: {
|
||||||
|
color: "yellow",
|
||||||
|
"&:hover": {
|
||||||
|
color: "#fff",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
level2: {
|
||||||
|
color: "#48d1cc",
|
||||||
|
"&:hover": {
|
||||||
|
color: "#fff",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
level3: {
|
||||||
|
color: "blue",
|
||||||
|
"&:hover": {
|
||||||
|
color: "#fff",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
interface IPortalProps {
|
interface IPortalProps {
|
||||||
n: number;
|
n: number;
|
||||||
@@ -16,51 +48,53 @@ interface IPortalProps {
|
|||||||
enter: (router: IRouter, flume: boolean, destroyedBitNode: number, newBitNode: number) => void;
|
enter: (router: IRouter, flume: boolean, destroyedBitNode: number, newBitNode: number) => void;
|
||||||
}
|
}
|
||||||
function BitNodePortal(props: IPortalProps): React.ReactElement {
|
function BitNodePortal(props: IPortalProps): React.ReactElement {
|
||||||
const router = use.Router();
|
const [portalOpen, setPortalOpen] = useState(false);
|
||||||
|
const classes = useStyles();
|
||||||
const bitNode = BitNodes[`BitNode${props.n}`];
|
const bitNode = BitNodes[`BitNode${props.n}`];
|
||||||
if (bitNode == null) {
|
if (bitNode == null) {
|
||||||
return <>O</>;
|
return <>O</>;
|
||||||
}
|
}
|
||||||
|
|
||||||
let cssClass;
|
let cssClass = classes.level0;
|
||||||
if (props.n === 12 && props.level >= 2) {
|
if (props.n === 12 && props.level >= 2) {
|
||||||
// Repeating BitNode
|
// Repeating BitNode
|
||||||
cssClass = "level-2";
|
cssClass = classes.level2;
|
||||||
} else {
|
} else if (props.level === 1) {
|
||||||
cssClass = `level-${props.level}`;
|
cssClass = classes.level1;
|
||||||
|
} else if (props.level === 3) {
|
||||||
|
cssClass = classes.level3;
|
||||||
}
|
}
|
||||||
|
if (props.level === 2) {
|
||||||
function openPortalPopup(): void {
|
cssClass = classes.level2;
|
||||||
const popupId = "bitverse-portal-popup";
|
|
||||||
createPopup(popupId, PortalPopup, {
|
|
||||||
n: props.n,
|
|
||||||
level: props.level,
|
|
||||||
enter: props.enter,
|
|
||||||
router: router,
|
|
||||||
destroyedBitNode: props.destroyedBitNode,
|
|
||||||
flume: props.flume,
|
|
||||||
popupId: popupId,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<button
|
<>
|
||||||
className={`bitnode ${cssClass} tooltip`}
|
<Tooltip
|
||||||
aria-label={`enter-bitnode-${bitNode.number.toString()}`}
|
title={
|
||||||
onClick={openPortalPopup}
|
<Typography>
|
||||||
>
|
<strong>
|
||||||
<strong>O</strong>
|
BitNode-{bitNode.number.toString()}: {bitNode.name}
|
||||||
<span className="tooltiptext">
|
</strong>
|
||||||
<strong>
|
<br />
|
||||||
BitNode-{bitNode.number.toString()}
|
{bitNode.desc}
|
||||||
<br />
|
</Typography>
|
||||||
{bitNode.name}
|
}
|
||||||
</strong>
|
>
|
||||||
<br />
|
<span onClick={() => setPortalOpen(true)} className={cssClass}>
|
||||||
{bitNode.desc}
|
<b>O</b>
|
||||||
<br />
|
</span>
|
||||||
</span>
|
</Tooltip>
|
||||||
</button>
|
<PortalModal
|
||||||
|
open={portalOpen}
|
||||||
|
onClose={() => setPortalOpen(false)}
|
||||||
|
n={props.n}
|
||||||
|
level={props.level}
|
||||||
|
enter={props.enter}
|
||||||
|
destroyedBitNode={props.destroyedBitNode}
|
||||||
|
flume={props.flume}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,6 +105,7 @@ interface IProps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function BitverseRoot(props: IProps): React.ReactElement {
|
export function BitverseRoot(props: IProps): React.ReactElement {
|
||||||
|
setRedPillFlag(true);
|
||||||
const player = use.Player();
|
const player = use.Player();
|
||||||
const enter = enterBitNode;
|
const enter = enterBitNode;
|
||||||
const destroyed = player.bitNodeN;
|
const destroyed = player.bitNodeN;
|
||||||
@@ -114,32 +149,32 @@ export function BitverseRoot(props: IProps): React.ReactElement {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
<div className="noselect">
|
<>
|
||||||
<pre> O </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> O </Typography>
|
||||||
<pre> | O O | O O | </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> | O O | O O | </Typography>
|
||||||
<pre> O | | / __| \ | | O </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> O | | / __| \ | | O </Typography>
|
||||||
<pre> O | O | | O / | O | | O | O </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> O | O | | O / | O | | O | O </Typography>
|
||||||
<pre> | | | | |_/ |/ | \_ \_| | | | | </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> | | | | |_/ |/ | \_ \_| | | | | </Typography>
|
||||||
<pre> O | | | O | | O__/ | / \__ | | O | | | O </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> O | | | O | | O__/ | / \__ | | O | | | O </Typography>
|
||||||
<pre> | | | | | | | / /| O / \| | | | | | | </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> | | | | | | | / /| O / \| | | | | | | </Typography>
|
||||||
<pre>O | | | \| | O / _/ | / O | |/ | | | O</pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}>O | | | \| | O / _/ | / O | |/ | | | O</Typography>
|
||||||
<pre>| | | |O / | | O / | O O | | \ O| | | |</pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}>| | | |O / | | O / | O O | | \ O| | | |</Typography>
|
||||||
<pre>| | |/ \/ / __| | |/ \ | \ | |__ \ \/ \| | |</pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}>| | |/ \/ / __| | |/ \ | \ | |__ \ \/ \| | |</Typography>
|
||||||
<pre> \| O | |_/ |\| \ O \__| \_| | O |/ </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> \| O | |_/ |\| \ O \__| \_| | O |/ </Typography>
|
||||||
<pre> | | |_/ | | \| / | \_| | | </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> | | |_/ | | \| / | \_| | | </Typography>
|
||||||
<pre> \| / \| | / / \ |/ </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> \| / \| | / / \ |/ </Typography>
|
||||||
<pre> | <BitNodePortal n={10} level={nextSourceFileFlags[10]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> | | / | <BitNodePortal n={11} level={nextSourceFileFlags[11]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> | </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> | <BitNodePortal n={10} level={nextSourceFileFlags[10]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> | | / | <BitNodePortal n={11} level={nextSourceFileFlags[11]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> | </Typography>
|
||||||
<pre> <BitNodePortal n={9} level={nextSourceFileFlags[9]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> | | | | | | | <BitNodePortal n={12} level={nextSourceFileFlags[12]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> <BitNodePortal n={9} level={nextSourceFileFlags[9]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> | | | | | | | <BitNodePortal n={12} level={nextSourceFileFlags[12]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> </Typography>
|
||||||
<pre> | | | / / \ \ | | | </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> | | | / / \ \ | | | </Typography>
|
||||||
<pre> \| | / <BitNodePortal n={7} level={nextSourceFileFlags[7]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> / \ <BitNodePortal n={8} level={nextSourceFileFlags[8]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> \ | |/ </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> \| | / <BitNodePortal n={7} level={nextSourceFileFlags[7]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> / \ <BitNodePortal n={8} level={nextSourceFileFlags[8]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> \ | |/ </Typography>
|
||||||
<pre> \ | / / | | \ \ | / </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> \ | / / | | \ \ | / </Typography>
|
||||||
<pre> \ \JUMP <BitNodePortal n={5} level={nextSourceFileFlags[5]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} />3R | | | | | | R3<BitNodePortal n={6} level={nextSourceFileFlags[6]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> PMUJ/ / </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> \ \JUMP <BitNodePortal n={5} level={nextSourceFileFlags[5]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} />3R | | | | | | R3<BitNodePortal n={6} level={nextSourceFileFlags[6]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> PMUJ/ / </Typography>
|
||||||
<pre> \|| | | | | | | | | ||/ </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> \|| | | | | | | | | ||/ </Typography>
|
||||||
<pre> \| \_ | | | | | | _/ |/ </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> \| \_ | | | | | | _/ |/ </Typography>
|
||||||
<pre> \ \| / \ / \ |/ / </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> \ \| / \ / \ |/ / </Typography>
|
||||||
<pre> <BitNodePortal n={1} level={nextSourceFileFlags[1]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> |/ <BitNodePortal n={2} level={nextSourceFileFlags[2]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> | | <BitNodePortal n={3} level={nextSourceFileFlags[3]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> \| <BitNodePortal n={4} level={nextSourceFileFlags[4]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> <BitNodePortal n={1} level={nextSourceFileFlags[1]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> |/ <BitNodePortal n={2} level={nextSourceFileFlags[2]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> | | <BitNodePortal n={3} level={nextSourceFileFlags[3]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> \| <BitNodePortal n={4} level={nextSourceFileFlags[4]} enter={enter} flume={props.flume} destroyedBitNode={destroyed} /> </Typography>
|
||||||
<pre> | | | | | | | | </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> | | | | | | | | </Typography>
|
||||||
<pre> \JUMP3R|JUMP|3R| |R3|PMUJ|R3PMUJ/ </pre>
|
<Typography sx={{lineHeight: '1em',whiteSpace: 'pre'}}> \JUMP3R|JUMP|3R| |R3|PMUJ|R3PMUJ/ </Typography>
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
@@ -167,7 +202,7 @@ export function BitverseRoot(props: IProps): React.ReactElement {
|
|||||||
"> ",
|
"> ",
|
||||||
"> (Enter a new BitNode using the image above)",
|
"> (Enter a new BitNode using the image above)",
|
||||||
]} />
|
]} />
|
||||||
</div>
|
</>
|
||||||
);
|
);
|
||||||
|
|
||||||
return <></>;
|
return <></>;
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
import React from "react";
|
||||||
|
|
||||||
|
import { BitNodes } from "../BitNode";
|
||||||
|
import { IRouter } from "../../ui/Router";
|
||||||
|
import { use } from "../../ui/Context";
|
||||||
|
import { Modal } from "../../ui/React/Modal";
|
||||||
|
import Typography from "@mui/material/Typography";
|
||||||
|
import Button from "@mui/material/Button";
|
||||||
|
|
||||||
|
interface IProps {
|
||||||
|
open: boolean;
|
||||||
|
onClose: () => void;
|
||||||
|
n: number;
|
||||||
|
level: number;
|
||||||
|
destroyedBitNode: number;
|
||||||
|
flume: boolean;
|
||||||
|
enter: (router: IRouter, flume: boolean, destroyedBitNode: number, newBitNode: number) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function PortalModal(props: IProps): React.ReactElement {
|
||||||
|
const router = use.Router();
|
||||||
|
const bitNodeKey = "BitNode" + props.n;
|
||||||
|
const bitNode = BitNodes[bitNodeKey];
|
||||||
|
if (bitNode == null) throw new Error(`Could not find BitNode object for number: ${props.n}`);
|
||||||
|
const maxSourceFileLevel = props.n === 12 ? "∞" : "3";
|
||||||
|
|
||||||
|
const newLevel = Math.min(props.level + 1, props.n === 12 ? Infinity : 3);
|
||||||
|
return (
|
||||||
|
<Modal open={props.open} onClose={props.onClose}>
|
||||||
|
<Typography variant="h4">
|
||||||
|
BitNode-{props.n}: {bitNode.name}
|
||||||
|
</Typography>
|
||||||
|
<br />
|
||||||
|
<Typography>
|
||||||
|
Source-File Level: {props.level} / {maxSourceFileLevel}
|
||||||
|
</Typography>
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<Typography> Difficulty: {["easy", "normal", "hard"][bitNode.difficulty]}</Typography>
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<Typography>{bitNode.info}</Typography>
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<Button
|
||||||
|
onClick={() => {
|
||||||
|
props.enter(router, props.flume, props.destroyedBitNode, props.n);
|
||||||
|
props.onClose();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Enter BN{props.n}.{newLevel}
|
||||||
|
</Button>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
|
|
||||||
import { BitNodes } from "../BitNode";
|
|
||||||
import { IRouter } from "../../ui/Router";
|
|
||||||
import { removePopup } from "../../ui/React/createPopup";
|
|
||||||
interface IProps {
|
|
||||||
n: number;
|
|
||||||
level: number;
|
|
||||||
destroyedBitNode: number;
|
|
||||||
flume: boolean;
|
|
||||||
router: IRouter;
|
|
||||||
enter: (router: IRouter, flume: boolean, destroyedBitNode: number, newBitNode: number) => void;
|
|
||||||
popupId: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function PortalPopup(props: IProps): React.ReactElement {
|
|
||||||
const bitNodeKey = "BitNode" + props.n;
|
|
||||||
const bitNode = BitNodes[bitNodeKey];
|
|
||||||
if (bitNode == null) throw new Error(`Could not find BitNode object for number: ${props.n}`);
|
|
||||||
const maxSourceFileLevel = props.n === 12 ? "∞" : "3";
|
|
||||||
|
|
||||||
const newLevel = Math.min(props.level + 1, props.n === 12 ? Infinity : 3);
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<h1>
|
|
||||||
BitNode-{props.n}: {bitNode.name}
|
|
||||||
</h1>
|
|
||||||
<br />
|
|
||||||
Source-File Level: {props.level} / {maxSourceFileLevel}
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
{bitNode.info}
|
|
||||||
<br />
|
|
||||||
<br />
|
|
||||||
<button
|
|
||||||
className="std-button"
|
|
||||||
onClick={() => {
|
|
||||||
props.enter(props.router, props.flume, props.destroyedBitNode, props.n);
|
|
||||||
removePopup(props.popupId);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Enter BN{props.n}.{newLevel}
|
|
||||||
</button>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Player } from "../Player";
|
import { Player } from "../Player";
|
||||||
import { getRandomInt } from "../../utils/helpers/getRandomInt";
|
import { getRandomInt } from "../utils/helpers/getRandomInt";
|
||||||
import { addOffset } from "../../utils/helpers/addOffset";
|
import { addOffset } from "../utils/helpers/addOffset";
|
||||||
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver";
|
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../utils/JSONReviver";
|
||||||
import { BladeburnerConstants } from "./data/Constants";
|
import { BladeburnerConstants } from "./data/Constants";
|
||||||
import { IBladeburner } from "./IBladeburner";
|
import { IBladeburner } from "./IBladeburner";
|
||||||
import { IAction, ISuccessChanceParams } from "./IAction";
|
import { IAction, ISuccessChanceParams } from "./IAction";
|
||||||
@@ -20,7 +20,6 @@ class StatsMultiplier {
|
|||||||
|
|
||||||
export interface IActionParams {
|
export interface IActionParams {
|
||||||
name?: string;
|
name?: string;
|
||||||
desc?: string;
|
|
||||||
level?: number;
|
level?: number;
|
||||||
maxLevel?: number;
|
maxLevel?: number;
|
||||||
autoLevel?: boolean;
|
autoLevel?: boolean;
|
||||||
@@ -43,7 +42,6 @@ export interface IActionParams {
|
|||||||
|
|
||||||
export class Action implements IAction {
|
export class Action implements IAction {
|
||||||
name = "";
|
name = "";
|
||||||
desc = "";
|
|
||||||
|
|
||||||
// Difficulty scales with level. See getDifficulty() method
|
// Difficulty scales with level. See getDifficulty() method
|
||||||
level = 1;
|
level = 1;
|
||||||
@@ -100,7 +98,6 @@ export class Action implements IAction {
|
|||||||
constructor(params: IActionParams | null = null) {
|
constructor(params: IActionParams | null = null) {
|
||||||
// | null = null
|
// | null = null
|
||||||
if (params && params.name) this.name = params.name;
|
if (params && params.name) this.name = params.name;
|
||||||
if (params && params.desc) this.desc = params.desc;
|
|
||||||
|
|
||||||
if (params && params.baseDifficulty) this.baseDifficulty = addOffset(params.baseDifficulty, 10);
|
if (params && params.baseDifficulty) this.baseDifficulty = addOffset(params.baseDifficulty, 10);
|
||||||
if (params && params.difficultyFac) this.difficultyFac = params.difficultyFac;
|
if (params && params.difficultyFac) this.difficultyFac = params.difficultyFac;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import { IActionIdentifier } from "./IActionIdentifier";
|
import { IActionIdentifier } from "./IActionIdentifier";
|
||||||
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver";
|
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../utils/JSONReviver";
|
||||||
|
|
||||||
interface IParams {
|
interface IParams {
|
||||||
name?: string;
|
name?: string;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Operation, IOperationParams } from "./Operation";
|
import { Operation, IOperationParams } from "./Operation";
|
||||||
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver";
|
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../utils/JSONReviver";
|
||||||
|
|
||||||
export class BlackOperation extends Operation {
|
export class BlackOperation extends Operation {
|
||||||
constructor(params: IOperationParams | null = null) {
|
constructor(params: IOperationParams | null = null) {
|
||||||
|
|||||||
@@ -1,763 +0,0 @@
|
|||||||
import { BlackOperation } from "./BlackOperation";
|
|
||||||
import { IMap } from "../types";
|
|
||||||
|
|
||||||
export const BlackOperations: IMap<BlackOperation> = {};
|
|
||||||
|
|
||||||
(function () {
|
|
||||||
BlackOperations["Operation Typhoon"] = new BlackOperation({
|
|
||||||
name: "Operation Typhoon",
|
|
||||||
desc:
|
|
||||||
"Obadiah Zenyatta is the leader of a RedWater PMC. It has long " +
|
|
||||||
"been known among the intelligence community that Zenyatta, along " +
|
|
||||||
"with the rest of the PMC, is a Synthoid.<br><br>" +
|
|
||||||
"The goal of Operation Typhoon is to find and eliminate " +
|
|
||||||
"Zenyatta and RedWater by any means necessary. After the task " +
|
|
||||||
"is completed, the actions must be covered up from the general public.",
|
|
||||||
baseDifficulty: 2000,
|
|
||||||
reqdRank: 2.5e3,
|
|
||||||
rankGain: 50,
|
|
||||||
rankLoss: 10,
|
|
||||||
hpLoss: 100,
|
|
||||||
weights: {
|
|
||||||
hack: 0.1,
|
|
||||||
str: 0.2,
|
|
||||||
def: 0.2,
|
|
||||||
dex: 0.2,
|
|
||||||
agi: 0.2,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.1,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0.6,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isKill: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Zero"] = new BlackOperation({
|
|
||||||
name: "Operation Zero",
|
|
||||||
desc:
|
|
||||||
"AeroCorp is one of the world's largest defense contractors. " +
|
|
||||||
"Its leader, Steve Watataki, is thought to be a supporter of " +
|
|
||||||
"Synthoid rights. He must be removed.<br><br>" +
|
|
||||||
"The goal of Operation Zero is to covertly infiltrate AeroCorp and " +
|
|
||||||
"uncover any incriminating evidence or " +
|
|
||||||
"information against Watataki that will cause him to be removed " +
|
|
||||||
"from his position at AeroCorp. Incriminating evidence can be " +
|
|
||||||
"fabricated as a last resort. Be warned that AeroCorp has some of " +
|
|
||||||
"the most advanced security measures in the world.",
|
|
||||||
baseDifficulty: 2500,
|
|
||||||
reqdRank: 5e3,
|
|
||||||
rankGain: 60,
|
|
||||||
rankLoss: 15,
|
|
||||||
hpLoss: 50,
|
|
||||||
weights: {
|
|
||||||
hack: 0.2,
|
|
||||||
str: 0.15,
|
|
||||||
def: 0.15,
|
|
||||||
dex: 0.2,
|
|
||||||
agi: 0.2,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.1,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0.6,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isStealth: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation X"] = new BlackOperation({
|
|
||||||
name: "Operation X",
|
|
||||||
desc:
|
|
||||||
"We have recently discovered an underground publication " +
|
|
||||||
"group called Samizdat. Even though most of their publications " +
|
|
||||||
"are nonsensical conspiracy theories, the average human is " +
|
|
||||||
"gullible enough to believe them. Many of their works discuss " +
|
|
||||||
"Synthoids and pose a threat to society. The publications are spreading " +
|
|
||||||
"rapidly in China and other Eastern countries.<br><br>" +
|
|
||||||
"Samizdat has done a good job of keeping hidden and anonymous. " +
|
|
||||||
"However, we've just received intelligence that their base of " +
|
|
||||||
"operations is in Ishima's underground sewer systems. Your task is to " +
|
|
||||||
"investigate the sewer systems, and eliminate Samizdat. They must " +
|
|
||||||
"never publish anything again.",
|
|
||||||
baseDifficulty: 3000,
|
|
||||||
reqdRank: 7.5e3,
|
|
||||||
rankGain: 75,
|
|
||||||
rankLoss: 15,
|
|
||||||
hpLoss: 100,
|
|
||||||
weights: {
|
|
||||||
hack: 0.1,
|
|
||||||
str: 0.2,
|
|
||||||
def: 0.2,
|
|
||||||
dex: 0.2,
|
|
||||||
agi: 0.2,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.1,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0.6,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isKill: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Titan"] = new BlackOperation({
|
|
||||||
name: "Operation Titan",
|
|
||||||
desc:
|
|
||||||
"Several months ago Titan Laboratories' Bioengineering department " +
|
|
||||||
"was infiltrated by Synthoids. As far as we know, Titan Laboratories' " +
|
|
||||||
"management has no knowledge about this. We don't know what the " +
|
|
||||||
"Synthoids are up to, but the research that they could " +
|
|
||||||
"be conducting using Titan Laboraties' vast resources is potentially " +
|
|
||||||
"very dangerous.<br><br>" +
|
|
||||||
"Your goal is to enter and destroy the Bioengineering department's " +
|
|
||||||
"facility in Aevum. The task is not just to retire the Synthoids there, but " +
|
|
||||||
"also to destroy any information or research at the facility that " +
|
|
||||||
"is relevant to the Synthoids and their goals.",
|
|
||||||
baseDifficulty: 4000,
|
|
||||||
reqdRank: 10e3,
|
|
||||||
rankGain: 100,
|
|
||||||
rankLoss: 20,
|
|
||||||
hpLoss: 100,
|
|
||||||
weights: {
|
|
||||||
hack: 0.1,
|
|
||||||
str: 0.2,
|
|
||||||
def: 0.2,
|
|
||||||
dex: 0.2,
|
|
||||||
agi: 0.2,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.1,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0.6,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isKill: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Ares"] = new BlackOperation({
|
|
||||||
name: "Operation Ares",
|
|
||||||
desc:
|
|
||||||
"One of our undercover agents, Agent Carter, has informed us of a " +
|
|
||||||
"massive weapons deal going down in Dubai between rogue Russian " +
|
|
||||||
"militants and a radical Synthoid community. These weapons are next-gen " +
|
|
||||||
"plasma and energy weapons. It is critical for the safety of humanity " +
|
|
||||||
"that this deal does not happen.<br><br>" +
|
|
||||||
"Your task is to intercept the deal. Leave no survivors.",
|
|
||||||
baseDifficulty: 5000,
|
|
||||||
reqdRank: 12.5e3,
|
|
||||||
rankGain: 125,
|
|
||||||
rankLoss: 20,
|
|
||||||
hpLoss: 200,
|
|
||||||
weights: {
|
|
||||||
hack: 0,
|
|
||||||
str: 0.25,
|
|
||||||
def: 0.25,
|
|
||||||
dex: 0.25,
|
|
||||||
agi: 0.25,
|
|
||||||
cha: 0,
|
|
||||||
int: 0,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isKill: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Archangel"] = new BlackOperation({
|
|
||||||
name: "Operation Archangel",
|
|
||||||
desc:
|
|
||||||
"Our analysts have discovered that the popular Red Rabbit brothel in " +
|
|
||||||
"Amsterdam is run and 'staffed' by MK-VI Synthoids. Intelligence " +
|
|
||||||
"suggests that the profit from this brothel is used to fund a large " +
|
|
||||||
"black market arms trafficking operation.<br><br>" +
|
|
||||||
"The goal of this operation is to take out the leaders that are running " +
|
|
||||||
"the Red Rabbit brothel. Try to limit the number of other casualties, " +
|
|
||||||
"but do what you must to complete the mission.",
|
|
||||||
baseDifficulty: 7500,
|
|
||||||
reqdRank: 15e3,
|
|
||||||
rankGain: 200,
|
|
||||||
rankLoss: 20,
|
|
||||||
hpLoss: 25,
|
|
||||||
weights: {
|
|
||||||
hack: 0,
|
|
||||||
str: 0.2,
|
|
||||||
def: 0.2,
|
|
||||||
dex: 0.3,
|
|
||||||
agi: 0.3,
|
|
||||||
cha: 0,
|
|
||||||
int: 0,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isKill: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Juggernaut"] = new BlackOperation({
|
|
||||||
name: "Operation Juggernaut",
|
|
||||||
desc:
|
|
||||||
"The CIA has just encountered a new security threat. A new " +
|
|
||||||
"criminal group, lead by a shadowy operative who calls himself " +
|
|
||||||
"Juggernaut, has been smuggling drugs and weapons (including " +
|
|
||||||
"suspected bioweapons) into Sector-12. We also have reason " +
|
|
||||||
"to believe the tried to break into one of Universal Energy's " +
|
|
||||||
"facilities in order to cause a city-wide blackout. The CIA " +
|
|
||||||
"suspects that Juggernaut is a heavily-augmented Synthoid, and " +
|
|
||||||
"have thus enlisted our help.<br><br>" +
|
|
||||||
"Your mission is to eradicate Juggernaut and his followers.",
|
|
||||||
baseDifficulty: 10e3,
|
|
||||||
reqdRank: 20e3,
|
|
||||||
rankGain: 300,
|
|
||||||
rankLoss: 40,
|
|
||||||
hpLoss: 300,
|
|
||||||
weights: {
|
|
||||||
hack: 0,
|
|
||||||
str: 0.25,
|
|
||||||
def: 0.25,
|
|
||||||
dex: 0.25,
|
|
||||||
agi: 0.25,
|
|
||||||
cha: 0,
|
|
||||||
int: 0,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isKill: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Red Dragon"] = new BlackOperation({
|
|
||||||
name: "Operation Red Dragon",
|
|
||||||
desc:
|
|
||||||
"The Tetrads criminal organization is suspected of " +
|
|
||||||
"reverse-engineering the MK-VI Synthoid design. We believe " +
|
|
||||||
"they altered and possibly improved the design and began " +
|
|
||||||
"manufacturing their own Synthoid models in order to bolster " +
|
|
||||||
"their criminal activities.<br><br>" +
|
|
||||||
"Your task is to infiltrate and destroy the Tetrads' base of operations " +
|
|
||||||
"in Los Angeles. Intelligence tells us that their base houses " +
|
|
||||||
"one of their Synthoid manufacturing units.",
|
|
||||||
baseDifficulty: 12.5e3,
|
|
||||||
reqdRank: 25e3,
|
|
||||||
rankGain: 500,
|
|
||||||
rankLoss: 50,
|
|
||||||
hpLoss: 500,
|
|
||||||
weights: {
|
|
||||||
hack: 0.05,
|
|
||||||
str: 0.2,
|
|
||||||
def: 0.2,
|
|
||||||
dex: 0.25,
|
|
||||||
agi: 0.25,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.05,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0.6,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isKill: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation K"] = new BlackOperation({
|
|
||||||
name: "Operation K",
|
|
||||||
desc:
|
|
||||||
"CODE RED SITUATION. Our intelligence tells us that VitaLife " +
|
|
||||||
"has discovered a new android cloning technology. This technology " +
|
|
||||||
"is supposedly capable of cloning Synthoid, not only physically " +
|
|
||||||
"but also their advanced AI modules. We do not believe that " +
|
|
||||||
"VitaLife is trying to use this technology illegally or " +
|
|
||||||
"maliciously, but if any Synthoids were able to infiltrate the " +
|
|
||||||
"corporation and take advantage of this technology then the " +
|
|
||||||
"results would be catastrophic.<br><br>" +
|
|
||||||
"We do not have the power or jurisdiction to shutdown this down " +
|
|
||||||
"through legal or political means, so we must resort to a covert " +
|
|
||||||
"operation. Your goal is to destroy this technology and eliminate " +
|
|
||||||
"anyone who was involved in its creation.",
|
|
||||||
baseDifficulty: 15e3,
|
|
||||||
reqdRank: 30e3,
|
|
||||||
rankGain: 750,
|
|
||||||
rankLoss: 60,
|
|
||||||
hpLoss: 1000,
|
|
||||||
weights: {
|
|
||||||
hack: 0.05,
|
|
||||||
str: 0.2,
|
|
||||||
def: 0.2,
|
|
||||||
dex: 0.25,
|
|
||||||
agi: 0.25,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.05,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0.6,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isKill: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Deckard"] = new BlackOperation({
|
|
||||||
name: "Operation Deckard",
|
|
||||||
desc:
|
|
||||||
"Despite your success in eliminating VitaLife's new android-replicating " +
|
|
||||||
"technology in Operation K, we've discovered that a small group of " +
|
|
||||||
"MK-VI Synthoids were able to make off with the schematics and design " +
|
|
||||||
"of the technology before the Operation. It is almost a certainty that " +
|
|
||||||
"these Synthoids are some of the rogue MK-VI ones from the Synthoid Uprising.<br><br>" +
|
|
||||||
"The goal of Operation Deckard is to hunt down these Synthoids and retire " +
|
|
||||||
"them. I don't need to tell you how critical this mission is.",
|
|
||||||
baseDifficulty: 20e3,
|
|
||||||
reqdRank: 40e3,
|
|
||||||
rankGain: 1e3,
|
|
||||||
rankLoss: 75,
|
|
||||||
hpLoss: 200,
|
|
||||||
weights: {
|
|
||||||
hack: 0,
|
|
||||||
str: 0.24,
|
|
||||||
def: 0.24,
|
|
||||||
dex: 0.24,
|
|
||||||
agi: 0.24,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.04,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isKill: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Tyrell"] = new BlackOperation({
|
|
||||||
name: "Operation Tyrell",
|
|
||||||
desc:
|
|
||||||
"A week ago Blade Industries reported a small break-in at one " +
|
|
||||||
"of their Aevum Augmentation storage facitilities. We figured out " +
|
|
||||||
"that The Dark Army was behind the heist, and didn't think any more " +
|
|
||||||
"of it. However, we've just discovered that several known MK-VI Synthoids " +
|
|
||||||
"were part of that break-in group.<br><br>" +
|
|
||||||
"We cannot have Synthoids upgrading their already-enhanced abilities " +
|
|
||||||
"with Augmentations. Your task is to hunt down the associated Dark Army " +
|
|
||||||
"members and eliminate them.",
|
|
||||||
baseDifficulty: 25e3,
|
|
||||||
reqdRank: 50e3,
|
|
||||||
rankGain: 1.5e3,
|
|
||||||
rankLoss: 100,
|
|
||||||
hpLoss: 500,
|
|
||||||
weights: {
|
|
||||||
hack: 0.1,
|
|
||||||
str: 0.2,
|
|
||||||
def: 0.2,
|
|
||||||
dex: 0.2,
|
|
||||||
agi: 0.2,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.1,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0.6,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isKill: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Wallace"] = new BlackOperation({
|
|
||||||
name: "Operation Wallace",
|
|
||||||
desc:
|
|
||||||
"Based on information gathered from Operation Tyrell, we've discovered " +
|
|
||||||
"that The Dark Army was well aware that there were Synthoids amongst " +
|
|
||||||
"their ranks. Even worse, we believe that The Dark Army is working " +
|
|
||||||
"together with other criminal organizations such as The Syndicate and " +
|
|
||||||
"that they are planning some sort of large-scale takeover of multiple major " +
|
|
||||||
"cities, most notably Aevum. We suspect that Synthoids have infiltrated " +
|
|
||||||
"the ranks of these criminal factions and are trying to stage another " +
|
|
||||||
"Synthoid uprising.<br><br>" +
|
|
||||||
"The best way to deal with this is to prevent it before it even happens. " +
|
|
||||||
"The goal of Operation Wallace is to destroy the Dark Army and " +
|
|
||||||
"Syndicate factions in Aevum immediately. Leave no survivors.",
|
|
||||||
baseDifficulty: 30e3,
|
|
||||||
reqdRank: 75e3,
|
|
||||||
rankGain: 2e3,
|
|
||||||
rankLoss: 150,
|
|
||||||
hpLoss: 1500,
|
|
||||||
weights: {
|
|
||||||
hack: 0,
|
|
||||||
str: 0.24,
|
|
||||||
def: 0.24,
|
|
||||||
dex: 0.24,
|
|
||||||
agi: 0.24,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.04,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0.6,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isKill: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Shoulder of Orion"] = new BlackOperation({
|
|
||||||
name: "Operation Shoulder of Orion",
|
|
||||||
desc:
|
|
||||||
"China's Solaris Space Systems is secretly launching the first " +
|
|
||||||
"manned spacecraft in over a decade using Synthoids. We believe " +
|
|
||||||
"China is trying to establish the first off-world colonies.<br><br>" +
|
|
||||||
"The mission is to prevent this launch without instigating an " +
|
|
||||||
"international conflict. When you accept this mission you will be " +
|
|
||||||
"officially disavowed by the NSA and the national government until after you " +
|
|
||||||
"successfully return. In the event of failure, all of the operation's " +
|
|
||||||
"team members must not let themselves be captured alive.",
|
|
||||||
baseDifficulty: 35e3,
|
|
||||||
reqdRank: 100e3,
|
|
||||||
rankGain: 2.5e3,
|
|
||||||
rankLoss: 500,
|
|
||||||
hpLoss: 1500,
|
|
||||||
weights: {
|
|
||||||
hack: 0.1,
|
|
||||||
str: 0.2,
|
|
||||||
def: 0.2,
|
|
||||||
dex: 0.2,
|
|
||||||
agi: 0.2,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.1,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0.6,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isStealth: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Hyron"] = new BlackOperation({
|
|
||||||
name: "Operation Hyron",
|
|
||||||
desc:
|
|
||||||
"Our intelligence tells us that Fulcrum Technologies is developing " +
|
|
||||||
"a quantum supercomputer using human brains as core " +
|
|
||||||
"processors. This supercomputer " +
|
|
||||||
"is rumored to be able to store vast amounts of data and " +
|
|
||||||
"perform computations unmatched by any other supercomputer on the " +
|
|
||||||
"planet. But more importantly, the use of organic human brains " +
|
|
||||||
"means that the supercomputer may be able to reason abstractly " +
|
|
||||||
"and become self-aware.<br><br>" +
|
|
||||||
"I do not need to remind you why sentient-level AIs pose a serious " +
|
|
||||||
"threat to all of mankind.<br><br>" +
|
|
||||||
"The research for this project is being conducted at one of Fulcrum " +
|
|
||||||
"Technologies secret facilities in Aevum, codenamed 'Alpha Ranch'. " +
|
|
||||||
"Infiltrate the compound, delete and destroy the work, and then find and kill the " +
|
|
||||||
"project lead.",
|
|
||||||
baseDifficulty: 40e3,
|
|
||||||
reqdRank: 125e3,
|
|
||||||
rankGain: 3e3,
|
|
||||||
rankLoss: 1e3,
|
|
||||||
hpLoss: 500,
|
|
||||||
weights: {
|
|
||||||
hack: 0.1,
|
|
||||||
str: 0.2,
|
|
||||||
def: 0.2,
|
|
||||||
dex: 0.2,
|
|
||||||
agi: 0.2,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.1,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0.6,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isKill: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Morpheus"] = new BlackOperation({
|
|
||||||
name: "Operation Morpheus",
|
|
||||||
desc:
|
|
||||||
"DreamSense Technologies is an advertising company that uses " +
|
|
||||||
"special technology to transmit their ads into the peoples " +
|
|
||||||
"dreams and subconcious. They do this using broadcast transmitter " +
|
|
||||||
"towers. Based on information from our agents and informants in " +
|
|
||||||
"Chonqging, we have reason to believe that one of the broadcast " +
|
|
||||||
"towers there has been compromised by Synthoids and is being used " +
|
|
||||||
"to spread pro-Synthoid propaganda.<br><br>" +
|
|
||||||
"The mission is to destroy this broadcast tower. Speed and " +
|
|
||||||
"stealth are of the upmost important for this.",
|
|
||||||
baseDifficulty: 45e3,
|
|
||||||
reqdRank: 150e3,
|
|
||||||
rankGain: 4e3,
|
|
||||||
rankLoss: 1e3,
|
|
||||||
hpLoss: 100,
|
|
||||||
weights: {
|
|
||||||
hack: 0.05,
|
|
||||||
str: 0.15,
|
|
||||||
def: 0.15,
|
|
||||||
dex: 0.3,
|
|
||||||
agi: 0.3,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.05,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0.6,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isStealth: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Ion Storm"] = new BlackOperation({
|
|
||||||
name: "Operation Ion Storm",
|
|
||||||
desc:
|
|
||||||
"Our analysts have uncovered a gathering of MK-VI Synthoids " +
|
|
||||||
"that have taken up residence in the Sector-12 Slums. We " +
|
|
||||||
"don't know if they are rogue Synthoids from the Uprising, " +
|
|
||||||
"but we do know that they have been stockpiling " +
|
|
||||||
"weapons, money, and other resources. This makes them dangerous.<br><br>" +
|
|
||||||
"This is a full-scale assault operation to find and retire all of these " +
|
|
||||||
"Synthoids in the Sector-12 Slums.",
|
|
||||||
baseDifficulty: 50e3,
|
|
||||||
reqdRank: 175e3,
|
|
||||||
rankGain: 5e3,
|
|
||||||
rankLoss: 1e3,
|
|
||||||
hpLoss: 5000,
|
|
||||||
weights: {
|
|
||||||
hack: 0,
|
|
||||||
str: 0.24,
|
|
||||||
def: 0.24,
|
|
||||||
dex: 0.24,
|
|
||||||
agi: 0.24,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.04,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0.6,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isKill: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Annihilus"] = new BlackOperation({
|
|
||||||
name: "Operation Annihilus",
|
|
||||||
desc:
|
|
||||||
"Our superiors have ordered us to eradicate everything and everyone " +
|
|
||||||
"in an underground facility located in Aevum. They tell us " +
|
|
||||||
"that the facility houses many dangerous Synthoids and " +
|
|
||||||
"belongs to a terrorist organization called " +
|
|
||||||
"'The Covenant'. We have no prior intelligence about this " +
|
|
||||||
"organization, so you are going in blind.",
|
|
||||||
baseDifficulty: 55e3,
|
|
||||||
reqdRank: 200e3,
|
|
||||||
rankGain: 7.5e3,
|
|
||||||
rankLoss: 1e3,
|
|
||||||
hpLoss: 10e3,
|
|
||||||
weights: {
|
|
||||||
hack: 0,
|
|
||||||
str: 0.24,
|
|
||||||
def: 0.24,
|
|
||||||
dex: 0.24,
|
|
||||||
agi: 0.24,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.04,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0.6,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isKill: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Ultron"] = new BlackOperation({
|
|
||||||
name: "Operation Ultron",
|
|
||||||
desc:
|
|
||||||
"OmniTek Incorporated, the original designer and manufacturer of Synthoids, " +
|
|
||||||
"has notified us of a malfunction in their AI design. This malfunction, " +
|
|
||||||
"when triggered, causes MK-VI Synthoids to become radicalized and seek out " +
|
|
||||||
"the destruction of humanity. They say that this bug affects all MK-VI Synthoids, " +
|
|
||||||
"not just the rogue ones from the Uprising.<br><br>" +
|
|
||||||
"OmniTek has also told us they they believe someone has triggered this " +
|
|
||||||
"malfunction in a large group of MK-VI Synthoids, and that these newly-radicalized Synthoids " +
|
|
||||||
"are now amassing in Volhaven to form a terrorist group called Ultron.<br><br>" +
|
|
||||||
"Intelligence suggests Ultron is heavily armed and that their members are " +
|
|
||||||
"augmented. We believe Ultron is making moves to take control of " +
|
|
||||||
"and weaponize DeltaOne's Tactical High-Energy Satellite Laser Array (THESLA).<br><br>" +
|
|
||||||
"Your task is to find and destroy Ultron.",
|
|
||||||
baseDifficulty: 60e3,
|
|
||||||
reqdRank: 250e3,
|
|
||||||
rankGain: 10e3,
|
|
||||||
rankLoss: 2e3,
|
|
||||||
hpLoss: 10e3,
|
|
||||||
weights: {
|
|
||||||
hack: 0.1,
|
|
||||||
str: 0.2,
|
|
||||||
def: 0.2,
|
|
||||||
dex: 0.2,
|
|
||||||
agi: 0.2,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.1,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0.6,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
isKill: true,
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Centurion"] = new BlackOperation({
|
|
||||||
name: "Operation Centurion",
|
|
||||||
desc:
|
|
||||||
"D)@#)($M)C0293c40($*)@#D0JUMP3Rm0C<*@#)*$)#02c94830c(#$*D)<br><br>" +
|
|
||||||
"Throughout all of humanity's history, we have relied on " +
|
|
||||||
"technology to survive, conquer, and progress. Its advancement became our primary goal. " +
|
|
||||||
"And at the peak of human civilization technology turned into " +
|
|
||||||
"power. Global, absolute power.<br><br>" +
|
|
||||||
"It seems that the universe is not without a sense of irony.<br><br>" +
|
|
||||||
"D)@#)($M)C0293c40($*)@#D0JUMP3Rm0C<*@#)*$)#02c94830c(#$*D)",
|
|
||||||
baseDifficulty: 70e3,
|
|
||||||
reqdRank: 300e3,
|
|
||||||
rankGain: 15e3,
|
|
||||||
rankLoss: 5e3,
|
|
||||||
hpLoss: 10e3,
|
|
||||||
weights: {
|
|
||||||
hack: 0.1,
|
|
||||||
str: 0.2,
|
|
||||||
def: 0.2,
|
|
||||||
dex: 0.2,
|
|
||||||
agi: 0.2,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.1,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0.6,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Vindictus"] = new BlackOperation({
|
|
||||||
name: "Operation Vindictus",
|
|
||||||
desc:
|
|
||||||
"D)@#)($M)C0293c40($*)@#D0JUMP3Rm0C<*@#)*$)#02c94830c(#$*D)<br><br>" +
|
|
||||||
"The bits are all around us. The daemons that hold the Node " +
|
|
||||||
"together can manifest themselves in many different ways.<br><br>" +
|
|
||||||
"D)@#)($M)C0293c40($*)@#D0JUMP3Rm0C<*@#)*$)#02c94830c(#$*D)",
|
|
||||||
baseDifficulty: 75e3,
|
|
||||||
reqdRank: 350e3,
|
|
||||||
rankGain: 20e3,
|
|
||||||
rankLoss: 20e3,
|
|
||||||
hpLoss: 20e3,
|
|
||||||
weights: {
|
|
||||||
hack: 0.1,
|
|
||||||
str: 0.2,
|
|
||||||
def: 0.2,
|
|
||||||
dex: 0.2,
|
|
||||||
agi: 0.2,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.1,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0.6,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
BlackOperations["Operation Daedalus"] = new BlackOperation({
|
|
||||||
name: "Operation Daedalus",
|
|
||||||
desc: "Yesterday we obeyed kings and bent our neck to emperors. " + "Today we kneel only to truth.",
|
|
||||||
baseDifficulty: 80e3,
|
|
||||||
reqdRank: 400e3,
|
|
||||||
rankGain: 40e3,
|
|
||||||
rankLoss: 10e3,
|
|
||||||
hpLoss: 100e3,
|
|
||||||
weights: {
|
|
||||||
hack: 0.1,
|
|
||||||
str: 0.2,
|
|
||||||
def: 0.2,
|
|
||||||
dex: 0.2,
|
|
||||||
agi: 0.2,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.1,
|
|
||||||
},
|
|
||||||
decays: {
|
|
||||||
hack: 0.6,
|
|
||||||
str: 0.8,
|
|
||||||
def: 0.8,
|
|
||||||
dex: 0.8,
|
|
||||||
agi: 0.8,
|
|
||||||
cha: 0,
|
|
||||||
int: 0.75,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
})();
|
|
||||||
@@ -0,0 +1,571 @@
|
|||||||
|
import { BlackOperation } from "./BlackOperation";
|
||||||
|
import { IMap } from "../types";
|
||||||
|
|
||||||
|
export const BlackOperations: IMap<BlackOperation> = {};
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
BlackOperations["Operation Typhoon"] = new BlackOperation({
|
||||||
|
name: "Operation Typhoon",
|
||||||
|
baseDifficulty: 2000,
|
||||||
|
reqdRank: 2.5e3,
|
||||||
|
rankGain: 50,
|
||||||
|
rankLoss: 10,
|
||||||
|
hpLoss: 100,
|
||||||
|
weights: {
|
||||||
|
hack: 0.1,
|
||||||
|
str: 0.2,
|
||||||
|
def: 0.2,
|
||||||
|
dex: 0.2,
|
||||||
|
agi: 0.2,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.1,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0.6,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isKill: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Zero"] = new BlackOperation({
|
||||||
|
name: "Operation Zero",
|
||||||
|
baseDifficulty: 2500,
|
||||||
|
reqdRank: 5e3,
|
||||||
|
rankGain: 60,
|
||||||
|
rankLoss: 15,
|
||||||
|
hpLoss: 50,
|
||||||
|
weights: {
|
||||||
|
hack: 0.2,
|
||||||
|
str: 0.15,
|
||||||
|
def: 0.15,
|
||||||
|
dex: 0.2,
|
||||||
|
agi: 0.2,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.1,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0.6,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isStealth: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation X"] = new BlackOperation({
|
||||||
|
name: "Operation X",
|
||||||
|
baseDifficulty: 3000,
|
||||||
|
reqdRank: 7.5e3,
|
||||||
|
rankGain: 75,
|
||||||
|
rankLoss: 15,
|
||||||
|
hpLoss: 100,
|
||||||
|
weights: {
|
||||||
|
hack: 0.1,
|
||||||
|
str: 0.2,
|
||||||
|
def: 0.2,
|
||||||
|
dex: 0.2,
|
||||||
|
agi: 0.2,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.1,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0.6,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isKill: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Titan"] = new BlackOperation({
|
||||||
|
name: "Operation Titan",
|
||||||
|
baseDifficulty: 4000,
|
||||||
|
reqdRank: 10e3,
|
||||||
|
rankGain: 100,
|
||||||
|
rankLoss: 20,
|
||||||
|
hpLoss: 100,
|
||||||
|
weights: {
|
||||||
|
hack: 0.1,
|
||||||
|
str: 0.2,
|
||||||
|
def: 0.2,
|
||||||
|
dex: 0.2,
|
||||||
|
agi: 0.2,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.1,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0.6,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isKill: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Ares"] = new BlackOperation({
|
||||||
|
name: "Operation Ares",
|
||||||
|
baseDifficulty: 5000,
|
||||||
|
reqdRank: 12.5e3,
|
||||||
|
rankGain: 125,
|
||||||
|
rankLoss: 20,
|
||||||
|
hpLoss: 200,
|
||||||
|
weights: {
|
||||||
|
hack: 0,
|
||||||
|
str: 0.25,
|
||||||
|
def: 0.25,
|
||||||
|
dex: 0.25,
|
||||||
|
agi: 0.25,
|
||||||
|
cha: 0,
|
||||||
|
int: 0,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isKill: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Archangel"] = new BlackOperation({
|
||||||
|
name: "Operation Archangel",
|
||||||
|
baseDifficulty: 7500,
|
||||||
|
reqdRank: 15e3,
|
||||||
|
rankGain: 200,
|
||||||
|
rankLoss: 20,
|
||||||
|
hpLoss: 25,
|
||||||
|
weights: {
|
||||||
|
hack: 0,
|
||||||
|
str: 0.2,
|
||||||
|
def: 0.2,
|
||||||
|
dex: 0.3,
|
||||||
|
agi: 0.3,
|
||||||
|
cha: 0,
|
||||||
|
int: 0,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isKill: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Juggernaut"] = new BlackOperation({
|
||||||
|
name: "Operation Juggernaut",
|
||||||
|
baseDifficulty: 10e3,
|
||||||
|
reqdRank: 20e3,
|
||||||
|
rankGain: 300,
|
||||||
|
rankLoss: 40,
|
||||||
|
hpLoss: 300,
|
||||||
|
weights: {
|
||||||
|
hack: 0,
|
||||||
|
str: 0.25,
|
||||||
|
def: 0.25,
|
||||||
|
dex: 0.25,
|
||||||
|
agi: 0.25,
|
||||||
|
cha: 0,
|
||||||
|
int: 0,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isKill: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Red Dragon"] = new BlackOperation({
|
||||||
|
name: "Operation Red Dragon",
|
||||||
|
baseDifficulty: 12.5e3,
|
||||||
|
reqdRank: 25e3,
|
||||||
|
rankGain: 500,
|
||||||
|
rankLoss: 50,
|
||||||
|
hpLoss: 500,
|
||||||
|
weights: {
|
||||||
|
hack: 0.05,
|
||||||
|
str: 0.2,
|
||||||
|
def: 0.2,
|
||||||
|
dex: 0.25,
|
||||||
|
agi: 0.25,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.05,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0.6,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isKill: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation K"] = new BlackOperation({
|
||||||
|
name: "Operation K",
|
||||||
|
baseDifficulty: 15e3,
|
||||||
|
reqdRank: 30e3,
|
||||||
|
rankGain: 750,
|
||||||
|
rankLoss: 60,
|
||||||
|
hpLoss: 1000,
|
||||||
|
weights: {
|
||||||
|
hack: 0.05,
|
||||||
|
str: 0.2,
|
||||||
|
def: 0.2,
|
||||||
|
dex: 0.25,
|
||||||
|
agi: 0.25,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.05,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0.6,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isKill: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Deckard"] = new BlackOperation({
|
||||||
|
name: "Operation Deckard",
|
||||||
|
baseDifficulty: 20e3,
|
||||||
|
reqdRank: 40e3,
|
||||||
|
rankGain: 1e3,
|
||||||
|
rankLoss: 75,
|
||||||
|
hpLoss: 200,
|
||||||
|
weights: {
|
||||||
|
hack: 0,
|
||||||
|
str: 0.24,
|
||||||
|
def: 0.24,
|
||||||
|
dex: 0.24,
|
||||||
|
agi: 0.24,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.04,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isKill: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Tyrell"] = new BlackOperation({
|
||||||
|
name: "Operation Tyrell",
|
||||||
|
baseDifficulty: 25e3,
|
||||||
|
reqdRank: 50e3,
|
||||||
|
rankGain: 1.5e3,
|
||||||
|
rankLoss: 100,
|
||||||
|
hpLoss: 500,
|
||||||
|
weights: {
|
||||||
|
hack: 0.1,
|
||||||
|
str: 0.2,
|
||||||
|
def: 0.2,
|
||||||
|
dex: 0.2,
|
||||||
|
agi: 0.2,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.1,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0.6,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isKill: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Wallace"] = new BlackOperation({
|
||||||
|
name: "Operation Wallace",
|
||||||
|
baseDifficulty: 30e3,
|
||||||
|
reqdRank: 75e3,
|
||||||
|
rankGain: 2e3,
|
||||||
|
rankLoss: 150,
|
||||||
|
hpLoss: 1500,
|
||||||
|
weights: {
|
||||||
|
hack: 0,
|
||||||
|
str: 0.24,
|
||||||
|
def: 0.24,
|
||||||
|
dex: 0.24,
|
||||||
|
agi: 0.24,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.04,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0.6,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isKill: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Shoulder of Orion"] = new BlackOperation({
|
||||||
|
name: "Operation Shoulder of Orion",
|
||||||
|
baseDifficulty: 35e3,
|
||||||
|
reqdRank: 100e3,
|
||||||
|
rankGain: 2.5e3,
|
||||||
|
rankLoss: 500,
|
||||||
|
hpLoss: 1500,
|
||||||
|
weights: {
|
||||||
|
hack: 0.1,
|
||||||
|
str: 0.2,
|
||||||
|
def: 0.2,
|
||||||
|
dex: 0.2,
|
||||||
|
agi: 0.2,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.1,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0.6,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isStealth: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Hyron"] = new BlackOperation({
|
||||||
|
name: "Operation Hyron",
|
||||||
|
baseDifficulty: 40e3,
|
||||||
|
reqdRank: 125e3,
|
||||||
|
rankGain: 3e3,
|
||||||
|
rankLoss: 1e3,
|
||||||
|
hpLoss: 500,
|
||||||
|
weights: {
|
||||||
|
hack: 0.1,
|
||||||
|
str: 0.2,
|
||||||
|
def: 0.2,
|
||||||
|
dex: 0.2,
|
||||||
|
agi: 0.2,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.1,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0.6,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isKill: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Morpheus"] = new BlackOperation({
|
||||||
|
name: "Operation Morpheus",
|
||||||
|
baseDifficulty: 45e3,
|
||||||
|
reqdRank: 150e3,
|
||||||
|
rankGain: 4e3,
|
||||||
|
rankLoss: 1e3,
|
||||||
|
hpLoss: 100,
|
||||||
|
weights: {
|
||||||
|
hack: 0.05,
|
||||||
|
str: 0.15,
|
||||||
|
def: 0.15,
|
||||||
|
dex: 0.3,
|
||||||
|
agi: 0.3,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.05,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0.6,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isStealth: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Ion Storm"] = new BlackOperation({
|
||||||
|
name: "Operation Ion Storm",
|
||||||
|
baseDifficulty: 50e3,
|
||||||
|
reqdRank: 175e3,
|
||||||
|
rankGain: 5e3,
|
||||||
|
rankLoss: 1e3,
|
||||||
|
hpLoss: 5000,
|
||||||
|
weights: {
|
||||||
|
hack: 0,
|
||||||
|
str: 0.24,
|
||||||
|
def: 0.24,
|
||||||
|
dex: 0.24,
|
||||||
|
agi: 0.24,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.04,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0.6,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isKill: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Annihilus"] = new BlackOperation({
|
||||||
|
name: "Operation Annihilus",
|
||||||
|
baseDifficulty: 55e3,
|
||||||
|
reqdRank: 200e3,
|
||||||
|
rankGain: 7.5e3,
|
||||||
|
rankLoss: 1e3,
|
||||||
|
hpLoss: 10e3,
|
||||||
|
weights: {
|
||||||
|
hack: 0,
|
||||||
|
str: 0.24,
|
||||||
|
def: 0.24,
|
||||||
|
dex: 0.24,
|
||||||
|
agi: 0.24,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.04,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0.6,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isKill: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Ultron"] = new BlackOperation({
|
||||||
|
name: "Operation Ultron",
|
||||||
|
baseDifficulty: 60e3,
|
||||||
|
reqdRank: 250e3,
|
||||||
|
rankGain: 10e3,
|
||||||
|
rankLoss: 2e3,
|
||||||
|
hpLoss: 10e3,
|
||||||
|
weights: {
|
||||||
|
hack: 0.1,
|
||||||
|
str: 0.2,
|
||||||
|
def: 0.2,
|
||||||
|
dex: 0.2,
|
||||||
|
agi: 0.2,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.1,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0.6,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
isKill: true,
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Centurion"] = new BlackOperation({
|
||||||
|
name: "Operation Centurion",
|
||||||
|
baseDifficulty: 70e3,
|
||||||
|
reqdRank: 300e3,
|
||||||
|
rankGain: 15e3,
|
||||||
|
rankLoss: 5e3,
|
||||||
|
hpLoss: 10e3,
|
||||||
|
weights: {
|
||||||
|
hack: 0.1,
|
||||||
|
str: 0.2,
|
||||||
|
def: 0.2,
|
||||||
|
dex: 0.2,
|
||||||
|
agi: 0.2,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.1,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0.6,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Vindictus"] = new BlackOperation({
|
||||||
|
name: "Operation Vindictus",
|
||||||
|
baseDifficulty: 75e3,
|
||||||
|
reqdRank: 350e3,
|
||||||
|
rankGain: 20e3,
|
||||||
|
rankLoss: 20e3,
|
||||||
|
hpLoss: 20e3,
|
||||||
|
weights: {
|
||||||
|
hack: 0.1,
|
||||||
|
str: 0.2,
|
||||||
|
def: 0.2,
|
||||||
|
dex: 0.2,
|
||||||
|
agi: 0.2,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.1,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0.6,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
BlackOperations["Operation Daedalus"] = new BlackOperation({
|
||||||
|
name: "Operation Daedalus",
|
||||||
|
baseDifficulty: 80e3,
|
||||||
|
reqdRank: 400e3,
|
||||||
|
rankGain: 40e3,
|
||||||
|
rankLoss: 10e3,
|
||||||
|
hpLoss: 100e3,
|
||||||
|
weights: {
|
||||||
|
hack: 0.1,
|
||||||
|
str: 0.2,
|
||||||
|
def: 0.2,
|
||||||
|
dex: 0.2,
|
||||||
|
agi: 0.2,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.1,
|
||||||
|
},
|
||||||
|
decays: {
|
||||||
|
hack: 0.6,
|
||||||
|
str: 0.8,
|
||||||
|
def: 0.8,
|
||||||
|
dex: 0.8,
|
||||||
|
agi: 0.8,
|
||||||
|
cha: 0,
|
||||||
|
int: 0.75,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
})();
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Reviver, Generic_toJSON, Generic_fromJSON } from "../../utils/JSONReviver";
|
import { Reviver, Generic_toJSON, Generic_fromJSON } from "../utils/JSONReviver";
|
||||||
import { IBladeburner } from "./IBladeburner";
|
import { IBladeburner } from "./IBladeburner";
|
||||||
import { IActionIdentifier } from "./IActionIdentifier";
|
import { IActionIdentifier } from "./IActionIdentifier";
|
||||||
import { ActionIdentifier } from "./ActionIdentifier";
|
import { ActionIdentifier } from "./ActionIdentifier";
|
||||||
@@ -9,29 +9,28 @@ import { BlackOperation } from "./BlackOperation";
|
|||||||
import { Operation } from "./Operation";
|
import { Operation } from "./Operation";
|
||||||
import { Contract } from "./Contract";
|
import { Contract } from "./Contract";
|
||||||
import { GeneralActions } from "./GeneralActions";
|
import { GeneralActions } from "./GeneralActions";
|
||||||
import { formatNumber } from "../../utils/StringHelperFunctions";
|
import { formatNumber } from "../utils/StringHelperFunctions";
|
||||||
import { Skills } from "./Skills";
|
import { Skills } from "./Skills";
|
||||||
import { Skill } from "./Skill";
|
import { Skill } from "./Skill";
|
||||||
import { City } from "./City";
|
import { City } from "./City";
|
||||||
import { IAction } from "./IAction";
|
import { IAction } from "./IAction";
|
||||||
import { IPlayer } from "../PersonObjects/IPlayer";
|
import { IPlayer } from "../PersonObjects/IPlayer";
|
||||||
import { IRouter } from "../ui/Router";
|
import { IRouter, Page } from "../ui/Router";
|
||||||
import { ConsoleHelpText } from "./data/Help";
|
import { ConsoleHelpText } from "./data/Help";
|
||||||
import { exceptionAlert } from "../../utils/helpers/exceptionAlert";
|
import { exceptionAlert } from "../utils/helpers/exceptionAlert";
|
||||||
import { getRandomInt } from "../../utils/helpers/getRandomInt";
|
import { getRandomInt } from "../utils/helpers/getRandomInt";
|
||||||
import { BladeburnerConstants } from "./data/Constants";
|
import { BladeburnerConstants } from "./data/Constants";
|
||||||
import { numeralWrapper } from "../ui/numeralFormat";
|
import { numeralWrapper } from "../ui/numeralFormat";
|
||||||
import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers";
|
import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers";
|
||||||
import { addOffset } from "../../utils/helpers/addOffset";
|
import { addOffset } from "../utils/helpers/addOffset";
|
||||||
import { Faction } from "../Faction/Faction";
|
import { Faction } from "../Faction/Faction";
|
||||||
import { Factions, factionExists } from "../Faction/Factions";
|
import { Factions, factionExists } from "../Faction/Factions";
|
||||||
import { calculateHospitalizationCost } from "../Hospital/Hospital";
|
import { calculateHospitalizationCost } from "../Hospital/Hospital";
|
||||||
import { redPillFlag } from "../RedPill";
|
import { dialogBoxCreate } from "../ui/React/DialogBox";
|
||||||
import { dialogBoxCreate } from "../../utils/DialogBox";
|
|
||||||
import { Settings } from "../Settings/Settings";
|
import { Settings } from "../Settings/Settings";
|
||||||
import { Augmentations } from "../Augmentation/Augmentations";
|
import { Augmentations } from "../Augmentation/Augmentations";
|
||||||
import { AugmentationNames } from "../Augmentation/data/AugmentationNames";
|
import { AugmentationNames } from "../Augmentation/data/AugmentationNames";
|
||||||
import { getTimestamp } from "../../utils/helpers/getTimestamp";
|
import { getTimestamp } from "../utils/helpers/getTimestamp";
|
||||||
import { joinFaction } from "../Faction/FactionHelpers";
|
import { joinFaction } from "../Faction/FactionHelpers";
|
||||||
import { WorkerScript } from "../Netscript/WorkerScript";
|
import { WorkerScript } from "../Netscript/WorkerScript";
|
||||||
|
|
||||||
@@ -132,7 +131,7 @@ export class Bladeburner implements IBladeburner {
|
|||||||
return this.resetAction();
|
return this.resetAction();
|
||||||
}
|
}
|
||||||
this.actionTimeToComplete = action.getActionTime(this);
|
this.actionTimeToComplete = action.getActionTime(this);
|
||||||
} catch (e) {
|
} catch (e: any) {
|
||||||
exceptionAlert(e);
|
exceptionAlert(e);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -145,11 +144,11 @@ export class Bladeburner implements IBladeburner {
|
|||||||
if (action.count < 1) {
|
if (action.count < 1) {
|
||||||
return this.resetAction();
|
return this.resetAction();
|
||||||
}
|
}
|
||||||
if (actionId.name === "Raid" && this.getCurrentCity().commsEst === 0) {
|
if (actionId.name === "Raid" && this.getCurrentCity().comms === 0) {
|
||||||
return this.resetAction();
|
return this.resetAction();
|
||||||
}
|
}
|
||||||
this.actionTimeToComplete = action.getActionTime(this);
|
this.actionTimeToComplete = action.getActionTime(this);
|
||||||
} catch (e) {
|
} catch (e: any) {
|
||||||
exceptionAlert(e);
|
exceptionAlert(e);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -169,7 +168,7 @@ export class Bladeburner implements IBladeburner {
|
|||||||
throw new Error("Failed to get BlackOperation object for: " + actionId.name);
|
throw new Error("Failed to get BlackOperation object for: " + actionId.name);
|
||||||
}
|
}
|
||||||
this.actionTimeToComplete = action.getActionTime(this);
|
this.actionTimeToComplete = action.getActionTime(this);
|
||||||
} catch (e) {
|
} catch (e: any) {
|
||||||
exceptionAlert(e);
|
exceptionAlert(e);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -184,6 +183,7 @@ export class Bladeburner implements IBladeburner {
|
|||||||
break;
|
break;
|
||||||
case ActionTypes["Diplomacy"]:
|
case ActionTypes["Diplomacy"]:
|
||||||
case ActionTypes["Hyperbolic Regeneration Chamber"]:
|
case ActionTypes["Hyperbolic Regeneration Chamber"]:
|
||||||
|
case ActionTypes["Incite Violence"]:
|
||||||
this.actionTimeToComplete = 60;
|
this.actionTimeToComplete = 60;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -220,7 +220,7 @@ export class Bladeburner implements IBladeburner {
|
|||||||
for (let i = 0; i < arrayOfCommands.length; ++i) {
|
for (let i = 0; i < arrayOfCommands.length; ++i) {
|
||||||
this.executeConsoleCommand(player, arrayOfCommands[i]);
|
this.executeConsoleCommand(player, arrayOfCommands[i]);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e: any) {
|
||||||
exceptionAlert(e);
|
exceptionAlert(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -339,6 +339,10 @@ export class Bladeburner implements IBladeburner {
|
|||||||
action.type = ActionTypes["Hyperbolic Regeneration Chamber"];
|
action.type = ActionTypes["Hyperbolic Regeneration Chamber"];
|
||||||
action.name = "Hyperbolic Regeneration Chamber";
|
action.name = "Hyperbolic Regeneration Chamber";
|
||||||
break;
|
break;
|
||||||
|
case "incite violence":
|
||||||
|
action.type = ActionTypes["Incite Violence"];
|
||||||
|
action.name = "Incite Violence";
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -1088,9 +1092,6 @@ export class Bladeburner implements IBladeburner {
|
|||||||
case "Investigation":
|
case "Investigation":
|
||||||
if (success) {
|
if (success) {
|
||||||
city.improvePopulationEstimateByPercentage(0.4 * this.skillMultipliers.successChanceEstimate);
|
city.improvePopulationEstimateByPercentage(0.4 * this.skillMultipliers.successChanceEstimate);
|
||||||
if (Math.random() < 0.02 * this.skillMultipliers.successChanceEstimate) {
|
|
||||||
city.improveCommunityEstimate(1);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
this.triggerPotentialMigration(this.city, 0.1);
|
this.triggerPotentialMigration(this.city, 0.1);
|
||||||
}
|
}
|
||||||
@@ -1098,9 +1099,6 @@ export class Bladeburner implements IBladeburner {
|
|||||||
case "Undercover Operation":
|
case "Undercover Operation":
|
||||||
if (success) {
|
if (success) {
|
||||||
city.improvePopulationEstimateByPercentage(0.8 * this.skillMultipliers.successChanceEstimate);
|
city.improvePopulationEstimateByPercentage(0.8 * this.skillMultipliers.successChanceEstimate);
|
||||||
if (Math.random() < 0.02 * this.skillMultipliers.successChanceEstimate) {
|
|
||||||
city.improveCommunityEstimate(1);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
this.triggerPotentialMigration(this.city, 0.15);
|
this.triggerPotentialMigration(this.city, 0.15);
|
||||||
}
|
}
|
||||||
@@ -1121,7 +1119,6 @@ export class Bladeburner implements IBladeburner {
|
|||||||
nonZero: true,
|
nonZero: true,
|
||||||
});
|
});
|
||||||
--city.comms;
|
--city.comms;
|
||||||
--city.commsEst;
|
|
||||||
} else {
|
} else {
|
||||||
const change = getRandomInt(-10, -5) / 10;
|
const change = getRandomInt(-10, -5) / 10;
|
||||||
city.changePopulationByPercentage(change, {
|
city.changePopulationByPercentage(change, {
|
||||||
@@ -1174,6 +1171,8 @@ export class Bladeburner implements IBladeburner {
|
|||||||
return GeneralActions["Diplomacy"];
|
return GeneralActions["Diplomacy"];
|
||||||
case ActionTypes["Hyperbolic Regeneration Chamber"]:
|
case ActionTypes["Hyperbolic Regeneration Chamber"]:
|
||||||
return GeneralActions["Hyperbolic Regeneration Chamber"];
|
return GeneralActions["Hyperbolic Regeneration Chamber"];
|
||||||
|
case ActionTypes["Incite Violence"]:
|
||||||
|
return GeneralActions["Incite Violence"];
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -1298,7 +1297,7 @@ export class Bladeburner implements IBladeburner {
|
|||||||
action.level = action.maxLevel;
|
action.level = action.maxLevel;
|
||||||
} // Autolevel
|
} // Autolevel
|
||||||
this.startAction(player, this.action); // Repeat action
|
this.startAction(player, this.action); // Repeat action
|
||||||
} catch (e) {
|
} catch (e: any) {
|
||||||
exceptionAlert(e);
|
exceptionAlert(e);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1387,7 +1386,7 @@ export class Bladeburner implements IBladeburner {
|
|||||||
this.log("You lost " + formatNumber(losses, 0) + " team members during " + action.name);
|
this.log("You lost " + formatNumber(losses, 0) + " team members during " + action.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e: any) {
|
||||||
exceptionAlert(e);
|
exceptionAlert(e);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1500,6 +1499,25 @@ export class Bladeburner implements IBladeburner {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ActionTypes["Incite Violence"]: {
|
||||||
|
for (const contract of Object.keys(this.contracts)) {
|
||||||
|
const growthF = Growths[contract];
|
||||||
|
if (!growthF) throw new Error("trying to generate count for action that doesn't exist? " + contract);
|
||||||
|
this.contracts[contract].count += (60 * 6 * growthF()) / BladeburnerConstants.ActionCountGrowthPeriod;
|
||||||
|
}
|
||||||
|
for (const operation of Object.keys(this.operations)) {
|
||||||
|
const growthF = Growths[operation];
|
||||||
|
if (!growthF) throw new Error("trying to generate count for action that doesn't exist? " + operation);
|
||||||
|
this.operations[operation].count += (60 * 6 * growthF()) / BladeburnerConstants.ActionCountGrowthPeriod;
|
||||||
|
}
|
||||||
|
if (this.logging.general) {
|
||||||
|
this.log(`Incited violence in the synthoid communities.`);
|
||||||
|
}
|
||||||
|
const city = this.cities[this.city];
|
||||||
|
city.chaos *= (city.chaos + 100) * 2;
|
||||||
|
this.startAction(player, this.action);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
console.error(`Bladeburner.completeAction() called for invalid action: ${this.action.type}`);
|
console.error(`Bladeburner.completeAction() called for invalid action: ${this.action.type}`);
|
||||||
break;
|
break;
|
||||||
@@ -1586,11 +1604,6 @@ export class Bladeburner implements IBladeburner {
|
|||||||
create(): void {
|
create(): void {
|
||||||
this.contracts["Tracking"] = new Contract({
|
this.contracts["Tracking"] = new Contract({
|
||||||
name: "Tracking",
|
name: "Tracking",
|
||||||
desc:
|
|
||||||
"Identify and locate Synthoids. This contract involves reconnaissance " +
|
|
||||||
"and information-gathering ONLY. Do NOT engage. Stealth is of the utmost importance.<br><br>" +
|
|
||||||
"Successfully completing Tracking contracts will slightly improve your Synthoid population estimate for " +
|
|
||||||
"whatever city you are currently in.",
|
|
||||||
baseDifficulty: 125,
|
baseDifficulty: 125,
|
||||||
difficultyFac: 1.02,
|
difficultyFac: 1.02,
|
||||||
rewardFac: 1.041,
|
rewardFac: 1.041,
|
||||||
@@ -1619,10 +1632,6 @@ export class Bladeburner implements IBladeburner {
|
|||||||
});
|
});
|
||||||
this.contracts["Bounty Hunter"] = new Contract({
|
this.contracts["Bounty Hunter"] = new Contract({
|
||||||
name: "Bounty Hunter",
|
name: "Bounty Hunter",
|
||||||
desc:
|
|
||||||
"Hunt down and capture fugitive Synthoids. These Synthoids are wanted alive.<br><br>" +
|
|
||||||
"Successfully completing a Bounty Hunter contract will lower the population in your " +
|
|
||||||
"current city, and will also increase its chaos level.",
|
|
||||||
baseDifficulty: 250,
|
baseDifficulty: 250,
|
||||||
difficultyFac: 1.04,
|
difficultyFac: 1.04,
|
||||||
rewardFac: 1.085,
|
rewardFac: 1.085,
|
||||||
@@ -1651,10 +1660,6 @@ export class Bladeburner implements IBladeburner {
|
|||||||
});
|
});
|
||||||
this.contracts["Retirement"] = new Contract({
|
this.contracts["Retirement"] = new Contract({
|
||||||
name: "Retirement",
|
name: "Retirement",
|
||||||
desc:
|
|
||||||
"Hunt down and retire (kill) rogue Synthoids.<br><br>" +
|
|
||||||
"Successfully completing a Retirement contract will lower the population in your current " +
|
|
||||||
"city, and will also increase its chaos level.",
|
|
||||||
baseDifficulty: 200,
|
baseDifficulty: 200,
|
||||||
difficultyFac: 1.03,
|
difficultyFac: 1.03,
|
||||||
rewardFac: 1.065,
|
rewardFac: 1.065,
|
||||||
@@ -1684,12 +1689,6 @@ export class Bladeburner implements IBladeburner {
|
|||||||
|
|
||||||
this.operations["Investigation"] = new Operation({
|
this.operations["Investigation"] = new Operation({
|
||||||
name: "Investigation",
|
name: "Investigation",
|
||||||
desc:
|
|
||||||
"As a field agent, investigate and identify Synthoid " +
|
|
||||||
"populations, movements, and operations.<br><br>Successful " +
|
|
||||||
"Investigation ops will increase the accuracy of your " +
|
|
||||||
"synthoid data.<br><br>" +
|
|
||||||
"You will NOT lose HP from failed Investigation ops.",
|
|
||||||
baseDifficulty: 400,
|
baseDifficulty: 400,
|
||||||
difficultyFac: 1.03,
|
difficultyFac: 1.03,
|
||||||
rewardFac: 1.07,
|
rewardFac: 1.07,
|
||||||
@@ -1719,11 +1718,6 @@ export class Bladeburner implements IBladeburner {
|
|||||||
});
|
});
|
||||||
this.operations["Undercover Operation"] = new Operation({
|
this.operations["Undercover Operation"] = new Operation({
|
||||||
name: "Undercover Operation",
|
name: "Undercover Operation",
|
||||||
desc:
|
|
||||||
"Conduct undercover operations to identify hidden " +
|
|
||||||
"and underground Synthoid communities and organizations.<br><br>" +
|
|
||||||
"Successful Undercover ops will increase the accuracy of your synthoid " +
|
|
||||||
"data.",
|
|
||||||
baseDifficulty: 500,
|
baseDifficulty: 500,
|
||||||
difficultyFac: 1.04,
|
difficultyFac: 1.04,
|
||||||
rewardFac: 1.09,
|
rewardFac: 1.09,
|
||||||
@@ -1754,7 +1748,6 @@ export class Bladeburner implements IBladeburner {
|
|||||||
});
|
});
|
||||||
this.operations["Sting Operation"] = new Operation({
|
this.operations["Sting Operation"] = new Operation({
|
||||||
name: "Sting Operation",
|
name: "Sting Operation",
|
||||||
desc: "Conduct a sting operation to bait and capture particularly " + "notorious Synthoid criminals.",
|
|
||||||
baseDifficulty: 650,
|
baseDifficulty: 650,
|
||||||
difficultyFac: 1.04,
|
difficultyFac: 1.04,
|
||||||
rewardFac: 1.095,
|
rewardFac: 1.095,
|
||||||
@@ -1785,10 +1778,6 @@ export class Bladeburner implements IBladeburner {
|
|||||||
});
|
});
|
||||||
this.operations["Raid"] = new Operation({
|
this.operations["Raid"] = new Operation({
|
||||||
name: "Raid",
|
name: "Raid",
|
||||||
desc:
|
|
||||||
"Lead an assault on a known Synthoid community. Note that " +
|
|
||||||
"there must be an existing Synthoid community in your current city " +
|
|
||||||
"in order for this Operation to be successful.",
|
|
||||||
baseDifficulty: 800,
|
baseDifficulty: 800,
|
||||||
difficultyFac: 1.045,
|
difficultyFac: 1.045,
|
||||||
rewardFac: 1.1,
|
rewardFac: 1.1,
|
||||||
@@ -1819,10 +1808,6 @@ export class Bladeburner implements IBladeburner {
|
|||||||
});
|
});
|
||||||
this.operations["Stealth Retirement Operation"] = new Operation({
|
this.operations["Stealth Retirement Operation"] = new Operation({
|
||||||
name: "Stealth Retirement Operation",
|
name: "Stealth Retirement Operation",
|
||||||
desc:
|
|
||||||
"Lead a covert operation to retire Synthoids. The " +
|
|
||||||
"objective is to complete the task without " +
|
|
||||||
"drawing any attention. Stealth and discretion are key.",
|
|
||||||
baseDifficulty: 1000,
|
baseDifficulty: 1000,
|
||||||
difficultyFac: 1.05,
|
difficultyFac: 1.05,
|
||||||
rewardFac: 1.11,
|
rewardFac: 1.11,
|
||||||
@@ -1854,10 +1839,6 @@ export class Bladeburner implements IBladeburner {
|
|||||||
});
|
});
|
||||||
this.operations["Assassination"] = new Operation({
|
this.operations["Assassination"] = new Operation({
|
||||||
name: "Assassination",
|
name: "Assassination",
|
||||||
desc:
|
|
||||||
"Assassinate Synthoids that have been identified as " +
|
|
||||||
"important, high-profile social and political leaders " +
|
|
||||||
"in the Synthoid communities.",
|
|
||||||
baseDifficulty: 1500,
|
baseDifficulty: 1500,
|
||||||
difficultyFac: 1.06,
|
difficultyFac: 1.06,
|
||||||
rewardFac: 1.14,
|
rewardFac: 1.14,
|
||||||
@@ -1891,7 +1872,7 @@ export class Bladeburner implements IBladeburner {
|
|||||||
|
|
||||||
process(router: IRouter, player: IPlayer): void {
|
process(router: IRouter, player: IPlayer): void {
|
||||||
// Edge case condition...if Operation Daedalus is complete trigger the BitNode
|
// Edge case condition...if Operation Daedalus is complete trigger the BitNode
|
||||||
if (redPillFlag === false && this.blackops.hasOwnProperty("Operation Daedalus")) {
|
if (router.page() !== Page.BitVerse && this.blackops.hasOwnProperty("Operation Daedalus")) {
|
||||||
return router.toBitVerse(false, false);
|
return router.toBitVerse(false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1900,7 +1881,7 @@ export class Bladeburner implements IBladeburner {
|
|||||||
if (this.action.type !== ActionTypes["Idle"]) {
|
if (this.action.type !== ActionTypes["Idle"]) {
|
||||||
let msg = "Your Bladeburner action was cancelled because you started doing something else.";
|
let msg = "Your Bladeburner action was cancelled because you started doing something else.";
|
||||||
if (this.automateEnabled) {
|
if (this.automateEnabled) {
|
||||||
msg += `<br><br>Your automation was disabled as well. You will have to re-enable it through the Bladeburner console`;
|
msg += `<br /><br />Your automation was disabled as well. You will have to re-enable it through the Bladeburner console`;
|
||||||
this.automateEnabled = false;
|
this.automateEnabled = false;
|
||||||
}
|
}
|
||||||
if (!Settings.SuppressBladeburnerPopup) {
|
if (!Settings.SuppressBladeburnerPopup) {
|
||||||
@@ -1997,6 +1978,19 @@ export class Bladeburner implements IBladeburner {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const gen = [
|
||||||
|
"Training",
|
||||||
|
"Recruitment",
|
||||||
|
"FieldAnalysis",
|
||||||
|
"Field Analysis",
|
||||||
|
"Diplomacy",
|
||||||
|
"Hyperbolic Regeneration Chamber",
|
||||||
|
"Incite Violence",
|
||||||
|
];
|
||||||
|
if (gen.includes(res.type)) {
|
||||||
|
res.type = "General";
|
||||||
|
}
|
||||||
|
|
||||||
if (res.type == null) {
|
if (res.type == null) {
|
||||||
res.type = "Idle";
|
res.type = "Idle";
|
||||||
}
|
}
|
||||||
@@ -2081,7 +2075,7 @@ export class Bladeburner implements IBladeburner {
|
|||||||
this.startAction(player, actionId);
|
this.startAction(player, actionId);
|
||||||
workerScript.log("bladeburner.startAction", `Starting bladeburner action with type '${type}' and name ${name}"`);
|
workerScript.log("bladeburner.startAction", `Starting bladeburner action with type '${type}' and name ${name}"`);
|
||||||
return true;
|
return true;
|
||||||
} catch (e) {
|
} catch (e: any) {
|
||||||
this.resetAction();
|
this.resetAction();
|
||||||
workerScript.log("bladeburner.startAction", errorLogText);
|
workerScript.log("bladeburner.startAction", errorLogText);
|
||||||
return false;
|
return false;
|
||||||
@@ -2116,6 +2110,7 @@ export class Bladeburner implements IBladeburner {
|
|||||||
return this.getRecruitmentTime(player);
|
return this.getRecruitmentTime(player);
|
||||||
case ActionTypes["Diplomacy"]:
|
case ActionTypes["Diplomacy"]:
|
||||||
case ActionTypes["Hyperbolic Regeneration Chamber"]:
|
case ActionTypes["Hyperbolic Regeneration Chamber"]:
|
||||||
|
case ActionTypes["Incite Violence"]:
|
||||||
return 60;
|
return 60;
|
||||||
default:
|
default:
|
||||||
workerScript.log("bladeburner.getActionTime", errorLogText);
|
workerScript.log("bladeburner.getActionTime", errorLogText);
|
||||||
@@ -2153,6 +2148,7 @@ export class Bladeburner implements IBladeburner {
|
|||||||
case ActionTypes["FieldAnalysis"]:
|
case ActionTypes["FieldAnalysis"]:
|
||||||
case ActionTypes["Diplomacy"]:
|
case ActionTypes["Diplomacy"]:
|
||||||
case ActionTypes["Hyperbolic Regeneration Chamber"]:
|
case ActionTypes["Hyperbolic Regeneration Chamber"]:
|
||||||
|
case ActionTypes["Incite Violence"]:
|
||||||
return [1, 1];
|
return [1, 1];
|
||||||
case ActionTypes["Recruitment"]: {
|
case ActionTypes["Recruitment"]: {
|
||||||
const recChance = this.getRecruitmentSuccessChance(player);
|
const recChance = this.getRecruitmentSuccessChance(player);
|
||||||
@@ -2195,6 +2191,7 @@ export class Bladeburner implements IBladeburner {
|
|||||||
case ActionTypes["FieldAnalysis"]:
|
case ActionTypes["FieldAnalysis"]:
|
||||||
case ActionTypes["Diplomacy"]:
|
case ActionTypes["Diplomacy"]:
|
||||||
case ActionTypes["Hyperbolic Regeneration Chamber"]:
|
case ActionTypes["Hyperbolic Regeneration Chamber"]:
|
||||||
|
case ActionTypes["Incite Violence"]:
|
||||||
return Infinity;
|
return Infinity;
|
||||||
default:
|
default:
|
||||||
workerScript.log("bladeburner.getActionCountRemaining", errorLogText);
|
workerScript.log("bladeburner.getActionCountRemaining", errorLogText);
|
||||||
+3
-27
@@ -1,7 +1,7 @@
|
|||||||
import { BladeburnerConstants } from "./data/Constants";
|
import { BladeburnerConstants } from "./data/Constants";
|
||||||
import { getRandomInt } from "../../utils/helpers/getRandomInt";
|
import { getRandomInt } from "../utils/helpers/getRandomInt";
|
||||||
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver";
|
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../utils/JSONReviver";
|
||||||
import { addOffset } from "../../utils/helpers/addOffset";
|
import { addOffset } from "../utils/helpers/addOffset";
|
||||||
|
|
||||||
interface IChangePopulationByCountParams {
|
interface IChangePopulationByCountParams {
|
||||||
estChange: number;
|
estChange: number;
|
||||||
@@ -34,11 +34,6 @@ export class City {
|
|||||||
*/
|
*/
|
||||||
comms = 0;
|
comms = 0;
|
||||||
|
|
||||||
/**
|
|
||||||
* Estimated number of communities in the city.
|
|
||||||
*/
|
|
||||||
commsEst = 0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Chaos level of the city.
|
* Chaos level of the city.
|
||||||
*/
|
*/
|
||||||
@@ -53,8 +48,6 @@ export class City {
|
|||||||
|
|
||||||
// Number of Synthoid communities population and estimate
|
// Number of Synthoid communities population and estimate
|
||||||
this.comms = getRandomInt(5, 150);
|
this.comms = getRandomInt(5, 150);
|
||||||
this.commsEst = this.comms + getRandomInt(-5, 5);
|
|
||||||
if (this.commsEst < 0) this.commsEst = 0;
|
|
||||||
this.chaos = 0;
|
this.chaos = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,23 +106,6 @@ export class City {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
improveCommunityEstimate(n = 1): void {
|
|
||||||
if (isNaN(n)) {
|
|
||||||
throw new Error("NaN passed into City.improveCommunityEstimate()");
|
|
||||||
}
|
|
||||||
if (this.commsEst < this.comms) {
|
|
||||||
this.commsEst += n;
|
|
||||||
if (this.commsEst > this.comms) {
|
|
||||||
this.commsEst = this.comms;
|
|
||||||
}
|
|
||||||
} else if (this.commsEst > this.comms) {
|
|
||||||
this.commsEst -= n;
|
|
||||||
if (this.commsEst < this.comms) {
|
|
||||||
this.commsEst = this.comms;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @params options:
|
* @params options:
|
||||||
* estChange(int): How much the estimate should change by
|
* estChange(int): How much the estimate should change by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { IBladeburner } from "./IBladeburner";
|
import { IBladeburner } from "./IBladeburner";
|
||||||
import { Action, IActionParams } from "./Action";
|
import { Action, IActionParams } from "./Action";
|
||||||
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver";
|
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../utils/JSONReviver";
|
||||||
|
|
||||||
export class Contract extends Action {
|
export class Contract extends Action {
|
||||||
constructor(params: IActionParams | null = null) {
|
constructor(params: IActionParams | null = null) {
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
import { Action } from "./Action";
|
|
||||||
import { IMap } from "../types";
|
|
||||||
|
|
||||||
export const GeneralActions: IMap<Action> = {};
|
|
||||||
|
|
||||||
(function () {
|
|
||||||
// General Actions
|
|
||||||
let actionName;
|
|
||||||
actionName = "Training";
|
|
||||||
GeneralActions[actionName] = new Action({
|
|
||||||
name: actionName,
|
|
||||||
desc:
|
|
||||||
"Improve your abilities at the Bladeburner unit's specialized training " +
|
|
||||||
"center. Doing this gives experience for all combat stats and also " +
|
|
||||||
"increases your max stamina.",
|
|
||||||
});
|
|
||||||
|
|
||||||
actionName = "Field Analysis";
|
|
||||||
GeneralActions[actionName] = new Action({
|
|
||||||
name: actionName,
|
|
||||||
desc:
|
|
||||||
"Mine and analyze Synthoid-related data. This improves the " +
|
|
||||||
"Bladeburner's unit intelligence on Synthoid locations and " +
|
|
||||||
"activities. Completing this action will improve the accuracy " +
|
|
||||||
"of your Synthoid population estimated in the current city.<br><br>" +
|
|
||||||
"Does NOT require stamina.",
|
|
||||||
});
|
|
||||||
|
|
||||||
actionName = "Recruitment";
|
|
||||||
GeneralActions[actionName] = new Action({
|
|
||||||
name: actionName,
|
|
||||||
desc:
|
|
||||||
"Attempt to recruit members for your Bladeburner team. These members " +
|
|
||||||
"can help you conduct operations.<br><br>" +
|
|
||||||
"Does NOT require stamina.",
|
|
||||||
});
|
|
||||||
|
|
||||||
actionName = "Diplomacy";
|
|
||||||
GeneralActions[actionName] = new Action({
|
|
||||||
name: actionName,
|
|
||||||
desc:
|
|
||||||
"Improve diplomatic relations with the Synthoid population. " +
|
|
||||||
"Completing this action will reduce the Chaos level in your current city.<br><br>" +
|
|
||||||
"Does NOT require stamina.",
|
|
||||||
});
|
|
||||||
|
|
||||||
actionName = "Hyperbolic Regeneration Chamber";
|
|
||||||
GeneralActions[actionName] = new Action({
|
|
||||||
name: actionName,
|
|
||||||
desc:
|
|
||||||
"Enter cryogenic stasis using the Bladeburner division's hi-tech Regeneration Chamber. " +
|
|
||||||
"This will slowly heal your wounds and slightly increase your stamina.<br><br>",
|
|
||||||
});
|
|
||||||
})();
|
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
import { Action } from "./Action";
|
||||||
|
import { IMap } from "../types";
|
||||||
|
|
||||||
|
export const GeneralActions: IMap<Action> = {};
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
// General Actions
|
||||||
|
let actionName;
|
||||||
|
actionName = "Training";
|
||||||
|
GeneralActions[actionName] = new Action({
|
||||||
|
name: actionName,
|
||||||
|
});
|
||||||
|
|
||||||
|
actionName = "Field Analysis";
|
||||||
|
GeneralActions[actionName] = new Action({
|
||||||
|
name: actionName,
|
||||||
|
});
|
||||||
|
|
||||||
|
actionName = "Recruitment";
|
||||||
|
GeneralActions[actionName] = new Action({
|
||||||
|
name: actionName,
|
||||||
|
});
|
||||||
|
|
||||||
|
actionName = "Diplomacy";
|
||||||
|
GeneralActions[actionName] = new Action({
|
||||||
|
name: actionName,
|
||||||
|
});
|
||||||
|
|
||||||
|
actionName = "Hyperbolic Regeneration Chamber";
|
||||||
|
GeneralActions[actionName] = new Action({
|
||||||
|
name: actionName,
|
||||||
|
});
|
||||||
|
actionName = "Incite Violence";
|
||||||
|
GeneralActions[actionName] = new Action({
|
||||||
|
name: actionName,
|
||||||
|
});
|
||||||
|
})();
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { IBladeburner } from "./IBladeburner";
|
import { IBladeburner } from "./IBladeburner";
|
||||||
|
|
||||||
export interface IStatsMultiplier {
|
interface IStatsMultiplier {
|
||||||
[key: string]: number;
|
[key: string]: number;
|
||||||
|
|
||||||
hack: number;
|
hack: number;
|
||||||
@@ -18,7 +18,6 @@ export interface ISuccessChanceParams {
|
|||||||
|
|
||||||
export interface IAction {
|
export interface IAction {
|
||||||
name: string;
|
name: string;
|
||||||
desc: string;
|
|
||||||
|
|
||||||
// Difficulty scales with level. See getDifficulty() method
|
// Difficulty scales with level. See getDifficulty() method
|
||||||
level: number;
|
level: number;
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import { IBladeburner } from "./IBladeburner";
|
import { IBladeburner } from "./IBladeburner";
|
||||||
import { BladeburnerConstants } from "./data/Constants";
|
import { BladeburnerConstants } from "./data/Constants";
|
||||||
import { Action, IActionParams } from "./Action";
|
import { Action, IActionParams } from "./Action";
|
||||||
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver";
|
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../utils/JSONReviver";
|
||||||
|
|
||||||
export interface IOperationParams extends IActionParams {
|
export interface IOperationParams extends IActionParams {
|
||||||
reqdRank?: number;
|
reqdRank?: number;
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ export const ActionTypes: {
|
|||||||
"Field Analysis": number;
|
"Field Analysis": number;
|
||||||
Diplomacy: number;
|
Diplomacy: number;
|
||||||
"Hyperbolic Regeneration Chamber": number;
|
"Hyperbolic Regeneration Chamber": number;
|
||||||
|
"Incite Violence": number;
|
||||||
} = {
|
} = {
|
||||||
Idle: 1,
|
Idle: 1,
|
||||||
Contract: 2,
|
Contract: 2,
|
||||||
@@ -24,4 +25,5 @@ export const ActionTypes: {
|
|||||||
"Field Analysis": 7,
|
"Field Analysis": 7,
|
||||||
Diplomacy: 8,
|
Diplomacy: 8,
|
||||||
"Hyperbolic Regeneration Chamber": 9,
|
"Hyperbolic Regeneration Chamber": 9,
|
||||||
|
"Incite Violence": 10,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,299 @@
|
|||||||
|
import React from "react";
|
||||||
|
|
||||||
|
interface IBlackOp {
|
||||||
|
desc: JSX.Element;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const BlackOperations: {
|
||||||
|
[key: string]: IBlackOp | undefined;
|
||||||
|
} = {
|
||||||
|
"Operation Typhoon": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Obadiah Zenyatta is the leader of a RedWater PMC. It has long been known among the intelligence community that
|
||||||
|
Zenyatta, along with the rest of the PMC, is a Synthoid.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
The goal of Operation Typhoon is to find and eliminate Zenyatta and RedWater by any means necessary. After the
|
||||||
|
task is completed, the actions must be covered up from the general public.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
"Operation Zero": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
AeroCorp is one of the world's largest defense contractors. Its leader, Steve Watataki, is thought to be a
|
||||||
|
supporter of Synthoid rights. He must be removed.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
The goal of Operation Zero is to covertly infiltrate AeroCorp and uncover any incriminating evidence or
|
||||||
|
information against Watataki that will cause him to be removed from his position at AeroCorp. Incriminating
|
||||||
|
evidence can be fabricated as a last resort. Be warned that AeroCorp has some of the most advanced security
|
||||||
|
measures in the world.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation X": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
We have recently discovered an underground publication group called Samizdat. Even though most of their
|
||||||
|
publications are nonsensical conspiracy theories, the average human is gullible enough to believe them. Many of
|
||||||
|
their works discuss Synthoids and pose a threat to society. The publications are spreading rapidly in China and
|
||||||
|
other Eastern countries.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Samizdat has done a good job of keeping hidden and anonymous. However, we've just received intelligence that
|
||||||
|
their base of operations is in Ishima's underground sewer systems. Your task is to investigate the sewer
|
||||||
|
systems, and eliminate Samizdat. They must never publish anything again.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation Titan": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Several months ago Titan Laboratories' Bioengineering department was infiltrated by Synthoids. As far as we
|
||||||
|
know, Titan Laboratories' management has no knowledge about this. We don't know what the Synthoids are up to,
|
||||||
|
but the research that they could be conducting using Titan Laboraties' vast resources is potentially very
|
||||||
|
dangerous.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Your goal is to enter and destroy the Bioengineering department's facility in Aevum. The task is not just to
|
||||||
|
retire the Synthoids there, but also to destroy any information or research at the facility that is relevant to
|
||||||
|
the Synthoids and their goals.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation Ares": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
One of our undercover agents, Agent Carter, has informed us of a massive weapons deal going down in Dubai
|
||||||
|
between rogue Russian militants and a radical Synthoid community. These weapons are next-gen plasma and energy
|
||||||
|
weapons. It is critical for the safety of humanity that this deal does not happen.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Your task is to intercept the deal. Leave no survivors.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation Archangel": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Our analysts have discovered that the popular Red Rabbit brothel in Amsterdam is run and 'staffed' by MK-VI
|
||||||
|
Synthoids. Intelligence suggests that the profit from this brothel is used to fund a large black market arms
|
||||||
|
trafficking operation.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
The goal of this operation is to take out the leaders that are running the Red Rabbit brothel. Try to limit the
|
||||||
|
number of other casualties, but do what you must to complete the mission.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation Juggernaut": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
The CIA has just encountered a new security threat. A new criminal group, lead by a shadowy operative who calls
|
||||||
|
himself Juggernaut, has been smuggling drugs and weapons (including suspected bioweapons) into Sector-12. We
|
||||||
|
also have reason to believe the tried to break into one of Universal Energy's facilities in order to cause a
|
||||||
|
city-wide blackout. The CIA suspects that Juggernaut is a heavily-augmented Synthoid, and have thus enlisted our
|
||||||
|
help.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Your mission is to eradicate Juggernaut and his followers.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation Red Dragon": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
The Tetrads criminal organization is suspected of reverse-engineering the MK-VI Synthoid design. We believe they
|
||||||
|
altered and possibly improved the design and began manufacturing their own Synthoid models in order to bolster
|
||||||
|
their criminal activities.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Your task is to infiltrate and destroy the Tetrads' base of operations in Los Angeles. Intelligence tells us
|
||||||
|
that their base houses one of their Synthoid manufacturing units.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation K": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
CODE RED SITUATION. Our intelligence tells us that VitaLife has discovered a new android cloning technology.
|
||||||
|
This technology is supposedly capable of cloning Synthoid, not only physically but also their advanced AI
|
||||||
|
modules. We do not believe that VitaLife is trying to use this technology illegally or maliciously, but if any
|
||||||
|
Synthoids were able to infiltrate the corporation and take advantage of this technology then the results would
|
||||||
|
be catastrophic.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
We do not have the power or jurisdiction to shutdown this down through legal or political means, so we must
|
||||||
|
resort to a covert operation. Your goal is to destroy this technology and eliminate anyone who was involved in
|
||||||
|
its creation.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation Deckard": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Despite your success in eliminating VitaLife's new android-replicating technology in Operation K, we've
|
||||||
|
discovered that a small group of MK-VI Synthoids were able to make off with the schematics and design of the
|
||||||
|
technology before the Operation. It is almost a certainty that these Synthoids are some of the rogue MK-VI ones
|
||||||
|
from the Synthoid Uprising.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
The goal of Operation Deckard is to hunt down these Synthoids and retire them. I don't need to tell you how
|
||||||
|
critical this mission is.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation Tyrell": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
A week ago Blade Industries reported a small break-in at one of their Aevum Augmentation storage facitilities.
|
||||||
|
We figured out that The Dark Army was behind the heist, and didn't think any more of it. However, we've just
|
||||||
|
discovered that several known MK-VI Synthoids were part of that break-in group.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
We cannot have Synthoids upgrading their already-enhanced abilities with Augmentations. Your task is to hunt
|
||||||
|
down the associated Dark Army members and eliminate them.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation Wallace": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Based on information gathered from Operation Tyrell, we've discovered that The Dark Army was well aware that
|
||||||
|
there were Synthoids amongst their ranks. Even worse, we believe that The Dark Army is working together with
|
||||||
|
other criminal organizations such as The Syndicate and that they are planning some sort of large-scale takeover
|
||||||
|
of multiple major cities, most notably Aevum. We suspect that Synthoids have infiltrated the ranks of these
|
||||||
|
criminal factions and are trying to stage another Synthoid uprising.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
The best way to deal with this is to prevent it before it even happens. The goal of Operation Wallace is to
|
||||||
|
destroy the Dark Army and Syndicate factions in Aevum immediately. Leave no survivors.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation Shoulder of Orion": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
China's Solaris Space Systems is secretly launching the first manned spacecraft in over a decade using
|
||||||
|
Synthoids. We believe China is trying to establish the first off-world colonies.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
The mission is to prevent this launch without instigating an international conflict. When you accept this
|
||||||
|
mission you will be officially disavowed by the NSA and the national government until after you successfully
|
||||||
|
return. In the event of failure, all of the operation's team members must not let themselves be captured alive.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation Hyron": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Our intelligence tells us that Fulcrum Technologies is developing a quantum supercomputer using human brains as
|
||||||
|
core processors. This supercomputer is rumored to be able to store vast amounts of data and perform computations
|
||||||
|
unmatched by any other supercomputer on the planet. But more importantly, the use of organic human brains means
|
||||||
|
that the supercomputer may be able to reason abstractly and become self-aware.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
I do not need to remind you why sentient-level AIs pose a serious threat to all of mankind.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
The research for this project is being conducted at one of Fulcrum Technologies secret facilities in Aevum,
|
||||||
|
codenamed 'Alpha Ranch'. Infiltrate the compound, delete and destroy the work, and then find and kill the
|
||||||
|
project lead.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation Morpheus": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
DreamSense Technologies is an advertising company that uses special technology to transmit their ads into the
|
||||||
|
peoples dreams and subconcious. They do this using broadcast transmitter towers. Based on information from our
|
||||||
|
agents and informants in Chonqging, we have reason to believe that one of the broadcast towers there has been
|
||||||
|
compromised by Synthoids and is being used to spread pro-Synthoid propaganda.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
The mission is to destroy this broadcast tower. Speed and stealth are of the upmost important for this.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation Ion Storm": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Our analysts have uncovered a gathering of MK-VI Synthoids that have taken up residence in the Sector-12 Slums.
|
||||||
|
We don't know if they are rogue Synthoids from the Uprising, but we do know that they have been stockpiling
|
||||||
|
weapons, money, and other resources. This makes them dangerous.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
This is a full-scale assault operation to find and retire all of these Synthoids in the Sector-12 Slums.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation Annihilus": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Our superiors have ordered us to eradicate everything and everyone in an underground facility located in Aevum.
|
||||||
|
They tell us that the facility houses many dangerous Synthoids and belongs to a terrorist organization called
|
||||||
|
'The Covenant'. We have no prior intelligence about this organization, so you are going in blind.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation Ultron": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
OmniTek Incorporated, the original designer and manufacturer of Synthoids, has notified us of a malfunction in
|
||||||
|
their AI design. This malfunction, when triggered, causes MK-VI Synthoids to become radicalized and seek out the
|
||||||
|
destruction of humanity. They say that this bug affects all MK-VI Synthoids, not just the rogue ones from the
|
||||||
|
Uprising.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
OmniTek has also told us they they believe someone has triggered this malfunction in a large group of MK-VI
|
||||||
|
Synthoids, and that these newly-radicalized Synthoids are now amassing in Volhaven to form a terrorist group
|
||||||
|
called Ultron.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Intelligence suggests Ultron is heavily armed and that their members are augmented. We believe Ultron is making
|
||||||
|
moves to take control of and weaponize DeltaOne's Tactical High-Energy Satellite Laser Array (THESLA).
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Your task is to find and destroy Ultron.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation Centurion": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
{"D)@#)($M)C0293c40($*)@#D0JUMP3Rm0C<*@#)*$)#02c94830c(#$*D)"}
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Throughout all of humanity's history, we have relied on technology to survive, conquer, and progress. Its
|
||||||
|
advancement became our primary goal. And at the peak of human civilization technology turned into power. Global,
|
||||||
|
absolute power.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
It seems that the universe is not without a sense of irony.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
{"D)@#)($M)C0293c40($*)@#D0JUMP3Rm0C<*@#)*$)#02c94830c(#$*D)"}
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation Vindictus": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
{"D)@#)($M)C0293c40($*)@#D0JUMP3Rm0C<*@#)*$)#02c94830c(#$*D)"}
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
The bits are all around us. The daemons that hold the Node together can manifest themselves in many different
|
||||||
|
ways.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
{"D)@#)($M)C0293c40($*)@#D0JUMP3Rm0C<*@#)*$)#02c94830c(#$*D)"}
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Operation Daedalus": {
|
||||||
|
desc: <> Yesterday we obeyed kings and bent our neck to emperors. Today we kneel only to truth.</>,
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
import React from "react";
|
||||||
|
|
||||||
|
interface IContract {
|
||||||
|
desc: JSX.Element;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Contracts: {
|
||||||
|
[key: string]: IContract | undefined;
|
||||||
|
} = {
|
||||||
|
Tracking: {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Identify and locate Synthoids. This contract involves reconnaissance and information-gathering ONLY. Do NOT
|
||||||
|
engage. Stealth is of the utmost importance.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Successfully completing Tracking contracts will slightly improve your Synthoid population estimate for whatever
|
||||||
|
city you are currently in.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Bounty Hunter": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Hunt down and capture fugitive Synthoids. These Synthoids are wanted alive.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Successfully completing a Bounty Hunter contract will lower the population in your current city, and will also
|
||||||
|
increase its chaos level.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
Retirement: {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Hunt down and retire (kill) rogue Synthoids.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Successfully completing a Retirement contract will lower the population in your current city, and will also
|
||||||
|
increase its chaos level.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
import React from "react";
|
||||||
|
|
||||||
|
interface IContract {
|
||||||
|
desc: JSX.Element;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const GeneralActions: {
|
||||||
|
[key: string]: IContract | undefined;
|
||||||
|
} = {
|
||||||
|
Training: {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Improve your abilities at the Bladeburner unit's specialized training center. Doing this gives experience for
|
||||||
|
all combat stats and also increases your max stamina.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
"Field Analysis": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Mine and analyze Synthoid-related data. This improves the Bladeburner's unit intelligence on Synthoid locations
|
||||||
|
and activities. Completing this action will improve the accuracy of your Synthoid population estimated in the
|
||||||
|
current city.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Does NOT require stamina.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
Recruitment: {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Attempt to recruit members for your Bladeburner team. These members can help you conduct operations.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Does NOT require stamina.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
Diplomacy: {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Improve diplomatic relations with the Synthoid population. Completing this action will reduce the Chaos level in
|
||||||
|
your current city.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Does NOT require stamina.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
"Hyperbolic Regeneration Chamber": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Enter cryogenic stasis using the Bladeburner division's hi-tech Regeneration Chamber. This will slowly heal your
|
||||||
|
wounds and slightly increase your stamina.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Incite Violence": {
|
||||||
|
desc: <>Purposefully stir trouble in the synthoid community in order to gain a political edge.</>,
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { getRandomInt } from "../../../utils/helpers/getRandomInt";
|
import { getRandomInt } from "../../utils/helpers/getRandomInt";
|
||||||
|
|
||||||
export const Growths: {
|
export const Growths: {
|
||||||
[key: string]: (() => number) | undefined;
|
[key: string]: (() => number) | undefined;
|
||||||
@@ -12,13 +12,13 @@ export const Growths: {
|
|||||||
["Stealth Retirement Operation"]: () => number;
|
["Stealth Retirement Operation"]: () => number;
|
||||||
["Assassination"]: () => number;
|
["Assassination"]: () => number;
|
||||||
} = {
|
} = {
|
||||||
Tracking: () => getRandomInt(5, 75) / 10,
|
Tracking: () => getRandomInt(5, 75) / 20,
|
||||||
"Bounty Hunter": () => getRandomInt(5, 75) / 10,
|
"Bounty Hunter": () => getRandomInt(5, 75) / 20,
|
||||||
Retirement: () => getRandomInt(5, 75) / 10,
|
Retirement: () => getRandomInt(5, 75) / 20,
|
||||||
Investigation: () => getRandomInt(10, 40) / 10,
|
Investigation: () => getRandomInt(10, 40) / 20,
|
||||||
"Undercover Operation": () => getRandomInt(10, 40) / 10,
|
"Undercover Operation": () => getRandomInt(10, 40) / 20,
|
||||||
"Sting Operation": () => getRandomInt(3, 40) / 10,
|
"Sting Operation": () => getRandomInt(3, 40) / 20,
|
||||||
Raid: () => getRandomInt(2, 40) / 10,
|
Raid: () => getRandomInt(2, 40) / 20,
|
||||||
"Stealth Retirement Operation": () => getRandomInt(1, 20) / 10,
|
"Stealth Retirement Operation": () => getRandomInt(1, 20) / 20,
|
||||||
Assassination: () => getRandomInt(1, 20) / 10,
|
Assassination: () => getRandomInt(1, 20) / 20,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
import React from "react";
|
||||||
|
|
||||||
|
interface IOperation {
|
||||||
|
desc: JSX.Element;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Operations: {
|
||||||
|
[key: string]: IOperation | undefined;
|
||||||
|
} = {
|
||||||
|
Investigation: {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
As a field agent, investigate and identify Synthoid populations, movements, and operations.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Successful Investigation ops will increase the accuracy of your synthoid data.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
You will NOT lose HP from failed Investigation ops.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Undercover Operation": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Conduct undercover operations to identify hidden and underground Synthoid communities and organizations.
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
Successful Undercover ops will increase the accuracy of your synthoid data.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Sting Operation": {
|
||||||
|
desc: <>Conduct a sting operation to bait and capture particularly notorious Synthoid criminals.</>,
|
||||||
|
},
|
||||||
|
Raid: {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Lead an assault on a known Synthoid community. Note that there must be an existing Synthoid community in your
|
||||||
|
current city in order for this Operation to be successful.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
"Stealth Retirement Operation": {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Lead a covert operation to retire Synthoids. The objective is to complete the task without drawing any
|
||||||
|
attention. Stealth and discretion are key.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
Assassination: {
|
||||||
|
desc: (
|
||||||
|
<>
|
||||||
|
Assassinate Synthoids that have been identified as important, high-profile social and political leaders in the
|
||||||
|
Synthoid communities.
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { IAction } from "../IAction";
|
||||||
|
import { IBladeburner } from "../IBladeburner";
|
||||||
|
import { BladeburnerConstants } from "../data/Constants";
|
||||||
|
import { use } from "../../ui/Context";
|
||||||
|
|
||||||
|
import Typography from "@mui/material/Typography";
|
||||||
|
import Tooltip from "@mui/material/Tooltip";
|
||||||
|
import Box from "@mui/material/Box";
|
||||||
|
import IconButton from "@mui/material/IconButton";
|
||||||
|
import ArrowDropUpIcon from "@mui/icons-material/ArrowDropUp";
|
||||||
|
import ArrowDropDownIcon from "@mui/icons-material/ArrowDropDown";
|
||||||
|
|
||||||
|
interface IProps {
|
||||||
|
action: IAction;
|
||||||
|
isActive: boolean;
|
||||||
|
bladeburner: IBladeburner;
|
||||||
|
rerender: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function ActionLevel({ action, isActive, bladeburner, rerender }: IProps): React.ReactElement {
|
||||||
|
const player = use.Player();
|
||||||
|
|
||||||
|
const canIncrease = action.level < action.maxLevel;
|
||||||
|
const canDecrease = action.level > 1;
|
||||||
|
|
||||||
|
function increaseLevel(): void {
|
||||||
|
if (!canIncrease) return;
|
||||||
|
++action.level;
|
||||||
|
if (isActive) bladeburner.startAction(player, bladeburner.action);
|
||||||
|
rerender();
|
||||||
|
}
|
||||||
|
|
||||||
|
function decreaseLevel(): void {
|
||||||
|
if (!canDecrease) return;
|
||||||
|
--action.level;
|
||||||
|
if (isActive) bladeburner.startAction(player, bladeburner.action);
|
||||||
|
rerender();
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Box display="flex" flexDirection="row" alignItems="center">
|
||||||
|
<Box display="flex">
|
||||||
|
<Tooltip
|
||||||
|
title={
|
||||||
|
<Typography>
|
||||||
|
{action.getSuccessesNeededForNextLevel(BladeburnerConstants.ContractSuccessesPerLevel)} successes needed
|
||||||
|
for next level
|
||||||
|
</Typography>
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<Typography>
|
||||||
|
Level: {action.level} / {action.maxLevel}
|
||||||
|
</Typography>
|
||||||
|
</Tooltip>
|
||||||
|
</Box>
|
||||||
|
<Tooltip title={isActive ? <Typography>WARNING: changing the level will restart the Operation</Typography> : ""}>
|
||||||
|
<span>
|
||||||
|
<IconButton disabled={!canIncrease} onClick={increaseLevel}>
|
||||||
|
<ArrowDropUpIcon />
|
||||||
|
</IconButton>
|
||||||
|
</span>
|
||||||
|
</Tooltip>
|
||||||
|
<Tooltip title={isActive ? <Typography>WARNING: changing the level will restart the Operation</Typography> : ""}>
|
||||||
|
<span>
|
||||||
|
<IconButton disabled={!canDecrease} onClick={decreaseLevel}>
|
||||||
|
<ArrowDropDownIcon />
|
||||||
|
</IconButton>
|
||||||
|
</span>
|
||||||
|
</Tooltip>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user