Compare commits

..

193 Commits

Author SHA1 Message Date
Olivier Gagnon
cb31954b08 v0.53.0 2021-09-09 22:57:37 -04:00
Olivier Gagnon
7f1d39a298 the world map is used every place a travel is done 2021-09-09 22:06:59 -04:00
Olivier Gagnon
d5c9306395 Convert sleeves to react, fix shock recovery bug 2021-09-09 21:38:05 -04:00
Olivier Gagnon
b0fcdb8363 some sleeve conversion 2021-09-09 16:04:36 -04:00
Olivier Gagnon
ab8937870c resleeve in react 2021-09-09 15:19:11 -04:00
Olivier Gagnon
4e22b880bb removed Corporation rerender and drilled down a rerender function in the react. 2021-09-09 14:21:21 -04:00
Olivier Gagnon
f77ab4e871 engine work 2021-09-09 13:48:21 -04:00
Olivier Gagnon
0a210555e9 remove some createElement 2021-09-09 13:00:06 -04:00
Olivier Gagnon
3df298e91e fix contract 2021-09-09 12:52:43 -04:00
Olivier Gagnon
b7e07bc7f2 convert all hacknet to ts 2021-09-09 03:17:01 -04:00
Olivier Gagnon
c97fece747 UI work on corps 2021-09-09 00:34:13 -04:00
Olivier Gagnon
a2aaf6bd2e build sleeve memory fix 2021-09-08 23:48:42 -04:00
Olivier Gagnon
2a13db39c7 fix sleeve memory bug 2021-09-08 23:47:34 -04:00
hydroflame
bada8a5f39 Merge pull request #1192 from vmesecher/dev
Adds getAugmentationPrice() and getAugmentationReqRep() Netscript Singularity functions.
2021-09-08 00:16:14 -04:00
vmesecher
6979082be7 Adds getAugmentationPrice() and getAugmentationReqRep() Netscript Singularity functions. Deprecates getAugmentationCost() Netscript singularity function. 2021-09-07 20:33:34 -07:00
Olivier Gagnon
1c9542d102 tech vendor buttons update better 2021-09-07 17:26:49 -04:00
Olivier Gagnon
0d5a302580 few more bug fixes 2021-09-07 17:18:02 -04:00
Olivier Gagnon
7bc0764d5d noselect some blade stuff 2021-09-07 16:49:11 -04:00
Olivier Gagnon
bc034bb417 Added more complex customization to smart supply 2021-09-07 16:46:36 -04:00
Olivier Gagnon
ea99166f7f better ascii maps 2021-09-07 15:09:05 -04:00
Olivier Gagnon
82c3362adc fix tests 2021-09-07 14:31:47 -04:00
hydroflame
e7d77b7569 Merge pull request #1167 from threehams/cypress
Add browser tests for tutorial, NetScript 2
2021-09-07 14:00:58 -04:00
Olivier Gagnon
c5af4f8177 remove debug log 2021-09-07 13:29:35 -04:00
Olivier Gagnon
d0cb0e3f5b remove ram requirements from joining factinos 2021-09-07 13:22:39 -04:00
Olivier Gagnon
f7adadd671 Blade action count replenishes more consistently 2021-09-07 13:15:27 -04:00
Olivier Gagnon
faa6f75027 UI improvements for corps. 2021-09-07 02:03:39 -04:00
Olivier Gagnon
3b0cf6714a build corp fixes 2021-09-07 01:16:28 -04:00
Olivier Gagnon
cd43f25bf5 make smart supply actually kinda smart 2021-09-07 01:14:55 -04:00
Olivier Gagnon
6e670e88e2 Fix manual management issues 2021-09-06 19:10:40 -04:00
David Edmondson
20062b11b9 Add test for static/dynamic RAM check 2021-09-06 13:51:55 -07:00
David Edmondson
d0ca2d8c36 Set up cy:test for production tests 2021-09-06 13:51:54 -07:00
David Edmondson
20e41e8006 Add back command import 2021-09-06 13:49:34 -07:00
David Edmondson
7ef7fc1b26 Remove getId for now 2021-09-06 13:49:34 -07:00
David Edmondson
6352704608 Remove placeholder fixture 2021-09-06 13:49:34 -07:00
David Edmondson
072f7693f4 gitignore cypress output 2021-09-06 13:49:34 -07:00
David Edmondson
fbe70f51c2 Add browser tests for tutorial, NetScript 2 2021-09-06 13:49:34 -07:00
David Edmondson
27e2b2ea65 separate PR/dev actions 2021-09-06 13:46:59 -07:00
David Edmondson
6320189717 Specify node version 2021-09-06 13:32:18 -07:00
David Edmondson
17da325585 Cache npm install, add tests 2021-09-06 13:29:35 -07:00
David Edmondson
5873b5fe19 Try again 2021-09-06 13:24:33 -07:00
David Edmondson
6d8b52c0d6 npm install 2021-09-06 13:20:07 -07:00
David Edmondson
8faa7faf8a Set up GitHub Actions 2021-09-06 13:17:42 -07:00
Olivier Gagnon
66a593e06b expand new city and new industry dont appear if you cant 2021-09-06 15:53:31 -04:00
Olivier Gagnon
506122f5b8 fmt, remove corp routing, lint 2021-09-06 15:06:08 -04:00
hydroflame
91434b7972 Merge pull request #1173 from threehams/source-maps
Speed up sourcemaps in dev mode
2021-09-06 13:05:13 -04:00
David Edmondson
ba46262426 Speed up sourcemaps in dev mode 2021-09-05 11:32:52 -07:00
Olivier Gagnon
aa91e8aecc fix ts warning 2021-09-05 14:18:33 -04:00
hydroflame
2874112946 Merge pull request #1171 from threehams/ts-check-1169
Add async TS checker to build
2021-09-05 14:13:36 -04:00
David Edmondson
3f8aa2aa9e Add async TS checker to build 2021-09-05 11:10:23 -07:00
Olivier Gagnon
b9acfde363 fix research box not displaying well on big screens. 2021-09-05 13:48:38 -04:00
Olivier Gagnon
b4c9655782 reword hacking skill aug effect 2021-09-05 01:56:37 -04:00
Olivier Gagnon
f50b2a9d9f remove debug log 2021-09-05 01:51:27 -04:00
Olivier Gagnon
a475e6297e fix miscalc in favor 2021-09-05 01:50:26 -04:00
Olivier Gagnon
cfdf23cd11 fix whitespace from new build 2021-09-05 01:33:05 -04:00
hydroflame
d6aa331310 Merge pull request #1163 from threehams/world-map
Fix world map and casino visuals.
2021-09-05 01:31:36 -04:00
David Edmondson
306facc0d1 Switch to babel for builds.
Fix whitespace mangled by prettier
2021-09-04 22:17:30 -07:00
hydroflame
5e11e77282 Merge pull request #1161 from threehams/fixed-builds
Fixed builds
2021-09-04 21:05:52 -04:00
David Edmondson
daafdbbddf Target ES2017 browsers and above 2021-09-04 17:52:23 -07:00
David Edmondson
8501c9bb1b Revert swc change due to prod crash 2021-09-04 17:45:30 -07:00
Olivier Gagnon
05f3b1c390 remove some function from autocomplete. 2021-09-04 20:14:33 -04:00
Olivier Gagnon
7f15a19f12 fix bad import 2021-09-04 20:09:22 -04:00
hydroflame
4011542b97 Merge pull request #1157 from threehams/faster-builds
Switch ts and babel for swc-loader
2021-09-04 20:05:51 -04:00
Olivier Gagnon
858b1e7468 documentation 2021-09-04 20:05:24 -04:00
David Edmondson
cfbdae6def Switch ts and babel for swc-loader
Replace old <> assertion syntax
2021-09-04 16:57:49 -07:00
Olivier Gagnon
05a6f2a20e fix formatting of Spiralize Matrix contract 2021-09-04 19:54:08 -04:00
Olivier Gagnon
05bab22807 Better error message for dynamic ram miscalculation 2021-09-04 19:27:16 -04:00
Olivier Gagnon
a18bdd6afc prettify, sorry for the big ass commit 2021-09-04 19:09:30 -04:00
hydroflame
3d7cdb4ef9 Merge pull request #1105 from danielyxie/dependabot/npm_and_yarn/jszip-3.7.0
Bump jszip from 3.1.5 to 3.7.0
2021-09-04 19:03:43 -04:00
hydroflame
eed915dbbd Merge pull request #1154 from threehams/num-people-killed
Add numPeopleKilled to getPlayer return
2021-09-04 19:03:36 -04:00
hydroflame
570e5b17a2 Merge pull request #1122 from threehams/upgrade-acorn
Support optional chaining in static RAM calculator.
2021-09-04 19:03:22 -04:00
hydroflame
4a7fcda86f Merge pull request #1152 from threehams/prettier
Configure `prettier`.
2021-09-04 19:03:05 -04:00
David Edmondson
a63178f30c Run eslint on js,jsx files 2021-09-04 14:56:54 -07:00
David Edmondson
2914bbb789 Add numPeopleKilled to getPlayer return 2021-09-04 14:51:59 -07:00
David Edmondson
1e42f73e2a Add prettier, and fix some CSS/line errors. 2021-09-04 13:18:35 -07:00
hydroflame
2d322e7a6a Merge pull request #1115 from danielyxie/react-corp
React corp
2021-09-04 15:11:43 -04:00
Olivier Gagnon
75d77410ea merge dev 2021-09-04 15:11:17 -04:00
Olivier Gagnon
0ad05c7bad fix disableLog issue 2021-09-04 14:51:50 -04:00
Olivier Gagnon
69ec6f6679 Travel cost greys out 2021-09-04 14:46:13 -04:00
Olivier Gagnon
c8dd17d573 added formula for cores cost, ram cost, and changed core cost formula 2021-09-04 14:43:22 -04:00
Olivier Gagnon
1241cc5128 Avoid use of any in CONSTANTS.ts 2021-09-04 14:09:57 -04:00
Olivier Gagnon
e1c29f25e2 Fix missing money display 2021-09-04 14:03:19 -04:00
Olivier Gagnon
c9efa977fb BN10 now has the sleeve you would gain but inside, also it starts with 25-25 sync-shock 2021-09-04 12:15:16 -04:00
Olivier Gagnon
6e013e4e6a Change money to automatically color grey when something cannot be bought. 2021-09-04 03:27:31 -04:00
Olivier Gagnon
3a943e0e50 made tech vendors button a tad smarter. 2021-09-04 02:21:31 -04:00
Olivier Gagnon
f2edb42aca gave some love to the donations 2021-09-04 01:39:34 -04:00
Olivier Gagnon
e1cb0e529c Tech vendors give a tip that you can buy bigger servers via scripts. 2021-09-03 18:04:05 -04:00
Olivier Gagnon
008b233c9d reword faction reputation and favor tooltips 2021-09-03 17:42:23 -04:00
Olivier Gagnon
cc9a07c09f Fix 180 favor issue, reworked favor and reputation mathjax 2021-09-03 17:12:55 -04:00
Olivier Gagnon
2866bfaa70 more corp API 2021-09-03 16:02:41 -04:00
David Edmondson
38880f69e1 Update acorn for optional chaining support 2021-09-02 13:56:30 -07:00
Olivier Gagnon
eb01051ad6 rebuild 2021-09-02 16:42:24 -04:00
Olivier Gagnon
5dd6145d53 build player patch 2021-09-02 13:34:59 -04:00
hydroflame
a652140224 Merge pull request #1124 from TomCassWindred/WrapOnLineBreak
Set log messages to wrap on line breaks
2021-09-02 13:24:30 -04:00
Cass
aa929b1837 Set log messages to wrap on line breaks
This retains \n characters on strings given as inputs
2021-09-02 18:15:42 +01:00
Olivier Gagnon
9b501e061a merge dev 2021-09-02 03:16:58 -04:00
dependabot[bot]
6f3db27373 Bump jszip from 3.1.5 to 3.7.0
Bumps [jszip](https://github.com/Stuk/jszip) from 3.1.5 to 3.7.0.
- [Release notes](https://github.com/Stuk/jszip/releases)
- [Changelog](https://github.com/Stuk/jszip/blob/master/CHANGES.md)
- [Commits](https://github.com/Stuk/jszip/compare/v3.1.5...v3.7.0)

---
updated-dependencies:
- dependency-name: jszip
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-02 07:11:42 +00:00
Olivier Gagnon
454a792f0a Added mathjax formulas for favor and made favor calculation faster. 2021-09-02 03:10:12 -04:00
Olivier Gagnon
8d17495e85 corp API 2021-09-02 00:36:33 -04:00
Olivier Gagnon
d3aeda8ad5 more conversion 2021-09-01 22:16:48 -04:00
Olivier Gagnon
65158e4db7 merge dev 2021-08-31 16:30:01 -04:00
Olivier Gagnon
fd85a00b8f Merge branch 'dev' of github.com:danielyxie/bitburner into dev 2021-08-31 16:26:54 -04:00
Olivier Gagnon
a239f0ad58 Build some PRs for the players 2021-08-31 16:26:06 -04:00
hydroflame
d936f68c7a Merge pull request #1111 from brubsby/patch-2
Update all general actions to have infinity count
2021-08-31 16:24:57 -04:00
hydroflame
feebdc8ee5 Merge pull request #1112 from brubsby/patch-3
Update getActionEstimatedSuccessChance
2021-08-31 16:24:47 -04:00
hydroflame
0eeb868e25 Merge pull request #1117 from TomCassWindred/IndividualLogEnable
Individual log enable
2021-08-31 16:22:34 -04:00
Olivier Gagnon
d9c9c30fdd more conversion 2021-08-31 16:19:58 -04:00
Cass
294640d27e Quick Tidy 2021-08-31 21:04:40 +01:00
Cass
fe25460997 Replace "ALL" log flag with individually disabling every log.
https://github.com/danielyxie/bitburner/issues/1116
2021-08-31 21:03:39 +01:00
Olivier Gagnon
f987ff9e2a no more any in corp 2021-08-31 15:51:27 -04:00
Olivier Gagnon
d65cbf07f4 Narrow down corporation types 2021-08-31 14:47:07 -04:00
Olivier Gagnon
2624e13c34 build dev menu 2021-08-31 13:06:23 -04:00
Olivier Gagnon
7c9c4d3f4d No more use of any in Corporations. 2021-08-31 13:04:33 -04:00
Olivier Gagnon
a2379b21ec more conversion 2021-08-31 03:39:04 -04:00
Olivier Gagnon
68885ceff5 more conversion 2021-08-31 03:18:44 -04:00
Olivier Gagnon
1ae17677c0 jsts corporation 2021-08-31 03:07:20 -04:00
Olivier Gagnon
67be13c6d6 more conversion 2021-08-31 02:49:57 -04:00
Olivier Gagnon
d4349e85b1 fix some of the research popup stuff 2021-08-31 01:05:51 -04:00
Olivier Gagnon
a721c49e1d more conversion 2021-08-31 00:54:57 -04:00
hydroflame
2d2c20bfc7 Merge pull request #1114 from threehams/autocomplete
Add tests for autocomplete
2021-08-30 22:08:16 -04:00
David Edmondson
ed035a2e89 Add tests for autocomplete 2021-08-30 17:58:01 -07:00
Olivier Gagnon
cf72d72bb0 Finished converting all the popups. 2021-08-30 17:59:11 -04:00
Olivier Gagnon
3ba04220e1 I made a mistake but caught it. 2021-08-30 03:18:12 -04:00
Olivier Gagnon
a72d1aa99f more conversion 2021-08-30 03:07:14 -04:00
Olivier Gagnon
21008ba65a more conversion 2021-08-28 14:45:55 -04:00
Olivier Gagnon
a760ede129 more conversion 2021-08-28 14:22:36 -04:00
Olivier Gagnon
717b32b0b4 more conversion 2021-08-28 14:03:07 -04:00
Olivier Gagnon
4b6d049da2 more conversion 2021-08-28 13:41:25 -04:00
Olivier Gagnon
8bb4e8b7cf more conversion 2021-08-28 13:07:35 -04:00
Olivier Gagnon
0d30544a52 more conversion 2021-08-28 12:00:18 -04:00
Olivier Gagnon
361ef31fe7 more conversion 2021-08-28 03:49:15 -04:00
Olivier Gagnon
0de3deee3f Even more conversion 2021-08-28 03:31:47 -04:00
Olivier Gagnon
94ad7ccf4b more conversion 2021-08-28 02:57:57 -04:00
Olivier Gagnon
4b53d6ecf7 more convertion 2021-08-28 02:50:06 -04:00
Olivier Gagnon
3d2aeb63a0 more convert 2021-08-28 00:29:19 -04:00
Olivier Gagnon
b621359a9e fix changelog dates 2021-08-28 00:13:08 -04:00
Olivier Gagnon
07c0b708d7 more convertion 2021-08-28 00:11:42 -04:00
brubsby
b372f23b6e Update getActionEstimatedSuccessChance
ns.bladeburner.getActionEstimatedSuccessChance("general", "Diplomacy") returned [-1, -1] (as well as "Hyperbolic Regeneration Chamber"), even though both tasks automatically succeed. Also Training and Field Analysis both previously returned [1, 1].
2021-08-27 17:06:01 -05:00
Olivier Gagnon
a8254e7144 one component 2021-08-27 17:39:15 -04:00
brubsby
02a21cf2d9 Update all general actions to have infinity count
ns.bladeburner.getActionCountRemaining("general", "Diplomacy") currently returns -1. I think it'd be more intuitive if all the general actions returned Infinity, instead of just two of them
2021-08-27 16:13:22 -05:00
Olivier Gagnon
bcb0606900 fix typo 2021-08-27 15:31:54 -04:00
Olivier Gagnon
42704d8695 v0.52.9 2021-08-27 15:26:12 -04:00
Olivier Gagnon
e75197dee3 build 2021-08-27 14:19:36 -04:00
Olivier Gagnon
9e92df47a5 Added file diagnostic. 2021-08-27 14:17:25 -04:00
Olivier Gagnon
c110c22efb My corp infinity safeguard from 2 patch ago wasn't actually preventing it, just logging, now it returns to avoid it. 2021-08-27 11:18:06 -04:00
Olivier Gagnon
c9ab7908a7 another blocker against mku equal 0 and added tprintf 2021-08-27 11:05:36 -04:00
Olivier Gagnon
3ab306f9d7 fix the errors about node setTimeout instead of window 2021-08-27 01:11:11 -04:00
hydroflame
f08aa8924c Merge pull request #1102 from threehams/test-runner
Switch out test runner for jest
2021-08-27 00:53:45 -04:00
Olivier Gagnon
c4914fa54f build community prs 2021-08-27 00:45:11 -04:00
hydroflame
fa5e2f4964 Merge pull request #1079 from threehams/infil-instakill
Instakill player when automating infiltration
2021-08-26 21:42:08 -04:00
hydroflame
77eda1fd75 Merge pull request #1098 from brubsby/patch-1
add bladeburner_analysis_mult to getPlayer()
2021-08-26 21:42:01 -04:00
Olivier Gagnon
c987c91a11 add corp safeguard 2021-08-26 21:39:51 -04:00
David Edmondson
feaa74ed34 Only compile down imports during tests 2021-08-26 17:02:02 -07:00
David Edmondson
701fba7ec7 Drop cross-env 2021-08-26 16:45:39 -07:00
David Edmondson
51bd626e88 Remove unneeded stuff, .vscode on gitignore 2021-08-26 16:44:37 -07:00
David Edmondson
ab4863e7df Swap out mocha/chai for jest 2021-08-26 16:43:11 -07:00
David Edmondson
1a8bcf66cc Fix existing tests, update to jest 2021-08-26 16:43:03 -07:00
David Edmondson
7bfceb1690 Replace old-style import with type 2021-08-26 16:42:57 -07:00
David Edmondson
27e22814a9 Remove missing + unused variable 2021-08-26 16:42:47 -07:00
Olivier Gagnon
ceb4e304fd Hotfix corp mku getting set to zero and causing infinity 2021-08-26 15:22:06 -04:00
Olivier Gagnon
e2d74f9432 fix beautify 2021-08-25 16:14:47 -04:00
Olivier Gagnon
79345a49b4 Bladeburner automation status always displays the commands, even when disabled 2021-08-25 11:50:33 -04:00
Olivier Gagnon
7066a793a1 build fix 2021-08-24 21:40:50 -04:00
hydroflame
2a5cf62168 Merge pull request #1097 from Snarling/patch-2
Fix joining blade via ns
2021-08-24 21:39:29 -04:00
brubsby
6495be5705 add bladeburner_analysis_mult to getPlayer() 2021-08-24 20:02:39 -05:00
Snarling
0d6d05db49 Fix joining blade via ns
Pass Player as an argument in Bladeburner constructor call for ns.bladeburner.joinBladeburnerDivision()
2021-08-24 20:08:29 -04:00
Olivier Gagnon
5d59620dce click to copy every bladeburner action 2021-08-23 11:42:14 -04:00
Olivier Gagnon
60d95a90d0 Fix script not being saved on their individual computers. 2021-08-23 09:33:49 -04:00
Olivier Gagnon
51debc60da build omuretsu fix 2021-08-23 09:18:43 -04:00
Snarling
faf625b34d Update Root.tsx
Went back to tracking lastServer as a hostname, since server IPs are not static.
2021-08-23 04:04:52 -07:00
Snarling
1a8b194341 Update Root.tsx
Removed unnecessary conversions between server and ip
2021-08-23 04:04:52 -07:00
Snarling
386f8a11c5 Change lastServer to reference the server ip
Should fix issue with newly saved scripts failing to run
2021-08-23 04:04:52 -07:00
hydroflame
4278191b0e Merge pull request #1090 from danielyxie/dev
v0.52.8
2021-08-23 02:09:55 -04:00
hydroflame
4a9bac99d2 Merge pull request #1083 from danielyxie/dev
Fix monaco jumping to end of file.
2021-08-22 23:57:16 -04:00
hydroflame
49cc75a575 Merge pull request #1082 from danielyxie/dev
trying to fix the jumping bug
2021-08-22 23:47:44 -04:00
hydroflame
8289c9fc75 Merge pull request #1080 from danielyxie/dev
Fixed Script Editor not loading the same file after manually clicking it
2021-08-22 01:31:00 -04:00
David Edmondson
6cd7465b82 Instakill player when automating infiltration 2021-08-21 15:00:00 -07:00
hydroflame
c7125e2e46 Merge pull request #1077 from danielyxie/dev
Fix a few other bugs
2021-08-21 14:01:05 -04:00
hydroflame
480d47eece Merge pull request #1076 from danielyxie/dev
Fix log box dragging.
2021-08-21 02:39:17 -04:00
hydroflame
9ac75d5bf5 Merge pull request #1075 from danielyxie/dev
Fix Corp research popup box appearing behind one another.
2021-08-21 02:07:10 -04:00
hydroflame
1fb5105d0a Merge pull request #1074 from danielyxie/dev
hotfix broken editor shortcuts
2021-08-21 01:55:05 -04:00
hydroflame
7db3716256 Merge pull request #1072 from danielyxie/dev
hotfix the tutorial
2021-08-21 00:58:58 -04:00
hydroflame
aa3ad3164c Merge pull request #1068 from danielyxie/dev
v0.52.6
2021-08-21 00:32:04 -04:00
hydroflame
fea25249a8 Merge pull request #1062 from danielyxie/dev
v0.52.5
2021-08-19 16:38:26 -04:00
hydroflame
3826de72ef Merge pull request #1061 from danielyxie/dev
hotfix some blade netscript functions not working
2021-08-19 11:04:24 -04:00
hydroflame
5098ef6232 Merge pull request #1057 from danielyxie/dev
v0.52.4 - Bladeburner in React
2021-08-19 01:46:16 -04:00
hydroflame
27ee65f524 Merge pull request #1051 from danielyxie/dev
hotfix 0 territory being softlocked.
2021-08-17 17:47:58 -04:00
hydroflame
1d0f193c34 Merge pull request #1050 from danielyxie/dev
hotfix blocked in Gang
2021-08-17 17:14:11 -04:00
hydroflame
08908c87ea Merge pull request #1048 from danielyxie/dev
Hotfix weird bladeburner ui bug
2021-08-15 17:14:38 -04:00
hydroflame
3957a517db Merge pull request #1047 from danielyxie/dev
v0.52.3 - 2021-07-15 Gangs were OP (hydroflame)
2021-08-15 16:26:52 -04:00
hydroflame
21daab32c1 Merge pull request #1044 from danielyxie/dev
v0.52.2
2021-08-15 02:15:03 -04:00
hydroflame
5e2ed7a79e Merge pull request #1042 from danielyxie/dev
hotfix revert tutorial instructing the player to make a script on n00…
2021-08-11 01:05:46 -04:00
hydroflame
d9e60ea124 Merge pull request #1039 from danielyxie/dev
rebuild with the version inside the game correctly udpated
2021-08-10 21:10:00 -04:00
hydroflame
2750eb293a Merge pull request #1038 from danielyxie/dev
v0.52.1
2021-08-10 21:04:05 -04:00
636 changed files with 103228 additions and 75549 deletions

View File

@@ -1,3 +0,0 @@
{
"presets": ["@babel/preset-react"]
}

3
.browserslistrc Normal file
View File

@@ -0,0 +1,3 @@
last 4 versions
not dead
not ie <= 11

View File

@@ -3,6 +3,4 @@ doc/build/
dist/ dist/
tests/*.bundle.* tests/*.bundle.*
src/ThirdParty/* src/ThirdParty/*
src/ScriptEditor/CodeMirrorNetscriptMode.js
src/ScriptEditor/CodeMirrorNetscriptLint.js
src/JSInterpreter.js src/JSInterpreter.js

File diff suppressed because it is too large Load Diff

31
.github/workflows/deploy.yml vendored Normal file
View File

@@ -0,0 +1,31 @@
name: CI
on:
push:
branches: [dev]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: "14"
cache: "npm"
- name: Install Dependencies
run: npm ci
- name: Test
run: npm run test
- name: Build
run: npm run build
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: .

25
.github/workflows/test.yml vendored Normal file
View File

@@ -0,0 +1,25 @@
name: CI
on: [push, pull_request]
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
test:
# The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: "14"
cache: "npm"
- name: Install Dependencies
run: npm ci
- name: Test
run: npm run test

5
.gitignore vendored
View File

@@ -1,3 +1,4 @@
.vscode
Changelog.txt Changelog.txt
Netburner.txt Netburner.txt
/doc/build /doc/build
@@ -6,3 +7,7 @@ Netburner.txt
/test/*.map /test/*.map
/test/*.bundle.* /test/*.bundle.*
/test/*.css /test/*.css
.cypress
# editor files
.vscode

4
.prettierignore Normal file
View File

@@ -0,0 +1,4 @@
node_modules
package.json
dist
doc/build/

5
.prettierrc Normal file
View File

@@ -0,0 +1,5 @@
{
"trailingComma": "all",
"tabWidth": 2,
"printWidth": 120
}

View File

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

View File

@@ -1,9 +1,11 @@
# Bitburner # Bitburner
Bitburner is a programming-based [incremental game](https://en.wikipedia.org/wiki/Incremental_game) Bitburner is a programming-based [incremental game](https://en.wikipedia.org/wiki/Incremental_game)
that revolves around hacking and cyberpunk themes. that revolves around hacking and cyberpunk themes.
The game can be played at https://danielyxie.github.io/bitburner. The game can be played at https://danielyxie.github.io/bitburner.
# Documentation # Documentation
The game's official documentation can be found on [Read The The game's official documentation can be found on [Read The
Docs](http://bitburner.readthedocs.io/). Please note that this is still a Docs](http://bitburner.readthedocs.io/). Please note that this is still a
work-in-progress. work-in-progress.
@@ -16,6 +18,7 @@ For further guidance, please refer to the "As A Documentor" section of
[CONTRIBUTING](CONTRIBUTING.md). [CONTRIBUTING](CONTRIBUTING.md).
# Contribution # Contribution
There are many ways to contribute to the game. It can be as simple as fixing There are many ways to contribute to the game. It can be as simple as fixing
a typo, correcting a bug, or improving the UI. For guidance on doing so, a typo, correcting a bug, or improving the UI. For guidance on doing so,
please refer to the [CONTRIBUTING](CONTRIBUTING.md) document. please refer to the [CONTRIBUTING](CONTRIBUTING.md) document.

View File

@@ -1,7 +1,7 @@
Deploying a new version ## Deploying a new version
-----------------------
Update the following Update the following
- `src/Constants.ts` `Version` and `LatestUpdate` - `src/Constants.ts` `Version` and `LatestUpdate`
- `package.json` `version` - `package.json` `version`
- `doc/source/conf.py` `version` and `release` - `doc/source/conf.py` `version` and `release`
@@ -9,15 +9,13 @@ Update the following
- post to discord - post to discord
- post to reddit.com/r/Bitburner - post to reddit.com/r/Bitburner
Deploying `dev` to the Beta Branch ## Deploying `dev` to the Beta Branch
----------------------------------
TODO TODO
Development Workflow Best Practices ## Development Workflow Best Practices
-----------------------------------
- Work in a new branch forked from the `dev` branch to isolate your new code - Work in a new branch forked from the `dev` branch to isolate your new code
- Keep code-changes on a branch as small as possible. This makes it easier for code review. Each branch should be its own independent feature. - Keep code-changes on a branch as small as possible. This makes it easier for code review. Each branch should be its own independent feature.
- Regularly rebase your branch against `dev` to make sure you have the latest updates pulled. - Regularly rebase your branch against `dev` to make sure you have the latest updates pulled.
- When merging, always merge your branch into `dev`. When releasing a new update, then merge `dev` into `master` - When merging, always merge your branch into `dev`. When releasing a new update, then merge `dev` into `master`

3
babel.config.js Normal file
View File

@@ -0,0 +1,3 @@
module.exports = {
presets: ["@babel/preset-react", "@babel/preset-env", "@babel/preset-typescript"],
};

View File

@@ -1,61 +1,61 @@
@mixin animation($property) { @mixin animation($property) {
-webkit-animation: $property; -webkit-animation: $property;
-moz-animation: $property; -moz-animation: $property;
-ms-animation: $property; -ms-animation: $property;
-o-animation: $property; -o-animation: $property;
animation: $property; animation: $property;
} }
@mixin borderRadius($property) { @mixin borderRadius($property) {
-webkit-border-radius: $property; -webkit-border-radius: $property;
-moz-border-radius: $property; -moz-border-radius: $property;
border-radius: $property; border-radius: $property;
} }
@mixin boxShadow($value) { @mixin boxShadow($value) {
-webkit-box-shadow: $value; -webkit-box-shadow: $value;
-moz-box-shadow: $value; -moz-box-shadow: $value;
box-shadow: $value; box-shadow: $value;
} }
@mixin keyframes($animationName) { @mixin keyframes($animationName) {
@-webkit-keyframes #{$animationName} { @-webkit-keyframes #{$animationName} {
$browser: '-webkit-' !global; $browser: "-webkit-" !global;
@content; @content;
} }
@-moz-keyframes #{$animationName} { @-moz-keyframes #{$animationName} {
$browser: '-moz-' !global; $browser: "-moz-" !global;
@content; @content;
} }
@-ms-keyframes #{$animationName} { @-ms-keyframes #{$animationName} {
$browser: '-ms-' !global; $browser: "-ms-" !global;
@content; @content;
} }
@-o-keyframes #{$animationName} { @-o-keyframes #{$animationName} {
$browser: '-o-' !global; $browser: "-o-" !global;
@content; @content;
} }
@keyframes #{$animationName} { @keyframes #{$animationName} {
$browser: '' !global; $browser: "" !global;
@content; @content;
} }
} }
@mixin transform($property) { @mixin transform($property) {
-webkit-transform: $property; -webkit-transform: $property;
-moz-transform: $property; -moz-transform: $property;
-ms-transform: $property; -ms-transform: $property;
-o-transform: $property; -o-transform: $property;
transform: $property; transform: $property;
} }
@mixin userSelect($value) { @mixin userSelect($value) {
-webkit-user-select: $value; -webkit-user-select: $value;
-moz-user-select: $value; -moz-user-select: $value;
-ms-user-select: $value; -ms-user-select: $value;
user-select: $value; user-select: $value;
} }

View File

@@ -1,15 +1,15 @@
@import "theme"; @import "theme";
* { * {
font-size: $defaultFontSize; font-size: $defaultFontSize;
font-family: $fontFamily; font-family: $fontFamily;
} }
*, *,
*:before, *:before,
*:after { *:after {
margin: 0; margin: 0;
padding: 0; padding: 0;
box-sizing: border-box; box-sizing: border-box;
vertical-align: top; vertical-align: top;
} }

View File

@@ -1,4 +1,5 @@
$fontFamily: 'Lucida Console', 'Lucida Sans Unicode', 'Fira Mono', 'Consolas', 'Courier New', Courier, monospace, 'Times New Roman'; $fontFamily: "Lucida Console", "Lucida Sans Unicode", "Fira Mono", "Consolas", "Courier New", Courier, monospace,
"Times New Roman";
$defaultFontSize: 16px; $defaultFontSize: 16px;
/* COLORS */ /* COLORS */

View File

@@ -1,126 +1,132 @@
@import "theme"; @import "theme";
.active-scripts-list { .active-scripts-list {
list-style-type: none; list-style-type: none;
} }
#active-scripts-container { #active-scripts-container {
position: fixed; position: fixed;
padding-top: 10px; padding-top: 10px;
> p { > p {
width: 70%; width: 70%;
margin: 6px; margin: 6px;
padding: 4px; padding: 4px;
} }
.accordion-header { .accordion-header {
> pre { > pre {
color: white; color: white;
}
} }
}
} }
.active-scripts-server-header { .active-scripts-server-header {
background-color: #444; background-color: #444;
font-size: $defaultFontSize * 1.25; font-size: $defaultFontSize * 1.25;
color: #fff;
margin: 6px 6px 0 6px;
padding: 6px;
cursor: pointer;
width: 60%;
text-align: left;
border: none;
outline: none;
&:after {
content: "\02795"; /* "plus" sign (+) */
font-size: $defaultFontSize * 0.8125;
color: #fff; color: #fff;
margin: 6px 6px 0 6px; float: right;
padding: 6px; margin-left: 5px;
cursor: pointer; }
width: 60%;
text-align: left;
border: none;
outline: none;
&:after { &.active,
content: '\02795'; /* "plus" sign (+) */ &:hover {
font-size: $defaultFontSize * 0.8125; background-color: #555;
color: #fff; }
float: right;
margin-left: 5px;
}
&.active, &:hover {
background-color: #555;
}
} }
.active-scripts-server-header.active { .active-scripts-server-header.active {
&:after { &:after {
content: "\2796"; /* "minus" sign (-) */ content: "\2796"; /* "minus" sign (-) */
font-size: $defaultFontSize * 0.8125; font-size: $defaultFontSize * 0.8125;
color: #fff; color: #fff;
float: right; float: right;
margin-left: 5px; margin-left: 5px;
} }
&:hover { &:hover {
background-color: #666; background-color: #666;
} }
} }
.active-scripts-server-panel { .active-scripts-server-panel {
margin: 0 6px 6px 6px; margin: 0 6px 6px 6px;
padding: 0 6px 6px 6px; padding: 0 6px 6px 6px;
width: 55%; width: 55%;
margin-left: 5%; margin-left: 5%;
display: none; display: none;
div, ul, ul > li { div,
background-color: #555; ul,
} ul > li {
background-color: #555;
}
} }
.active-scripts-script-header { .active-scripts-script-header {
background-color: #555;
border: none;
color: var(--my-font-color);
cursor: pointer;
display: block;
outline: none;
padding: 4px 25px 4px 10px;
position: relative;
text-align: left;
width: auto;
&:after {
content: "\02795"; /* "plus" sign (+) */
font-size: $defaultFontSize * 0.8125;
float: right;
margin-left: 5px;
color: transparent;
text-shadow: 0 0 0 var(--my-font-color);
position: absolute;
bottom: 4px;
}
&.active:after {
content: "\2796"; /* "minus" sign (-) */
}
&:hover,
&.active:hover {
background-color: #666;
}
&.active {
background-color: #555; background-color: #555;
border: none; }
color: var(--my-font-color);
cursor: pointer;
display: block;
outline: none;
padding: 4px 25px 4px 10px;
position: relative;
text-align: left;
width: auto;
&:after {
content: '\02795'; /* "plus" sign (+) */
font-size: $defaultFontSize * 0.8125;
float: right;
margin-left: 5px;
color: transparent;
text-shadow: 0 0 0 var(--my-font-color);
position: absolute;
bottom: 4px;
}
&.active:after {
content: "\2796"; /* "minus" sign (-) */
}
&:hover,
&.active:hover {
background-color: #666;
}
&.active {
background-color: #555;
}
} }
.active-scripts-script-panel { .active-scripts-script-panel {
background-color: #555; background-color: #555;
display: none; display: none;
font-size: 14px; font-size: 14px;
margin-bottom: 6px; margin-bottom: 6px;
padding: 0 18px; padding: 0 18px;
width: auto; width: auto;
pre, h2, ul, li { pre,
background-color: #555; h2,
width: auto; ul,
color: #fff; li {
margin-left: 5%; background-color: #555;
} width: auto;
color: #fff;
margin-left: 5%;
}
} }

View File

@@ -6,25 +6,25 @@
@import "theme"; @import "theme";
#augmentations-container { #augmentations-container {
position: fixed; position: fixed;
padding-top: 10px; padding-top: 10px;
} }
#augmentations-content { #augmentations-content {
> p { > p {
font-size: $defaultFontSize * 0.875; font-size: $defaultFontSize * 0.875;
width: 70%; width: 70%;
} }
} }
.augmentations-list { .augmentations-list {
button, button,
div { div {
color: var(--my-font-color); color: var(--my-font-color);
text-decoration: none; text-decoration: none;
} }
button { button {
padding: 4px; padding: 4px;
} }
} }

View File

@@ -1,135 +1,137 @@
@import "theme"; @import "theme";
#bladeburner-container { #bladeburner-container {
a, position: fixed;
div, padding: 6px;
p, a,
pre, div,
td { p,
font-size: $defaultFontSize * 0.8125; pre,
} td {
font-size: $defaultFontSize * 0.8125;
}
} }
.bladeburner-action { .bladeburner-action {
border: 1px solid #fff; border: 1px solid #fff;
margin: 7px; margin: 7px;
padding: 7px; padding: 7px;
white-space: pre-wrap; white-space: pre-wrap;
pre { pre {
white-space: pre-wrap; white-space: pre-wrap;
} }
} }
/* Whatever action is currently active */ /* Whatever action is currently active */
.bladeburner-active-action { .bladeburner-active-action {
border: 4px solid #fff; border: 4px solid #fff;
} }
/* Action & Skills panel navigation button */ /* Action & Skills panel navigation button */
%bladeburner-nav-button { %bladeburner-nav-button {
border: 1px solid #fff; border: 1px solid #fff;
margin: 2px; margin: 2px;
padding: 2px; padding: 2px;
color: #fff; color: #fff;
} }
.bladeburner-nav-button { .bladeburner-nav-button {
@extend %bladeburner-nav-button; @extend %bladeburner-nav-button;
&:hover { &:hover {
background-color: #3d4044; background-color: #3d4044;
} }
} }
.bladeburner-nav-button-inactive { .bladeburner-nav-button-inactive {
@extend %bladeburner-nav-button; @extend %bladeburner-nav-button;
text-decoration: none; text-decoration: none;
background-color: #555; background-color: #555;
cursor: default; cursor: default;
pointer-events: none; pointer-events: none;
} }
/* Checkbox for (de)selecting autoleveling */ /* Checkbox for (de)selecting autoleveling */
.bbcheckbox { .bbcheckbox {
position: relative; position: relative;
display: inline; display: inline;
label { label {
width: 20px; width: 20px;
height: 20px; height: 20px;
cursor: pointer; cursor: pointer;
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
background: black; background: black;
border-width: 1px; border-width: 1px;
border-color: white; border-color: white;
border-style: solid; border-style: solid;
&:after { &:after {
content: ''; content: "";
width: 9px; width: 9px;
height: 5px; height: 5px;
position: absolute; position: absolute;
top: 5px; top: 5px;
left: 5px; left: 5px;
border: 3px solid white; border: 3px solid white;
border-top: none; border-top: none;
border-right: none; border-right: none;
opacity: 0; opacity: 0;
transform: rotate(-45deg); transform: rotate(-45deg);
}
} }
input[type="checkbox"] { }
margin: 3px; input[type="checkbox"] {
visibility: hidden; margin: 3px;
&:checked + label:after { visibility: hidden;
opacity: 1; &:checked + label:after {
} opacity: 1;
} }
}
} }
/* Bladeburner Console */ /* Bladeburner Console */
.bladeburner-console-div { .bladeburner-console-div {
display: inline-block; display: inline-block;
width: 40%; width: 40%;
border: 1px solid #fff; border: 1px solid #fff;
overflow: auto; overflow: auto;
height: 100%; height: 100%;
position: absolute; position: absolute;
} }
.bladeburner-console-table { .bladeburner-console-table {
height: auto; height: auto;
overflow: auto; overflow: auto;
table-layout: fixed; table-layout: fixed;
width: 100%; width: 100%;
} }
.bladeburner-console-input-row { .bladeburner-console-input-row {
transition: height 1s; transition: height 1s;
width: 100%; width: 100%;
} }
.bladeburner-console-input-cell { .bladeburner-console-input-cell {
display: flex; display: flex;
} }
.bladeburner-console-input { .bladeburner-console-input {
display: inline-block; display: inline-block;
padding: 0 !important; padding: 0 !important;
margin: 0 !important; margin: 0 !important;
border: 0; border: 0;
background-color: var(--my-background-color); background-color: var(--my-background-color);
font-size: $defaultFontSize * 0.8125; font-size: $defaultFontSize * 0.8125;
outline: none; outline: none;
color: var(--my-font-color); color: var(--my-font-color);
flex: 1 1 auto; flex: 1 1 auto;
} }
.bladeburner-console-line { .bladeburner-console-line {
word-wrap: break-word; word-wrap: break-word;
hyphens: auto; hyphens: auto;
-webkit-hyphens: auto; -webkit-hyphens: auto;
-moz-hyphens: auto; -moz-hyphens: auto;
} }

View File

@@ -11,80 +11,80 @@
/* Remove default <button> styling */ /* Remove default <button> styling */
button { button {
border: none; border: none;
background-color: transparent; background-color: transparent;
} }
.a-link-button, .a-link-button,
.std-button { .std-button {
@extend .noselect; @extend .noselect;
text-decoration: none; text-decoration: none;
background-color: #555; background-color: #555;
color: #fff; color: #fff;
padding: 3px 5px; padding: 3px 5px;
margin: 5px; margin: 5px;
border: 1px solid #333; border: 1px solid #333;
&:hover { &:hover {
background-color: #666; background-color: #666;
} }
&:active { &:active {
@include boxShadow(inset 0 1px 4px rgba(0, 0, 0, 0.6)); @include boxShadow(inset 0 1px 4px rgba(0, 0, 0, 0.6));
} }
} }
.a-link-button-inactive, .a-link-button-inactive,
.std-button-disabled, .std-button-disabled,
.std-button:disabled { .std-button:disabled {
text-decoration: none; text-decoration: none;
background-color: #333; background-color: #333;
color: #fff; color: #fff;
padding: 3px 5px; padding: 3px 5px;
margin: 5px; margin: 5px;
border: 1px solid #333; border: 1px solid #333;
cursor: default; cursor: default;
-moz-user-select: none; -moz-user-select: none;
-ms-user-select: none; -ms-user-select: none;
-khtml-user-select: none; -khtml-user-select: none;
-webkit-user-select: none; -webkit-user-select: none;
&:hover { &:hover {
.tooltiptext, .tooltiptext,
.tooltiptexthigh, .tooltiptexthigh,
.tooltiptextleft { .tooltiptextleft {
visibility: visible; visibility: visible;
}
} }
}
&:active { &:active {
pointer-events: none; pointer-events: none;
} }
} }
.a-link-button-bought, .a-link-button-bought,
.std-button-bought { .std-button-bought {
@extend .noselect; @extend .noselect;
text-decoration: none; text-decoration: none;
background-color: #0a0; background-color: #0a0;
color: #fff; color: #fff;
padding: 3px 5px; padding: 3px 5px;
margin: 5px; margin: 5px;
border: 1px solid #0a0; border: 1px solid #0a0;
cursor: default; cursor: default;
&:hover { &:hover {
.tooltiptext, .tooltiptext,
.tooltiptexthigh, .tooltiptexthigh,
.tooltiptextleft { .tooltiptextleft {
visibility: visible; visibility: visible;
}
} }
}
&:active { &:active {
pointer-events: none; pointer-events: none;
} }
} }
/** /**
@@ -92,21 +92,21 @@ button {
* It has a black background so it does not clash with the default accordion coloring * It has a black background so it does not clash with the default accordion coloring
*/ */
.accordion-button { .accordion-button {
@include borderRadius(12px); @include borderRadius(12px);
@include boxShadow(1px 1px 3px #000); @include boxShadow(1px 1px 3px #000);
color: #aaa; color: #aaa;
font-size: $defaultFontSize; font-size: $defaultFontSize;
font-weight: bold; font-weight: bold;
margin: 4px; margin: 4px;
padding: 4px; padding: 4px;
background-color: #000; background-color: #000;
&:hover, &:hover,
&:active { &:active {
color: #fff; color: #fff;
text-decoration: none; text-decoration: none;
cursor: pointer; cursor: pointer;
} }
/* TODO focus selector? */ /* TODO focus selector? */
} }

View File

@@ -1,24 +1,24 @@
.casino-card { .casino-card {
padding: 10px; padding: 10px;
border: solid 1px #808080; border: solid 1px #808080;
background-color: white; background-color: white;
display: inline-block; display: inline-block;
border-radius: 10px; border-radius: 10px;
font-size: 14pt; font-size: 18.5px;
text-align: center; text-align: center;
margin: 3px; margin: 3px;
font-weight: bold; font-weight: bold;
} }
.casino-card .value { .casino-card .value {
font-size: 15pt; font-size: 20px;
font-family: sans-serif; font-family: sans-serif;
} }
.casino-card.red { .casino-card.red {
color: red; color: red;
} }
.casino-card.black { .casino-card.black {
color: black; color: black;
} }

View File

@@ -6,91 +6,117 @@
*/ */
#character-overview-wrapper { #character-overview-wrapper {
position: relative; position: relative;
} }
#character-overview-container { #character-overview-container {
display: none; display: none;
position: absolute; /* Stay in place */ position: absolute; /* Stay in place */
right: 0; right: 0;
top: 0; top: 0;
height: auto; /* Full height */ height: auto; /* Full height */
padding: 10px 2px; padding: 10px 2px;
border: 2px solid var(--my-highlight-color); border: 2px solid var(--my-highlight-color);
width: auto; width: auto;
max-width: 280px; max-width: 280px;
overflow: auto; /* Enable scroll if needed */ overflow: auto; /* Enable scroll if needed */
background-color: rgba(57, 54, 54, 0.9); /* Fallback color */ background-color: rgba(57, 54, 54, 0.9); /* Fallback color */
z-index: 1; z-index: 1;
} }
#character-overview-text { #character-overview-text {
color: $my-stat-physical; color: $my-stat-physical;
table { table {
border-collapse: collapse; border-collapse: collapse;
margin: auto; margin: auto;
} }
td { td {
padding: 2px; padding: 2px;
vertical-align: middle; vertical-align: middle;
} }
} }
.character-stat-text { .character-stat-text {
color: #fff; color: #fff;
background-color: #444; background-color: #444;
} }
.character-stat-cell { .character-stat-cell {
text-align: right; text-align: right;
} }
#character-str-wrapper td, #character-str-wrapper td,
#character-cha-wrapper td { #character-cha-wrapper td {
padding-top: 10px; padding-top: 10px;
} }
.character-divider td { .character-divider td {
border-top: 1px #aaa solid; border-top: 1px #aaa solid;
padding-top: 10px; padding-top: 10px;
} }
#character-hp-wrapper { color: $my-stat-hp-color; } #character-hp-wrapper {
.character-hp-cell { color: $my-stat-hp-color; } color: $my-stat-hp-color;
#character-money-wrapper { color: $my-stat-money-color; } }
.character-money-cell { color: $my-stat-money-color; } .character-hp-cell {
#character-hack-wrapper { color: $my-stat-hack-color; } color: $my-stat-hp-color;
.character-hack-cell { color: $my-stat-hack-color; } }
#character-cha-wrapper { color: $my-stat-cha-color; } #character-money-wrapper {
.character-cha-cell { color: $my-stat-cha-color; } color: $my-stat-money-color;
#character-int-wrapper { color: $my-stat-int-color; } }
.character-int-cell { color: $my-stat-int-color; } .character-money-cell {
.character-combat-cell { color: $my-stat-physical; } color: $my-stat-money-color;
#character-work-wrapper { color: $my-stat-hack-color; } }
.character-work-cell { color: $my-stat-hack-color; } #character-hack-wrapper {
color: $my-stat-hack-color;
}
.character-hack-cell {
color: $my-stat-hack-color;
}
#character-cha-wrapper {
color: $my-stat-cha-color;
}
.character-cha-cell {
color: $my-stat-cha-color;
}
#character-int-wrapper {
color: $my-stat-int-color;
}
.character-int-cell {
color: $my-stat-int-color;
}
.character-combat-cell {
color: $my-stat-physical;
}
#character-work-wrapper {
color: $my-stat-hack-color;
}
.character-work-cell {
color: $my-stat-hack-color;
}
.character-overview-btn { .character-overview-btn {
@include borderRadius(12px); @include borderRadius(12px);
@include boxShadow(1px 1px 3px #000); @include boxShadow(1px 1px 3px #000);
color: #cecece; color: #cecece;
display: inline-block; display: inline-block;
font-size: $defaultFontSize * 0.875; font-size: $defaultFontSize * 0.875;
font-weight: bold; font-weight: bold;
height: 25px; height: 25px;
background-color: #000; background-color: #000;
padding: 5px 8px; padding: 5px 8px;
} }
.character-quick-options { .character-quick-options {
margin-top: 10px; margin-top: 10px;
text-align: center; text-align: center;
} }
.character-overview-btn:hover, .character-overview-btn:hover,
.character-overview-btn:focus { .character-overview-btn:focus {
color: #fff; color: #fff;
text-decoration: none; text-decoration: none;
cursor: pointer; cursor: pointer;
} }

View File

@@ -5,45 +5,45 @@
*/ */
#codemirror-form-wrapper { #codemirror-form-wrapper {
height: 80%; height: 80%;
margin: 10px 0 0 6px; margin: 10px 0 0 6px;
} }
.CodeMirror { .CodeMirror {
height: 100%; height: 100%;
width: 100%; width: 100%;
border: 2px solid var(--my-highlight-color); border: 2px solid var(--my-highlight-color);
z-index: 1; z-index: 1;
font-family: $fontFamily; font-family: $fontFamily;
font-size: $defaultFontSize; font-size: $defaultFontSize;
} }
/** /**
* Highlight matches * Highlight matches
*/ */
.cm-matchhighlight { .cm-matchhighlight {
background-color: #8f908a; background-color: #8f908a;
} }
.CodeMirror-selection-highlight-scrollbar { .CodeMirror-selection-highlight-scrollbar {
background-color: #8f908a; background-color: #8f908a;
} }
/** /**
* Show Invisibles * Show Invisibles
*/ */
.cm-whitespace::before { .cm-whitespace::before {
position: absolute; position: absolute;
pointer-events: none; pointer-events: none;
color: #404f7d; color: #404f7d;
} }
/** /**
* Vim command display * Vim command display
*/ */
#codemirror-vim-command-display-wrapper { #codemirror-vim-command-display-wrapper {
background-color: white; background-color: white;
font-size: 13px; font-size: 13px;
height: 30px; height: 30px;
margin-left: 6px; margin-left: 6px;
} }

View File

@@ -12,154 +12,154 @@
#cmpy-mgmt-container a, #cmpy-mgmt-container a,
#cmpy-mgmt-container div, #cmpy-mgmt-container div,
#cmpy-mgmt-container br { #cmpy-mgmt-container br {
font-size: $defaultFontSize * 0.8125; font-size: $defaultFontSize * 0.8125;
} }
/* Header tabs */ /* Header tabs */
.cmpy-mgmt-header-tab { .cmpy-mgmt-header-tab {
display: inline-block; display: inline-block;
color: #fff; color: #fff;
background-color: #555; background-color: #555;
border: 1px solid #fff; border: 1px solid #fff;
padding: 4px; padding: 4px;
} }
.cmpy-mgmt-header-tab:hover { .cmpy-mgmt-header-tab:hover {
background-color: #666; background-color: #666;
} }
.cmpy-mgmt-header-tab.current { .cmpy-mgmt-header-tab.current {
background-color: #777; background-color: #777;
} }
/* Switch between Cities */ /* Switch between Cities */
.cmpy-mgmt-city-tab { .cmpy-mgmt-city-tab {
display: inline-block; display: inline-block;
color: #fff; color: #fff;
background-color: #555; background-color: #555;
border: 1px solid #fff; border: 1px solid #fff;
padding: 4px; padding: 4px;
} }
.cmpy-mgmt-city-tab:hover { .cmpy-mgmt-city-tab:hover {
background-color: #666; background-color: #666;
} }
.cmpy-mgmt-city-tab.current { .cmpy-mgmt-city-tab.current {
background-color: #777; background-color: #777;
} }
/* Panels */ /* Panels */
#cmpy-mgmt-panel { #cmpy-mgmt-panel {
height: 90%; height: 90%;
} }
.cmpy-mgmt-industry-left-panel, .cmpy-mgmt-industry-left-panel,
.cmpy-mgmt-industry-right-panel { .cmpy-mgmt-industry-right-panel {
display: inline-block; display: inline-block;
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
overflow-x: auto; overflow-x: auto;
overflow: visible; overflow: visible;
top: 10px; top: 10px;
width: 45%; width: 45%;
} }
.cmpy-mgmt-industry-overview-panel { .cmpy-mgmt-industry-overview-panel {
border: 1px solid #fff; border: 1px solid #fff;
color: var(--my-font-color); color: var(--my-font-color);
display: inline-block; display: inline-block;
padding: 3px; padding: 3px;
width: 100%; width: 100%;
} }
.cmpy-mgmt-employee-panel { .cmpy-mgmt-employee-panel {
border: 1px solid #fff; border: 1px solid #fff;
display: block; display: block;
padding: 3px; padding: 3px;
width: 100%; width: 100%;
} }
.cmpy-mgmt-warehouse-panel { .cmpy-mgmt-warehouse-panel {
border: 1px solid #fff; border: 1px solid #fff;
display: inline-block; display: inline-block;
padding: 3px; padding: 3px;
width: 100%; width: 100%;
} }
/* Hiring new employees */ /* Hiring new employees */
.cmpy-mgmt-find-employee-option { .cmpy-mgmt-find-employee-option {
border: 1px solid #fff; border: 1px solid #fff;
margin: 6px; margin: 6px;
} }
.cmpy-mgmt-find-employee-option:hover { .cmpy-mgmt-find-employee-option:hover {
background-color: #3d4044; background-color: #3d4044;
} }
/* Warehouse */ /* Warehouse */
.cmpy-mgmt-warehouse-material-div { .cmpy-mgmt-warehouse-material-div {
padding: 2px; padding: 2px;
border: 1px solid #fff; border: 1px solid #fff;
} }
.cmpy-mgmt-warehouse-product-div { .cmpy-mgmt-warehouse-product-div {
padding: 2px; padding: 2px;
border: 1px solid #fff; border: 1px solid #fff;
} }
/* Exporting materials/products */ /* Exporting materials/products */
.cmpy-mgmt-existing-export { .cmpy-mgmt-existing-export {
border: 1px solid #fff; border: 1px solid #fff;
border-radius: 25px; border-radius: 25px;
margin: 4px; margin: 4px;
padding: 4px; padding: 4px;
} }
.cmpy-mgmt-existing-export:hover { .cmpy-mgmt-existing-export:hover {
background-color: #333; background-color: #333;
} }
/* Corporation Upgrades */ /* Corporation Upgrades */
.cmpy-mgmt-upgrade-container { .cmpy-mgmt-upgrade-container {
border: 1px solid #fff; border: 1px solid #fff;
width: 60%; width: 60%;
margin: 4px; margin: 4px;
} }
.cmpy-mgmt-upgrade-header { .cmpy-mgmt-upgrade-header {
margin: 6px; margin: 6px;
padding: 6px; padding: 6px;
} }
.cmpy-mgmt-upgrade-div { .cmpy-mgmt-upgrade-div {
display: inline-block; display: inline-block;
border: 1px solid #fff; border: 1px solid #fff;
margin: 2px; margin: 2px;
padding: 6px; padding: 6px;
border-radius: 25px; border-radius: 25px;
font-size: $defaultFontSize * 0.75; font-size: $defaultFontSize * 0.75;
color: var(--my-font-color); color: var(--my-font-color);
} }
.cmpy-mgmt-upgrade-div:hover { .cmpy-mgmt-upgrade-div:hover {
background-color: #333; background-color: #333;
} }
/* Industry Upgrades */ /* Industry Upgrades */
.industry-purchases-and-upgrades-header { .industry-purchases-and-upgrades-header {
font-size: 14px; font-size: 14px;
margin: 2px; margin: 2px;
padding: 2px; padding: 2px;
} }
/* Advertising */ /* Advertising */
.cmpy-mgmt-advertising-info { .cmpy-mgmt-advertising-info {
font-size: $defaultFontSize * 0.75; font-size: $defaultFontSize * 0.75;
} }
/* Research */ /* Research */
#corporation-research-popup-box-content { #corporation-research-popup-box-content {
overflow-x: auto !important; overflow-x: auto !important;
overflow-y: auto !important; overflow-y: auto !important;
} }

4
css/corporation.scss Normal file
View File

@@ -0,0 +1,4 @@
#corporation-container {
position: fixed;
padding: 6px;
}

View File

@@ -1,32 +1,32 @@
.add-exp-button { .add-exp-button {
margin-right: 0; margin-right: 0;
} }
.remove-exp-button { .remove-exp-button {
margin-left: 0; margin-left: 0;
} }
.exp-input { .exp-input {
margin: 5px 0 5px 0; margin: 5px 0 5px 0;
padding: 2px 5px; padding: 2px 5px;
} }
.text-center { .text-center {
margin: auto; margin: auto;
text-align: center; text-align: center;
vertical-align: middle; vertical-align: middle;
} }
.touch-right { .touch-right {
margin-right: 0; margin-right: 0;
} }
.touch-left { .touch-left {
margin-left: 0; margin-left: 0;
} }
.touch-sides { .touch-sides {
margin-left: 0; margin-left: 0;
margin-right: 0; margin-right: 0;
} }

View File

@@ -7,13 +7,13 @@
@import "theme"; @import "theme";
#game-options-right-panel { #game-options-right-panel {
a { a {
display: block; display: block;
width: 46%; width: 46%;
} }
button { button {
display: inline-block; display: inline-block;
width: 46%; width: 46%;
} }
} }

View File

@@ -6,28 +6,29 @@
*/ */
#gang-container { #gang-container {
position: fixed; position: fixed;
padding: 6px; padding: 6px;
p, pre { p,
font-size: $defaultFontSize * 0.9375; pre {
} font-size: $defaultFontSize * 0.9375;
}
select { select {
background-color: black; background-color: black;
color: white; color: white;
} }
} }
#gang-management-subpage > p { #gang-management-subpage > p {
padding: 4px; padding: 4px;
} }
.gang-member-info-div { .gang-member-info-div {
background-color: #555; background-color: #555;
display: inline; display: inline;
float: left; float: left;
width: 30%; width: 30%;
} }
/** /**
@@ -35,14 +36,14 @@
*/ */
.gang-owned-upgrades-div { .gang-owned-upgrades-div {
display: inline-block; display: inline-block;
margin-left: 6px; margin-left: 6px;
width: 75%; width: 75%;
} }
.gang-owned-upgrade { .gang-owned-upgrade {
border: 1px solid white; border: 1px solid white;
font-size: 12px; font-size: 12px;
margin: 1px; margin: 1px;
padding: 1px; padding: 1px;
} }

3408
css/grid.min.css vendored

File diff suppressed because one or more lines are too long

View File

@@ -6,70 +6,70 @@
*/ */
#hacknet-nodes-container { #hacknet-nodes-container {
position: fixed; position: fixed;
padding: 10px; padding: 10px;
} }
.hacknet-general-info { .hacknet-general-info {
margin: 10px; margin: 10px;
width: 70vw; width: 70vw;
} }
#hacknet-nodes-container li { #hacknet-nodes-container li {
float: left; float: left;
overflow: hidden; overflow: hidden;
white-space: nowrap; white-space: nowrap;
&.hacknet-node { &.hacknet-node {
$boxShadowArgs: inset 0 0 8px rgba(0, 0, 0, 0.1), 0 0 16px rgba(0, 0, 0, 0.1); $boxShadowArgs: inset 0 0 8px rgba(0, 0, 0, 0.1), 0 0 16px rgba(0, 0, 0, 0.1);
@include boxShadow($boxShadowArgs); @include boxShadow($boxShadowArgs);
margin: 6px; margin: 6px;
padding: 7px; padding: 7px;
width: 35vw; width: 35vw;
border: 2px solid var(--my-highlight-color); border: 2px solid var(--my-highlight-color);
} }
} }
#hacknet-nodes-list { #hacknet-nodes-list {
list-style: none; list-style: none;
width: 82vw; width: 82vw;
} }
#hacknet-nodes-money { #hacknet-nodes-money {
margin: 10px; margin: 10px;
float: left; float: left;
} }
#hacknet-nodes-money-multipliers-div { #hacknet-nodes-money-multipliers-div {
display: inline-block; display: inline-block;
width: 70vw; width: 70vw;
} }
#hacknet-nodes-multipliers { #hacknet-nodes-multipliers {
float: right; float: right;
} }
#hacknet-nodes-purchase-button { #hacknet-nodes-purchase-button {
display: inline-block; display: inline-block;
} }
.hacknet-node-container { .hacknet-node-container {
display: inline-table; display: inline-table;
.row { .row {
display: table-row; display: table-row;
height: 30px; height: 30px;
p { p {
display: table-cell; display: table-cell;
}
} }
}
.upgradable-info { .upgradable-info {
display: inline-block; display: inline-block;
margin: 0 4px; /* Don't want the vertical margin/padding, just left & right */ margin: 0 4px; /* Don't want the vertical margin/padding, just left & right */
padding: 0 4px; padding: 0 4px;
width: $defaultFontSize * 4; width: $defaultFontSize * 4;
} }
} }

View File

@@ -2,7 +2,7 @@
.blinking-cursor { .blinking-cursor {
font-weight: 100; font-weight: 100;
color: #2E3D48; color: #2e3d48;
-webkit-animation: 1s cursorblink step-end infinite; -webkit-animation: 1s cursorblink step-end infinite;
-moz-animation: 1s cursorblink step-end infinite; -moz-animation: 1s cursorblink step-end infinite;
-ms-animation: 1s cursorblink step-end infinite; -ms-animation: 1s cursorblink step-end infinite;
@@ -10,8 +10,9 @@
animation: 1s cursorblink step-end infinite; animation: 1s cursorblink step-end infinite;
} }
@keyframes "cursorblink" { @keyframes cursorblink {
from, to { from,
to {
color: transparent; color: transparent;
} }
50% { 50% {
@@ -20,7 +21,8 @@
} }
@-moz-keyframes cursorblink { @-moz-keyframes cursorblink {
from, to { from,
to {
color: transparent; color: transparent;
} }
50% { 50% {
@@ -28,8 +30,9 @@
} }
} }
@-webkit-keyframes "cursorblink" { @-webkit-keyframes cursorblink {
from, to { from,
to {
color: transparent; color: transparent;
} }
50% { 50% {
@@ -37,8 +40,9 @@
} }
} }
@-ms-keyframes "cursorblink" { @-ms-keyframes cursorblink {
from, to { from,
to {
color: transparent; color: transparent;
} }
50% { 50% {
@@ -46,11 +50,12 @@
} }
} }
@-o-keyframes "cursorblink" { @-o-keyframes cursorblink {
from, to { from,
to {
color: transparent; color: transparent;
} }
50% { 50% {
color: $hacker-green; color: $hacker-green;
} }
} }

View File

@@ -3,88 +3,88 @@
/* interactivetutorial.css */ /* interactivetutorial.css */
#interactive-tutorial-wrapper { #interactive-tutorial-wrapper {
position: relative; position: relative;
} }
#interactive-tutorial-container { #interactive-tutorial-container {
display: none; display: none;
position: absolute; /* Stay in place */ position: absolute; /* Stay in place */
right: 0; right: 0;
top: 0; top: 0;
height: 450px; height: 450px;
padding: 10px; padding: 10px;
border: 5px solid #fff; border: 5px solid #fff;
width: 23%; width: 23%;
overflow: hidden; overflow: hidden;
background-color: #444; /* Fallback color */ background-color: #444; /* Fallback color */
color: #fff; color: #fff;
> strong { > strong {
background-color: #444; background-color: #444;
} }
} }
#interactive-tutorial-text { #interactive-tutorial-text {
padding: 4px; padding: 4px;
margin: 4px; margin: 4px;
color: #fff; color: #fff;
background-color: #444; background-color: #444;
font-size: $defaultFontSize * 0.875; font-size: $defaultFontSize * 0.875;
max-height: 350px; max-height: 350px;
overflow-y: auto; overflow-y: auto;
} }
#interactive-tutorial-exit, #interactive-tutorial-exit,
#interactive-tutorial-next, #interactive-tutorial-next,
#interactive-tutorial-back { #interactive-tutorial-back {
@include borderRadius(12px); @include borderRadius(12px);
@include boxShadow(1px 1px 3px #000); @include boxShadow(1px 1px 3px #000);
color: #aaa; color: #aaa;
font-size: $defaultFontSize * 1.125; font-size: $defaultFontSize * 1.125;
font-weight: bold; font-weight: bold;
background-color: #000; background-color: #000;
&:hover, &:hover,
&:focus { &:focus {
color: #fff; color: #fff;
text-decoration: none; text-decoration: none;
cursor: pointer; cursor: pointer;
} }
} }
#interactive-tutorial-exit { #interactive-tutorial-exit {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
left: 0; left: 0;
padding: 4px; padding: 4px;
} }
#interactive-tutorial-back { #interactive-tutorial-back {
float: left; float: left;
padding: 4px; padding: 4px;
} }
#interactive-tutorial-next { #interactive-tutorial-next {
float: right; float: right;
padding: 4px; padding: 4px;
} }
.interactive-tutorial-command { .interactive-tutorial-command {
background-color: #000; background-color: #000;
color: $hacker-green; color: $hacker-green;
white-space: nowrap; white-space: nowrap;
} }
.interactive-tutorial-code { .interactive-tutorial-code {
background-color: #272822; background-color: #272822;
color: white; color: white;
padding: 3px; padding: 3px;
} }
.interactive-tutorial-tab { .interactive-tutorial-tab {
background-color: #555; background-color: #555;
color: #e6e6e6; color: #e6e6e6;
padding: 3px; padding: 3px;
box-shadow: 0 0 3px #000; box-shadow: 0 0 3px #000;
} }

View File

@@ -3,109 +3,109 @@
@import "theme"; @import "theme";
@include keyframes(LOADERSPINNER) { @include keyframes(LOADERSPINNER) {
0% { 0% {
#{$browser}transform: translate(-50%, -50%) rotate(0deg); #{$browser}transform: translate(-50%, -50%) rotate(0deg);
} }
100% { 100% {
#{$browser}transform: translate(-50%, -50%) rotate(360deg); #{$browser}transform: translate(-50%, -50%) rotate(360deg);
} }
} }
@include keyframes(LOADERLABEL) { @include keyframes(LOADERLABEL) {
0% { 0% {
opacity: 1.0; opacity: 1;
#{$browser}transform: translate(-50%, -50%) scale(1.0); #{$browser}transform: translate(-50%, -50%) scale(1);
} }
5% { 5% {
opacity: 0.5; opacity: 0.5;
#{$browser}transform: translate(-50%, -50%) scale(0.5); #{$browser}transform: translate(-50%, -50%) scale(0.5);
} }
95% { 95% {
opacity: 0.5; opacity: 0.5;
#{$browser}transform: translate(-50%, -50%) scale(0.5); #{$browser}transform: translate(-50%, -50%) scale(0.5);
} }
100% { 100% {
opacity: 1.0; opacity: 1;
#{$browser}transform: translate(-50%, -50%) scale(1.0); #{$browser}transform: translate(-50%, -50%) scale(1);
} }
} }
.loaderoverlay { .loaderoverlay {
$spinnerBoxSize: 200px; $spinnerBoxSize: 200px;
$themeColor: #6f3; $themeColor: #6f3;
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; position: absolute;
width: 100%; top: 50%;
height: 100%; left: 50%;
background: #000; }
color: $themeColor;
%spinnerBox { .loaderspinner:before,
border: 20px solid rgba(0, 0, 0, 0); .loaderspinner:after {
border-top-color: $themeColor; content: "";
border-bottom-color: $themeColor; }
border-radius: 1000px;
position: absolute;
top: 50%;
left: 50%;
}
.loaderspinner:before, .loaderspinner {
.loaderspinner:after { @extend %spinnerBox;
content: ""; @include animation(LOADERSPINNER 5s linear infinite);
}
.loaderspinner { width: $spinnerBoxSize;
@extend %spinnerBox; height: $spinnerBoxSize;
@include animation(LOADERSPINNER 5s linear infinite); }
width: $spinnerBoxSize; .loaderspinner:before {
height: $spinnerBoxSize; @extend %spinnerBox;
} @include animation(LOADERSPINNER 10s linear infinite);
.loaderspinner:before { width: $spinnerBoxSize * 0.8;
@extend %spinnerBox; height: $spinnerBoxSize * 0.8;
@include animation(LOADERSPINNER 10s linear infinite); }
width: $spinnerBoxSize * 0.8; .loaderspinner:after {
height: $spinnerBoxSize * 0.8; @extend %spinnerBox;
} @include animation(LOADERSPINNER 5s linear infinite);
.loaderspinner:after { width: $spinnerBoxSize * 0.6;
@extend %spinnerBox; height: $spinnerBoxSize * 0.6;
@include animation(LOADERSPINNER 5s linear infinite); }
width: $spinnerBoxSize * 0.6; .loaderlabel {
height: $spinnerBoxSize * 0.6; @include animation(LOADERLABEL 5s linear infinite);
}
.loaderlabel { text-transform: uppercase;
@include animation(LOADERLABEL 5s linear infinite); font-family: sans-serif;
font-size: $defaultFontSize * 1.375;
text-transform: uppercase; font-weight: 700;
font-family: sans-serif; letter-spacing: 2px;
font-size: $defaultFontSize * 1.375; position: absolute;
font-weight: 700; top: 50%;
letter-spacing: 2px; left: 50%;
position: absolute; }
top: 50%;
left: 50%;
}
} }
.killAllMessage { .killAllMessage {
position: absolute; position: absolute;
top: 95%; top: 95%;
left: 50%; left: 50%;
-webkit-transform: translateX(-50%); -webkit-transform: translateX(-50%);
-moz-transform: translateX(-50%); -moz-transform: translateX(-50%);
-ms-transform: translateX(-50%); -ms-transform: translateX(-50%);
-o-transform: translateX(-50%); -o-transform: translateX(-50%);
transform: translateX(-50%); transform: translateX(-50%);
} }
.killAllMessageWrapperHidden { .killAllMessageWrapperHidden {
display: none; display: none;
} }
.killAllMessageWrapperShow { .killAllMessageWrapperShow {
display: block; display: block;
} }

View File

@@ -6,130 +6,130 @@
*/ */
.mainmenu { .mainmenu {
list-style-type: none; list-style-type: none;
margin: 0; margin: 0;
padding: 0; padding: 0;
width: 10%; width: 10%;
position: fixed; position: fixed;
height: 100%; height: 100%;
overflow: auto; overflow: auto;
border: 0; border: 0;
border-bottom: 1px solid #000; border-bottom: 1px solid #000;
border-radius: 0; border-radius: 0;
background-color: #333; background-color: #333;
} }
/* Default buttons */ /* Default buttons */
.mainmenu > li a, .mainmenu > li a,
.mainmenu > li button { .mainmenu > li button {
display: block; display: block;
color: #e6e6e6; color: #e6e6e6;
background-color: #555; background-color: #555;
padding: 12px 8px; padding: 12px 8px;
text-decoration: none; text-decoration: none;
cursor: pointer; cursor: pointer;
width: 100%; width: 100%;
text-align: left; text-align: left;
} }
.mainmenu.classic > li a, .mainmenu.classic > li a,
.mainmenu.classic > li button { .mainmenu.classic > li button {
padding: 16px; padding: 16px;
} }
.mainmenu.compact > li a, .mainmenu.compact > li a,
.mainmenu.compact > li button { .mainmenu.compact > li button {
display: block; display: block;
color: #e6e6e6; color: #e6e6e6;
background-color: #555; background-color: #555;
text-decoration: none; text-decoration: none;
cursor: pointer; cursor: pointer;
width: 100%; width: 100%;
text-align: left; text-align: left;
padding: 4px; padding: 4px;
} }
/* Hovering makes them lighter */ /* Hovering makes them lighter */
.mainmenu > li a:hover, .mainmenu > li a:hover,
.mainmenu > li a:hover:not(.active), .mainmenu > li a:hover:not(.active),
.mainmenu > li a:focus { .mainmenu > li a:focus {
background-color: #777; background-color: #777;
color: #fff; color: #fff;
} }
.mainmenu > li button:hover, .mainmenu > li button:hover,
.mainmenu > li button:hover:not(.active) { .mainmenu > li button:hover:not(.active) {
background-color: #777; background-color: #777;
color: #fff; color: #fff;
} }
/* Panel headers can become active, and they are "lighter" than the rest */ /* Panel headers can become active, and they are "lighter" than the rest */
.mainmenu > li a.active, .mainmenu > li a.active,
.mainmenu > li button.active { .mainmenu > li button.active {
background-color: #777; background-color: #777;
color: #fff; color: #fff;
} }
.mainmenu > li a.active:hover, .mainmenu > li a.active:hover,
.mainmenu > li button.active:hover { .mainmenu > li button.active:hover {
background-color: #aaa; background-color: #aaa;
} }
#hacking-menu-header-li, #hacking-menu-header-li,
#character-menu-header-li, #character-menu-header-li,
#world-menu-header-li, #world-menu-header-li,
#help-menu-header-li { #help-menu-header-li {
position: relative; position: relative;
} }
/* Accordion Outline */ /* Accordion Outline */
.mainmenu-accordion-header, .mainmenu-accordion-header,
.mainmenu-accordion-header-compact { .mainmenu-accordion-header-compact {
outline: 2px solid #fff !important; outline: 2px solid #fff !important;
} }
.mainmenu-accordion-header-classic { .mainmenu-accordion-header-classic {
border: 2px solid #fff; border: 2px solid #fff;
padding: 16px !important; padding: 16px !important;
} }
/* Plus and minus signs */ /* Plus and minus signs */
.mainmenu-accordion-header:after, .mainmenu-accordion-header:after,
.mainmenu-accordion-header-compact:after { .mainmenu-accordion-header-compact:after {
content: '\02795'; content: "\02795";
float: right; float: right;
font-size: $defaultFontSize * 0.8125; font-size: $defaultFontSize * 0.8125;
position: absolute; position: absolute;
bottom: 25%; bottom: 25%;
right: 3px; right: 3px;
color: transparent; color: transparent;
text-shadow: 0 0 0 #fff; text-shadow: 0 0 0 #fff;
} }
.mainmenu-accordion-header-classic:after { .mainmenu-accordion-header-classic:after {
content: '\02795'; content: "\02795";
float: right; float: right;
font-size: $defaultFontSize * 0.8125; font-size: $defaultFontSize * 0.8125;
color: #fff; color: #fff;
margin-left: 5px; margin-left: 5px;
} }
.mainmenu-accordion-header.opened, .mainmenu-accordion-header.opened,
.mainmenu-accordion-header-classic.opened, .mainmenu-accordion-header-classic.opened,
.mainmenu-accordion-header-compact.opened { .mainmenu-accordion-header-compact.opened {
background-color: #222 !important; background-color: #222 !important;
&:after { &:after {
content: "\2796"; content: "\2796";
} }
} }
/* Slide down transition */ /* Slide down transition */
.mainmenu-accordion-panel { .mainmenu-accordion-panel {
max-height: 0; max-height: 0;
opacity: 1; opacity: 1;
transition: max-height 0.2s ease-out; transition: max-height 0.2s ease-out;
} }

View File

@@ -5,151 +5,151 @@
terminal which has its own page) */ terminal which has its own page) */
.generic-menupage-container { .generic-menupage-container {
height: 100%; height: 100%;
padding-left: 10px; padding-left: 10px;
margin-left: 10%; margin-left: 10%;
width: 99%; width: 99%;
overflow-y: scroll; overflow-y: scroll;
} }
/* Character Info */ /* Character Info */
#character-container { #character-container {
padding-top: 10px; padding-top: 10px;
position: fixed; position: fixed;
} }
/* World */ /* World */
#world-container { #world-container {
position: fixed; position: fixed;
padding-top: 10px; padding-top: 10px;
} }
#world-city-name, #world-city-name,
#world-city-desc { #world-city-desc {
padding: 4px; padding: 4px;
margin: 4px; margin: 4px;
} }
/* Create program */ /* Create program */
#create-program-container { #create-program-container {
position: fixed; position: fixed;
padding-top: 10px; padding-top: 10px;
} }
#create-program-page-text, #create-program-page-text,
#create-program-list { #create-program-list {
width: 70%; width: 70%;
} }
/* Factions and Faction (Single Faction page) */ /* Factions and Faction (Single Faction page) */
#factions-container { #factions-container {
position: fixed; position: fixed;
padding-top: 10px; padding-top: 10px;
} }
#faction-container { #faction-container {
position: fixed; position: fixed;
padding-top: 10px; padding-top: 10px;
} }
.faction-work-div { .faction-work-div {
width: 70%; width: 70%;
height: 100%; height: 100%;
} }
.faction-work-div-wrapper { .faction-work-div-wrapper {
overflow: hidden; overflow: hidden;
border: 2px solid #333; border: 2px solid #333;
padding: 6px; padding: 6px;
margin: 6px; margin: 6px;
width: 70%; width: 70%;
} }
#faction-container p, #faction-container p,
#faction-container pre { #faction-container pre {
padding: 4px 6px; padding: 4px 6px;
margin: 4px 6px; margin: 4px 6px;
} }
#faction-container pre { #faction-container pre {
width: 70%; width: 70%;
white-space: pre-wrap; /* Since CSS 2.1 */ white-space: pre-wrap; /* Since CSS 2.1 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */ white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */ white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+ */ word-wrap: break-word; /* Internet Explorer 5.5+ */
} }
/* World */ /* World */
#world-container li { #world-container li {
margin: 0 0 15px 0; margin: 0 0 15px 0;
list-style-type: none; list-style-type: none;
} }
/* Tutorial */ /* Tutorial */
#tutorial-container { #tutorial-container {
position: fixed; position: fixed;
padding-top: 10px; padding-top: 10px;
} }
#tutorial-text { #tutorial-text {
width: 70%; width: 70%;
margin: 10px; margin: 10px;
} }
#tutorial-container a { #tutorial-container a {
width: 50%; width: 50%;
} }
/* Dev menu */ /* Dev menu */
#dev-menu-container { #dev-menu-container {
position: fixed; position: fixed;
padding-top: 10px; padding-top: 10px;
} }
#dev-menu-text { #dev-menu-text {
width: 70%; width: 70%;
margin: 10px; margin: 10px;
} }
#dev-menu-container a { #dev-menu-container a {
width: 50%; width: 50%;
} }
/* Location */ /* Location */
#location-container { #location-container {
position: fixed; position: fixed;
padding: 6px; padding: 6px;
overflow-x: hidden; overflow-x: hidden;
} }
#location-container a { #location-container a {
display: inline-block; display: inline-block;
width: 30%; width: 30%;
} }
#location-slums-description { #location-slums-description {
width: 70%; width: 70%;
margin: 10px; margin: 10px;
} }
#location-return-to-world-button { #location-return-to-world-button {
margin: 10px; margin: 10px;
padding: 6px; padding: 6px;
} }
#location-container > * { #location-container > * {
margin: 10px 5px 10px 5px; margin: 10px 5px 10px 5px;
} }
#location-job-reputation, #location-job-reputation,
#location-company-favor { #location-company-favor {
display: inline; display: inline;
} }
/* Infiltration */ /* Infiltration */
#infiltration-container { #infiltration-container {
position: fixed; position: fixed;
margin: 5px; margin: 5px;
width: 70%; width: 70%;
} }

View File

@@ -1,5 +1,5 @@
#milestones-container { #milestones-container {
position: fixed; position: fixed;
padding: 6px; padding: 6px;
width: 60%; width: 60%;
} }

View File

@@ -5,115 +5,115 @@
/* Hacking missions */ /* Hacking missions */
#mission-container { #mission-container {
overflow: hidden; overflow: hidden;
} }
.hack-mission-grid { .hack-mission-grid {
display: grid; display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr; grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr; grid-template-rows: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
grid-gap: 2.5%; grid-gap: 2.5%;
height: 90%; height: 90%;
position: absolute; position: absolute;
width: 100%; width: 100%;
overflow-y: auto; overflow-y: auto;
padding-right: 10px; padding-right: 10px;
&::-webkit-scrollbar { &::-webkit-scrollbar {
display: none; display: none;
} }
} }
.hack-mission-node { .hack-mission-node {
z-index: 5; z-index: 5;
background-color: #808080; background-color: #808080;
align-self: center; align-self: center;
justify-self: center; justify-self: center;
display: inline-block; display: inline-block;
p { p {
@include userSelect(none); @include userSelect(none);
margin-top: 8px; margin-top: 8px;
color: #fff; color: #fff;
font-size: $defaultFontSize * 0.75; font-size: $defaultFontSize * 0.75;
text-align: center; text-align: center;
} }
} }
.hack-mission-player-node { .hack-mission-player-node {
color: #fff; color: #fff;
background-color: #00f; background-color: #00f;
} }
.hack-mission-player-node-active { .hack-mission-player-node-active {
border: 2px solid #fff; border: 2px solid #fff;
background-color: #66f; background-color: #66f;
} }
.hack-mission-enemy-node { .hack-mission-enemy-node {
color: #fff; color: #fff;
background-color: #f00; background-color: #f00;
} }
.hack-mission-cpu-node { .hack-mission-cpu-node {
@include borderRadius(50%); @include borderRadius(50%);
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
.hack-mission-firewall-node { .hack-mission-firewall-node {
width: 90%; width: 90%;
height: 100%; height: 100%;
} }
.hack-mission-database-node { .hack-mission-database-node {
@include transform(skew(20deg)); @include transform(skew(20deg));
width: 100%; width: 100%;
height: 90%; height: 90%;
p { p {
@include transform(skew(-20deg)); @include transform(skew(-20deg));
@include userSelect(none); @include userSelect(none);
color: #fff; color: #fff;
font-size: $defaultFontSize * 0.75; font-size: $defaultFontSize * 0.75;
margin-top: 8px; margin-top: 8px;
text-align: center; text-align: center;
} }
} }
.hack-mission-transfer-node { .hack-mission-transfer-node {
@include transform(skew(-20deg)); @include transform(skew(-20deg));
width: 100%; width: 100%;
height: 90%; height: 90%;
p { p {
@include transform(skew(20deg)); @include transform(skew(20deg));
@include userSelect(none); @include userSelect(none);
color: #fff; color: #fff;
font-size: $defaultFontSize * 0.75; font-size: $defaultFontSize * 0.75;
margin-top: 8px; margin-top: 8px;
text-align: center; text-align: center;
} }
} }
.hack-mission-spam-node, .hack-mission-spam-node,
.hack-mission-shield-node { .hack-mission-shield-node {
height: 100%; height: 100%;
width: 100%; width: 100%;
} }
/* Non-map related DOM elements */ /* Non-map related DOM elements */
/* Element at the top of the Hacking Mission page (intro page, start button, guide buttons, etc.) */ /* Element at the top of the Hacking Mission page (intro page, start button, guide buttons, etc.) */
.hack-mission-header-element { .hack-mission-header-element {
margin: 6px; margin: 6px;
} }
.hack-mission-action-buttons-container { .hack-mission-action-buttons-container {
border: 2px solid #fff; border: 2px solid #fff;
} }

View File

@@ -4,241 +4,241 @@
/* Pop-up boxes */ /* Pop-up boxes */
.popup-box-container { .popup-box-container {
display: none; /* Initially hidden */ display: none; /* Initially hidden */
position: fixed; /* Stay in place */ position: fixed; /* Stay in place */
z-index: 10; /* Sit on top */ z-index: 10; /* Sit on top */
left: 0; left: 0;
top: 0; top: 0;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
width: 100%; width: 100%;
height: 100%; height: 100%;
background-color: rbga(var(--my-background-color), 0.4); background-color: rbga(var(--my-background-color), 0.4);
} }
.popup-box-content { .popup-box-content {
background-color: var(--my-background-color); background-color: var(--my-background-color);
padding: 12px; padding: 12px;
border: 5px solid var(--my-highlight-color); border: 5px solid var(--my-highlight-color);
width: 70%; width: 70%;
max-height: 80%; max-height: 80%;
overflow-y: auto; overflow-y: auto;
z-index: 11; /* Sit on top of the container */ z-index: 11; /* Sit on top of the container */
color: var(--my-font-color); color: var(--my-font-color);
} }
.popup-box-button, .popup-box-button,
.popup-box-button-inactive { .popup-box-button-inactive {
color: #aaa; color: #aaa;
float: right; float: right;
font-size: $defaultFontSize; font-size: $defaultFontSize;
font-weight: bold; font-weight: bold;
padding: 2px; padding: 2px;
margin: 6px; margin: 6px;
border: 1px solid #fff; border: 1px solid #fff;
background-color: #000; background-color: #000;
} }
.popup-box-button:hover, .popup-box-button:hover,
.popup-box-button:focus { .popup-box-button:focus {
color: var(--my-font-color); color: var(--my-font-color);
text-decoration: none; text-decoration: none;
cursor: pointer; cursor: pointer;
} }
.popupbox-button-inactive { .popupbox-button-inactive {
pointer-events: none; pointer-events: none;
cursor: default; cursor: default;
} }
#yes-no-text-input-box-input { #yes-no-text-input-box-input {
color: var(--my-font-color); color: var(--my-font-color);
border: 1px solid #fff; border: 1px solid #fff;
background-color: #000; background-color: #000;
} }
.dialog-box-container { .dialog-box-container {
display: block; display: block;
position: absolute; position: absolute;
z-index: 10; z-index: 10;
width: 50%; width: 50%;
height: auto; height: auto;
max-height: 50%; max-height: 50%;
top: 40%; top: 40%;
left: 50%; left: 50%;
margin: -10% 0 0 -25%; margin: -10% 0 0 -25%;
overflow: auto; overflow: auto;
background-color: var(--my-background-color); background-color: var(--my-background-color);
border: 5px solid var(--my-highlight-color); border: 5px solid var(--my-highlight-color);
} }
.log-box-container { .log-box-container {
display: flex; display: flex;
flex-flow: column; flex-flow: column;
background-color: gray; background-color: gray;
width: 50%; width: 50%;
position: absolute; position: absolute;
left: 50%; left: 50%;
top: 40%; top: 40%;
margin: -10% 0 0 -25%; margin: -10% 0 0 -25%;
height: auto; height: auto;
max-height: 50%; max-height: 50%;
z-index: 10; z-index: 10;
background-color: var(--my-background-color); background-color: var(--my-background-color);
border: 2px solid var(--my-highlight-color); border: 2px solid var(--my-highlight-color);
} }
.log-box-header { .log-box-header {
background-color: #333; background-color: #333;
border: 1px solid var(--my-highlight-color); border: 1px solid var(--my-highlight-color);
display: flex; display: flex;
flex: row nowrap; flex: row nowrap;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
} }
.log-box-log-container { .log-box-log-container {
overflow-y: auto; overflow-y: auto;
} }
.log-box-button { .log-box-button {
color: #aaa; color: #aaa;
font-size: $defaultFontSize; font-size: $defaultFontSize;
font-weight: bold; font-weight: bold;
padding: 2px; padding: 2px;
margin: 6px; margin: 6px;
border: 1px solid #fff; border: 1px solid #fff;
background-color: #000; background-color: #000;
} }
.log-box-button:hover, .log-box-button:hover,
.log-box-button:focus { .log-box-button:focus {
color: var(--my-font-color); color: var(--my-font-color);
text-decoration: none; text-decoration: none;
cursor: pointer; cursor: pointer;
} }
.dialog-box-content { .dialog-box-content {
z-index: 2; z-index: 2;
background-color: var(--my-background-color); background-color: var(--my-background-color);
padding: 10px; padding: 10px;
p span { p span {
padding: 0; padding: 0;
margin: 0; margin: 0;
} }
} }
.dialog-box-close-button { .dialog-box-close-button {
@include borderRadius(12px); @include borderRadius(12px);
@include boxShadow(1px 1px 3px #000); @include boxShadow(1px 1px 3px #000);
@extend .noselect; @extend .noselect;
float: right; float: right;
color: #aaa; color: #aaa;
font-size: $defaultFontSize * 1.25; font-size: $defaultFontSize * 1.25;
font-weight: bold; font-weight: bold;
} }
#log-box-close { #log-box-close {
position: fixed; position: fixed;
right: 27%; right: 27%;
} }
#log-box-kill-script { #log-box-kill-script {
right: 11%; right: 11%;
position: relative; position: relative;
} }
#log-box-close, #log-box-kill-script { #log-box-close,
float: right; #log-box-kill-script {
display: inline-block; float: right;
display: inline-block;
} }
.dialog-box-close-button:hover, .dialog-box-close-button:hover,
.dialog-box-close-button:focus,{ .dialog-box-close-button:focus {
color: #fff; color: #fff;
text-decoration: none; text-decoration: none;
cursor: pointer; cursor: pointer;
} }
/* Faction invitation box */ /* Faction invitation box */
#faction-invitation-box-container { #faction-invitation-box-container {
transition: opacity 400ms ease-in; transition: opacity 400ms ease-in;
} }
#faction-invitation-box-warning { #faction-invitation-box-warning {
margin: 4px; margin: 4px;
padding: 4px; padding: 4px;
} }
/* Infiltration-box */ /* Infiltration-box */
#infiltration-box-sell, #infiltration-box-sell,
#infiltration-box-faction { #infiltration-box-faction {
display: block; display: block;
padding: 8px; padding: 8px;
margin: 8px; margin: 8px;
} }
#infiltration-box-content span { #infiltration-box-content span {
padding: 0; padding: 0;
margin: 0; margin: 0;
} }
#infiltration-faction-select { #infiltration-faction-select {
background-color: #000; background-color: #000;
} }
/* Generic Yes No Box */ /* Generic Yes No Box */
#yes-no-text-input-box-input { #yes-no-text-input-box-input {
color: #fff; color: #fff;
} }
/* Game Options */ /* Game Options */
#game-options-container { #game-options-container {
transition: opacity 400ms ease-in; transition: opacity 400ms ease-in;
} }
#game-options-content { #game-options-content {
background-color: var(--my-background-color); background-color: var(--my-background-color);
padding: 10px; padding: 10px;
border: 5px solid var(--my-highlight-color); border: 5px solid var(--my-highlight-color);
color: var(--my-font-color); color: var(--my-font-color);
width: 80%; width: 80%;
max-height: 80%; max-height: 80%;
overflow-y: auto; overflow-y: auto;
} }
#game-options-left-panel, #game-options-left-panel,
#game-options-right-panel { #game-options-right-panel {
display: inline-block; display: inline-block;
width: 49%; width: 49%;
} }
#game-options-close-button { #game-options-close-button {
@include borderRadius(12px); @include borderRadius(12px);
@include boxShadow(1px 1px 3px #000); @include boxShadow(1px 1px 3px #000);
color: #aaa; color: #aaa;
float: right; float: right;
margin: 4px; margin: 4px;
padding: 4px; padding: 4px;
font-size: $defaultFontSize * 1.25; font-size: $defaultFontSize * 1.25;
font-weight: bold; font-weight: bold;
} }
#game-options-close-button:hover, #game-options-close-button:hover,
#game-options-close-button:focus { #game-options-close-button:focus {
color: #fff; color: #fff;
text-decoration: none; text-decoration: none;
cursor: pointer; cursor: pointer;
} }
#game-options-left-panel fieldset { #game-options-left-panel fieldset {
padding: 2px; padding: 2px;
margin: 2px; margin: 2px;
} }
#import-game-file-selector { #import-game-file-selector {
display: none; display: none;
} }

View File

@@ -4,31 +4,31 @@
* Styling for the Red Pill screen (the BitNode selection UI) * Styling for the Red Pill screen (the BitNode selection UI)
*/ */
#red-pill-container { #red-pill-container {
position: fixed; position: fixed;
} }
.bitnode { .bitnode {
&.level-0 { &.level-0 {
color: red; color: red;
} }
&.level-1 { &.level-1 {
color: yellow; color: yellow;
} }
&.level-2 { &.level-2 {
color: #48d1cc; color: #48d1cc;
} }
&.level-3 { &.level-3 {
color: blue; color: blue;
} }
&.unimplemented { &.unimplemented {
color: gray; color: gray;
} }
&:hover { &:hover {
color: #fff; color: #fff;
} }
} }

View File

@@ -3,26 +3,31 @@
*/ */
@import "theme"; @import "theme";
.resleeve-container { #resleeve-container {
border: 1px solid white; position: fixed;
margin: 4px; padding: 6px;
width: 75%; }
p { .resleeve-elem {
font-size: $defaultFontSize * 0.8125; border: 1px solid white;
} margin: 4px;
width: 75%;
p {
font-size: $defaultFontSize * 0.8125;
}
} }
.resleeve-panel { .resleeve-panel {
display: inline-block; display: inline-block;
margin: 0; margin: 0;
padding: 2px; padding: 2px;
} }
.resleeve-aug-selector { .resleeve-aug-selector {
font-size: $defaultFontSize * 0.8125; font-size: $defaultFontSize * 0.8125;
option { option {
font-size: $defaultFontSize * 0.8125; font-size: $defaultFontSize * 0.8125;
} }
} }

View File

@@ -6,102 +6,102 @@
*/ */
#script-editor-container { #script-editor-container {
background-color: transparent; background-color: transparent;
} }
/* This temp element is used for auto adjusting filename field */ /* This temp element is used for auto adjusting filename field */
.tmp-element { .tmp-element {
visibility: hidden; visibility: hidden;
white-space: pre; white-space: pre;
} }
#script-editor-container { #script-editor-container {
position: fixed; position: fixed;
padding-top: 10px; padding-top: 10px;
} }
#script-editor-buttons-wrapper { #script-editor-buttons-wrapper {
width: 100%; width: 100%;
padding-right: 0; padding-right: 0;
margin-right: 0; margin-right: 0;
} }
#script-editor-wrapper { #script-editor-wrapper {
height: 100%; height: 100%;
width: 70%; width: 70%;
background: transparent; background: transparent;
} }
#script-editor-filename-wrapper { #script-editor-filename-wrapper {
background-color: #555; background-color: #555;
margin-right: 0; margin-right: 0;
padding-left: 6px; padding-left: 6px;
width: 100%; width: 100%;
border: 2px solid var(--my-highlight-color); border: 2px solid var(--my-highlight-color);
} }
#script-editor-filename-tag { #script-editor-filename-tag {
display: inline-block; display: inline-block;
padding-top: 10px; padding-top: 10px;
padding-bottom: 0; padding-bottom: 0;
float: center; float: center;
background-color: #555; background-color: #555;
color: #fff; color: #fff;
} }
#script-editor-filename { #script-editor-filename {
$boxShadowArgs: inset 0 0 8px rgba(0, 0, 0, 0.1), 0 0 16px rgba(0, 0, 0, 0.1); $boxShadowArgs: inset 0 0 8px rgba(0, 0, 0, 0.1), 0 0 16px rgba(0, 0, 0, 0.1);
@include boxShadow($boxShadowArgs); @include boxShadow($boxShadowArgs);
background-color: #555; background-color: #555;
border: 2px solid var(--my-highlight-color); border: 2px solid var(--my-highlight-color);
color: #fff; color: #fff;
display: inline-block; display: inline-block;
float: center; float: center;
margin: 4px; margin: 4px;
padding: 2px; padding: 2px;
resize: none; resize: none;
width: 60%; width: 60%;
} }
#script-editor-status { #script-editor-status {
float: left; float: left;
color: #fff; color: #fff;
} }
#script-editor-options-panel { #script-editor-options-panel {
position: absolute; position: absolute;
right: 9%; right: 9%;
bottom: 15%; bottom: 15%;
border: 2px solid #fff; border: 2px solid #fff;
width: 19%; width: 19%;
background-color: #444; background-color: #444;
padding: 2px; padding: 2px;
overflow: auto; overflow: auto;
z-index: 1; z-index: 1;
color: #fff; color: #fff;
max-height: 50%; max-height: 50%;
} }
#script-editor-options-panel fieldset { #script-editor-options-panel fieldset {
margin-top: 8px; margin-top: 8px;
margin-bottom: 8px; margin-bottom: 8px;
padding: 2px; padding: 2px;
font-size: $defaultFontSize * 0.75; font-size: $defaultFontSize * 0.75;
input { input {
margin: 2px; margin: 2px;
} }
} }
.editor-options-container { .editor-options-container {
display: flex; display: flex;
flex-flow: column; flex-flow: column;
} }
.editor-options-line { .editor-options-line {
display: flex; display: flex;
flex: row nowrap; flex: row nowrap;
align-items: center; align-items: center;
justify-content: start; justify-content: start;
} }

View File

@@ -3,27 +3,28 @@
*/ */
@import "theme"; @import "theme";
.sleeve-container { #sleeves-container {
border: 1px solid white; position: fixed;
margin: 4px; padding: 6px;
width: 75%; }
p { .sleeve-elem {
font-size: $defaultFontSize * 0.875; border: 1px solid white;
} margin: 4px;
display: block;
} }
.sleeves-page-info { .sleeves-page-info {
display: "block"; display: "block";
width: 75%; width: 75%;
} }
.sleeve-panel { .sleeve-panel {
display: inline-block; display: inline-block;
margin: 0; margin: 0;
padding: 2px; padding: 2px;
select { select {
display: block; display: block;
} }
} }

View File

@@ -1,98 +1,99 @@
@import "theme"; @import "theme";
#stock-market-container { #stock-market-container {
position: fixed; position: fixed;
padding: 6px; padding: 6px;
p { p {
font-size: $defaultFontSize * 0.8125; font-size: $defaultFontSize * 0.8125;
} }
a { a {
font-size: $defaultFontSize * 0.875; font-size: $defaultFontSize * 0.875;
} }
} }
.stock-market-info-and-purchases { .stock-market-info-and-purchases {
> h2 { > h2 {
display: block; display: block;
margin-top: 10px; margin-top: 10px;
margin-left: 10px; margin-left: 10px;
} }
> p { > p {
display: block; display: block;
margin-left: 10px; margin-left: 10px;
width: 70%; width: 70%;
} }
> a, > button { > a,
margin: 10px; > button {
} margin: 10px;
}
} }
#stock-market-list { #stock-market-list {
list-style: none; list-style: none;
li { li {
button { button {
font-size: $defaultFontSize; font-size: $defaultFontSize;
}
} }
}
} }
#stock-market-watchlist-filter { #stock-market-watchlist-filter {
display: block; display: block;
margin: 5px 5px 5px 10px; margin: 5px 5px 5px 10px;
padding: 4px; padding: 4px;
width: 50%; width: 50%;
} }
.stock-market-input { .stock-market-input {
display: inline-block; display: inline-block;
padding: 4px; padding: 4px;
margin: 2px; margin: 2px;
background-color: #000; background-color: #000;
border: 1px solid #fff; border: 1px solid #fff;
color: var(--my-font-color); color: var(--my-font-color);
} }
.stock-market-price-movement-warning { .stock-market-price-movement-warning {
border: 1px solid white; border: 1px solid white;
color: red; color: red;
margin: 2px; margin: 2px;
padding: 2px; padding: 2px;
} }
.stock-market-position-text { .stock-market-position-text {
color: #fff;
display: block;
p {
color: #fff; color: #fff;
display: block; display: inline-block;
margin: 4px;
}
p { h3 {
color: #fff; margin: 4px;
display: inline-block; }
margin: 4px;
}
h3 {
margin: 4px;
}
} }
.stock-market-order-list { .stock-market-order-list {
overflow-y: auto; overflow-y: auto;
max-height: 100px; max-height: 100px;
li { li {
color: #fff; color: #fff;
padding: 4px; padding: 4px;
} }
} }
.stock-market-order-cancel-btn { .stock-market-order-cancel-btn {
background-color: #000; background-color: #000;
border: 1px solid #fff; border: 1px solid #fff;
color: var(--my-font-color); color: var(--my-font-color);
margin: 2px; margin: 2px;
padding: 0; padding: 0;
} }

View File

@@ -4,14 +4,14 @@
@import "reset"; @import "reset";
:root { :root {
--my-font-color: #6f3; --my-font-color: #6f3;
--my-background-color: #000; --my-background-color: #000;
--my-highlight-color: #fff; --my-highlight-color: #fff;
--my-prompt-color: #f92672; --my-prompt-color: #f92672;
} }
body { body {
background-color: var(--my-background-color); background-color: var(--my-background-color);
} }
p, p,
@@ -21,29 +21,29 @@ h3,
h4, h4,
.text, .text,
td { td {
color: var(--my-font-color); color: var(--my-font-color);
} }
h1 { h1 {
font-size: $defaultFontSize * 1.375; font-size: $defaultFontSize * 1.375;
color: var(--my-font-color); color: var(--my-font-color);
} }
ul { ul {
padding: 2px; padding: 2px;
list-style-type: none; list-style-type: none;
} }
li { li {
list-style-type: none; list-style-type: none;
} }
br { br {
@extend .noselect; @extend .noselect;
} }
#entire-game-container { #entire-game-container {
background-color: transparent; background-color: transparent;
} }
/* Disable border highlight on elements */ /* Disable border highlight on elements */
@@ -52,379 +52,452 @@ textarea:focus,
button:focus, button:focus,
td:focus, td:focus,
tr:focus { tr:focus {
outline: none; outline: none;
} }
/* Make html links ("a" elements) nice looking buttons with this class */ /* Make html links ("a" elements) nice looking buttons with this class */
a:link, a:link,
a:visited { a:visited {
color: #fff; color: #fff;
} }
.dropdown { .dropdown {
color: #fff; color: #fff;
background-color: #000; background-color: #000;
} }
.text-input { .text-input {
color: #fff; color: #fff;
background-color: #000; background-color: #000;
border-style: solid; border-style: solid;
border-width: 1px; border-width: 1px;
border-color: white; border-color: white;
} }
/* Notification icon (for create program right now only) */ /* Notification icon (for create program right now only) */
#create-program-tab { #create-program-tab {
position: relative; position: relative;
} }
#create-program-notification { #create-program-notification {
font-size: $defaultFontSize * 0.625; font-size: $defaultFontSize * 0.625;
position: absolute; /* Position the badge within the relatively positioned button */ position: absolute; /* Position the badge within the relatively positioned button */
top: 0; top: 0;
right: 0; right: 0;
} }
#factions-tab { #factions-tab {
position: relative; position: relative;
} }
#factions-notification { #factions-notification {
font-size: $defaultFontSize * 0.625; font-size: $defaultFontSize * 0.625;
position: absolute; /* Position the badge within the relatively positioned button */ position: absolute; /* Position the badge within the relatively positioned button */
top: 0; top: 0;
right: 0; right: 0;
} }
#augmentations-tab { #augmentations-tab {
position: relative; position: relative;
} }
#augmentations-notification { #augmentations-notification {
font-size: $defaultFontSize * 0.625; font-size: $defaultFontSize * 0.625;
position: absolute; /* Position the badge within the relatively positioned button */ position: absolute; /* Position the badge within the relatively positioned button */
top: 0; top: 0;
right: 0; right: 0;
} }
.notification-on { .notification-on {
background-color: #fa3e3e; background-color: #fa3e3e;
color: #fff; color: #fff;
border-radius: 2px; border-radius: 2px;
padding: 1px 3px; padding: 1px 3px;
} }
.notification-off { .notification-off {
background-color: #333; background-color: #333;
color: #333; color: #333;
border-radius: 0; border-radius: 0;
padding: 0; padding: 0;
} }
/* help tip. Question mark that opens popup with info/details */ /* help tip. Question mark that opens popup with info/details */
.help-tip { .help-tip {
background-color: black; background-color: black;
border: 1px solid #fff; border: 1px solid #fff;
border-radius: 5px; border-radius: 5px;
color: #fff; color: #fff;
content: '?'; content: "?";
display: inline-block; display: inline-block;
margin-left: 3px; margin-left: 3px;
padding: 1px; padding: 1px;
} }
.help-tip-big { .help-tip-big {
content: '?'; content: "?";
padding: 3px; padding: 3px;
margin-left: 3px; margin-left: 3px;
color: #fff; color: #fff;
border: 1px solid #fff; border: 1px solid #fff;
border-radius: 8px; border-radius: 8px;
display: inline-block; display: inline-block;
} }
.help-tip:hover, .help-tip:hover,
.help-tip-big:hover { .help-tip-big:hover {
background-color: #888; background-color: #888;
} }
.help-tip:active, .help-tip:active,
.help-tip-big:active { .help-tip-big:active {
@include boxShadow(inset 0 1px 4px rgba(0, 0, 0, 0.6)); @include boxShadow(inset 0 1px 4px rgba(0, 0, 0, 0.6));
} }
/* Flashing button (Red) */ /* Flashing button (Red) */
@-webkit-keyframes glowing { @-webkit-keyframes glowing {
0% { background-color: #b20000; -webkit-box-shadow: 0 0 3px #b20000; } 0% {
50% { background-color: #f00; -webkit-box-shadow: 0 0 40px #f00; } background-color: #b20000;
100% { background-color: #b20000; -webkit-box-shadow: 0 0 3px #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 { @-moz-keyframes glowing {
0% { background-color: #b20000; -moz-box-shadow: 0 0 3px #b20000; } 0% {
50% { background-color: #f00; -moz-box-shadow: 0 0 40px #f00; } background-color: #b20000;
100% { background-color: #b20000; -moz-box-shadow: 0 0 3px #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 { @-o-keyframes glowing {
0% { background-color: #b20000; box-shadow: 0 0 3px #b20000; } 0% {
50% { background-color: #f00; box-shadow: 0 0 40px #f00; } background-color: #b20000;
100% { background-color: #b20000; box-shadow: 0 0 3px #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 { @keyframes glowing {
0% { background-color: #b20000; box-shadow: 0 0 3px #b20000; } 0% {
50% { background-color: #f00; box-shadow: 0 0 40px #f00; } background-color: #b20000;
100% { background-color: #b20000; box-shadow: 0 0 3px #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 { .flashing-button {
-webkit-animation: glowing 1500ms infinite; -webkit-animation: glowing 1500ms infinite;
-moz-animation: glowing 1500ms infinite; -moz-animation: glowing 1500ms infinite;
-o-animation: glowing 1500ms infinite; -o-animation: glowing 1500ms infinite;
animation: glowing 1500ms infinite; animation: glowing 1500ms infinite;
} }
/* Blinking Cursor */ /* Blinking Cursor */
/* ----- blinking cursor animation ----- */ /* ----- blinking cursor animation ----- */
.typed-cursor { .typed-cursor {
opacity: 1; opacity: 1;
-webkit-animation: blink 0.95s infinite; -webkit-animation: blink 0.95s infinite;
-moz-animation: blink 0.95s infinite; -moz-animation: blink 0.95s infinite;
-ms-animation: blink 0.95s infinite; -ms-animation: blink 0.95s infinite;
-o-animation: blink 0.95s infinite; -o-animation: blink 0.95s infinite;
animation: blink 0.95s infinite; animation: blink 0.95s infinite;
} }
@-keyframes blink{ @-keyframes blink {
0% { opacity: 1; } 0% {
50% { opacity: 0; } opacity: 1;
100% { opacity: 1; } }
50% {
opacity: 0;
}
100% {
opacity: 1;
}
} }
@-webkit-keyframes blink{ @-webkit-keyframes blink {
0% { opacity: 1; } 0% {
50% { opacity: 0; } opacity: 1;
100% { opacity: 1; } }
50% {
opacity: 0;
}
100% {
opacity: 1;
}
} }
@-moz-keyframes blink{ @-moz-keyframes blink {
0% { opacity: 1; } 0% {
50% { opacity: 0; } opacity: 1;
100% { opacity: 1; } }
50% {
opacity: 0;
}
100% {
opacity: 1;
}
} }
@-ms-keyframes blink{ @-ms-keyframes blink {
0% { opacity: 1; } 0% {
50% { opacity: 0; } opacity: 1;
100% { opacity: 1; } }
50% {
opacity: 0;
}
100% {
opacity: 1;
}
} }
@-o-keyframes blink{ @-o-keyframes blink {
0% { opacity: 1; } 0% {
50% { opacity: 0; } opacity: 1;
100% { opacity: 1; } }
50% {
opacity: 0;
}
100% {
opacity: 1;
}
} }
/* Status text */ /* Status text */
@-webkit-keyframes status-text { @-webkit-keyframes status-text {
from { from {
opacity: 1; opacity: 1;
} }
to { to {
opacity: 0; opacity: 0;
} }
} }
.status-text { .status-text {
z-index: 2; z-index: 2;
-webkit-animation: status-text 3s 1; -webkit-animation: status-text 3s 1;
} }
#status-text-container { #status-text-container {
background-color: transparent; background-color: transparent;
position: absolute; position: absolute;
top: 0; top: 0;
left: 50%; left: 50%;
} }
#status-text { #status-text {
background-color: transparent; background-color: transparent;
bottom: 0; bottom: 0;
color: #fff; color: #fff;
display: none; display: none;
font-size: $defaultFontSize * 1.25; font-size: $defaultFontSize * 1.25;
margin-right: 14px; margin-right: 14px;
opacity: 0; opacity: 0;
padding: 4px; padding: 4px;
right: 0; right: 0;
top: 0; top: 0;
width: auto; width: auto;
} }
/* Scan analyze links from AutoLink */ /* Scan analyze links from AutoLink */
.scan-analyze-link { .scan-analyze-link {
cursor: pointer; cursor: pointer;
color: #fff; color: #fff;
text-decoration: underline; text-decoration: underline;
&:hover { &:hover {
text-decoration: none; text-decoration: none;
} }
} }
/* Accordion menus (Header with collapsible panel) */ /* Accordion menus (Header with collapsible panel) */
.accordion-header { .accordion-header {
background-color: #444; background-color: #444;
color: #fff; color: #fff;
font-size: $defaultFontSize * 1.25; font-size: $defaultFontSize * 1.25;
margin: 6px 6px 0 6px; margin: 6px 6px 0 6px;
padding: 4px 6px; padding: 4px 6px;
cursor: pointer; cursor: pointer;
width: 80%; width: 80%;
text-align: left; text-align: left;
border: none; border: none;
outline: none; outline: none;
position: relative; position: relative;
&.active, &.active,
&:hover { &:hover {
background-color: #555; background-color: #555;
} }
&.active:hover { &.active:hover {
background-color: #666; background-color: #666;
} }
&:after { &:after {
content: '\02795'; /* "plus" sign (+) */ content: "\02795"; /* "plus" sign (+) */
font-size: $defaultFontSize * 0.875; font-size: $defaultFontSize * 0.875;
float: right; float: right;
color: transparent; color: transparent;
text-shadow: 0 0 0 #fff; text-shadow: 0 0 0 #fff;
position: absolute; position: absolute;
bottom: 5px; bottom: 5px;
right: 6px; right: 6px;
} }
&.active:after { &.active:after {
content: "\2796"; /* "minus" sign (-) */ content: "\2796"; /* "minus" sign (-) */
} }
} }
.accordion-panel { .accordion-panel {
margin: 0 6px 6px 6px; margin: 0 6px 6px 6px;
padding: 0 6px 6px 6px; padding: 0 6px 6px 6px;
width: 75%; width: 75%;
margin-left: 5%; margin-left: 5%;
display: none; display: none;
background-color: #555; background-color: #555;
overflow-y: auto; overflow-y: auto;
overflow-x: none; overflow-x: none;
div, ul, p, ul > li { div,
background-color: #555; ul,
} p,
ul > li {
background-color: #555;
}
} }
/* override the global <span> styling */ /* override the global <span> styling */
#active-scripts-total-production-active, #active-scripts-total-production-active,
#active-scripts-total-prod-aug-total, #active-scripts-total-prod-aug-total,
#active-scripts-total-prod-aug-avg { #active-scripts-total-prod-aug-avg {
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
/* Helper Classes */ /* Helper Classes */
.hacker-green { .hacker-green {
color: $hacker-green; color: $hacker-green;
} }
.money-gold { .money-gold {
color: $money-gold; color: $money-gold;
} }
.light-yellow { .light-yellow {
color: $light-yellow; color: $light-yellow;
}
.unbuyable {
color: #66cfbc;
} }
.failure { .failure {
color: $alert-red; color: $alert-red;
text-shadow: 0 0 0 $alert-red; text-shadow: 0 0 0 $alert-red;
} }
.success { .success {
color: $success-green; color: $success-green;
text-shadow: 0 0 0 $success-green; text-shadow: 0 0 0 $success-green;
} }
.physical-yellow { .physical-yellow {
color: $my-stat-physical; color: $my-stat-physical;
} }
.charisma-purple { .charisma-purple {
color: $my-stat-cha-color; color: $my-stat-cha-color;
} }
.reputation { .reputation {
color: $light-yellow; color: $light-yellow;
} }
.smallfont { .smallfont {
font-size: $defaultFontSize * 0.8125; font-size: $defaultFontSize * 0.8125;
} }
.samefont { .samefont {
font-size: inherit; font-size: inherit;
} }
.noscrollbar { .noscrollbar {
-ms-overflow-style: none; /* IE and Edge */ -ms-overflow-style: none; /* IE and Edge */
/* stylelint-disable-next-line property-no-unknown */ /* stylelint-disable-next-line property-no-unknown */
scrollbar-width: none; /* Firefox https://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-width */ scrollbar-width: none; /* Firefox https://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-width */
} }
.noscrollbar::-webkit-scrollbar { .noscrollbar::-webkit-scrollbar {
display: none; display: none;
} }
input[type="checkbox"] { input[type="checkbox"] {
filter: invert(1) sepia(1) hue-rotate(41deg) brightness(100%) saturate(10); filter: invert(1) sepia(1) hue-rotate(41deg) brightness(100%) saturate(10);
} }
.optionCheckbox { .optionCheckbox {
margin: 5px; margin: 5px;
float: right; float: right;
} }
.optionRange { .optionRange {
-webkit-appearance: none; -webkit-appearance: none;
background: #777; background: #777;
outline: none; outline: none;
opacity: 0.7; opacity: 0.7;
height: 10px; height: 10px;
-webkit-transition: 0.2s; -webkit-transition: 0.2s;
transition: opacity 0.2s; transition: opacity 0.2s;
margin: 3px; margin: 3px;
} }
.optionRange::-webkit-slider-thumb { .optionRange::-webkit-slider-thumb {
-webkit-appearance: none; -webkit-appearance: none;
appearance: none; appearance: none;
width: 10px; width: 10px;
height: 10px; height: 10px;
background: var(--my-font-color); background: var(--my-font-color);
cursor: pointer; cursor: pointer;
} }
.optionRange::-moz-range-thumb { .optionRange::-moz-range-thumb {
width: 10px; width: 10px;
height: 10px; height: 10px;
background: var(--my-font-color); background: var(--my-font-color);
cursor: pointer; cursor: pointer;
} }
.noselect { .noselect {
-moz-user-select: -moz-none; -moz-user-select: -moz-none;
-khtml-user-select: none; -khtml-user-select: none;
-webkit-user-select: none; -webkit-user-select: none;
-ms-user-select: none; -ms-user-select: none;
user-select: none; user-select: none;
} }

View File

@@ -1,72 +1,72 @@
@import "theme"; @import "theme";
#terminal-container { #terminal-container {
position: fixed; position: fixed;
margin-left: 10%; margin-left: 10%;
height: 100%; height: 100%;
width: 99%; width: 99%;
overflow: auto; overflow: auto;
overflow-y: scroll; overflow-y: scroll;
} }
#terminal { #terminal {
padding-top: 10px; padding-top: 10px;
padding-left: 10px; padding-left: 10px;
height: auto; height: auto;
width: 70%; width: 70%;
font-size: $defaultFontSize; font-size: $defaultFontSize;
overflow: auto; overflow: auto;
overflow-y: scroll; overflow-y: scroll;
background-color: var(--my-background-color); background-color: var(--my-background-color);
table-layout: fixed; table-layout: fixed;
.prompt { .prompt {
color: var(--my-prompt-color); color: var(--my-prompt-color);
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
} }
#terminal-input { #terminal-input {
background-color: var(--my-background-color); background-color: var(--my-background-color);
color: var(--my-font-color); color: var(--my-font-color);
transition: height 1s; transition: height 1s;
} }
.terminal-input { .terminal-input {
display: inline-block; display: inline-block;
padding: 0 !important; padding: 0 !important;
margin: 0 !important; margin: 0 !important;
border: 0; border: 0;
background-color: var(--my-background-color); background-color: var(--my-background-color);
font-size: $defaultFontSize; font-size: $defaultFontSize;
outline: none; outline: none;
color: var(--my-font-color); color: var(--my-font-color);
} }
.terminal-line { .terminal-line {
width: 70%; width: 70%;
word-wrap: break-word; word-wrap: break-word;
hyphens: auto; hyphens: auto;
-webkit-hyphens: auto; -webkit-hyphens: auto;
-moz-hyphens: auto; -moz-hyphens: auto;
} }
#terminal-input-td { #terminal-input-td {
display: flex; display: flex;
} }
#terminal-input-td textarea { #terminal-input-td textarea {
overflow: hidden; overflow: hidden;
resize: none; resize: none;
height: auto; height: auto;
} }
#terminal-input-header { #terminal-input-header {
white-space: pre; white-space: pre;
} }
#terminal-input-text-box { #terminal-input-text-box {
margin-left: 2px; margin-left: 2px;
flex: 1 1 auto; flex: 1 1 auto;
} }

View File

@@ -4,67 +4,10 @@
/* Tool tips (when hovering over an element */ /* Tool tips (when hovering over an element */
.tooltip { .tooltip {
display: inline-block; display: inline-block;
position: relative; position: relative;
.tooltiptext { .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; visibility: hidden;
width: 300px; width: 300px;
background-color: var(--my-background-color); background-color: var(--my-background-color);
@@ -73,57 +16,114 @@
text-align: center; text-align: center;
padding: 4px; padding: 4px;
left: 101%; left: 101%;
bottom: -25%;
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; position: absolute;
z-index: 99; 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 .tooltiptext,
.tooltip:hover .tooltiptexthigh, .tooltip:hover .tooltiptexthigh,
.tooltip:hover .tooltiptextleft, .tooltip:hover .tooltiptextleft,
.tooltip:hover .tooltiptextlow { .tooltip:hover .tooltiptextlow {
visibility: visible; visibility: visible;
} }
.copy_tooltip { .copy_tooltip {
position: relative; position: relative;
display: inline-block; display: inline-block;
} }
.copy_tooltip_copied { .copy_tooltip_copied {
color: #fff; color: #fff;
transition: color 0.3s; transition: color 0.3s;
} }
.copy_tooltip .copy_tooltip_text { .copy_tooltip .copy_tooltip_text {
visibility: hidden; visibility: hidden;
font-size: 15px; font-size: 15px;
padding: 5px; padding: 5px;
background-color: var(--my-background-color); background-color: var(--my-background-color);
color: #fff; color: #fff;
text-align: center; text-align: center;
position: absolute; position: absolute;
z-index: 1; z-index: 1;
top: 120%; top: 120%;
left: 5%; left: 5%;
opacity: 0; opacity: 0;
border: 2px solid var(--my-highlight-color); border: 2px solid var(--my-highlight-color);
} }
.copy_tooltip .copy_tooltip_text::after { .copy_tooltip .copy_tooltip_text::after {
content: ""; content: "";
position: absolute; position: absolute;
bottom: 100%; bottom: 100%;
left: 50%; left: 50%;
margin-left: -6px; margin-left: -6px;
border-width: 8px; border-width: 8px;
border-style: solid; border-style: solid;
border-color: transparent transparent white transparent; border-color: transparent transparent white transparent;
} }
.copy_tooltip .copy_tooltip_text_visible { .copy_tooltip .copy_tooltip_text_visible {
visibility: visible; visibility: visible;
opacity: 1; opacity: 1;
transition: opacity 0.3s; transition: opacity 0.3s;
} }

View File

@@ -1,39 +1,68 @@
/* required LIB STYLES */ /* required LIB STYLES */
/* .Treant se automatski dodaje na svaki chart conatiner */ /* .Treant se automatski dodaje na svaki chart conatiner */
.Treant { position: relative; overflow: hidden; padding: 0 !important; } .Treant {
position: relative;
overflow: hidden;
padding: 0 !important;
}
.Treant > .node, .Treant > .node,
.Treant > .pseudo { position: absolute; display: block; visibility: hidden; } .Treant > .pseudo {
position: absolute;
display: block;
visibility: hidden;
}
.Treant.Treant-loaded .node, .Treant.Treant-loaded .node,
.Treant.Treant-loaded .pseudo { visibility: visible; } .Treant.Treant-loaded .pseudo {
.Treant > .pseudo { width: 0; height: 0; border: none; padding: 0; } visibility: visible;
.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 > .pseudo {
.Treant > .node img { border: none; float: left; } 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 { .Treant > .node {
cursor: pointer; cursor: pointer;
padding: 4px; padding: 4px;
min-width: 60px; min-width: 60px;
text-align: center; text-align: center;
border: 2px solid #e8e8e3; border: 2px solid #e8e8e3;
border-radius: 2px; border-radius: 2px;
box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);
font-size: 12px; font-size: 12px;
} }
.Treant > .researched { .Treant > .researched {
background-color: #666; background-color: #666;
font-size: 16px; font-size: 16px;
} }
.Treant > .locked > div { .Treant > .locked > div {
color: red; color: red;
pointer-events: none; pointer-events: none;
} }
.Treant > .node > div { .Treant > .node > div {
font-size: 12px; font-size: 12px;
} }
.Treant > .unlocked:hover { .Treant > .unlocked:hover {
background-color: #666; background-color: #666;
} }

View File

@@ -3,49 +3,49 @@
/* Both Work in progress and BitNode stuff */ /* Both Work in progress and BitNode stuff */
.generic-fullscreen-container { .generic-fullscreen-container {
color: var(--my-font-color); color: var(--my-font-color);
width: 99%; width: 99%;
height: 100%; height: 100%;
overflow-y: hidden; overflow-y: hidden;
} }
.generic-fullscreen-container-scroll { .generic-fullscreen-container-scroll {
height: 100%; height: 100%;
width: 100%; width: 100%;
overflow: auto; overflow: auto;
padding-right: 20px; padding-right: 20px;
} }
#work-in-progress-container { #work-in-progress-container {
position: fixed; position: fixed;
} }
#work-in-progress-text { #work-in-progress-text {
color: var(--my-font-color); color: var(--my-font-color);
width: 70%; width: 70%;
margin: 10px; margin: 10px;
} }
.work-button { .work-button {
@include borderRadius(12px); @include borderRadius(12px);
@include boxShadow(1px 1px 3px #000); @include boxShadow(1px 1px 3px #000);
color: #aaa; color: #aaa;
float: left; float: left;
font-size: $defaultFontSize * 1.25; font-size: $defaultFontSize * 1.25;
font-weight: bold; font-weight: bold;
margin: 10px; margin: 10px;
padding: 5px; padding: 5px;
border: 3px solid #fff; border: 3px solid #fff;
} }
.work-button:hover, .work-button:hover,
.work-button:focus { .work-button:focus {
color: #fff; color: #fff;
text-decoration: none; text-decoration: none;
cursor: pointer; cursor: pointer;
} }
#cinematic-text-container { #cinematic-text-container {
position: fixed; position: fixed;
} }

8
cypress.json Normal file
View File

@@ -0,0 +1,8 @@
{
"baseUrl": "http://localhost:8000",
"fixturesFolder": false,
"trashAssetsBeforeRuns": true,
"screenshotsFolder": ".cypress/screenshots",
"videosFolder": ".cypress/videos",
"videoUploadOnPasses": false
}

View File

@@ -0,0 +1,51 @@
export {};
describe("netscript", () => {
it("creates and runs a NetScript 2.0 script", () => {
cy.findByRole("button", { name: "Exit Tutorial" }).click();
cy.findByText("Got it!").click();
cy.findByRole("textbox").type("connect n00dles{enter}");
cy.findByText(/connected to n00dles/i);
cy.findByRole("textbox").type("run NUKE.exe{enter}");
cy.findByText(/gained root access/i);
cy.findByRole("textbox").type("home{enter}");
cy.findByText(/connected to home/i);
cy.findByRole("textbox").type("nano script.js{enter}");
// monaco can take a bit
cy.findByRole("code", { timeout: 15_000 }).type("{selectall}{del}").type(`export const main = async (ns) => {{}
while(true) {{}
await ns.hack("n00dles");`);
cy.findByText("RAM: 1.70GB");
cy.findByRole("button", { name: /Save & Close/i }).click();
cy.findByRole("textbox").type("run script.js{enter}");
cy.findByText(/Running script with 1 thread/);
cy.findByRole("textbox").type("ps{enter}");
cy.findByText(/\(PID - 1\) script.js/);
});
it("errors and shows a dialog box when static RAM !== dynamic RAM", () => {
cy.findByRole("button", { name: "Exit Tutorial" }).click();
cy.findByText("Got it!").click();
cy.findByRole("textbox").type("nano script.js{enter}");
// monaco can take a bit
cy.findByRole("code", { timeout: 15_000 }).type("{selectall}{del}").type(`export const main = async (ns) => {{}
const command = "hack";
ns[command]("n00dles");`);
cy.findByText("RAM: 1.60GB");
cy.findByRole("button", { name: /Save & Close/i }).click();
cy.findByRole("textbox").type("run script.js{enter}");
cy.findByText(/Dynamic RAM usage calculated to be greater than initial RAM usage on fn: hack./i);
});
});

View File

@@ -0,0 +1,95 @@
export {};
describe("tutorial", () => {
it("completes the tutorial", () => {
cy.findByText(/dark, dystopian future/);
cy.findByRole("button", { name: "Next" }).click();
cy.findByText(/heading to the Stats page/);
cy.findByRole("button", { name: "Stats" }).click();
cy.findByText(/lot of important information/);
cy.findByRole("button", { name: "Next" }).click();
cy.findByText(/head to your computer's terminal/);
cy.findByRole("button", { name: "Terminal" }).click();
cy.findByText(/is used to interface/);
cy.findByRole("button", { name: "Next" }).click();
cy.findByText(/Let's try it out/i);
cy.findByRole("textbox").type("help{enter}");
cy.findByText(/displays a list of all available/i);
cy.findByRole("textbox").type("ls{enter}");
cy.findByText(/is a basic command that shows files/i);
cy.findByRole("textbox").type("scan{enter}");
cy.findByText(/that's great and all/i);
cy.findByRole("textbox").type("scan-analyze{enter}");
cy.findByText(/this command shows more detailed information/i);
cy.findByRole("textbox").type("scan-analyze 2{enter}");
cy.findByText(/now you can see information/i);
cy.findByRole("textbox").type("connect n00dles{enter}");
cy.findByText(/currency has become digital/i);
cy.findByRole("textbox").type("analyze{enter}");
cy.findByText(/For this server, the required hacking skill/i);
cy.findByText(/Required number of open ports for NUKE/i);
cy.findByRole("textbox").type("run NUKE.exe{enter}");
cy.findByText(/gained root access to n00dles/i);
cy.findByRole("textbox").type("hack{enter}");
cy.findByText(/now attempting to hack the server/i);
cy.findByRole("button", { name: "Next" }).click();
cy.findByText(/hacking exp/i);
cy.findByRole("textbox", { timeout: 15_000 }).should("not.be.disabled").type("nano n00dles.script{enter}");
// monaco can take a bit
cy.findByRole("code", { timeout: 15_000 }).type("{selectall}{del}").type("while(true) {{}{enter}hack('n00dles');");
cy.findByRole("button", { name: /Save & Close/i }).click();
cy.findByText(/now we'll run the script/i);
cy.findByRole("textbox").type("free{enter}");
cy.findByText(/We have 4GB of free RAM on this machine/i);
cy.findByRole("textbox").type("run n00dles.script{enter}");
cy.findByText(/Your script is now running/i);
cy.findByRole("button", { name: "Active Scripts" }).click();
cy.findByText(/This page displays information about all of your scripts/i);
cy.findByRole("button", { name: "Terminal" }).click();
cy.findByText(/each active script contains logs/i);
cy.findByRole("textbox").type("tail n00dles.script{enter}");
cy.findByText(/The log for this script won't show much/i);
cy.findByRole("button", { name: "Next" }).click();
cy.findByText(/Hacking is not the only way to earn money/i);
cy.findByRole("button", { name: "Hacknet" }).click();
cy.findByText(/Here you can purchase new Hacknet Nodes/i);
cy.findByRole("button", { name: /Purchase Hacknet Node/ }).click();
cy.findByText(/You just purchased a Hacknet Node!/i);
cy.findByRole("button", { name: "City" }).click();
cy.findByText(/This page lists all of the different locations/i);
cy.findByRole("button", { name: "Tutorial" }).click();
cy.findByText(/a lot of different documentation about the game/i);
cy.findByRole("button", { name: "Finish Tutorial" }).click();
cy.findByText("Got it!").click();
cy.findByText(/Tutorial \(AKA Links to Documentation\)/i);
});
});

22
cypress/plugins/index.js Normal file
View File

@@ -0,0 +1,22 @@
/// <reference types="cypress" />
// ***********************************************************
// This example plugins/index.js can be used to load plugins
//
// You can change the location of this file or turn off loading
// the plugins file with the 'pluginsFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/plugins-guide
// ***********************************************************
// This function is called when a project is opened or re-opened (e.g. due to
// the project's config changing)
/**
* @type {Cypress.PluginConfig}
*/
// eslint-disable-next-line no-unused-vars
module.exports = (on, config) => {
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
};

View File

@@ -0,0 +1 @@
import "@testing-library/cypress/add-commands";

View File

@@ -0,0 +1,9 @@
export {};
beforeEach(() => {
cy.visit("/");
cy.clearLocalStorage();
cy.window().then((win) => {
win.indexedDB.deleteDatabase("bitburnerSave");
});
});

21
cypress/support/index.js Normal file
View File

@@ -0,0 +1,21 @@
// ***********************************************************
// This example support/index.js is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
// Import commands.js using ES2015 syntax:
import "./globalHooks";
import "./commands";
// Alternatively you can use CommonJS syntax:
// require('./commands')

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +1,2 @@
!function(n){function t(t){for(var e,i,f=t[0],c=t[1],l=t[2],p=0,s=[];p<f.length;p++)i=f[p],u[i]&&s.push(u[i][0]),u[i]=0;for(e in c)Object.prototype.hasOwnProperty.call(c,e)&&(n[e]=c[e]);for(a&&a(t);s.length;)s.shift()();return r.push.apply(r,l||[]),o()}function o(){for(var n,t=0;t<r.length;t++){for(var o=r[t],e=!0,f=1;f<o.length;f++){var c=o[f];0!==u[c]&&(e=!1)}e&&(r.splice(t--,1),n=i(i.s=o[0]))}return n}var e={},u={1:0},r=[];function i(t){if(e[t])return e[t].exports;var o=e[t]={i:t,l:!1,exports:{}};return n[t].call(o.exports,o,o.exports,i),o.l=!0,o.exports}i.m=n,i.c=e,i.d=function(n,t,o){i.o(n,t)||Object.defineProperty(n,t,{enumerable:!0,get:o})},i.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},i.t=function(n,t){if(1&t&&(n=i(n)),8&t)return n;if(4&t&&"object"==typeof n&&n&&n.__esModule)return n;var o=Object.create(null);if(i.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:n}),2&t&&"string"!=typeof n)for(var e in n)i.d(o,e,function(t){return n[t]}.bind(null,e));return o},i.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return i.d(t,"a",t),t},i.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},i.p="";var f=window.webpackJsonp=window.webpackJsonp||[],c=f.push.bind(f);f.push=t,f=f.slice();for(var l=0;l<f.length;l++)t(f[l]);var a=c;r.push([863,0]),o()}({800:function(n,t,o){},802:function(n,t,o){},804:function(n,t,o){},806:function(n,t,o){},808:function(n,t,o){},810:function(n,t,o){},812:function(n,t,o){},814:function(n,t,o){},816:function(n,t,o){},818:function(n,t,o){},820:function(n,t,o){},822:function(n,t,o){},824:function(n,t,o){},826:function(n,t,o){},828:function(n,t,o){},830:function(n,t,o){},832:function(n,t,o){},834:function(n,t,o){},836:function(n,t,o){},838:function(n,t,o){},840:function(n,t,o){},842:function(n,t,o){},844:function(n,t,o){},846:function(n,t,o){},848:function(n,t,o){},850:function(n,t,o){},852:function(n,t,o){},854:function(n,t,o){},856:function(n,t,o){},858:function(n,t,o){},860:function(n,t,o){},863:function(n,t,o){"use strict";o.r(t);o(862),o(860),o(858),o(856),o(854),o(852),o(850),o(848),o(846),o(844),o(842),o(840),o(838),o(836),o(834),o(832),o(830),o(828),o(826),o(824),o(822),o(820),o(818),o(816),o(814),o(812),o(810),o(808),o(806),o(804),o(802),o(800)}}); !function(n){function t(t){for(var e,i,f=t[0],c=t[1],l=t[2],a=0,s=[];a<f.length;a++)i=f[a],Object.prototype.hasOwnProperty.call(u,i)&&u[i]&&s.push(u[i][0]),u[i]=0;for(e in c)Object.prototype.hasOwnProperty.call(c,e)&&(n[e]=c[e]);for(p&&p(t);s.length;)s.shift()();return r.push.apply(r,l||[]),o()}function o(){for(var n,t=0;t<r.length;t++){for(var o=r[t],e=!0,f=1;f<o.length;f++){var c=o[f];0!==u[c]&&(e=!1)}e&&(r.splice(t--,1),n=i(i.s=o[0]))}return n}var e={},u={2:0},r=[];function i(t){if(e[t])return e[t].exports;var o=e[t]={i:t,l:!1,exports:{}};return n[t].call(o.exports,o,o.exports,i),o.l=!0,o.exports}i.m=n,i.c=e,i.d=function(n,t,o){i.o(n,t)||Object.defineProperty(n,t,{enumerable:!0,get:o})},i.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},i.t=function(n,t){if(1&t&&(n=i(n)),8&t)return n;if(4&t&&"object"==typeof n&&n&&n.__esModule)return n;var o=Object.create(null);if(i.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:n}),2&t&&"string"!=typeof n)for(var e in n)i.d(o,e,function(t){return n[t]}.bind(null,e));return o},i.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return i.d(t,"a",t),t},i.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},i.p="";var f=window.webpackJsonp=window.webpackJsonp||[],c=f.push.bind(f);f.push=t,f=f.slice();for(var l=0;l<f.length;l++)t(f[l]);var p=c;r.push([905,0]),o()}({905:function(n,t,o){"use strict";o.r(t);o(906),o(908),o(910),o(912),o(914),o(916),o(918),o(920),o(922),o(924),o(926),o(928),o(930),o(932),o(934),o(936),o(938),o(940),o(942),o(944),o(946),o(948),o(950),o(952),o(954),o(956),o(958),o(960),o(962),o(964),o(966),o(968),o(970)},908:function(n,t,o){},910:function(n,t,o){},912:function(n,t,o){},914:function(n,t,o){},916:function(n,t,o){},918:function(n,t,o){},920:function(n,t,o){},922:function(n,t,o){},924:function(n,t,o){},926:function(n,t,o){},928:function(n,t,o){},930:function(n,t,o){},932:function(n,t,o){},934:function(n,t,o){},936:function(n,t,o){},938:function(n,t,o){},940:function(n,t,o){},942:function(n,t,o){},944:function(n,t,o){},946:function(n,t,o){},948:function(n,t,o){},950:function(n,t,o){},952:function(n,t,o){},954:function(n,t,o){},956:function(n,t,o){},958:function(n,t,o){},960:function(n,t,o){},962:function(n,t,o){},964:function(n,t,o){},966:function(n,t,o){},968:function(n,t,o){},970:function(n,t,o){}});
//# sourceMappingURL=engineStyle.bundle.js.map //# sourceMappingURL=engineStyle.bundle.js.map

1014
dist/engineStyle.css vendored

File diff suppressed because it is too large Load Diff

103
dist/vendor.bundle.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -76,15 +76,15 @@ List of Factions and their Requirements
+---------------------+----------------+-----------------------------------------+-------------------------------+ +---------------------+----------------+-----------------------------------------+-------------------------------+
| Hacking | NiteSec | * Install a backdoor on the avmnite-02h | | | Hacking | NiteSec | * Install a backdoor on the avmnite-02h | |
| Groups | | server | | | Groups | | server | |
| | | * Home Computer RAM of at least 32GB | | | | | | |
+ +----------------+-----------------------------------------+-------------------------------+ + +----------------+-----------------------------------------+-------------------------------+
| | The Black Hand | * Install a backdoor on the I.I.I.I | | | | The Black Hand | * Install a backdoor on the I.I.I.I | |
| | | server | | | | | server | |
| | | * Home Computer RAM of at least 64GB | | | | | | |
+ +----------------+-----------------------------------------+-------------------------------+ + +----------------+-----------------------------------------+-------------------------------+
| | Bitrunners | * Install a backdoor on the run4theh111z| | | | Bitrunners | * Install a backdoor on the run4theh111z| |
| | | server | | | | | server | |
| | | * Home Computer RAM of at least 128GB | | | | | | |
+---------------------+----------------+-----------------------------------------+-------------------------------+ +---------------------+----------------+-----------------------------------------+-------------------------------+
| Megacorporations | ECorp | * Have 200k reputation with | | | Megacorporations | ECorp | * Have 200k reputation with | |
| | | the Corporation | | | | | the Corporation | |

View File

@@ -14,29 +14,46 @@ these for money or for faction reputation. To try and infiltrate a company,
visit a company through the 'World' menu. There will be an option that visit a company through the 'World' menu. There will be an option that
says 'Infiltrate Company'. says 'Infiltrate Company'.
When infiltrating a company, you must progress through clearance levels in When infiltrating a company you will be presented with short active challenges.
the facility. Every clearance level has some form of security that None of the challenges use the mouse.
you must get past. There are several forms of security, ranging from
high-tech security systems to armed guards. For each form of security,
there are a variety of options that you can choose to try and bypass
the security. Examples include hacking the security, engaging in combat,
assassination, or sneaking past the security. The chance to succeed for
each option is determined in part by your stats. So, for example,
trying to hack the security system relies on your hacking skill,
whereas trying to sneak past the security relies on your agility level.
The facility has a 'security level' that affects your chance of success The difficulty at the top lowers with better combat stats. It is not recommended
when trying to get past a clearance level. Every time you advance to the to attempt infiltrations above mid-normal.
next clearance level, the facility's security level will increase by a
fixed percentage. Furthermore the options you choose and whether you
succeed or fail will affect the security level as well. For example,
if you try to kill a security guard and fail, the security level will
increase by a lot. If you choose to sneak past security and succeed,
the security level will not increase at all.
Every 5 clearance levels, you will steal classified company secrets that * Most use spacebar as "action"
can be sold for money or faction reputation. However, in order to sell * Some use WASD or arrows interchangeably.
these secrets you must successfully escape the facility using the * A few others use the rest of the keyboard.
'Escape' option. Furthermore, companies have a max clearance level.
If you reach the max clearance level you will automatically escape the ** Slash when his guard is down! **
facility with all of your stolen secrets.
Press space when the guard is attacking you.
** Close the brackets **
Enter all the matching brackets in reverse order.
** Type it backward **
Type the words that are written backward.
** Say something nice about the guard. **
Use the arrows to find a compliment for the guard.
** Enter the Code! **
Match the arrows as they appears.
** Match the symbols! **
Move the cursor to the matching symbol and press space to confirm.
** Remember all the mines! **
At first the cursor cannot be moved, remember the positions of the X.
Then move the cursor and press space to mark the mines on the board.
** Cut the wires **
Follow the instructions and press the numbers 1 through 9 to cut the appropriate
wires.

View File

@@ -3,7 +3,117 @@
Changelog Changelog
========= =========
v0.52.8 - 2021-07-23 Fixing the previous patch tbh ROUND 2 (hydroflame) v0.53.0 - 2021-09-09 Way too many things. (hydroflame & community)
-------------------------------------------
** Dev? **
* The entire codebase has been run through a code prettifier, hurray for consistency. (@threehams)
* Lots of test. (@threehams)
* Massive improvements to build speed. (@threehams)
* Dev notes: This won't affect any players but is immensely useful for me.
** Hacknet **
* Converted to ts/react
** Resleeving **
* Converted to ts/react
** Sleeves **
* Converted to ts/react. The ui should also have a better feel.
* Fixed a bug that allowed players to recover shock much faster than intended.
** BN10 **
* You have access to Sleeves right away
* In BN10 Sleeves start with 75 shock and 25 sync.
** MathJax **
* Several tooltips have been updated to display the relevant formula in Mathjax, e.g. Favor and reputation
** Corporation **
* Completely rewritten in React. Paving the way for bigger change.
* Smart Supply is now smarter and won't deadlock the warehouse. It is also more configurable.
* Several UI fixes.
** Bladeburner **
* Action count is no longer decided when joining the Bladeburners. Experiences for all players should be more similar.
** Factions **
* No factions have home computer ram requirement. This caused some confusion for new players.
** Gang **
* Made it clear when there's a new equipment coming up.
** Netscript **
* getActionCountRemaining now returns Infinity for bladeburner general actions. (@brubsy)
* getActionEstimatedSuccessChance now returns 100% for Diplomacy and Hyperbolic Regeneration Chamber. (@brubsy)
* disableLog('ALL') now disables all logs individually, meaning you can re-enable the ones you want after. (@Cass)
* getPlayer returns numPeopleKilled.
* Dynamic RAM calculation errors have a better error message.
* Hide some functions from autocomplete.
* Added getAugmentationPrice, getAugmentationRepReq, deprecated getAugmentationCost. (@TempFound)
* Fixed bug where some crime API would return "assassinate" when that's not accepted in other functions.
** Coding Contract **
* Spiralize Matrix is easier to read.
** Misc. **
* The world map is now used in sleeve travel and bladeburner travel.
* noselect a bunch of stuff.
* Ascii maps letters are more contrasting
* Updated documentation for infiltration.
* Most money costs in the game will turn grey/cyan when you don't have enough money.
* Donation textbox has better look & feel.
* Tech vendors ram & cores buttons have better look and feels.
* cores cost modified to be a formula instead of a semi-random array of numbers.
* Tech vendors now give a hint about where to get bigger servers.
* logboxes now displays whitespaces exactly. (@Cass)
* nerf noodle bar
v0.52.9 - 2021-08-27 Less lag! (hydroflame & community)
-------------------------------------------
** Active Scripts page **
* Now less laggy, has pagination.
** File diagnostic **
* Added a popup found under options that shows the files you own and how
large they are. This help find bugs and leftover massive logs files.
** Corporation **
* Added safeguard against a very specific bug that causes NaN money. I'm
still not sure what the root cause is but it should prevent corp from
breaking.
** Netscript **
* tprintf is a new function that doesn't print the filename.
** Misc. **
* Infiltration kills you if you try to automate it. (@threehams)
* Fix beautify button not working
* Added bladeburner_analysis_mult to getPlayer() (@brubsby)
* Fixed joining bladeburner via netscript functions. (@omuretsu)
* All bladeburner actions are click-to-copy
* nerf noodle bar
v0.52.8 - 2021-08-23 Fixing the previous patch tbh ROUND 2 (hydroflame)
------------------------------------------- -------------------------------------------
** Script editor ** ** Script editor **
@@ -23,7 +133,7 @@ v0.52.8 - 2021-07-23 Fixing the previous patch tbh ROUND 2 (hydroflame)
* Removed some debug console.log * Removed some debug console.log
* nerf noodle bar * nerf noodle bar
v0.52.7 - 2021-07-21 Fixing the previous patch tbh (hydroflame) v0.52.7 - 2021-08-21 Fixing the previous patch tbh (hydroflame)
------------------------------------------- -------------------------------------------
** Netscript ** ** Netscript **
@@ -51,7 +161,7 @@ v0.52.7 - 2021-07-21 Fixing the previous patch tbh (hydroflame)
* Fix netscript write. * Fix netscript write.
* nerf noodle bar * nerf noodle bar
v0.52.6 - 2021-07-21 Logboxes and VS-code (hydroflame) v0.52.6 - 2021-08-21 Logboxes and VS-code (hydroflame)
------------------------------------------- -------------------------------------------
** Text Editor ** ** Text Editor **
@@ -73,7 +183,7 @@ v0.52.6 - 2021-07-21 Logboxes and VS-code (hydroflame)
* Remove dollar sign in blade contract UI element * Remove dollar sign in blade contract UI element
* nerf noodle bar * nerf noodle bar
v0.52.5 - 2021-07-19 CPU cores are useful!? (hydroflame) v0.52.5 - 2021-08-19 CPU cores are useful!? (hydroflame)
------------------------------------------- -------------------------------------------
** Terminal ** ** Terminal **
@@ -99,7 +209,7 @@ v0.52.5 - 2021-07-19 CPU cores are useful!? (hydroflame)
* Fix weird scrolling in the new Bladeburner React console. * Fix weird scrolling in the new Bladeburner React console.
* nerf noodle bar * nerf noodle bar
v0.52.4 - 2021-07-19 Bladeburner in React (hydroflame) v0.52.4 - 2021-08-19 Bladeburner in React (hydroflame)
------------------------------------------- -------------------------------------------
** Bladeburner ** ** Bladeburner **
@@ -121,7 +231,7 @@ v0.52.4 - 2021-07-19 Bladeburner in React (hydroflame)
* Linting (no one cares except the dev) * Linting (no one cares except the dev)
* nerf noodle bar * nerf noodle bar
v0.52.3 - 2021-07-15 Gangs were OP (hydroflame) v0.52.3 - 2021-08-15 Gangs were OP (hydroflame)
------------------------------------------- -------------------------------------------
** Gang ** ** Gang **
@@ -144,7 +254,7 @@ v0.52.3 - 2021-07-15 Gangs were OP (hydroflame)
* Factions list screen converted to React. * Factions list screen converted to React.
* nerf noodle bar * nerf noodle bar
v0.52.2 - 2021-07-15 Oh yeah, BN11 is a thing (drunk hydroflame tbh) v0.52.2 - 2021-08-15 Oh yeah, BN11 is a thing (drunk hydroflame tbh)
------------------------------------------- -------------------------------------------
** Source-Files ** ** Source-Files **
@@ -162,7 +272,7 @@ v0.52.2 - 2021-07-15 Oh yeah, BN11 is a thing (drunk hydroflame tbh)
* nerf noodle bar * nerf noodle bar
v0.52.1 - 2021-07-10 bugfixing (hydroflame & community) v0.52.1 - 2021-08-10 bugfixing (hydroflame & community)
------------------------------------------- -------------------------------------------
**Misc.** **Misc.**

View File

@@ -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.52' version = '0.53'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = '0.52.8' release = '0.53.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.

View File

@@ -6,8 +6,6 @@ getGrowTime() Netscript Function
:RAM cost: 0.05 GB :RAM cost: 0.05 GB
:param string hostname: Hostname of target server. :param string hostname: Hostname of target server.
:param number hackLvl: Optional hacking level for the calculation. Defaults
to player's current hacking level.
:returns: seconds it takes to execute :doc:`grow<grow>` on that server. :returns: seconds it takes to execute :doc:`grow<grow>` on that server.
The function takes in an optional ``hackLvl`` parameter that can be The function takes in an optional ``hackLvl`` parameter that can be

View File

@@ -5,8 +5,6 @@ getHackTime() Netscript Function
:RAM cost: 0.05 GB :RAM cost: 0.05 GB
:param string hostname: Hostname of target server. :param string hostname: Hostname of target server.
:param number hackLvl: Optional hacking level for the calculation. Defaults
to player's current hacking level.
:returns: seconds it takes to execute :doc:`hack<hack>` on that server. :returns: seconds it takes to execute :doc:`hack<hack>` on that server.
The function takes in an optional ``hackLvl`` parameter that can be The function takes in an optional ``hackLvl`` parameter that can be

View File

@@ -5,8 +5,6 @@ getWeakenTime() Netscript Function
:RAM cost: 0.05 GB :RAM cost: 0.05 GB
:param string hostname: Hostname of target server. :param string hostname: Hostname of target server.
:param number hackLvl: Optional hacking level for the calculation. Defaults
to player's current hacking level.
:returns: seconds it takes to execute the :doc:`weaken<weaken>` Netscript :returns: seconds it takes to execute the :doc:`weaken<weaken>` Netscript
function on the target server. function on the target server.

View File

@@ -0,0 +1,17 @@
tprint() Netscript Function
===========================
.. js:function:: tprintf(format, args...)
:RAM cost: 0 GB
:param format: Format of the string to be printed.
:param args: Values to be formatted
Prints a raw formatted string to the terminal.
Example:
.. code-block:: javascript
tprintf("Hello world!"); // Prints "Hello world!" to the terminal.
tprintf("Hello %s", "world!"); // Prints "Hello world!" to the terminal.

View File

@@ -1,7 +1,7 @@
getTrainingMul() Netscript Function getTrainingMult() Netscript Function
=================================== ===================================
.. js:function:: getTrainingMul() .. js:function:: getTrainingMult()
:RAM cost: 0 GB :RAM cost: 0 GB
:returns: The multiplier to training that hash upgrades provide to the player. :returns: The multiplier to training that hash upgrades provide to the player.

View File

@@ -19,6 +19,7 @@ This includes information such as function signatures, what they do, and their r
sleep() <basicfunctions/sleep> sleep() <basicfunctions/sleep>
print() <basicfunctions/print> print() <basicfunctions/print>
tprint() <basicfunctions/tprint> tprint() <basicfunctions/tprint>
tprintf() <basicfunctions/tprint>
clearLog() <basicfunctions/clearLog> clearLog() <basicfunctions/clearLog>
disableLog() <basicfunctions/disableLog> disableLog() <basicfunctions/disableLog>
enableLog() <basicfunctions/enableLog> enableLog() <basicfunctions/enableLog>

View File

@@ -55,8 +55,10 @@ The player has access to all of these functions while in BitNode-4. Completing B
getOwnedAugmentations() <singularityfunctions/getOwnedAugmentations> getOwnedAugmentations() <singularityfunctions/getOwnedAugmentations>
getOwnedSourceFiles() <singularityfunctions/getOwnedSourceFiles> getOwnedSourceFiles() <singularityfunctions/getOwnedSourceFiles>
getAugmentationsFromFaction() <singularityfunctions/getAugmentationsFromFaction> getAugmentationsFromFaction() <singularityfunctions/getAugmentationsFromFaction>
getAugmentationPrereq() <singularityfunctions/getAugmentationPrereq>
getAugmentationCost() <singularityfunctions/getAugmentationCost> getAugmentationCost() <singularityfunctions/getAugmentationCost>
getAugmentationPrereq() <singularityfunctions/getAugmentationPrereq>
getAugmentationPrice() <singularityfunctions/getAugmentationPrice>
getAugmentationRepReq() <singularityfunctions/getAugmentationRepReq>
getAugmentationStats() <singularityfunctions/getAugmentationStats> getAugmentationStats() <singularityfunctions/getAugmentationStats>
purchaseAugmentation() <singularityfunctions/purchaseAugmentation> purchaseAugmentation() <singularityfunctions/purchaseAugmentation>
installAugmentations() <singularityfunctions/installAugmentations> installAugmentations() <singularityfunctions/installAugmentations>

View File

@@ -3,12 +3,15 @@ getAugmentationCost() Netscript Function
.. js:function:: getAugmentationCost(augName) .. js:function:: getAugmentationCost(augName)
.. warning:: This function is deprecated.
:RAM cost: 5 GB :RAM cost: 5 GB
:param string augName: Name of Augmentation. case-sensitive.
:param string augName: Name of Augmentation. CASE-SENSITIVE
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function. If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
This function returns an array with two elements that gives the cost for the specified Augmentation. This function returns an array with two elements that gives the cost for the specified Augmentation.
The first element in the returned array is the reputation requirement of the Augmentation, and the second element is the money cost. The first element in the returned array is the reputation requirement of the Augmentation, and the second element is the money cost.
If an invalid Augmentation name is passed in for the ``augName`` argument, this function will return the array [-1, -1]. If an invalid Augmentation name is passed in for the ``augName`` argument, this function will throw a runtime error.

View File

@@ -12,4 +12,4 @@ getAugmentationPrereq() Netscript Function
This function returns an array with the names of the prerequisite Augmentation(s) for the specified Augmentation. This function returns an array with the names of the prerequisite Augmentation(s) for the specified Augmentation.
If there are no prerequisites, a blank array is returned. If there are no prerequisites, a blank array is returned.
If an invalid Augmentation name is passed in for the *augName* argument, this function will return a blank array. If an invalid Augmentation name is passed in for the *augName* argument, this function will throw a runtime error.

View File

@@ -0,0 +1,14 @@
getAugmentationPrice() Netscript Function
==========================================
.. js:function:: getAugmentationPrice(augName)
:RAM cost: 2.5 GB
:param string augName: Name of Augmentation. CASE-SENSITIVE
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
This function returns the money cost for the specified Augmentation.
If an invalid Augmentation name is passed in for the *augName* argument, this function will throw a runtime error.

View File

@@ -0,0 +1,14 @@
getAugmentationRepReq() Netscript Function
==========================================
.. js:function:: getAugmentationRepReq(augName)
:RAM cost: 2.5 GB
:param string augName: Name of Augmentation. CASE-SENSITIVE
If you are not in BitNode-4, then you must have Level 3 of Source-File 4 in order to use this function.
This function returns the reputation requirement for the specified Augmentation.
If an invalid Augmentation name is passed in for the *augName* argument, this function will throw a runtime error.

View File

@@ -21,10 +21,11 @@ body {
background-color: #eeeeec; background-color: #eeeeec;
} }
/* Page layout */ /* Page layout */
div.header, div.content, div.footer { div.header,
div.content,
div.footer {
width: 70em; width: 70em;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
@@ -35,13 +36,13 @@ div.header-wrapper {
border-bottom: 3px solid #2e3436; border-bottom: 3px solid #2e3436;
} }
/* Default body styles */ /* Default body styles */
a { a {
color: #ce5c00; color: #ce5c00;
} }
div.bodywrapper a, div.footer a { div.bodywrapper a,
div.footer a {
text-decoration: underline; text-decoration: underline;
} }
@@ -58,22 +59,25 @@ div.bodywrapper a, div.footer a {
} }
.line-block { .line-block {
display: block; display: block;
margin-top: 1em; margin-top: 1em;
margin-bottom: 1em; margin-bottom: 1em;
} }
.line-block .line-block { .line-block .line-block {
margin-top: 0; margin-top: 0;
margin-bottom: 0; margin-bottom: 0;
margin-left: 1.5em; margin-left: 1.5em;
} }
h1, h2, h3, h4 { h1,
h2,
h3,
h4 {
font-family: "Georgia", "Times New Roman", serif; font-family: "Georgia", "Times New Roman", serif;
font-weight: normal; font-weight: normal;
color: #3465a4; color: #3465a4;
margin-bottom: .8em; margin-bottom: 0.8em;
} }
h1 { h1 {
@@ -81,14 +85,14 @@ h1 {
} }
h2 { h2 {
padding-bottom: .5em; padding-bottom: 0.5em;
border-bottom: 1px solid #3465a4; border-bottom: 1px solid #3465a4;
} }
a.headerlink { a.headerlink {
visibility: hidden; visibility: hidden;
color: #dddddd; color: #dddddd;
padding-left: .3em; padding-left: 0.3em;
} }
h1:hover > a.headerlink, h1:hover > a.headerlink,
@@ -120,7 +124,8 @@ p.admonition-title {
font-weight: bold; font-weight: bold;
} }
dt:target, .highlighted { dt:target,
.highlighted {
background-color: #fbe54e; background-color: #fbe54e;
} }
@@ -135,8 +140,8 @@ div.header .headertitle {
font-family: "Georgia", "Times New Roman", serif; font-family: "Georgia", "Times New Roman", serif;
font-weight: normal; font-weight: normal;
font-size: 180%; font-size: 180%;
letter-spacing: .08em; letter-spacing: 0.08em;
margin-bottom: .8em; margin-bottom: 0.8em;
} }
div.header .headertitle a { div.header .headertitle a {
@@ -149,19 +154,18 @@ div.header div.rel {
div.header div.rel a { div.header div.rel a {
color: #fcaf3e; color: #fcaf3e;
letter-spacing: .1em; letter-spacing: 0.1em;
text-transform: uppercase; text-transform: uppercase;
} }
p.logo { p.logo {
float: right; float: right;
} }
img.logo { img.logo {
border: 0; border: 0;
} }
/* Content */ /* Content */
div.content-wrapper { div.content-wrapper {
background-color: white; background-color: white;
@@ -190,7 +194,7 @@ div.document ul {
div.document dd { div.document dd {
margin-left: 1.2em; margin-left: 1.2em;
margin-top: .4em; margin-top: 0.4em;
margin-bottom: 1em; margin-bottom: 1em;
} }
@@ -206,13 +210,13 @@ div.document div.highlight {
background-color: #eeeeec; background-color: #eeeeec;
border-top: 2px solid #dddddd; border-top: 2px solid #dddddd;
border-bottom: 2px solid #dddddd; border-bottom: 2px solid #dddddd;
margin-top: .8em; margin-top: 0.8em;
margin-bottom: .8em; margin-bottom: 0.8em;
} }
div.document div.literal-block-wrapper { div.document div.literal-block-wrapper {
margin-top: .8em; margin-top: 0.8em;
margin-bottom: .8em; margin-bottom: 0.8em;
} }
div.document div.literal-block-wrapper div.highlight { div.document div.literal-block-wrapper div.highlight {
@@ -220,19 +224,19 @@ div.document div.literal-block-wrapper div.highlight {
} }
div.document div.code-block-caption span.caption-number { div.document div.code-block-caption span.caption-number {
padding: 0.1em 0.3em; padding: 0.1em 0.3em;
font-style: italic; font-style: italic;
} }
div.document div.code-block-caption span.caption-text { div.document div.code-block-caption span.caption-text {
} }
div.document h2 { div.document h2 {
margin-top: .7em; margin-top: 0.7em;
} }
div.document p { div.document p {
margin-bottom: .5em; margin-bottom: 0.5em;
} }
div.document li.toctree-l1 { div.document li.toctree-l1 {
@@ -244,7 +248,7 @@ div.document .descname {
} }
div.document .sig-paren { div.document .sig-paren {
font-size: larger; font-size: larger;
} }
div.document .docutils.literal { div.document .docutils.literal {
@@ -265,16 +269,15 @@ div.document ol {
margin: 1.5em; margin: 1.5em;
} }
/* Sidebar */ /* Sidebar */
div.sidebar { div.sidebar {
width: 20em; width: 20em;
position:fixed; position: fixed;
right: 10%; right: 10%;
height:75%; height: 75%;
font-size: .9em; font-size: 0.9em;
overflow-y:auto; overflow-y: auto;
} }
/* /*
div.sidebar { div.sidebar {
@@ -284,11 +287,13 @@ div.sidebar {
} }
*/ */
div.sidebar a, div.header a { div.sidebar a,
div.header a {
text-decoration: none; text-decoration: none;
} }
div.sidebar a:hover, div.header a:hover { div.sidebar a:hover,
div.header a:hover {
text-decoration: underline; text-decoration: underline;
} }
@@ -296,7 +301,7 @@ div.sidebar h3 {
color: #2e3436; color: #2e3436;
text-transform: uppercase; text-transform: uppercase;
font-size: 130%; font-size: 130%;
letter-spacing: .1em; letter-spacing: 0.1em;
} }
div.sidebar ul { div.sidebar ul {
@@ -308,7 +313,7 @@ div.sidebar li.toctree-l1 a {
padding: 1px; padding: 1px;
border: 1px solid #dddddd; border: 1px solid #dddddd;
background-color: #eeeeec; background-color: #eeeeec;
margin-bottom: .4em; margin-bottom: 0.4em;
padding-left: 3px; padding-left: 3px;
color: #2e3436; color: #2e3436;
} }
@@ -347,7 +352,6 @@ div.sidebar input[type="submit"] {
width: 30px; width: 30px;
} }
/* Footer */ /* Footer */
div.footer-wrapper { div.footer-wrapper {
@@ -358,7 +362,8 @@ div.footer-wrapper {
min-height: 80px; min-height: 80px;
} }
div.footer, div.footer a { div.footer,
div.footer a {
color: #888a85; color: #888a85;
} }
@@ -370,48 +375,53 @@ div.footer .left {
text-transform: uppercase; text-transform: uppercase;
} }
/* Styles copied from basic theme */ /* Styles copied from basic theme */
img.align-left, .figure.align-left, object.align-left { img.align-left,
clear: left; .figure.align-left,
float: left; object.align-left {
margin-right: 1em; clear: left;
float: left;
margin-right: 1em;
} }
img.align-right, .figure.align-right, object.align-right { img.align-right,
clear: right; .figure.align-right,
float: right; object.align-right {
margin-left: 1em; clear: right;
float: right;
margin-left: 1em;
} }
img.align-center, .figure.align-center, object.align-center { img.align-center,
.figure.align-center,
object.align-center {
display: block; display: block;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
} }
.align-left { .align-left {
text-align: left; text-align: left;
} }
.align-center { .align-center {
text-align: center; text-align: center;
} }
.align-right { .align-right {
text-align: right; text-align: right;
} }
table caption span.caption-number { table caption span.caption-number {
font-style: italic; font-style: italic;
} }
table caption span.caption-text { table caption span.caption-text {
} }
div.figure p.caption span.caption-number { div.figure p.caption span.caption-number {
font-style: italic; font-style: italic;
} }
div.figure p.caption span.caption-text { div.figure p.caption span.caption-text {
@@ -420,122 +430,122 @@ div.figure p.caption span.caption-text {
/* -- search page ----------------------------------------------------------- */ /* -- search page ----------------------------------------------------------- */
ul.search { ul.search {
margin: 10px 0 0 20px; margin: 10px 0 0 20px;
padding: 0; padding: 0;
} }
ul.search li { ul.search li {
padding: 5px 0 5px 20px; padding: 5px 0 5px 20px;
background-image: url(file.png); background-image: url(file.png);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 0 7px; background-position: 0 7px;
} }
ul.search li a { ul.search li a {
font-weight: bold; font-weight: bold;
} }
ul.search li div.context { ul.search li div.context {
color: #888; color: #888;
margin: 2px 0 0 30px; margin: 2px 0 0 30px;
text-align: left; text-align: left;
} }
ul.keywordmatches li.goodmatch a { ul.keywordmatches li.goodmatch a {
font-weight: bold; font-weight: bold;
} }
/* -- index page ------------------------------------------------------------ */ /* -- index page ------------------------------------------------------------ */
table.contentstable { table.contentstable {
width: 90%; width: 90%;
} }
table.contentstable p.biglink { table.contentstable p.biglink {
line-height: 150%; line-height: 150%;
} }
a.biglink { a.biglink {
font-size: 1.3em; font-size: 1.3em;
} }
span.linkdescr { span.linkdescr {
font-style: italic; font-style: italic;
padding-top: 5px; padding-top: 5px;
font-size: 90%; font-size: 90%;
} }
/* -- general index --------------------------------------------------------- */ /* -- general index --------------------------------------------------------- */
table.indextable td { table.indextable td {
text-align: left; text-align: left;
vertical-align: top; vertical-align: top;
} }
table.indextable ul { table.indextable ul {
margin-top: 0; margin-top: 0;
margin-bottom: 0; margin-bottom: 0;
list-style-type: none; list-style-type: none;
} }
table.indextable > tbody > tr > td > ul { table.indextable > tbody > tr > td > ul {
padding-left: 0em; padding-left: 0em;
} }
table.indextable tr.pcap { table.indextable tr.pcap {
height: 10px; height: 10px;
} }
table.indextable tr.cap { table.indextable tr.cap {
margin-top: 10px; margin-top: 10px;
background-color: #f2f2f2; background-color: #f2f2f2;
} }
img.toggler { img.toggler {
margin-right: 3px; margin-right: 3px;
margin-top: 3px; margin-top: 3px;
cursor: pointer; cursor: pointer;
} }
/* -- domain module index --------------------------------------------------- */ /* -- domain module index --------------------------------------------------- */
table.modindextable td { table.modindextable td {
padding: 2px; padding: 2px;
border-collapse: collapse; border-collapse: collapse;
} }
/* -- viewcode extension ---------------------------------------------------- */ /* -- viewcode extension ---------------------------------------------------- */
.viewcode-link { .viewcode-link {
float: right; float: right;
} }
.viewcode-back { .viewcode-back {
float: right; float: right;
font-family:: "Verdana", Arial, sans-serif; font-family: "Verdana", Arial, sans-serif;
} }
div.viewcode-block:target { div.viewcode-block:target {
margin: -1px -3px; margin: -1px -3px;
padding: 0 3px; padding: 0 3px;
background-color: #f4debf; background-color: #f4debf;
border-top: 1px solid #ac9; border-top: 1px solid #ac9;
border-bottom: 1px solid #ac9; border-bottom: 1px solid #ac9;
} }
div.code-block-caption { div.code-block-caption {
background-color: #ddd; background-color: #ddd;
color: #333; color: #333;
padding: 2px 5px; padding: 2px 5px;
font-size: small; font-size: small;
} }
/* -- math display ---------------------------------------------------------- */ /* -- math display ---------------------------------------------------------- */
div.body div.math p { div.body div.math p {
text-align: center; text-align: center;
} }
span.eqno { span.eqno {
float: right; float: right;
} }

View File

@@ -1,3 +1,3 @@
.wy-nav-content { .wy-nav-content {
max-width: none; max-width: none;
} }

View File

@@ -1,15 +1,15 @@
version: "3.4" version: "3.4"
services: services:
web: web:
image: bitburner:dev image: bitburner:dev
build: build:
context: . context: .
dockerfile: Dockerfile dockerfile: Dockerfile
target: dev target: dev
ports: ports:
- "8000:8000" - "8000:8000"
volumes: volumes:
- ./src:/app/src - ./src:/app/src
- ./css:/app/css - ./css:/app/css
- ./utils:/app/utils - ./utils:/app/utils
- ./test:/app/test - ./test:/app/test

1018
index.html

File diff suppressed because it is too large Load Diff

9
jest.config.js Normal file
View File

@@ -0,0 +1,9 @@
module.exports = {
setupFiles: ["./jest.setup.js"],
moduleFileExtensions: ["ts", "tsx", "js", "jsx"],
transform: {
"^.+\\.(js|jsx|ts|tsx)$": "babel-jest",
},
// testMatch: ["**/?(*.)+(test).[jt]s?(x)"],
testEnvironment: "jsdom",
};

2
jest.setup.js Normal file
View File

@@ -0,0 +1,2 @@
import "regenerator-runtime/runtime";
global.$ = require("jquery");

26035
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -12,8 +12,8 @@
"@types/numeral": "0.0.25", "@types/numeral": "0.0.25",
"@types/react": "^16.8.6", "@types/react": "^16.8.6",
"@types/react-dom": "^16.8.2", "@types/react-dom": "^16.8.2",
"acorn": "^6.4.1", "acorn": "^8.4.1",
"acorn-walk": "^6.2.0", "acorn-walk": "^8.1.1",
"ajv": "^5.1.5", "ajv": "^5.1.5",
"ajv-keywords": "^2.0.0", "ajv-keywords": "^2.0.0",
"arg": "^5.0.0", "arg": "^5.0.0",
@@ -31,9 +31,11 @@
"jshint": "^2.10.2", "jshint": "^2.10.2",
"json-loader": "^0.5.4", "json-loader": "^0.5.4",
"jsplumb": "^2.6.8", "jsplumb": "^2.6.8",
"jszip": "^3.1.5", "jszip": "^3.7.0",
"loader-runner": "^2.3.0", "loader-runner": "^2.3.0",
"loader-utils": "^1.1.0", "loader-utils": "^1.1.0",
"mathjax-full": "^3.2.0",
"mathjax-react": "^1.0.6",
"memory-fs": "~0.4.1", "memory-fs": "~0.4.1",
"monaco-editor": "^0.27.0", "monaco-editor": "^0.27.0",
"node-sass": "^6.0.1", "node-sass": "^6.0.1",
@@ -44,31 +46,38 @@
"react-modal": "^3.12.1", "react-modal": "^3.12.1",
"sprintf-js": "^1.1.1", "sprintf-js": "^1.1.1",
"tapable": "^1.0.0", "tapable": "^1.0.0",
"treant-js": "^1.0.1",
"uuid": "^3.2.1", "uuid": "^3.2.1",
"w3c-blob": "0.0.1" "w3c-blob": "0.0.1"
}, },
"description": "A cyberpunk-themed incremental game", "description": "A cyberpunk-themed incremental game",
"devDependencies": { "devDependencies": {
"@babel/core": "^7.3.4", "@babel/core": "^7.3.4",
"@babel/preset-env": "^7.15.0",
"@babel/preset-react": "^7.0.0", "@babel/preset-react": "^7.0.0",
"@types/chai": "^4.1.7", "@babel/preset-typescript": "^7.15.0",
"@testing-library/cypress": "^8.0.1",
"@types/jest": "^27.0.1",
"@types/lodash": "^4.14.168", "@types/lodash": "^4.14.168",
"@types/mocha": "^5.2.7",
"@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-loader": "^8.0.5", "babel-loader": "^8.0.5",
"beautify-lint": "^1.0.3", "beautify-lint": "^1.0.3",
"benchmark": "^2.1.1", "benchmark": "^2.1.1",
"bundle-loader": "~0.5.0", "bundle-loader": "~0.5.0",
"chai": "^4.2.0",
"css-loader": "^0.28.11", "css-loader": "^0.28.11",
"cypress": "^8.3.1",
"es6-promise-polyfill": "^1.1.1", "es6-promise-polyfill": "^1.1.1",
"eslint": "^7.24.0", "eslint": "^7.24.0",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^11.1.0",
"file-loader": "^1.1.11", "file-loader": "^1.1.11",
"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",
"i18n-webpack-plugin": "^1.0.0", "i18n-webpack-plugin": "^1.0.0",
"istanbul": "^0.4.5", "istanbul": "^0.4.5",
"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", "jsdom-global": "^3.0.2",
@@ -78,30 +87,30 @@
"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", "mkdirp": "^0.5.1",
"mocha": "^6.1.4",
"mochapack": "^1.1.1",
"null-loader": "^1.0.0", "null-loader": "^1.0.0",
"prettier": "^2.3.2",
"raw-loader": "~0.5.0", "raw-loader": "~0.5.0",
"regenerator-runtime": "^0.13.9",
"sass-loader": "^7.0.3", "sass-loader": "^7.0.3",
"script-loader": "~0.7.0", "script-loader": "~0.7.0",
"should": "^11.1.1", "should": "^11.1.1",
"simple-git": "^1.96.0", "simple-git": "^1.96.0",
"sinon": "^2.3.2", "sinon": "^2.3.2",
"source-map": "^0.7.3", "source-map": "^0.7.3",
"start-server-and-test": "^1.14.0",
"style-loader": "^0.21.0", "style-loader": "^0.21.0",
"stylelint": "^9.2.1", "stylelint": "^9.2.1",
"stylelint-declaration-use-variable": "^1.6.1", "stylelint-declaration-use-variable": "^1.6.1",
"stylelint-order": "^0.8.1", "stylelint-order": "^0.8.1",
"ts-loader": "^4.5.0",
"typescript": "^4.2.4", "typescript": "^4.2.4",
"uglify-es": "^3.3.9", "uglify-es": "^3.3.9",
"uglifyjs-webpack-plugin": "^1.3.0", "uglifyjs-webpack-plugin": "^1.3.0",
"url-loader": "^1.0.1", "url-loader": "^1.0.1",
"watchpack": "^1.6.0", "watchpack": "^1.6.0",
"webpack": "^4.12.0", "webpack": "^4.46.0",
"webpack-cli": "^3.0.4", "webpack-cli": "^3.3.12",
"webpack-dev-middleware": "^3.1.3", "webpack-dev-middleware": "^3.7.3",
"webpack-dev-server": "^3.2.1", "webpack-dev-server": "^3.11.2",
"worker-loader": "^2.0.0" "worker-loader": "^2.0.0"
}, },
"engines": { "engines": {
@@ -115,19 +124,24 @@
"url": "git+https://github.com/danielyxie/bitburner.git" "url": "git+https://github.com/danielyxie/bitburner.git"
}, },
"scripts": { "scripts": {
"cy:test": "start-server-and-test start http://localhost:8000 cy:run",
"cy:dev": "start-server-and-test start:dev http://localhost:8000 cy:open",
"cy:open": "cypress open",
"cy:run": "cypress run",
"format": "prettier --write .",
"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: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",
"build:test": "webpack --config webpack.config-test.js",
"lint": "npm run lint:jsts & npm run lint:style", "lint": "npm run lint:jsts & npm run lint:style",
"lint:jsts": "eslint --fix '*.{js,jsx,ts,tsx}' './src/**/*.{js,jsx,ts,tsx}' './test/**/*.{js,jsx,ts,tsx}' './utils/**/*.{js,jsx,ts,tsx}'", "lint:jsts": "eslint --fix . --ext js,jsx,ts,tsx",
"lint:style": "stylelint --fix ./css/*", "lint:style": "stylelint --fix ./css/*",
"preinstall": "node ./scripts/engines-check.js", "preinstall": "node ./scripts/engines-check.js",
"test": "mochapack --webpack-config webpack.config-test.js -r jsdom-global/register ./test/index.js", "test": "jest",
"test:container": "mochapack --webpack-config webpack.config-test.js --slow 2000 --timeout 10000 -r jsdom-global/register ./test/index.js", "test:watch": "jest --watch",
"watch": "webpack --watch --mode production", "watch": "webpack --watch --mode production",
"watch:dev": "webpack --watch --mode development" "watch:dev": "webpack --watch --mode development"
}, },
"version": "0.52.8" "version": "0.53.0"
} }

File diff suppressed because it is too large Load Diff

View File

@@ -62,9 +62,12 @@ getPackageJson()
.then(getEngines) .then(getEngines)
.then(checkNodeVersion) .then(checkNodeVersion)
.then(checkNpmVersion) .then(checkNpmVersion)
.then(() => true, (error) => { .then(
// Specifically disable these as the error message gets lost in the normal unhandled output. () => true,
/* eslint-disable no-console, no-process-exit */ (error) => {
console.error(error); // Specifically disable these as the error message gets lost in the normal unhandled output.
process.exit(1); /* eslint-disable no-console, no-process-exit */
}); console.error(error);
process.exit(1);
}
);

View File

@@ -82,7 +82,9 @@ src[NONNUMERICIDENTIFIER] = "\\d*[a-zA-Z-][a-zA-Z0-9-]*";
// ## Main Version // ## Main Version
// Three dot-separated numeric identifiers. // Three dot-separated numeric identifiers.
src[MAINVERSION] = `(${src[NUMERICIDENTIFIER]})\\.(${src[NUMERICIDENTIFIER]})\\.(${src[NUMERICIDENTIFIER]})`; src[MAINVERSION] = `(${src[NUMERICIDENTIFIER]})\\.(${src[NUMERICIDENTIFIER]})\\.(${src[NUMERICIDENTIFIER]})`;
src[MAINVERSIONLOOSE] = `(${src[NUMERICIDENTIFIERLOOSE]})\\.(${src[NUMERICIDENTIFIERLOOSE]})\\.(${src[NUMERICIDENTIFIERLOOSE]})`; src[
MAINVERSIONLOOSE
] = `(${src[NUMERICIDENTIFIERLOOSE]})\\.(${src[NUMERICIDENTIFIERLOOSE]})\\.(${src[NUMERICIDENTIFIERLOOSE]})`;
// ## Pre-release Version Identifier // ## Pre-release Version Identifier
// A numeric identifier, or a non-numeric identifier. // A numeric identifier, or a non-numeric identifier.
@@ -123,10 +125,14 @@ src[XRANGEIDENTIFIERLOOSE] = `${src[NUMERICIDENTIFIERLOOSE]}|x|X|\\*`;
src[XRANGEIDENTIFIER] = `${src[NUMERICIDENTIFIER]}|x|X|\\*`; src[XRANGEIDENTIFIER] = `${src[NUMERICIDENTIFIER]}|x|X|\\*`;
/* eslint-disable-next-line max-len */ /* eslint-disable-next-line max-len */
src[XRANGEPLAIN] = `[v=\\s]*(${src[XRANGEIDENTIFIER]})(?:\\.(${src[XRANGEIDENTIFIER]})(?:\\.(${src[XRANGEIDENTIFIER]})(?:${src[PRERELEASE]})?${src[BUILD]}?)?)?`; src[
XRANGEPLAIN
] = `[v=\\s]*(${src[XRANGEIDENTIFIER]})(?:\\.(${src[XRANGEIDENTIFIER]})(?:\\.(${src[XRANGEIDENTIFIER]})(?:${src[PRERELEASE]})?${src[BUILD]}?)?)?`;
/* eslint-disable-next-line max-len */ /* eslint-disable-next-line max-len */
src[XRANGEPLAINLOOSE] = `[v=\\s]*(${src[XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[XRANGEIDENTIFIERLOOSE]})(?:${src[PRERELEASELOOSE]})?${src[BUILD]}?)?)?`; src[XRANGEPLAINLOOSE] =
`[v=\\s]*(${src[XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[XRANGEIDENTIFIERLOOSE]})` +
`(?:\\.(${src[XRANGEIDENTIFIERLOOSE]})(?:${src[PRERELEASELOOSE]})?${src[BUILD]}?)?)?`;
src[XRANGE] = `^${src[GTLT]}\\s*${src[XRANGEPLAIN]}$`; src[XRANGE] = `^${src[GTLT]}\\s*${src[XRANGEPLAIN]}$`;
src[XRANGELOOSE] = `^${src[GTLT]}\\s*${src[XRANGEPLAINLOOSE]}$`; src[XRANGELOOSE] = `^${src[GTLT]}\\s*${src[XRANGEPLAINLOOSE]}$`;
@@ -134,7 +140,9 @@ src[XRANGELOOSE] = `^${src[GTLT]}\\s*${src[XRANGEPLAINLOOSE]}$`;
// Coercion. // Coercion.
// Extract anything that could conceivably be a part of a valid semver // Extract anything that could conceivably be a part of a valid semver
/* eslint-disable-next-line max-len */ /* eslint-disable-next-line max-len */
src[COERCE] = `(?:^|[^\\d])(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:$|[^\\d])`; src[
COERCE
] = `(?:^|[^\\d])(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:$|[^\\d])`;
// Tilde ranges. // Tilde ranges.
// Meaning is "reasonably at or greater than" // Meaning is "reasonably at or greater than"
@@ -222,10 +230,7 @@ function compareIdentifiers(left, right) {
// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 // 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do // 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
// 1.2 - 3.4 => >=1.2.0 <3.5.0 // 1.2 - 3.4 => >=1.2.0 <3.5.0
function hyphenReplace($0, function hyphenReplace($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr) {
from, fM, fm, fp, fpr, fb,
to, tM, tm, tp, tpr) {
if (isX(fM)) { if (isX(fM)) {
from = ""; from = "";
} else if (isX(fm)) { } else if (isX(fm)) {
@@ -254,7 +259,7 @@ function hyphenReplace($0,
function replaceTilde(comp, loose) { function replaceTilde(comp, loose) {
const regex = loose ? re[TILDELOOSE] : re[TILDE]; const regex = loose ? re[TILDELOOSE] : re[TILDE];
return comp.replace(regex, function(match, major, minor, patch, prerelease) { return comp.replace(regex, function (match, major, minor, patch, prerelease) {
let ret; let ret;
if (isX(major)) { if (isX(major)) {
@@ -295,7 +300,7 @@ function replaceTildes(comp, loose) {
function replaceCaret(comp, loose) { function replaceCaret(comp, loose) {
const regex = loose ? re[CARETLOOSE] : re[CARET]; const regex = loose ? re[CARETLOOSE] : re[CARET];
return comp.replace(regex, function(match, major, minor, patch, prerelease) { return comp.replace(regex, function (match, major, minor, patch, prerelease) {
let ret; let ret;
if (isX(major)) { if (isX(major)) {
@@ -353,7 +358,7 @@ function replaceXRange(comp, loose) {
comp = comp.trim(); comp = comp.trim();
const regex = loose ? re[XRANGELOOSE] : re[XRANGE]; const regex = loose ? re[XRANGELOOSE] : re[XRANGE];
return comp.replace(regex, function(ret, operator, major, minor, patch) { return comp.replace(regex, function (ret, operator, major, minor, patch) {
const xM = isX(major); const xM = isX(major);
const xm = xM || isX(minor); const xm = xM || isX(minor);
const xp = xm || isX(patch); const xp = xm || isX(patch);
@@ -441,11 +446,11 @@ function parseComparator(comp, loose) {
class SemVer { class SemVer {
/** /**
* A semantic version. * A semantic version.
* @param {string} version The version. * @param {string} version The version.
* @param {boolean} loose If this is a loose representation of a version. * @param {boolean} loose If this is a loose representation of a version.
* @returns {SemVer} a new instance. * @returns {SemVer} a new instance.
*/ */
constructor(version, loose) { constructor(version, loose) {
if (version instanceof SemVer) { if (version instanceof SemVer) {
if (version.loose === loose) { if (version.loose === loose) {
@@ -483,7 +488,7 @@ class SemVer {
// Numberify any prerelease numeric ids // Numberify any prerelease numeric ids
if (matches[4]) { if (matches[4]) {
this.prerelease = matches[4].split(".").map((id) => { this.prerelease = matches[4].split(".").map((id) => {
if (/^[0-9]+$/.test(id)) { if ((/^[0-9]+$/).test(id)) {
const num = Number(id); const num = Number(id);
if (num >= 0 && num < MAX_SAFE_INTEGER) { if (num >= 0 && num < MAX_SAFE_INTEGER) {
return num; return num;
@@ -513,10 +518,10 @@ class SemVer {
} }
/** /**
* Comares the current instance against another instance. * Comares the current instance against another instance.
* @param {SemVer} other The SemVer to comare to. * @param {SemVer} other The SemVer to comare to.
* @returns {0|1|-1} A comparable value for sorting. * @returns {0|1|-1} A comparable value for sorting.
*/ */
compare(other) { compare(other) {
return this.compareMain(other) || this.comparePre(other); return this.compareMain(other) || this.comparePre(other);
} }
@@ -526,7 +531,9 @@ class SemVer {
other = new SemVer(other, this.loose); other = new SemVer(other, this.loose);
} }
return compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch); return (
compareIdentifiers(this.major, other.major) || compareIdentifiers(this.minor, other.minor) || compareIdentifiers(this.patch, other.patch)
);
} }
comparePre(other) { comparePre(other) {
@@ -629,10 +636,10 @@ function testSet(set, version) {
} }
if (version.prerelease.length) { if (version.prerelease.length) {
// Find the set of versions that are allowed to have prereleases // Find the set of versions that are allowed to have prereleases
// For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
// That should allow `1.2.3-pr.2` to pass. // That should allow `1.2.3-pr.2` to pass.
// However, `1.2.4-alpha.notready` should NOT be allowed, even though it's within the range set by the comparators. // However, `1.2.4-alpha.notready` should NOT be allowed, even though it's within the range set by the comparators.
for (let idx = 0; idx < set.length; idx++) { for (let idx = 0; idx < set.length; idx++) {
if (set[idx].semver !== ANY) { if (set[idx].semver !== ANY) {
if (set[idx].semver.prerelease.length > 0) { if (set[idx].semver.prerelease.length > 0) {
@@ -728,14 +735,16 @@ class Range {
this.loose = loose; this.loose = loose;
// First, split based on boolean or || // First, split based on boolean or ||
/** /**
* @type {string} * @type {string}
*/ */
this.raw = range; this.raw = range;
// Throw out any that are not relevant for whatever reason // Throw out any that are not relevant for whatever reason
const hasLength = (item) => item.length; const hasLength = (item) => item.length;
this.set = this.raw.split(/\s*\|\|\s*/).map(function (range1) { this.set = this.raw
return this.parseRange(range1.trim()); .split(/\s*\|\|\s*/)
}, this) .map(function (range1) {
return this.parseRange(range1.trim());
}, this)
.filter(hasLength); .filter(hasLength);
if (!this.set.length) { if (!this.set.length) {
throw new TypeError(`Invalid SemVer Range: ${range}`); throw new TypeError(`Invalid SemVer Range: ${range}`);
@@ -744,7 +753,8 @@ class Range {
} }
format() { format() {
this.range = this.set.map((comps) => comps.join(" ").trim()) this.range = this.set
.map((comps) => comps.join(" ").trim())
.join("||") .join("||")
.trim(); .trim();
@@ -771,7 +781,9 @@ class Range {
range = range.split(/\s+/).join(" "); range = range.split(/\s+/).join(" ");
// At this point, the range is completely trimmed and ready to be split into comparators. // At this point, the range is completely trimmed and ready to be split into comparators.
const compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; const compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
let set = range.split(" ").map((comp) => parseComparator(comp, loose)) let set = range
.split(" ")
.map((comp) => parseComparator(comp, loose))
.join(" ") .join(" ")
.split(/\s+/); .split(/\s+/);
if (loose) { if (loose) {

View File

@@ -5,89 +5,91 @@ export let Aliases: IMap<string> = {};
export let GlobalAliases: IMap<string> = {}; export let GlobalAliases: IMap<string> = {};
export function loadAliases(saveString: string): void { export function loadAliases(saveString: string): void {
if (saveString === "") { if (saveString === "") {
Aliases = {}; Aliases = {};
} else { } else {
Aliases = JSON.parse(saveString); Aliases = JSON.parse(saveString);
} }
} }
export function loadGlobalAliases(saveString: string): void { export function loadGlobalAliases(saveString: string): void {
if (saveString === "") { if (saveString === "") {
GlobalAliases = {}; GlobalAliases = {};
} else { } else {
GlobalAliases = JSON.parse(saveString); GlobalAliases = JSON.parse(saveString);
} }
} }
// Prints all aliases to terminal // Prints all aliases to terminal
export function printAliases(): void { export function printAliases(): void {
for (const name in Aliases) { for (const name in Aliases) {
if (Aliases.hasOwnProperty(name)) { if (Aliases.hasOwnProperty(name)) {
post("alias " + name + "=" + Aliases[name]); post("alias " + name + "=" + Aliases[name]);
}
} }
for (const name in GlobalAliases) { }
if (GlobalAliases.hasOwnProperty(name)) { for (const name in GlobalAliases) {
post("global alias " + name + "=" + GlobalAliases[name]); if (GlobalAliases.hasOwnProperty(name)) {
} post("global alias " + name + "=" + GlobalAliases[name]);
} }
}
} }
// Returns true if successful, false otherwise // Returns true if successful, false otherwise
export function parseAliasDeclaration(dec: string, global = false): boolean { export function parseAliasDeclaration(dec: string, global = false): boolean {
const re = /^([_|\w|!|%|,|@]+)="(.+)"$/; const re = /^([_|\w|!|%|,|@]+)="(.+)"$/;
const matches = dec.match(re); const matches = dec.match(re);
if (matches == null || matches.length != 3) {return false;} if (matches == null || matches.length != 3) {
if (global){ return false;
addGlobalAlias(matches[1],matches[2]); }
} else { if (global) {
addAlias(matches[1], matches[2]); addGlobalAlias(matches[1], matches[2]);
} } else {
return true; addAlias(matches[1], matches[2]);
}
return true;
} }
function addAlias(name: string, value: string): void { function addAlias(name: string, value: string): void {
if (name in GlobalAliases) { if (name in GlobalAliases) {
delete GlobalAliases[name]; delete GlobalAliases[name];
} }
Aliases[name] = value.trim(); Aliases[name] = value.trim();
} }
function addGlobalAlias(name: string, value: string): void { function addGlobalAlias(name: string, value: string): void {
if (name in Aliases){ if (name in Aliases) {
delete Aliases[name]; delete Aliases[name];
} }
GlobalAliases[name] = value.trim(); GlobalAliases[name] = value.trim();
} }
function getAlias(name: string): string | null { function getAlias(name: string): string | null {
if (Aliases.hasOwnProperty(name)) { if (Aliases.hasOwnProperty(name)) {
return Aliases[name]; return Aliases[name];
} }
return null; return null;
} }
function getGlobalAlias(name: string): string | null { function getGlobalAlias(name: string): string | null {
if (GlobalAliases.hasOwnProperty(name)) { if (GlobalAliases.hasOwnProperty(name)) {
return GlobalAliases[name]; return GlobalAliases[name];
} }
return null; return null;
} }
export function removeAlias(name: string): boolean { export function removeAlias(name: string): boolean {
if (Aliases.hasOwnProperty(name)) { if (Aliases.hasOwnProperty(name)) {
delete Aliases[name]; delete Aliases[name];
return true; return true;
} }
if (GlobalAliases.hasOwnProperty(name)) { if (GlobalAliases.hasOwnProperty(name)) {
delete GlobalAliases[name]; delete GlobalAliases[name];
return true; return true;
} }
return false; return false;
} }
/** /**
@@ -95,33 +97,35 @@ export function removeAlias(name: string): boolean {
* Aliases are only applied to "whole words", one level deep * Aliases are only applied to "whole words", one level deep
*/ */
export function substituteAliases(origCommand: string): string { export function substituteAliases(origCommand: string): string {
const commandArray = origCommand.split(" "); const commandArray = origCommand.split(" ");
if (commandArray.length > 0){ if (commandArray.length > 0) {
// For the alias and unalias commands, dont substite // For the alias and unalias commands, dont substite
if (commandArray[0] === "unalias" || commandArray[0] === "alias") { return commandArray.join(" "); } if (commandArray[0] === "unalias" || commandArray[0] === "alias") {
return commandArray.join(" ");
let somethingSubstituted = true;
let depth = 0;
while(somethingSubstituted && depth < 10){
depth++;
somethingSubstituted = false
const alias = getAlias(commandArray[0])?.split(" ");
if (alias != null) {
somethingSubstituted = true
commandArray.splice(0, 1, ...alias);
//commandArray[0] = alias;
}
for (let i = 0; i < commandArray.length; ++i) {
const alias = getGlobalAlias(commandArray[i])?.split(" ");
if (alias != null) {
somethingSubstituted = true
commandArray.splice(i, 1, ...alias);
i += alias.length - 1;
//commandArray[i] = alias;
}
}
}
} }
return commandArray.join(" ");
let somethingSubstituted = true;
let depth = 0;
while (somethingSubstituted && depth < 10) {
depth++;
somethingSubstituted = false;
const alias = getAlias(commandArray[0])?.split(" ");
if (alias != null) {
somethingSubstituted = true;
commandArray.splice(0, 1, ...alias);
//commandArray[0] = alias;
}
for (let i = 0; i < commandArray.length; ++i) {
const alias = getGlobalAlias(commandArray[i])?.split(" ");
if (alias != null) {
somethingSubstituted = true;
commandArray.splice(i, 1, ...alias);
i += alias.length - 1;
//commandArray[i] = alias;
}
}
}
}
return commandArray.join(" ");
} }

View File

@@ -11,294 +11,542 @@ 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 { interface IConstructorParams {
info: string | JSX.Element; info: string | JSX.Element;
stats?: JSX.Element; stats?: JSX.Element;
isSpecial?: boolean; isSpecial?: boolean;
moneyCost: number; moneyCost: number;
name: string; name: string;
prereqs?: string[]; prereqs?: string[];
repCost: number; repCost: number;
hacking_mult?: number; hacking_mult?: number;
strength_mult?: number; strength_mult?: number;
defense_mult?: number; defense_mult?: number;
dexterity_mult?: number; dexterity_mult?: number;
agility_mult?: number; agility_mult?: number;
charisma_mult?: number; charisma_mult?: number;
hacking_exp_mult?: number; hacking_exp_mult?: number;
strength_exp_mult?: number; strength_exp_mult?: number;
defense_exp_mult?: number; defense_exp_mult?: number;
dexterity_exp_mult?: number; dexterity_exp_mult?: number;
agility_exp_mult?: number; agility_exp_mult?: number;
charisma_exp_mult?: number; charisma_exp_mult?: number;
hacking_chance_mult?: number; hacking_chance_mult?: number;
hacking_speed_mult?: number; hacking_speed_mult?: number;
hacking_money_mult?: number; hacking_money_mult?: number;
hacking_grow_mult?: number; hacking_grow_mult?: number;
company_rep_mult?: number; company_rep_mult?: number;
faction_rep_mult?: number; faction_rep_mult?: number;
crime_money_mult?: number; crime_money_mult?: number;
crime_success_mult?: number; crime_success_mult?: number;
work_money_mult?: number; work_money_mult?: number;
hacknet_node_money_mult?: number; hacknet_node_money_mult?: number;
hacknet_node_purchase_cost_mult?: number; hacknet_node_purchase_cost_mult?: number;
hacknet_node_ram_cost_mult?: number; hacknet_node_ram_cost_mult?: number;
hacknet_node_core_cost_mult?: number; hacknet_node_core_cost_mult?: number;
hacknet_node_level_cost_mult?: number; hacknet_node_level_cost_mult?: number;
bladeburner_max_stamina_mult?: number; bladeburner_max_stamina_mult?: number;
bladeburner_stamina_gain_mult?: number; bladeburner_stamina_gain_mult?: number;
bladeburner_analysis_mult?: number; bladeburner_analysis_mult?: number;
bladeburner_success_chance_mult?: number; bladeburner_success_chance_mult?: number;
startingMoney?: number; startingMoney?: number;
programs?: string[]; programs?: string[];
} }
function generateStatsDescription(mults: IMap<number>, programs?: string[], startingMoney?: number): JSX.Element { function generateStatsDescription(mults: IMap<number>, programs?: string[], startingMoney?: number): JSX.Element {
const f = (x: number, decimals = 0): string => { const f = (x: number, decimals = 0): string => {
// look, I don't know how to make a "smart decimals" // look, I don't know how to make a "smart decimals"
// todo, make it smarter // todo, make it smarter
if(x === 1.0777-1) return "7.77%"; if (x === 1.0777 - 1) return "7.77%";
if(x === 1.777-1) return "77.7%"; if (x === 1.777 - 1) return "77.7%";
return numeralWrapper.formatPercentage(x, decimals); return numeralWrapper.formatPercentage(x, decimals);
}; };
let desc = <>Effects:</>; let desc = <>Effects:</>;
if(mults.hacking_mult && if (
mults.hacking_mult == mults.strength_mult && mults.hacking_mult &&
mults.hacking_mult == mults.defense_mult && mults.hacking_mult == mults.strength_mult &&
mults.hacking_mult == mults.dexterity_mult && mults.hacking_mult == mults.defense_mult &&
mults.hacking_mult == mults.agility_mult && mults.hacking_mult == mults.dexterity_mult &&
mults.hacking_mult == mults.charisma_mult){ mults.hacking_mult == mults.agility_mult &&
desc = <>{desc}<br />+{f(mults.hacking_mult-1)} all skills</> mults.hacking_mult == mults.charisma_mult
) {
desc = (
<>
{desc}
<br />+{f(mults.hacking_mult - 1)} all skills
</>
);
} else {
if (mults.hacking_mult)
desc = (
<>
{desc}
<br />+{f(mults.hacking_mult - 1)} hacking skill
</>
);
if (
mults.strength_mult &&
mults.strength_mult == mults.defense_mult &&
mults.strength_mult == mults.dexterity_mult &&
mults.strength_mult == mults.agility_mult
) {
desc = (
<>
{desc}
<br />+{f(mults.strength_mult - 1)} combat skills
</>
);
} else { } else {
if(mults.hacking_mult) if (mults.strength_mult)
desc = <>{desc}<br />+{f(mults.hacking_mult-1)} hacking skill</> desc = (
<>
if(mults.strength_mult && {desc}
mults.strength_mult == mults.defense_mult && <br />+{f(mults.strength_mult - 1)} strength skill
mults.strength_mult == mults.dexterity_mult && </>
mults.strength_mult == mults.agility_mult) { );
desc = <>{desc}<br />+{f(mults.strength_mult-1)} combat skills</> if (mults.defense_mult)
} else { desc = (
if(mults.strength_mult) <>
desc = <>{desc}<br />+{f(mults.strength_mult-1)} strength skill</> {desc}
if(mults.defense_mult) <br />+{f(mults.defense_mult - 1)} defense skill
desc = <>{desc}<br />+{f(mults.defense_mult-1)} defense skill</> </>
if(mults.dexterity_mult) );
desc = <>{desc}<br />+{f(mults.dexterity_mult-1)} dexterity skill</> if (mults.dexterity_mult)
if(mults.agility_mult) desc = (
desc = <>{desc}<br />+{f(mults.agility_mult-1)} agility skill</> <>
} {desc}
if(mults.charisma_mult) <br />+{f(mults.dexterity_mult - 1)} dexterity skill
desc = <>{desc}<br />+{f(mults.charisma_mult-1)} Charisma skill</> </>
);
if (mults.agility_mult)
desc = (
<>
{desc}
<br />+{f(mults.agility_mult - 1)} agility skill
</>
);
} }
if (mults.charisma_mult)
desc = (
<>
{desc}
<br />+{f(mults.charisma_mult - 1)} Charisma skill
</>
);
}
if(mults.hacking_exp_mult && if (
mults.hacking_exp_mult === mults.strength_exp_mult && mults.hacking_exp_mult &&
mults.hacking_exp_mult === mults.defense_exp_mult && mults.hacking_exp_mult === mults.strength_exp_mult &&
mults.hacking_exp_mult === mults.dexterity_exp_mult && mults.hacking_exp_mult === mults.defense_exp_mult &&
mults.hacking_exp_mult === mults.agility_exp_mult && mults.hacking_exp_mult === mults.dexterity_exp_mult &&
mults.hacking_exp_mult === mults.charisma_exp_mult) { mults.hacking_exp_mult === mults.agility_exp_mult &&
desc = <>{desc}<br />+{f(mults.hacking_exp_mult-1)} exp for all skills</> mults.hacking_exp_mult === mults.charisma_exp_mult
) {
desc = (
<>
{desc}
<br />+{f(mults.hacking_exp_mult - 1)} exp for all skills
</>
);
} else {
if (mults.hacking_exp_mult)
desc = (
<>
{desc}
<br />+{f(mults.hacking_exp_mult - 1)} hacking exp
</>
);
if (
mults.strength_exp_mult &&
mults.strength_exp_mult === mults.defense_exp_mult &&
mults.strength_exp_mult === mults.dexterity_exp_mult &&
mults.strength_exp_mult === mults.agility_exp_mult
) {
desc = (
<>
{desc}
<br />+{f(mults.strength_exp_mult - 1)} combat exp
</>
);
} else { } else {
if(mults.hacking_exp_mult) if (mults.strength_exp_mult)
desc = <>{desc}<br />+{f(mults.hacking_exp_mult-1)} hacking exp</> desc = (
<>
if(mults.strength_exp_mult && {desc}
mults.strength_exp_mult === mults.defense_exp_mult && <br />+{f(mults.strength_exp_mult - 1)} strength exp
mults.strength_exp_mult === mults.dexterity_exp_mult && </>
mults.strength_exp_mult === mults.agility_exp_mult) { );
desc = <>{desc}<br />+{f(mults.strength_exp_mult-1)} combat exp</> if (mults.defense_exp_mult)
} else { desc = (
if(mults.strength_exp_mult) <>
desc = <>{desc}<br />+{f(mults.strength_exp_mult-1)} strength exp</> {desc}
if(mults.defense_exp_mult) <br />+{f(mults.defense_exp_mult - 1)} defense exp
desc = <>{desc}<br />+{f(mults.defense_exp_mult-1)} defense exp</> </>
if(mults.dexterity_exp_mult) );
desc = <>{desc}<br />+{f(mults.dexterity_exp_mult-1)} dexterity exp</> if (mults.dexterity_exp_mult)
if(mults.agility_exp_mult) desc = (
desc = <>{desc}<br />+{f(mults.agility_exp_mult-1)} agility exp</> <>
} {desc}
if(mults.charisma_exp_mult) <br />+{f(mults.dexterity_exp_mult - 1)} dexterity exp
desc = <>{desc}<br />+{f(mults.charisma_exp_mult-1)} charisma exp</> </>
);
if (mults.agility_exp_mult)
desc = (
<>
{desc}
<br />+{f(mults.agility_exp_mult - 1)} agility exp
</>
);
} }
if (mults.charisma_exp_mult)
desc = (
<>
{desc}
<br />+{f(mults.charisma_exp_mult - 1)} charisma exp
</>
);
}
if(mults.hacking_speed_mult) if (mults.hacking_speed_mult)
desc = <>{desc}<br />+{f(mults.hacking_speed_mult-1)} faster hacking</> desc = (
if(mults.hacking_chance_mult) <>
desc = <>{desc}<br />+{f(mults.hacking_chance_mult-1)} hack() success chance</> {desc}
if(mults.hacking_money_mult) <br />+{f(mults.hacking_speed_mult - 1)} faster hack(), grow(), and weaken()
desc = <>{desc}<br />+{f(mults.hacking_money_mult-1)} hack() power</> </>
if(mults.hacking_grow_mult) );
desc = <>{desc}<br />+{f(mults.hacking_grow_mult-1)} grow() power</> if (mults.hacking_chance_mult)
desc = (
<>
{desc}
<br />+{f(mults.hacking_chance_mult - 1)} hack() success chance
</>
);
if (mults.hacking_money_mult)
desc = (
<>
{desc}
<br />+{f(mults.hacking_money_mult - 1)} hack() power
</>
);
if (mults.hacking_grow_mult)
desc = (
<>
{desc}
<br />+{f(mults.hacking_grow_mult - 1)} grow() power
</>
);
if(mults.faction_rep_mult && if (mults.faction_rep_mult && mults.faction_rep_mult === mults.company_rep_mult) {
mults.faction_rep_mult === mults.company_rep_mult) { desc = (
desc = <>{desc}<br />+{f(mults.faction_rep_mult-1)} reputation from factions and companies</> <>
} else { {desc}
if(mults.faction_rep_mult) <br />+{f(mults.faction_rep_mult - 1)} reputation from factions and companies
desc = <>{desc}<br />+{f(mults.faction_rep_mult-1)} reputation from factions</> </>
if(mults.company_rep_mult) );
desc = <>{desc}<br />+{f(mults.company_rep_mult-1)} reputation from companies</> } else {
} if (mults.faction_rep_mult)
desc = (
<>
{desc}
<br />+{f(mults.faction_rep_mult - 1)} reputation from factions
</>
);
if (mults.company_rep_mult)
desc = (
<>
{desc}
<br />+{f(mults.company_rep_mult - 1)} reputation from companies
</>
);
}
if(mults.crime_money_mult) if (mults.crime_money_mult)
desc = <>{desc}<br />+{f(mults.crime_money_mult-1)} crime money</> desc = (
if(mults.crime_success_mult) <>
desc = <>{desc}<br />+{f(mults.crime_success_mult-1)} crime success rate</> {desc}
if(mults.work_money_mult) <br />+{f(mults.crime_money_mult - 1)} crime money
desc = <>{desc}<br />+{f(mults.work_money_mult-1)} work money</> </>
);
if (mults.crime_success_mult)
desc = (
<>
{desc}
<br />+{f(mults.crime_success_mult - 1)} crime success rate
</>
);
if (mults.work_money_mult)
desc = (
<>
{desc}
<br />+{f(mults.work_money_mult - 1)} work money
</>
);
if(mults.hacknet_node_money_mult) if (mults.hacknet_node_money_mult)
desc = <>{desc}<br />+{f(mults.hacknet_node_money_mult-1)} hacknet production</> desc = (
if(mults.hacknet_node_purchase_cost_mult) <>
desc = <>{desc}<br />-{f(-(mults.hacknet_node_purchase_cost_mult-1))} hacknet nodes cost</> {desc}
if(mults.hacknet_node_level_cost_mult) <br />+{f(mults.hacknet_node_money_mult - 1)} hacknet production
desc = <>{desc}<br />-{f(-(mults.hacknet_node_level_cost_mult-1))} hacknet nodes upgrade cost</> </>
);
if (mults.hacknet_node_purchase_cost_mult)
desc = (
<>
{desc}
<br />-{f(-(mults.hacknet_node_purchase_cost_mult - 1))} hacknet nodes cost
</>
);
if (mults.hacknet_node_level_cost_mult)
desc = (
<>
{desc}
<br />-{f(-(mults.hacknet_node_level_cost_mult - 1))} hacknet nodes upgrade cost
</>
);
if(mults.bladeburner_max_stamina_mult) if (mults.bladeburner_max_stamina_mult)
desc = <>{desc}<br />+{f(mults.bladeburner_max_stamina_mult-1)} Bladeburner Max Stamina</> desc = (
if(mults.bladeburner_stamina_gain_mult) <>
desc = <>{desc}<br />+{f(mults.bladeburner_stamina_gain_mult-1)} Bladeburner Stamina gain</> {desc}
if(mults.bladeburner_analysis_mult) <br />+{f(mults.bladeburner_max_stamina_mult - 1)} Bladeburner Max Stamina
desc = <>{desc}<br />+{f(mults.bladeburner_analysis_mult-1)} Bladeburner Field Analysis effectiveness</> </>
if(mults.bladeburner_success_chance_mult) );
desc = <>{desc}<br />+{f(mults.bladeburner_success_chance_mult-1)} Bladeburner Contracts and Operations success chance</> if (mults.bladeburner_stamina_gain_mult)
desc = (
<>
{desc}
<br />+{f(mults.bladeburner_stamina_gain_mult - 1)} Bladeburner Stamina gain
</>
);
if (mults.bladeburner_analysis_mult)
desc = (
<>
{desc}
<br />+{f(mults.bladeburner_analysis_mult - 1)} Bladeburner Field Analysis effectiveness
</>
);
if (mults.bladeburner_success_chance_mult)
desc = (
<>
{desc}
<br />+{f(mults.bladeburner_success_chance_mult - 1)} Bladeburner Contracts and Operations success chance
</>
);
if(startingMoney) if (startingMoney)
desc = <>{desc}<br />Start with {Money(startingMoney)} after installing Augmentations.</> desc = (
<>
{desc}
<br />
Start with <Money money={startingMoney} /> after installing Augmentations.
</>
);
if(programs) if (programs)
desc = <>{desc}<br />Start with {programs.join(' and ')} after installing Augmentations.</> desc = (
return desc; <>
{desc}
<br />
Start with {programs.join(" and ")} after installing Augmentations.
</>
);
return desc;
} }
export class Augmentation { export class Augmentation {
// How much money this costs to buy
baseCost = 0;
// How much money this costs to buy // How much faction reputation is required to unlock this
baseCost = 0; baseRepRequirement = 0;
// How much faction reputation is required to unlock this // Description of what this Aug is and what it does
baseRepRequirement = 0; info: string | JSX.Element;
// Description of what this Aug is and what it does // Description of the stats, often autogenerated, sometimes manually written.
info: string | JSX.Element; stats: JSX.Element;
// Description of the stats, often autogenerated, sometimes manually written. // Any Augmentation not immediately available in BitNode-1 is special (e.g. Bladeburner augs)
stats: JSX.Element; isSpecial = false;
// Any Augmentation not immediately available in BitNode-1 is special (e.g. Bladeburner augs) // Augmentation level - for repeatable Augs like NeuroFlux Governor
isSpecial = false; level = 0;
// Augmentation level - for repeatable Augs like NeuroFlux Governor // Name of Augmentation
level = 0; name = "";
// Name of Augmentation // Whether the player owns this Augmentation
name = ""; owned = false;
// Whether the player owns this Augmentation // Array of names of all prerequisites
owned = false; prereqs: string[] = [];
// Array of names of all prerequisites // Multipliers given by this Augmentation. Must match the property name in
prereqs: string[] = []; // The Player/Person classes
mults: IMap<number> = {};
// Multipliers given by this Augmentation. Must match the property name in // Initial cost. Doesn't change when you purchase multiple Augmentation
// The Player/Person classes startingCost = 0;
mults: IMap<number> = {}
// Initial cost. Doesn't change when you purchase multiple Augmentation constructor(
startingCost = 0; params: IConstructorParams = {
info: "",
moneyCost: 0,
name: "",
repCost: 0,
},
) {
this.name = params.name;
this.info = params.info;
this.prereqs = params.prereqs ? params.prereqs : [];
constructor(params: IConstructorParams={ info: "", moneyCost: 0, name: "", repCost: 0 }) { this.baseRepRequirement = params.repCost * BitNodeMultipliers.AugmentationRepCost;
this.name = params.name; this.baseCost = params.moneyCost * BitNodeMultipliers.AugmentationMoneyCost;
this.info = params.info; this.startingCost = this.baseCost;
this.prereqs = params.prereqs ? params.prereqs : [];
this.baseRepRequirement = params.repCost * BitNodeMultipliers.AugmentationRepCost; if (params.isSpecial) {
this.baseCost = params.moneyCost * BitNodeMultipliers.AugmentationMoneyCost; this.isSpecial = true;
this.startingCost = this.baseCost; }
if (params.isSpecial) { this.level = 0;
this.isSpecial = true;
// Set multipliers
if (params.hacking_mult) {
this.mults.hacking_mult = params.hacking_mult;
}
if (params.strength_mult) {
this.mults.strength_mult = params.strength_mult;
}
if (params.defense_mult) {
this.mults.defense_mult = params.defense_mult;
}
if (params.dexterity_mult) {
this.mults.dexterity_mult = params.dexterity_mult;
}
if (params.agility_mult) {
this.mults.agility_mult = params.agility_mult;
}
if (params.charisma_mult) {
this.mults.charisma_mult = params.charisma_mult;
}
if (params.hacking_exp_mult) {
this.mults.hacking_exp_mult = params.hacking_exp_mult;
}
if (params.strength_exp_mult) {
this.mults.strength_exp_mult = params.strength_exp_mult;
}
if (params.defense_exp_mult) {
this.mults.defense_exp_mult = params.defense_exp_mult;
}
if (params.dexterity_exp_mult) {
this.mults.dexterity_exp_mult = params.dexterity_exp_mult;
}
if (params.agility_exp_mult) {
this.mults.agility_exp_mult = params.agility_exp_mult;
}
if (params.charisma_exp_mult) {
this.mults.charisma_exp_mult = params.charisma_exp_mult;
}
if (params.hacking_chance_mult) {
this.mults.hacking_chance_mult = params.hacking_chance_mult;
}
if (params.hacking_speed_mult) {
this.mults.hacking_speed_mult = params.hacking_speed_mult;
}
if (params.hacking_money_mult) {
this.mults.hacking_money_mult = params.hacking_money_mult;
}
if (params.hacking_grow_mult) {
this.mults.hacking_grow_mult = params.hacking_grow_mult;
}
if (params.company_rep_mult) {
this.mults.company_rep_mult = params.company_rep_mult;
}
if (params.faction_rep_mult) {
this.mults.faction_rep_mult = params.faction_rep_mult;
}
if (params.crime_money_mult) {
this.mults.crime_money_mult = params.crime_money_mult;
}
if (params.crime_success_mult) {
this.mults.crime_success_mult = params.crime_success_mult;
}
if (params.work_money_mult) {
this.mults.work_money_mult = params.work_money_mult;
}
if (params.hacknet_node_money_mult) {
this.mults.hacknet_node_money_mult = params.hacknet_node_money_mult;
}
if (params.hacknet_node_purchase_cost_mult) {
this.mults.hacknet_node_purchase_cost_mult = params.hacknet_node_purchase_cost_mult;
}
if (params.hacknet_node_ram_cost_mult) {
this.mults.hacknet_node_ram_cost_mult = params.hacknet_node_ram_cost_mult;
}
if (params.hacknet_node_core_cost_mult) {
this.mults.hacknet_node_core_cost_mult = params.hacknet_node_core_cost_mult;
}
if (params.hacknet_node_level_cost_mult) {
this.mults.hacknet_node_level_cost_mult = params.hacknet_node_level_cost_mult;
}
if (params.bladeburner_max_stamina_mult) {
this.mults.bladeburner_max_stamina_mult = params.bladeburner_max_stamina_mult;
}
if (params.bladeburner_stamina_gain_mult) {
this.mults.bladeburner_stamina_gain_mult = params.bladeburner_stamina_gain_mult;
}
if (params.bladeburner_analysis_mult) {
this.mults.bladeburner_analysis_mult = params.bladeburner_analysis_mult;
}
if (params.bladeburner_success_chance_mult) {
this.mults.bladeburner_success_chance_mult = params.bladeburner_success_chance_mult;
}
if (params.stats) this.stats = params.stats;
else this.stats = generateStatsDescription(this.mults, params.programs, params.startingMoney);
}
// Adds this Augmentation to the specified Factions
addToFactions(factionList: string[]): void {
for (let i = 0; i < factionList.length; ++i) {
const faction: Faction | null = Factions[factionList[i]];
if (faction == null) {
console.warn(`In Augmentation.addToFactions(), could not find faction with this name: ${factionList[i]}`);
continue;
}
faction.augmentations.push(this.name);
}
}
// Adds this Augmentation to all Factions
addToAllFactions(): void {
for (const fac in Factions) {
if (Factions.hasOwnProperty(fac)) {
const facObj: Faction | null = Factions[fac];
if (facObj == null) {
console.warn(`Invalid Faction object in addToAllFactions(). Key value: ${fac}`);
continue;
} }
facObj.augmentations.push(this.name);
this.level = 0; }
// Set multipliers
if (params.hacking_mult) { this.mults.hacking_mult = params.hacking_mult; }
if (params.strength_mult) { this.mults.strength_mult = params.strength_mult; }
if (params.defense_mult) { this.mults.defense_mult = params.defense_mult; }
if (params.dexterity_mult) { this.mults.dexterity_mult = params.dexterity_mult; }
if (params.agility_mult) { this.mults.agility_mult = params.agility_mult; }
if (params.charisma_mult) { this.mults.charisma_mult = params.charisma_mult; }
if (params.hacking_exp_mult) { this.mults.hacking_exp_mult = params.hacking_exp_mult; }
if (params.strength_exp_mult) { this.mults.strength_exp_mult = params.strength_exp_mult; }
if (params.defense_exp_mult) { this.mults.defense_exp_mult = params.defense_exp_mult; }
if (params.dexterity_exp_mult) { this.mults.dexterity_exp_mult = params.dexterity_exp_mult; }
if (params.agility_exp_mult) { this.mults.agility_exp_mult = params.agility_exp_mult; }
if (params.charisma_exp_mult) { this.mults.charisma_exp_mult = params.charisma_exp_mult; }
if (params.hacking_chance_mult) { this.mults.hacking_chance_mult = params.hacking_chance_mult; }
if (params.hacking_speed_mult) { this.mults.hacking_speed_mult = params.hacking_speed_mult; }
if (params.hacking_money_mult) { this.mults.hacking_money_mult = params.hacking_money_mult; }
if (params.hacking_grow_mult) { this.mults.hacking_grow_mult = params.hacking_grow_mult; }
if (params.company_rep_mult) { this.mults.company_rep_mult = params.company_rep_mult; }
if (params.faction_rep_mult) { this.mults.faction_rep_mult = params.faction_rep_mult; }
if (params.crime_money_mult) { this.mults.crime_money_mult = params.crime_money_mult; }
if (params.crime_success_mult) { this.mults.crime_success_mult = params.crime_success_mult; }
if (params.work_money_mult) { this.mults.work_money_mult = params.work_money_mult; }
if (params.hacknet_node_money_mult) { this.mults.hacknet_node_money_mult = params.hacknet_node_money_mult; }
if (params.hacknet_node_purchase_cost_mult) { this.mults.hacknet_node_purchase_cost_mult = params.hacknet_node_purchase_cost_mult; }
if (params.hacknet_node_ram_cost_mult) { this.mults.hacknet_node_ram_cost_mult = params.hacknet_node_ram_cost_mult; }
if (params.hacknet_node_core_cost_mult) { this.mults.hacknet_node_core_cost_mult = params.hacknet_node_core_cost_mult; }
if (params.hacknet_node_level_cost_mult) { this.mults.hacknet_node_level_cost_mult = params.hacknet_node_level_cost_mult; }
if (params.bladeburner_max_stamina_mult) { this.mults.bladeburner_max_stamina_mult = params.bladeburner_max_stamina_mult; }
if (params.bladeburner_stamina_gain_mult) { this.mults.bladeburner_stamina_gain_mult = params.bladeburner_stamina_gain_mult; }
if (params.bladeburner_analysis_mult) { this.mults.bladeburner_analysis_mult = params.bladeburner_analysis_mult; }
if (params.bladeburner_success_chance_mult) { this.mults.bladeburner_success_chance_mult = params.bladeburner_success_chance_mult; }
if(params.stats)
this.stats = params.stats;
else
this.stats = generateStatsDescription(this.mults, params.programs, params.startingMoney);
} }
}
// Adds this Augmentation to the specified Factions // Serialize the current object to a JSON save state.
addToFactions(factionList: string[]): void { toJSON(): any {
for (let i = 0; i < factionList.length; ++i) { return Generic_toJSON("Augmentation", this);
const faction: Faction | null = Factions[factionList[i]]; }
if (faction == null) {
console.warn(`In Augmentation.addToFactions(), could not find faction with this name: ${factionList[i]}`);
continue;
}
faction.augmentations.push(this.name);
}
}
// Adds this Augmentation to all Factions // Initiatizes a Augmentation object from a JSON save state.
addToAllFactions(): void { // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
for (const fac in Factions) { static fromJSON(value: any): Augmentation {
if (Factions.hasOwnProperty(fac)) { return Generic_fromJSON(Augmentation, value.data);
const facObj: Faction | null = Factions[fac]; }
if (facObj == null) {
console.warn(`Invalid Faction object in addToAllFactions(). Key value: ${fac}`);
continue;
}
facObj.augmentations.push(this.name);
}
}
}
// Serialize the current object to a JSON save state.
toJSON(): any {
return Generic_toJSON("Augmentation", this);
}
// Initiatizes a Augmentation object from a JSON save state.
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
static fromJSON(value: any): Augmentation {
return Generic_fromJSON(Augmentation, value.data);
}
} }
Reviver.constructors.Augmentation = Augmentation; Reviver.constructors.Augmentation = Augmentation;

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +1,13 @@
export class PlayerOwnedAugmentation { export class PlayerOwnedAugmentation {
level = 1; level = 1;
name = ""; name = "";
constructor(name = "") { constructor(name = "") {
this.name = name; this.name = name;
} }
} }
export interface IPlayerOwnedAugmentation { export interface IPlayerOwnedAugmentation {
level: number; level: number;
name: string; name: string;
} }

View File

@@ -1,118 +1,118 @@
import { IMap } from "../../types"; import { IMap } from "../../types";
export const AugmentationNames: IMap<string> = { export const AugmentationNames: IMap<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",
SyntheticHeart: "Synthetic Heart", SyntheticHeart: "Synthetic Heart",
SynfibrilMuscle: "Synfibril Muscle", SynfibrilMuscle: "Synfibril Muscle",
CombatRib1: "Combat Rib I", CombatRib1: "Combat Rib I",
CombatRib2: "Combat Rib II", CombatRib2: "Combat Rib II",
CombatRib3: "Combat Rib III", CombatRib3: "Combat Rib III",
NanofiberWeave: "Nanofiber Weave", NanofiberWeave: "Nanofiber Weave",
SubdermalArmor: "NEMEAN Subdermal Weave", SubdermalArmor: "NEMEAN Subdermal Weave",
WiredReflexes: "Wired Reflexes", WiredReflexes: "Wired Reflexes",
GrapheneBoneLacings: "Graphene Bone Lacings", GrapheneBoneLacings: "Graphene Bone Lacings",
BionicSpine: "Bionic Spine", BionicSpine: "Bionic Spine",
GrapheneBionicSpine: "Graphene Bionic Spine Upgrade", GrapheneBionicSpine: "Graphene Bionic Spine Upgrade",
BionicLegs: "Bionic Legs", BionicLegs: "Bionic Legs",
GrapheneBionicLegs: "Graphene Bionic Legs Upgrade", GrapheneBionicLegs: "Graphene Bionic Legs Upgrade",
SpeechProcessor: "Speech Processor Implant", SpeechProcessor: "Speech Processor Implant",
TITN41Injection: "TITN-41 Gene-Modification Injection", TITN41Injection: "TITN-41 Gene-Modification Injection",
EnhancedSocialInteractionImplant: "Enhanced Social Interaction Implant", EnhancedSocialInteractionImplant: "Enhanced Social Interaction Implant",
BitWire: "BitWire", BitWire: "BitWire",
ArtificialBioNeuralNetwork: "Artificial Bio-neural Network Implant", ArtificialBioNeuralNetwork: "Artificial Bio-neural Network Implant",
ArtificialSynapticPotentiation: "Artificial Synaptic Potentiation", ArtificialSynapticPotentiation: "Artificial Synaptic Potentiation",
EnhancedMyelinSheathing: "Enhanced Myelin Sheathing", EnhancedMyelinSheathing: "Enhanced Myelin Sheathing",
SynapticEnhancement: "Synaptic Enhancement Implant", SynapticEnhancement: "Synaptic Enhancement Implant",
NeuralRetentionEnhancement: "Neural-Retention Enhancement", NeuralRetentionEnhancement: "Neural-Retention Enhancement",
DataJack: "DataJack", DataJack: "DataJack",
ENM: "Embedded Netburner Module", ENM: "Embedded Netburner Module",
ENMCore: "Embedded Netburner Module Core Implant", ENMCore: "Embedded Netburner Module Core Implant",
ENMCoreV2: "Embedded Netburner Module Core V2 Upgrade", ENMCoreV2: "Embedded Netburner Module Core V2 Upgrade",
ENMCoreV3: "Embedded Netburner Module Core V3 Upgrade", ENMCoreV3: "Embedded Netburner Module Core V3 Upgrade",
ENMAnalyzeEngine: "Embedded Netburner Module Analyze Engine", ENMAnalyzeEngine: "Embedded Netburner Module Analyze Engine",
ENMDMA: "Embedded Netburner Module Direct Memory Access Upgrade", ENMDMA: "Embedded Netburner Module Direct Memory Access Upgrade",
Neuralstimulator: "Neuralstimulator", Neuralstimulator: "Neuralstimulator",
NeuralAccelerator: "Neural Accelerator", NeuralAccelerator: "Neural Accelerator",
CranialSignalProcessorsG1: "Cranial Signal Processors - Gen I", CranialSignalProcessorsG1: "Cranial Signal Processors - Gen I",
CranialSignalProcessorsG2: "Cranial Signal Processors - Gen II", CranialSignalProcessorsG2: "Cranial Signal Processors - Gen II",
CranialSignalProcessorsG3: "Cranial Signal Processors - Gen III", CranialSignalProcessorsG3: "Cranial Signal Processors - Gen III",
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",
NuoptimalInjectorImplant: "Nuoptimal Nootropic Injector Implant", NuoptimalInjectorImplant: "Nuoptimal Nootropic Injector Implant",
SpeechEnhancement: "Speech Enhancement", SpeechEnhancement: "Speech Enhancement",
FocusWire: "FocusWire", FocusWire: "FocusWire",
PCDNI: "PC Direct-Neural Interface", PCDNI: "PC Direct-Neural Interface",
PCDNIOptimizer: "PC Direct-Neural Interface Optimization Submodule", PCDNIOptimizer: "PC Direct-Neural Interface Optimization Submodule",
PCDNINeuralNetwork: "PC Direct-Neural Interface NeuroNet Injector", PCDNINeuralNetwork: "PC Direct-Neural Interface NeuroNet Injector",
PCMatrix: "PCMatrix", PCMatrix: "PCMatrix",
ADRPheromone1: "ADR-V1 Pheromone Gene", ADRPheromone1: "ADR-V1 Pheromone Gene",
ADRPheromone2: "ADR-V2 Pheromone Gene", ADRPheromone2: "ADR-V2 Pheromone Gene",
ShadowsSimulacrum: "The Shadow's Simulacrum", ShadowsSimulacrum: "The Shadow's Simulacrum",
HacknetNodeCPUUpload: "Hacknet Node CPU Architecture Neural-Upload", HacknetNodeCPUUpload: "Hacknet Node CPU Architecture Neural-Upload",
HacknetNodeCacheUpload: "Hacknet Node Cache Architecture Neural-Upload", HacknetNodeCacheUpload: "Hacknet Node Cache Architecture Neural-Upload",
HacknetNodeNICUpload: "Hacknet Node NIC Architecture Neural-Upload", HacknetNodeNICUpload: "Hacknet Node NIC Architecture Neural-Upload",
HacknetNodeKernelDNI: "Hacknet Node Kernel Direct-Neural Interface", HacknetNodeKernelDNI: "Hacknet Node Kernel Direct-Neural Interface",
HacknetNodeCoreDNI: "Hacknet Node Core Direct-Neural Interface", HacknetNodeCoreDNI: "Hacknet Node Core Direct-Neural Interface",
NeuroFluxGovernor: "NeuroFlux Governor", NeuroFluxGovernor: "NeuroFlux Governor",
Neurotrainer1: "Neurotrainer I", Neurotrainer1: "Neurotrainer I",
Neurotrainer2: "Neurotrainer II", Neurotrainer2: "Neurotrainer II",
Neurotrainer3: "Neurotrainer III", Neurotrainer3: "Neurotrainer III",
Hypersight: "HyperSight Corneal Implant", Hypersight: "HyperSight Corneal Implant",
LuminCloaking1: "LuminCloaking-V1 Skin Implant", LuminCloaking1: "LuminCloaking-V1 Skin Implant",
LuminCloaking2: "LuminCloaking-V2 Skin Implant", LuminCloaking2: "LuminCloaking-V2 Skin Implant",
HemoRecirculator: "HemoRecirculator", HemoRecirculator: "HemoRecirculator",
SmartSonar: "SmartSonar Implant", SmartSonar: "SmartSonar Implant",
PowerRecirculator: "Power Recirculation Core", PowerRecirculator: "Power Recirculation Core",
QLink: "QLink", QLink: "QLink",
TheRedPill: "The Red Pill", TheRedPill: "The Red Pill",
SPTN97: "SPTN-97 Gene Modification", SPTN97: "SPTN-97 Gene Modification",
HiveMind: "ECorp HVMind Implant", HiveMind: "ECorp HVMind Implant",
CordiARCReactor: "CordiARC Fusion Reactor", CordiARCReactor: "CordiARC Fusion Reactor",
SmartJaw: "SmartJaw", SmartJaw: "SmartJaw",
Neotra: "Neotra", Neotra: "Neotra",
Xanipher: "Xanipher", Xanipher: "Xanipher",
nextSENS: "nextSENS Gene Modification", nextSENS: "nextSENS Gene Modification",
OmniTekInfoLoad: "OmniTek InfoLoad", OmniTekInfoLoad: "OmniTek InfoLoad",
PhotosyntheticCells: "Photosynthetic Cells", PhotosyntheticCells: "Photosynthetic Cells",
Neurolink: "BitRunners Neurolink", Neurolink: "BitRunners Neurolink",
TheBlackHand: "The Black Hand", TheBlackHand: "The Black Hand",
UnstableCircadianModulator: "Unstable Circadian Modulator", UnstableCircadianModulator: "Unstable Circadian Modulator",
CRTX42AA: "CRTX42-AA Gene Modification", CRTX42AA: "CRTX42-AA Gene Modification",
Neuregen: "Neuregen Gene Modification", Neuregen: "Neuregen Gene Modification",
CashRoot: "CashRoot Starter Kit", CashRoot: "CashRoot Starter Kit",
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 BranchiBlades Upgrade",
GrapheneBionicArms: "Graphene Bionic Arms Upgrade", GrapheneBionicArms: "Graphene Bionic Arms Upgrade",
BrachiBlades: "BrachiBlades", BrachiBlades: "BrachiBlades",
BionicArms: "Bionic Arms", BionicArms: "Bionic Arms",
SNA: "Social Negotiation Assistant (S.N.A)", SNA: "Social Negotiation Assistant (S.N.A)",
HydroflameLeftArm: "Hydroflame Left Arm", HydroflameLeftArm: "Hydroflame Left Arm",
EsperEyewear: "EsperTech Bladeburner Eyewear", EsperEyewear: "EsperTech Bladeburner Eyewear",
EMS4Recombination: "EMS-4 Recombination", EMS4Recombination: "EMS-4 Recombination",
OrionShoulder: "ORION-MKIV Shoulder", OrionShoulder: "ORION-MKIV Shoulder",
HyperionV1: "Hyperion Plasma Cannon V1", HyperionV1: "Hyperion Plasma Cannon V1",
HyperionV2: "Hyperion Plasma Cannon V2", HyperionV2: "Hyperion Plasma Cannon V2",
GolemSerum: "GOLEM Serum", GolemSerum: "GOLEM Serum",
VangelisVirus: "Vangelis Virus", VangelisVirus: "Vangelis Virus",
VangelisVirus3: "Vangelis Virus 3.0", VangelisVirus3: "Vangelis Virus 3.0",
INTERLINKED: "I.N.T.E.R.L.I.N.K.E.D", INTERLINKED: "I.N.T.E.R.L.I.N.K.E.D",
BladeRunner: "Blade's Runners", BladeRunner: "Blade's Runners",
BladeArmor: "BLADE-51b Tesla Armor", BladeArmor: "BLADE-51b Tesla Armor",
BladeArmorPowerCells: "BLADE-51b Tesla Armor: Power Cells Upgrade", BladeArmorPowerCells: "BLADE-51b Tesla Armor: Power Cells Upgrade",
BladeArmorEnergyShielding: "BLADE-51b Tesla Armor: Energy Shielding Upgrade", BladeArmorEnergyShielding: "BLADE-51b Tesla Armor: Energy Shielding Upgrade",
BladeArmorUnibeam: "BLADE-51b Tesla Armor: Unibeam Upgrade", BladeArmorUnibeam: "BLADE-51b Tesla Armor: Unibeam Upgrade",
BladeArmorOmnibeam: "BLADE-51b Tesla Armor: Omnibeam Upgrade", BladeArmorOmnibeam: "BLADE-51b Tesla Armor: Omnibeam Upgrade",
BladeArmorIPU: "BLADE-51b Tesla Armor: IPU Upgrade", BladeArmorIPU: "BLADE-51b Tesla Armor: IPU Upgrade",
BladesSimulacrum: "The Blade's Simulacrum", BladesSimulacrum: "The Blade's Simulacrum",
//Wasteland Augs //Wasteland Augs
//PepBoy: "P.E.P-Boy", Plasma Energy Projection System //PepBoy: "P.E.P-Boy", Plasma Energy Projection System
//PepBoyForceField Generates plasma force fields //PepBoyForceField Generates plasma force fields
//PepBoyBlasts Generate high density plasma concussive blasts //PepBoyBlasts Generate high density plasma concussive blasts
//PepBoyDataStorage STore more data on pep boy, //PepBoyDataStorage STore more data on pep boy,
} };

View File

@@ -13,30 +13,28 @@ import { OwnedAugmentationsOrderSetting } from "../../Settings/SettingEnums";
import { AugmentationAccordion } from "../../ui/React/AugmentationAccordion"; import { AugmentationAccordion } from "../../ui/React/AugmentationAccordion";
export function InstalledAugmentations(): React.ReactElement { export function InstalledAugmentations(): React.ReactElement {
const sourceAugs = Player.augmentations.slice(); const sourceAugs = Player.augmentations.slice();
if (Settings.OwnedAugmentationsOrder === OwnedAugmentationsOrderSetting.Alphabetically) { if (Settings.OwnedAugmentationsOrder === OwnedAugmentationsOrderSetting.Alphabetically) {
sourceAugs.sort((aug1, aug2) => { sourceAugs.sort((aug1, aug2) => {
return aug1.name <= aug2.name ? -1 : 1; return aug1.name <= aug2.name ? -1 : 1;
}); });
}
const augs = sourceAugs.map((e) => {
const aug = Augmentations[e.name];
let level = null;
if (e.name === AugmentationNames.NeuroFluxGovernor) {
level = e.level;
} }
const augs = sourceAugs.map((e) => {
const aug = Augmentations[e.name];
let level = null;
if (e.name === AugmentationNames.NeuroFluxGovernor) {
level = e.level;
}
return (
<li key={e.name}>
<AugmentationAccordion aug={aug} level={level} />
</li>
)
});
return ( return (
<>{augs}</> <li key={e.name}>
) <AugmentationAccordion aug={aug} level={level} />
</li>
);
});
return <>{augs}</>;
} }

View File

@@ -16,96 +16,100 @@ import { Settings } from "../../Settings/Settings";
import { OwnedAugmentationsOrderSetting } from "../../Settings/SettingEnums"; import { OwnedAugmentationsOrderSetting } from "../../Settings/SettingEnums";
type IProps = { type IProps = {
// nothing special. // nothing special.
} };
type IState = { type IState = {
rerenderFlag: boolean; rerenderFlag: boolean;
} };
export class InstalledAugmentationsAndSourceFiles extends React.Component<IProps, IState> { export class InstalledAugmentationsAndSourceFiles extends React.Component<IProps, IState> {
listRef: React.RefObject<HTMLUListElement>; listRef: React.RefObject<HTMLUListElement>;
constructor(props: IProps) { constructor(props: IProps) {
super(props); super(props);
this.state = { this.state = {
rerenderFlag: false, rerenderFlag: false,
} };
this.collapseAllHeaders = this.collapseAllHeaders.bind(this); this.collapseAllHeaders = this.collapseAllHeaders.bind(this);
this.expandAllHeaders = this.expandAllHeaders.bind(this); this.expandAllHeaders = this.expandAllHeaders.bind(this);
this.sortByAcquirementTime = this.sortByAcquirementTime.bind(this); this.sortByAcquirementTime = this.sortByAcquirementTime.bind(this);
this.sortInOrder = this.sortInOrder.bind(this); this.sortInOrder = this.sortInOrder.bind(this);
this.listRef = React.createRef(); 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;
}
collapseAllHeaders(): void { if (ticker.classList.contains("active")) {
const ul = this.listRef.current; ticker.click();
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 { expandAllHeaders(): void {
const ul = this.listRef.current; const ul = this.listRef.current;
if (ul == null) { return; } if (ul == null) {
const tickers = ul.getElementsByClassName("accordion-header"); return;
for (let i = 0; i < tickers.length; ++i) {
const ticker = tickers[i];
if (!(ticker instanceof HTMLButtonElement)) {
continue;
}
if (!ticker.classList.contains("active")) {
ticker.click();
}
}
} }
const tickers = ul.getElementsByClassName("accordion-header");
for (let i = 0; i < tickers.length; ++i) {
const ticker = tickers[i];
if (!(ticker instanceof HTMLButtonElement)) {
continue;
}
rerender(): void { if (!ticker.classList.contains("active")) {
this.setState((prevState) => { ticker.click();
return { }
rerenderFlag: !prevState.rerenderFlag,
}
});
} }
}
sortByAcquirementTime(): void { rerender(): void {
Settings.OwnedAugmentationsOrder = OwnedAugmentationsOrderSetting.AcquirementTime; this.setState((prevState) => {
this.rerender(); return {
} rerenderFlag: !prevState.rerenderFlag,
};
});
}
sortInOrder(): void { sortByAcquirementTime(): void {
Settings.OwnedAugmentationsOrder = OwnedAugmentationsOrderSetting.Alphabetically Settings.OwnedAugmentationsOrder = OwnedAugmentationsOrderSetting.AcquirementTime;
this.rerender(); this.rerender();
} }
render(): React.ReactNode { sortInOrder(): void {
return ( Settings.OwnedAugmentationsOrder = OwnedAugmentationsOrderSetting.Alphabetically;
<> this.rerender();
<ListConfiguration }
collapseAllButtonsFn={this.collapseAllHeaders}
expandAllButtonsFn={this.expandAllHeaders} render(): React.ReactNode {
sortByAcquirementTimeFn={this.sortByAcquirementTime} return (
sortInOrderFn={this.sortInOrder} <>
/> <ListConfiguration
<ul className="augmentations-list" ref={this.listRef}> collapseAllButtonsFn={this.collapseAllHeaders}
<SourceFileMinus1 /> expandAllButtonsFn={this.expandAllHeaders}
<OwnedSourceFiles /> sortByAcquirementTimeFn={this.sortByAcquirementTime}
<InstalledAugmentations /> sortInOrderFn={this.sortInOrder}
</ul> />
</> <ul className="augmentations-list" ref={this.listRef}>
) <SourceFileMinus1 />
} <OwnedSourceFiles />
<InstalledAugmentations />
</ul>
</>
);
}
} }

View File

@@ -7,33 +7,27 @@ import * as React from "react";
import { StdButton } from "../../ui/React/StdButton"; import { StdButton } from "../../ui/React/StdButton";
type IProps = { type IProps = {
collapseAllButtonsFn: () => void; collapseAllButtonsFn: () => void;
expandAllButtonsFn: () => void; expandAllButtonsFn: () => void;
sortByAcquirementTimeFn: () => void; sortByAcquirementTimeFn: () => void;
sortInOrderFn: () => void; sortInOrderFn: () => void;
} };
export function ListConfiguration(props: IProps): React.ReactElement { export function ListConfiguration(props: IProps): React.ReactElement {
return ( return (
<> <>
<StdButton <StdButton onClick={props.expandAllButtonsFn} text="Expand All" />
onClick={props.expandAllButtonsFn} <StdButton onClick={props.collapseAllButtonsFn} text="Collapse All" />
text="Expand All" <StdButton
/> onClick={props.sortInOrderFn}
<StdButton text="Sort in Order"
onClick={props.collapseAllButtonsFn} tooltip="Sorts the Augmentations alphabetically and Source-Files in numeral order"
text="Collapse All" />
/> <StdButton
<StdButton onClick={props.sortByAcquirementTimeFn}
onClick={props.sortInOrderFn} text="Sort by Acquirement Time"
text="Sort in Order" tooltip="Sorts the Augmentations and Source-Files based on when you acquired them (same as default)"
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)"
/>
</>
)
} }

View File

@@ -12,30 +12,28 @@ import { SourceFiles } from "../../SourceFile/SourceFiles";
import { SourceFileAccordion } from "../../ui/React/SourceFileAccordion"; import { SourceFileAccordion } from "../../ui/React/SourceFileAccordion";
export function OwnedSourceFiles(): React.ReactElement { export function OwnedSourceFiles(): React.ReactElement {
const sourceSfs = Player.sourceFiles.slice(); const sourceSfs = Player.sourceFiles.slice();
if (Settings.OwnedAugmentationsOrder === OwnedAugmentationsOrderSetting.Alphabetically) { if (Settings.OwnedAugmentationsOrder === OwnedAugmentationsOrderSetting.Alphabetically) {
sourceSfs.sort((sf1, sf2) => { sourceSfs.sort((sf1, sf2) => {
return sf1.n - sf2.n; return sf1.n - sf2.n;
}); });
}
const sfs = sourceSfs.map((e) => {
const srcFileKey = "SourceFile" + e.n;
const sfObj = SourceFiles[srcFileKey];
if (sfObj == null) {
console.error(`Invalid source file number: ${e.n}`);
return null;
} }
const sfs = sourceSfs.map((e) => {
const srcFileKey = "SourceFile" + e.n;
const sfObj = SourceFiles[srcFileKey];
if (sfObj == null) {
console.error(`Invalid source file number: ${e.n}`);
return null;
}
return (
<li key={e.n}>
<SourceFileAccordion level={e.lvl} sf={sfObj} />
</li>
)
});
return ( return (
<>{sfs}</> <li key={e.n}>
<SourceFileAccordion level={e.lvl} sf={sfObj} />
</li>
); );
});
return <>{sfs}</>;
} }

View File

@@ -5,118 +5,176 @@ 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";
function calculateAugmentedStats(): any { function calculateAugmentedStats(): any {
const augP: any = {}; const augP: any = {};
for(const aug of Player.queuedAugmentations) { for (const aug of Player.queuedAugmentations) {
const augObj = Augmentations[aug.name]; const augObj = Augmentations[aug.name];
for (const mult in augObj.mults) { for (const mult in augObj.mults) {
const v = augP[mult] ? augP[mult] : 1; const v = augP[mult] ? augP[mult] : 1;
augP[mult] = v * augObj.mults[mult]; augP[mult] = v * augObj.mults[mult];
}
} }
return augP; }
return augP;
} }
export function PlayerMultipliers(): React.ReactElement { export function PlayerMultipliers(): React.ReactElement {
const mults = calculateAugmentedStats(); const mults = calculateAugmentedStats();
function MultiplierTable(rows: any[]): React.ReactElement { function MultiplierTable(rows: any[]): React.ReactElement {
function improvements(r: number): JSX.Element[] { function improvements(r: number): JSX.Element[] {
let elems: JSX.Element[] = []; let elems: JSX.Element[] = [];
if(r) { if (r) {
elems = [ elems = [<td key="2">&nbsp;{"=>"}&nbsp;</td>, <td key="3">{numeralWrapper.formatPercentage(r)}</td>];
<td key="2">&nbsp;{"=>"}&nbsp;</td>, }
<td key="3">{numeralWrapper.formatPercentage(r)}</td>, return elems;
];
}
return elems;
}
return <table>
<tbody>
{rows.map((r: any) => <tr key={r[0]}>
<td key="0"><span>{r[0]} multiplier:&nbsp;</span></td>
<td key="1" style={{textAlign: 'right'}}>{numeralWrapper.formatPercentage(r[1])}</td>
{improvements(r[2])}
</tr>)}
</tbody>
</table>
}
function BladeburnerMults(): React.ReactElement {
if(!Player.canAccessBladeburner()) return (<></>);
return (<>
{MultiplierTable([
['Bladeburner Success Chance', Player.bladeburner_success_chance_mult, Player.bladeburner_success_chance_mult*mults.bladeburner_success_chance_mult],
['Bladeburner Max Stamina', Player.bladeburner_max_stamina_mult, Player.bladeburner_max_stamina_mult*mults.bladeburner_max_stamina_mult],
['Bladeburner Stamina Gain', Player.bladeburner_stamina_gain_mult, Player.bladeburner_stamina_gain_mult*mults.bladeburner_stamina_gain_mult],
['Bladeburner Field Analysis', Player.bladeburner_analysis_mult, Player.bladeburner_analysis_mult*mults.bladeburner_analysis_mult],
])}<br />
</>);
} }
return ( return (
<> <table>
<p><strong><u>Multipliers:</u></strong></p><br /> <tbody>
{rows.map((r: any) => (
<tr key={r[0]}>
<td key="0">
<span>{r[0]} multiplier:&nbsp;</span>
</td>
<td key="1" style={{ textAlign: "right" }}>
{numeralWrapper.formatPercentage(r[1])}
</td>
{improvements(r[2])}
</tr>
))}
</tbody>
</table>
);
}
function BladeburnerMults(): React.ReactElement {
if (!Player.canAccessBladeburner()) return <></>;
return (
<>
{MultiplierTable([ {MultiplierTable([
['Hacking Chance ', Player.hacking_chance_mult, Player.hacking_chance_mult*mults.hacking_chance_mult], [
['Hacking Speed ', Player.hacking_speed_mult, Player.hacking_speed_mult*mults.hacking_speed_mult], "Bladeburner Success Chance",
['Hacking Money ', Player.hacking_money_mult, Player.hacking_money_mult*mults.hacking_money_mult], Player.bladeburner_success_chance_mult,
['Hacking Growth ', Player.hacking_grow_mult, Player.hacking_grow_mult*mults.hacking_grow_mult], Player.bladeburner_success_chance_mult * mults.bladeburner_success_chance_mult,
])}<br /> ],
[
"Bladeburner Max Stamina",
Player.bladeburner_max_stamina_mult,
Player.bladeburner_max_stamina_mult * mults.bladeburner_max_stamina_mult,
],
[
"Bladeburner Stamina Gain",
Player.bladeburner_stamina_gain_mult,
Player.bladeburner_stamina_gain_mult * mults.bladeburner_stamina_gain_mult,
],
[
"Bladeburner Field Analysis",
Player.bladeburner_analysis_mult,
Player.bladeburner_analysis_mult * mults.bladeburner_analysis_mult,
],
])}
<br />
</>
);
}
{MultiplierTable([ return (
['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], <p>
])}<br /> <strong>
<u>Multipliers:</u>
</strong>
</p>
<br />
{MultiplierTable([
["Hacking Chance ", Player.hacking_chance_mult, Player.hacking_chance_mult * mults.hacking_chance_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 />
{MultiplierTable([
["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 />
{MultiplierTable([ {MultiplierTable([
['Strength Level ', Player.strength_mult, Player.strength_mult*mults.strength_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], ["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], ["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], ["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], ["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], ["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], ["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], ["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], ["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], ["Charisma Experience ", Player.charisma_exp_mult, Player.charisma_exp_mult * mults.charisma_exp_mult],
])}<br /> ])}
<br />
{MultiplierTable([ {MultiplierTable([
['Hacknet Node production ', 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, Player.hacknet_node_purchase_cost_mult*mults.hacknet_node_purchase_cost_mult], "Hacknet Node production ",
['Hacknet Node RAM upgrade cost ', Player.hacknet_node_ram_cost_mult, Player.hacknet_node_ram_cost_mult*mults.hacknet_node_ram_cost_mult], Player.hacknet_node_money_mult,
['Hacknet Node Core purchase cost ', Player.hacknet_node_core_cost_mult, Player.hacknet_node_core_cost_mult*mults.hacknet_node_core_cost_mult], Player.hacknet_node_money_mult * mults.hacknet_node_money_mult,
['Hacknet Node level upgrade cost ', Player.hacknet_node_level_cost_mult, Player.hacknet_node_level_cost_mult*mults.hacknet_node_level_cost_mult], ],
])}<br /> [
"Hacknet Node purchase cost ",
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,
Player.hacknet_node_ram_cost_mult * mults.hacknet_node_ram_cost_mult,
],
[
"Hacknet Node Core purchase cost ",
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,
Player.hacknet_node_level_cost_mult * mults.hacknet_node_level_cost_mult,
],
])}
<br />
{MultiplierTable([ {MultiplierTable([
['Company reputation gain ', Player.company_rep_mult, Player.company_rep_mult*mults.company_rep_mult], ["Company reputation gain ", Player.company_rep_mult, Player.company_rep_mult * mults.company_rep_mult],
['Faction reputation gain ', Player.faction_rep_mult, Player.faction_rep_mult*mults.faction_rep_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], ["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], ["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], ["Crime money ", Player.crime_money_mult, Player.crime_money_mult * mults.crime_money_mult],
])}<br /> ])}
<br />
<BladeburnerMults /> <BladeburnerMults />
</> </>
) );
} }

View File

@@ -11,32 +11,30 @@ import { Player } from "../../Player";
import { AugmentationAccordion } from "../../ui/React/AugmentationAccordion"; import { AugmentationAccordion } from "../../ui/React/AugmentationAccordion";
export function PurchasedAugmentations(): React.ReactElement { export function PurchasedAugmentations(): React.ReactElement {
const augs: React.ReactElement[] = []; const augs: React.ReactElement[] = [];
// Only render the last NeuroFlux (there are no findLastIndex btw) // Only render the last NeuroFlux (there are no findLastIndex btw)
let nfgIndex = -1; let nfgIndex = -1;
for(let i = Player.queuedAugmentations.length-1; i >= 0; i--) { for (let i = Player.queuedAugmentations.length - 1; i >= 0; i--) {
if(Player.queuedAugmentations[i].name === AugmentationNames.NeuroFluxGovernor) { if (Player.queuedAugmentations[i].name === AugmentationNames.NeuroFluxGovernor) {
nfgIndex = i; nfgIndex = i;
break; break;
}
} }
for (let i = 0; i < Player.queuedAugmentations.length; i++) { }
const ownedAug = Player.queuedAugmentations[i]; for (let i = 0; i < Player.queuedAugmentations.length; i++) {
if(ownedAug.name === AugmentationNames.NeuroFluxGovernor && i !== nfgIndex) continue; const ownedAug = Player.queuedAugmentations[i];
const aug = Augmentations[ownedAug.name]; if (ownedAug.name === AugmentationNames.NeuroFluxGovernor && i !== nfgIndex) continue;
let level = null; const aug = Augmentations[ownedAug.name];
if (ownedAug.name === AugmentationNames.NeuroFluxGovernor) { let level = null;
level = ownedAug.level; if (ownedAug.name === AugmentationNames.NeuroFluxGovernor) {
} level = ownedAug.level;
augs.push(
<li key={`${ownedAug.name}${ownedAug.level}`}>
<AugmentationAccordion aug={aug} level={level} />
</li>,
)
} }
return ( augs.push(
<ul className="augmentations-list">{augs}</ul> <li key={`${ownedAug.name}${ownedAug.level}`}>
) <AugmentationAccordion aug={aug} level={level} />
</li>,
);
}
return <ul className="augmentations-list">{augs}</ul>;
} }

View File

@@ -13,88 +13,79 @@ import { StdButton } from "../../ui/React/StdButton";
import { canGetBonus } from "../../ExportBonus"; import { canGetBonus } from "../../ExportBonus";
type IProps = { type IProps = {
exportGameFn: () => void; exportGameFn: () => void;
installAugmentationsFn: () => void; installAugmentationsFn: () => void;
} };
type IState = { type IState = {
rerender: boolean; rerender: boolean;
} };
export class AugmentationsRoot extends React.Component<IProps, IState> { export class AugmentationsRoot extends React.Component<IProps, IState> {
constructor(props: IProps) { constructor(props: IProps) {
super(props); super(props);
this.state = { this.state = {
rerender: false, rerender: false,
}; };
this.export = this.export.bind(this); this.export = this.export.bind(this);
}
export(): void {
this.props.exportGameFn();
this.setState({
rerender: !this.state.rerender,
});
}
render(): React.ReactNode {
function exportBonusStr(): string {
if (canGetBonus()) return "(+1 favor to all factions)";
return "";
} }
export(): void { return (
this.props.exportGameFn(); <div id="augmentations-content">
this.setState({ <h1>Purchased Augmentations</h1>
rerender: !this.state.rerender, <p>
}); Below is a list of all Augmentations you have purchased but not yet installed. Click the button below to
} install them.
</p>
render(): React.ReactNode { <p>WARNING: Installing your Augmentations resets most of your progress, including:</p>
function exportBonusStr(): string { <br />
if(canGetBonus()) return "(+1 favor to all factions)"; <p>- Stats/Skill levels and Experience</p>
return ""; <p>- Money</p>
} <p>- Scripts on every computer but your home computer</p>
<p>- Purchased servers</p>
return ( <p>- Hacknet Nodes</p>
<div id="augmentations-content"> <p>- Faction/Company reputation</p>
<h1>Purchased Augmentations</h1> <p>- Stocks</p>
<p> <br />
Below is a list of all Augmentations you have purchased but not <p>
yet installed. Click the button below to install them. Installing Augmentations lets you start over with the perks and benefits granted by all of the Augmentations
</p> you have ever installed. Also, you will keep any scripts and RAM/Core upgrades on your home computer (but you
<p> will lose all programs besides NUKE.exe)
WARNING: Installing your Augmentations resets most of your progress, </p>
including: <StdButton
</p><br /> onClick={this.props.installAugmentationsFn}
<p>- Stats/Skill levels and Experience</p> text="Install Augmentations"
<p>- Money</p> tooltip="'I never asked for this'"
<p>- Scripts on every computer but your home computer</p> />
<p>- Purchased servers</p> <StdButton
<p>- Hacknet Nodes</p> addClasses="flashing-button"
<p>- Faction/Company reputation</p> onClick={this.export}
<p>- Stocks</p><br /> text={`Backup Save ${exportBonusStr()}`}
<p> tooltip="It's always a good idea to backup/export your save!"
Installing Augmentations lets you start over with the perks and />
benefits granted by all of the Augmentations you have ever <PurchasedAugmentations />
installed. Also, you will keep any scripts and RAM/Core upgrades <h1>Installed Augmentations</h1>
on your home computer (but you will lose all programs besides <p>
NUKE.exe) {`List of all Augmentations ${Player.sourceFiles.length > 0 ? "and Source Files " : ""} ` +
</p> `that have been installed. You have gained the effects of these.`}
</p>
<StdButton <InstalledAugmentationsAndSourceFiles />
onClick={this.props.installAugmentationsFn} <br /> <br />
text="Install Augmentations" <PlayerMultipliers />
tooltip="'I never asked for this'" </div>
/> );
}
<StdButton
addClasses="flashing-button"
onClick={this.export}
text={`Backup Save ${exportBonusStr()}`}
tooltip="It's always a good idea to backup/export your save!"
/>
<PurchasedAugmentations />
<h1>Installed Augmentations</h1>
<p>
{
`List of all Augmentations ${Player.sourceFiles.length > 0 ? "and Source Files " : ""} ` +
`that have been installed. You have gained the effects of these.`
}
</p>
<InstalledAugmentationsAndSourceFiles />
<br /> <br />
<PlayerMultipliers />
</div>
)
}
} }

View File

@@ -10,32 +10,40 @@ import { Exploit, ExploitName } from "../../Exploits/Exploit";
import { Accordion } from "../../ui/React/Accordion"; import { Accordion } from "../../ui/React/Accordion";
export function SourceFileMinus1(): React.ReactElement { export function SourceFileMinus1(): React.ReactElement {
const exploits = Player.exploits; const exploits = Player.exploits;
if(exploits.length === 0) { if (exploits.length === 0) {
return <></> return <></>;
} }
return (<li key={-1}> return (
<Accordion <li key={-1}>
headerContent={ <Accordion
<> headerContent={
Source-File -1: Exploits in the BitNodes <>
<br /> Source-File -1: Exploits in the BitNodes
Level {exploits.length} / ? <br />
</> Level {exploits.length} / ?
} </>
panelContent={ }
<> panelContent={
<p>This Source-File can only be acquired with obscure knowledge of the game, javascript, and the web ecosystem.</p> <>
<p>It increases all of the player's multipliers by 0.1%</p><br /> <p>
This Source-File can only be acquired with obscure knowledge of the game, javascript, and the web
ecosystem.
</p>
<p>It increases all of the player's multipliers by 0.1%</p>
<br />
<p>You have found the following exploits:</p> <p>You have found the following exploits:</p>
<ul> <ul>
{exploits.map((c: Exploit) => <li key={c}>* {ExploitName(c)}</li>)} {exploits.map((c: Exploit) => (
</ul> <li key={c}>* {ExploitName(c)}</li>
</> ))}
} </ul>
/> </>
</li>) }
/>
</li>
);
} }

File diff suppressed because it is too large Load Diff

View File

@@ -4,216 +4,216 @@
* player toward the intended strategy. Unless they really want to play the long, slow game of waiting... * player toward the intended strategy. Unless they really want to play the long, slow game of waiting...
*/ */
interface IBitNodeMultipliers { interface IBitNodeMultipliers {
/** /**
* Influences how quickly the player's agility level (not exp) scales * Influences how quickly the player's agility level (not exp) scales
*/ */
AgilityLevelMultiplier: number; AgilityLevelMultiplier: number;
/** /**
* Influences the base cost to purchase an augmentation. * Influences the base cost to purchase an augmentation.
*/ */
AugmentationMoneyCost: number; AugmentationMoneyCost: number;
/** /**
* Influences the base rep the player must have with a faction to purchase an augmentation. * Influences the base rep the player must have with a faction to purchase an augmentation.
*/ */
AugmentationRepCost: number; AugmentationRepCost: number;
/** /**
* Influences how quickly the player can gain rank within Bladeburner. * Influences how quickly the player can gain rank within Bladeburner.
*/ */
BladeburnerRank: number; BladeburnerRank: number;
/** /**
* Influences the cost of skill levels from Bladeburner. * Influences the cost of skill levels from Bladeburner.
*/ */
BladeburnerSkillCost: number; BladeburnerSkillCost: number;
/** /**
* Influences how quickly the player's charisma level (not exp) scales * Influences how quickly the player's charisma level (not exp) scales
*/ */
CharismaLevelMultiplier: number; CharismaLevelMultiplier: number;
/** /**
* Influences the experience gained for each ability when a player completes a class. * Influences the experience gained for each ability when a player completes a class.
*/ */
ClassGymExpGain: number; ClassGymExpGain: number;
/** /**
* Influences the amount of money gained from completing Coding Contracts * Influences the amount of money gained from completing Coding Contracts
**/ **/
CodingContractMoney: number; CodingContractMoney: number;
/** /**
* Influences the experience gained for each ability when the player completes working their job. * Influences the experience gained for each ability when the player completes working their job.
*/ */
CompanyWorkExpGain: number; CompanyWorkExpGain: number;
/** /**
* Influences how much money the player earns when completing working their job. * Influences how much money the player earns when completing working their job.
*/ */
CompanyWorkMoney: number; CompanyWorkMoney: number;
/** /**
* Influences the valuation of corporations created by the player. * Influences the valuation of corporations created by the player.
*/ */
CorporationValuation: number; CorporationValuation: number;
/** /**
* Influences the base experience gained for each ability when the player commits a crime. * Influences the base experience gained for each ability when the player commits a crime.
*/ */
CrimeExpGain: number; CrimeExpGain: number;
/** /**
* Influences the base money gained when the player commits a crime. * Influences the base money gained when the player commits a crime.
*/ */
CrimeMoney: number; CrimeMoney: number;
/** /**
* Influences how many Augmentations you need in order to get invited to the Daedalus faction * Influences how many Augmentations you need in order to get invited to the Daedalus faction
*/ */
DaedalusAugsRequirement: number; DaedalusAugsRequirement: number;
/** /**
* Influences how quickly the player's defense level (not exp) scales * Influences how quickly the player's defense level (not exp) scales
*/ */
DefenseLevelMultiplier: number; DefenseLevelMultiplier: number;
/** /**
* Influences how quickly the player's dexterity level (not exp) scales * Influences how quickly the player's dexterity level (not exp) scales
*/ */
DexterityLevelMultiplier: number; DexterityLevelMultiplier: number;
/** /**
* Influences how much rep the player gains in each faction simply by being a member. * Influences how much rep the player gains in each faction simply by being a member.
*/ */
FactionPassiveRepGain: number; FactionPassiveRepGain: number;
/** /**
* Influences the experience gained for each ability when the player completes work for a Faction. * Influences the experience gained for each ability when the player completes work for a Faction.
*/ */
FactionWorkExpGain: number; FactionWorkExpGain: number;
/** /**
* Influences how much rep the player gains when performing work for a faction. * Influences how much rep the player gains when performing work for a faction.
*/ */
FactionWorkRepGain: number; FactionWorkRepGain: number;
/** /**
* Influences how much it costs to unlock the stock market's 4S Market Data API * Influences how much it costs to unlock the stock market's 4S Market Data API
*/ */
FourSigmaMarketDataApiCost: number; FourSigmaMarketDataApiCost: number;
/** /**
* Influences how much it costs to unlock the stock market's 4S Market Data (NOT API) * Influences how much it costs to unlock the stock market's 4S Market Data (NOT API)
*/ */
FourSigmaMarketDataCost: number; FourSigmaMarketDataCost: number;
/** /**
* Influences how much negative karma is required to create a gang in this bitnode. * Influences how much negative karma is required to create a gang in this bitnode.
*/ */
GangKarmaRequirement: number; GangKarmaRequirement: number;
/** /**
* Influences the experienced gained when hacking a server. * Influences the experienced gained when hacking a server.
*/ */
HackExpGain: number; HackExpGain: number;
/** /**
* Influences how quickly the player's hacking level (not experience) scales * Influences how quickly the player's hacking level (not experience) scales
*/ */
HackingLevelMultiplier: number; HackingLevelMultiplier: number;
/** /**
* Influences how much money is produced by Hacknet Nodes. * Influences how much money is produced by Hacknet Nodes.
* Influeces the hash rate of Hacknet Servers (unlocked in BitNode-9) * Influeces the hash rate of Hacknet Servers (unlocked in BitNode-9)
*/ */
HacknetNodeMoney: number; HacknetNodeMoney: number;
/** /**
* Influences how much money it costs to upgrade your home computer's RAM * Influences how much money it costs to upgrade your home computer's RAM
*/ */
HomeComputerRamCost: number; HomeComputerRamCost: number;
/** /**
* Influences how much money is gained when the player infiltrates a company. * Influences how much money is gained when the player infiltrates a company.
*/ */
InfiltrationMoney: number; InfiltrationMoney: number;
/** /**
* Influences how much rep the player can gain from factions when selling stolen documents and secrets * Influences how much rep the player can gain from factions when selling stolen documents and secrets
*/ */
InfiltrationRep: number; InfiltrationRep: number;
/** /**
* Influences how much money can be stolen from a server when the player performs a hack against it through * Influences how much money can be stolen from a server when the player performs a hack against it through
* the Terminal. * the Terminal.
*/ */
ManualHackMoney: number; ManualHackMoney: number;
/** /**
* Influence how much it costs to purchase a server * Influence how much it costs to purchase a server
*/ */
PurchasedServerCost: number; PurchasedServerCost: number;
/** /**
* Influences the maximum number of purchased servers you can have * Influences the maximum number of purchased servers you can have
*/ */
PurchasedServerLimit: number; PurchasedServerLimit: number;
/** /**
* Influences the maximum allowed RAM for a purchased server * Influences the maximum allowed RAM for a purchased server
*/ */
PurchasedServerMaxRam: number; PurchasedServerMaxRam: number;
/** /**
* Influences the minimum favor the player must have with a faction before they can donate to gain rep. * Influences the minimum favor the player must have with a faction before they can donate to gain rep.
*/ */
RepToDonateToFaction: number; RepToDonateToFaction: number;
/** /**
* Influences how much money can be stolen from a server when a script performs a hack against it. * Influences how much money can be stolen from a server when a script performs a hack against it.
*/ */
ScriptHackMoney: number; ScriptHackMoney: number;
/** /**
* The amount of money actually gained when script hack a server. This is * The amount of money actually gained when script hack a server. This is
* different than the above because you can reduce the amount of money but * different than the above because you can reduce the amount of money but
* not gain that same amount. * not gain that same amount.
*/ */
ScriptHackMoneyGain: number; ScriptHackMoneyGain: number;
/** /**
* Influences the growth percentage per cycle against a server. * Influences the growth percentage per cycle against a server.
*/ */
ServerGrowthRate: number; ServerGrowthRate: number;
/** /**
* Influences the maxmimum money that a server can grow to. * Influences the maxmimum money that a server can grow to.
*/ */
ServerMaxMoney: number; ServerMaxMoney: number;
/** /**
* Influences the initial money that a server starts with. * Influences the initial money that a server starts with.
*/ */
ServerStartingMoney: number; ServerStartingMoney: number;
/** /**
* Influences the initial security level (hackDifficulty) of a server. * Influences the initial security level (hackDifficulty) of a server.
*/ */
ServerStartingSecurity: number; ServerStartingSecurity: number;
/** /**
* Influences the weaken amount per invocation against a server. * Influences the weaken amount per invocation against a server.
*/ */
ServerWeakenRate: number; ServerWeakenRate: number;
/** /**
* Influences how quickly the player's strength level (not exp) scales * Influences how quickly the player's strength level (not exp) scales
*/ */
StrengthLevelMultiplier: number; StrengthLevelMultiplier: number;
// Index signature // Index signature
[key: string]: number; [key: string]: number;
} }
/** /**
@@ -221,57 +221,57 @@ interface IBitNodeMultipliers {
*/ */
// tslint:disable-next-line:variable-name // tslint:disable-next-line:variable-name
export const BitNodeMultipliers: IBitNodeMultipliers = { export const BitNodeMultipliers: IBitNodeMultipliers = {
HackingLevelMultiplier: 1, HackingLevelMultiplier: 1,
StrengthLevelMultiplier: 1, StrengthLevelMultiplier: 1,
DefenseLevelMultiplier: 1, DefenseLevelMultiplier: 1,
DexterityLevelMultiplier: 1, DexterityLevelMultiplier: 1,
AgilityLevelMultiplier: 1, AgilityLevelMultiplier: 1,
CharismaLevelMultiplier: 1, CharismaLevelMultiplier: 1,
ServerGrowthRate: 1, ServerGrowthRate: 1,
ServerMaxMoney: 1, ServerMaxMoney: 1,
ServerStartingMoney: 1, ServerStartingMoney: 1,
ServerStartingSecurity: 1, ServerStartingSecurity: 1,
ServerWeakenRate: 1, ServerWeakenRate: 1,
HomeComputerRamCost: 1, HomeComputerRamCost: 1,
PurchasedServerCost: 1, PurchasedServerCost: 1,
PurchasedServerLimit: 1, PurchasedServerLimit: 1,
PurchasedServerMaxRam: 1, PurchasedServerMaxRam: 1,
CompanyWorkMoney: 1, CompanyWorkMoney: 1,
CrimeMoney: 1, CrimeMoney: 1,
HacknetNodeMoney: 1, HacknetNodeMoney: 1,
ManualHackMoney: 1, ManualHackMoney: 1,
ScriptHackMoney: 1, ScriptHackMoney: 1,
ScriptHackMoneyGain: 1, ScriptHackMoneyGain: 1,
CodingContractMoney: 1, CodingContractMoney: 1,
ClassGymExpGain: 1, ClassGymExpGain: 1,
CompanyWorkExpGain: 1, CompanyWorkExpGain: 1,
CrimeExpGain: 1, CrimeExpGain: 1,
FactionWorkExpGain: 1, FactionWorkExpGain: 1,
HackExpGain: 1, HackExpGain: 1,
FactionPassiveRepGain: 1, FactionPassiveRepGain: 1,
FactionWorkRepGain: 1, FactionWorkRepGain: 1,
RepToDonateToFaction: 1, RepToDonateToFaction: 1,
AugmentationMoneyCost: 1, AugmentationMoneyCost: 1,
AugmentationRepCost: 1, AugmentationRepCost: 1,
InfiltrationMoney: 1, InfiltrationMoney: 1,
InfiltrationRep: 1, InfiltrationRep: 1,
FourSigmaMarketDataCost: 1, FourSigmaMarketDataCost: 1,
FourSigmaMarketDataApiCost: 1, FourSigmaMarketDataApiCost: 1,
CorporationValuation: 1, CorporationValuation: 1,
BladeburnerRank: 1, BladeburnerRank: 1,
BladeburnerSkillCost: 1, BladeburnerSkillCost: 1,
DaedalusAugsRequirement: 1, DaedalusAugsRequirement: 1,
GangKarmaRequirement: 1, GangKarmaRequirement: 1,
}; };

Some files were not shown because too many files have changed in this diff Show More