From 1a8b9a96ec72ca63fb96188efafbd7e093a66e5f Mon Sep 17 00:00:00 2001 From: hydroflame <79246165+hydroflame@users.noreply.github.com> Date: Wed, 12 Jul 2023 17:10:52 -0400 Subject: [PATCH] Documentation added ingame (#667) --- doc/Makefile | 19 - doc/make.bat | 35 - doc/source/.tags | 43 - doc/source/404.rst | 6 - doc/source/advancedgameplay.rst | 16 - doc/source/advancedgameplay/batch.png | Bin 51633 -> 0 bytes doc/source/advancedgameplay/bitnodes.rst | 60 - doc/source/advancedgameplay/intelligence.rst | 19 - doc/source/advancedgameplay/sleeves.rst | 94 - doc/source/advancedgameplay/sourcefiles.rst | 62 - doc/source/basicgameplay.rst | 22 - doc/source/basicgameplay/codingcontracts.rst | 417 -- doc/source/basicgameplay/companies.rst | 17 - doc/source/basicgameplay/crimes.rst | 58 - doc/source/basicgameplay/factions.rst | 255 -- doc/source/basicgameplay/hacking.rst | 120 - doc/source/basicgameplay/infiltration.rst | 70 - doc/source/basicgameplay/servers.rst | 79 - doc/source/basicgameplay/stats.rst | 116 - doc/source/basicgameplay/terminal.rst | 652 --- doc/source/basicgameplay/world.rst | 16 - doc/source/changelog.rst | 3897 ----------------- doc/source/conf-guzzle.py | 25 - doc/source/conf.py | 192 - doc/source/guidesandtips.rst | 12 - ...tingstartedguideforbeginnerprogrammers.rst | 902 ---- .../guidesandtips/recommendedbitnodeorder.rst | 593 --- doc/source/index.rst | 42 - doc/source/netscript.rst | 26 - .../advancedfunctions/autocomplete.rst | 39 - .../advancedfunctions/inject_html.rst | 35 - doc/source/netscript/autocomplete.png | Bin 61532 -> 0 bytes .../netscript/basicfunctions/brutessh.rst | 17 - .../netscript/basicfunctions/clearLog.rst | 15 - .../netscript/basicfunctions/closeTail.rst | 19 - .../netscript/basicfunctions/deleteServer.rst | 21 - .../netscript/basicfunctions/disableLog.rst | 18 - .../netscript/basicfunctions/enableLog.rst | 21 - doc/source/netscript/basicfunctions/exec.rst | 40 - .../netscript/basicfunctions/fileExists.rst | 29 - .../netscript/basicfunctions/formatNumber.rst | 29 - .../basicfunctions/formatPercent.rst | 23 - .../netscript/basicfunctions/formatRam.rst | 26 - .../netscript/basicfunctions/ftpcrack.rst | 17 - .../basicfunctions/getHackingLevel.rst | 13 - .../basicfunctions/getHackingMultipliers.rst | 26 - .../basicfunctions/getHacknetMultipliers.rst | 27 - .../netscript/basicfunctions/getHostname.rst | 14 - .../basicfunctions/getPurchasedServerCost.rst | 17 - .../getPurchasedServerLimit.rst | 13 - .../getPurchasedServerMaxRam.rst | 13 - .../getPurchasedServerUpgradeCost.rst | 18 - .../basicfunctions/getPurchasedServers.rst | 13 - .../netscript/basicfunctions/getScriptRam.rst | 16 - .../basicfunctions/getServerMaxMoney.rst | 14 - .../basicfunctions/getServerMaxRam.rst | 15 - .../getServerMinSecurityLevel.rst | 14 - .../getServerMoneyAvailable.rst | 19 - .../getServerNumPortsRequired.rst | 15 - .../getServerRequiredHackingLevel.rst | 14 - .../basicfunctions/getServerSecurityLevel.rst | 14 - .../basicfunctions/getServerUsedRam.rst | 15 - .../basicfunctions/getSharePower.rst | 16 - doc/source/netscript/basicfunctions/grow.rst | 38 - doc/source/netscript/basicfunctions/hack.rst | 38 - .../basicfunctions/hasRootAccess.rst | 22 - .../netscript/basicfunctions/httpworm.rst | 16 - .../netscript/basicfunctions/isLogEnabled.rst | 14 - .../netscript/basicfunctions/isRunning.rst | 55 - doc/source/netscript/basicfunctions/kill.rst | 58 - .../netscript/basicfunctions/killall.rst | 24 - doc/source/netscript/basicfunctions/ls.rst | 17 - .../netscript/basicfunctions/moveTail.rst | 28 - doc/source/netscript/basicfunctions/mv.rst | 22 - .../netscript/basicfunctions/nFormat.rst | 24 - doc/source/netscript/basicfunctions/nuke.rst | 18 - doc/source/netscript/basicfunctions/print.rst | 18 - doc/source/netscript/basicfunctions/ps.rst | 31 - .../basicfunctions/purchaseServer.rst | 34 - .../netscript/basicfunctions/relaysmtp.rst | 16 - .../basicfunctions/renamePurchasedServer.rst | 17 - .../netscript/basicfunctions/resizeTail.rst | 28 - doc/source/netscript/basicfunctions/rm.rst | 19 - doc/source/netscript/basicfunctions/run.rst | 43 - doc/source/netscript/basicfunctions/scan.rst | 15 - doc/source/netscript/basicfunctions/scp.rst | 33 - .../netscript/basicfunctions/scriptKill.rst | 18 - .../basicfunctions/scriptRunning.rst | 30 - .../netscript/basicfunctions/serverExists.rst | 14 - doc/source/netscript/basicfunctions/share.rst | 14 - doc/source/netscript/basicfunctions/sleep.rst | 15 - doc/source/netscript/basicfunctions/spawn.rst | 25 - .../netscript/basicfunctions/sqlinject.rst | 16 - .../netscript/basicfunctions/tFormat.rst | 19 - doc/source/netscript/basicfunctions/tail.rst | 34 - .../netscript/basicfunctions/tprint.rst | 16 - .../basicfunctions/upgradePurchasedServer.rst | 27 - .../netscript/basicfunctions/weaken.rst | 31 - .../hacknetnodeapi/getCoreUpgradeCost.rst | 12 - .../hacknetnodeapi/getLevelUpgradeCost.rst | 12 - .../netscript/hacknetnodeapi/getNodeStats.rst | 28 - .../hacknetnodeapi/getPurchaseNodeCost.rst | 7 - .../hacknetnodeapi/getRamUpgradeCost.rst | 12 - .../netscript/hacknetnodeapi/numNodes.rst | 7 - .../netscript/hacknetnodeapi/purchaseNode.rst | 11 - .../netscript/hacknetnodeapi/upgradeCore.rst | 11 - .../netscript/hacknetnodeapi/upgradeLevel.rst | 11 - .../netscript/hacknetnodeapi/upgradeRam.rst | 13 - doc/source/netscript/netscript1.rst | 36 - .../netscript/netscriptadvancedfunctions.rst | 12 - doc/source/netscript/netscriptfunctions.rst | 78 - .../netscript/netscripthacknetnodeapi.rst | 135 - doc/source/netscript/netscriptjs.rst | 154 - .../netscript/netscriptlearntoprogram.rst | 69 - doc/source/netscript/netscriptmisc.rst | 238 - .../netscript/netscriptscriptarguments.rst | 58 - doc/source/netscript/netscriptstanekapi.rst | 20 - doc/source/shortcuts.rst | 89 - doc/source/toolsandresources.rst | 23 - doc/source/v1.0.0_migration.rst | 37 - doc/source/v2.0.0_migration.rst | 109 - doc/source/ystatic/agogo.css | 551 --- doc/source/ystatic/maxwidthoverride.css | 3 - jest.config.js | 1 + package-lock.json | 2392 ++++++++++ package.json | 7 +- src/Documentation/ui/DocumentationRoot.tsx | 52 + src/Documentation/ui/doc/advanced/bitnodes.md | 44 + .../ui/doc/advanced/bladeburners.md | 3 + .../ui/doc/advanced/corporations.md | 0 src/Documentation/ui/doc/advanced/gang.md | 5 + .../Documentation/ui/doc/advanced/grafting.md | 12 +- .../ui/doc/advanced/hacknetservers.md | 5 + .../ui/doc/advanced/intelligence.md | 17 + src/Documentation/ui/doc/advanced/sleeves.md | 90 + .../ui/doc/advanced/sourcefiles.md | 9 + src/Documentation/ui/doc/advanced/stanek.md | 7 + .../ui/doc/basic/augmentations.md | 76 +- .../ui/doc/basic/codingcontracts.md | 86 + src/Documentation/ui/doc/basic/companies.md | 15 + src/Documentation/ui/doc/basic/crimes.md | 27 + src/Documentation/ui/doc/basic/factions.md | 26 + src/Documentation/ui/doc/basic/hacking.md | 102 + .../ui/doc/basic/hacknet_nodes.md | 7 + .../ui/doc/basic/infiltration.md | 68 + src/Documentation/ui/doc/basic/ram.md | 7 + src/Documentation/ui/doc/basic/reputation.md | 9 + .../Documentation/ui/doc/basic/scripts.md | 113 +- src/Documentation/ui/doc/basic/servers.md | 77 + src/Documentation/ui/doc/basic/stats.md | 114 + .../Documentation/ui/doc/basic/stockmarket.md | 150 +- src/Documentation/ui/doc/basic/terminal.md | 130 + src/Documentation/ui/doc/basic/world.md | 14 + src/Documentation/ui/doc/changelog.md | 3837 ++++++++++++++++ .../ui/doc/help/bitnode_order.md | 116 + .../ui/doc/help/getting_started.md | 843 ++++ .../ui/doc/help/tools_and_resources.md | 22 + src/Documentation/ui/doc/index.md | 48 + src/Documentation/ui/doc/migrations/v1.md | 36 + src/Documentation/ui/doc/migrations/v2.md | 97 + .../ui/doc/programming/game_frozen.md | 45 +- .../ui/doc/programming/hackingalgorithms.md | 106 +- src/Documentation/ui/doc/programming/learn.md | 36 + .../ui/doc/programming/remote_api.md | 66 +- src/Documentation/ui/pages.ts | 80 + src/Documentation/ui/root.ts | 10 + src/GameOptions/ui/GameOptionsRoot.tsx | 3 +- src/GameOptions/ui/GameOptionsSidebar.tsx | 21 +- src/InteractiveTutorial.ts | 4 +- src/Sidebar/ui/SidebarRoot.tsx | 6 +- src/Terminal/Terminal.ts | 92 +- src/Terminal/ui/TerminalRoot.tsx | 4 +- src/Tutorial/ui/TutorialRoot.tsx | 133 - src/ui/GameRoot.tsx | 88 +- .../InteractiveTutorialRoot.tsx | 30 +- src/ui/MD/MD.tsx | 37 + src/ui/MD/a.tsx | 39 + src/ui/MD/code.tsx | 56 + src/ui/MD/components.tsx | 115 + src/ui/MD/md_samples.ts | 59 + src/ui/React/Documentation.tsx | 71 + src/ui/Router.ts | 2 +- tools/bundle-doc/index.js | 35 + 183 files changed, 9211 insertions(+), 11734 deletions(-) delete mode 100644 doc/Makefile delete mode 100644 doc/make.bat delete mode 100644 doc/source/.tags delete mode 100644 doc/source/404.rst delete mode 100644 doc/source/advancedgameplay.rst delete mode 100644 doc/source/advancedgameplay/batch.png delete mode 100644 doc/source/advancedgameplay/bitnodes.rst delete mode 100644 doc/source/advancedgameplay/intelligence.rst delete mode 100644 doc/source/advancedgameplay/sleeves.rst delete mode 100644 doc/source/advancedgameplay/sourcefiles.rst delete mode 100644 doc/source/basicgameplay.rst delete mode 100644 doc/source/basicgameplay/codingcontracts.rst delete mode 100644 doc/source/basicgameplay/companies.rst delete mode 100644 doc/source/basicgameplay/crimes.rst delete mode 100644 doc/source/basicgameplay/factions.rst delete mode 100644 doc/source/basicgameplay/hacking.rst delete mode 100644 doc/source/basicgameplay/infiltration.rst delete mode 100644 doc/source/basicgameplay/servers.rst delete mode 100644 doc/source/basicgameplay/stats.rst delete mode 100644 doc/source/basicgameplay/terminal.rst delete mode 100644 doc/source/basicgameplay/world.rst delete mode 100644 doc/source/changelog.rst delete mode 100644 doc/source/conf-guzzle.py delete mode 100644 doc/source/conf.py delete mode 100644 doc/source/guidesandtips.rst delete mode 100644 doc/source/guidesandtips/gettingstartedguideforbeginnerprogrammers.rst delete mode 100644 doc/source/guidesandtips/recommendedbitnodeorder.rst delete mode 100644 doc/source/index.rst delete mode 100644 doc/source/netscript.rst delete mode 100644 doc/source/netscript/advancedfunctions/autocomplete.rst delete mode 100644 doc/source/netscript/advancedfunctions/inject_html.rst delete mode 100644 doc/source/netscript/autocomplete.png delete mode 100644 doc/source/netscript/basicfunctions/brutessh.rst delete mode 100644 doc/source/netscript/basicfunctions/clearLog.rst delete mode 100644 doc/source/netscript/basicfunctions/closeTail.rst delete mode 100644 doc/source/netscript/basicfunctions/deleteServer.rst delete mode 100644 doc/source/netscript/basicfunctions/disableLog.rst delete mode 100644 doc/source/netscript/basicfunctions/enableLog.rst delete mode 100644 doc/source/netscript/basicfunctions/exec.rst delete mode 100644 doc/source/netscript/basicfunctions/fileExists.rst delete mode 100644 doc/source/netscript/basicfunctions/formatNumber.rst delete mode 100644 doc/source/netscript/basicfunctions/formatPercent.rst delete mode 100644 doc/source/netscript/basicfunctions/formatRam.rst delete mode 100644 doc/source/netscript/basicfunctions/ftpcrack.rst delete mode 100644 doc/source/netscript/basicfunctions/getHackingLevel.rst delete mode 100644 doc/source/netscript/basicfunctions/getHackingMultipliers.rst delete mode 100644 doc/source/netscript/basicfunctions/getHacknetMultipliers.rst delete mode 100644 doc/source/netscript/basicfunctions/getHostname.rst delete mode 100644 doc/source/netscript/basicfunctions/getPurchasedServerCost.rst delete mode 100644 doc/source/netscript/basicfunctions/getPurchasedServerLimit.rst delete mode 100644 doc/source/netscript/basicfunctions/getPurchasedServerMaxRam.rst delete mode 100644 doc/source/netscript/basicfunctions/getPurchasedServerUpgradeCost.rst delete mode 100644 doc/source/netscript/basicfunctions/getPurchasedServers.rst delete mode 100644 doc/source/netscript/basicfunctions/getScriptRam.rst delete mode 100644 doc/source/netscript/basicfunctions/getServerMaxMoney.rst delete mode 100644 doc/source/netscript/basicfunctions/getServerMaxRam.rst delete mode 100644 doc/source/netscript/basicfunctions/getServerMinSecurityLevel.rst delete mode 100644 doc/source/netscript/basicfunctions/getServerMoneyAvailable.rst delete mode 100644 doc/source/netscript/basicfunctions/getServerNumPortsRequired.rst delete mode 100644 doc/source/netscript/basicfunctions/getServerRequiredHackingLevel.rst delete mode 100644 doc/source/netscript/basicfunctions/getServerSecurityLevel.rst delete mode 100644 doc/source/netscript/basicfunctions/getServerUsedRam.rst delete mode 100644 doc/source/netscript/basicfunctions/getSharePower.rst delete mode 100644 doc/source/netscript/basicfunctions/grow.rst delete mode 100644 doc/source/netscript/basicfunctions/hack.rst delete mode 100644 doc/source/netscript/basicfunctions/hasRootAccess.rst delete mode 100644 doc/source/netscript/basicfunctions/httpworm.rst delete mode 100644 doc/source/netscript/basicfunctions/isLogEnabled.rst delete mode 100644 doc/source/netscript/basicfunctions/isRunning.rst delete mode 100644 doc/source/netscript/basicfunctions/kill.rst delete mode 100644 doc/source/netscript/basicfunctions/killall.rst delete mode 100644 doc/source/netscript/basicfunctions/ls.rst delete mode 100644 doc/source/netscript/basicfunctions/moveTail.rst delete mode 100644 doc/source/netscript/basicfunctions/mv.rst delete mode 100644 doc/source/netscript/basicfunctions/nFormat.rst delete mode 100644 doc/source/netscript/basicfunctions/nuke.rst delete mode 100644 doc/source/netscript/basicfunctions/print.rst delete mode 100644 doc/source/netscript/basicfunctions/ps.rst delete mode 100644 doc/source/netscript/basicfunctions/purchaseServer.rst delete mode 100644 doc/source/netscript/basicfunctions/relaysmtp.rst delete mode 100644 doc/source/netscript/basicfunctions/renamePurchasedServer.rst delete mode 100644 doc/source/netscript/basicfunctions/resizeTail.rst delete mode 100644 doc/source/netscript/basicfunctions/rm.rst delete mode 100644 doc/source/netscript/basicfunctions/run.rst delete mode 100644 doc/source/netscript/basicfunctions/scan.rst delete mode 100644 doc/source/netscript/basicfunctions/scp.rst delete mode 100644 doc/source/netscript/basicfunctions/scriptKill.rst delete mode 100644 doc/source/netscript/basicfunctions/scriptRunning.rst delete mode 100644 doc/source/netscript/basicfunctions/serverExists.rst delete mode 100644 doc/source/netscript/basicfunctions/share.rst delete mode 100644 doc/source/netscript/basicfunctions/sleep.rst delete mode 100644 doc/source/netscript/basicfunctions/spawn.rst delete mode 100644 doc/source/netscript/basicfunctions/sqlinject.rst delete mode 100644 doc/source/netscript/basicfunctions/tFormat.rst delete mode 100644 doc/source/netscript/basicfunctions/tail.rst delete mode 100644 doc/source/netscript/basicfunctions/tprint.rst delete mode 100644 doc/source/netscript/basicfunctions/upgradePurchasedServer.rst delete mode 100644 doc/source/netscript/basicfunctions/weaken.rst delete mode 100644 doc/source/netscript/hacknetnodeapi/getCoreUpgradeCost.rst delete mode 100644 doc/source/netscript/hacknetnodeapi/getLevelUpgradeCost.rst delete mode 100644 doc/source/netscript/hacknetnodeapi/getNodeStats.rst delete mode 100644 doc/source/netscript/hacknetnodeapi/getPurchaseNodeCost.rst delete mode 100644 doc/source/netscript/hacknetnodeapi/getRamUpgradeCost.rst delete mode 100644 doc/source/netscript/hacknetnodeapi/numNodes.rst delete mode 100644 doc/source/netscript/hacknetnodeapi/purchaseNode.rst delete mode 100644 doc/source/netscript/hacknetnodeapi/upgradeCore.rst delete mode 100644 doc/source/netscript/hacknetnodeapi/upgradeLevel.rst delete mode 100644 doc/source/netscript/hacknetnodeapi/upgradeRam.rst delete mode 100644 doc/source/netscript/netscript1.rst delete mode 100644 doc/source/netscript/netscriptadvancedfunctions.rst delete mode 100644 doc/source/netscript/netscriptfunctions.rst delete mode 100644 doc/source/netscript/netscripthacknetnodeapi.rst delete mode 100644 doc/source/netscript/netscriptjs.rst delete mode 100644 doc/source/netscript/netscriptlearntoprogram.rst delete mode 100644 doc/source/netscript/netscriptmisc.rst delete mode 100644 doc/source/netscript/netscriptscriptarguments.rst delete mode 100644 doc/source/netscript/netscriptstanekapi.rst delete mode 100644 doc/source/shortcuts.rst delete mode 100644 doc/source/toolsandresources.rst delete mode 100644 doc/source/v1.0.0_migration.rst delete mode 100644 doc/source/v2.0.0_migration.rst delete mode 100644 doc/source/ystatic/agogo.css delete mode 100644 doc/source/ystatic/maxwidthoverride.css create mode 100644 src/Documentation/ui/DocumentationRoot.tsx create mode 100644 src/Documentation/ui/doc/advanced/bitnodes.md create mode 100644 src/Documentation/ui/doc/advanced/bladeburners.md create mode 100644 src/Documentation/ui/doc/advanced/corporations.md create mode 100644 src/Documentation/ui/doc/advanced/gang.md rename doc/source/advancedgameplay/grafting.rst => src/Documentation/ui/doc/advanced/grafting.md (50%) create mode 100644 src/Documentation/ui/doc/advanced/hacknetservers.md create mode 100644 src/Documentation/ui/doc/advanced/intelligence.md create mode 100644 src/Documentation/ui/doc/advanced/sleeves.md create mode 100644 src/Documentation/ui/doc/advanced/sourcefiles.md create mode 100644 src/Documentation/ui/doc/advanced/stanek.md rename doc/source/basicgameplay/augmentations.rst => src/Documentation/ui/doc/basic/augmentations.md (54%) create mode 100644 src/Documentation/ui/doc/basic/codingcontracts.md create mode 100644 src/Documentation/ui/doc/basic/companies.md create mode 100644 src/Documentation/ui/doc/basic/crimes.md create mode 100644 src/Documentation/ui/doc/basic/factions.md create mode 100644 src/Documentation/ui/doc/basic/hacking.md create mode 100644 src/Documentation/ui/doc/basic/hacknet_nodes.md create mode 100644 src/Documentation/ui/doc/basic/infiltration.md create mode 100644 src/Documentation/ui/doc/basic/ram.md create mode 100644 src/Documentation/ui/doc/basic/reputation.md rename doc/source/basicgameplay/scripts.rst => src/Documentation/ui/doc/basic/scripts.md (55%) create mode 100644 src/Documentation/ui/doc/basic/servers.md create mode 100644 src/Documentation/ui/doc/basic/stats.md rename doc/source/basicgameplay/stockmarket.rst => src/Documentation/ui/doc/basic/stockmarket.md (58%) create mode 100644 src/Documentation/ui/doc/basic/terminal.md create mode 100644 src/Documentation/ui/doc/basic/world.md create mode 100644 src/Documentation/ui/doc/changelog.md create mode 100644 src/Documentation/ui/doc/help/bitnode_order.md create mode 100644 src/Documentation/ui/doc/help/getting_started.md create mode 100644 src/Documentation/ui/doc/help/tools_and_resources.md create mode 100644 src/Documentation/ui/doc/index.md create mode 100644 src/Documentation/ui/doc/migrations/v1.md create mode 100644 src/Documentation/ui/doc/migrations/v2.md rename doc/source/gamefrozen.rst => src/Documentation/ui/doc/programming/game_frozen.md (59%) rename doc/source/advancedgameplay/hackingalgorithms.rst => src/Documentation/ui/doc/programming/hackingalgorithms.md (65%) create mode 100644 src/Documentation/ui/doc/programming/learn.md rename doc/source/remoteapi.rst => src/Documentation/ui/doc/programming/remote_api.md (73%) create mode 100644 src/Documentation/ui/pages.ts create mode 100644 src/Documentation/ui/root.ts delete mode 100644 src/Tutorial/ui/TutorialRoot.tsx create mode 100644 src/ui/MD/MD.tsx create mode 100644 src/ui/MD/a.tsx create mode 100644 src/ui/MD/code.tsx create mode 100644 src/ui/MD/components.tsx create mode 100644 src/ui/MD/md_samples.ts create mode 100644 src/ui/React/Documentation.tsx create mode 100644 tools/bundle-doc/index.js diff --git a/doc/Makefile b/doc/Makefile deleted file mode 100644 index 9c0a52684..000000000 --- a/doc/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = python2.7 -msphinx -SOURCEDIR = source -BUILDDIR = build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/doc/make.bat b/doc/make.bat deleted file mode 100644 index 23238471a..000000000 --- a/doc/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=python -msphinx -) -set SOURCEDIR=source -set BUILDDIR=build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The Sphinx module was not found. Make sure you have Sphinx installed, - echo.then set the SPHINXBUILD environment variable to point to the full - echo.path of the 'sphinx-build' executable. Alternatively you may add the - echo.Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% - -:end -popd diff --git a/doc/source/.tags b/doc/source/.tags deleted file mode 100644 index 63ea2517f..000000000 --- a/doc/source/.tags +++ /dev/null @@ -1,43 +0,0 @@ -!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ -!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ -!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/ -!_TAG_PROGRAM_NAME Exuberant Ctags // -!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ -!_TAG_PROGRAM_VERSION 5.8 // -author .\conf.py /^author = 'Bitburner'$/;" v -copyright .\conf-guzzle.py /^copyright = u'2017, Daniel Xie'$/;" v -copyright .\conf.py /^copyright = '2017, Bitburner'$/;" v -exclude_patterns .\conf-guzzle.py /^exclude_patterns = ['_build']$/;" v -exclude_patterns .\conf.py /^exclude_patterns = []$/;" v -extensions .\conf-guzzle.py /^extensions = []$/;" v -extensions .\conf.py /^extensions = ['sphinx.ext.autodoc',$/;" v -guzzle_sphinx_theme .\conf-guzzle.py /^import guzzle_sphinx_theme$/;" i -html_show_sourcelink .\conf-guzzle.py /^html_show_sourcelink = False$/;" v -html_static_path .\conf.py /^html_static_path = ['ystatic']$/;" v -html_theme .\conf-guzzle.py /^html_theme = 'guzzle_sphinx_theme'$/;" v -html_theme .\conf.py /^html_theme = 'agogo'$/;" v -html_theme_options .\conf-guzzle.py /^html_theme_options = {$/;" v -html_theme_path .\conf-guzzle.py /^html_theme_path = guzzle_sphinx_theme.html_theme_path()$/;" v -htmlhelp_basename .\conf.py /^htmlhelp_basename = 'Bitburnerdoc'$/;" v -intersphinx_mapping .\conf.py /^intersphinx_mapping = {'https:\/\/docs.python.org\/': None}$/;" v -language .\conf.py /^language = 'English'$/;" v -latex_documents .\conf.py /^latex_documents = [$/;" v -latex_elements .\conf.py /^latex_elements = {$/;" v -man_pages .\conf.py /^man_pages = [$/;" v -master_doc .\conf-guzzle.py /^master_doc = 'index'$/;" v -master_doc .\conf.py /^master_doc = 'index'$/;" v -os .\conf-guzzle.py /^import sys, os, subprocess$/;" i -project .\conf-guzzle.py /^project = u'Bitburner'$/;" v -project .\conf.py /^project = 'Bitburner'$/;" v -pygments_style .\conf.py /^pygments_style = 'sphinx'$/;" v -release .\conf.py /^release = '1.0'$/;" v -source_suffix .\conf-guzzle.py /^source_suffix = '.rst'$/;" v -source_suffix .\conf.py /^source_suffix = '.rst'$/;" v -subprocess .\conf-guzzle.py /^import sys, os, subprocess$/;" i -sys .\conf-guzzle.py /^import sys, os, subprocess$/;" i -templates_path .\conf-guzzle.py /^templates_path = ['_templates']$/;" v -templates_path .\conf.py /^templates_path = ['ytemplates']$/;" v -texinfo_documents .\conf.py /^texinfo_documents = [$/;" v -todo_include_todos .\conf.py /^todo_include_todos = True$/;" v -version .\conf-guzzle.py /^version = '1.0.0'$/;" v -version .\conf.py /^version = '1.0'$/;" v diff --git a/doc/source/404.rst b/doc/source/404.rst deleted file mode 100644 index 3ad775052..000000000 --- a/doc/source/404.rst +++ /dev/null @@ -1,6 +0,0 @@ -Hi there, hello -=============== - -It looks like you found a page that doesn't exist! - -If you're looking for documentation of the Netscript API, it moved `here `_. \ No newline at end of file diff --git a/doc/source/advancedgameplay.rst b/doc/source/advancedgameplay.rst deleted file mode 100644 index 3f943156a..000000000 --- a/doc/source/advancedgameplay.rst +++ /dev/null @@ -1,16 +0,0 @@ -Advanced Gameplay -================= -This section documents Bitburner gameplay elements that are **not** immediately -available and/or accessible to the player. These gameplay mechanics -must be unlocked. - -.. toctree:: - :maxdepth: 5 - :caption: Elements: - - BitNodes - Source-Files - Intelligence - Sleeves - Grafting - Hacking algorithms diff --git a/doc/source/advancedgameplay/batch.png b/doc/source/advancedgameplay/batch.png deleted file mode 100644 index 837a62b2fab112422294f0a4ec58fc8ce343ee41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51633 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 z 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 diff --git a/doc/source/advancedgameplay/bitnodes.rst b/doc/source/advancedgameplay/bitnodes.rst deleted file mode 100644 index 6709235a5..000000000 --- a/doc/source/advancedgameplay/bitnodes.rst +++ /dev/null @@ -1,60 +0,0 @@ -.. _gameplay_bitnodes: - -.. warning:: This page contains spoilers regarding the game's story/plot-line. - -BitNodes -======== -A BitNode is an important part of the game's storyline. In the game, you discover -what BitNodes are by following the trail of clues left by the mysterious jump3r -(essentially a minimal questline). - -What is a BitNode -^^^^^^^^^^^^^^^^^ -A BitNode is the complex simulated reality in which you reside. By following the messages -from jump3r, you discover that humanity was enslaved by an advanced alien race, called -the Enders, using virtual simulations that trapped the minds of humans. - -However, the Enders didn't just create a single virtual reality to enslave humans, but many -different simulations. In other words, there are many different BitNodes that exist. -These BitNode are very different from each other. - -jump3r tells you that the only hope for humanity is to destroy all of these BitNodes. -Therefore, the end goal for the player is to enter and then destroy each BitNode at least once. - -Destroying a BitNode resets most of the player's progress but grants the player a -powerful second-tier persistent upgrade called a :ref:`Source-File `. -Different BitNodes grant different Source-Files. - -Each BitNode has unique characteristics that are related to varying backstories. For example, -in one BitNode the world is in the middle of a financial catastrophe with a collapsing -market. In this BitNode, most forms of income such as working at a company or Hacknet -Nodes are significantly less profitable. Servers have less money on them and lowered -growth rates, but it is easier to lower their security level using the weaken() Netscript function. - -Furthermore, some BitNodes introduce new content and mechanics. For example there is one -BitNode that grants access to the `Singularity API `_. -There is another BitNode in which you can manage a gang to earn money and reputation. - -.. _gameplay_bitnodes_howtodestroy: - -How to destroy a BitNode -^^^^^^^^^^^^^^^^^^^^^^^^ -Initially, the only way to destroy a BitNode is to join the Daedalus :ref:`Daedalus `. -From Daedalus, the player can obtain an Augmentation called 'The Red Pill', which doesn't cost any money -but does require a good amount of faction reputation. - -After installing 'The Red Pill', the player must search for and then manually hack a -server called 'w0r1d_d43m0n'. This server requires a hacking level of 3000 in order -to successfully hack it. This will destroy the player's current BitNode. - -There is a second method of destroying a BitNode, but it must be unlocked by first -destroying BitNode-6 or BitNode-7 (Bladeburners). - -.. todo:: Link to Bladeburner documentation page here - -When the player destroys a BitNode, most of his/her progress will be reset. This includes things -such as Augmentations and RAM upgrades on the home computer. The only things that will persist -through destroying BitNodes is: - -* Source-Files -* Scripts on the home computer diff --git a/doc/source/advancedgameplay/intelligence.rst b/doc/source/advancedgameplay/intelligence.rst deleted file mode 100644 index 17e1dab86..000000000 --- a/doc/source/advancedgameplay/intelligence.rst +++ /dev/null @@ -1,19 +0,0 @@ -.. _gameplay_intelligence: - -Intelligence -============ -Intelligence is a :ref:`stat ` that is unlocked by having -:ref:`Source-File 5 ` (i.e. Destroying BitNode-5). - -Intelligence is unique because it is permanent and persistent. It never gets reset -back to 1. However, gaining Intelligence experience is extremely slow. It is a stat -that gradually builds up as you continue to play the game. - -Intelligence will boost your production for many actions in the game, including: - -* Hacking -* Infiltration -* Crime success rate -* Bladeburner -* Reputation gain for companies & factions -* Augmentation grafting speed diff --git a/doc/source/advancedgameplay/sleeves.rst b/doc/source/advancedgameplay/sleeves.rst deleted file mode 100644 index 6e16cebc3..000000000 --- a/doc/source/advancedgameplay/sleeves.rst +++ /dev/null @@ -1,94 +0,0 @@ -.. _gameplay_sleeves: - -Sleeves -======= -When VitaLife unveiled their Persona Core technology that allowed people to digitize -and transfer their consciousness into other vessels, human bodies became nothing more -than 'sleeves' for the human consciousness. This technology thus became known as -"Sleeve technology". - -Sleeve technology unlocks two different gameplay features: - -* Duplicate Sleeves -* Grafting - -Sleeve technology is unlocked in :ref:`BitNode-10 `. - -.. _gameplay_duplicatesleeves: - -Duplicate Sleeves -^^^^^^^^^^^^^^^^^ -Duplicate Sleeves are MK-V Synthoids (synthetic androids) into which your consciousness -has been copied. In other words, these Synthoids contain a perfect duplicate of your mind. - -Duplicate Sleeves are essentially clones which you can use to perform work-type actions, -such as working for a company/faction or committing a crime. When sleeves perform these tasks, -they will earn money, experience, and reputation. - -Sleeves are their own individuals, which means they each have their own experience and stats. - -When a sleeve earns experience, it earns experience for itself, the player's -original consciousness, as well as all of the player's other sleeves. - -Duplicate Sleeves are **not** reset when installing Augmentations, but they are reset -when switching BitNodes. - -Obtaining Duplicate Sleeves -~~~~~~~~~~~~~~~~~~~~~~~~~~~ -There are two methods of obtaining Duplicate Sleeves: - -1. Destroy BitNode-10. Each completion gives you one additional Duplicate Sleeve. -2. Purchase Duplicate Sleeves from :ref:`the faction The Covenant `. - This is only available in BitNode-10. Sleeves purchased this way are **permanent** (they persist - through BitNodes). You can purchase up to 5 Duplicate Sleeves from The Covenant. - -Synchronization -~~~~~~~~~~~~~~~ -Synchronization is a measure of how aligned your consciousness is with that of your -Duplicate Sleeves. It is a numerical value between 1 and 100, and it affects how much experience -is earned when the sleeve is performing a task. - -Synchronization can be increased by assigning sleeves to the 'Synchronize' task. - -Sleeve Shock -~~~~~~~~~~~~ -Sleeve shock is a measure of how much trauma the sleeve has due to being placed in a new -body. It is a numerical value between 0 and 99, where 99 indicates full shock and 0 indicates -no shock. Shock affects the amount of experience earned by the sleeve. - -Sleeve shock slowly decreases over time. You can further increase the rate at which -it decreases by assigning sleeves to the 'Shock Recovery' task. - -Let X be the sleeve's shock and Y be the sleeve's synchronization. When the sleeve earns experience by performing -a task, the sleeve gains X% of the amount of experience normally earned by the task. player’s original host consciousness and all of the player's other sleeves -earn Y% of the experience that the sleeve gained, or X*Y % of the normal experience amount. - -Augmentations -~~~~~~~~~~~~~ -You can purchase :ref:`Augmentations ` for your Duplicate -Sleeves. In order to do this, the sleeve's shock must be at 0. Any Augmentation -that is currently available to you through a faction is also available for your -Duplicate Sleeves. There are a few Augmentations, such as NeuroFlux Governor and -Bladeburner-specific ones, that cannot be purchased for a Duplicate Sleeve. - -When you purchase an Augmentation for a Duplicate Sleeve, it is instantly installed. -When this happens, the sleeve's stats are instantly reset back to 0, similar to -when you normally install Augmentations. - -The cost of purchasing an Augmentation for a Duplicate Sleeve is **not** affected -by how many Augmentations you have purchased for yourself, and vice versa. - -Memory -~~~~~~ -Sleeve memory dictates what a sleeve's synchronization will be when it is reset by -switching BitNodes. For example, if a sleeve has a memory of 10, then when you -switch BitNodes its synchronization will initially be set to 10, rather than 1. - -Memory can only be increased by purchasing upgrades from The Covenant. Just like -the ability to purchase additional sleeves, this is only available in BitNode-10. - -Memory is a persistent stat, meaning it never gets reset back to 1. -The maximum possible value for a sleeve's memory is 100. - -Buying memory has no instant affect on synchronization, -memory affects only the starting synchronization upon entering a BitNode. \ No newline at end of file diff --git a/doc/source/advancedgameplay/sourcefiles.rst b/doc/source/advancedgameplay/sourcefiles.rst deleted file mode 100644 index c4eb54d1e..000000000 --- a/doc/source/advancedgameplay/sourcefiles.rst +++ /dev/null @@ -1,62 +0,0 @@ -.. _gameplay_sourcefiles: - -.. warning:: This page contains spoilers for the game - -Source-Files -============ -Source-Files are a type of persistent upgrade that is more powerful than Augmentations. -Source-Files are received by :ref:`destroying a BitNode `. There are many different BitNodes -in the game and each BitNode will grant a different Source-File when it is destroyed. - -A Source-File can be upgraded by destroying its corresponding BitNode a second or -third time (AKA playing through that BitNode again). It can be upgraded to a maximum -of level 3, with the exception of source-file 12, which has no hard limit. - -List of all Source-Files -^^^^^^^^^^^^^^^^^^^^^^^^ -+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| BitNode-1: Source Genesis | * Let the player start with 32 GB of RAM on the home computer. | -| | * Increases all of the player's multipliers by 16%/24%/28%. | -+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| BitNode-2: Rise of the Underworld | * Let the player create Gangs in other BitNodes (although some BitNodes will disable this mechanic). | -| | * Increases the player's crime success rate, crime money, and charisma multipliers by 24%/36%/42%. | -+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| BitNode-3: Corporatocracy | * Let the player create Corporations in other BitNodes (although some BitNodes will disable this mechanic). | -| | * Increases the player's charisma and company salary multipliers by 8%/12%/14%. | -+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| BitNode-4: The Singularity | * Let the player access and use Netscript Singularity Functions in other BitNodes. | -| | * Each level of this Source-File reduces the RAM cost of singularity functions. | -+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| BitNode-5: Artificial Intelligence | * Unlocks :ref:`gameplay_intelligence`. | -| | * Unlocks :js:func:`getBitNodeMultipliers` and grants permanent access to Formulas.exe. | -| | * Increases all of the player's hacking-related multipliers by 8%/12%/14%. | -+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| BitNode-6: Bladeburners | * Unlocks the Bladeburner feature in other BitNodes. | -| | * Increases all of the player's level and experience gain rate multipliers for combat stats by 8%/12%/14%. | -+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| BitNode-7: Bladeburners 2079 | * Allows the player to access the `Bladeburner API `_ in other BitNodes. | -| | * Increases all of the player's Bladeburner multipliers by 8%/12%/14%. | -+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| BitNode-8: Ghost of Wall Street | * Increases the player's hacking growth multiplier by 12%/18%/21%. | -| | * Level 1 grants permanent access to :ref:`WSE ` and the `TIX `_ API. | -| | * Level 2 grants permanent access to shorting stocks. | -| | * Level 3 grants permanent access to use limit/stop orders. | -+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| BitNode-9: Hacktocracy | * Level 1 permanently unlocks the Hacknet Server in other BitNodes. | -| | * Level 2 lets the player start with 128 GB of RAM on the home computer. | -| | * Level 3 grants a highly-upgraded Hacknet Server when entering a new BitNode (it will be lost after installing augments). | -+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| BitNode-10: Digital Carbon | * Each level of this grants a Duplicate Sleeve. | -| | * Allows the player to access the `Sleeve API `_ in other BitNodes. | -| | * Grants the player access to the VitaLife secret laboratory in other BitNodes. Also grants access to the Grafting API. | -+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| BitNode-11: The Big Crash | * Company favor increases both the player's salary and reputation gain at that company by 1% per favor (rather than just the reputation gain). | -| | * Increases the player's company salary and reputation gain multipliers by 32%/48%/56%. | -| | * This Source-File reduces the price increase for every aug bought by 4%/5%/7%. | -+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| BitNode-12: The Recursion | * There is no maximum level for this Source-File. | -| | * Let the player start with Neuroflux Governor equal to the level of this Source-File. | -+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| BitNode-13: They're lunatics | * This Source-File lets the Church of the Machine God appear in other BitNodes. | -| | * Each level of this Source-File increases the size of Stanek's Gift. | -+-------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ diff --git a/doc/source/basicgameplay.rst b/doc/source/basicgameplay.rst deleted file mode 100644 index f10386d71..000000000 --- a/doc/source/basicgameplay.rst +++ /dev/null @@ -1,22 +0,0 @@ -Basic Gameplay -============== -This section documents Bitburner gameplay elements that are immediately -available and/or accessible to the player. - -.. toctree:: - :maxdepth: 5 - :caption: Elements: - - Stats - Terminal - Servers - Hacking - Scripts - World - Factions - Augmentations - Companies - Crimes - Infiltration - Stock Market - Coding Contracts diff --git a/doc/source/basicgameplay/codingcontracts.rst b/doc/source/basicgameplay/codingcontracts.rst deleted file mode 100644 index e94eceaef..000000000 --- a/doc/source/basicgameplay/codingcontracts.rst +++ /dev/null @@ -1,417 +0,0 @@ -.. _codingcontracts: - -Coding Contracts -================ -Coding Contracts are a mechanic that lets players earn rewards in -exchange for solving programming problems. - -Coding Contracts are files with the ".cct" extensions. They can -be accessed through the :ref:`terminal` or through scripts using -the `Coding Contract API `_ - -Each contract has a limited number of attempts. If you -provide the wrong answer too many times and exceed the -number of attempts, the contract will self destruct (delete itself) - -Currently, Coding Contracts are randomly generated and -spawned over time. They can appear on any server (including your -home computer), except for your purchased servers. - - -Running in Terminal -^^^^^^^^^^^^^^^^^^^ -To run a Coding Contract in the Terminal, simply use the -:ref:`run_terminal_command` command:: - - $ run some-contract.cct - -Doing this will bring up a popup. The popup will display -the contract's problem, the number of attempts remaining, and -an area to provide an answer. - -Interacting through Scripts -^^^^^^^^^^^^^^^^^^^^^^^^^^^ -See the `Coding Contract API `_. -Interacting with Coding Contracts via the Terminal can be tedious the more -contracts you solve. Consider using the API to automate various aspects of -your solution. For example, some contracts have long solutions while others -have even longer solutions. You might want to use the API to automate the -process of submitting your solution rather than copy and paste a long -solution into an answer box. - -However, using the API comes at a cost. Like most functions in other APIs, -each function in the Coding Contract API has a RAM cost. Depending on which -function you use, the initial RAM on your home server might not be enough -to allow you to use various API functions. Plan on upgrading the RAM on your -home server if you want to use the Coding Contract API. - -Submitting Solutions -^^^^^^^^^^^^^^^^^^^^ -Different contract problem types will require different types of -solutions. Some may be numbers, others may be strings or arrays. -If a contract asks for a specific solution format, then -use that. Otherwise, follow these rules when submitting solutions: - -* String-type solutions should **not** have quotation marks surrounding - the string (unless specifically asked for). Only quotation - marks that are part of the actual string solution should be included. -* Array-type solutions should be submitted with each element - in the array separated by commas. Brackets are optional. For example, - both of the following are valid solution formats:: - - 1,2,3 - [1,2,3] - - However, if the solution is a multidimensional array, then - all arrays that are not the outer-most array DO require the brackets. - For example, an array of arrays can be submitted as one of the following:: - - [1,2],[3,4] - [[1,2],[3,4]] - -* Numeric solutions should be submitted normally, as expected - -Rewards -^^^^^^^ -There are currently four possible rewards for solving a Coding Contract: - -* Faction Reputation for a specific Faction -* Faction Reputation for all Factions that you are a member of -* Company reputation for a specific Company -* Money - -The 'amount' of reward varies based on the difficulty of the problem -posed by the Coding Contract. There is no way to know what a -Coding Contract's exact reward will be until it is solved. - -Notes -^^^^^ - -* The *scp* Terminal command does not work on Coding Contracts - -List of all Problem Types -^^^^^^^^^^^^^^^^^^^^^^^^^ - -The following is a list of all of the problem types that a Coding Contract can contain. -The list contains the name of (i.e. the value returned by -:js:func:`getContractType`) and a brief summary of the problem it poses. - -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Name | Problem Summary | -+=========================================+==========================================================================================+ -| Find Largest Prime Factor | | Given a number, find its largest prime factor. A prime factor | -| | | is a factor that is a prime number. | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Subarray with Maximum Sum | | Given an array of integers, find the contiguous subarray (containing | -| | | at least one number) which has the largest sum and return that sum. | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Total Ways to Sum | | Given a number, how many different distinct ways can that number be written as | -| | | a sum of at least two positive integers? | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Total Ways to Sum II | | You are given an array with two elements. The first element is an integer n. | -| | | The second element is an array of numbers representing the set of available integers. | -| | | How many different distinct ways can that number n be written as | -| | | a sum of integers contained in the given set? | -| | | You may use each integer in the set zero or more times. | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Spiralize Matrix | | Given an array of array of numbers representing a 2D matrix, return the | -| | | elements of that matrix in clockwise spiral order. | -| | | | -| | | Example: The spiral order of | -| | | | -| | | [1, 2, 3, 4] | -| | | [5, 6, 7, 8] | -| | | [9, 10, 11, 12] | -| | | | -| | | is [1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7] | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Array Jumping Game | | You are given an array of integers where each element represents the | -| | | maximum possible jump distance from that position. For example, if you | -| | | are at position i and your maximum jump length is n, then you can jump | -| | | to any position from i to i+n. | -| | | | -| | | Assuming you are initially positioned at the start of the array, determine | -| | | whether you are able to reach the last index of the array. | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Array Jumping Game II | | You are given an array of integers where each element represents the | -| | | maximum possible jump distance from that position. For example, if you | -| | | are at position i and your maximum jump length is n, then you can jump | -| | | to any position from i to i+n. | -| | | | -| | | Assuming you are initially positioned at the start of the array, determine | -| | | the minimum number of jumps to reach the end of the array. | -| | | | -| | | If it's impossible to reach the end, then the answer should be 0. | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Merge Overlapping Intervals | | Given an array of intervals, merge all overlapping intervals. An interval | -| | | is an array with two numbers, where the first number is always less than | -| | | the second (e.g. [1, 5]). | -| | | | -| | | The intervals must be returned in ASCENDING order. | -| | | | -| | | Example: | -| | | [[1, 3], [8, 10], [2, 6], [10, 16]] | -| | | merges into [[1, 6], [8, 16]] | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Generate IP Addresses | | Given a string containing only digits, return an array with all possible | -| | | valid IP address combinations that can be created from the string. | -| | | | -| | | An octet in the IP address cannot begin with '0' unless the number itself | -| | | is actually 0. For example, "192.168.010.1" is NOT a valid IP. | -| | | | -| | | Examples: | -| | | 25525511135 -> [255.255.11.135, 255.255.111.35] | -| | | 1938718066 -> [193.87.180.66] | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Algorithmic Stock Trader I | | You are given an array of numbers representing stock prices, where the | -| | | i-th element represents the stock price on day i. | -| | | | -| | | Determine the maximum possible profit you can earn using at most one | -| | | transaction (i.e. you can buy an sell the stock once). If no profit | -| | | can be made, then the answer should be 0. Note that you must buy the stock | -| | | before you can sell it. | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Algorithmic Stock Trader II | | You are given an array of numbers representing stock prices, where the | -| | | i-th element represents the stock price on day i. | -| | | | -| | | Determine the maximum possible profit you can earn using as many transactions | -| | | as you'd like. A transaction is defined as buying and then selling one | -| | | share of the stock. Note that you cannot engage in multiple transactions at | -| | | once. In other words, you must sell the stock before you buy it again. If no | -| | | profit can be made, then the answer should be 0. | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Algorithmic Stock Trader III | | You are given an array of numbers representing stock prices, where the | -| | | i-th element represents the stock price on day i. | -| | | | -| | | Determine the maximum possible profit you can earn using at most two | -| | | transactions. A transaction is defined as buying and then selling one share | -| | | of the stock. Note that you cannot engage in multiple transactions at once. | -| | | In other words, you must sell the stock before you buy it again. If no profit | -| | | can be made, then the answer should be 0. | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Algorithmic Stock Trader IV | | You are given an array with two elements. The first element is an integer k. | -| | | The second element is an array of numbers representing stock prices, where the | -| | | i-th element represents the stock price on day i. | -| | | | -| | | Determine the maximum possible profit you can earn using at most k transactions. | -| | | A transaction is defined as buying and then selling one share of the stock. | -| | | Note that you cannot engage in multiple transactions at once. In other words, | -| | | you must sell the stock before you can buy it. If no profit can be made, then | -| | | the answer should be 0. | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Minimum Path Sum in a Triangle | | You are given a 2D array of numbers (array of array of numbers) that represents a | -| | | triangle (the first array has one element, and each array has one more element than | -| | | the one before it, forming a triangle). Find the minimum path sum from the top to the | -| | | bottom of the triangle. In each step of the path, you may only move to adjacent | -| | | numbers in the row below. | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Unique Paths in a Grid I | | You are given an array with two numbers: [m, n]. These numbers represent a | -| | | m x n grid. Assume you are initially positioned in the top-left corner of that | -| | | grid and that you are trying to reach the bottom-right corner. On each step, | -| | | you may only move down or to the right. | -| | | | -| | | | -| | | Determine how many unique paths there are from start to finish. | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Unique Paths in a Grid II | | You are given a 2D array of numbers (array of array of numbers) representing | -| | | a grid. The 2D array contains 1's and 0's, where 1 represents an obstacle and | -| | | | -| | | 0 represents a free space. | -| | | | -| | | Assume you are initially positioned in top-left corner of that grid and that you | -| | | are trying to reach the bottom-right corner. In each step, you may only move down | -| | | or to the right. Furthermore, you cannot move onto spaces which have obstacles. | -| | | | -| | | Determine how many unique paths there are from start to finish. | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Shortest Path in a Grid | | You are given a 2D array of numbers (array of array of numbers) representing | -| | | a grid. The 2D array contains 1's and 0's, where 1 represents an obstacle and | -| | | 0 represents a free space. | -| | | | -| | | Assume you are initially positioned in top-left corner of that grid and that you | -| | | are trying to reach the bottom-right corner. In each step, you may move to the up, | -| | | down, left or right. Furthermore, you cannot move onto spaces which have obstacles. | -| | | | -| | | Determine if paths exist from start to destination, and find the shortest one. | -| | | | -| | | Examples: | -| | | [[0,1,0,0,0], | -| | | [0,0,0,1,0]] -> "DRRURRD" | -| | | [[0,1], | -| | | [1,0]] -> "" | -| | | | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Sanitize Parentheses in Expression | | Given a string with parentheses and letters, remove the minimum number of invalid | -| | | parentheses in order to validate the string. If there are multiple minimal ways | -| | | to validate the string, provide all of the possible results. | -| | | | -| | | The answer should be provided as an array of strings. If it is impossible to validate | -| | | the string, the result should be an array with only an empty string. | -| | | | -| | | Examples: | -| | | "()())()" -> ["()()()", "(())()"] | -| | | "(a)())()" -> ["(a)()()", "(a())()"] | -| | | ")(" -> [""] | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Find All Valid Math Expressions | | You are given a string which contains only digits between 0 and 9 as well as a target | -| | | number. Return all possible ways you can add the +, -, and * operators to the string | -| | | of digits such that it evaluates to the target number. | -| | | | -| | | The answer should be provided as an array of strings containing the valid expressions. | -| | | | -| | | NOTE: Numbers in an expression cannot have leading 0's | -| | | NOTE: The order of evaluation expects script operator precedence | -| | | | -| | | Examples: | -| | | Input: digits = "123", target = 6 | -| | | Output: [1+2+3, 1*2*3] | -| | | | -| | | Input: digits = "105", target = 5 | -| | | Output: [1*0+5, 10-5] | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| HammingCodes: Integer to Encoded Binary | | You are given a decimal value. | -| | | Convert it into a binary string and encode it as a 'Hamming-Code'. eg: | -| | | Value 8 will result into binary '1000', which will be encoded | -| | | with the pattern 'pppdpddd', where p is a paritybit and d a databit. The encoding of | -| | | 8 is 11110000. As another example, '10101' (Value 21) will result into (pppdpdddpd) | -| | | '1001101011'. | -| | | NOTE: You need an parity Bit on Index 0 as an 'overall'-paritybit. | -| | | NOTE 2: You should watch the HammingCode-video from 3Blue1Brown, which | -| | | explains the 'rule' of encoding, | -| | | including the first Index parity-bit mentioned on the first note. | -| | | Now the only one rule for this encoding: | -| | | It's not allowed to add additional leading '0's to the binary value | -| | | That means, the binary value has to be encoded as it is | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| HammingCodes: Encoded Binary to Integer | | You are given an encoded binary string. | -| | | Treat it as a Hammingcode with 1 'possible' error on an random Index. | -| | | Find the 'possible' wrong bit, fix it and extract the decimal value, which is | -| | | hidden inside the string.\n\n", | -| | | Note: The length of the binary string is dynamic, but its encoding/decoding is | -| | | following Hammings 'rule'\n", | -| | | Note 2: Index 0 is an 'overall' parity bit. Watch the Hammingcode-video from | -| | | 3Blue1Brown for more information\n", | -| | | Note 3: There's a ~55% chance for an altered Bit. So... MAYBE | -| | | there is an altered Bit 😉\n", | -| | | Extra note for automation: return the decimal value as a string", | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Proper 2-Coloring of a Graph | | You are given data, representing a graph. Note that "graph", as used here, refers to | -| | | the field of graph theory, and has no relation to statistics or plotting. | -| | | | -| | | The first element of the data represents the number of vertices in the graph. Each | -| | | vertex is a unique number between 0 and ${data[0] - 1}. The next element of the data | -| | | represents the edges of the graph. | -| | | | -| | | Two vertices u,v in a graph are said to be adjacent if there exists an edge [u,v]. | -| | | Note that an edge [u,v] is the same as an edge [v,u], as order does not matter. | -| | | | -| | | You must construct a 2-coloring of the graph, meaning that you have to assign each | -| | | vertex in the graph a "color", either 0 or 1, such that no two adjacent vertices have | -| | | the same color. Submit your answer in the form of an array, where element i | -| | | represents the color of vertex i. If it is impossible to construct a 2-coloring of | -| | | the given graph, instead submit an empty array. | -| | | | -| | | Examples: | -| | | | -| | | Input: [4, [[0, 2], [0, 3], [1, 2], [1, 3]]] | -| | | Output: [0, 0, 1, 1] | -| | | | -| | | Input: [3, [[0, 1], [0, 2], [1, 2]]] | -| | | Output: [] | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Compression I: RLE Compression | | Run-length encoding (RLE) is a data compression technique which encodes data as a | -| | | series of runs of a repeated single character. Runs are encoded as a length, followed | -| | | by the character itself. Lengths are encoded as a single ASCII digit; runs of 10 | -| | | characters or more are encoded by splitting them into multiple runs. | -| | | | -| | | You are given a string as input. Encode it using run-length encoding with the minimum | -| | | possible output length. | -| | | | -| | | Examples: | -| | | aaaaabccc -> 5a1b3c | -| | | aAaAaA -> 1a1A1a1A1a1A | -| | | 111112333 -> 511233 | -| | | zzzzzzzzzzzzzzzzzzz -> 9z9z1z (or 9z8z2z, etc.) | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Compression II: LZ Decompression | | Lempel-Ziv (LZ) compression is a data compression technique which encodes data using | -| | | references to earlier parts of the data. In this variant of LZ, data is encoded in two | -| | | types of chunk. Each chunk begins with a length L, encoded as a single ASCII digit | -| | | from 1 - 9, followed by the chunk data, which is either: | -| | | | -| | | 1. Exactly L characters, which are to be copied directly into the uncompressed data. | -| | | 2. A reference to an earlier part of the uncompressed data. To do this, the length | -| | | is followed by a second ASCII digit X: each of the L output characters is a copy | -| | | of the character X places before it in the uncompressed data. | -| | | | -| | | For both chunk types, a length of 0 instead means the chunk ends immediately, and the | -| | | next character is the start of a new chunk. The two chunk types alternate, starting | -| | | with type 1, and the final chunk may be of either type. | -| | | | -| | | You are given an LZ-encoded string. Decode it and output the original string. | -| | | | -| | | Example: decoding '5aaabb450723abb' chunk-by-chunk | -| | | 5aaabb -> aaabb | -| | | 5aaabb45 -> aaabbaaab | -| | | 5aaabb450 -> aaabbaaab | -| | | 5aaabb45072 -> aaabbaaababababa | -| | | 5aaabb450723abb -> aaabbaaababababaabb | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Compression III: LZ Compression | | Lempel-Ziv (LZ) compression is a data compression technique which encodes data using | -| | | references to earlier parts of the data. In this variant of LZ, data is encoded in two | -| | | types of chunk. Each chunk begins with a length L, encoded as a single ASCII digit | -| | | from 1 - 9, followed by the chunk data, which is either: | -| | | | -| | | 1. Exactly L characters, which are to be copied directly into the uncompressed data. | -| | | 2. A reference to an earlier part of the uncompressed data. To do this, the length | -| | | is followed by a second ASCII digit X: each of the L output characters is a copy | -| | | of the character X places before it in the uncompressed data. | -| | | | -| | | For both chunk types, a length of 0 instead means the chunk ends immediately, and the | -| | | next character is the start of a new chunk. The two chunk types alternate, starting | -| | | with type 1, and the final chunk may be of either type. | -| | | | -| | | You are given a string as input. Encode it using Lempel-Ziv encoding with the minimum | -| | | possible output length. | -| | | | -| | | Examples (some have other possible encodings of minimal length): | -| | | abracadabra -> 7abracad47 | -| | | mississippi -> 4miss433ppi | -| | | aAAaAAaAaAA -> 3aAA53035 | -| | | 2718281828 -> 627182844 | -| | | abcdefghijk -> 9abcdefghi02jk | -| | | aaaaaaaaaaaa -> 3aaa91 | -| | | aaaaaaaaaaaaa -> 1a91031 | -| | | aaaaaaaaaaaaaa -> 1a91041 | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Encryption I: Caesar Cipher | | Caesar cipher is one of the simplest encryption technique. It is a type of | -| | | substitution cipher in which each letter in the plaintext is replaced by a letter some | -| | | fixed number of positions down the alphabet. For example, with a left shift of 3, D | -| | | would be replaced by A, E would become B, and A would become X (because of rotation). | -| | | You are given an array with two elements. The first element is the plaintext, the | -| | | second element is the left shift value. Return the ciphertext as uppercase string. | -| | | Spaces remains the same. | -+-----------------------------------------+------------------------------------------------------------------------------------------+ -| Encryption II: Vigenère Cipher | | Vigenère cipher is a type of polyalphabetic substitution. It uses the Vigenère square | -| | | to encrypt and decrypt plaintext with a keyword. | -| | | Vignenère square: | -| | | A B C D E F G H I J K L M N O P Q R S T U V W X Y Z | -| | | +---------------------------------------------------- | -| | | A | A B C D E F G H I J K L M N O P Q R S T U V W X Y Z | -| | | B | B C D E F G H I J K L M N O P Q R S T U V W X Y Z A | -| | | C | C D E F G H I J K L M N O P Q R S T U V W X Y Z A B | -| | | D | D E F G H I J K L M N O P Q R S T U V W X Y Z A B C | -| | | E | E F G H I J K L M N O P Q R S T U V W X Y Z A B C D | -| | | ... | -| | | Y | Y Z A B C D E F G H I J K L M N O P Q R S T U V W X | -| | | Z | Z A B C D E F G H I J K L M N O P Q R S T U V W X Y | -| | | For encryption each letter of the plaintext is paired with the corresponding letter of | -| | | a repeating keyword. For example, the plaintext DASHBOARD is encrypted with the | -| | | keyword LINUX: | -| | | Plaintext: DASHBOARD | -| | | Keyword: LINUXLINU | -| | | So, the first letter D is paired with the first letter of the key L. Therefore, row D | -| | | and column L of the Vigenère square are used to get the first cipher letter O. This | -| | | must be repeated for the whole ciphertext. | -| | | You are given an array with two elements. The first element is the plaintext, the | -| | | second element is the keyword. Return the ciphertext as uppercase string. | -+-----------------------------------------+------------------------------------------------------------------------------------------+ diff --git a/doc/source/basicgameplay/companies.rst b/doc/source/basicgameplay/companies.rst deleted file mode 100644 index 32be5775d..000000000 --- a/doc/source/basicgameplay/companies.rst +++ /dev/null @@ -1,17 +0,0 @@ -.. _gameplay_companies: - -Companies -========= -When exploring the :ref:`world `, you can visit various companies. At -these companies, you can apply for jobs. - -Working a job lets you earn money, experience, and reputation with that company. - -While working for a company, you can click "Do something else simultaneously" to be able -to do things while you continue to work in the background. There is a 20% penalty to the -related gains. Clicking the "Focus" button under the overview will return you to the -current work. - -If you've been hired to do a job you can click that "Apply for X Job" button again to get a -promotion if you meet the requirements. You can see the requirements by hovering your cursor -over the button. Higher positions give increased rewards. \ No newline at end of file diff --git a/doc/source/basicgameplay/crimes.rst b/doc/source/basicgameplay/crimes.rst deleted file mode 100644 index c91653484..000000000 --- a/doc/source/basicgameplay/crimes.rst +++ /dev/null @@ -1,58 +0,0 @@ -.. _gameplay_crimes: - -Crimes -====== -Committing crimes is an active gameplay mechanic that allows the player to train -their stats and potentially earn money. The player can attempt to commit crimes -by visiting 'The Slums' through the 'City' tab (:ref:`Keyboard shortcut ` Alt + w). -'The Slums' is available in every city. - - -Basic Mechanics -^^^^^^^^^^^^^^^ -When you visit the 'Slums' you will see a list of buttons that show all of the -available crimes. Simply select one of the options to begin attempting that -crime. Attempting to commit a crime takes a certain amount of time. This time -varies between crimes. - -While doing crimes, you can click “Do something else simultaneously” -to be able to do things while you continue to do crimes in the background. There is a -20% penalty to the related gains. Clicking the “Focus” button under the overview -will return you to the current task. - -Crimes are not always successful. Your rate of success is determined by your -stats (and Augmentation multipliers) and can be seen on the crime-selection -page. If you are unsuccessful at committing a crime you will gain EXP, -but you will not earn money. If you are successful at committing the crime -you will gain extra EXP (4x of what an unsuccessful attempt would give) -and earn money. - -Harder crimes are typically more profitable, and also give more EXP. - -Crime details -^^^^^^^^^^^^^ -Available crimes, and their descriptions, which all begin with "attempt to..." - -Shoplift …shoplift from a low-end retailer - -Rob store …commit armed robbery on a high-end store - -Mug someone …mug a random person on the street - -Larceny …rob property from someone's house - -Deal Drugs …deal drugs - -Bond Forgery …forge corporate bonds - -Traffick illegal Arms …smuggle illegal arms into the city - -Homicide …murder a random person on the street - -Grand theft Auto …commit grand theft auto - -Kidnap and Ransom …kidnap and ransom a high-profile-target - -Assassinate …assassinate a high-profile target - -Heist …pull off the ultimate heist diff --git a/doc/source/basicgameplay/factions.rst b/doc/source/basicgameplay/factions.rst deleted file mode 100644 index 10ad755f0..000000000 --- a/doc/source/basicgameplay/factions.rst +++ /dev/null @@ -1,255 +0,0 @@ -.. _gameplay_factions: - -Factions -======== - -.. warning:: This page contains spoilers regarding the game's story/plot-line. - -Throughout the game you may receive invitations from factions. There are -many different factions, and each faction has different criteria for -determining its potential members. Joining a faction and furthering -its cause is crucial to progressing in the game and unlocking endgame -content. - -It is possible to join multiple factions if you receive invitations from -them. However, note that joining a faction may prevent you from joining -other rival factions. (Don't worry, this usually isn't the case. Also, -it would only be temporary since resetting the game by installing -:ref:`gameplay_augmentations` will clear all your factions) - -The 'Factions' link on the menu brings up a list of all factions that -you have joined. You can select a Faction on this list to go to that -Faction page. This page displays general information about the Faction -and also lets you perform work for the faction. Working for a Faction -is similar to working for a company except that you don't get paid a -salary. You will only earn reputation in your Faction and train your -stats. Also, cancelling work early when working for a Faction does -**not** result in reduced reputation earnings. - -Earning reputation for a Faction unlocks powerful Augmentations. -Purchasing and installing these Augmentations will upgrade your -abilities. The Augmentations that are available to unlock vary -from faction to faction. - -List of Factions and their Requirements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. raw:: html - -
Early Game Factions - -.. _gameplay_factions:: - -+---------------------+--------------------+-----------------------------------------+-------------------------------+ -| Early Game | Faction Name | Requirements | Joining this Faction prevents | -| Factions | | | you from joining: | -+ +--------------------+-----------------------------------------+-------------------------------+ -| | CyberSec | * Install a backdoor on the CSEC server | | -+ +--------------------+-----------------------------------------+-------------------------------+ -| | Tian Di Hui | * $1m | | -| | | * Hacking Level 50 | | -| | | * Be in Chongqing, New Tokyo, or Ishima | | -+ +--------------------+-----------------------------------------+-------------------------------+ -| | Netburners | * Hacking Level 80 | | -| | | * Total Hacknet Levels of 100 | | -| | | * Total Hacknet RAM of 8 | | -| | | * Total Hacknet Cores of 4 | | -+ +--------------------+-----------------------------------------+-------------------------------+ -| | Shadows of Anarchy | * Successfully infiltrate a company | | -+---------------------+--------------------+-----------------------------------------+-------------------------------+ -.. raw:: html - -
-
City Factions - -.. _gameplay_factions:: - -+---------------------+----------------+-----------------------------------------+-------------------------------+ -| City Factions | Faction Name | Requirements | Joining this Faction prevents | -| | | | you from joining: | -+ +----------------+-----------------------------------------+-------------------------------+ -| | Sector-12 | * Be in Sector-12 | * Chongqing | -| | | * $15m | * New Tokyo | -| | | | * Ishima | -| | | | * Volhaven | -+ +----------------+-----------------------------------------+-------------------------------+ -| | Chongqing | * Be in Chongqing | * Sector-12 | -| | | * $20m | * Aevum | -| | | | * Volhaven | -+ +----------------+-----------------------------------------+-------------------------------+ -| | New Tokyo | * Be in New Tokyo | * Sector-12 | -| | | * $20m | * Aevum | -| | | | * Volhaven | -+ +----------------+-----------------------------------------+-------------------------------+ -| | Ishima | * Be in Ishima | * Sector-12 | -| | | * $30m | * Aevum | -| | | | * Volhaven | -+ +----------------+-----------------------------------------+-------------------------------+ -| | Aevum | * Be in Aevum | * Chongqing | -| | | * $40m | * New Tokyo | -| | | | * Ishima | -| | | | * Volhaven | -+ +----------------+-----------------------------------------+-------------------------------+ -| | Volhaven | * Be in Volhaven | * Sector-12 | -| | | * $50m | * Aevum | -| | | | * Chongqing | -| | | | * New Tokyo | -| | | | * Ishima | -+---------------------+----------------+-----------------------------------------+-------------------------------+ -.. raw:: html - -
-
Hacking Groups - -.. _gameplay_factions:: - -+---------------------+----------------+-----------------------------------------+-------------------------------+ -| Hacking | Faction Name | Requirements | Joining this Faction prevents | -| Groups | | | you from joining: | -+ +----------------+-----------------------------------------+-------------------------------+ -| | NiteSec | * Install a backdoor on the avmnite-02h | | -| | | server | | -| | | | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | The Black Hand | * Install a backdoor on the I.I.I.I | | -| | | server | | -| | | | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | BitRunners | * Install a backdoor on the run4theh111z| | -| | | server | | -| | | | | -+---------------------+----------------+-----------------------------------------+-------------------------------+ -.. raw:: html - -
-
Megacorporations - -.. _gameplay_factions:: - -+---------------------+----------------+-----------------------------------------+-------------------------------+ -| Megacorporations | Faction Name | Requirements | Joining this Faction prevents | -| | | | you from joining: | -+ +----------------+-----------------------------------------+-------------------------------+ -| | ECorp | * Have 400k reputation with | | -| | | the Corporation | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | MegaCorp | * Have 400k reputation with | | -| | | the Corporation | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | KuaiGong | * Have 400k reputation with | | -| | International | the Corporation | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | Four Sigma | * Have 400k reputation with | | -| | | the Corporation | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | NWO | * Have 400k reputation with | | -| | | the Corporation | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | Blade | * Have 400k reputation with | | -| | Industries | the Corporation | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | OmniTek | * Have 400k reputation with | | -| | Incorporated | the Corporation | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | Bachman & | * Have 400k reputation with | | -| | Associates | the Corporation | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | Clarke | * Have 400k reputation with | | -| | Incorporated | the Corporation | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | Fulcrum Secret | * Have 400k reputation with | | -| | Technologies | the Corporation | | -| | | * Install a backdoor on the | | -| | | fulcrumassets server | | -+---------------------+----------------+-----------------------------------------+-------------------------------+ -.. raw:: html - -
-
Criminal Organizations - -.. _gameplay_factions:: - -+---------------------+----------------+-----------------------------------------+-------------------------------+ -| Criminal | Faction Name | Requirements | Joining this Faction prevents | -| Organizations | | | you from joining: | -+ +----------------+-----------------------------------------+-------------------------------+ -| | Slum Snakes | * All Combat Stats of 30 | | -| | | * -9 Karma | | -| | | * $1m | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | Tetrads | * Be in Chongqing, New Tokyo, or Ishima | | -| | | * All Combat Stats of 75 | | -| | | * -18 Karma | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | Silhouette | * CTO, CFO, or CEO of a company | | -| | | * $15m | | -| | | * -22 Karma | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | Speakers for | * Hacking Level 100 | | -| | the Dead | * All Combat Stats of 300 | | -| | | * 30 People Killed | | -| | | * -45 Karma | | -| | | * Not working for CIA or NSA | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | The Dark Army | * Hacking Level 300 | | -| | | * All Combat Stats of 300 | | -| | | * Be in Chongqing | | -| | | * 5 People Killed | | -| | | * -45 Karma | | -| | | * Not working for CIA or NSA | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | The Syndicate | * Hacking Level 200 | | -| | | * All Combat Stats of 200 | | -| | | * Be in Aevum or Sector-12 | | -| | | * $10m | | -| | | * -90 Karma | | -| | | * Not working for CIA or NSA | | -+---------------------+----------------+-----------------------------------------+-------------------------------+ -.. raw:: html - -
-
Midgame Factions - -.. _gameplay_factions:: - -+---------------------+----------------+-----------------------------------------+-------------------------------+ -| Midgame | Faction Name | Requirements | Joining this Faction prevents | -| Factions | | | you from joining: | -+ +----------------+-----------------------------------------+-------------------------------+ -| | The Covenant | * 20 Augmentations | | -| | | * $75b | | -| | | * Hacking Level of 850 | | -| | | * All Combat Stats of 850 | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | Daedalus | * 30 Augmentations | | -| | | * $100b | | -| | | * Hacking Level of 2500 OR All Combat | | -| | | Stats of 1500 | | -+ +----------------+-----------------------------------------+-------------------------------+ -| | Illuminati | * 30 Augmentations | | -| | | * $150b | | -| | | * Hacking Level of 1500 | | -| | | * All Combat Stats of 1200 | | -+---------------------+----------------+-----------------------------------------+-------------------------------+ -.. raw:: html - -
-
Endgame Factions - -.. _gameplay_factions:: - -+---------------------+----------------+--------------------------------------------------------------+-------------------------------+ -| Endgame | Faction Name | Requirements | Joining this Faction prevents | -| Factions | | | you from joining: | -+ +----------------+--------------------------------------------------------------+-------------------------------+ -| | Bladeburners | * Join Bladeburner Division | | -| | | * Have 25 Rank | | -| | | * Be in BitNode 6 or 7 | | -| | | * or have Source-File 6 or 7 | | -+ +----------------+--------------------------------------------------------------+-------------------------------+ -| | Church of the | * Have not installed any augmentations in the current BitNode| | -| | Machine God | * Be in BitNode 13 | | -| | | * or have Source-File 13 | | -+---------------------+----------------+--------------------------------------------------------------+-------------------------------+ -.. raw:: html - -

diff --git a/doc/source/basicgameplay/hacking.rst b/doc/source/basicgameplay/hacking.rst deleted file mode 100644 index 0260027ed..000000000 --- a/doc/source/basicgameplay/hacking.rst +++ /dev/null @@ -1,120 +0,0 @@ -.. _gameplay_hacking: - -Hacking -======= - -In the year 2077, currency has become digital and decentralized. -People and corporations store their money on servers. By hacking -these servers, you can steal their money and gain experience. - -Gaining Root Access -^^^^^^^^^^^^^^^^^^^ -The first step to hacking a server is to gain root access to that server. -This can be done using the NUKE virus (NUKE.exe). You start the -game with a copy of the NUKE virus on your home computer. The -NUKE virus attacks the target server's open ports using buffer -overflow exploits. When successful, you are granted root -administrative access to the machine. - -In order for the NUKE virus to succeed, the target server -needs to have enough open ports. Some servers have no -security and will not need any ports opened. Some will have very high -security and will need many ports opened. In order to open ports on -another server, you will need to run programs that attack the server -to open specific ports. These programs can be coded once your hacking -skill gets high enough, or they can be purchased if you can find a seller. - -**There are two ways to execute port-opening programs and the NUKE virus:** - -1. Connect to the target server through the :ref:`terminal` and use the - :ref:`run_terminal_command` Terminal command:: - - $ run [programName] -2. Use a :ref:`Netscript Function `: - -* :js:func:`nuke` -* :js:func:`brutessh` -* :js:func:`ftpcrack` -* :js:func:`relaysmtp` -* :js:func:`httpworm` -* :js:func:`sqlinject` - -**There are two ways to determine how many ports need to be opened -on a server in order to successfully NUKE it:** - -1. Connect to that server through the :ref:`terminal` and use the - :ref:`analyze_terminal_command` command -2. Use the :js:func:`getServerNumPortsRequired` Netscript function - -Once you have enough ports opened on a server and have ran the NUKE virus -to gain root access, you will be able to hack it. - -.. _gameplay_hacking_generalhackingmechanics: - -General Hacking Mechanics -^^^^^^^^^^^^^^^^^^^^^^^^^ -When you execute the hack command, either manually through the terminal -or automatically through a script, you attempt to hack the server. -This action takes time. The more advanced a server's security is, -the more time it will take. Your hacking skill level also affects -the hacking time, with a higher hacking skill leading to shorter -hacking times. Also, running the hack command manually through terminal -is faster than hacking from a script. - -Your attempt to hack a server will not always succeed. The chance you -have to successfully hack a server is also determined by the server's -security and your hacking skill level. Even if your hacking attempt -is unsuccessful, you will still gain experience points. - -When you successfully hack a server. You steal a certain percentage -of that server's total money. This percentage is, once again, determined by the -server's security and your hacking skill level. The amount of money -on a server is not limitless. So, if you constantly hack a server -and deplete its money, then you will encounter diminishing returns -in your hacking (since you are only hacking a certain percentage). -You can increase the amount of money on a server using a script and -the :js:func:`grow` function in Netscript. - -.. _gameplay_hacking_serversecurity: - -Server Security -^^^^^^^^^^^^^^^ -Each server has a security level, typically between 1 and 100. -A higher number means the server has stronger security. It is -possible for a server to have a security of level 100 or higher, in -which case hacking that server will become impossible (0% chance for -hack to succeed). - -As mentioned above, a server's security level is an important factor -to consider when hacking. You can check a server's security level -using the :ref:`analyze_terminal_command` Terminal command. You can -also check a server's security in -a script, using the :js:func:`getServerSecurityLevel` Netscript -Function. See the Netscript documentation for more details. - -Whenever a server is hacked manually or through a script, its security -level increases by a small amount. Calling the :js:func:`grow` function in a -script will also increase security level of the target server. These -actions will make it harder for you to hack the server, and decrease -the amount of money you can steal. You can lower a server's security -level in a script using the :js:func:`weaken` function in Netscript. See -the Netscript documentation for more details - -A server has a minimum security level that is equal to one third of its -starting security, rounded to the nearest integer. To be more precise:: - - server.minSecurityLevel = Math.max(1, Math.round(server.startingSecurityLevel / 3)) - -This means that a server's security level will not fall below this -value if you are trying to weaken() it. - -Backdoors -^^^^^^^^^ -Servers that can be hacked can also have backdoors installed. These backdoors -will provide you with a benefit; the services may be cheaper, penalties may -be reduced or there may be other results. Honeypots exist and will let factions -know when you have succeeded at backdooring their system. Once you have a -backdoor installed, you can connect to that server directly. - -When you visit a location in the city and see that the name is partially scrambled, -this indicates that you have backdoored the server related to the location. diff --git a/doc/source/basicgameplay/infiltration.rst b/doc/source/basicgameplay/infiltration.rst deleted file mode 100644 index fdc8def09..000000000 --- a/doc/source/basicgameplay/infiltration.rst +++ /dev/null @@ -1,70 +0,0 @@ -.. _gameplay_infiltration: - -Infiltration -============ -Infiltration is a gameplay mechanic that allows you to infiltrate a -company's facility to try and steal the company's classified secrets. -These secrets can be sold for money or for reputation with a faction. - -Overview -^^^^^^^^ -Many companies have facilities that you can attempt to infiltrate. -By infiltrating, you can steal classified company secrets and then sell -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 -says 'Infiltrate Company'. - -When infiltrating a company you will be presented with short active challenges. -None of the challenges use the mouse. - -The difficulty at the top lowers with better combat stats and charisma. It is not recommended -to attempt infiltrations above mid-normal. - -The "maximum level" is the number of challenges you will need to pass to receive -the infiltration reward. - -Every time you fail an infiltration challenge, you will take damage based on the -difficulty of the infiltration. If you are reduced to 0 hp or below, the -infiltration will immediately end. - -* Most use spacebar as "action" -* Some use WASD or arrows interchangeably. -* A few others use the rest of the keyboard. - -** Slash when his guard is down! ** - -Press space when the guard is preparing to attack you. -There's 3 phases -The first is guarding, where attacking back will result in failure. -The 2nd is preparing, where attacking will result in a victory. -The 3rd is attack, where the guard will attack you resulting in failure. - -** 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. diff --git a/doc/source/basicgameplay/servers.rst b/doc/source/basicgameplay/servers.rst deleted file mode 100644 index 480007d50..000000000 --- a/doc/source/basicgameplay/servers.rst +++ /dev/null @@ -1,79 +0,0 @@ -.. _gameplay_servers: - -Servers -======= -In this game, a server refers to a computer that can be connected to, -accessed, and manipulated through the Terminal. All servers in the -game are connected to each other to form a large, global network. -To learn about how to navigate this network and connect to other -servers, see the :ref:`Terminal` page. - -Server Statistics -^^^^^^^^^^^^^^^^^ -Each server has it's own statistics, such as RAM, required hacking level and number of -ports required to successfully NUKE it. - -Perhaps the most important property of a server to make note of is its RAM, -which refers to how much memory is available on that machine. RAM is -important because it is required to run Scripts. More RAM allows -the user to run more powerful and complicated scripts as well as executing -a script with :ref:`more threads `. - -The `free`, `scan-analyze`, and `analyze` Terminal commands -can be used to check how much RAM a server has. - -Some servers have some randomized statistics, such as RAM, max Money or -required hacking level. These statistics are randomly generated from a range of values. - -Identifying Servers -^^^^^^^^^^^^^^^^^^^ -A server is identified by its hostname. -A hostname is a label assigned to a server. -A hostname will usually give you a general idea of what the server -is. For example, the company Nova Medical might have a server with -the hostname "nova-med". - -Hostnames are unique. This means that if one -server has the the hostname "some-server", then no other server -in the game can have that that hostname. - -There are many :ref:`Netscript Functions ` -and :ref:`terminal` commands in the game -that will require you to target a specific server by hostname. - -Player-owned Servers -^^^^^^^^^^^^^^^^^^^^ -The player starts with a single server: his/her home computer. -This server will have the hostname "home." The player's home -computer is special for a variety of reasons: - -1. The home computer's RAM can be upgraded. This can be done by visiting -certain locations in the World. - -2. The home computer persists through Augmentation Installations. This means -that you will not lose any RAM upgrades or Scripts on your -home computer when you install :ref:`gameplay_augmentations` (you will -however, lose programs and messages on your home computer). - -The player can also purchase additional servers. This can be -done by visiting certain locations in the World, or it can be -done automatically through a script using the :js:func:`purchaseServer` -Netscript Function. The advantage of purchased servers is that, -in terms of RAM, they are cheaper than upgrading your home -computer. The disadvantage is that your purchased servers -are lost when you install Augmentations. - -Hackable Servers -^^^^^^^^^^^^^^^^ -Most servers that are not owned by the player can be hacked for money -and exp. See the :ref:`gameplay_hacking` page for more details. - -Different servers have different levels of security, but also offer -different rewards when being hacked. - -Server Connections -^^^^^^^^^^^^^^^^^^ -The servers are in a randomly organized tree-structure. The distance from -the home computer to each server is fixed, but the exact route to them is -randomized when you install :ref:`gameplay_augmentations`. In general the -further away from home computer a server is the higher it's statistics are. \ No newline at end of file diff --git a/doc/source/basicgameplay/stats.rst b/doc/source/basicgameplay/stats.rst deleted file mode 100644 index 0df67b5a9..000000000 --- a/doc/source/basicgameplay/stats.rst +++ /dev/null @@ -1,116 +0,0 @@ -.. _gameplay_stats: - -Stats -===== -The player has several stats that can be increased in order to progress -in the game. - -Hacking -^^^^^^^ -Represents the player's ability to code and hack. - -Affects: - -* Time it takes to hack a server -* Time it takes to execute the grow() and weaken() Netscript function -* Chance to successfully hack a server -* Percent money stolen when hacking a server -* Success rate of certain crimes -* Time it takes to create a program -* Faction reputation gain when carrying out Hacking Contracts or Field Work -* Company reputation gain for certain jobs - -Gain experience by: - -* Manually hacking servers through Terminal -* Executing hack(), grow(), or weaken() through a script -* Committing certain crimes -* Carrying out Hacking Contracts or doing Field work for Factions -* Working certain jobs at a company -* Studying at a university - -Strength -^^^^^^^^ -Represents the player's physical offensive power - -Affects: - -* Success rate of certain crimes -* Faction reputation gain for Security and Field Work -* Company reputation gain for certain jobs - -Gain experience by: - -* Committing certain crimes -* Working out at a gym -* Doing Security/Field Work for a faction -* Working certain jobs at a company - -Defense -^^^^^^^ -Represents the player's ability to withstand damage - -Affects: - -* Success rate of certain crimes -* The player's HP -* Faction reputation gain for Security and Field Work -* Company reputation gain for certain jobs - -Gain experience by: - -* Committing certain crimes -* Working out at a gym -* Doing Security/Field Work for a faction -* Working certain jobs at a company - -Dexterity -^^^^^^^^^ -Represents the player's skill and adeptness in performing certain tasks - -Affects: - -* Success rate of certain crimes -* Faction reputation gain for Security and Field Work -* Company reputation gain for certain jobs - -Gain experience by: - -* Committing certain crimes -* Working out at a gym -* Doing Security/Field Work for a faction -* Working certain jobs at a company - -Agility -^^^^^^^ -Represents the player's speed and ability to move - -Affects: - -* Success rate of certain crimes -* Faction reputation gain for Security and Field Work -* Company reputation gain for certain jobs - -Gain experience by: - -* Committing certain crimes -* Working out at a gym -* Doing Security/Field Work for a faction -* Working certain jobs at a company - -Charisma -^^^^^^^^ -Represents the player's social abilities - -Affects: - -* Success rate of certain crimes -* Faction reputation gain for Field Work -* Company reputation gain for most jobs - -Gain experience by: - -* Committing certain crimes -* Studying at a university -* Working a relevant job at a company -* Doing Field work for a Faction diff --git a/doc/source/basicgameplay/terminal.rst b/doc/source/basicgameplay/terminal.rst deleted file mode 100644 index 7e88889c8..000000000 --- a/doc/source/basicgameplay/terminal.rst +++ /dev/null @@ -1,652 +0,0 @@ -.. _terminal: - -Terminal -======== -The Terminal is a console emulator program that lets you interface with all of the -Servers in the game. The Terminal can be accessed by clicking the 'Terminal' tab -on the navigation menu on the left-hand side of the game (you may need to expand -the 'Hacking' header in order to see the 'Terminal' tab). Alternatively, the :ref:`keyboard -shortcut ` Alt + t can be used to open the Terminal. - -.. _terminal_filesystem: - -Filesystem (Directories) ------------------------- -The Terminal contains a **very** basic filesystem that allows you to store and -organize your files into different directories. Note that this is **not** a true -filesystem implementation. Instead, it is done almost entirely using string manipulation. -For this reason, many of the nice & useful features you'd find in a real -filesystem do not exist. - -Here are the Terminal commands you'll commonly use when dealing with the filesystem. - -* :ref:`ls_terminal_command` -* :ref:`cd_terminal_command` -* :ref:`mv_terminal_command` - -Directories -^^^^^^^^^^^ -In order to create a directory, simply name a file using a full absolute Linux-style path:: - - /scripts/myScript.js - -This will automatically create a "directory" called :code:`scripts`. This will also work -for subdirectories:: - - /scripts/hacking/helpers/myHelperScripts.js - -Files in the root directory do not need to begin with a forward slash:: - - thisIsAFileInTheRootDirectory.txt - -Note that there is no way to manually create or remove directories. The creation and -deletion of directories is automatically handled as you name/rename/delete -files. - -Absolute vs Relative Paths -^^^^^^^^^^^^^^^^^^^^^^^^^^ -Many Terminal commands accept both absolute and relative paths for specifying a -file. - -An absolute path specifies the location of the file from the root directory (/). -Any path that begins with the forward slash is an absolute path:: - - $ nano /scripts/myScript.js - $ cat /serverList.txt - -A relative path specifies the location of the file relative to the current working directory. -Any path that does **not** begin with a forward slash is a relative path. Note that the -Linux-style dot symbols will work for relative paths:: - - . (a single dot) - represents the current directory - .. (two dots) - represents the parent directory - - $ cd .. - $ nano ../scripts/myScript.js - $ nano ../../helper.js - -Netscript -^^^^^^^^^ -Note that in order to reference a file, :ref:`netscript` functions require the -**full** absolute file path. For example - -.. code:: javascript - - ns.run("/scripts/hacking/helpers.myHelperScripts.js"); - ns.rm("/logs/myHackingLogs.txt"); - ns.rm("thisIsAFileInTheRootDirectory.txt"); - -.. note:: A full file path **must** begin with a forward slash (/) if that file - is not in the root directory. - -Missing Features -^^^^^^^^^^^^^^^^ -These features that are typically in Linux filesystems have not yet been added to the game: - -* Tab autocompletion does not work with relative paths -* :code:`mv` only accepts full filepaths for the destination argument. It does not accept directories - -Commands --------- - -alias -^^^^^ - - $ alias [-g] [name="value"] - -Create or display aliases. An alias enables a replacement of a word with another -string. It can be used to abbreviate a commonly used command, or commonly used -parts of a command. The NAME of an alias defines the word that will be -replaced, while the VALUE defines what it will be replaced by. For example, -you could create the alias 'nuke' for the Terminal command 'run NUKE.exe' -using the following:: - - $ alias nuke="run NUKE.exe" - -Then, to run the NUKE.exe program you would just have to enter 'nuke' in -Terminal rather than the full command. It is important to note that 'default' -aliases will only be substituted for the first word of a Terminal command. For -example, if the following alias was set:: - - $ alias worm="HTTPWorm.exe" - -and then you tried to run the following terminal command:: - - $ run worm - -This would fail because the worm alias is not the first word of a Terminal -command. To allow an alias to be substituted anywhere in a Terminal command, -rather than just the first word, you must set it to be a global alias using the -g flag:: - - $ alias -g worm="HTTPWorm.exe" - -Now, the 'worm' alias will be substituted anytime it shows up as an individual word in -a Terminal command. - -Entering just the command 'alias' without any arguments prints the list of all -defined aliases in the reusable form 'alias NAME=VALUE' on the Terminal. - -The :ref:`unalias_terminal_command` Terminal command can be used to remove aliases. - -.. _analyze_terminal_command: - -analyze -^^^^^^^ - -Prints details and statistics about the current server. The information that is -printed includes basic server details such as the hostname, whether the player -has root access, what ports are opened/closed, and also hacking-related information -such as an estimated chance to successfully hack, an estimate of how much money is -available on the server, etc. - -backdoor -^^^^^^^^ - -Installs a backdoor on the current server. Root access is required to do this. - -Servers will give different bonuses when you install a backdoor. -This can pass faction tests or give bonuses such as discounts from companies. - -buy -^^^ - - $ buy [-l/-a/program] - -Purchase a program through the Dark Web. Requires a TOR Router to use. - -If this command is ran with the '-l' flag, it will display a list of all programs -that can be purchased through the Dark Web, as well as their costs. - -If this command is ran with the '-a' flag, it will attempt to buy all programs -that can be purchased through the Dark Web and if the player can't afford all of them -none will be bought. - -Otherwise, the name of the program must be passed in as a parameter. This name -is NOT case-sensitive:: - - $ buy brutessh.exe - -Note that you do not need to be connected to the actual dark web server in order -to run this command. You can use this command at any time on the Terminal. - -cat -^^^ - - $ cat [filename] - -Display a message (.msg), literature (.lit), or text (.txt) file:: - - $ cat j1.msg - $ cat foo.lit - $ cat servers.txt - -.. _cd_terminal_command: - -cd -^^ - - $ cd [dir] - -Change to the specified directory. - -See :ref:`terminal_filesystem` for details on directories. - -Note that this command works even for directories that don't exist. If you change -to a directory that doesn't exist, it will not be created. A directory is only created -once there is a file in it:: - - $ cd scripts/hacking - $ cd /logs - $ cd .. - -check -^^^^^ - - $ check [script name] [args...] - -Print the logs of the script specified by the script name and arguments to the Terminal. -Each argument must be separated by a space. -**Remember that a running script is uniquely identified both by its name and the arguments that are used to start it**. So, -if a script was ran with the following arguments:: - - $ run foo.js 1 2 foodnstuff - -Then to run the 'check' command on this script you would have to pass the same arguments in:: - - $ check foo.js 1 2 foodnstuff - -clear/cls -^^^^^^^^^ - - -Clear the Terminal screen, deleting all of the text. Note that this does not -delete the user's command history, so using the up and down arrow keys is -still valid. Also note that this is permanent and there is no way to undo this. -Both 'clear' and 'cls' do the same thing:: - - $ clear - $ cls - -.. _connect_terminal_command: - -connect -^^^^^^^ - - $ connect [hostname/ip] - -Connect to a remote server. The hostname of the remote server must -be given as the argument to this command. Note that only servers that are immediately -adjacent to the current server in the network can be connected to. To see which -servers can be connected to, use the 'scan' command. - -download -^^^^^^^^ - -Downloads a script or text file to your computer (your real-life computer):: - - $ download masterScript.script - $ download importantInfo.txt - -You can also download all of your scripts/text files as a zip file using the following -Terminal commands:: - - $ download * - $ download *.script - $ download *.txt - -expr -^^^^ - - $ expr [math expression] - -Evaluate a mathematical expression. The expression is evaluated in JavaScript, -and therefore all JavaScript operators should be supported. - -Examples:: - - $ expr 5.6 * 10 - 123 - $ expr 3 ** 3 - - -free -^^^^ - -Display's the memory usage on the current machine. Print the amount of RAM that -is available on the current server as well as how much of it is being used. - -hack -^^^^ - -Attempt to hack the current server. Requires root access in order to be run. - -Related: Hacking Mechanics :ref:`hacking` - -help -^^^^ - - $ help [command] - -Display Terminal help information. Without arguments, 'help' prints a list of all -valid Terminal commands and a brief description of their functionality. You can -also pass the name of a Terminal command as an argument to 'help' to print more -detailed information about the Terminal command. Examples:: - - $ help alias - $ help scan-analyze - -.. _home_terminal_command: - -home -^^^^ - -Connect to your home computer. This will work no matter what server you are currently connected to. - -hostname -^^^^^^^^ - -Prints the hostname of the server you are currently connected to. - -kill -^^^^ - - $ kill [script name] [args...] - $ kill [pid] - -Kill the script specified by the script filename and arguments OR by its PID. If -filename and arguments are used the kill is server-specific, so if you're connected -to home and want to kill a script running on n00dles, you have to either use it's PID -or :code:`connect` to n00dles first and then use the the kill command. - -If you are killing the script using its filename and arguments, then each argument -must be separated by a space. Remember that a running script is identified -by both its name and the arguments that are used to start it. So, if a script -was ran with the following arguments:: - - $ run foo.js 50e3 sigma-cosmetics - -Then to kill this script the same arguments would have to be used:: - - $ kill foo.js 50e3 sigma-cosmetics - -If there are multiple copies of a script running with the same arguments, all -of them will be killed. - -If you are killing the script using its PID, then the PID argument must be numeric. - -killall -^^^^^^^ - -Kills all scripts on the current server. - -.. _ls_terminal_command: - -ls -^^ - - $ ls [dir] [--grep pattern] - -Prints files and directories on the current server to the Terminal screen. - -If this command is run with no arguments, then it prints all files and directories on the current -server to the Terminal screen. Directories will be printed first in alphabetical order, -followed by the files (also in alphabetical order). - -The :code:`dir` optional parameter allows you to specify the directory for which to display -files. - -The :code:`--grep pattern` optional parameter allows you to only display files and directories -with a certain pattern in their names. - -The :code:`-l` optional parameter allows you to force each item onto a single line. - -Examples:: - - // List files/directories with the '.script' extension in the current directory - $ ls -l --grep .script - - // List files/directories with the '.js' extension in the root directory - $ ls / -l --grep .js - - // List files/directories with the word 'purchase' in the name, in the 'scripts' directory - $ ls scripts -l --grep purchase - - -lscpu -^^^^^ - -Prints the number of CPU cores the current server has. - -.. _mem_terminal_command: - -mem -^^^ - - $ mem [script name] [-t] [num threads] - -Displays the amount of RAM needed to run the specified script with a single -thread. The command can also be used to print the amount of RAM needed to run -a script with multiple threads using the '-t' flag. If the '-t' flag is -specified, then an argument for the number of threads must be passed in -afterwards. Examples:: - - $ mem foo.js - $ mem foo.js -t 50 - -The first example above will print the amount of RAM needed to run 'foo.js' -with a single thread. The second example above will print the amount of RAM needed -to run 'foo.js' with 50 threads. - -.. _mv_terminal_command: - -mv -^^ - - $ mv [source] [destination] - -Move the source file to the specified destination in the filesystem. -See :ref:`terminal_filesystem` for more details about the Terminal's filesystem. -This command only works for scripts and text files (.txt). It cannot, however, be used -to convert from script to text file, or vice versa. - -This function can also be used to rename files. - -.. note:: Unlike the Linux :code:`mv` command, the *destination* argument must be the - full filepath. It cannot be a directory. - -Examples:: - - $ mv hacking.script scripts/hacking.script - $ mv myScript.js myOldScript.js - -nano -^^^^ - - $ nano [filename] - -Opens up the specified file in the Text Editor. Only scripts (.script, .js) and -text files (.txt) can be edited. If the file does not already exist, then a new -empty file will be created. - -ps -^^ - - $ ps [-g, --grep pattern] - -Prints all scripts that are currently running on the current server. -The :code:`-g, --grep pattern` option will only output running scripts where the name matches the provided pattern. - -rm -^^ - - $ rm [filename] - -Removes the specified file from the current server. This works for every file type -except literature files (.lit). - -**WARNING: This is permanent and cannot be undone** - - -.. _run_terminal_command: - -run -^^^ - - $ run [file name] [-t] [num threads] [args...] - -Execute a program, script, or :ref:`codingcontracts`. - -The '[-t]', '[num threads]', and '[args...]' arguments are only valid when -running a script. The '-t' flag is used to indicate that the script should -be run with the specified integer number of threads. If the flag is omitted, -the script will be run with a single thread by default. If the '-t' flag is -used, then it MUST come immediately after the script name, and the -[num threads] argument MUST come immediately afterwards. - -[args...] represents a variable number of arguments that will be passed into -the script. See the documentation about script arguments. Each specified -argument must be separated by a space. - -**Examples** - -Run a program:: - - $ run BruteSSH.exe - -Run *foo.js* with 50 threads and the arguments [1e3, 0.5, foodnstuff]:: - - $ run foo.js -t 50 1e3 0.5 foodnstuff - -Run a Coding Contract:: - - $ run foo-contract.cct - -scan -^^^^ - -Prints all immediately-available network connections. This will print a list -of all servers that you can currently connect to using the 'connect' Terminal command. - - -.. _scan_analyze_terminal_command: - -scan-analyze -^^^^^^^^^^^^ - - $ scan-analyze [depth] - -Prints detailed information about all servers up to *[depth]* nodes away on the -network. Calling 'scan-analyze 1' will display information for the same servers -that are shown by the 'scan' Terminal command. This command also shows the -relative paths to reach each server. - -By default, the maximum depth that can be specified for 'scan-analyze' is 3. -However, once you have the *DeepscanV1.exe* and *DeepscanV2.exe* programs, you can -execute 'scan-analyze' with a depth up to 5 and 10, respectively. - -The information 'scan-analyze' displays about each server includes whether or -not you have root access to it, its required hacking level, the number of open -ports required to run NUKE.exe on it, and how much RAM it has. When used the -information is structured like: - - n00dles - --Root Access: YES, Required hacking skill: 1 - --Number of open ports required to NUKE: 0 - --RAM: 4.00GB - - ----zer0 - ------Root Access: NO, Required hacking skill: 75 - ------Number of open ports required to NUKE: 1 - ------RAM: 32.00GB - - foodnstuff - --Root Access: NO, Required hacking skill: 1 - --Number of open ports required to NUKE: 0 - --RAM: 16.00GB - -In this case :code:`n00dles` and :code:`foodnstuff` are connected to the current server -and :code:`zer0` is connected to :code:`n00dles`. - -.. _scp_terminal_command: - -scp -^^^ - - $ scp [script name] [target server] - -Copies the specified script from the current server to the target server. -The second argument passed in must be the hostname or IP of the target server. - -sudov -^^^^^ - -Prints whether or not you have root access to the current server. - -.. _tail_terminal_command: - -tail -^^^^ - - $ tail [pid] - or - $ tail [script name] [args...] - -Displays dynamic logs for the script specified by PID or the script name and arguments. -Each argument must be separated by a space. Remember that a running script is -identified by both its name and the arguments that were used to run -it. So, if a script was ran with the following arguments:: - - $ run foo.js 10 50000 - -Then in order to check its logs with 'tail' the same arguments must be used:: - - $ tail foo.js 10 50000 - -top -^^^ - -Prints a list of all scripts running on the current server as well as their -thread count and how much RAM they are using in total. - -.. _unalias_terminal_command: - -unalias -^^^^^^^ - - $ unalias "[alias name]" - -Deletes the specified alias. Note that the double quotation marks are required. - -As an example, if an alias was declared using:: - - $ alias r="run" - -Then it could be removed using:: - - $ unalias "r" - -It is not necessary to differentiate between global and non-global aliases when using 'unalias' - -wget -^^^^ - - $ wget [url] [target file] - -Retrieves data from a url and downloads it to a file on the current server. -The data can only be downloaded to a script (.script, .js) or a text file -(.txt). If the target file already exists, it will be overwritten by this command. - -Note that will not be possible to download data from many websites because they -do not allow cross-origin resource sharing (CORS). This includes websites such -as gist and pastebin. One notable site it will work on is rawgithub. Example:: - - $ wget https://raw.githubusercontent.com/bitburner-official/bitburner-src/master/README.md game_readme.txt - -Argument Parsing ----------------- -When evaluating a terminal command, arguments are initially parsed based on whitespace (usually spaces). -Each whitespace character signifies the end of an argument, and potentially the start -of new one. For most terminal commands, this is all you need to know. - -When running scripts, however, it is important to know in more detail how arguments are parsed. -There are two main points: - -1. Quotation marks can be used to wrap a single argument and force it to be parsed as - a string. Any whitespace inside the quotation marks will not cause a new argument - to be parsed. -2. Anything that can represent a number is automatically cast to a number, unless its - surrounded by quotation marks. - -Here's an example to show how these rules work. Consider the following script `argType.js`:: - - export async function main(ns) { - ns.tprint("Number of args: " + ns.args.length); - for (var i = 0; i < ns.args.length; ++i) { - ns.tprint(typeof ns.args[i]); - } - } - -Then if we run the following terminal command:: - - $ run argType.js 123 1e3 "5" "this is a single argument" - -We'll see the following in the Terminal:: - - Running script with 1 thread(s) and args: [123, 1000, "5", "this is a single argument"]. - May take a few seconds to start up the process... - argType.js: Number of args: 4 - argType.js: number - argType.js: number - argType.js: string - argType.js: string - -Chaining Commands ------------------ -You can run multiple Terminal commands at once by separating each command -with a semicolon (;). - -Example:: - - $ run foo.js; tail foo.js - -This does *not* wait for commands with a delay to finish executing, so it -generally doesn't work with things like :code:`hack`, :code:`wget`, etc. diff --git a/doc/source/basicgameplay/world.rst b/doc/source/basicgameplay/world.rst deleted file mode 100644 index 26840df4a..000000000 --- a/doc/source/basicgameplay/world.rst +++ /dev/null @@ -1,16 +0,0 @@ -.. _gameplay_world: - -World -===== -In Bitburner, the world consists of six different cities: - -* Sector-12 (this is where you start out) -* Aevum -* Ishima -* New Tokyo -* Chongqing -* Volhaven - -Each city has it's own map and :ref:`faction`. Each city also -offers different services, such as gyms, universities, hardware -stores and places of work. \ No newline at end of file diff --git a/doc/source/changelog.rst b/doc/source/changelog.rst deleted file mode 100644 index e10957e8a..000000000 --- a/doc/source/changelog.rst +++ /dev/null @@ -1,3897 +0,0 @@ -.. _changelog: - -Changelog -========= - -v2.3.1 - Bugfixes 7 June 2023 ------------------------------ - -NETSCRIPT: - -* Added ns.setTitle, which sets the titlebar of a script's tail window (@d0sboots) -* Added ns.getFunctionRamCost, which gets the ramcost of a netscript function (@G4mingJon4s) -* ns.ls results will filter as if the filenames have a leading slash (@Snarling) - -GENERAL / MISC: - -* Changed tail window buttons into icon buttons, allow setting custom title, and tail window bugfixes. (@d0sboots) -* Terminal no longer scrolls to the bottom constantly while an action is being performed (@bezrodnov) -* Added a close button to modals (@bezrodnov) -* Fixed several issues with script editor tabs (@bezrodnov) -* scp terminal command can copy multiple files at once, like help text indicates (@Snarling) -* Root directory is no longer displayed as ~ in the terminal prompt, it is displayed as / (@Snarling) -* cd with no arguments will change to the root directory (@Snarling) -* Documentation updates (various) -* Nerf noodle bar - -HOTFIXES (these were already backported to 2.3.0 before 2.3.1 release): - -* Several important fixes for savegame migration issues from older version (@d0sboots) -* Prevent scripts from loading during intial migration to 2.3.0 save format, to prevent a crash that could occur. (@Snarling) -* Fix scp logging (hostname was being logged incorrectly in multiple places and showing as [Object object]) (@Snarling) -* Update terminal parsing logic so that the old syntax for alias works again. (@Snarling) -* Fix clickable script links from ls command not working outside root directory (@Snarling) -* Fix an issue with Find All Valid Math Expressions not accepting empty array when that was the solution. (@Snarling) -* Fix an issue with scan-analyze display when the player had AutoLink.exe (@Snarling) -* Reverted undocumented change that program filenames were case sensitive for ns.fileExists. They are case insensitive again. (@Snarling) -* An issue from pre-2.3 could cause scripts to have the wrong "server" property. This caused issues in 2.3, and a fix now repairs any scripts with a mismatched server property. (@Snarling) -* More fixes to help old savegames load correctly (@Snarling) -* Servers can no longer have infinite time-to-hack. (@Snarling) - -SPOILER SECTIONS: - -SF2: - -* Overall gang respect gain rate now reads accurately, instead of showing ~10x. (@Snarling) - -SF3: - -* Added "maxProducts" property to ns.corporation.getDivision return value (@kateract) -* Fixed an issue with sell price parsing for materials (@zerbosh) -* Fixed display of market price for materials and products (@zerbosh) -* Fixes for Corp import/export issues, such as -IPROD and Smart Supply not working right (@d0sboots) -* Improvements to the max-affordable-upgrades calculation (@bezrodnov) -* Perform additional validation when setting up an export. Exports are now unique per targeted division+city. (@Snarling) -* ns.corporation.cancelExport no longer requires the exported amount (@Snarling) -* Fix NaN bug that could impact Robot material in Robotics division (@Snarling, @kateract) -* Can no longer commence product development in a city with no office (which would immediately error out the game loop) (@Snarling) -* (Hotfix) Fix issue that could lead to SF3 research desync. (@Snarling) -* (Hotfix) Fix SF3 "Spring Water" industry (@Snarling) - -SF4: - -* Fixed an issue that could cause singularity run-after-reset callback scripts to not launch correctly (@Snarling) - - -v2.3.0 - SF3 rework and performance improvements (25 May 2023) --------------------------------------------------------------- - -BREAKING CHANGES: These changes may require changes to your scripts. - -* Major changes to the SF3 mechanic. See the related section below for more detailed info on the changes. -* The same script filename can now be ran multiple times with the same args. If running a script from another script (ns.run/ns.exec/etc), this limitation can be re-imposed with the preventDuplicates RunOption (see general section for info on RunOptions). -* The same .js script will now be the same js module whether the script was ran directly or used as an import. This means top-level variables (variables defined outside of any function) are shared across all instances of the script. -* The js module for a script will also be reused by any script that has the exact same compiled text, even if that script is on another server or has a different filename. This can lead to unexpected results when using top-level variables. -* Some properties removed from ns.getPlayer and added to a separate function ns.getResetInfo. These are still accessible from getPlayer but will produce a warning message the first time they are accessed per game session. -* hackAnalyzeThreads now returns -1, instead of 0, when no money can be hacked from the targeted server. -* ns.iKnowWhatImDoing has been removed, replaced by ns.tprintRaw for printing custom react content to the terminal (limited support). - -PERFORMANCE: - -* Minimize impact of unavoidable memory leak when modules are created, by reusing modules as much as possible (@d0sboots) -* Internal data structure changes (@d0sboots, @Snarling) -* Fix memory leak when initializing large number of netscript ports (@Snarling) -* Improve performance while on the Active Scripts page if many scripts are starting/ending. (@d0sboots) - -NETSCRIPT GENERAL: - -* Remove requirement for script args to be unique. This was also related to performance improvements. (@d0sboots) -* ns.hackAnalyzeThreads no longer indicates infinity any time a single thread would hack less than $1 (@Snarling) -* ns.renamePurchasedServer no longer crashes if player is connected to the server being renamed (@Snarling) -* ns.hackAnalyzeThreads now return -1 (instead of 0) if no money can be hacked from the targeted server. (@d0sboots) -* Fix a possible infinite atExit loop if a script killed itself. (@Snarling) -* Static timestamps of last resets can be obtained via ns.getResetInfo, replacing playtimeSinceLastX from ns.getPlayer (@G4mingJon4s) -* Improved support for printing react content directly to the terminal (ns.tprintRaw) or to a script log (ns.printRaw). -* Added RunOptions, which can optionally replace the "threads" argument for ns.run/ns.exec/ns.spawn. (@d0sboots) - * RunOptions.threads: Provide a thread count (since RunOptions can replace the threads argument) - * RunOptions.temporary: Prevents the script execution from being included in the save file. - * RunOptions.ramOverride: Provide a static ram cost for the script to override what is calculated by the game. Dynamic ram checking is still enforced. - * RunOptions.preventDuplicates: Fail to launch the script if the args are identical to a script already running. - -GENERAL / MISC: - -* Fixed a bug that could cause the overview skill bars to become desynced (@d0sboots) -* There is now an autoexec setting to specify a script on home to automatically run when loading the game. (@d0sboots) -* Monaco script editor updated to a newer version and has more config options available now. (@Snarling) -* Improve Electron's handling of external links (@Snarling) -* Improved support for ANSI color codes (@d0sboots) -* Improved consistency of file paths. Correct names for files no longer start with a / even if they are in a directory. (@Snarling) -* All Math Expressions contract no longer accepts wrong answers (@Snarling) -* Faction invites now trigger immediately when backdooring a server. (@Snarling) -* Fixed issue where duplicate programs could be created. (@Minzenkatze) -* UI improvements to create program page (@Minzenkatze) -* Fix inconsistency in skill xp to skill level conversion (@hydroflame) -* Updated blood donation counter to reflect number of confirmed blood donations. (@hydroflame) -* Minor improvements to ram calculation process (@Snarling) -* Improved terminal arguments detection (@Snarling) -* Improved display for ls terminal command. (@Snarling) -* Added more internal tests and improved test quality (@d0sboots) -* Various codebase improvements (@Snarling, @d0sboots) -* Documentation improvements (Many contributors) -* Nerf noodle bar - -SPOILER SECTIONS: - -SF2: - -* Corrected the "Next equipment unlock" text for member upgrades. (@LiamGeorge1999) - -SF3: - -* Many Corporation API changes, due to functionality changes and due to property name changes. See documentation for correct usage. -* Can now have multiple divisions within the same industry. (@Mughur) -* Can now sell a division or sell the entire corporation. (@Mughur) -* Product quality now depends on material quality (@Mughur) -* Product price can be set separately per-city (@Mughur) -* Exports can be set relative to inventory or production (@Mughur) -* ns.corporation.getProduct is city-specific (@Mughur) -* Bulk purchasing is available from the start (@Mughur) -* Can buy multiple upgrades at a time, similar to hacknet node upgrades (@Mughur) -* Various UI changes (@Mughur) -* Removed happiness from employees (@Mughur) -* Coffee renamed to tea (@Mughur) -* Training position renamed to intern (@Mughur) -* More options for SmartSupply (@Mughur) -* Advertising nerf (@Mughur) -* Nerfed investors and reduced effectiveness of "fraud" (@Mughur) -* Fixed React errors, renamed most corp object properties (@Snarling) -* Various other changes (@Mughur, @Snarling) - -SF4: - -* Faction invites trigger immediately when running ns.singularity.getFactionInvitations (@Snarling) -* Added ns.singularity.getCompanyPositionInfo (@jeek) - -SF6: - -* Failing a contract or operation now consumes the action (@Zelow79) - -SF9: - -* The SF9.3 bonus is also given to the player when inside of BN9. (@Zelow79) -* Adjusted the SF1 bonus for hacknet costs (slight nerf), and raised the SF9 bonus to compensate. (@d0sboots) -* Added option to purchase company favor using hashes. (@jeek) - -SF10: - -* Sleeve shock recovery now scales with intelligence. (@Tyasuh) -* Sleeve kills during crimes count towards numPeopleKilled (@Zelow79) -* Fix a misspelled moneySourceTracker call for sleeves (@zerbosh) -* ns.sleeve.getTask return value now includes cyclesNeeded where applicable (@Snarling) -* Internal type refactoring on Sleeve Work. (@Snarling) - -SF12: - -* Fix inconsistency in how BN12 multipliers were calculated - -SF13: - -* Improve performance of Stanek's gift update cycle, and rework (buff) bonus time handling. (@Snarling) - - -v2.2.2 - 21 Feb 2023 --------------------- - -PLANNED 2.3 BREAKING CHANGES: - -* 2.3 will include a large planned rework to corporation. This may cause api breaks for any corporation scripts, and there will be large changes in how the corporation mechanic functions. - -NETSCRIPT API: - -* Added ns.formatNumber, ns.formatRam, and ns.formatPercent, which allow formatting these types of numbers the same way the game does (@Snarling, See UI section). -* Deprecated ns.nFormat. Likely to be removed in 2.3. Now just directly wraps numeral.format (@Snarling) -* EXPERIMENTAL CHANGE (may be reverted next patch): BasicHGWOptions now allows specifying a number of additionalMsec. This should allow easier and more reliable coordination - of completion times for hack, grow, and weaken. Since this is an experimental change, be prepared for a possible API break next patch if you use this functionality. (@d0sboots) - -* Corporation API: - - * Fix bugs with ns.corporation.setAutoJobAssignment. (@zerbosh and @croy) - -* Formulas API: - - * Added ns.formulas.hacking.growThreads function (@d0sboots) - -* Sleeve API: - - * ns.sleeve.getTask now also includes cyclesWorked for the task types where this applies. (@Zelow79) - * Added ns.sleeve.setToIdle function (@Zelow79) - -* Unsupported API: - - * Added ns.printRaw - allows printing custom React content to script logs. Use at your own risk, misuse is very likely to cause a crash. (@d0sboots) - -ELECTRON (STEAM) VERSION: - -* Fix security issue where player scripts were allowed to access any part of the player's filesystem. Now access is limited to the game's 'dist' folder. (@Snarling) - -SCRIPTS: - -* Fix an issue where multiple copies of the same script could be launched with same args/same server (@Mughur) -* Followup changes to API wrapping from 2.2.1 changes. (@d0sboots) - -UI: - -* Add new number formatting code to replace internal use of unmaintained package numeral.js. Added several Numeric Display options. (@Snarling) -* Removed ingame donation section. (@hydroflame) -* Improve some bladeburner number formatting (@Zelow79) -* Added IronMan theme (@MattiYT) -* Factions that have not been joined yet will show how many unowned augments they have available. (@Zelow79) -* Added more features to dev menu (@Zelow79 and @Snarling) - -CORPORATION: - -* Reverted previous change to employee needs. Now they will trend up on their own again. (@d0sboots) -* Improvements to how Market TA II works (@d0sboots) -* ns.corporation.getOffice return value now includes a totalExperience property. (@Snarling) - -HACKNET: - -* Hacknet servers are now named hacknet-server-# instead of hacknet-node-#. (@Tyasuh) -* Fix bug related to renaming hacknet servers (@Mughur) - -GRAFTING: - -* Bladeburner augs can be grafted if player is in Bladeburner faction (@Tyasuh) - -DOCUMENTATION - -* Many documentation updates (@Mughur, @d0sboots, @Snarling, @teauxfu). -* Official non-markdown docs are at http://bitburner-official.readthedocs.io/ -* Official dev version markdown docs are at https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.ns.md -* Official stable version markdown docs are at https://github.com/bitburner-official/bitburner-src/blob/stable/markdown/bitburner.ns.md -* Dev version documentation is now kept up to date as changes are made. (@Snarling) - -CODEBASE: - -* Updated many dependencies (@d0sboots) -* Updated lots of the build processes and GitHub workflows. (@Snarling) -* Internal refactoring of how BitNode multipliers are stored (@d0sboots) -* Added some extra helper function (useRerender hook, positiveInteger ns argument validator). (@Snarling) - -MISC: - -* Nerf noodle bar - - -v2.2.1 Hotfixes ---------------- - -Hotfix / bugfix: - -* (@d0sboots) Implemented a new API wrapping solution that prevents the need for binding functions to ns when placing them in a new variable, but maintains and perhaps improves upon the performance gains from the previous v2.2.0 changes. -* Fixed some issues with savegames failing to load, or causing the main engine loop to stall after load. -* Fixed an issue where .script files were not receiving the correct args when ran -* Fixed an issue with sleeve HP calculation -* Possible fix for MathJax "Typesetting Failed" errors -* There was an issue with Corporations decaying their employees to 0 stats, even though the minimum was supposed to be 5. Moved the variable storing the min decay value to corporation constants, and raised it to 10. -* Regenerated documentation at https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.ns.md due to corporation changes related to min decay stats. -* Faction XP was unintentionally providing 20x the experience gain as it did prior to v2.0. This caused faction work to exceed gym/university as the optimal way to gain experience. Values have been reduced to only about 2x what they were prior to v2.0, and they are no longer better than gym/university. -* Fixed an issue where the overview skill bars could be displayed inaccurately based on player multipliers. - - -v2.2.0 - Jan 2 2023 Development Reboot --------------------------------------- - -Dev notes - -* The previous main developer, hydroflame, is stepping back from this project for the foreseeable future. To facilitate this, we've moved the repo to a new location at https://github.com/bitburner-official/bitburner-src. -* Sorry for the large number of API breaks in this version. To ease the pain here, attempting to use any of the removed functions will provide an error guiding you to the new replacement function to use instead. - -BREAKING API CHANGES: - -* No longer applicable as of v2.2.1! (ns2 only) ns functions use the 'this' value from ns: if you move the function to its own variable off of ns, it needs to be bound to ns. The internal changes that make this necessary led to very large performance gains for running many scripts at once. e.g.: - - const tprint1 = ns.tprint; // This doesn't work and will error out when calling tprint1(); - - const tprint = ns.tprint.bind(ns); // This works because the 'this' value is preserved. -* ns.getPlayer no longer provides properties tor, inBladeburner, or hasCorporation. This information can be looked up using standlone functions: ns.hasTorRouter(), ns.bladeburner.inBladeburner(), ns.corporation.hasCorporation(). -* Removed many functions, with replacement ways to get the same info. - * getServerRam: use getServerMaxRam and getServerUsedRam instead. - * corporation.assignJob: use setAutoJobAssignment instead. - * corporation.getEmployee: No longer available (employees are not individual objects). - * corporation.getExpandCityCost: use ns.corporation.getConstants().officeInitialCost - * corporation.getExpandIndustryCost: use getIndustryData instead. - * corporation.getIndustryTypes: use ns.corporation.getConstants().industryNames - * corporation.getMaterialNames: use ns.corporation.getConstants().materialNames - * corporation.getPurchaseWarehouseCost: use ns.corporation.getConstants().warehouseInitialCost - * corporation.getResearchNames: use ns.corporation.getConstants().researchNames - * corporation.getUnlockables: use ns.corporation.getConstants().unlockNames - * corporation.getUpgradeNames: use ns.corporation.getConstants().upgradeNames - * formulas.work.classGains: split into universityGains and gymGains - * singularity.getAugmentationCost: use getAugmentationPrice and getAugmentationRepReq instead - * sleeve.getSleeveStats: use getSleeve instead - * sleeve.getInformation: use getSleeve instead - -* An error dialog will inform the player of the above API changes if the player tries to use one of the removed functions above. -* enums.toast was renamed ToastVariant to provide consistency with internal code. - -* codingcontract.attempt always returns a string (empty string for a failed attempt). This may break player code if a direct boolean comparison (e.g. 'attemptResult === true') was being made. The string can be used directly as the conditional, because empty string evaluates to false as a boolean. - -* corporation.getCorporation().divisions now returns an array of division names, instead of division objects. Use corporation.getDivision(name) to get the division info object. - -DEVELOPMENT - -* Development repo moved to https://github.com/bitburner-official/bitburner-src -* Dev version available on web at https://bitburner-official.github.io/bitburner-src/ -* Development is active again for non-bugfix. -* A bunch of fixes, setup, and assistance related to moving to a new repo (@hydroflame) - -TUTORIAL - -* Removed NS1/NS2 selection. Tutorial now only references .js files (NS1 is essentially deprecated) (@Mughur) -* Fix Ram Text (by @jaculler) - -NETSCRIPT - -* Base NS API: - * More enums and more types are exposed to the player instead of "magic strings", as type documentation and on ns.enums. - * Added ns.pid property to access a script's PID without a function call. (@jeek) - * Much faster API wrapping on script launch. (@d0sboots) To support this, ns functions need to keep their "this" value from their parent object. - * tFormat: Fix display for negative time - * ns.getPlayer: removed tor, inBladeburner, and hasCorporation properties - * Added ns.hasTorRouter() function. -* Coding Contract API - * ns.codingcontract.attempt always returns a string. (@Snarling) -* Corporation API - * Removed ns.corporation.getEmployee and ns.corporation.assignJob, due to employees no longer being objects. - * Added ns.corporation.hasCorporation() - * Reworked how ram costs are applied for corporation. -* Formulas API - * ns.formulas.work.classGains removed, replaced with ns.formulas.work.universityGains and ns.formulas.work.gymGains (@Snarling) - * Add ns.formulas.work.companyGains function (@AlexeyKozhemiakin) -* Ports - * added portHandle.nextWrite() (@LJNeon) - * Make ns.writePort synchronous (@Snarling) -* Sleeve API - * ns.sleeve.getSleeve added. getPlayer and getSleeve can both be used for formulas. (@Snarling) - * getSleeve also includes storedCycles (i.e. bonusTime) (@zerbosh) -* Stock API - * ns.stock.getOrganization added for getting org from stock symbol (@SamuraiNinjaGuy) - -SCRIPTS - -* Fixed bug where zombie scripts could be created after a soft reset (@Snarling) -* Scripts now have a maximum ram cost of 1024GB per thread. - -SCRIPT LOGS - -* Add ctrl-a support for selecting all text in tail window (@Snarling) - -CORPORATION - -* Remove corp employees as objects (by @Kelenius) -* API access is provided automatically if the player is in BN3. (@zerbosh) -* Happiness/Energy/Morale trend down even for productive corps (by @Snarling) -* Typo fixes in modals to sell materials and products (by @quacksouls) -* Reworked MP formula validation to prevent possible save corruption on invalid entry (by @Snarling) -* Internal reorganization of Industry data (by @Snarling) -* Added check to material buy amount (by @G4mingJon4s) -* Check there is room to make a new product before opening popup. (by @G4mingJon4s) -* Fix typos in research descriptions (by @quacksouls) - -SLEEVE - -* Fixed inconsistencies in how sleeve work rewards are handled. (by @Snarling) -* Fix bug that prevented selecting some crimes from UI. (by @Snarling) -* Internally shock starts at 100 and lowers to 0. Previously this was backwards. - -STOCKMARKET - -* Fix broken initializer when manually buying WSE access (by @Snarling) - -TERMINAL - -* Added changelog command to re-display the changelog dialog. -* Connect command will connect to player owned servers from anywhere. (by @Snarling) - -UI - -* Improve UI performance of sidebar and character overview using memoization (@d0sboots) -* Other UI additions / improvements (@Mughur, @d0sboots, probably others) -* Fixed spacing of text in Trade for reputation button after Infiltration (by @PyroGenesis) -* Fix spacing on ANSI background escape codes (by @Snarling) -* Fix several instances where newlines were not being displayed properly (by @quacksouls) -* SoftResetButton.tsx Tooltip changed to make more sense (by @rai68) -* GANG: Fix Gang UI to correctly report the bonus time multiplier as 25x (by @TheMas3212) -* Change formatting for skill levels to use localeStr (@G4mingJon4s) - -DOC - -* Fix incorrect examples for grow (by @quacksouls) -* Updated limitMaterialProduction() and limitProductProduction() documentation to mention removing limits. (by @PyroGenesis) -* Add ns documentation for possible sleeve tasks (by @Snarling) -* Update documentation for workForFaction and workForCompany (by @quacksouls) -* Improve CCT documentation for HammingCodes (by @quacksouls) -* cleanup in doc of Netscript functions (by @quacksouls) -* Various other doc fixes (by @quacksouls) -* Update documentation for ns.args (by @Snarling) -* De-uglify ns.print examples (by @LJNeon) - -STATS - -* Fix logic for increasing HP based on defense skill levels (by @mattgarretson) -* Fix a bug where HP could be something other than max after a bitnode reset. - -INFILTRATION - -* Fix SlashGame scaling. (by @Snarling) - -GANG - -* When starting a gang, any in progress work with that faction will end. (@G4mingJon4s) - -MISC - -* Lots of typesafety improvements with internal code -* Remove google analytics (@hydroflame) -* Some error handling streamlining (by @Snarling) -* fix: check both ts and js source now (by @Tanimodori) -* chore: sync version in package-lock.json (by @Tanimodori) -* Better safety when loading game for multiple save corruption issues (by @Snarling) -* Nerf Noodle bar - - -v2.1.0 - 2022-09-23 Remote File API ------------------------------------ - -Dev note - -* The most important change about this update is the introduction of the Remote File API (RFA). - With this we also deprecate the HTTP file API and the Visual Studio extension. Those things - were made during the rush of Steam and aren't well thought out. This new process works with - both the web and Steam version of the game and every text editor. Moving forward we also - won't be doing much, if any, upgrades to the in-game editor. We think it's good enough for - now and if you need more we recommend you hook up your favorite external editor. - ---- NEW FEATURES --- - -* New Remote File API for transmitting files to the game (by @Hoekstraa) -* Added a new Augmentation, Z.O.Ë., which allows Sleeves to benefit from Stanek. - ---- FIXES --- - -API - -* Remove incorrectly placed 's' in ns.tFormat() (by @LJNeon) -* More ports (previously max 20, now practically unlimited) (by @Hoekstraa) -* Corp functions now return copy of constant arrays instead of the original (by @Mughur) -* All the player sub-objects need to be copied for `getPlayer`. (by @MageKing17) -* add corp get functions, UI (by @Mughur) -* [danielyxie/bitburner#3860] destroyW0r1dD43m0n now properly gives achievements -* [danielyxie/bitburner#3890] favor now properly syncs across pages and the Donate achievement is now given correctly (by @Aerophia) -* getCrimeStats use bitnode multipliers in the output of crime stats (by @phyzical) -* add singularity function for exporting game save back (by @phyzical) - -CODING CONTRACTS - -* inconsistent probability for generation between online and offline (by @quacksouls) -* Don't stringify answer if already a string (by @alainbryden) -* [danielyxie/bitburner#3755] change input handling for contract attempts (by @Snarling) - -CORPORATION - -* [danielyxie/bitburner#3880], [danielyxie/bitburner#3876], [danielyxie/bitburner#3322], [danielyxie/bitburner#3138] Bunch of corporation fixes (by @Mughur) -* Gave investors some economics classes (by @Mughur) -* Limit shareholder priority on newly issued shares (by @Undeemiss) -* dont take research points for something already researched via api (by @phyzical) - -CORPORATION API - -* Fix up param order for limitProductProduction to match docs (by @phyzical) -* [danielyxie/bitburner#3655] Expose exports from Material (by @Rasmoh) - -DOCUMENTATION - -* update docs a bit more, amending some BN and SF texts (by @Mughur) -* Fixed Argument order for scp() (by @njalooo) -* Some typo fixes in Netscript functions (by @quacksouls) -* [danielyxie/bitburner#4033] Why use Coding Contract API (by @quacksouls) -* typo fix in description of Caesar cipher (by @quacksouls) -* typo fix in terminal.rst (by @BugiDev) -* Update bitburner.sleeve.settobladeburneraction.md (by @borisflagell) -* Correct documentation for `run()` with 0 threads. (by @MageKing17) -* Some doc updates (by @Mughur) -* fix documentation for remote api (by @hydroflame) - -NETSCRIPT - -* Added functions to resize, move, and close tail windows -* [danielyxie/bitburner#2376] ns.exit now exits immediately (by @Snarling) -* [danielyxie/bitburner#4055] Fix dynamic ram check (by @Snarling) -* [danielyxie/bitburner#4037] ns1 wraps deeper layers correctly. (by @Snarling) -* [danielyxie/bitburner#3963] Prevent bladeburner.setActionLevel from setting invalid action levels (by @MPJ-K) -* Typo fixes in CodingContract, Hacknet, Singularity APIs (by @quacksouls) -* Fix a typo in doc of Singularity.travelToCity() (by @quacksouls) -* Update netscript definition file for scp, write, read, and flags (by @Snarling) -* Correct missing ! for boolean coercion in Corporation.createCorporation(). (by @Risenafis) -* Normalized Stock API logging (by @Snarling) -* [danielyxie/bitburner#3992] allow null duration in toast ns function (by @RollerKnobster) -* Correct missing `!` for boolean coercion in `singularity.workForCompany()`. (by @MageKing17) -* ns.scp and ns.write are now synchronous + fix exec race condition (by @Snarling) -* [danielyxie/bitburner#2931] atExit now allows synchronous ns functions (by @Snarling) -* Improve real life CPU and memory performance of scripts. (by @Snarling) -* Prompt Add user friendly message to avoid throwing recovery screen for invalid choices (by @phyzical) -* [danielyxie/bitburner#4081] Rerunning a script from tail window recalculates ram usage (by @Snarling) -* [danielyxie/bitburner#3962] The correct script will be closed even if the player modifies args (v2.0) (by @Snarling) -* Corrected ns formula for infiltration rewards (by @ezylot) -* Add singularity check for finishing company work (by @Snarling) - -SLEEVES - -* [danielyxie/bitburner#3819] Allow using the regeneration chamber with sleeves to heal them. (by @coderanger) -* [danielyxie/bitburner#4063] fix crash when player tries to assign more than 3 sleeves to Bladeburner contracts (by @Snarling) -* [danielyxie/bitburner#4051] Sleeves no longer crash when player quits company sleeve was working (by @Snarling) -* [danielyxie/bitburner#4022], [danielyxie/bitburner#4024], [danielyxie/bitburner#4025], [danielyxie/bitburner#3998] (by @Mughur) -* Sleeve crime gain bitnode multiplier fix (by @Mughur) - -REMOTE FILE API - -* NetscriptDefinitions retains export strings (by @Hoekstraa) -* Fix type of RFAMessages with non-String results (by @Hoekstraa) - -UI - -* [danielyxie/bitburner#2962] add a setting to display middle time unit in Time Elapsed String (by @hydroflame) -* [danielyxie/bitburner#4106] fix incorrect experience display in Crime UI. (by @SilverNexus) -* Bitnode stats now show if BB/Corporation are disabled (by @Kelenius) -* Removed three empty lines from BB status screen (by @Kelenius) -* Add missing space to BN7 description (by @hex7cd) -* Improvements to crime work UI (by @Kelenius) -* [danielyxie/bitburner#3975], [danielyxie/bitburner#3882] Script Editor more responsive on resize, and fix dirty file indicator (by @Snarling) - - -MISC - -* Added weight to GangMemberTask construction call (by @ezylot) -* Fix ANSI display bugs (by @Snarling) -* Debounce updateRAM calls in script editor. (by @Snarling) -* [danielyxie/bitburner#3979] Allow characters & and ' in filenames (by @Snarling) -* [danielyxie/bitburner#3965] Corrected tutorial text (by @mihilt) -* Fix infil definitions.d.ts (by @phyzical) -* Modify PR template (by @Hoekstraa) -* crime gains, sleeve gang augs and faq (by @Mughur) -* [danielyxie/bitburner#3649] Preventing server starting security level from going above 100 (by @Shiiyu) -* Adds Shadows of Anarchy (by @Lagicrus) -* Added intormation about hacking managers to hacking algorithms page (by @Kelenius) -* Fix Jest CI Error (by @geggleto) -* multiple hasAugmentation checks didn't check if the augment was installed (by @Mughur) -* [danielyxie/bitburner#2442] & [danielyxie/bitburner#2795] (by @G4mingJon4s) -* Adds info regarding augments and focus (by @Lagicrus) -* Removed console.log line (by @dhosborne) -* Update some doc (by @hydroflame) -* trying to fix int problems (by @hydroflame) -* Fix broken ns filesnames (by @hydroflame) -* new formula functions (by @hydroflame) -* test fixes/md updates (by @phyzical) -* Remove "based" from positive adjectives in infiltrations (by @faangbait) -* minor fix in instance calculation (by @hydroflame) -* fix dynamic ram miscalc not triggering (by @hydroflame) -* Refactor game options into separate components (by @hydroflame) -* fix settings unfocusing on every key stroke (by @hydroflame) -* fix some stuff with the timestamp settings (by @hydroflame) -* Fix unique key problem with ascii elements (by @hydroflame) -* Improve wrong arg user message and add ui.windowSize (by @hydroflame) -* fix stack trace missing in some errors (by @hydroflame) -* Fix scp and write in ns1 (by @hydroflame) -* Did some changes of the remote api and added documentation (by @hydroflame) -* Add dummy function to generate a mock server or player for formulas stuff (by @hydroflame) -* fix compile error (by @hydroflame) -* regen doc (by @hydroflame) -* rm console log (by @hydroflame) -* regen doc (by @hydroflame) -* Added more info about blood program, change some aug descriptions (by @hydroflame) -* use triple equal (by @hydroflame) -* Minor improvements to Netscript Port loading and unloading (by @hydroflame) -* Fix hostname generation being weird about dash 0 added (by @hydroflame) -* upgrade version number. (by @hydroflame) -* Nerf noodle bar. - - -v2.0.0 - 2022-07-19 Work rework -------------------------------- - - API break rewards - -* Everyone is awarded 10 NFG. -* All work in progress program is auto completed. -* All work in progress crafting is auto completed without adding entropy. - - Work (Create program / Work for faction / Studying / etc ...) - -* Working has been rebuilt from the grounds up. The motivation for that change is that all - different types of work all required different cached variables on the main Player object. - This caused a lot of bugs and crashes. It's been reworked in such a way as to prevent bugs - and make it nearly trivial to add new kinds of work. However, since this caused a few API break - I've decided to mark this version following semver protocols and call it 2.0.0 -* Crime can be unfocused and auto loops, no more spam clicking. -* All work type give their reward immediately. No need to stop work to bank rewards like reputation. -* Faction and Company work no longer have a time limit. -* Company work no longer reduces rep gain by half for quitting early. -* Company faction require 400k rep to join (from 200k) -* Backdooring company server reduces faction requirement to 300k. -* All work generally no longer keep track of cumulative gains like exp and reputation since it's applied instantly. -* getPlayer returns way less fields but does return the new 'currentWork' field, some fields are moved around. - -API breaks - -* workForCompany argument 'companyName' is now not-optional -* commitCrime now has 'focus' optional parameter -* using getScriptIncome to get total income has been separated to getTotalScriptIncome. -* using getScriptExpGain to get total income has been separated to getTotalScriptExpGain. -* scp has it's 2 last argument reversed, the signature is now (files, destination, optional_source) -* ns.connect and other singularity function are no longer available at the top level. - They were already hidden from documentation but now they're gone. -* stock.buy and stock.sell were renamed to stock.buyStock and stock.sellStock because 'buy' and 'sell' - are very common tokens. -* corporation.bribe no longer allows to give shares as bribe. - - Netscript - -* Add singularity.getCurrentWork -* Add singularity.getAugmentationBasePrice -* Add sleeve.getSleeveAugmentationPrice -* Add sleeve.getSleeveAugmentationRepReq -* Fix infiltration.getInfiltrationLocations -* Singularity.goToLocation support for non-city-specific locations (@Ansopedian) -* All corporation functions are synchronous. Job assignment only works on the following cycle. (@stalefishies) -* Add batch functionality to NS spendHashes API (@undeemiss) -* Fix #3661 Add missing memory property to Sleeve API (@borisflagell) -* FIX#3732 Cannot assign two sleeve on "Take on contracts" regardless of contract type. (@borisflagell) - - Corporation - -* Dividend fixes and exposing dividends info via scripts (@stalefishies) -* Add big number format support in some Corporation's modal (@borisflagell) -* Fix #3261 Industry overview number formatting (@nickofolas) - - Multipliers - -* The main player object was also plagues with a million fields all called '*_mult'. Representing the different multipliers -* These have been refactored in a field called 'mults'. - - Misc. - -* #3596 Enhanced terminal command parsing (@RevanProdigalKnight) -* Fix #3366 Sleeve UI would sometimes displays the wrong stat while working out. (@borisflagell) -* Two new encryption themed contracts - caesar and vigenere (@Markus-D-M) -* Fixes #3132 several Sleeve can no longer works concurrently in the same company (@borisflagell) -* FIX #3514 Clear recently killed tab on BN end event (@Daniel-Barbera) -* HammingCodes description and implementation fixes (@s2ks) -* FIX #3794 Sleeve were getting less shocked when hospitalized (was positive, should have detrimental) (@borisflagell) -* Fix #3803 Servers can no longer have duplicate IPs (@crimsonhawk47) -* Fix #3854 ctrl+c does not clear terminal input (@evil-tim) -* Nerf noodle bar, obviously. - - -v1.6.3 - 2022-04-01 Few stanek fixes ------------------------------------- - - Stanek Gift - -* Has a minimum size of 2x3 -* Active Fragment property 'avgCharge' renamed to 'highestCharge' -* Formula for fragment effect updated to make 561% more sense. - Now you can charge to your heart content. -* Logs for the 'chargeFragment' function updated. - - Misc. - -* Nerf noodle bar. - -v1.6.0 - 2022-03-29 Grafting ----------------------------- - -** Vitalife secret lab ** - -* A new mechanic called Augmentation Grafting has been added. Resleeving has been removed. -* Credit to @nickofolas for his incredible work. - -** Stanek ** - -* BREAKING: Many functions in the stanek API were renamed in order to avoid name collision with things like Map.prototype.get - -** UI ** - -* Major update to Sleeve, Gang UI, and Create Program (@nickofolas) -* re-add pre tags to support slash n in prompt (@jacktose) -* Tabelize linked output of 'ls' (@Master-Guy) -* Add the ability to filter open scripts (@phyzical) -* Add minHeight to editor tabs (@nickofolas) -* Properly expand gang equipment cards to fill entire screen (@nickofolas) -* Add shortcut to Faction augmentations page from FactionsRoot (@nickofolas) -* Fix extra space on editor tabs (@nickofolas) -* Present offline message as list (@DSteve595) -* add box showing remaining augments per faction (@jjayeon) -* Add tab switching support to vim mode (@JParisFerrer) -* Show current task on gang management screen (@zeddrak) -* Fix for ui of gang members current task when set via api (@phyzical) -* Don't hide irrelevant materials if their stock is not empty and hide irrelevant divisions from Export (@SagePtr) -* Fix regex to enable alpha transparency hex codes (8 digits) (@surdaft) - -** API ** - -* Added dark web functions to ns api -* BREAKING: purchaseTor() should returns true if player already has Tor. (@DavidGrinberg, @waffleattack) -* Implement getBonusTime in Corporation API (@t-wolfeadam) -* Added functions to purchase TIX and WSI (@incubusnb) -* purchaseSleeveAug checks shock value (@incubusnb) -* Fix bug with hacknet api -* Fix spendHashes bug -* Added 0 cost of asleep() (@Master-Guy) -* Fix some misleading corporation errors (@TheRealMaxion) -* expose the inBladeburner on the player object (@phyzical) -* added ram charge for stanek width and height (@phyzical) -* Fix sufficient player money check to buy back shares. (@ChrissiQ) -* Fix Static Ram Circumventing for some NS functions (@CrafterKolyan) -* added CorporationSoftCap to NetscriptDefinitions (@phyzical) -* Added definition of autocomplete() 'data' argument. (@tigercat2000) -* Adding support for text/select options in Prompt command (@PhilipArmstead) -* Added the ability to exportGame via api (@phyzical) - -** Arcade ** - -* Added an arcade to New Tokyo where you can play a 4 year old version of bitburner. - -** Misc. ** - -* Add a warning triggered while auto-saves are off. (@MartinFournier) -* Log info for field analysis now displays actual rank gained. (@ApamNapat) -* Removed BladeburnerSkillCost from skill point cost description. (@ApamNapat) -* Fix handling for UpArrow in bladeburner console. (@dowinter) -* Add GitHub action to check PRs for generated files. (@MartinFournier) -* Cap Staneks gift at 25x25 to prevent crashes. (@waffleattack) -* Remove old & unused files from repository. (@MartinFournier) -* Factions on the factions screens are sorted by story progress / type. (@phyzical) -* Fix log manager not picking up new runs of scripts. (@phyzical) -* Added prettier to cicd. -* UI improvements (@phyzical) -* Documentation / Typos (@nanogyth, @Master-Guy, @incubusnb, @ApamNapat, @phyzical, @SagePtr) -* Give player code a copy of Division.upgrades instead of the live object (@Ornedan) -* Fix bug with small town achievement. -* Fix bug with purchaseSleeveAug (@phyzical) -* Check before unlocking corp upgrade (@gianfun) -* General codebase improvements. (@phyzical, @Master-Guy, @ApamNapat) -* Waiting on promises in NS1 no longer freezes the script. (@Master-Guy) -* Fix bug with missing ramcost for tFormat (@TheMas3212) -* Fix crash with new prompt -* Quick fix to prevent division by 0 in terminal (@Master-Guy) -* removed ip references (@phyzical, @Master-Guy) -* Terminal now supports 'ls -l' -* Fix negative number formatting (@Master-Guy) -* Fix unique ip generation (@InDieTasten) -* remove terminal command theme from docs (@phyzical) -* Fix 'Augmentations Left' with gang factions (@nickofolas) -* Attempt to fix 'bladeburner.process()' early routing issue (@MartinFournier) -* work in progress augment fix (@phyzical) -* Fixes missing space in Smart Supply (@TheRealMaxion) -* Change license to Apache 2 with Commons Clause -* updated regex sanitization (@mbrannen) -* Sleeve fix for when faction isnt found (@phyzical) -* Fix editor "close" naming (@phyzical) -* Fix bug with sleeves where some factions would be listed as workable. (@phyzical) -* Fix research tree of product industries post-prestige (@pd) -* Added a check for exisiting industry type before expanding (@phyzical) -* fix hackAnalyzeThreads returning infinity (@chrisrabe) -* Make growthAnalyze more accurate (@dwRchyngqxs) -* Add 'Zoom -> Reset Zoom' command to Steam (@smolgumball) -* Add hasOwnProperty check to GetServer (@SagePtr) -* Speed up employee productivity calculation (@pd) -* Field Work and Security Work benefit from 'share' (@SagePtr) -* Nerf noodle bar. - - -v1.5.0 - Steam Cloud integration --------------------------------- - -** Steam Cloud Saving ** - -* Added support for steam cloud saving (@MartinFournier) - -** UI ** - -* background now matches game primary color (@nickofolas) -* page title contains version (@MartinFourier) -* Major text editor improvements (@nickofolas) -* Display bonus time on sleeve page (@MartinFourier) -* Several UI improvements (@nickofolas, @smolgumball, @DrCuriosity, @phyzical) -* Fix aug display in alpha (@Dominik Winter) -* Fix display of corporation product equation (@SagePtr) -* Make Bitverse more accessible (@ChrissiQ) -* Make corporation warehouse more accessible (@ChrissiQ) -* Make tab style more consistent (@nickofolas) - -** Netscript ** - -* Fix bug with async. -* Add 'printf' ns function (@Ninetailed) -* Remove blob caching. -* Fix formulas access check (@Ornedan) -* Fix bug in exp calculation (@qcorradi) -* Fix NaN comparison (@qcorradi) -* Fix travelToCity with bad argument (@SlyCedix) -* Fix bug where augs could not be purchased via sing (@reacocard) -* Fix rounding error in donateToFaction (@Risenafis) -* Fix bug with weakenAnalyze (@rhobes) -* Prevent exploit with atExit (@Ornedan) -* Double 'share' power - -** Corporations ** - -* Fix bugs with corp API (@pigalot) -* Add smart supply func to corp API (@pd) - -** Misc. ** - -* The file API now allows GET and DELETE (@lordducky) -* Force achievement calculation on BN completion (@SagePtr) -* Cleanup in repository (@MartinFourier) -* Several improvements to the electron version (@MartinFourier) -* Fix bug with casino roulette (@jamie-mac) -* Terminal history persists in savefile (@MartinFourier) -* Fix tests (@jamie-mac) -* Fix crash with electron windows tracker (@smolgumball) -* Fix BN6/7 passive reputation gain (@BrianLDev) -* Fix Sleeve not resetting on install (@waffleattack) -* Sort joined factions (@jjayeon) -* Update documentation / typo (@lethern, @Meowdoleon, @JohnnyUrosevic, @JosephDavidTalbot, - @pd, @lethern, @lordducky, @zeddrak, @fearnlj01, @reasonablytall, @MatthewTh0, - @SagePtr, @manniL, @Jedimaster4559, @loganville, @Arrow2thekn33, @wdpk, @fwolfst, - @fschoenfeldt, @Waladil, @AdamTReineke, @citrusmunch, @factubsio, @ashtongreen, - @ChrissiQ, @DJ-Laser, @waffleattack, @ApamNapat, @CrafterKolyan, @DSteve595) -* Nerf noodle bar. - -v1.4.0 - 2022-01-18 Sharing is caring -------------------------------------- - -** Computer sharing ** - -* A new mechanic has been added, it's is invoked by calling the new function 'share'. - This mechanic helps you farm reputation faster. - -** gang ** - -* Installing augs means losing a little bit of ascension multipliers. - -** Misc. ** - -* Prevent gang API from performing actions for the type of gang they are not. (@TheMas3212) -* Fix donation to gang faction. (@TheMas3212) -* Fix gang check crashing the game. (@TheMas3212) -* Make time compression more robust. -* Fix bug with scp. -* Add zoom to steam version. (@MartinFourier) -* Fix donateToFaction accepts donation of NaN. (@woody-lam-cwl) -* Show correct hash capacity gain on cache level upgrade tooltip. (@woody-lam-cwl) -* Fix tests (@woody-lam-cwl) -* Fix cache tooltip (@woody-lam-cwl) -* Added script to prettify save file for debugging (@MartinFourier) -* Update documentation / typos (@theit8514, @thadguidry, @tigercat2000, @SlyCedix, @Spacejoker, @KenJohansson, - @Ornedan, @JustAnOkapi, @nickofolas, @philarmstead, @TheMas3212, @dcragusa, @XxKingsxX-Pinu, - @paiv, @smolgumball, @zeddrak, @stinky-lizard, @nickofolas, @Feodoric, @daanflore, - @markusariliu, @mstruebing, @erplsf, @waffleattack, @Dexalt142, @AIT-OLPE, @deathly809, @BuckAMayzing, - @MartinFourier, @pigalot, @lethern) -* Fix BN3+ achievement (@SagePtr) -* Fix reputation carry over bug (@TheMas3212) -* Add button to exit infiltrations (@TheMas3212) -* Add dev menu achievement check (@TheMas3212) -* Add 'host' config for electron server (@MartinFourier) -* Suppress save toast only works for autosave (@MartinFourier) -* Fix some achievements not triggering with 'backdoor' (@SagePtr) -* Update Neuroflux Governor description. -* Fix bug with electron server. -* Fix bug with corporation employee assignment function (@Ornedan) -* Add detailed information to terminal 'mem' command (@MartinFourier) -* Add savestamp to savefile (@MartinFourier) -* Dev menu can apply export bonus (@MartinFourier) -* Icarus message no longer applies on top of itself (@Feodoric) -* purchase augment via API can no longer buy Neuroflux when it shouldn't (@Feodoric) -* Syntax highlighter should be smarter (@neuralsim) -* Fix some miscalculation when calculating money stolen (@zeddrak) -* Fix max cache achievement working with 0 cache (@MartinFourier) -* Add achievements in the game, not just steam (@MartinFourier) -* Overflow hash converts to money automatically (@MartinFourier) -* Make mathjax load locally (@MartinFourier) -* Make favor calculation more efficient (@kittycat2002) -* Fix some scripts crashing the game on startup (@MartinFourier) -* Toasts will appear above tail window (@MartinFourier) -* Fix issue that can cause terminal actions to start on one server and end on another (@MartinFourier) -* Fix 'fileExists' not correctly matching file names (@TheMas3212) -* Refactor some code to be more efficient (@TheMas3212) -* Fix exp gain for terminal grow and weaken (@nickofolas) -* Refactor script death code to reject waiting promises instead of resolving (@Ornedan) -* HP recalculates on defense exp gain (@TheMas3212) -* Fix log for ascendMember (@TheMas3212) -* Netscript ports clear on reset (@TheMas3212) -* Fix bug related to company (@TheMas3212) -* Fix bug where corporation handbook would not be correctly added (@TheMas3212) -* Servers in hash upgrades are sorted alpha (@MartinFourier) -* Fix very old save not properly migrating augmentation renamed in 0.56 (@MartinFourier) -* Add font height and line height in theme settings (@MartinFourier) -* Fix crash when quitting job (@MartinFourier) -* Added save file validation system (@TheMas3212) -* React and ReactDOM are now global objects (@pigalot) -* 'nano' supports globs (@smolgumball) -* Character overview can be dragged (@MartinFourier) -* Job page updates in real time (@nickofolas) -* Company favor gain uses the same calculation as faction, this is just performance - the value didn't change (@nickofolas) -* ns2 files work with more import options (@theit8514) -* Allow autocomplete for partial executables (@nickofolas) -* Add support for contract completion (@nickofolas) -* 'ls' link are clickable (@smolgumball) -* Prevent steam from opening external LOCAL files (@MartinFourier) -* Fix a bug with autocomplete (@Feodoric) -* Optimise achievement checks (@Feodoric) -* Hacknet server achievements grant associated hacknet node achievement (@Feodoric) -* Fix display bug with hacknet (@Feodoric) -* 'analyze' now says if the server is backdoored (@deathly809) -* Add option to exclude running script from save (@MartinFourier) -* Game now catches more errors and redirects to recovery page (@MartinFourier) -* Fix bug with autocomplete (@nickofolas) -* Add tooltip to unfocus work (@nickofolas) -* Add detailst overview (@MartinFourier) -* Fix focus bug (@deathly809) -* Fix some NaN handling (@deathly809) -* Added 'mv' ns function (@deathly809) -* Add focus argument to some singularity functions (@nickofolas) -* Fix some functions not disabling log correctly (@deathly809) -* General UI improvements (@nickofolas) -* Handle steamworks errors gravefully (@MartinFourier) -* Fix some react component not unmounting correctly (@MartinFourier) -* 'help' autocompletes (@nickofolas) -* No longer push all achievements to steam (@Ornedan) -* Recovery page has more information (@MartinFourier) -* Added 'getGameInfo' ns function (@MartinFourier) -* SF3.3 unlocks all corp API (@pigalot) -* Major improvements to corp API (@pigalot) -* Prevent seed money outside BN3 (@pigalot) -* Fix bug where using keyboard shortcuts would crash if the feature is not available (@MartinFourier)\ -* Sidebar remains opened/closed on save (@MartinFourier) -* Added tooltip to sidebar when closed (@MartinFourier) -* Fix bug where Formulas.exe is not available when starting BN5 (@TheMas3212) -* Fix CI (@tvanderpol) -* Change shortcuts to match sidebar (@MartinFourier) -* Format gang respect (@attrib) -* Add modal to text editor with ram details (@nickofolas) -* Fix several bugs with singularity focus (@nickofolas) -* Nerf noodle bar. - -v1.3.0 - 2022-01-04 Cleaning up -------------------------------- - -** External IDE integration ** - -* The Steam version has a webserver that allows integration with external IDEs. - A VSCode extension is available on the market place. (The documentation for the ext. isn't - written yet) - -** Source-Files ** - -* SF4 has been reworked. -* New SF -1. - -** UI ** - -* Fix some edge case with skill bat tooltips (@MartinFournier) -* Made some background match theme color (@Kejikus) -* Fix problem with script editor height not adjusting correctly (@billyvg) -* Fix some formatting issues with Bladeburner (@MartinFournier, @nickofolas) -* Fix some functions like 'alert' format messages better (@MageKing17) -* Many community themes added. -* New script editor theme (@Hedrauta, @Dexalt142) -* Improvements to tail windows (@theit8514) -* Training is more consise (@mikomyazaki) -* Fix Investopedia not displaying properly (@JotaroS) -* Remove alpha from theme editor (@MartinFournier) -* Fix corporation tooltip not displaying properly (@MartinFournier) -* Add tooltip on backdoored location names (@MartinFournier) -* Allow toasts to be dismissed by clicking them (@nickofolas) -* Darkweb item listing now shows what you own. (@hexnaught) - -** Bug fix ** - -* Fix unit tests (@MartinFournier) -* Fixed issue with 'cat' and 'read' not finding foldered files (@Nick-Colclasure) -* Buying on the dark web will remove incomplete exe (@hexnaught) -* Fix bug that would cause the game to crash trying to go to a job without a job (@hexnaught) -* purchaseServer validation (@nickofolas) -* Script Editor focuses code when changing tab (@MartinFournier) -* Fix script editor for .txt files (@65-7a) -* Fix 'buy' command not displaying correctly. (@hexnaught) -* Fix hackAnalyzeThread returning NaN (@mikomyazaki) -* Electron handles exceptions better (@MageKing17) -* Electron will handle 'unresponsive' event and present the opportunity to reload the game with no scripts (@MartinFournier) -* Fix 'cp' between folders (@theit8514) -* Fix throwing null/undefined errors (@nickofolas) -* Allow shortcuts to work when unfocused (@MageKing17) -* Fix some dependency issue (@locriacyber) -* Fix corporation state returning an object instead of a string (@antonvmironov) -* Fix 'mv' overwriting files (@theit8514) -* Fix joesguns not being influenced by hack/grow (@dou867, @MartinFournier) -* Added warning when opening external links. (@MartinFournier) -* Prevent applying for positions that aren't offered (@TheMas3212) -* Import has validation (@MartinFournier) - -** Misc. ** - -* Added vim mode to script editor (@billyvg) -* Clean up script editor code (@Rez855) -* 'cat' works on scripts (@65-7a) -* Add wordWrap for Monaco (@MartinFournier) -* Include map bundles in electron for easier debugging (@MartinFournier) -* Fix importing very large files (@MartinFournier) -* Cache program blob, reducing ram usage of the game (@theit8514) -* Dev menu can set server to $0 (@mikomyazaki) -* 'backdoor' allows direct connect (@mikomyazaki) -* Github workflow work (@MartinFournier) -* workForFaction / workForCompany have a new parameter (@theit8514) -* Alias accept single quotes (@sporkwitch, @FaintSpeaker) -* Add grep options to 'ps' (@maxtimum) -* Added buy all option to 'buy' (@anthonydroberts) -* Added more shortcuts to terminal input (@Frank-py) -* Refactor some port code (@ErzengelLichtes) -* Settings to control GiB vs GB (@ErzengelLichtes) -* Add electron option to export save game (@MartinFournier) -* Electron improvements (@MartinFournier) -* Expose some notifications functions to electron (@MartinFournier) -* Documentation (@MartinFournier, @cyn, @millennIumAMbiguity, @2PacIsAlive, - @TheCoderJT, @hexnaught, @sschmidTU, @FOLLGAD, @Hedrauta, @Xynrati, - @mikomyazaki, @Icehawk78, @aaronransley, @TheMas3212, @Hedrauta, @alkemann, - @ReeseJones, @amclark42, @thadguidry, @jasonhaxstuff, @pan-kuleczka, @jhollowe, - @ApatheticsAnonymous, @erplsf, @daanflore, @nickofolas, @Kebap, @smolgumball, - @woody-lam-cwl) - - - -v1.1.0 - 2021-12-18 You guys are awesome (community because they're god damn awesome) -------------------------------------------------------------------------------------- - -** Script Editor ** - -* The text editor can open several files at once. (@Rez855 / @Shadow72) - It's not perfect so keep the feedback coming. - -** Steam ** - -* Windows has a new launch option that lets player start with killing all their scripts - This is a safety net in case all the other safety nets fail. -* Linux has several launch options that use different flags for different OS. -* Debug and Fullscreen are available in the window utility bar. -* Tried (and maybe failed) to make the game completely kill itself after closing. - This one I still don't know wtf is going. -* No longer has background throttling. -* Default color should be pitch black when loading -* Add BN13: Challenge achievement. - -** Tutorial ** - -* I watched someone play bitburner on youtube and reworked part of - the tutorial to try to make some parts of the game clearer. - https://www.youtube.com/watch?v=-_JETXff4Zo -* Add option to restart tutorial. - -** Netscript ** - -* getGangInformation returns more information. -* getAscensionResult added -* getMemberInformation returns more info -* Formulas API has new functions for gang. -* Added documentation for corp API. -* exec has clearer error message when you send invalid data. -* getServer returns all defined field for hacknet servers. -* Fix a bug with scp multiple files (@theit8514) -* Stack traces should be smarter at replacing blobs with filenames -* Fix a weird error message that would occur when throwing raw strings. -* Fix shortcuts not working. -* Re-added setFocus and isFocused (@theit8514) -* new function getHashUpgrades (@MartinFournier) -* enableLog accepts "ALL" like disableLog (@wynro) -* toast() doesn't crash on invalid data (@ivanjermakov) -* alert() doesn't crash on invalid data (@Siern) -* Fixed an issue where scripts don't run where they should. -* Sleeve getInformation now returns cha -* getServer does work with no argument now -* workForFaction returns false when it mistakenly returned null - -** Character Overview ** - -* The character overview now shows the amount of exp needed to next level (@MartinFournier) - -** Misc. ** - -* Add option to supress Game Saved! toasts (@MartinFournier) -* Fix bug where ctrl+alt+j was eaten by the wrong process. (@billyvg) -* Theme Editor lets you paste colors (@MartinFournier) -* ctrl + u/k/w should work on terminal (@billyvg) -* Game now shows commit number, this is mostly for me. (@MartinFourier) -* running a bad script will give a clearer error message (@TheCoderJT) -* Default terminal capacity is maximum (@SayntGarmo) -* Fix problems with cp and mv (@theit8514) -* Make monaco load fully offline for players behind firewalls. -* change beginer guide to use n00dles instead of foodnstuff -* BN13 is harder -* nerf int gain from manualHack -* Fix UI displaying wrong stats (@DJMatch3000) -* Fix button not disabling as it should. -* New location in Ishima. -* Add setting to suppress stock market popups. -* Typo fixes (@Hedrauta, @cvr-119, @Ationi, @millennIumAMbiguity - @TealKoi, @TheCoderJT, @cblte, @2PacIsAlive, @MageKing17, - @Xynrati, @Adraxas, @pobiega) -* Fix 100% territory achievement. -* Reword message on active scripts page. -* Fix terminal not clearing after BN -* Remove references to .fconf -* Augmentation pages shows BN difficulty with SF5 -* Fix scripts saving on wrong server while 'connect'ing -* Fix gym discount not working. -* Fix scan-analyze not working with timestamps -* Hash upgrades remember last choice. -* Save files now sort by date -* The covenant no longer supports negative memory purchases -* Fix corp shares buyback triggering by pressing enter -* Staneks gift display avg / num charges -* Infiltration rewards no longer decay with better stats -* terminal 'true' is parsed as boolean not string -* tail and kill use autocomplete() -* Fix focus for coding contract -* massive boost to noodle bar. - -** Special Thanks ** - -* Special thank you to everyone on Discord who can answer - new player questions so I can focus on more important things. - -v1.1.0 - 2021-12-03 BN13: They're Lunatics (hydroflame & community) -------------------------------------------------------------------- - -** BN13: They're Lunatics ** - -* BN13 added. - -** Steam ** - -* Tested on all 3 major OS. -* 94 achievements added -* Release is 2021-12-10. - -** Corporation API ** - -* Added corporation API. (Unstable) - -** Netscript ** - -* tprintf crashes when not giving a format as first arg. -* tprintf no longer prints filename (@BartKoppelmans) -* TIX buy/sell/sellShort all return askprice/bidprice (@Insight) -* getRunningScript now works. -* Fix disableLog for gang and TIX API -* getOwnedSourceFiles is not singularity anymore (makes it easier to share scripts.) (@theit8514) -* true/false is a valid value to send to other scripts. -* workForFaction no longer returns null when trying to work for gang. -* Scripts logging no longer generates the string if logging is disabled. - This should give performance boost for some scripts. - -** Gang ** - -* Gang with 0 territory can no longer fight -* Territory now caps at exactly 0 or 1. - -** Misc. ** - -* Clicking "previous" on the browser will not pretend you had unsaved information - allowing you to cancel if needs be. -* Fixed some tail box coloring issue. -* Fixed BladeBurner getCityCommunities ram cost -* The download terminal command no longer duplicate extensions (@Insight) -* Fix #000 on #000 text in blackjack. (@Insight) -* Remove reference to .fconf -* Tail boxes all die on soft reset. -* Fix codign contract focus bug. -* Megacorp factions simply re-invite you instead of auto added on reset. (@theit8514) -* Tail window is bound to html body. -* Infiltration reward is tied to your potential stats, not your actual stats - So you won't lose reward for doing the same thing over and over. -* intelligence lowers program creation requirements. -* Terminal parses true as the boolean, not the string. -* Tail and kill autocomplete using the ns2 autocomplete feature. -* scan-analyze doesn't take up as many terminal entries. -* GangOtherInfo documentation now renders correctly. -* ActiveScripts search box also searches for script names. -* Infinite money no longer allows for infinite hacknet server. -* Blackjack doesn't make you lose money twice. -* Recent Scripts is now from most to least recent. -* Fix mathjax ascii art bug in NiteSec. -* Remove warning that the theme editor is slow, it's only slow in dev mode. -* In BN8 is it possible to reduce the money on a server without gaining any. -* In the options, the timestamp feature has a placeholder explaining the expected format. -* Bunch of doc typo fix. (hydroflame & @BartKoppelmans & @cvr-119) -* nerf noodle bar - -v1.0.2 - 2021-11-17 It's the little things (hydroflame) -------------------------------------------------------- - -** Breaking (very small I promise!) ** - -* buy / sell now return getAskPrice / getBidPrice instead of just price. - This should help solve some inconsistencies. - -** Misc. ** - -* scripts logs are colorized. Start your log with SUCCESS, ERROR, FAIL, WARN, INFO. -* documentation for scp not say string | string[] -* Donation link updated. -* nerf noodle bar - -v1.0.1 - 2021-11-17 New documentation (hydroflame) --------------------------------------------------- - -** Documentation ** - -* The new documentation for the netscript API is available at - https://github.com/danielyxie/bitburner/blob/dev/markdown/bitburner.ns.md - This documentation is used in-game to validate the code, in-editor to autocomplete, and - for users to reference. This is a huge quality of life improvements for me. - -** Reputation ** - -* Fixed favor not affecting faction work reputation gain (Yeah, I know right?) - -** Hacknet ** - -* Servers are now considerd "purchasedByPlayers" - -** Script Editor ** - -* solarized themes now work. - -** Corporation ** - -* Dividends are now much more taxed. -* The 2 upgrades that reduced taxes are now much stronger. - -** Misc. ** - -* Starting / Stopping scripts on hashnet servers immediately updates their hash rate (instead of on the next tick) -* Hacknet has tooltip showing what the result of the upgrade would be. -* Augmentations page displayes current price multiplier as well as explains the mechanic. -* Terminal now is 25x stronger. -* Tail boxes use pre-wrap for it's lines. -* Tail boxes allow you to rerun dead scripts. -* Tail boxes can no longer open the same one twice. -* Terminal now autocompletes through aliases. -* Make alter reality harder. -* Fix bladeburner cancelling actions when manually starting anything with Simulacrum. -* Buying hash upgrade to increase uni class or gym training will apply to current class. -* Internally the game no longer uses the decimal library. -* Fix an issue where 'download *' would generate weird windows files. -* Timestamps can be set to any format in the options. -* Fix typo in documentation share popup. -* Remove bunch of debug log. -* Fix typo in corporation handbook literature. -* Fix typo in documentation -* Fix duplicate SF -1 exploit. (Yeah, an exploit of exploits, now were meta) -* Fix offline hacking earning being attributed to hacknet. -* nerf noodle bar - -v1.0.0 - 2021-11-10 Breaking the API :( (blame hydroflame) ------------------------------------------------------------ - -** Announcement ** - -* Several API breaks have been implemented. -* See the v1.0.0 migration guide https://bitburner.readthedocs.io/en/latest/v1.0.0_migration.html -* Everyone gets 10 free neuroflux level. - -** Netscript ** - -* Fix a bug that would cause RAM to not get recalculated. -* New function: hackAnalyzeSecurity -* New function: growthAnalyzeSecurity -* New function: weakenAnalyze - -** Script Editor ** - -* Sometimes warn you about unawaited infinite loops. -* ns1 functions are now correctly colors in Monokai. - -** Programs ** - -* Formulas.exe is a new program that lets you use the formulas API. - -** Corporations ** - -* Real Estate takes up a tiny bit of room. -* Dividends are now taxes exponentially in certain bitnodes. -* UI displays how many level of each corporation upgrade. -* Fix exploit with going public. -* Employee salary no longer increase. - -** Documentation ** - -* The documentation is now autogenerated into .md files. - It is usable but not yet linked to readthedocs. It's on github. - -** Misc. ** - -* Favor is not internall floating point. Meaning I don't have to save an extra variable. -* Manually starting a Bladeburner action cancels unfocused action. -* Updated description of gang territory to be clearer. -* Hacknet expenses and profit are in different categories. -* Fixed favor equation. -* Toast messages aren't hidden behind work in progress screen. -* Fix bug that made infiltration checkmark look off by one. -* Fix some inconsistency with running files that start or don't start with / -* Can't tail the same window twice. -* Added recovery mode. Hopefully no one will ever have to use it. -* Fix readthedocs -* Programs now give int exp based on time not program. -* Many sing. functions now give int exp. -* Active Scripts page now displays some arguments next to script name. -* Fixed some invisible black text. -* Button colors can be edited. -* Added 2 new colors in the theme editor: background primary and background secondary. -* infiltration uses key instead of keycode so it should work better on non-american keyboards. -* buff noodle bar. - -v0.58.0 - 2021-10-27 Road to Steam (hydroflame & community) ------------------------------------------------------------ - -** Announcement ** - -* To prepare for Steam we will fix some inconsistencies in the Netscript API. Ideally we can also write a - save file migration that will automatically convert all breaking changes in your scripts without any - player input. - -** BREAKING (kindof) ** - -* All stock market functions are now under the 'stock' namespace, like 'hacknet' - However when you load your game with v0.58.0 for the first time it should automatically convert everything. - -** SF -1 ** - -* new SF -1: Reality Alteration - -** Gang ** - -* Ascension formula now better -* Karma requirement now much lower in most nodes -* Territory heavily penalizes gains -* T.R.P. not available outside BN2. - -** Netscript ** - -* It is no longer possible to send anything but strings or numbers to other scripts. (prevents exploits) -* Improve code for some netscript functions (@omuretsu) - -** Script Editor ** - -* Added Solarized light/dark as theme (@CalvinTrops) -* Fixed sleeve namespace smart autocomplete. - -** Hacknet Servers ** - -* Cores affect grow/weaken like they do on home computer - -** Infiltration ** - -* Slash game modified to be easier. - -** Misc. ** - -* Fix typo in corp (@Saynt_Garmo) -* Fixed a bug where corp wouldn't let you buyback shares. (@Saynt_Garmo) -* Fixed a bug where sleeves couldn't perform some crimes. (@Saynt_Garmo) -* Hospitalization and Eating noodles are now toasts (@Saynt_Garmo) -* Fixed some repeated code (@omuretsu) -* Fixed Character Overview preventing clicks underneath it even when hidden. (@omuretsu) -* Fixed typo in tutorial. (@omuretsu) -* Create Programs and Factions invitation badges now dissapear when you open their respective pages. -* Add killall script in character overview. -* Fixed bug in corp that made last city production be the production for all cities for newly created product. -* Fix bug that allowed reputation to transfer to new jobs. -* Fixed memory leak with ns2. -* nerf noodle bar - -v0.57.0 - 2021-10-16 It was too cheap! (hydroflame & community) ---------------------------------------------------------------- - -** BREAKING (kindof) ** - -* purchased server cost now scales exponentially past 2^10. - I'm going to actually explain this one: Currently the cost of a 2^20GB server is 57b - Most players can get that before their first install. In an effort to nerf good players - a softcap was added. This softcap is different for every BN. - -** Script Editor ** - -* Added a theme that is close to monokai. Unfortunately a full monokai is impossible because - Monaco doesn't have a very good tokenizer. -* Opening a file and connecting to a new server will still save the file on the server that the file - was opened. - -** Netscript ** - -* New function: alert, which creates a textbox. -* New function: toast, creates a notification in the bottom right. -* New function: upgradeHomeCores (@Saynt_Garmo) -* New function: atExit, allows you to set a callback for when the script closes. -* New kindof function: autocomplete, this allows you to tell the game what it should - autocomplete on the terminal. - -** Augmentation ** - -* ENM Core (the Augmentation from The Black Hand with the highest rep cost) rep cost - reduced from 250 to 175. This will help new players transition from TBH to BitRunners more easily. - -** Bladeburner ** - -* New general action: Incite Violence. This action adds other action counts but increases chaos. - -** Misc. ** - -* Current bladeburner action is shown on the character overview. -* Fix blackop being #000 on #000. -* The last clicked Tail Box goes in front of the others. -* Fixed an issue where some values were loaded as 0 when they should be null. -* Implemented toasts. -* .msg are no longer saved in the text file. -* Tail boxes no longer display all the args, they use "..." after 30 characters. -* Fixed cancelation penalty bonus not being properly applied after the IP <-> hostname switch. -* Fixed an exploit where you could send non-strings or numbers to other scripts. -* Fixed issue when trying to work for a faction with a work type that doesn't exist while - already working for that faction. -* Fixed not being able to work for the CIA. (Don't ask) -* nerf noodle bar - -v0.56.0 - 2021-10-11 Trimming the backlog (hydroflame & community) ------------------------------------------------------------------- - -** BREAKING ** - -* The 'write' function is now async. This helps when making scripts that write scripts. - -** Terminal ** - -* 'grow' and 'weaken' have been added as terminal command. This should help player transition - from commands to scripts. The tutorial also talks about it. -* 'cp' command added -* Improved performance by rate limiting refresh. - -** IP vs Hostname ** - -* The game now uses hostname as primary key for it's servers (yeah believe it or not IPs were - used until then). This has caused some issues with purchased servers (they couldn't be sold). - You might need to soft reset for the game to fully convert itself. - -** Sleeve ** - -* Fixed bug where they couldn't train at Volhaven. -* No longer consume all bonus time at once, making it look buggy. - -** SF9 ** - -* Now boosts hacknet production by 8/12/14% - -** Hacknet Servers ** - -* production nerfed by 10% -* Max money increase gets weaker above 10t max money - -** Corporation ** - -* Warehouse tooltip now also displays the amount of space taken by products. -* Changed research box completely to avoid dependency on Treant (Treant is a pita) -* All textbox should accept MAX/MP case insensitive. -* Fixed export popup not refreshing dropdowns correctly. -* Fixed product mku becoming zero -* Increased scaling of Wilson to avoid feedback loop. -* Can no longer get in debt by buying real estate -* Bonus time is consumed faster. - -** Netscript ** - -* isBusy takes bitverse and infiltration into account -* hospitalize can't be called when in infiltration. -* setToCommitCrime now accepts crime rough name instead of perfect name. -* disableLog All now works for bladeburner functions. -* Fixed netscript port for ns1. - -** Augmentation ** - -* Added augmentation to Ti Di Hui that removes penalty for being unfocused. -* Neuroflux no longer appears in special factions. - -** Script Editor ** - -* Ram check is debounced instead of refreshed every second. -* Added the vscode extension documentation to the game (it doesn't work well, thought) -* Fixed issue where autocomplete list would grow forever -* Added semi-monokai as theme. -* Fixed issue where modifying filename would mess it up. -* Font size can be changed now. - -** Infiltration ** - -* Fixed issue where game controls would become unfocused. - -** Misc. ** - -* Fixed loader incorrectly assuming some null values are incorrect. -* installBackdoor trigger Bitverse sequence -* Some improvements to the theme editor -* Improved documentation about where to learn javascript. -* Added some instructions for contributors. -* Fixed typo in corporation sell shares modal (@Saynt_Garmo) -* Fixed pagination being black on black in Active Scripts -* Create Script tab renamed to Script Editor -* Fixed an issue where corp some textbox wouldn't update when changing city. -* Fixed an issue where hacknet online time was always 0. -* Netscript function prompt fixed. -* Fixed miscalculation in growth. -* Script with syntax errors will try to be a tad more helpful. -* Corporations can no longer bribe bladeburners. -* Augmentation Graphene Branchiblade renamed to Brachi, like the rest of them. -* All ram is displayed in GB/TB/PB now. -* Game now saves when saving a file, this can be turned off. -* Several improvement to log window. -* Bladeburner current action returns General type instead of the name of the action. -* Bladeburner travel and Sleeve travel respect disable ASCII. -* Tutorial fits on small screens. -* Import is much slower but more consistent now. -* Fix intelligence not updating properly. -* Added SF -1: Time Compression -* ReadTheDoc theme now matches the game. -* Logbox should wrap text better -* Logbox behavior should feel better. -* Fix font for AutoLink.exe -* nerf noodle bar - -v0.55.0 - 2021-09-20 Material UI (hydroflame & community) ---------------------------------------------------------- - -** Global ** - -* The game is now 100% in typescript, react, and Material-UI - -** Misc. ** - -* Corporations can no longer bribe special factions -* Infiltration can no longer lose focus of the keyboard. -* Fix terminal line limit -* Added theme editor -* Theme applies on game load (@Nolshine) -* Sleeves no longer consume all bonus time for some actions -* Fix a bug where the autocomlete list would get duplicates -* Fix tutorial not scaling properly on small screens -* Import should be more consistent -* Typo with 'help' command -* Fix infinite loop in casino -* nerf noodle bar - -v0.54.0 - 2021-09-20 One big react node (hydroflame & community) ----------------------------------------------------------------- - -** UI ** - -* The UI is now completely(ish) in react and I'm starting to implement - Material-UI everywhere. This will help make the game feel more consistent. -* Major help from (@threehams) -* New Terminal -* New Active Scripts page -* New sidebar. -* New Character overview -* New tutorial -* New options page -* New create program page (@Nolshine) - -** Netscript ** - -* Add companyName to getPlayer - -** Factions ** - -* Megacorp factions are no longer removed when installing. - -** Corporation ** - -* All research tooltips are always visible. -* Smart supply is enabled by default if purchased (@Nolshine) - -** Misc. ** - -* Fix "Game saved" animation. (@Nolshine) -* Update commitCrime documentation (@Tryneus) -* Fix logbox scrolling weird (@Nolshine) -* Fix weird scrolling in corporations (@BartKoppelmans) -* Fix typo (@BartKoppelmans & @Nolshine) -* Delete game now has a confirmation modal (@Nolshine) -* Fix issue where skills would not get properly updated when entering new - BN. (@Nolshine) -* Convert create gang to popup (@vmesecher) -* Fixed a bug that prevented travel to Sector-12 and New Tokyo when not using - ASCII art. -* nerf noodle bar - -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 ** - -* Correctly reloads old script when clicking "Script Editor" -* No longer jumps to the end of the text for no reason. - -** Hash upgrades ** - -* Fixed an issue where the default option would say ecorp but was really - foodnstuff - -** Misc. ** - -* The "Delete all active script" button under the options has a clearer - description. -* Removed some debug console.log -* nerf noodle bar - -v0.52.7 - 2021-08-21 Fixing the previous patch tbh (hydroflame) ---------------------------------------------------------------- - -** Netscript ** - -* API BREAKING CHANGE: getActionEstimatedSuccessChance now returns a pair of - value to reflect the UI changes. I'm very sorry. - -** Bladeburner ** - -* General actions now display time required. -* Recruitment now displays success chance. -* All other success chance now display a range instead of a single value - The real value is guaranteed to be within that range. - -** Misc. ** - -* Fix tutorial not working after Monaco upate -* Fix logbox logs not taking up the whole logbox -* Fix script editor shortcut (ctrl+b) -* Fix Corporation popup appearing in the wrong order, hiding one of them -* Fix error when loading Corp -* Fix logbox dragging (smoother now) -* Fix logbox name collision -* Fix logbox allowing to open the same box multiple times -* Fix netscript write. -* nerf noodle bar - -v0.52.6 - 2021-08-21 Logboxes and VS-code (hydroflame) ------------------------------------------------------- - -** Text Editor ** - -* Ace and Codemirror have been removed in favor of monaco (web version of - vs-code). The options are a bit lackluster but more will be added as - feedback comes. - -** Log boxes ** - -* Multiple log boxes can be opened at once. They can be moved around the - screen. (but the movement behavior is a bit weird.) - -** Misc. ** - -* Job promotion now correctly updates the UI. -* Milestones now call the faction CyberSec instead of CSEC -* Can no longer create file that break the filesystem. -* Remove dollar sign in blade contract UI element -* nerf noodle bar - -v0.52.5 - 2021-08-19 CPU cores are useful!? (hydroflame) --------------------------------------------------------- - -** Terminal ** - -* When executing 'run SCRIPT' any script can now add '--tail' to - automatically bring up the logs. - -** Netscript ** - -* The 'flags' function now works with single letter flags but they only take - one dash. -* Fix several broken bladeburner netscript functions. -* Fix gang.getMemberInformation returning inconsistent data after the gang - rework. - -** CPU Cores ** - -* CPU Cores on the home computer now provide a bonus to grow() money gain - and makes weaken lower more security. Only for scripts running on 'home' - -** Misc. ** - -* Fix weird scrolling in the new Bladeburner React console. -* nerf noodle bar - -v0.52.4 - 2021-08-19 Bladeburner in React (hydroflame) ------------------------------------------------------- - -** Bladeburner ** - -* The entire UI was rebuild in React. It should be more responsive - -** Hacknet ** - -* Displays how many time each hash upgrade was bought. -* Displays cummulative effect of the upgrade. -* Removed "Close" button from hash upgrade menu. - -** Misc. ** - -* More popup/modals have dark background, can be dismissed by clicking - outside, or by pressing escape. -* Small reword in the guide. -* Fix several typos in the bladeburner documentation. -* Linting (no one cares except the dev) -* nerf noodle bar - -v0.52.3 - 2021-08-15 Gangs were OP (hydroflame) ------------------------------------------------ - -** Gang ** - -* Significant rework. Ascension is now based on exp gained. -* All upgrades give exp bonuses. -* Maximum gang members reduced to 12. -* Respect required to recruit sharply increased. -* Rewritten in React, the UI should be smoother and less laggy now. - -** Infiltration ** - -* Now isTrusted protected. - -** Misc. ** - -* Many UI element are now "noselect" protected. -* Fixed an issue where you could join the same faction twice via script and - UI simultaneously. -* Factions list screen converted to React. -* nerf noodle bar - -v0.52.2 - 2021-08-15 Oh yeah, BN11 is a thing (drunk hydroflame tbh) --------------------------------------------------------------------- - -** Source-Files ** - -* Source-File 11 now also provides a small reduction to the price increase - multiplier. - -** Augmentations ** - -* New Augmentation offered by Aevum, themed around 777 and offers some basic - programs. -* Augmentation descriptions are now more concise and consistent. - -** Misc. ** - -* nerf noodle bar - -v0.52.1 - 2021-08-10 bugfixing (hydroflame & community) -------------------------------------------------------- - -** Misc. ** - -* Fix game crash/corruption when quitting a job while working for it unfocused. -* Fix typo in corporation Market Data. -* Fix typo in docs for hackPercent. -* The tutorial encourages the players to connect to home before creating `n00dles.script` -* The dark web `buy` command now accepts `-1` (one) and `--list` instead of just `-l`. Helps some confused players. -* Character overview screen no longer hidden on the corporation screen. -* Infiltration difficulty display is now more explicit (It's a big arrow instead of just one word.) -* Fix wrong ram value in tutorial. (@MageKing17) -* Plenty of augmentation description cleanup (@Kwazygloo) -* Plenty of typo/description fixed (@MageKing17) -* Cleanup description of singularity function on readthedocs (@PurePandemonium) -* Fix bug when autolinking a server while backdooring (@schroederIT) -* nerf noodle bar - -v0.52.0 - 2021-06-13 Infiltration 2.0 (hydroflame & community) --------------------------------------------------------------- - -**Infiltration** - -* Completely reworked. Not the same mechanic at all. - -**Terminal** - -* tail is smarter. It automatically assume the only possible options in some - cases. - -**Intelligence** - -* Now available when starting BN5 instead of after beating it for the first - time. -* Nerf the effect of intelligence on reputation gain. - -**Augmentation** - -* Added a new augmentation, the 'Unstable Circadian Modulator', whose - gimmick is that its stats are randomized every hour. - -**Netscript** - -* 'getPlayer' is not a singularity function anymore. -* 'hacknetNodes.constants' returns the correct values. -* 'createGang' has been added. -* 'inGang' has been added. - -**Tutorial** - -* Updated the tutorial. Made it look cleaner, fixed typos, etc. - -**Misc.** - -* Fix many typos in literature (@kwazygloo) -* Fix being able to unfocus from gym and university. -* Fix being able to do hacking missions while unfocused. -* Fix many typos in Augmentation descriptions (@kwazygloo) -* More numbers handle absurdly large values. (@Tesseract1234567890) -* Fix many typos (@Tesseract1234567890) -* Fixed an issue that caused a UI desync when sleeves were set to workout - stats other than strength at the gym. -* Fix weird alignment of donation text box and button. (@Tesseract1234567890) -* Fixed an issue where reputation could be transfered to new jobs when unfocused. -* Empty stack traces should no longer appear. -* Purchasing anything with Infinity money doesn't result in NaN. -* nerf noodle bar - -v0.51.10 - 2021-05-31 Focus Mark, Focus! (hydroflame) ------------------------------------------------------ - -**Focus** - -* You can now use the terminal and write scripts while working for factions - but you will gain reputation at a slower rate. - -**SF -1** - -* Added a new SF -1: Bypass - -**Gang** - -* "Vigilante justice"/"Ethical hacking" now reduces wanted level by a very - small percentage as well an absolute value. - -**Netscript** - -* 'tFormat' now has a second argument to display with millisecond precision. -* 'purchaseSleeveAug' can no longer purchase the same aug over and over for - the same sleeve. -* fix typo in logging for 'getServerSecurityLevel' -* Fixed some weird issue where very rarely you would get 0 exp from 'grow' -* 'getActionTime' now returns correct values for Diplomacy and Regeneration. - -**Corporations** - -* Fixed an exploit where you could get nearly infinite corporation funds by - entering negative numbers in textboxes. -* Fixed an exploit where shares could be sold again by clicking the - "sell share" button via scripts. - -**Documentation** - -* typo fix in purchaseTor -* typo fix in basicgameplay/stats - -**Misc.** - -* Very large number will no longer appear as "$NaNt" -* Hash capacity now displays in the "big number" format. -* nerf noodle bar - -v0.51.9 - 2021-05-17 offline progress and exports! (hydroflame & community) ---------------------------------------------------------------------------- - -**Alias** - -* several commands can be included in 1 alias. Recursive alias now work to - a depth of 10. (@Dawe) - -**Offline** - -* Offline money gain has been reworked (it is more generous) -* If you're not working anywhere and go offline the game will work for you - at all your factions evenly. - -**Export** - -* Exporting now gives +1 favor to all joined factions every 24h. - -**Corp** - -* Self-fund with an invalid name no longer takes away 150b anyway. -* Can no longer export negative amount - -**Bladeburner** - -* No longer waste overflowing time. - -**Text Editors** - -* All settings will now be saved and loaded correctly. - -**Terminal** - -* 'scan' now works for servers that are more than 21 character long. - -**Misc.** - -* ls now correctly lists all files. -* importing auto save+reloads (@Dawe) -* Fix a bug where .fconf could not be created -* Fix formatting inconsistencies for some logs of netscript functions. -* Fix a bug where Cashroot starter kit would appear as [object Object] in - confirmation dialog. -* Fix some ram not displayed as 0.00GB -* Fix error message throw undefined variable error -* City hall now has some generic text if you can't create a corp yet. -* Deleting a file without extension now returns an appropriate error message. -* Fixed an issue where bladeburner would miscalculate the cost of hospitalization. -* It is now possible to suppress bladeburner "action stopped" popup. -* Updated several dependencies (big who cares, I know) -* ls no longer prints lingering newline. -* Money earned/spent by sleeves is now tracked under Character>Money -* nerf noodle bar - - -v0.51.8 - 2021-05-07 It was there all along (hydroflame & community) --------------------------------------------------------------------- - -**Servers** - -* Update n00dles metadata - -**Netscript** - -* 'hashGainRate' use the correct 'usedRam' and 'maxRam' -* Fix 'setActionAutolevel' logging. -* Fix 'setActionLevel' not working at all. -* Add 'installBackdoor' singularity function. - -**Hacknet** - -* Fix Hacknet Servers total production always displaying 0 - -**Documentation** - -* Updated guide to no longer recommend BN12. -* Fix documentation for maxNumNodes (@ModdedGamers) -* Fix typo in 'sourcefiles.rst' -* Fix typo in 'recommendedbitnodeorder.rst' -* Fix 'getServer' documentation missing 'server' argument. -* Fix missing ram cost in 'getData.rst' -* Fix basic formulas examples. -* Fix typo in BN11 description. -* Fix formatting issue in Bladeburner (@Pimgd) - -**Misc.** - -* Fix negative money being displayed in full. -* Fix Hacking Missions not working. -* Fix Corporation tree not rendering. -* Fix script being needlessly recompiled. This should save real ram (not game ram) -* w0r1d_d43m0n can be backdoored -* Coding Contracts title is click-to-copy (@Rodeth) -* Covenant memory upgrade works better. -* Fix Neuroflux not being correctly calculated when entering BN with SF12. -* Delete Active Script now delete all active scripts, not just home. -* Now you can 'cd' in directories that only contain '.txt' files. -* Fix 'analyze' always saying players had root access -* Passive faction rep no longer builds for special factions. -* Donation option no longer appears for special factions. -* Rephrased some milestones. -* donation textbox now accepts money in the format '1b' and the like (@Dawe) -* Fix being able to join hated factions simultaneously. (@Dawe) -* 'ls' now displays files in multiple column. (Helps players with many files) -* Bladeburner multiplers now appear under Character>Stats and - Character>Augmentation when they are relevant. -* Fix missing functions syntax highlight in codemirror. -* Fix infiltration number formatting. -* script income transfers to parent on death. This helps keep track of - income for scripts that spawn short lived scripts. -* nerf noodle bar - -v0.51.7 - 2021-04-28 n00dles (hydroflame & community) ------------------------------------------------------ - -**Tutorial servers** - -* All the tutorial servers have been reverted to their original value -* The new server n00dles has been added as tutorial server. - -**Terminal** - -* 'tail' now accepts Pid. -* 'analyze' now handles Hacknet Servers correctly. -* 'ServerProfiler.exe' now handles Hacknet Servers correctly. - -**SF12** - -* Now makes you start with Neuroflux Governor equal to the level of the SF. - -**Netscript** - -* Deprecated 'getServerRam'. -* 'getServerMaxRam' added to replace 'getServerRam' -* 'getServerUsedRam' added to replace 'getServerRam' -* 'getBitnodeMultipliers' is available inside BN5 -* Time logged by hack/grow/weaken now displays in human time. -* thread count logged by hack/grow/weaken now displays with commas every - thousands place. - -**Donation** - -* Always visible but locked until favor requirements are reached. - -**Augmentations** - -* City factions has been rebalanced to give a reason to visit them all. - -**Sleeves** - -* Fix sleeves not being able to work at Volhavens gym. - -**Lint** - -* This shouldn't change anything but was like 10h of work. So I'm logging it. - -**Misc.** - -* Plethora of typo fixed (@Pimgd) -* ps documentation fix (@Dawe) -* The dev menu now has a quick bitflume option. -* Fix SF -1 not being as powerful as intended. -* Fix cashroot starter kit not displaying correctly. -* Fix DOM element 'character-overview-text' being nested twice. -* Hacknet documentation example fix. -* Money amount under 1000 dont display 3 decimal anymore. -* Fix nextSourceFile flag miscalculation on the bitverse (for Bn12) -* Faction invite text says "Decide later"/"Join!" instead of "No"/"Yes" -* nerf noodle bar - - -v0.51.6 - 2021-04-28 Backdoor! (hydroflame & community) -------------------------------------------------------- - -**Backdoor** - -* a new terminal command, backdoor, has been added to help differentiate - between the terminal hack command and the netscript hack function. (@dewint) - -**Servers** - -* foodnstuff, sigma-cosmetics, and joesguns have been rebalanced to help new players. - -**Milestones** - -* A new tab under the Help menu has been added to guide players through the - game. - -**Casino** - -* Blackjack has been added (@BigD) - -**Netscript** - -* 'prompt' now converts input to JSON. -* 'getRunningScript' is a new netscript function that returns a bunch of - data related to a running script. - -**Coding contracts** - -* trivial puzzles should no longer appear. - -**Infiltration** - -* All numbers are formatted like the rest of the game. - -**Misc.** - -* Server security is capped at 100. -* Added option to quit a job. -* 'cd' no longer works on unexistent folders. -* cd with no arguments brings you back to top level folder (@Andreas) -* 'softReset' documentation udpated. -* Money tracker now accounts for going to the hospital manually. -* codemirror is now the default editor (for new save files) -* fix typo in dark web help text (@Rodeth) -* so many documentation and typos fixes (@Pimgd) -* A corruption visual effect has been added to location with servers that - have backdoor installed. (@dewint) -* nerf noodle bar - - -v0.51.5 - 2021-04-20 Flags! (hydroflame) ----------------------------------------- - -**Netscript** - -* 'flags' is a new function that helps script handle flags. - This is subject to change if it doesn't meet the need of the players. -* 'ps' now returns the pid. -* 'tail' now works with pid as first argument. -* 'tail' hostname defaults to current server. (like the documentation says) -* 'isRunning' hostname defaults to current server. -* 'isRunning' now works with pid as first argument. - -**Gang** - -* Nerfed ascension mechanic once again :( - -**Misc.** - -* Souce-File typo fix -* Fix 'while you were away' screen. -* Bladeburner team size can no longer be set to negative amounts. -* nerf noodle bar - -v0.51.4 - 2021-04-19 Manual hacking is fun (hydroflame) -------------------------------------------------------- - -**Manual hacking** - -* These bonus require an install or a soft reset to take effect. -* Manual hacking gyms and university gives you a 10% discount. -* Manual hacking a corporation server decreases the penalty for leaving work - early. - -**BladeBurner** - -* nerfed int exp gained. - -**Documentation** - -* purchaseServer specifies what happens on failure. -* Fixed typo in recommended bitnode page. -* Removed misleading ram requirements for hacking factions. - -**Netscript** - -* growthAnalyze handles Infinity correctly. - -**Misc.** - -* Faction Augmentation will list how much reputation is required even after - that goal has been reached. -* Removed dollar sign in travel agency confirmation dialog box. -* Fixed typo in alpha-omega.lit -* the 'Game saved!' text no longer blocks the save game/options button. -* The text editor now remembers the location of your cursor and restores it. -* skills are recalculated instantly. -* Fix typo in Operation Zero description. -* nerf noodle bar - -v0.51.3 - 2021-04-16 Y'all broke it on the first day (hydroflame) ------------------------------------------------------------------ - -**Passive faction reputation** - -* Reworked, from 1 rep / 2 minute. Now is a complicated percentage of the - reputation you'd gain working for them. It's not op but it feels a bit - more useful. - -**Netscript** - -* print/tprint now take any number of arguments. -* print/tprint will now print object as json. -* print/tprint now handle passing in an undefined argument properly. - -**Casino** - -* Cannot bet negative money anymore. -* Roulette max bet is a bit higher. -* Coin Flip has a small cooldown. -* All buttons reject unstrusted mouse events. - -**Documentation** - -* Changed a message that said nsjs only works on Chrome. - -**Bugfix** - -* hacknet.maxNumNodes now works for both nodes and servers. -* Fixed a bug where the popup boxes would contain data from previous popup boxes. -* .js files will also have the 'export async function' boilerplate. - -**Misc.** - -* turned off web form autocomplete for the terminal text input. -* Fixed an issue on Windows+Firefox where pressing up on the terminal would - bring the cursor to the begining of the line. (Issue #836) -* Hacknet node names is easier to handle for screen readers. -* Money spent on classes is now tracked independently of work money. -* running coding contract from the terminal will display its name. -* nerf noodle bar - -v0.51.2 - 2021-04-09 Vegas, Baby! (hydroflame) ----------------------------------------------- - -**New location: The Iker Molina Casino** - -* A casino opened in Aevum. However the house is rumored to cheat. If only - we could give them a taste of their own medicine. - -**Misc.** - -* Link to discord added under options -* 'getMemberInformation' doc updated, oops -* tech vendor now handle max ram and cores. -* nerf noodle bar - -v0.51.1 - 2021-04-06 Bugfixes because the author of the last patch sucks (it's hydroflame) ------------------------------------------------------------------------------------------- - -**Netscript** - -* 'getPlayer' returns players faction and tor -* 'hospitalization' is a new singularity function. -* 'gang.getMemberInformation' now returns more information. -* 'hacknet.hashCapacity' is a new hacknet function that returns the maximum hash capacity. - -**Hospitalization** - -* Now only cost at most 10% of your money. - -**Bugfix** - -* confirmation dialog box no longer use previous text - -**Accessibility** - -* The game is a little easier to handle for screen readers (yes, there's an - absolute legend playing this game with a screen reader) -* Infiltration use buttons instead of a-links -* New option to disable ASCII art. This will make the metro map and world - map display as a list of buttons. - -**Misc.** - -* 'fl1ght.exe' will no longer suggest the combat path. Related faction - requirements unchanged. -* nerf noodle bar - -v0.51.0 - 2021-03-31 Formulas (hydroflame) ------------------------------------------- - -**Formulas API** - -* A new API is introduced, this gives players access to various formulas used in the game. - It'll help you make more informed decisions. - -**Netscript** - -* 'getServer' is a new function meant to be used with the formulas API. -* 'getPlayer' is a new function meant to be used with the formulas API. -* 'getStats' and 'getCharacterInformation' are deprecated in favor of 'getPlayer' -* 'getCurrentServer' is a new function that returns the server the player is currently connected. - -**Display** - -* All money should now consistently be orange. -* All rep should now consistently be light-yellow. -* Most numbers should display consistently now (aka all money is formatted the same). - -**Click to copy** - -* Certain UI elements are now 'click-to-copy' - -** Misc. ** - -* nerf noodle bar - -v0.50.2 - 2021-03-25 Everyone asked for this one. (hydroflame) --------------------------------------------------------------- - -**BitNodeMultipliers** - -* 'GangKarmaRequirements': a new multipler that influences how much karma is required to make a gang different bitnodes. - -**Netscript** - -* 'connect': a new singularity function that connects you to a server. (like the terminal command) -* 'manualHack': a new singularity function that performs a manual hack on the players current server. -* ns2 stack trace works on Firefox now. - -**Misc.** - -* New shortcut, Alt + b, brings you to bladeburner -* New shortcut, Alt + g, brings you to gang -* nerf noodle bar - -v0.50.1 - 2021-03-22 (hydroflame) ---------------------------------- -**Netscript** - -* getTaskStats works - -**Source-File -1** - -* Added a new Exploit - -**Factions** - -* Augmentations offered by a Faction but already bought are in a separate list at the bottom of the page. - -**Bug fixed** - -* Fixed a bug where completing a maxed non-repeatable BitNode would make its color on the BitVerse like level 1. - -**Misc.** - -* Minor spacing in stats tables. -* nerf noodle bar - -v0.50.0 - 2021-03-20 Intelligence (hydroflame) ----------------------------------------------- - -**Intelligence** - -* int exp gain and effect has been reworked. It is now much more easy to - acquire and far more powerful. The goal here is to feel like players have - another tool in their arsenal. - -**Factions** - -* Hacking factions no longer have hacking level requirements since their associated servers do. - -**Misc.** - -* Sleeve styling. -* number formatting -* remove wiki button in Hacking Missions. -* Fix NaN displayed when very very large numbers are reached. -* nerf noodle bar - -v0.49.2 - 2021-03-13 (hydroflame) ---------------------------------- - -**BN8** - -* A new bitnode multipler has been added, it lets you reduce money from a - server without gaining actually any money. This is important for BN8 where - hack/grow can influence the stock market. No money can be gained from - hacking but server money can still be reduced. - -**Documentation** - -* readthedocs should now be more consistent and many examples were added. - -**Netscript** - -* Ace editor will now correctly highlight all functions. -* 'tFormat' is a new netscript function that returns a human readable - representation of milliseconds. eg. "2 hours 15 minute 43 seconds" - -**Gang** - -* style improvements - -**Bladeburner** - -* style improvements -* fix bug where 'skill list SKILL' would crash if skill is level 0. - -**Sleeve** - -* karma gain now scales with sync. - -**Misc.** - -* Fix issue where the effective stats under Character>Stats were being calculated. -* nerf noodle bar - -v0.49.0 - 2021-03-11 Source-File -1 (hydroflame) ------------------------------------------------- - -**Source-File -1** - -* For advanced players: The game now embraces exploits and will reward - players for doing so. - -**Gang** - -* ascension is less effective as the ascension multiplier goes up. -* territory gain scales with power difference. - -**Netscript** - -* 'gang.getEquipmentStats' returns the stats of the equipment. -* 'gang.getTaskStats' returns the stats of a task. -* 'getCrimeStats' returns the stats of a crime. -* Crashes should now print the ns stack trace. -* Log messages are now more consistent. -* 'softReset' now accepts a callback script like 'installAugmentations' - -**Misc.** - -* Minor formatting under Hacking>Active Scripts -* option menu colors now match the rest of the game, kinda. -* nerf noodle bar - - -v0.48.0 - ASCII - 2021-03-07 (hydroflame) ------------------------------------------ - -**ASCII** - -* Travel Agency now displays a world map -* Cities are now top view of metro station maps - -**Netscript** - -* 'softReset' is a new netscript function that performs a soft reset - regardless of if the player has bought augmentations or not. -* 'getAugmentationStats' is a new netscript function that returns the stats of - an augmentation. -* getCharacterInformation now additionally returns exp -* pid resets back to 1 when installing or destroying a BitNode. -* New '.ns' scripts start with a main function. -* 'hacknet.maxNumNodes' returns the maximum number of hacknet nodes. - -**Bladeburner** - -* Current stamina will scale as max stamina increases, this prevents players - from having very high penalty when they gain huge amount of exp at the - start of a reset. - -**Misc.** - -* Fixed an issue where SF3 was listed as infinitly repeatable and SF12 as - having a limit of 3. -* Fixed an issue where the gang equipment screen would freeze the game if a - script installed augmentations while it is open. -* All BonusTime now displays in the 'H M S' format. -* Donation textbox style updated to match the rest of the game. -* Corporation name style updated to match the rest of the game. -* minor formatting under Hacking>Active Scripts -* typo in BN12 description -* BN12 now reduces contract money -* Character>Stats percentages are aligned, server and hacknet limit are - displayed, if the player has SF5 the reduces stats are shown. -* Character>Augmentations now displays by how much the player stats will - increase. -* Character>Augmentations has a badge indicating how many augs the player - has bought but not installed -* Character>Factions has a badge indicating how many factions have pending - invites. -* nerf noodle bar - -v0.47.2 - 7/15/2019 -------------------- - -**Netscript Changes** - -* Added tail() Netscript function -* hacknet.getNodeStats() function now returns an additional property for Hacknet Servers: hashCapacity -* When writing to a file, the write() function now casts the data being written to a string (using String()) -* BitNode-selection page now shows what Source-File level you have for each BitNode -* Overloaded kill() function so that you can kill a script by its PID -* spawn() now only takes 10 seconds to run (decreased from 20 seconds) -* run() and exec() now return the PID of the newly-executed scripts, rather than a boolean - * (A PID is just a positive integer) -* run(), exec(), and spawn() no longer need to be await-ed in NetscriptJS -* Script parsing and RAM calculations now support ES9 -* installAugmentations() no longer has a return value since it causes all scripts to die -* isBusy() now returns true if you are in a Hacking Mission -* Bug fix: workForFaction() function now properly accounts for disabled logs -* Bug fix: RAM should now be properly calculated when running a callback script with installAugmentations() -* Bug fix: Fixed bug that caused scripts killed by exit()/spawn() to "clean up" twice - -**Misc Changes** - -* The 'kill' Terminal command can now kill a script by its PID -* Added 'Solarized Dark' theme to CodeMirror editor -* After Infiltration, you will now return to the company page rather than the city page -* Bug fix: Stock Market UI should no longer crash for certain locale settings -* Bug fix: You can now properly remove unfinished programs (the `*.exe-N%-INC` files) -* Bug fix: Fixed an issue that allowed you to increase money on servers with a 'maxMoney' of 0 (like CSEC) -* Bug fix: Scripts no longer persist if they were started with syntax/import errors -* Bug fix: 'hack' and 'analyze' Terminal commands are now blocking -* Bug fix: Exp earned by duplicate sleeves at universities/gyms now takes hash upgrades into account - -v0.47.1 - 6/27/2019 -------------------- -* Stock Market changes: - * Transactions no longer influence stock prices (but they still influence forecast) - * Changed the way stocks behave, particularly with regard to how the stock forecast occasionally "flips" - * Hacking & growing a server can potentially affect the way the corresponding stock's forecast changes - * Working for a company positively affects the way the corresponding stock's forecast changes - -* Scripts now start/stop instantly -* Improved performance when starting up many copies of a new NetscriptJS script (by Ornedan) -* Improved performance when killing scripts -* Dialog boxes can now be closed with the ESC key (by jaguilar) -* NetscriptJS scripts should now be "re-compiled" if their dependencies change (by jaguilar) -* write() function should now properly cause NetscriptJS scripts to "re-compile" (by jaguilar) - -v0.47.0 - 5/17/2019 -------------------- -* Stock Market changes: - * Implemented spread. Stock's now have bid and ask prices at which transactions occur - * Large transactions will now influence a stock's price and forecast - * This "influencing" can take effect in the middle of a transaction - * See documentation for more details on these changes - * Added getStockAskPrice(), getStockBidPrice() Netscript functions to the TIX API - * Added getStockPurchaseCost(), getStockSaleGain() Netscript functions to the TIX API - -* Re-sleeves can no longer have the NeuroFlux Governor augmentation - * This is just a temporary patch until the mechanic gets re-worked - -* hack(), grow(), and weaken() functions now take optional arguments for number of threads to use (by MasonD) -* codingcontract.attempt() now takes an optional argument that allows you to configure the function to return a contract's reward -* Adjusted RAM costs of Netscript Singularity functions (mostly increased) -* Adjusted RAM cost of codingcontract.getNumTriesRemaining() Netscript function -* Netscript Singularity functions no longer cost extra RAM outside of BitNode-4 -* Corporation employees no longer have an "age" stat -* Gang Wanted level gain rate capped at 100 (per employee) -* Script startup/kill is now processed every 3 seconds, instead of 6 seconds -* getHackTime(), getGrowTime(), and getWeakenTime() now return Infinity if called on a Hacknet Server -* Money/Income tracker now displays money lost from hospitalizations -* Exported saves now have a unique filename based on current BitNode and timestamp -* Maximum number of Hacknet Servers decreased from 25 to 20 -* Bug Fix: Corporation employees stats should no longer become negative -* Bug Fix: Fixed sleeve.getInformation() throwing error in certain scenarios -* Bug Fix: Coding contracts should no longer generate on the w0r1d_d43m0n server -* Bug Fix: Duplicate Sleeves now properly have access to all Augmentations if you have a gang -* Bug Fix: getAugmentationsFromFaction() & purchaseAugmentation() functions should now work properly if you have a gang -* Bug Fix: Fixed issue that caused messages (.msg) to be sent when refreshing/reloading the game -* Bug Fix: Purchasing hash upgrades for Bladeburner/Corporation when you don't actually have access to those mechanics no longer gives hashes -* Bug Fix: run(), exec(), and spawn() Netscript functions now throw if called with 0 threads -* Bug Fix: Faction UI should now automatically update reputation -* Bug Fix: Fixed purchase4SMarketData() -* Bug Fix: Netscript1.0 now works properly for multiple 'namespace' imports (import * as namespace from "script") -* Bug Fix: Terminal 'wget' command now correctly evaluates directory paths -* Bug Fix: wget(), write(), and scp() Netscript functions now fail if an invalid filepath is passed in -* Bug Fix: Having Corporation warehouses at full capacity should no longer freeze game in certain conditions -* Bug Fix: Prevented an exploit that allows you to buy multiple copies of an Augmentation by holding the 'Enter' button -* Bug Fix: gang.getOtherGangInformation() now properly returns a deep copy -* Bug Fix: Fixed getScriptIncome() returning an undefined value -* Bug Fix: Fixed an issue with Hacknet Server hash rate not always updating - -v0.46.3 - 4/20/2019 -------------------- -* Added a new Augmentation: The Shadow's Simulacrum -* Improved tab autocompletion feature in Terminal so that it works better with directories -* Bug Fix: Tech vendor location UI now properly refreshed when purchasing a TOR router -* Bug Fix: Fixed UI issue with faction donations -* Bug Fix: The money statistics & breakdown should now properly track money earned from Hacknet Server (hashes -> money) -* Bug Fix: Fixed issue with changing input in 'Minimum Path Sum in a Triangle' coding contract problem -* Fixed several typos in various places - -v0.46.2 - 4/14/2019 -------------------- -* Source-File 2 now allows you to form gangs in other BitNodes when your karma reaches a very large negative value - * (Karma is a hidden stat and is lowered by committing crimes) - -* Gang changes: - * Bug Fix: Gangs can no longer clash with themselve - * Bug Fix: Winning against another gang should properly reduce their power - -* Bug Fix: Terminal 'wget' command now works properly -* Bug Fix: Hacknet Server Hash upgrades now properly reset upon installing Augs/switching BitNodes -* Bug Fix: Fixed button for creating Corporations - -v0.46.1 - 4/12/2019 -------------------- -* Added a very rudimentary directory system to the Terminal - * Details here: https://bitburner.readthedocs.io/en/latest/basicgameplay/terminal.html#filesystem-directories - -* Added numHashes(), hashCost(), and spendHashes() functions to the Netscript Hacknet Node API -* 'Generate Coding Contract' hash upgrade is now more expensive -* 'Generate Coding Contract' hash upgrade now generates the contract randomly on the server, rather than on home computer -* The cost of selling hashes for money no longer increases each time -* Selling hashes for money now costs 4 hashes (in exchange for $1m) -* Bug Fix: Hacknet Node earnings should work properly when game is inactive/offline -* Bug Fix: Duplicate Sleeve augmentations are now properly reset when switching to a new BitNode - -v0.46.0 - 4/3/2019 ------------------- -* Added BitNode-9: Hacktocracy -* Changed BitNode-11's multipliers to make it slightly harder overall -* Source-File 11 is now slightly stronger -* Added several functions to Netscript Sleeve API for buying Sleeve augmentations (by hydroflame) -* Added a new stat for Duplicate Sleeves: Memory -* Increase baseline experience earned from Infiltration, but it now gives diminishing returns (on exp) as you get to higher difficulties/levels -* In Bladeburner, stamina gained from Hyperbolic Regeneration Chamber is now a percentage of your max stamina - -* Corporation Changes: - * 'Demand' value of products decreases more slowly - * Bug Fix: Fixed a Corporation issue that broke the Market-TA2 Research - * Bug Fix: Issuing New Shares now works properly - -* Bug Fix: Money Statistics tracker was incorrectly recording profits when selling stocks manually -* Bug Fix: Fixed an issue with the job requirement tooltip for security jobs - -v0.45.1 - 3/23/2019 -------------------- -* Added two new Corporation Researches -* General UI improvements (by hydroflame and koriar) -* Bug Fix: Sleeve Netscript API should no longer cause Dynamic RAM errors -* Bug Fix: sleeve.getSleeveStats() should now work properly - -v0.45.0 - 3/22/2019 -------------------- -* Corporation changes: - * Decreased the time of a full market cycle from 15 seconds to 10 seconds. - * This means that each Corporation 'state' will now only take 2 seconds, rather than 3 - * Increased initial salaries for newly-hired employees - * Increased the cost multiplier for upgrading office size (the cost will increase faster) - * The stats of your employees now has a slightly larger effect on production & sales - * Added several new Research upgrades - * Market-TA research now allows you to automatically set sale price at optimal values - * Market-TA research now works for Products (not just Materials) - * Reduced the amount of Scientific Research needed to unlock the Hi-Tech R&D Laboratory from 10k to 5k - * Energy Material requirement of the Software industry reduced from 1 to 0.5 - * It is now slightly easier to increase the Software industry's production multiplier - * Industries now have a maximum number of allowed products, starting at 3. This can be increased through research. - * You can now see an approximation of how each material affects an industry's production multiplier by clicking the "?" help tip next to it - * Significantly changed the effects of the different employee positions. See updated descriptions - * Reduced the amount of money you gain from private investors - * Training employees is now 3x more effective - * Bug Fix: An industry's products are now properly separated between different cities - -* The QLink Augemntation is now significantly stronger, but also significantly more expensive (by hydroflame) -* Added a Netscript API for Duplicate Sleeves (by hydroflame) -* Modified the multipliers of BitNode-3 and BitNode-8 to make them slightly harder -* After installing Augmentations, Duplicate Sleeves will now default to Synchronize if their Shock is 0 -* Bug Fix: Bladeburner's Hyperbolic Regeneration Chamber should no longer instantly refill all stamina -* Bug Fix: growthAnalyze() function now properly accounts for BitNode multipliers -* Bug Fix: The cost of purchasing Augmentations for Duplicate Sleeves no longer scales with how many Augs you've purchased for yourself - -v0.44.1 - 3/4/2019 ------------------- -* Duplicate Sleeve changes: - * You can now purchase Augmentations for your Duplicate Sleeves - * Sleeves are now assigned to Shock Recovery task by default - * Shock Recovery and Synchronize tasks are now twice as effective - -* Changed documentation so that Netscript functions are own their own pages. Sorry if this is annoying, it was necessary for properly cross-referencing -* Officially deprecated the Wiki (the fandom site). Use the 'readthedocs' Documentation instead -* Bug Fix: 'rm' Terminal and Netscript commands now work on non-program files that have '.exe' in the name (by Github user MasonD) -* Bug Fix: The 'Find All Valid Math Expressions' Coding Contract should now properly ignore whitespace in answers -* Bug Fix: The 'Merge Overlapping Intervals' Coding Contract should now properly accept 2D arrays when being attempted through Netscript - -v0.44.0 - 2/26/2019 -------------------- -* Bladeburner Changes: - * Reduced the amount of rank needed to earn a skill point - * Reduced the effects of the "Reaper" and "Evasive System" skills - * Increased the effect of the "Hyperdrive" and "Hands of Midas" skills - * Slightly increased the rate which the skill point cost rises for almost all skills - * The "Overlock" Skill now has a maximum level of 90 instead of 95 - * Money earned from Contracts increased by 400% - * Changed the way population affects success rate. Extreme populations now have less dramatic effects - * Added two new General Actions: Diplomacy and Hyperbolic Regeneration Chamber - * Lowered the rep and money cost of the "Blade's Simulacrum" augmentation - * Significantly decreased the initial amount of Contracts/Operations (the "Contracts/Operations remaining" value) - * Decreased the rate at which the amount of Contracts/Operations increases over time - * Decreased the number of successes you need to increase the max level of a Contract/Operation - * Increased the average number of Synthoid communities each city has - * Reduced the amount by which a successful raid will decrease the population of a city - * The "riots" event will now increase the chaos of a city by a greater amount - * Significantly increased the effect that Agility and Dexterity have on action time -* Added new BitNode multipliers: - * HomeComputerRamCost - Affects how much it costs to upgrade home computer's RAM - * DaedalusAugsRequirement - Affects how many Augmentations you need in order to get invited to Daedalus - * FourSigmaMarketDataCost - Affects how much it costs to unlock the stock market's 4S Market Data - * FourSigmaMarketDataApiCost - Affects how much it costs to unlock the stock market's 4S Market Data API -* A few minor changes to BitNode multipliers across the board (mostly for the new multipliers) -* 'The Covenant' now requires 20 total Augmentations to get invited, rather than 30 -* You can now purchase permanent Duplicate Sleeves from 'The Covenant'. This requires Source-File 10, and you must be in BN-10 or after -* You can now track where all of your money comes from in the 'Stats' page -* Increased the money gained from Coding Contracts by 50% -* getCharacterInformation() function now returns the player's HP and max HP -* Bug Fix: You can no longer disconnect the enemy's connections in Hacking Missions -* Bug Fix: Duplicate Sleeve faction reputation gain is now properly affected by faction favor -* Bug Fix: After installing Augmentations, the Terminal display will now correctly show the current server as "home" -* Bug Fix: Fixed an exploit where you could change the duration of timed functions (e.g. hack, weaken) in NetscriptJS -* Bug Fix: You should now properly be able to use the ServerProfile.exe program -* Bug Fix: Prevented exploit that allowed you to accept faction invites programmatically through NetscriptJS -* Bug Fix: Faction invitations for megacorporations should now work properly - -v0.43.1 - 2/11/2019 -------------------- -* Terminal changes: - * Quoted arguments are now properly parsed. (e.g. 'run f.script "this is one argument"' will be correctly parsed) - * Errors are now shown in red text - * 'unalias' command now has a different format and no longer needs the quotations - * Bug Fix: Fixed several edge cases where autocomplete wasn't working properly - -* Added two new Bladeburner skills for increasing money and experience gain -* Made some minor adjustments to Bladeburner UI -* Corporation "Smart Factories" and "Smart Storage" upgrades have slightly lower price multipliers -* Added nFormat Netscript function -* Added 6 new Coding Contract problems -* Updated documentation with list of all Coding Contract problems -* Minor improvements for 'Active Scripts' UI -* Implemented several optimizations for active scripts. The game should now use less memory and the savefile should be slightly smaller when there are many scripts running -* Bug Fix: A Stock Forecast should no longer go above 1 (i.e. 100%) -* Bug Fix: The cost of Resleeves should no longer be affected by buying Augs -* Bug Fix: Duplicate Sleeves now use their own stats to determine crime success rate, instead of the host consciousness' stats -* Bug Fix: You can now call the prompt() Netscript function from multiple scripts simultaneously - - -v0.43.0 - 2/4/2019 ------------------- - -* Added BitNode-10: Digital Carbon - -* Stock Market Changes: - * Each stock now has a maximum number of shares you can purchase (both Long and Short positions combined) - * Added getStockMaxShares() Netscript function to the TIX API - * The cost of 4S Market Data TIX API Access increased from $20b to $25b - -* Job Changes: - * You can now hold multiple jobs at once. This means you no longer lose reputation when leaving a company - * Because of this change, the getCharacterInformation() Netscript function returns a slightly different value - -* Script Editor Changes: - * Added new script editor: CodeMirror. You can choose between the old editor (Ace) or CodeMirror - * Navigation keyboard shortcuts no longer work if the script editor is focused - -* Trying to programmatically run a script (run(), exec()) with a 'threads' argument of 0 will now cause the function to return false without running the script -* Home Computer RAM is now capped at 2 ^ 30 GB (1073741824 GB) -* The maximum amount, maximum RAM, and cost of purchasing servers can now vary between different BitNodes (new BitNode multipliers) -* Pop-up dialog boxes are a little bit bigger -* Bug Fix: When importing scripts, "./" will now be properly ignored (e.g. import { foo } from "./lib.script" ) - -v0.42.0 - 1/8/2019 ------------------- - -* Corporation Changes: - * Corporation can now be self-funded with $150b or using seed money in exchange for 500m newly-issued shares - * In BitNode-3, you no longer start with $150b - * Changed initial market prices for many materials - * Changed the way a material's demand, competition, and market price change over time - * The sale price of materials can no longer be marked-up as high - * Added a Research Tree mechanic. Spend Scientific Research on permanent upgrades for each industry - * You can now redistribute earnings to shareholders (including yourself) as dividends - * Cost of "Smart Supply" upgraded reduced from $50b to $25b - * Now has offline progress, which works similarly to the Gang/Bladeburner mechanics - * Slightly reduced the amount of money offered to you by investment firms - * Employee salaries now slowly increase over time - * Slightly reduced the effect "Real Estate" has on the Production Multiplier for the Agriculture industry - * Changed the way your Corporation's value is calculated (this is what determines stock price) - * After taking your corporation public, it is now possible to issue new shares to raise capital - * Issuing new shares can only be done once every 12 hours - * Buying back shares must now be done at a premium - * Selling shares can now only be done once per hour - * Selling large amounts of shares now immediately impacts stock price (during the transaction) - * Reduced the initial cost of the DreamSense upgrade from $8b to $4b, but increased its price multiplier - * Reduced the price multiplier for ABC SalesBots upgrade - -* Added getOrders() Netscript function to the TIX API -* Added getAugmentationPrereq() Singularity function (by havocmayhem) -* Added hackAnalyzePercent() and hackAnalyzeThreads() Netscript functions -* Stock Market, Travel, and Corporation main menu links are now properly styled -* Many pop-up/dialog boxes now support the 'Enter' and 'Esc' hotkeys. If you find a pop-up/dialog box that doesnt support this, let me know specifically which one ('Enter' for the default option, 'Esc' for cancelling and closing the pop-up box) -* Added "brace_style = preserve_inline" configuration to Script Editor Beautifier -* ServerProfiler.exe can now be purchased from the Dark Web -* Added an option to copy save data to clipboard -* Added total multiplier information on the "Augmentations" page -* Bug Fix: gymWorkout() Singularity function should now work properly with Millenium Fitness Gym -* Began migrating gameplay information to the ReadTheDocs documentation - -v0.41.2 - 11/23/2018 --------------------- -* IMPORTANT - Netscript Changes: - * rm() now takes an optional parameter that lets you specify on which server to delete the file - * Added growthAnalyze() Netscript function - -* Gang Changes: - * UI now displays your chance to win a clash with other gangs - * Added getChanceToWinClash() function to the Gang API - * Added getEquipmentType() function to the Gang API - * Added several new hacking-based equipment and Augmentations - * Rebalanced several equipment/upgrades to give less defense - * Wanted level gain rate is now be slightly higher for all tasks - * Rebalanced parameters for "hacking" tasks - -* Added new Main Menu configuration in .fconf: "compact" -* Added the terminal command 'expr', which can be used to evaluate simple mathematical expressions -* Bug Fix: Can no longer purchase duplicate equipment/Augmentations through gang.purchaseEquipment() -* Bug Fix: scp() should no longer throw errors when used with 2-arguments and an array of files -* Bug Fix: Coding Contracts no longer give money in BitNode-8 -* Bug Fix: In Bladeburner, you can no longer start a BlackOp through the Netscript API if it has already been completed -* Bug Fix: In Bladeburner, fixed a bug which caused the configured 'automate' actions to occasionally be switched to other actions -* Bug Fix: 'Return to World' button at locations no longer accumulates event listeners -* Bug Fix: Working & taking classes now continuously add/subtract money during the action, instead of doing it at completion -* Bug Fix: Top-right overview panel now displays negative money using '-' instead of '()' -* Bug Fix: Stock Market UI should no longer show 'NaN' profit immediately after buying a stock - -v0.41.1 - 11/5/2018 -------------------- -* IMPORTANT - Netscript Changes: - * purchaseTor() now returns true if you already have a TOR router (it used to return false) - * getPurchasedServerCost() now returns Infinity if the specified RAM is an invalid amount or is greater than the max amount of RAM (2 ^ 20 GB) - * Added purchase4SMarketData() and purchase4SMarketDataTixApi() functions - * getScriptLogs() now takes in optional arguments that let you get the logs of another script - -* Stock Market changes: - * Stocks now have "maximum prices". These are hidden from the player - * If a stock reaches its "maximum price", it will most likely drop in value (although it might still rise) - * Each stock has its own, unique maximum price - * Maximum price for each stock are randomly generated and change during each 'reset' - * Stock Market cycles are now accumulated/stored, much like it is for Gangs and Bladeburners - * Accumulated/stored cycles cause stock prices to update up to 50% faster (from every 6 seconds to 4 seconds) - * This means that after coming back from being offline, stock prices will update faster to make up for offline time - -* Decreased the Hacking Level multiplier for BitNodes 6 and 7 to 0.4 (from 0.5) -* Bladeburner console history is now saved and persists when switching screens or closing/reopening the game -* In Bladeburner, if your stamina reaches 0 your current action will be cancelled -* b1t_flum3.exe is no longer removed from your home computer upon reset -* Added main menu link for the Stock Market (once you've purchased an account) -* Job main menu link only appears if you actually have a job -* Bug Fix: Netscript Gang API functions purchaseEquipment() and ascendMember() should now work properly -* Bug Fix: After installing Augs, the "Portfolio Mode" button on the Stock Market page should be properly reset -* Bug Fix: bladeburner.getActionCountRemaining()'s return value is now rounded down (by Kline-) - -v0.41.0 - 10/29/2018 --------------------- -* WARNING: In NetscriptJS, defining a function called print() is no longer possible -* Gang Mechanic Changes (BitNode-2): - * Added a Gang Netscript API - * Added new 'ascension' mechanic for Gang Members - * The first three gang members are now 'free' (can be recruited instantly) - * Maximum number of increased Gang Members increased from 20 to 30 - * Changed the formula for calculating respect needed to recruit the next gang member - * Added a new category of upgrades for Gang Members: Augmentations - * Non-Augmentation Gang member upgrades are now significantly weaker - * Reputation for your Gang faction can no longer be gained through Infiltration - * Re-worked the territory 'warfare' mechanic so that player can choose when to engage in it - * Gang Members can now be killed during territory 'warfare' - * Changed BitNode-2 Multipliers to make hacking slightly less profitable - * Gang Member Equipment + Upgrades now get cheaper as your gang grows in power and respect - * The effects of Source-File 2 are now slightly more powerful -* RAM Cost of accessing the global document object lowered from 100 GB to 25 GB -* RAM Cost to use Singularity Functions outside of BitNode-4 lowered by 75%. They now only cost twice as much as they do in BitNode-4 -* b1t_flum3.exe now takes significantly less time to create -* Crimes commited through Singularity function no longer give half money/exp (there is now no penalty) -* Improved number formatting for Player 'work' actions (including crimes, etc.). These numbers should also adhere to locale settings now (by Kline-) -* The order that Augmentations are listed in (when purchasing from Faction and viewing your Augmentations) is now saved and persists when choosing different orders -* getCharacterInformation() Singularity function now returns multiplier information (from Augmentations/Source Files) -* Bug Fix: Calling print() in NetscriptJS no longer brings up the print dialog -* Bug Fix: Fixed a bug that sometimes caused a blank black screen when destroying/resetting/switching BitNodes -* Bug Fix: Netscript calls that throw errors will now no longer cause the 'concurrent calls' error if they are caught in the script. i.e. try/catch should now work properly in scripts -* Bug Fix: Fixed a bug where sometimes the NeuroFlux Governor Augmentation level would be incorrectly calculated when the game was loaded -* Bug Fix: Fixed a bug where calling the scp() Netscript function with invalid hostname/ips would throw an unclear error message -* Bug Fix: Bladeburner API function getActionCountRemaining() should now work properly for BlackOps -* Bug Fix: Black Ops can no longer be attempted out-of-order or without the required rank via Bladeburner API -* Bug Fix: Dynamic RAM Calculation now properly accounts for number of threads -* RAM cost for basic Netscript functions added to documentation (by CBJamo) - -v0.40.5 - 10/09/2018 --------------------- -* Added codingcontract.getContractType() Netscript function -* Bug Fix: codingcontract.getData() Netscript function now returns arrays by value rather than reference -* Bug Fix: Decreased highest possible data value for 'Find Largest Prime Factor' Coding Contract (to avoid hangs when solving it) -* Bug Fix: Fixed a bug that caused game to freeze during Coding Contract generation - -v0.40.4 - 9/29/2018 -------------------- -* Added new Coding Contracts mechanic. Solve programming problems to earn rewards -* The write() and read() Netscript functions now work on scripts -* Added getStockSymbols() Netscript function to the TIX API (by InfraK) -* Added wget() Netscript function -* Added bladeburner.getActionRepGain() function to the Netscript Bladeburner API -* The getLevelUpgradeCost(), getRamUpgradeCost(), and getCoreUpgradeCost() functions in the Hacknet API now return Infinity if the node is at max level. See documentation -* It is now possible to use freely use angled bracket (<, >) and create DOM elements using tprint() -* The game's theme colors can now be set through the Terminal configuration (.fconf). -* You can now switch to the old left-hand main menu bar through the Terminal configuration (.fconf) -* Bug Fix: grow() percentage is no longer reported as Infinity when a server's money is grown from 0 to X -* Bug Fix: Infiltration popup now displays the correct amount of exp gained - -v0.40.3 - 9/15/2018 -------------------- -* Bladeburner Changes: - * Increased the effect that agi and dexterity have on action time - * Starting number of contracts/operations available will be slightly lower - * Random events will now happen slightly more often - * Slightly increased the rate at which the Overclock skill point cost increases -* The maximum volatility of stocks is now randomized (randomly generated within a certain range every time the game resets) -* Increased the range of possible values for initial stock prices -* b1t_flum3.exe program can now be created immediately at Hacking level 1 (rather than hacking level 5) -* UI improvements for the character overview panel and the left-hand menu (by mat-jaworski) -* General UI improvements for displays and Terminal (by mat-jaworski) -* Added optional parameters to the getHackTime(), getGrowTime(), and getWeakenTime() Netscript functions -* Added isLogEnabled() and getScriptLogs() Netscript functions -* Added donateToFaction() Singularity function -* Updated documentation to reflect the fact that Netscript port handles (getPortHandle()) only works in NetscriptJS (2.0), NOT Netscript 1.0 -* Added tryWrite() Netscript function -* When working (for a company/faction), experience is gained immediately/continuously rather than all at once when the work is finished -* Added a setting in .fconf for enabling line-wrap in the Terminal input -* Adding a game option for changing the locale that most numbers are displayed in (this mostly applies for whenever money is displayed) -* The randomized parameters of many high-level servers can now take on a higher range of values -* Many 'foreign' servers (hackable servers that you don't own) now have a randomized amount of RAM -* Added 'wget' Terminal command -* Improved the introductory tutorial - -v0.40.2 - 8/27/2018 -------------------- -* Bladeburner Changes: - * Added getBonusTime(), getSkillUpgradeCost(), and getCity() Netscript functions to the API - * Buffed the effects of many Bladeburner Augmentations - * The Blade's Simulacrum Augmentation requires significantly less reputation but slightly more money - * Slightly increased the amount of successes needed for a Contract/Operation in order to increase its max level - * Increased the amount of money gained from Contracts by ~25% - * Increased the base amount of rank gained from Operations by 10% - * Significantly increased the 'randomness' in determining a Contract/Operation's initial count and rate of count increase - * The number (count) of Operations should now increase significantly faster - * There are now, on average, more Synthoid communities in a city - * If automation is enabled (the feature in Bladeburner console), then switching to another action such as working for a company will now disable the automation -* Stock Market Changes: - * Added a watchlist filter feature to the UI that allows you to specify which stocks to show - * Added the Four Sigma (4S) Market Data feed, which provides volatility and price forecast information about stocks - * Added the 4S Market Data TIX API, which lets you access the aforementioned data through Netscript -* There is now a setting for enabling/disabling the popup that appears when you are hospitalized -* Bug Fix: Stock market should now be correctly initialized in BitNode-8 (by Kline-) -* Bug Fix: bladeburner.getCurrentAction() should now properly an 'Idle' object rather than null (by Kline-) -* Bug Fix: Bladeburner skill cost multiplier should now properly increase in BitNode-12 (by hydroflame) -* Bug Fix: 'document', 'hacknet', and 'window' keywords should no longer be counted multiple times in RAM calculations -* Bug Fix: Joining factions through Singularity functions should now prevent you from joining opposing factions -* Bug Fix: Four Sigma should no longer have two 'Speech Enhancement' Augmentations (by Kline-) - -v0.40.1 - 8/5/2018 - Community Update -------------------------------------- -* Added getPurchasedServerCost() Netscript function (by kopelli) -* Added getFavorToDonate() Netscript function (by hydroflame) -* Added getFactionFavorGain() and getCompanyFavorGain() Singularity functions (by hydroflame) -* Accumulated 'bonus' time in Bladeburner is now displayed in the UI (by hydroflame) -* The Red Pill can now be purchased with negative money (since its supposed to be free) (by hydroflame) -* Cranial Signal Processor Augmentations now have the previous generation as a prerequisite. i.e. Cranial Signal Processor - Gen II requires Gen I (by Kline-) -* Terminal now supports semicolon usage (end of command). This allows chaining multiple Terminal commands (by hydroflame) -* Bladeburner Raid operations can no longer be performed if your estimate of Synthoid communities is zero (by hydroflame) -* The difficulty of BN-12 now scales faster (by hydroflame) -* Active Scripts UI now shows a RAM Usage bar for each server (by kopelli) -* Bug Fix: Corrected terminal timestamp format (by kopelli) -* Bug Fix: NetscriptJS scripts should now die properly if they don't have a 'main' function (by hydroflame) -* Bug Fix: write(), read(), and tryWrite() Netscript functions should now work properly for writing Arrays/objects to Netscript Ports -* Various minor UI/QOL fixes by hydroflame, kopelli, and Kline- - -v0.40.0 - 7/28/2018 -------------------- -* **WARNING: This update makes some significant changes to Netscript and therefore you may need to make some changes to your scripts. See** `this post `_ **this post for details** -* Netscript 1.0 (NS1) now uses a fully-fledged ES5 JavaScript Interpreter. This means many new features are now available in NS1, and this also fixes several bugs. - However this also means any ES6+ features are no longer supported in NS1 -* When a server is hacked with a very large number of threads and left with no money, the server's security level - now only increases by however many threads were needed to drain the server. For example, if you hack a server with - 5000 threads but it only needed 2000 threads to deplete the server's money, then the server's security will only increase - as if you had hacked it with 2000 threads (change by hydroflame) -* Added getCurrentAction() to Bladeburner API -* Added a variety of functions to Bladeburner API that deal with action levels (change by hydroflame) -* Added getPurchasedServerLimit() and getPurchasedServerMaxRam() functions to Netscript (change by hydroflame & kopelli) -* Added getOwnedSourceFiles() Singularity function (by hydroflame) -* Completely re-designed the Hacknet Node API -* getSkillLevel() in Bladeburner API now returns an error if no argument is passed in (as opposed to an object with all skill levels). This may break scripts -* Minimum Netscript execution time reduced from 15ms to 10ms (configurable in Options) -* Company reputation needed to get invited to Megacorporation factions decreased from 250k to 200k -* HP is now reset (restored) when Augmenting -* Source-File 6 now increases both the level and experience gain of all combat stats (it was only experience gain previously) -* Reverted a previous change for Source-File 12. It's benefits are now multiplicative rather than additive -* Starting Infiltration security level for almost every location decreased by ~10% -* Changed 'fl1ght.exe' message when its listed conditions are fulfilled (by hydroflame) -* The 'Save Game' button in the top-right overview panel now flashes red if autosave is disabled -* Bug Fix: Infiltration buttons can no longer be clicked through NetscriptJS -* Bug Fix: Bladeburner 'Overclock' skill can no longer be leveled above max level through the API (by hydroflame) -* Bug Fix: Healthcare division in Bladeburner should no longer cause game to crash - -v0.39.1 - 7/4/2018 ------------------- - -* Bladeburner Rank gain in BN-7 is now reduced by 40% instead of 50% -* Quadrupled the amount of money gained from Bladeburner contracts -* Added joinBladeburnerDivision() Netscript function to Bladeburner API -* Doubled the effects of Source-File 5. Now gives 8%, 12%, and 14% increase to all hacking multipliers at levels 1, 2, and 3, respectively (increased from 4%/6%, 7%) -* Increased the effect of Source-File 8. It now gives a 12%, 18% and 21% to your hacking growth multiplier at levels 1, 2, and 3, respectively (increased from 8%, 12%, 14%) -* The effect of Source-File 12 is now additive with itself, rather than multiplicative. This means that level N of Source-File 12 now increases all multipliers by N% -* The setting to suppress the confirmation box when purchasing Augmentations was moved into the main Options menu (by Github user hydroflame) -* Bug Fix: Crime Success rates were being calculated incorrectly (by Github user hydroflame) -* When an Infiltration is finished, you will now return back to the company's page, rather than the city -* Infiltration faction reputation selector now remembers your last choice -* Significantly increased the amount of money gained from Infiltration -* Bug Fix: Copying a NetscriptJS script to another server using scp now properly takes into account the script's changes. -* Bug Fix: Fixed an issue where game would not load in Edge due to incompatible features -* travelToCity() Singularity function no longer grants Intelligence exp" - -v0.39.0 - 6/25/2018 -------------------- - -* Added BitNode-7: Bladeburner 2079 -* Infiltration base difficulty decreased by 10% for most locations -* Experience gains from Infiltration slightly increased -* Money gained from Infiltration increased by 20% -* Added 'var' declarations in Netscript 1.0 (only works with 'var', not 'let' or 'const') -* Script base RAM cost is now 1.6 GB (increased from 1.4 GB) -* While/for loops and if statements no longer cost RAM in scripts -* Made short-circuit evaluation logic more consistent in Netscript 1.0 (see https://github.com/danielyxie/bitburner/issues/308) -* Changelog button in the Options menu now links to the new Changelog URL (by Github user thePalindrome) -* Skill level calculation is now 'smoother' (by Github user hydroflame) -* Added a button to 'beautify' scripts in the text editor (by Github user hydroflame) -* Added favicon (by Github user kopelli) - -v0.38.1 - 6/15/2018 -------------------- -* Bug Fix: Using 'Object.prototype' functions like toLocaleString() or toString() should no longer cause errors in NetscriptJS -* Implemented by Github user hydroflame: - * Accessing the 'window' and 'document' objects in Netscript JS now requires a large amount of RAM (100 GB) - * Added game option to suppress travel confirmation - * Text on buttons can no longer be highlighted - * Bug Fix: Fixed an issue that caused NaN values when exporting Real Estate in Corporations - * Bug Fix: Competition and Demand displays in Corporation are now correct (were reversed before) - * Added ps() Netscript function - * Bug Fix: grow() should no longer return/log a negative value when it runs on a server that's already at max money - * Bug Fix: serverExists() Netscript function should now properly return false for non-existent hostname/ips - * Bug Fix: Sever's security level should now properly increase when its money is grown to max value - -v0.38.0 - 6/12/2018 -------------------- -* New BitNode: BN-12 The Recursion - Implemented by Github user hydroflame -* Bladeburner Changes: - * Bladeburner progress is no longer reset when installing Augmentations - * The number of successess needed to increase a Contract/Operation's max level now scales with the current max level (gradually gets harder) - * All Bladeburner Augmentations are now slightly more expensive and require more reputation - * Black Operations now give higher rank rewards - * Doubled the base amount of money gained from Contracts - * Increased the amount of experience gained from Contracts/Actions - * Added a new Augmentation: The Blade's Simulacrum - * Bladeburner faction reputation gain is now properly affected by favor -* Hacking is now slightly less profitable in BitNode-3 -* Updated Hacknet Nodes UI - Implemented by Github user kopelli -* Bug Fix: Fixed an exploit that allowed calling any Netscript function without incurring any RAM Cost in NetscriptJS - -v0.37.2 - 6/2/2018 ------------------- - -* After joining the Bladeburners division, there is now a button to go to the Bladeburner content - in the 'City' page -* You now start with $250m in BitNode-8 (increased from $100m) -* Bug Fix: You can now no longer directly edit Hacknet Node values through NetscriptJS (hopefully) -* Bug Fix: Bladeburners is no longer accessible in BN-8 -* Bug Fix: getBitNodeMultipliers() Netscript function now returns a copy rather than the original object - -v0.37.1 - 5/22/2018 -------------------- -* You now earn money from successfully completing Bladeburner contracts. The amount you earn is based - on the difficulty of the contract. -* Completing Field Analysis in Bladeburner now grants 0.1 rank -* The maximum RAM you can get on a purchased server is now 1,048,576 GB (2^20) -* Bug Fix: Fixed Netscript syntax highlighting issues with the new NetscriptJS -* Bug Fix: Netscript Functions now properly incur RAM costs in NetscriptJS -* Bug Fix: deleteServer() now fails if its called on the server you are currently connected to -* Removed in-game Netscript documentation, since it was outdated and difficult to maintain. -* Bug Fix: Updated the gymWorkout() Singularity function with the new exp/cost values for gyms - - -v0.37.0 - 5/20/2018 -------------------- -* NetscriptJS (Netscript 2.0) released (Documentation here: http://bitburner.readthedocs.io/en/latest/netscriptjs.html) -* Running the game with the '?noScripts' query will start the game without loading any of your scripts. This should be used if you accidentally write a script that crashes your game - -v0.36.1 - 5/11/2018 -------------------- -* Bladeburner Changes: - * Bug Fix: You can no longer get Bladeburner faction reputation through Infiltration - * Initial difficulty of Tracking contracts reduced - * Datamancer skill effect increased from 4% per level to 5% - * Slightly decreased the base stamina cost of contracts/operations - * Slightly increased the effects of the Tracer, Digital Observer, Short Circuit, Cloak, and Blade's Intuition skills - * Overclock skill capped at level 95, rather than 99 - * Training gives significantly more exp/s -* Crime, Infiltration, and Hacking are now slightly more profitable in BN-6 -* Gyms are now more expensive, but give slightly more exp -* Added getScriptName() and getHacknetMultipliers() Netscript functions (added by Github user hydroflame) -* getScriptRam() Netscript function now has default value for the second argument, which is hostname/ip (implemented by Github user hydroflame) -* There is now a soft-cap on stock price, which means it's no longer possible for the price of a stock to reach insanely-high values -* The ctrl+b hotkey in the text editor should now also be triggered by command+b on OSX (I don't have OSX so I can't confirm if this works) -* Many servers now have additional RAM -* Added an option to disable hotkeys/keyboard shortcuts -* Refactored 'Active Scripts' UI page to optimize its performance -* Added a new .fconf Terminal setting: ENABLE_TIMESTAMP -* 'Netscript Execution Time', which can be found in the Options, now has a minimum value of 15ms rather than 25ms -* Bug Fix: Fixed a typo in the Fulcrum Technologies company name (Technolgies -> Technologies) -* Bug Fix: hacknetnodes keyword should no longer incur RAM cost if its in a comment -* Bug Fix: disableLog() now works for the commitCrime() Netscript function (fixed by Github user hydroflame) - -v0.36.0 - 5/2/2018 ------------------- -* Added BN-6: Bladeburners -* Rebalanced many combat Augmentations so that they are slightly less powerful -* Bug Fix: When faction invites are suppressed, an invitation will no longer load the Faction page - - -v0.35.2 - 3/26/2018 -------------------- -* Corporation Changes: - * Fixed an issue with Warehouse upgrade cost. Should now be significantly cheaper than before. - * Scientific Research now has a slightly more significant effect on Product quality - * The Energy and Water Utilities industries are now slightly more profitable - * The Robotics and Computer Hardware industries are now less profitable - * The Software industry is slightly less profitable - * When selling Materials and Products, the 'PROD' qualifier can now be used to set dynamic sell amounts based on your production - * Exporting MAX should now work properly - * You can no longer export past storage limits - * Scientific Research production reduced - * Effects of AdVert. Inc upgrade were reduced, but the effect that popularity and awareness have on sales was increased to compensate (popularity/awareness numbers were getting too big with Advert. Inc) - * Bug Fix: Products from Computer Hardware division should now properly have ratings -* Improved Augmentation UI/UX. Now contains collapsible headers and sort buttons -* Improved Faction Augmentations display UI/UX. Now contains sort buttons. There is also an option to disable confirmation when purchasing Augmentations - -v0.35.1 - 3/12/2018 -------------------- -* You can now easily download all of your scripts/text files as zip folders. Use the 'help download' Terminal command for details -* Scripts are now downloaded with the .script.js extension at the end of their filename -* Corporation Management Changes: - * Implemented Smart Supply unlock - * Changed the way a division's Production Multiplier is calculated. It is now the sum of the individual Production Multiplier for every city. Therefore, it is now beneficial to open offices in different cities - * Several small UI/UX improvements - * Numerous balance changes. The significant ones are listed below. - * Product descriptions will now display their estimated market price - * The sale price of Products can no longer be marked up as high as before - * Scientific Research now affects the rating of Products - * In general, the maximum amount of product you are able to sell is reduced - * Sale bonus from advertising (popularity/awareness) now has diminishing returns rather than scaling linearly -* Experience gained during Infiltration now scales linearly based on the clearance level you reach. Compared to before, the experience gained will be much less at lower clearance levels, but much more at higher clearance levels -* The editor can now be used to edit both scripts and text files -* New Terminal config file that can be edited using the command 'nano .fconf'. Right now there is only one option, but there will be more in the future. -* You can now enable Bash-style Terminal hotkeys using the .fconf file referenced above -* Bug Fix: Fixed an issue with the UI elements of Gang Management persisting across different instances of BitNode-2 - -v0.35.0 - 3/3/2018 ------------------- -* Minor rebalancing of BitNodes due to the fact that Corporations provide a (relatively) new method of progressing -* Corporation Management Changes: - * Once your Corporation gets big/powerful enough, you can now bribe Factions for reputation using company funds an/or stock shares - * You can now only create one Division for every Industry type - * Added several new UI/UX elements - * Wilson Analytics multiplier was significantly reduced to 1% per level (additive). - * Reduced the effect of Advert Inc upgrade. Advert Inc. upgrade price increases faster - * Materials can now be marked up at higher prices -* Added Javascript's built-in Number object to Netscript -* Added getCharacterInformation(), getCompanyFavor(), and getFactionFavor() Netscript Singularity functions -* Rebalanced Singularity Function RAM Costs. They now cost x8 as much when outside of BN-4 (rather than x10). Also, many of the functions now use significantly less RAM -* Refactored Netscript Ports. You can now get a handle for a Netscript port using the getPortHandle() Netscript function. This allows you to access a port's underlying queue (which is just an array) and also makes several new functions available such as tryWrite(), full(), and empty(). -* Number of Netscript Ports increased from 10 to 20 -* Netscript assignments should now return proper values. i.e. i = 5 should return 5. -* Added throw statements to Netscript. It's not super useful since 'catch' isn't implemented, but it can be used to generate custom runtime error messages. -* Added import declaration to Netscript. With this, you are able to import functions (and only functions) from other files. Using export declarations is not necessary -* Most Netscript Runtime errors (the ones that cause your script to crash) should now include the line number where the error occured -* When working for a company, your current company reputation is now displayed -* Whenever you get a Faction Invite it will be immediately appended to your 'invited factions' list. Therefore the checkFactionInvitations() Singularity Function should now be properly useable since you no longer need to decline a Faction Invitation before it shows up in the result. -* Bug Fix: When purchasing servers, whitespace should now automatically be removed from the hostname -* Bug Fix: Can no longer have whitespace in the filename of text files created using write() -* Bug Fix: In Netscript, you can no longer assign a Hacknet Node handle (hacknetnodes[i]) to another value -* Bug Fix: If you are in the Factions tab when you accept an invitation from a Faction, the page will now properly 'refresh' -* Bug Fix: Scripts that run recursive functions should now be killed properly - - -v0.34.5 - 2/24/2018 -------------------- -* Corporation Management Changes: - * Market Research unlocks are now cheaper - * New 'VeChain' upgrade: displays useful statistics about Corporation - * Corporation cycles are processed 25% faster - * Corporation valuation was lowered by ~10% (this affects stock price and investments) - * Rebalanced the effects of advertising. Should now be more effective for every Industry - * Fixed several bugs/exploits involving selling and buying back stock shares - * You will now receive a Corporation Handbook (.lit file) when starting out BitNode-3. It contains a brief guide to help you get started. This same handbook can be viewed from the Corporation management screen - * Slightly decreased the amount by which a Product's sell price can be marked up - * Employees can now be assigned to a 'Training' task, during which they will slowly increase several of their stats -* Hopefully fixed an exploit with Array.forEach(). If there are any issues with using forEach, let me know -* Arguments passed into a script are now passed by value. This means modifying the 'args' array in a script should no longer cause issues -* Scripts executed programatically (via run(), exec(), etc.) will now fail if null/undefined is passed in as an argument -* Added peek() Netscript function -* killall() Netscript function now returns true if any scripts were killed, and false otherwise. -* hack() Netscript function now returns the amount of money gained for successful hacks, and 0 for failed hacks -* scp Terminal command and Netscript function now work for txt files -* Changes courtesy of Wraithan: - * Text files are now displayed using 'pre' rather than 'p' elements when using the 'cat' Terminal command. This means tabs are retained and lines don't automatically wrap - * ls() Netscript function now returns text files as well -* Removed round() Netscript function, since you can just use Math.round() instead -* Added disableLog() and enableLog() Netscript functions -* Removed the 'log' argument from sleep(), since you can now use the new disableLog function -* 'Netscript Documentation' button on script editor now points to new readthedocs documentation rather than wiki -* When working for a faction, your current faction reputation is now displayed -* Bug Fix: Hacking Missions should no longer break when dragging an existing connection to another Node -* Bug Fix: Fixed RAM usage of getNextHacknetNodeCost() (is not 1.5GB instead of 4GB) - - -v0.34.4 - 2/14/2018 -------------------- -* Added several new features to Gang UI to make it easier to manage your Gang. -* Changed the Gang Member upgrade mechanic. Now, rather than only being able to have one weapon/armor/vehicle/etc., you can purchase all the upgrades for each Gang member and their multipliers will stack. To balance this out, the effects (AKA multipliers) of each Gang member upgrade were reduced. -* Added a new script editor option: Max Error Count. This affects how many approximate lines the script editor will process (JSHint) for common errors. Increasing this option can affect negatively affect performance -* Game theme colors (set using 'theme' Terminal command) are now saved when re-opening the game -* 'download' Terminal command now works on scripts -* Added stopAction() Singularity function and the spawn() Netscript function -* The 'Purchase Augmentations' UI screen will now tell you if you need a certain prerequisite for Augmentations. -* Augmentations with prerequisites can now be purchased as long as their prerequisites are puchased (before, you had to actually install the prerequisites before being able to purchase) - -v0.34.3 - 1/31/2018 -------------------- -* Minor balance changes to Corporations: - * Upgrades are generally cheaper and/or have more powerful effects. - * You will receive more funding while your are a private company. - * Product demand decreases at a slower rate. - * Production multiplier for Industries (receives for owning real estate/hardware/robots/etc.) is slightly higher -* Accessing the hacknetnodes array in Netscript now costs 4.0GB of RAM (only counts against RAM usage once) -* Bug Fix: Corporation oustanding shares should now be numeric rather than a string -* Bug Fix: Corporation production now properly calculated for industries that dont produce materials. -* Bug Fix: Gangs should now properly reset when switching BitNodes -* Bug Fix: Corporation UI should now properly reset when you go public - -v0.34.2 - 1/27/2018 -------------------- -* Corporation Management Changes: - * Added advertising mechanics - * Added Industry-specific purchases - * Re-designed employee management UI - * Rebalancing: Made many upgrades/purchases cheaper. Receive more money from investors in early stage. Company valuation is higher after going public - * Multiple bug fixes -* Added rm() Netscript function -* Updated the way script RAM usage is calculated. Now, a function only increases RAM usage the first time it is called. i.e. even if you call hack() multiple times in a script, it only counts against RAM usage once. The same change applies for while/for loops and if conditionals. -* The RAM cost of the following were increased: - * If statements: increased by 0.05GB - * run() and exec(): increased by 0.2GB - * scp(): increased by 0.1GB - * purchaseServer(): increased by 0.25GB -* Note: You may need to re-save all of your scripts in order to re-calculate their RAM usages. Otherwise, it should automatically be re-calculated when you reset/prestige -* The cost to upgrade your home computer's RAM has been increased (both the base cost and the exponential upgrade multiplier) -* The cost of purchasing a server was increased by 10% (it is now $55k per RAM) -* Bug fix: (Hopefully) removed an exploit where you could avoid RAM usage for Netscript function calls by assigning functions to a variable (foo = hack(); foo('helios');) -* Bug fix: (Hopefully) removed an exploit where you could run arbitrary Javascript code using the constructor() method -* Thanks to Github user mateon1 and Reddit users havoc_mayhem and spaceglace for notifying me of the above exploits -* The fileExists() Netscript function now works on text files (.txt). Thanks to Github user devoidfury for this - - -v0.34.1 - 1/19/2018 -------------------- -* Updates to Corporation Management: - * Added a number of upgrades to various aspects of your Corporation - * Rebalanced the properties of Materials and the formula for determining the valuation of the Corporation - * Fixed a number of bugs -* 'Stats' page now shows information about current BitNode -* You should now be able to create Corporations in other BitNodes if you have Source-File 3 -* Added a new create-able program called b1t_flum3.exe. This program can be used to reset and switch BitNodes -* Added an option to adjust autosave interval -* Line feeds, newlines, and tabs will now work with the tprint() Netscript function -* Bug fix: 'check' Terminal command was broken -* Bug fix: 'theme' Terminal command was broken when manually specifying hex codes -* Bug fix: Incorrect promotion requirement for 'Business'-type jobs -* Bug fix: Settings input bars were incorrectly formatted when loading game - - -v0.34.0 - 12/6/2017 -------------------- -* Added clear() and exit() Netscript functions -* When starting out or prestiging, you will now receive a 'Hacking Starter Guide'. It provides tips/pointers for new players -* Doubled the amount of RAM on low-level servers (up to required hacking level 150) -* Slightly increased experience gain from Infiltration -* buyStock(), sellStock(), shortStock(), and sellShort() Netscript function now return the stock price at which the transaction occurred, rather than a boolean. If the function fails for some reason, 0 will be returned. -* Hacking Mission Changes: - * You can now select multiple Nodes of the same type by double clicking. This allows you to set the action of all of selected nodes at once (e.g. set all Transfer Nodes to Fortify). Creating connections does not work with this multi-select functionality yet - * Shield and Firewall Nodes can now fortify - * The effects of Fortifying are now ~5% lower - * Conquering a Spam Node now increases your time limit by 25 seconds instead of 15 - * Damage dealt by Attacking was slightly reduced - * The effect of Scanning was slightly reduced - * Enemy CPU Core Nodes start with slightly more attack. Misc Nodes start with slightly less defense -* Corporation Management changes: - * Added several upgrades that unlock new features - * Implemented Exporting mechanic - * Fixed many bugs - -v0.33.0 - 12/1/2017 -------------------- -* Added BitNode-3: Corporatocracy. In this BitNode you can start and manage your own corporation. This feature is incomplete. Much more will be added to it in the near future -* Minor bug fixes - -v0.32.1 - 11/2/2017 -------------------- -* Updated Netscript's 'interpreter/engine' to use the Bluebird promise library instead of native promises. It should now be faster and more memory-efficient. If this has broken any Netscript features please report it through Github or the subreddit (reddit.com/r/bitburner) -* Rebalanced stock market (adjusted parameters such as the volatility/trends/starting price of certain stocks) -* Added prompt() Netscript function -* Added 'Buy Max' and 'Sell All' functions to Stock Market UI -* Added 'Portfolio' Mode to Stock Market UI so you can only view stocks you have a position/order in -* Added a button to kill a script from its log display box - - -v0.32.0 - 10/25/2017 --------------------- -* Added BitNode-8: Ghost of Wall Street -* Re-designed Stock Market UI -* Minor bug fixes - -v0.31.0 - 10/15/2017 --------------------- -* Game now saves to IndexedDb (if your browser supports it). This means you should no longer have trouble saving the game when your save file gets too big (from running too many scripts). The game will still be saved to localStorage as well -* New file type: text files (.txt). You can read or write to text files using the read()/write() Netscript commands. You can view text files in Terminal using 'cat'. Eventually I will make it so you can edit them in the editor but that's not available yet. You can also download files to your real computer using the 'download' Terminal command -* Added a new Crime: Bond Forgery. This crime takes 5 minutes to attempt and gives $4,500,000 if successful. It is meant for mid game. -* Added commitCrime(), getCrimeChance(), isBusy(), and getStats() Singularity Functions. -* Removed getIntelligence() Netscript function -* Added sprintf and vsprintf to Netscript. See [https://github.com/alexei/sprintf.js this Github page for details] -* Increased the amount of money gained from Infiltration by 20%, and the amount of faction reputation by 12% -* Rebalanced BitNode-2 so that Crime and Infiltration are more profitable but hacking is less profitable. Infiltration also gives more faction rep -* Rebalanced BitNode-4 so that hacking is slightly less profitable -* Rebalanced BitNode-5 so that Infiltration is more profitable and gives more faction rep -* Rebalanced BitNode-11 so that Crime and Infiltration are more profitable. Infiltration also gives more faction rep. -* Fixed an annoying issue in Hacking Missions where sometimes you would click a Node but it wouldnt actually get selected -* Made the Hacking Mission gameplay a bit slower by lowering the effect of Scan and reducing Attack damage -* Slightly increased the base reputation gain rate for factions when doing Field Work and Security Work - -v0.30.0 - 10/9/2017 -------------------- -* Added getAugmentations() and getAugmentationsFromFaction() Netscript Singularity Functions -* Increased the rate of Intelligence exp gain -* Added a new upgrade for home computers: CPU Cores. Each CPU core on the home computer grants an additional starting Core Node in Hacking Missions. I may add in other benefits later. Like RAM upgrades, upgrading the CPU Core on your home computer persists until you enter a new BitNode. -* Added lscpu Terminal command to check number of CPU Cores -* Changed the effect of Source-File 11 and made BitNode-11 a little bit harder -* Fixed a bug with Netscript functions (the ones you create yourself) -* Hacking Missions officially released (they give reputation now). Notable changes in the last few updates: - * Misc Nodes slowly gain hp/defense over time - * Conquering a Misc Node will increase the defense of all remaining Misc Nodes that are not being targeted by a certain percentage - * Reputation reward for winning a Mission is now affected by faction favor and Player's faction rep multiplier - * Whenever a Node is conquered, its stats are reduced - -v0.29.3 - 10/3/2017 -------------------- -* Fixed bug for killing scripts and showing error messages when there are errors in a player-defined function -* Added function name autocompletion in Script Editor. Press Ctrl+space on a prefix to show autocompletion options. -* Minor rebalancing and bug fixes for Infiltration and Hacking Missions - -v0.29.2 - 10/1/2017 -------------------- -* installAugmentations() Singularity Function now takes a callback script as an argument. This is a script that gets ran automatically after Augmentations are installed. The script is run with no arguments and only a single thread, and must be found on your home computer. -* Added the ability to create your own functions in Netscript. See [[Netscript Functions|this link]] for details -* Added :q, :x, and :wq Vim Ex Commands when using the Vim script editor keybindings. :w, :x, and :wq will all save the script and return to Terminal. :q will quit (return to Terminal) WITHOUT saving. If anyone thinks theres an issue with this please let me know, I don't use Vim -* Added a new Augmentation: ADR-V2 Pheromone Gene -* In Hacking Missions, enemy nodes will now automatically target Nodes and perform actions. -* Re-balanced Hacking Missions through minor tweaking of many numbers -* The faction reputation reward for Hacking Missions was slightly increased - -v0.29.1 - 9/27/2017 -------------------- -* New gameplay feature that is currently in BETA: Hacking Missions. Hacking Missions is an active gameplay mechanic (its a minigame) that is meant to be used to earn faction reputation. However, since this is currently in beta, hacking missions will NOT grant reputation for the time being, since the feature likely has many bugs, balance problems, and other issues. If you have any feedback regarding the new feature, feel free to let me know -* CHANGED THE RETURN VALUE OF getScriptIncome() WHEN RAN WITH NO ARGUMENTS. It will now return an array of two values rather than a single value. This may break your scripts, so make sure to update them! -* Added continue statement for for/while loops -* Added getServerMinSecurityLevel(), getPurchasedServers(), and getTimeSinceLastAug() Netscript functions -* Netscript scp() function can now take an array as the first argument, and will try to copy every file specified in the array (it will just call scp() normally for every element in the array). If an array is passed in, then the scp() function returns true if at least one element from the array is successfully copied -* Added Javascript's Date module to Netscript. Since 'new' is not supported in Netscript yet, only the Date module's static methods will work (now(), UTC(), parse(), etc.). -* Failing a crime now gives half the experience it did before -* The forced repeated 'Find The-Cave' message after installing The Red Pill Augmentation now only happens if you've never destroyed a BitNode before, and will only popup every 15 minutes. If you have already destroyed a BitNode, the message will not pop up if you have messages suppressed (if you don't have messages suppressed it WILL still repeatedly popup) -* fileExists() function now works on literature files - -v0.29.0 - 9/19/2017 -------------------- -* Added BitNode-5: Artificial Intelligence -* Added getIp(), getIntelligence(), getHackingMultipliers(), and getBitNodeMultipliers() Netscript functions (requires Source-File 5) -* Updated scan() Netscript function so that you can choose to have it print IPs rather than hostnames -* Refactored scp() Netscript function so that it takes an optional 'source server' argument -* For Infiltration, decreased the percentage by which the security level increases by about 10% for every location -* Using :w in the script editor's Vim keybinding mode should now save and quit to Terminal -* Some minor optimizations that should reduce the size of the save file -* scan-analyze Terminal command will no longer show your purchased servers, unless you pass a '-a' flag into the command -* After installing the Red Pill augmentation from Daedalus, the message telling you to find 'The-Cave' will now repeatedly pop up regardless of whether or not you have messages suppressed -* Various bugfixes - -v0.28.6 - 9/15/2017 -------------------- -* Time required to create programs now scales better with hacking level, and should generally be much faster -* Added serverExists(hostname/ip) and getScriptExpGain(scriptname, ip, args...) Netscript functions -* Short circuiting && and || logical operators should now work -* Assigning to multidimensional arrays should now work -* Scripts will no longer wait for hack/grow/weaken functions to finish if they are killed. They will die immediately -* The script loop that checks whether any scripts need to be started/stopped now runs every 6 seconds rather than 10 (resulting in less delays when stopping/starting scripts) -* Fixed several bugs/exploits -* Added some description for BitNode-5 (not implemented yet, should be soon though) - -v0.28.5 - 9/13/2017 -------------------- -* The fl1ght.exe program that is received from jump3r is now sent very early on in the game, rather than at hacking level 1000 -* Hostname is now displayed in Terminal -* Syntax highlighting now works for all Netscript functions -* Export should now work on Edge/IE - -v0.28.4 - 9/11/2017 -------------------- -* Added getScriptIncome() Netscript function -* Added Javascript's math module to Netscript. See [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math this link for details] -* Added several member variables for the Hacknet Node API that allow you to access info about their income -* All valid Netscript functions are now syntax highlighted as keywords in the editor. This means they will a different color than invalid netscript functions. The color will depend on your theme. Note that right now, this only applies for normal Netscript functions, not functions in the TIX API, Hacknet Node API, or Singularity Functions. -* Comments and operators no longer count towards RAM usage in scripts. -* Variety of bug fixes and updates to informational text in the game - -v0.28.3 - 9/7/2017 ------------------- -* Added ls() Netscript function -* Increased company wages by about ~10% across the board -* The scp() Netsction function and Terminal command now works for .lit files -* Increased the amount of RAM on many lower level servers (up to level 200 hacking level required). - -v0.28.2 - 9/4/2017 ------------------- -* Added several configuration options for script editor (key bindings, themes, etc.) -* Certain menu options will now be hidden until their relevant gameplay is unlocked. This includes the Factions, Augmentations, Create Program, Travel, and Job tabs. This will only affect newer players. -* Most unrecognize or un-implemented syntax errors in Netscript will now include the line number in the error message - -v0.28.1 - 9/1/2017 ------------------- -* The script editor now uses the open-source Ace editor, which provides a much better experience when coding! -* Added tprint() Netscript function - -v0.28.0 - 8/30/2017 -------------------- -* Added BitNode-4: The Singularity -* Added BitNode-11: The Big Crash -* Migrated the codebase to use webpack (doesn't affect any in game content, except maybe some slight performance improvements and there may be bugs that result from dependency errors - -v0.27.3 - 8/19/2017 -------------------- -* You can now purchase upgrades for Gang Members (BitNode 2 only) -* Decreased Gang respect gains and slightly increased wanted gains (BitNode 2 only) -* Other gangs will increase in power faster (BitNode 2 only) -* Added getHackTime(), getGrowTime(), and getWeakenTime() Netscript functions - -v0.27.2 - 8/18/2017 -------------------- -* Added getServerGrowth() Netscript function -* Added getNextHacknetNodeCost() Netscript function -* Added new 'literature' files (.lit extension) that are used to build lore for the game. These .lit files can be found in certain servers throughout the game. They can be viewed with the 'cat' Terminal command and copied over to other servers using the 'scp' command. These .lit files won't be found until you reset by installing Augmentations -* Fixed some bugs with Gang Territory(BitNode 2 only) - -v0.27.1 - 8/15/2017 -------------------- -* Changed the way Gang power was calculated to make it scale better late game (BitNode 2 only) -* Lowered the respect gain rate in Gangs (Bitnode 2 only) -* Added '| grep pattern' option for ls Terminal command. This allows you to only list files that contain a certain pattern -* Added break statement in Netscript -* Display for some numerical values is now done in shorthand (e.g 1.000m instead of 1,000,000) - -v0.27.0 - 8/13/2017 -------------------- -* Added secondary 'prestige' system - featuring Source Files and BitNodes -* MILD SPOILERS HERE: Installing 'The Red Pill' Augmentation from Daedalus will unlock a special server called w0r1d_d43m0n. Finding and manually hacking this server through Terminal will destroy the Player's current BitNode, and allow the player to enter a new one. When destroying a BitNode, the player loses everything except the scripts on his/her home computer. The player will then gain a powerful second-tier persistent upgrade called a Source File. The player can then enter a new BitNode to start the game over. Each BitNode has different characteristics, and many will have new content/mechanics as well. Right now there are only 2 BitNodes. Each BitNode grants its own unique Source File. Restarting and destroying a BitNode you already have a Source File for will upgrade your Source File up to a maximum level of 3. - -* Reputation gain with factions and companies is no longer a linear conversion, but an exponential one. It will be much easier to gain faction favor at first, but much harder later on. -* Significantly increased Infiltration exp gains -* Fixed a bug with company job requirement tooltips -* Added scriptRunning(), scriptKill(), and getScriptRam() Netscript functions. See documentation for details -* Fixed a bug with deleteServer() Netscript function - -v0.26.4 - 8/1/2017 ------------------- -* All of the 'low-level servers' in early game that have a required hacking level now have 8GB of RAM instead of 4GB -* Increased the amount of experience given at university -* Slightly increased the production of Hacknet Nodes and made them cheaper to upgrade -* Infiltration now gives slightly more EXP and faction reputation -* Added two new crimes. These crimes are viable to attempt early on in the game and are relatively passive (each take 60+ seconds to complete) -* Crimes give more exp and more money -* Max money available on a server decreased from 50x the server's starting money to 25x -* Significantly increased wages for all jobs - -v0.26.3 -------- -* Added support for large numbers using Decimal.js. Right now it only applies for the player's money -* Purchasing servers with the Netscript function purchaseServer() is no longer 2x as expensive as doing manually it now costs the same -* Early game servers have more starting money - -v0.26.2 -------- -* Major rebalancing and randomization of the amount of money that servers start with -* Significantly lowered hacking exp gain from hacking servers. The exp gain for higher-level servers was lowered more than that of low level servers. (~16% for lower level servers, up to ~25% for higher-level servers) -* Added deleteServer() Netscript function -* You can now purchase a maximum of 25 servers each run (Deleting a server will allow you to purchase a new one) -* Added autocompletion for './' Terminal command -* Darkweb prices now displayed properly using toLocaleString() -* Added NOT operator (!) and negation operator(-) in Netscript, so negative numbers should be functional now -* Rejected faction invitations will now show up as 'Outstanding Faction Invites' in the Factions page. These can be accepted at any point in the future -* Added a few more configurable game settings for suppressing messages and faction invitations -* Added tooltips for company job requirements - -v0.26.1 -------- -* Added autocompletion for aliases -* Added getServerRam() Netscript function() -* Added getLevelUpgradeCost(n), getRamUpgradeCost(), getCoreUpgradeCost() functions for Netscript Hacknet Node API -* Added some configurable settings (See Game Options menu) - - -v0.26.0 -------- -* Game now has a real ending, although it's not very interesting/satisfying right now. It sets up the framework for the secondary prestige system in the future -* Forgot to mention that since last update, comments now work in Netscript. Use // for single line comments or /* and \*/ for multiline comments just like in Javascript -* Added ports to Netscript. These ports are essentially serialized queues. You can use the write() Netscript function to write a value to a queue, and then you can use the read() Netscript function to read the value from the queue. Once you read a value from the queue it will be removed. There are only 10 queues (1-10), and each has a maximum capacity of 50 entries. If you try to write to a queue that is full, the the first value is removed. See wiki/Netscript documentation for more details -* You can now use the 'help' Terminal command for specific commands -* You can now use './' to run a script/program (./NUKE.exe). However, tab completion currently doesn't work for it (I'm working on it) -* Decreased the base growth rate of servers by ~25% -* Both the effect of weaken() and its time to execute were halved. In other words, calling weaken() on a server only lowers its security by 0.05 (was 0.1 before) but the time to execute the function is half of what it was before. Therefore, the effective rate of weaken() should be about the same -* Increased all Infiltration rewards by ~10%, and increased infiltration rep gains by an additional 20% (~32% total for rep gains) -* The rate at which the security level of a facility increases during Infiltration was decreased significantly (~33%) -* Getting treated at the Hospital is now 33% more expensive -* Slightly increased the amount of time it takes to hack a server -* Slightly decreased the amount of money gained when hacking a server (~6%) -* Slightly decreased the base cost for RAM on home computer, but increased the cost multiplier. This means that upgrading RAM on the home computer should be slightly cheaper at the start, but slightly more expensive later on -* Increased the required hacking level for many late game servers -* The sleep() Netscript function now takes an optional 'log' argument that specifies whether or not the 'Sleeping for N milliseconds' will be logged for the script -* Added clearLog() Netscript function -* Deleted a few stocks. Didn't see a reason for having so many, and it just affects performance. Won't take effect until you reset by installing Augmentations -* There was a typo with Zeus Medical's server hostname. It is now 'zeus-med' rather than 'zeud-med' -* Added keyboard shortcuts to quickly navigate between different menus. See wiki link (http://bitburner.wikia.com/wiki/Shortcuts) -* Changed the Navigation Menu UI - -v0.25.0 -------- -* Refactored Netscript to use the open-source Acorns Parser. This re-implementation was done by [https://github.com/MrNuggelz Github user MrNuggelz]. This has resulted in several changes in the Netscript language. Some scripts might break because of these changes. Changes listed below:  -* Arrays are now fully functional Javascript arrays. You no longer need to use the 'Array' keyword to declare them.  -* The length(), clear/clear(), insert(), and remove() functions no longer work for arrays.  -* All Javascript array methods are available (splice(), push(), pop(), join(), shift(), indexOf(), etc. See documentation) -* Variables assigned to arrays are now passed by value rather than reference - -* Incrementing/Decrementing are now available (i++, ++i) - -* You no longer need semicolons at the end of block statements - -* Elif is no longer valid. Use 'else if' instead - -* Netscript's Hacknet Node API functions no longer log anything -* Stock prices now update every ~6 seconds when the game is active (was 10 seconds before) -* Added a new mechanic that affects how stock prices change -* Script editor now has dynamic indicators for RAM Usage and Line number -* Augmentation Rebalancing - Many late game augmentations are now slightly more expensive. Several early game augmentations had their effects slightly decreased -* Increased the amount of rewards (both money and rep) you get from infiltration -* Purchasing servers is now slightly more expensive -* Calling the Netscript function getServerMoneyAvailable('home') now return's the player's money -* Added round(n) Netscript function - Rounds a number -* Added purchaseServer(hostname, ram) Netscript function -* Added the TIX API. This must be purchased in the WSE. It persists through resets. Access to the TIX API allows you to write scripts that perform automated algorithmic trading. See Netscript documentation -* Minor rebalancing in a lot of different areas -* Changed the format of IP Addresses so that they are smaller (will consist mostly of single digit numbers now). This will reduce the size of the game's save file. - -v0.24.1 -------- -* Adjusted cost of upgrading home computer RAM. Should be a little cheaper for the first few upgrades (up to ~64GB), and then will start being more expensive than before. High RAM upgrades should now be significantly more expensive than before. -* Slightly lowered the starting money available on most mid-game and end-game servers (servers with required hacking level greater than 200) by about 10-15% -* Rebalanced company/company position reputation gains and requirements -* Studying at a university now gives slightly more EXP and early jobs give slightly less EXP -* Studying at a university is now considerably more expensive -* Rebalanced stock market -* Significantly increased cost multiplier for purchasing additional Hacknet Nodes -* The rate at which facility security level increases during infiltration for each clearance level was lowered slightly for all companies -* Updated Faction descriptions -* Changed the way alias works. Normal aliases now only work at the start of a Terminal command (they will only replace the first word in the Terminal command). You can also create global aliases that work on any part of the command, like before. Declare global aliases by entering the optional -g flag: alias -g name="value" - [https://github.com/MrNuggelz Courtesy of Github user MrNuggelz] -* 'top' Terminal command implemented courtesy of [https://github.com/LTCNugget Github user LTCNugget]. Currently, the formatting gets screwed up if your script names are really long. - -v0.24.0 -------- -* Players now have HP, which is displayed in the top right. To regain HP, visit the hospital. Currently the only way to lose HP is through infiltration -* Infiltration - Attempt to infiltrate a company and steal their classified secrets. See 'Companies' documentation for more details -* Stock Market - Added the World Stock Exchange (WSE), a brokerage that lets you buy/sell stocks. To begin trading you must first purchase an account. A WSE account will persist even after resetting by installing Augmentations. How the stock market works should hopefully be self explanatory. There is no documentation about it currently, I will add some later. NOTE: Stock prices only change when the game is open. The Stock Market is reset when installing Augmentations, which means you will lose all your stocks -* Decreased money gained from hacking by ~12% -* Increased reputation required for all Augmentations by ~40% -* Cost increase when purchasing multiple augmentations increased from 75% to 90% -* Added basic variable runtime to Netscript operations. Basic commands run in 100ms. Any function incurs another 100ms in runtime (200ms total). Any function that starts with getServer incurs another 100ms runtime (300ms total). exec() and scp() require 400ms total.  -* Slightly reduced the amount of experience gained from hacking - -v0.23.1 -------- -* scan() Netscript function now takes a single argument representing the server from which to scan.  - -v0.23.0 -------- -* You can now purchase multiple Augmentations in a run. When you purchase an Augmentation you will lose money equal to the price and then the cost of purchasing another Augmentation during this run will be increased by 75%. You do not gain the benefits of your purchased Augmentations until you install them. This installation can be done through the 'Augmentation' tab. When you install your Augmentations, your game will reset like before.  -* Reputation needed to gain a favor from faction decreased from 7500 to 6500 -* Reputation needed to gain a favor from company increased from 5000 to 6000 -* Reputation cost of all Augmentations increased by 16% -* Higher positions at companies now grant slightly more reputation for working -* Added getServerMaxMoney() Netscript function -* Added scan() Netscript function -* Added getServerNumPortsRequired() Netscript function -* There is now no additional RAM cost incurred when multithreading a script - -v0.22.1 -------- -* You no longer lose progress on creating programs when cancelling your work. Your progress will be saved and you will pick up where you left off when you start working on it again -* Added two new programs: AutoLink.exe and ServerProfiler.exe -* Fixed bug with Faction Field work reputation gain - -v0.22.0 - Major rebalancing, optimization, and favor system ------------------------------------------------------------ -* Significantly nerfed most augmentations -* Almost every server with a required hacking level of 200 or more now has slightly randomized server parameters. This means that after every Augmentation purchase, the required hacking level, base security level, and growth factor of these servers will all be slightly different -* The hacking speed multiplier now increases rather than decreases. The hacking time is now divided by your hacking speed multiplier rather than multiplied. In other words, a higher hacking speed multiplier is better -* Servers now have a minimum server security, which is approximately one third of their starting ('base') server security -* If you do not steal any money from a server, then you gain hacking experience equal to the amount you would have gained had you failed the hack -* The effects of grow() were increased by 50% -* grow() and weaken() now give hacking experience based on the server's base security level, rather than a flat exp amount -* Slightly reduced amount of exp gained from hack(), weaken(), and grow() -* Rebalanced formulas that determine crime success -* Reduced RAM cost for multithreading a script. The RAM multiplier for each thread was reduced from 1.02 to 1.005 -* Optimized Script objects so they take less space in the save file -* Added getServerBaseSecurityLevel() Netscript function -* New favor system for companies and factions. Earning reputation at a company/faction will give you favor for that entity when you reset after installing an Augmentation. This favor persists through the rest of the game. The more favor you have, the faster you will earn reputation with that faction/company -* You can no longer donate to a faction for reputation until you have 150 favor with that faction -* Added unalias Terminal command -* Changed requirements for endgame Factions - -v0.21.1 -------- -* IF YOUR GAME BREAKS, DO THE FOLLOWING: Options -> Soft Reset -> Save Game -> Reload Page. Sorry about that!  -* Autocompletion for aliases - courtesy of [https://github.com/LTCNugget Github user LTCNugget] - -v0.21.0 -------- -* Added dynamic arrays. See Netscript documentation -* Added ability to pass arguments into scripts. See documentation -* The implementation/function signature of functions that deal with scripts have changed. Therefore, some old scripts might not work anymore. Some of these functions include run(), exec(), isRunning(), kill(), and some others I may have forgot about. Please check the updated Netscript documentation if you run into issues.-Note that scripts are now uniquely identified by the script name and their arguments. For example, you can run a script using:: - - run foodnstuff.script 1 - -and you can also run the same script with a different argument:: - - run foodnstuff.script 2 - -These will be considered two different scripts. To kill the first script you must run:: - - kill foodnstuff.script 1 - -and to kill the second you must run:: - - kill foodnstuff.script 2 - -Similar concepts apply for Terminal Commands such as tail, and Netscript commands such as run(), exec(), kill(), isRunning(), etc. - -* Added basic theme functionality using the 'theme' Terminal command - All credit goes to /u/0x726564646974 who implemented the awesome feature -* Optimized Script objects, which were causing save errors when the player had too many scripts -* Formula for determining exp gained from hacking was changed -* Fixed bug where you could purchase Darkweb items without TOR router -* Slightly increased cost multiplier for Home Computer RAM -* Fixed bug where you could hack too much money from a server (and bring its money available below zero) -* Changed tail command so that it brings up a display box with dynamic log contents. To get old functionality where the logs are printed to the Terminal, use the new 'check' command -* As a result of the change above, you can no longer call tail/check on scripts that are not running -* Added autocompletion for buying Programs in Darkweb - -v0.20.2 -------- -* Fixed several small bugs -* Added basic array functionality to Netscript -* Added ability to run scripts with multiple threads. Running a script with n threads will multiply the effects of all hack(), grow(), and weaken() commands by n. However, running a script with multiple threads has drawbacks in terms of RAM usage. A script's ram usage when it is 'multithreaded' is calculated as: base cost * numThreads * (1.02 ^ numThreads). A script can be run multithreaded using the 'run [script] -t n' Terminal command or by passing in an argument to the run() and exec() Netscript commands. See documentation. -* RAM is slightly (~10%) more expensive (affects purchasing server and upgrading RAM on home computer) -* NeuroFlux Governor augmentation cost multiplier decreased -* Netscript default operation runtime lowered to 200ms (was 500ms previously) - -v0.20.1 -------- -* Fixed bug where sometimes scripts would crash without showing the error -* Added Deepscan programs to Dark Web -* Declining a faction invite will stop you from receiving invitations from that faction for the rest of the run -* (BETA) Added functionality to export/import saves. WARNING This is only lightly tested. You cannot choose where to save your file it just goes to the default save location. Also I have no idea what will happen if you try to import a file that is not a valid save. I will address these in later updates - -v0.20.0 -------- -* Refactored Netscript Interpreter code. Operations in Netscript should now run significantly faster (Every operation such as a variable assignment, a function call, a binary operator, getting a variable's value, etc. used to take up to several seconds, now each one should only take ~500 milliseconds).  -* Percentage money stolen when hacking lowered to compensate for faster script speeds -* Hacking experience granted by grow() halved -* Weaken() is now ~11% faster, but only grants 3 base hacking exp upon completion instead of 5  -* Rebalancing of script RAM costs. Base RAM Cost for a script increased from 1GB to 1.5GB. Loops, hack(), grow() and weaken() all cost slightly less RAM than before  -* Added getServerRequiredHackingLevel(server) Netscript command.  -* Added fileExists(file, [server]) Netscript command, which is used to check if a script/program exists on a specified server -* Added isRunning(script, [server]) Netscript command, which is used to check if a script is running on the specified server -* Added killall Terminal command. Kills all running scripts on the current machine -* Added kill() and killall() Netscript commands. Used to kill scripts on specified machines. See Netscript documentation -* Re-designed 'Active Scripts' tab -* Hacknet Node base production rate lowered from 1.6 to 1.55 ($/second) -* Increased monetary cost of RAM (Upgrading home computer and purchasing servers will now be more expensive) -* NEW GROWTH MECHANICS - The rate of growth on a server now depends on a server's security level. A higher security level will result in lower growth on a server when using the grow() command. Furthermore, calling grow() on a server raises that server's security level by 0.004. For reference, if a server has a security level of 10 it will have approximately the same growth rate as before.  -* Server growth no longer happens naturally -* Servers now have a maximum limit to their money. This limit is 50 times it's starting money -* Hacking now grants 10% less hacking experience -* You can now edit scripts that are running -* Augmentations cost ~11% more money and 25% more faction reputation - -v0.19.7 -------- -* Added changelog to Options menu -* Bug fix with autocompletion (wasn't working properly for capitalized filenames/programs - -v0.19.6 -------- -* Script editor now saves its state even when you change tabs  -* scp() command in Terminal/script will now overwrite files at the destination  -* Terminal commands are no longer case-sensitive (only the commands themselves such as 'run' or 'nano'. Filenames are still case sensitive -* Tab automcompletion will now work on commands - -v0.19.0 -------- -* Hacknet Nodes have slightly higher base production, and slightly increased RAM multiplier. But they are also a bit more expensive at higher levels -* Calling grow() and weaken() in a script will now work offline, at slower rates than while online (The script now keeps track of the rate at which grow() and weaken() are called when the game is open. These calculated rates are used to determine how many times the calls would be made while the game is offline) -* Augmentations now cost 20% more reputation and 50% more money -* Changed the mechanic for getting invited to the hacking factions (CyberSec, NiteSec, The Black Hand, BitRunners) Now when you get to the required level to join these factions you will get a message giving you instructions on what to do in order to get invited. -* Added a bit of backstory/plot into the game. It's not fully fleshed out yet but it will be used in the future -* Made the effects of many Augmentations slightly more powerful -* Slightly increased company job wages across the board (~5-10% for each position) -* Gyms and classes are now significantly more expensive -* Doubled the amount by which a server's security increases when it is hacked. Now, it will increase by 0.002. Calling weaken() on a server will lower the security by 0.1. - -v0.18.0 -------- -* Major rebalancing (sorry didn't record specifics. But in general hacking gives more money and hacknet nodes give less) -* Server growth rate (both natural and manual using grow()) doubled -* Added option to Soft Reset -* Cancelling a full time job early now only results in halved gains for reputation. Exp and money earnings are gained in full -* Added exec() Netscript command, used to run scripts on other servers.  -* NEW HACKING MECHANICS: Whenever a server is hacked, its 'security level' is increased by a very small amount. The security level is denoted by a number between 1-100. A higher security level makes it harder to hack a server and also decreases the amount of money you steal from it. Two Netscript functions, weaken() and getServerSecurityLevel() level, were added. The weaken(server) function lowers a server's security level. See the Netscript documentation for more details -* When donating to factions, the base rate is now $1,000,000 for 1 reputation point. Before, it was $1,000 for 1 reputation point. -* Monetary costs for all Augmentations increased. They are now about ~3.3 - 3.75 times more expensive than before - -v0.17.1 -------- -* Fixed issue with purchasing Augmentations that are 'upgrades' and require previous Augmentations to be installed -* Increased the percentage of money stolen from servers when hacking - -v0.17.0 -------- -* Greatly increased amount of money gained for crimes (by about 400% for most crimes) -* Criminal factions require slightly less negative karma to get invited to -* Increased the percentage of money stolen from servers when hacking -* Increased the starting amount of money available on beginning servers (servers with <50 required hacking)) -* Increased the growth rate of servers (both naturally and manually when using the grow() command in a script) -* Added getHostname() command in Netscript that returns the hostname of the server a script is running on -* jQuery preventDefault() called when pressing ctrl+b in script editor -* The Neuroflux Governor augmentation (the one that can be repeatedly leveled up) now increases ALL multipliers by 1%. To balance it out, it's price multiplier when it levels up was increased -* Hacknet Node base production decreased from $1.75/s to $1.65/s -* Fixed issue with nested for loops in Netscript (stupid Javascript references) -* Added 'scp' command to Terminal and Netscript -* Slightly nerfed Hacknet Node Kernel DNI and Hacknet Node Core DNI Augmentations -* Increased TOR Router cost to $200k - -v0.16.0 -------- -* New Script Editor interface  -* Rebalanced hacknet node - Increased base production but halved the multiplier from additional cores. This should boost its early-game production but nerf its late-game production -* Player now starts with 8GB of RAM on home computer -* 'scan-analyze' terminal command displays RAM on servers -* Slightly buffed the amount of money the player steals when hacking servers (by about ~8%) -* Time to execute grow() now depends on hacking skill and server security, rather than taking a flat 2 minutes. -* Clicking outside of a pop-up dialog box will now close it -* BruteSSH.exe takes 33% less time to create -* 'iron-gym' and 'max-hardware' servers now have 2GB of RAM -* Buffed job salaries across the board -* Updated Tutorial -* Created a Hacknet Node API for Netscript that allows you to access and upgrade your Hacknet Nodes. See the Netscript documentation for more details. WARNING The old upgradeHacknetNode() and getNumHacknetNodes() functions waere removed so any script that has these will no longer work  - -v0.15.0 -------- -* Slightly reduced production multiplier for Hacknet Node RAM -* Faction pages now scroll -* Slightly increased amount of money gained from hacking -* Added 'alias' command -* Added 'scan-analyze' terminal command - used to get basic hacking info about all immediate network connections -* Fixed bugs with upgradeHacknetNode() and purchaseHacknetNode() commands -* Added getNumHacknetNodes() and hasRootAccess(hostname/ip) commands to Netscript -* Increased Cost of university classes/gym -* You can now see what an Augmentation does and its price even while its locked diff --git a/doc/source/conf-guzzle.py b/doc/source/conf-guzzle.py deleted file mode 100644 index 81e181a3b..000000000 --- a/doc/source/conf-guzzle.py +++ /dev/null @@ -1,25 +0,0 @@ -import sys, os, subprocess - -project = u'Bitburner' -copyright = u'2017, Daniel Xie' -master_doc = 'index' -templates_path = ['_templates'] -extensions = [] -source_suffix = '.rst' -version = '1.0.0' -exclude_patterns = ['_build'] - -# -- HTML theme settings ------------------------------------------------ - -html_show_sourcelink = False - -import guzzle_sphinx_theme - -extensions.append("guzzle_sphinx_theme") -html_theme_path = guzzle_sphinx_theme.html_theme_path() -html_theme = 'guzzle_sphinx_theme' - -# Guzzle theme options (see theme.conf for more information) -html_theme_options = { - "project_nav_name": "Bitburner", -} diff --git a/doc/source/conf.py b/doc/source/conf.py deleted file mode 100644 index eaa186e90..000000000 --- a/doc/source/conf.py +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# Bitburner documentation build configuration file, created by -# sphinx-quickstart on Wed Oct 4 15:03:07 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = ['sphinx.ext.autodoc', - 'sphinx.ext.doctest', - 'sphinx.ext.intersphinx', - 'sphinx.ext.todo', - 'sphinx.ext.coverage', - 'sphinx.ext.mathjax', - 'sphinx.ext.ifconfig', - 'sphinx.ext.viewcode', - 'sphinx.ext.githubpages'] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['ytemplates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = 'Bitburner' -author = 'Bitburner' -copyright = '2016, {0}'.format(author) -documentation_title = '{0} Documentation'.format(project) - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '2.2' -# The full version, including alpha/beta/rc tags. -release = '2.2.2' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = 'en' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = [] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = True - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -#html_theme = 'agogo' -html_theme = "sphinx_rtd_theme" -html_theme_options = { - "navigation_depth": 5, -} - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -#html_theme_options = {'stickysidebar':'true'} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['ystatic'] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# This is required for the alabaster theme -# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars -# html_sidebars = { -# '**': [ -# 'about.html', -# 'navigation.html', -# 'relations.html', # needs 'show_related': True theme option to display -# 'searchbox.html', -# 'donate.html', -# ] -# } - - -# -- Options for HTMLHelp output ------------------------------------------ - -# Output file base name for HTML help builder. -htmlhelp_basename = '{0}doc'.format(project) - - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, '{0}.tex'.format(project), documentation_title, - author, 'manual'), -] - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, project.lower(), documentation_title, - [author], 1) -] - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, project, documentation_title, - author, project, 'One line description of project.', - 'Miscellaneous'), -] - - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {'https://docs.python.org/': None} - - -def setup(app): - print("Initializing (setup())"); - app.add_stylesheet('maxwidthoverride.css') - app.add_stylesheet('dark_theme.css') diff --git a/doc/source/guidesandtips.rst b/doc/source/guidesandtips.rst deleted file mode 100644 index 3d2bdc30d..000000000 --- a/doc/source/guidesandtips.rst +++ /dev/null @@ -1,12 +0,0 @@ -Guides & Tips -============= - -Getting Started Guide for Intermediate Programmers - -Beginners FAQ - -.. toctree:: - :maxdepth: 3 - - Getting Started Guide for Beginner Programmers - What BitNode should I do? diff --git a/doc/source/guidesandtips/gettingstartedguideforbeginnerprogrammers.rst b/doc/source/guidesandtips/gettingstartedguideforbeginnerprogrammers.rst deleted file mode 100644 index d79088115..000000000 --- a/doc/source/guidesandtips/gettingstartedguideforbeginnerprogrammers.rst +++ /dev/null @@ -1,902 +0,0 @@ -Getting Started Guide for Beginner Programmers -============================================== - -.. note:: Note that the scripts and strategies given in this guide aren't necessarily - optimal. They're just meant to introduce you to the game and help you get - started. - -This is an introductory guide to getting started with Bitburner. It is not meant to be a -comprehensive guide for the entire game, only the early stages. If you are confused -or overwhelmed by the game, especially the programming and scripting aspects, this -guide is perfect for you! - -Note that this guide is tailored towards those with minimal programming experience. - -Introduction ------------- -Bitburner is a cyberpunk-themed incremental RPG. The player progresses by raising -their :ref:`gameplay_stats`, earning money, and :ref:`climbing the corporate ladder `. -Eventually, after reaching certain criteria, the player will begin receiving invitations -from :ref:`gameplay_factions`. Joining these factions and working for them will unlock -:ref:`gameplay_augmentations`. Purchasing and installing Augmentations provide persistent -upgrades and are necessary for progressing in the game. - -The game has a minimal story/quest-line that can be followed to reach the end of the game. -Since this guide is only about getting started with Bitburner, it will not cover the -entire "quest-line". - -First Steps ------------ -I'm going to assume you followed the introductory tutorial when you first began the game. -In this introductory tutorial you created a script called :code:`n00dles.js` and ran it -on the :code:`n00dles` server. Right now, we'll kill this script. There are two ways -to do this: - -1. You can go to the Terminal and enter:: - - $ kill n00dles.js - -2. You can go to the :code:`Active Scripts` page (|Keyboard shortcut| Alt + s) and - press the "Kill Script" button for :code:`n00dles.js`. - -If you skipped the introductory tutorial, then ignore the part above. Instead, go to the -:code:`Hacknet Nodes` page (|Keyboard shortcut| Alt + h) and purchase a -Hacknet Node to start generating some passive income. - -Creating our First Script -------------------------- -Now, we'll create a generic hacking script that can be used early on in the game (or throughout the -entire game, if you want). - -Before we write the script, here are some things you'll want to familiarize yourself with: - -* :ref:`gameplay_hacking_generalhackingmechanics` -* :ref:`gameplay_hacking_serversecurity` -* :js:func:`hack` -* :js:func:`grow` -* :js:func:`weaken` -* :js:func:`brutessh` -* :js:func:`nuke` - -To briefly summarize the information from the links above: Each server has a -security level that affects how difficult it is to hack. Each server also has a -certain amount of money, as well as a maximum amount of money it can hold. Hacking a -server steals a percentage of that server's money. The :js:func:`hack` Netscript function -is used to hack a server. The :js:func:`grow` Netscript function is used to increase -the amount of money available on a server. The :js:func:`weaken` Netscript function is -used to decrease a server's security level. - -Now let's move on to actually creating the script. -Go to your home computer and then create a script called :code:`early-hack-template.js` by -going to Terminal and entering the following two commands:: - - $ home - $ nano early-hack-template.js - -This will take you to the script editor, which you can use to code and create -:ref:`gameplay_scripts`. It will be helpful to consult the :ref:`netscript` documentation. -Specifically, you'll want to take a look at :ref:`netscriptfunctions`. - -Enter the following code in the script editor: - -.. code:: javascript - - /** @param {NS} ns */ - export async function main(ns) { - // Defines the "target server", which is the server - // that we're going to hack. In this case, it's "n00dles" - const target = "n00dles"; - - // Defines how much money a server should have before we hack it - // In this case, it is set to 75% of the server's max money - const moneyThresh = ns.getServerMaxMoney(target) * 0.75; - - // Defines the maximum security level the target server can - // have. If the target's security level is higher than this, - // we'll weaken it before doing anything else - const securityThresh = ns.getServerMinSecurityLevel(target) + 5; - - // If we have the BruteSSH.exe program, use it to open the SSH Port - // on the target server - if (ns.fileExists("BruteSSH.exe", "home")) { - ns.brutessh(target); - } - - // Get root access to target server - ns.nuke(target); - - // Infinite loop that continously hacks/grows/weakens the target server - while(true) { - if (ns.getServerSecurityLevel(target) > securityThresh) { - // If the server's security level is above our threshold, weaken it - await ns.weaken(target); - } else if (ns.getServerMoneyAvailable(target) < moneyThresh) { - // If the server's money is less than our threshold, grow it - await ns.grow(target); - } else { - // Otherwise, hack it - await ns.hack(target); - } - } - } -The script above contains comments that document what it does, but let's go through it -step-by-step anyways. - -.. code:: javascript - - const target = "n00dles"; - -This first command defines a string which contains our target server. That's the server -that we're going to hack. For now, it's set to `n00dles` because that's the only -server with a required hacking level of 1. If you want to hack a different server, -simply change this -variable to be the hostname of another server. - -.. code:: javascript - - const moneyThresh = ns.getServerMaxMoney(target) * 0.75; - -This second command defines a numerical value representing the minimum -amount of money that must be available on the target server in order for our script -to hack it. If the money available on the target server is less than this value, -then our script will :js:func:`grow` the server rather than hacking it. -It is set to 75% of the maximum amount of money that can be available on the server. -The :js:func:`getServerMaxMoney` Netscript function is used to find this value - -.. code:: javascript - - const securityThresh = ns.getServerMinSecurityLevel(target) + 5; - -This third command defines a numerical value representing the maximum security level -the target server can have. If the target server's security level is higher than -this value, then our script will :js:func:`weaken` the script before doing anything else. - -.. code:: javascript - - if (ns.fileExists("BruteSSH.exe", "home")) { - ns.brutessh(target); - } - - ns.nuke(target); - -This section of code is used to gain root access on the target server. This is -necessary for hacking. See :ref:`here for more details `. - -.. code:: javascript - - while (true) { - if (ns.getServerSecurityLevel(target) > securityThresh) { - // If the server's security level is above our threshold, weaken it - await ns.weaken(target); - } else if (ns.getServerMoneyAvailable(target) < moneyThresh) { - // Otherwise, if the server's money is less than our threshold, grow it - await ns.grow(target); - } else { - // Otherwise, hack it - await ns.hack(target); - } - } - -This is the main section that drives our script. It dictates the script's logic -and carries out the hacking operations. The `while (true)` creates an infinite loop -that will continuously run the hacking logic until the the script is killed. - -The await keyword is needed for `hack` / `grow` / `weaken` because these commands take -time to execute, unlike the others. If you forget to await these commands, you will get -an exception saying you tried to do multiple things at once, because your code will -immediately finish the function call without waiting for the operation to be done. Also -important is that await can only be used in functions marked async (which main() is). - -Running our Scripts -------------------- -Now we want to start running our hacking script so that it can start earning us -money and experience. Our home computer only has 8GB of RAM and we'll be using it for -something else later. So instead, we'll take advantage of the RAM on other machines. - -Go to |Terminal| and enter the following command:: - - $ scan-analyze 2 - -This will show detailed information about some servers on the network. The -**network is randomized so it will be different for every person**. -Here's what mine showed at the time I made this:: - - [home ~]> scan-analyze 2 - ~~~~~~~~~~ Beginning scan-analyze ~~~~~~~~~~ - - n00dles - --Root Access: YES, Required hacking skill: 1 - --Number of open ports required to NUKE: 0 - --RAM: 4.00GB - - ----zer0 - ------Root Access: NO, Required hacking skill: 75 - ------Number of open ports required to NUKE: 1 - ------RAM: 32.00GB - - foodnstuff - --Root Access: NO, Required hacking skill: 1 - --Number of open ports required to NUKE: 0 - --RAM: 16.00GB - - sigma-cosmetics - --Root Access: NO, Required hacking skill: 5 - --Number of open ports required to NUKE: 0 - --RAM: 16.00GB - - joesguns - --Root Access: NO, Required hacking skill: 10 - --Number of open ports required to NUKE: 0 - --RAM: 16.00GB - - ----max-hardware - ------Root Access: NO, Required hacking skill: 80 - ------Number of open ports required to NUKE: 1 - ------RAM: 32.00GB - - ----CSEC - ------Root Access: NO, Required hacking skill: 54 - ------Number of open ports required to NUKE: 1 - ------RAM: 8.00GB - - hong-fang-tea - --Root Access: NO, Required hacking skill: 30 - --Number of open ports required to NUKE: 0 - --RAM: 16.00GB - - ----nectar-net - ------Root Access: NO, Required hacking skill: 20 - ------Number of open ports required to NUKE: 0 - ------RAM: 16.00GB - - harakiri-sushi - --Root Access: NO, Required hacking skill: 40 - --Number of open ports required to NUKE: 0 - --RAM: 16.00GB - - iron-gym - --Root Access: NO, Required hacking skill: 100 - --Number of open ports required to NUKE: 1 - --RAM: 32.00GB - -Take note of the following servers: - -* |sigma-cosmetics| -* |joesguns| -* |nectar-net| -* |hong-fang-tea| -* |harakiri-sushi| - -All of these servers have 16GB of RAM. Furthermore, all of these servers do not require -any open ports in order to NUKE. In other words, we can gain root access to all of these -servers and then run scripts on them. - -First, let's determine how many threads of our hacking script we can run. -:ref:`Read more about multithreading scripts here ` -The script we wrote -uses 2.6GB of RAM. You can check this using the following |Terminal| command:: - - $ mem early-hack-template.js - -This means we can run 6 threads on a 16GB server. Now, to run our scripts on all of these -servers, we have to do the following: - -1. Use the :ref:`scp_terminal_command` |Terminal| command to copy our script to each server. -2. Use the :ref:`connect_terminal_command` |Terminal| command to connect to a server. -3. Use the :ref:`run_terminal_command` |Terminal| command to run the `NUKE.exe` program and - gain root access. -4. Use the :ref:`run_terminal_command` |Terminal| command again to run our script. -5. Repeat steps 2-4 for each server. - -Here's the sequence of |Terminal| commands I used in order to achieve this:: - - $ home - $ scp early-hack-template.js n00dles - $ scp early-hack-template.js sigma-cosmetics - $ scp early-hack-template.js joesguns - $ scp early-hack-template.js nectar-net - $ scp early-hack-template.js hong-fang-tea - $ scp early-hack-template.js harakiri-sushi - $ connect n00dles - $ run NUKE.exe - $ run early-hack-template.js -t 1 - $ home - $ connect sigma-cosmetics - $ run NUKE.exe - $ run early-hack-template.js -t 6 - $ home - $ connect joesguns - $ run NUKE.exe - $ run early-hack-template.js -t 6 - $ home - $ connect hong-fang-tea - $ run NUKE.exe - $ run early-hack-template.js -t 6 - $ home - $ connect harakiri-sushi - $ run NUKE.exe - $ run early-hack-template.js -t 6 - $ home - $ connect hong-fang-tea - $ connect nectar-net - $ run NUKE.exe - $ run early-hack-template.js -t 6 - -.. note:: - - Pressing the :code:`Tab` key in the middle of a Terminal command will attempt to - auto-complete the command. For example, if you type in :code:`scp ea` and then - hit :code:`Tab`, the rest of the script's name should automatically be filled in. - This works for most commands in the game! - -The :ref:`home_terminal_command` |Terminal| command is used to connect to the home -computer. When running our scripts with the :code:`run early-hack-template.js -t 6` -command, the :code:`-t 6` specifies that the script should be run with 6 threads. - -Note that the |nectar-net| server isn't in the home computer's immediate network. -This means you can't directly connect to it from home. You will have to search for it -inside the network. The results of the `scan-analyze 2` command we ran before -will show where it is. In my case, I could connect to it by going from -`hong-fang-tea -> nectar-net`. However, this will probably be different for you. - -After running all of these |Terminal| commands, our scripts are now up and running. -These will earn money and hacking experience over time. These gains will be -really slow right now, but they will increase once our hacking skill rises and -we start running more scripts. - -Increasing Hacking Level ------------------------- -There are many servers besides |n00dles| that can be hacked, but they have -higher required hacking levels. Therefore, we should raise our hacking level. Not only -will this let us hack more servers, but it will also increase the effectiveness of our hacking -against |n00dles|. - -The easiest way to train your hacking level is to visit Rothman University. You can do this by -clicking the `City` tab on the left-hand navigation menu, or you can use the -:ref:`keyboard shortcut ` Alt + w. Rothman University should be one of the buttons -near the top. Click the button to go to the location. - -Once you go to Rothman University, you should see a screen with several options. These -options describe different courses you can take. You should click the first button, which -says: "Study Computer Science (free)". - -After you click the button, you will start studying and earning hacking experience. While you -are doing this, you cannot interact with any other part of the game until you click the button -that says "Stop taking course". - -Right now, we want a hacking level of 10. You need approximately 174 hacking experience to reach -level 10. You can check how much hacking experience you have by clicking the `Stats` tab -on the left-hand navigation menu, or by using |Keyboard shortcut| Alt + c. -Since studying at Rothman University earns you 1 experience per second, this will take -174 seconds, or approximately 3 minutes. Feel free to do something in the meantime! - -Editing our Hacking Script --------------------------- -Now that we have a hacking level of 10, we can hack the :code:`joesguns` server. This server -will be slightly more profitable than :code:`n00dles`. Therefore, we want to change our hacking -script to target :code:`joesguns` instead of :code:`n00dles`. - -Go to |Terminal| and edit the hacking script by entering:: - - $ home - $ nano early-hack-template.js - -At the top of the script, change the `target` variable to be `joesguns`: - -.. code:: javascript - - const target = "joesguns"; - -Note that this will **NOT** affect any instances of the script that are already running. -This will only affect instances of the script that are ran from this point forward. - -Creating a New Script to Purchase New Servers ---------------------------------------------- -Next, we're going to create a script that automatically purchases additional servers. These -servers will be used to run many scripts. Running this script will initially be very -expensive since purchasing a server costs money, but it will pay off in the long run. - -In order to create this script, you should familiarize yourself with the following -Netscript functions: - -* :js:func:`purchaseServer` -* :js:func:`getPurchasedServerCost` -* :js:func:`getPurchasedServerLimit` -* :js:func:`getServerMoneyAvailable` -* :js:func:`scp` -* :js:func:`exec` - -Create the script by going to |Terminal| and typing:: - - $ home - $ nano purchase-server-8gb.js - -Paste the following code into the script editor: - -.. code:: javascript - - /** @param {NS} ns */ - export async function main(ns) { - // How much RAM each purchased server will have. In this case, it'll - // be 8GB. - const ram = 8; - - // Iterator we'll use for our loop - let i = 0; - - // Continuously try to purchase servers until we've reached the maximum - // amount of servers - while (i < ns.getPurchasedServerLimit()) { - // Check if we have enough money to purchase a server - if (ns.getServerMoneyAvailable("home") > ns.getPurchasedServerCost(ram)) { - // If we have enough money, then: - // 1. Purchase the server - // 2. Copy our hacking script onto the newly-purchased server - // 3. Run our hacking script on the newly-purchased server with 3 threads - // 4. Increment our iterator to indicate that we've bought a new server - let hostname = ns.purchaseServer("pserv-" + i, ram); - ns.scp("early-hack-template.js", hostname); - ns.exec("early-hack-template.js", hostname, 3); - ++i; - } - //Make the script wait for a second before looping again. - //Removing this line will cause an infinite loop and crash the game. - await ns.sleep(1000); - } - } - -This code uses a while loop to purchase the maximum amount of servers using the -:js:func:`purchaseServer` Netscript function. Each of these servers will have -8GB of RAM, as defined in the :code:`ram` variable. Note that the script uses the command -:code:`getServerMoneyAvailable("home")` to get the amount of money you currently have. -This is then used to check if you can afford to purchase a server. - -Whenever the script purchases a new server, it uses the :js:func:`scp` function to copy -our script onto that new server, and then it uses the :js:func:`exec` function to -execute it on that server. - -To run this script, go to |Terminal| and type:: - - $ run purchase-server-8gb.js - -This purchase will continuously run until it has purchased the maximum number of servers. -When this happens, it'll mean that you have a bunch of new servers that are all running -hacking scripts against the :code:`joesguns` server! - -.. note:: - - The reason we're using so many scripts to hack :code:`joesguns` instead of targeting other - servers is because it's more effective. This early in the game, we don't have enough RAM - to efficiently hack multiple targets, and trying to do so would be slow as we'd be spread - too thin. You should definitely do this later on, though! - -Note that purchasing a server is fairly expensive, and purchasing the maximum amount of -servers even more so. At the time of writing this guide, the script above requires -$11 million in order to finish purchasing all of the 8GB servers. -Therefore, we need to find additional ways to make money to speed -up the process! These are covered in the next section. - -Additional Sources of Income ----------------------------- -There are other ways to gain money in this game besides scripts & hacking. - -Hacknet Nodes -^^^^^^^^^^^^^ -If you completed the introductory tutorial, you were already introduced to this method: Hacknet Nodes. -Once you have enough money, you can start upgrading your Hacknet Nodes in order to increase -your passive income stream. This is completely optional. Since each Hacknet Node upgrade -takes a certain amount of time to "pay itself off", it may not necessarily be in your best -interest to use these. - -Nonetheless, Hacknet Nodes are a good source of income early in the game, although -their effectiveness tapers off later on. If you do wind up purchasing and upgrading Hacknet Nodes, -I would suggest only upgrading their levels for now. I wouldn't bother with RAM and Core -upgrades until later on. - -Crime -^^^^^ -The best source of income right now is from :ref:`committing crimes `. -This is because it not only gives you a large amount of money, but it also raises your -hacking level. To commit crimes, click on the :code:`City` tab on the left-hand -navigation menu or use the |Keyboard shortcut| Alt + w. -Then, click on the link that says :code:`The Slums`. - -In the Slums, you can attempt to commit a variety of crimes, each of which gives certain -types of experience and money if successful. See :ref:`gameplay_crimes` for more details. - -.. note:: - - You are not always successful when you attempt to commit a crime. Nothing bad happens - if you fail a crime, but you won't earn any money and the experience gained will be - reduced. Raising your stats improves your chance of successfully committing a crime. - -Right now, the best option is the :code:`Rob Store` crime. This takes 60 seconds to attempt -and gives $400k if successful. I suggest this crime because you don't have to click or check -in too often since it takes a whole minute to attempt. Furthermore, it gives hacking experience, -which is very important right now. - -Alternatively, you can also use the :code:`Shoplift` crime. This takes 2 seconds to attempt -and gives $15k if successful. This crime is slightly easier and is more profitable -than :code:`Rob Store`, but it requires constant clicking and it doesn't give -hacking experience. - -Work for a Company -^^^^^^^^^^^^^^^^^^ -If you don't want to constantly check in on the game to commit crimes, there's another option -that's much more passive: working for a :ref:`company `. -This will not be nearly as profitable as crimes, but it's completely passive. - -Go to the :code:`City` tab on the left-hand navigation menu and then go to -:code:`Joe's Guns`. At :code:`Joe's Guns`, there will be an option that says -:code:`Apply to be an Employee`. Click this to get the job. Then, a new option -will appear that simply says :code:`Work`. Click this to start working. -Working at :code:`Joe's Guns` earns $110 per second and also grants some experience -for every stat except hacking. - -Working for a company is completely passive. You can choose to focus on your work, do -something else simultaneously, or switch between those two. While you focus on work, -you will not be able to do anything else in the game. If you do something else meanwhile, -you will not gain reputation at the same speed. You can cancel working at any time. -You'll notice that cancelling your work early causes you to lose out on some reputation -gains, but you shouldn't worry about this. Company reputation isn't important right now. - -Once your hacking hits level 75, you can visit :code:`Carmichael Security` in the city -and get a software job there. This job offers higher pay and also earns you -hacking experience. - -There are many more companies in the |City tab| that offer more pay and also more gameplay -features. Feel free to explore! - -After you Purchase your New Servers ------------------------------------ -After you've made a total of $11 million, your automatic server-purchasing script should -finish running. This will free up some RAM on your home computer. We don't want this RAM -to go to waste, so we'll make use of it. Go to |Terminal| and enter the following commands:: - - $ home - $ run early-hack-template.js -t 3 - -Reaching a Hacking Level of 50 ------------------------------- -Once you reach a hacking level of 50, two new important parts of the game open up. - -Creating your first program: BruteSSH.exe -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -On the left-hand navigation menu you will notice a :code:`Create Programs` tab with a -red notification icon. This indicates that there are programs available to be created. -Click on that tab (or use |Keyboard shortcut| Alt + p) and you'll see a -list of all the programs you can currently create. Hovering over a program will give a -brief description of its function. Simply click on a program to start creating it. - -Right now, the program we want to create is :code:`BruteSSH.exe`. This program is used -to open up SSH ports on servers. This will allow you to hack more servers, -as many servers in the game require a certain number of opened ports in order for -:code:`NUKE.exe` to gain root access. - -When you are creating a program, you cannot interact with any other part of the game. -Feel free to cancel your work on creating a program at any time, as your progress will -be saved and can be picked back up later. :code:`BruteSSH.exe` takes about -10 minutes to complete. - -Optional: Create AutoLink.exe -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -On the :code:`Create Programs` page, you will notice another program you can create -called :code:`AutoLink.exe`. If you don't mind waiting another 10-15 minutes, you should -go ahead and create this program. It makes it much less tedious to connect to other servers, -but it's not necessary for progressing. - -Joining your first faction: CyberSec -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Shortly after you reached level 50 hacking, you should have received a message that -said this:: - - Message received from unknown sender: - - We've been watching you. Your skills are very impressive. But you're wasting - your talents. If you join us, you can put your skills to good use and change - the world for the better. If you join us, we can unlock your full potential. - But first, you must pass our test. Find and hack our server using the Terminal. - - -CyberSec - - This message was saved as csec-test.msg onto your home computer. - -If you didn't, or if you accidentally closed it, that's okay! Messages get saved onto -your home computer. Enter the following |Terminal| commands to view the message:: - - $ home - $ cat csec-test.msg - -This message is part of the game's main "quest-line". It is a message from the -|CyberSec faction| that is asking you to pass their test. -Passing their test is simple, you just have to find their server and hack it through -the |Terminal|. Their server is called :code:`CSEC`. -To do this, we'll use the :ref:`scan_analyze_terminal_command` -Terminal command, just like we did before:: - - $ home - $ scan-analyze 2 - -This will show you the network for all servers that are up to 2 "nodes" away from -your home computer. Remember that the network is randomly generated so it'll look -different for everyone. Here's the relevant part of my :code:`scan-analyze` results:: - - >iron-gym - --Root Access: NO, Required hacking skill: 100 - --Number of open ports required to NUKE: 1 - --RAM: 32 - - ---->zer0 - ------Root Access: NO, Required hacking skill: 75 - ------Number of open ports required to NUKE: 1 - ------RAM: 32 - - ---->CSEC - ------Root Access: NO, Required hacking skill: 54 - ------Number of open ports required to NUKE: 1 - ------RAM: 8 - -This tells me that I can reach :code:`CSEC` by going through :code:`iron-gym`:: - - $ connect iron-gym - $ connect CSEC - -.. note:: - - If you created the :code:`AutoLink.exe` program earlier, then there is an easier - method of connecting to :code:`CSEC`. You'll notice that in the :code:`scan-analyze` - results, all of the server hostnames are white and underlined. You can simply - click one of the server hostnames in order to connect to it. So, simply click - :code:`CSEC`! - -.. note:: - - Make sure you notice the required hacking skill for the :code:`CSEC` server. - This is a random value between 51 and 60. Although you receive the message - from CSEC once you hit 50 hacking, you cannot actually pass their test - until your hacking is high enough to install a backdoor on their server. - -After you are connected to the :code:`CSEC` server, you can backdoor it. Note that this -server requires one open port in order to gain root access. We can open the SSH port -using the :code:`BruteSSH.exe` program we created earlier. In |Terminal|:: - - $ run BruteSSH.exe - $ run NUKE.exe - $ backdoor - -After you successfully install the backdoor, you should receive a faction -invitation from |CyberSec| shortly afterwards. Accept it. If you accidentally -reject the invitation, that's okay. Just go to the :code:`Factions` tab -(|Keyboard shortcut| Alt + f) and you should see an option that lets you -accept the invitation. - -Congrats! You just joined your first faction. Don't worry about doing anything -with this faction yet, we can come back to it later. - -Using Additional Servers to Hack Joesguns ------------------------------------------ -Once you have the |BruteSSH| program, you will be able to gain root access -to several additional servers. These servers have more RAM that you can use to -run scripts. We'll use the RAM on these servers to run more scripts that target -:code:`joesguns`. - -Copying our Scripts -^^^^^^^^^^^^^^^^^^^ -The server's we'll be using to run our scripts are: - -* :code:`neo-net` -* :code:`zer0` -* :code:`max-hardware` -* :code:`iron-gym` - -All of these servers have 32GB of RAM. You can use the |Terminal| command -:code:`scan-analyze 3` to see for yourself. To copy our hacking scripts onto these servers, -go to |Terminal| and run:: - - $ home - $ scp early-hack-template.js neo-net - $ scp early-hack-template.js zer0 - $ scp early-hack-template.js max-hardware - $ scp early-hack-template.js iron-gym - -Since each of these servers has 32GB of RAM, we can run our hacking script with 12 threads -on each server. By now, you should know how to connect to servers. So find and connect to -each of the servers above using the :code:`scan-analyze 3` |Terminal| command. Then, use -following |Terminal| command to run our hacking -script with 12 threads:: - - $ run early-hack-template.js -t 12 - -Remember that if you have the |AutoLink| program, you can simply click on the hostname of a server -after running :ref:`scan_analyze_terminal_command` to connect to it. - -Profiting from Scripts & Gaining Reputation with CyberSec ---------------------------------------------------------- -Now it's time to play the waiting game. It will take some time for your scripts to start -earning money. Remember that most of your scripts are targeting |joesguns|. It will take a -bit for them to :js:func:`grow` and :js:func:`weaken` the server to the appropriate values -before they start hacking it. Once they do, however, the scripts will be very profitable. - -.. note:: - - For reference, in about two hours after starting my first script, my scripts had a - production rate of $20k per second and had earned a total of $70 million. - (You can see these stats on the :code:`Active Scripts` tab). - - After another 15 minutes, the production rate had increased to $25k per second - and the scripts had made an additional $55 million. - - Your results will vary based on how fast you earned money from crime/working/hacknet nodes, - but this will hopefully give you a good indication of how much the scripts can earn. - -In the meantime, we are going to be gaining reputation with the |CyberSec faction|. -Go to the |Factions tab| on the left-hand -navigation menu, and from there select |CyberSec|. In the middle of -the page there should be a button for :code:`Hacking Contracts`. -Click it to start earning reputation for the |CyberSec| faction (as well -as some hacking experience). The higher your hacking level, the more reputation you -will gain. Note that while you are working for a faction, you can choose to not interact -with the rest of the game in any way to gain reputation at full speed. You can also select to -do something else simultaneously, gaining reputation a bit more slowly, until you focus again. -You can cancel your faction work at any time with no penalty to your reputation gained so far. - -Purchasing Upgrades and Augmentations -------------------------------------- -As I mentioned before, within 1-2 hours I had earned over $200 million. Now, it's time -to spend all of this money on some persistent upgrades to help progress! - -Upgrading RAM on Home computer -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The most important thing to upgrade right now is the RAM on your home computer. This -will allow you to run more scripts. - -To upgrade your RAM, go to the |City tab| and visit the company |Alpha Enterprises|. -There will be an option that says :code:`Purchase additional RAM for Home Computer`. -Click it and follow the dialog box to upgrade your RAM. - -I recommend getting your home computer's RAM to *at least* 128GB. Getting it even -higher would be better. - -Purchasing your First Augmentations -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Once you get ~1000 reputation with the |CyberSec faction|, you can purchase -your first :ref:`Augmentation ` from them. - -To do this, go to the |Factions tab| on the left-hand navigation menu -(|Keyboard shortcut| Alt + f) and select |CyberSec|. There is an button -near the bottom that says :code:`Purchase Augmentations`. This will bring up a -page that displays all of the Augmentations available from |CyberSec|. Some of them -may be locked right now. To unlock these, you will need to earn more -reputation with |CyberSec|. - -Augmentations give persistent upgrades in the form of multipliers. These aren't very -powerful early in the game because the multipliers are small. However, the effects -of Augmentations stack multiplicatively **with each other**, so as you continue to install -many Augmentations their effects will increase significantly. - -Because of this, I would recommend investing more in RAM upgrades for your home computer rather -than Augmentations early on. Having enough RAM to run many scripts will allow you to make -much more money, and then you can come back later on and get all these Augmentations. - -Right now, I suggest purchasing at the very least the :code:`Neurotrainer I` Augmentation from -|CyberSec|. If you have the money to spare, I would also suggest getting :code:`BitWire` and -several levels of the :code:`NeuroFlux Governor` (:code:`NFG`) Augmentations. Note that each time -you purchase an Augmentation, -:ref:`the price of purchasing another increases by 90% `, -so make sure you buy the most expensive Augmentation first. Don't worry, once you choose to -install Augmentations, their prices will reset back to their original values. - -Next Steps ----------- -That's the end of the walkthrough portion of this guide! You should continue to explore -what the game has to offer. There's quite a few features that aren't covered or mentioned -in this guide, and even more that get unlocked as you continue to play! - -Also, check out the :ref:`netscript` documentation to see what it has to offer. Writing -scripts to perform and automate various tasks is where most of the fun in the game comes -from (in my opinion)! - -The following are a few things you may want to consider doing in the near future. - -Installing Augmentations (and Resetting) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -If you've purchased any :ref:`gameplay_augmentations`, you'll need to install them before you -actually gain their effects. Installing Augmentations is the game's "soft-reset" or "prestige" -mechanic. You can :ref:`read more details about it here `. - -To install your Augmentations, click the |Augmentations tab| on the left-hand navigation -menu (|Keyboard shortcut| Alt + a). You will see a list of all of the Augmentations -you have purchased. Below that, you will see a button that says :code:`Install Augmentations`. -Be warned, after clicking this there is no way to undo it (unless you load an earlier save). - -Automating the Script Startup Process -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Whenever you install Augmentations, all of your scripts are killed and you'll have to -re-run them. Doing this every time you install Augmentations would be very tedious and annoying, -so you should write a script to automate the process. Here's a simple example for a -startup script. Feel free to adjust it to your liking. - -.. code:: javascript - - /** @param {NS} ns */ - export async function main(ns) { - // Array of all servers that don't need any ports opened - // to gain root access. These have 16 GB of RAM - const servers0Port = ["sigma-cosmetics", - "joesguns", - "nectar-net", - "hong-fang-tea", - "harakiri-sushi"]; - - // Array of all servers that only need 1 port opened - // to gain root access. These have 32 GB of RAM - const servers1Port = ["neo-net", - "zer0", - "max-hardware", - "iron-gym"]; - - // Copy our scripts onto each server that requires 0 ports - // to gain root access. Then use nuke() to gain admin access and - // run the scripts. - for (let i = 0; i < servers0Port.length; ++i) { - const serv = servers0Port[i]; - - ns.scp("early-hack-template.js", serv); - ns.nuke(serv); - ns.exec("early-hack-template.js", serv, 6); - } - - // Wait until we acquire the "BruteSSH.exe" program - while (!ns.fileExists("BruteSSH.exe")) { - await ns.sleep(60000); - } - - // Copy our scripts onto each server that requires 1 port - // to gain root access. Then use brutessh() and nuke() - // to gain admin access and run the scripts. - for (let i = 0; i < servers1Port.length; ++i) { - const serv = servers1Port[i]; - - ns.scp("early-hack-template.js", serv); - ns.brutessh(serv); - ns.nuke(serv); - ns.exec("early-hack-template.js", serv, 12); - } - } - -Random Tips ------------ -* Early on in the game, it's better to spend your money on upgrading RAM and purchasing - new servers rather than spending it on Augmentations -* The more money available on a server, the more effective the :js:func:`hack` and - :js:func:`grow` Netscript functions will be. This is because both of these functions - use percentages rather than flat values. :js:func:`hack` steals a percentage of a server's - total available money, and :js:func:`grow` increases a server's money by X%. -* There is a limit to how much money can exist on a server. This value is different for each - server. The :js:func:`getServerMaxMoney` function will tell you this maximum value. -* At this stage in the game, your combat stats (strength, defense, etc.) are not nearly - as useful as your hacking stat. Do not invest too much time or money into gaining combat - stat exp. -* As a rule of thumb, your hacking target should be the server with highest max money that's - required hacking level is under 1/2 of your hacking level. - - - -.. Substitution definitions -.. |Alpha Enterprises| replace:: :code:`Alpha Enterprises` -.. |Augmentations tab| replace:: :code:`Augmentations` tab -.. |AutoLink| replace:: :code:`AutoLink.exe` -.. |BruteSSH| replace:: :code:`BruteSSH.exe` -.. |City tab| replace:: :code:`City` tab -.. |CyberSec| replace:: :code:`CyberSec` -.. |CyberSec faction| replace:: :code:`CyberSec` :ref:`faction ` -.. |Factions tab| replace:: :code:`Factions` tab -.. |Keyboard shortcut| replace:: :ref:`Keyboard shortcut ` -.. |NUKE| replace:: :code:`NUKE.exe` -.. |Terminal| replace:: :code:`Terminal` -.. |n00dles| replace:: :code:`n00dles` -.. |harakiri-sushi| replace:: :code:`harakiri-sushi` -.. |hong-fang-tea| replace:: :code:`hong-fang-tea` -.. |joesguns| replace:: :code:`joesguns` -.. |nectar-net| replace:: :code:`nectar-net` -.. |sigma-cosmetics| replace:: :code:`sigma-cosmetics` diff --git a/doc/source/guidesandtips/recommendedbitnodeorder.rst b/doc/source/guidesandtips/recommendedbitnodeorder.rst deleted file mode 100644 index 6cba6c8c2..000000000 --- a/doc/source/guidesandtips/recommendedbitnodeorder.rst +++ /dev/null @@ -1,593 +0,0 @@ -What BitNode should I do? -========================= - -.. warning:: This page contains spoilers regarding the game's story/plot-line. - -After destroying their first :ref:`BitNode `, many players -wonder which BitNode they should tackle next. This guide hopefully helps answer -that question. - -Overview of each BitNode ------------------------- - -BitNode-1: Source Genesis -^^^^^^^^^^^^^^^^^^^^^^^^^ -Description - The first BitNode created by the Enders to imprison the minds of humans. It became - the prototype and testing-grounds for all of the BitNodes that followed. - - This is the first BitNode that you play through. It has no special - modifications or mechanics. - -Source-File - :Max Level: 3 - - This Source-File lets the player start with 32GB of RAM on his/her home computer when - entering a new BitNode, and also increases all of the player's multipliers by: - - * Level 1: 16% - * Level 2: 24% - * Level 3: 28% - -Difficulty - The easiest BitNode - -BitNode-2: Rise of the Underworld -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Description - From the shadows, they rose. - - Organized crime groups quickly filled the void of power left behind from the collapse of - Western government in the 2050s. As society and civilization broke down, people quickly - succumbed to the innate human impulse of evil and savagery. The organized crime - factions quickly rose to the top of the modern world. - - In this BitNode: - - * Your hacking level is reduced by 20% - * The growth rate and maximum amount of money available on servers are significantly decreased - * The amount of money gained from crimes and Infiltration is tripled - * Certain Factions (Slum Snakes, Tetrads, The Syndicate, The Dark Army, Speakers for the Dead, - NiteSec, The Black Hand) give the player the ability to form and manage their own gangs. These gangs - will earn the player money and reputation with the corresponding Faction - * Every Augmentation* in the game will be available through the Factions listed above - * For every Faction NOT listed above, reputation gains are halved - * You will no longer gain passive reputation with Factions - - (* except Neuroflux Governor, The Red Pill and augments of secret factions) - -Source-File - :Max Level: 3 - - This Source-File allows you to form gangs in other BitNodes once your karma decreases to a certain value. - It also increases the player's crime success rate, crime money, and charisma multipliers by: - - * Level 1: 24% - * Level 2: 36% - * Level 3: 42% - -Difficulty - Fairly easy, as hacking is still very profitable and the costs of various purchases/upgrades - is not increased. The gang mechanic may seem strange as its very different from anything - else, but it can be very powerful once you get the hang of it. - -BitNode-3: Corporatocracy -^^^^^^^^^^^^^^^^^^^^^^^^^ -Description - Our greatest illusion is that a healthy society can revolve around a - single-minded pursuit of wealth. - - Sometime in the early 21st century economic and political globalization turned - the world into a corporatocracy, and it never looked back. Now, the privileged - elite will happily bankrupt their own countrymen, decimate their own community, - and evict their neighbors from houses in their desperate bid to increase their wealth. - - In this BitNode you can create and manage your own corporation. Running a successful corporation - has the potential of generating massive profits. All other forms of income are reduced by 75%. Furthermore: - - * The price and reputation cost of all Augmentations is tripled - * The starting and maximum amount of money on servers is reduced by 80% - * Server growth rate is reduced by 80% - * You now only need 75 favour with a faction in order to donate to it, rather than 150 - -Source-File - :Max Level: 3 - - This Source-File lets you create corporations on other BitNodes (although - some BitNodes will disable this mechanic) and level 3 permanently unlocks the full API. This Source-File also increases your - charisma and company salary multipliers by: - - * Level 1: 8% - * Level 2: 12% - * Level 3: 14% - -Difficulty - Somewhat-steep learning curve as you learn how to use and manage Corporations. Afterwards, - however, the BitNode is easy as Corporations can be very profitable. - -BitNode-4: The Singularity -^^^^^^^^^^^^^^^^^^^^^^^^^^ -Description - The Singularity has arrived. The human race is gone, replaced by artificially superintelligent - beings that are more machine than man. - - In this BitNode, progressing is significantly harder: - - * Experience gain rates for all stats are reduced. - * Most methods of earning money will now give significantly less. - - In this BitNode you will gain access to a new set of Netscript Functions known as Singularity Functions. - These functions allow you to control most aspects of the game through scripts, including - working for factions/companies, purchasing/installing Augmentations, and creating programs. - -Source-File - :Max Level: 3 - - This Source-File lets you access and use the Singularity Functions in other BitNodes. - Each level of this Source-File will reduce RAM costs: - - * Level 1: 16x - * Level 2: 4x - * Level 3: 1x - -Difficulty: - Depending on what Source-Files you have unlocked before attempting this BitNode, - it can range from easy to moderate. - -BitNode-5: Artificial Intelligence -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Description - They said it couldn't be done. They said the human brain, - along with its consciousness and intelligence, couldn't be replicated. They said the complexity - of the brain results from unpredictable, nonlinear interactions that couldn't be modeled - by 1's and 0's. They were wrong. - - In this BitNode: - - * The base security level of servers is doubled - * The starting money on servers is halved, but the maximum money is doubled - * Most methods of earning money now give significantly less - * Infiltration gives 50% more reputation and money - * Corporations have 50% lower valuations and are therefore less profitable - * Augmentation price is doubled - * Hacking experience gain rates are reduced - -Source-File - :Max Level: 3 - - This Source-File grants you a special new stat called Intelligence. - - Intelligence is unique because it is permanent and persistent (it never gets reset back to 1). However - gaining Intelligence experience is much slower than other stats, and it is also hidden (you won't know - when you gain experience and how much). Higher Intelligence levels will boost your production for many actions - in the game. - - In addition, this Source-File will unlock the :js:func:`getBitNodeMultipliers()` Netscript function, - and will also raise all of your hacking-related multipliers by: - - * Level 1: 8% - * Level 2: 12% - * Level 3: 14% - -Difficulty - Depending on what Source-Files you have unlocked before attempting this BitNode, it - can range from easy to moderate. - -BitNode-6: Bladeburners -^^^^^^^^^^^^^^^^^^^^^^^ -Description - In the middle of the 21st century, OmniTek Incorporated began designing and manufacturing advanced synthetic - androids, or Synthoids for short. They achieved a major technological breakthrough in the sixth generation - of their Synthoid design, called MK-VI, by developing a hyperintelligent AI. Many argue that this was - the first sentient AI ever created. This resulted in Synthoid models that were stronger, faster, and more intelligent - than the humans that had created them. - - In this BitNode you will be able to access the Bladeburner Division at the NSA, which provides - a new mechanic for progression. Furthermore: - - * Hacking and Hacknet Nodes will be less profitable - * Your hacking level is reduced by 65% - * Hacking experience gain is reduced by 75% - * Corporations have 80% lower valuations and are therefore less profitable - * Working for companies is 50% less profitable - * Crimes and Infiltration are 25% less profitable - -Source-File - :Max Level: 3 - - This Source-File allows you to access the NSA's Bladeburner Division in other - BitNodes. In addition, this Source-File will raise both the level and experience - gain rate of all your combat stats by: - - * Level 1: 8% - * Level 2: 12% - * Level 3: 14% - -Difficulty - Initially difficult due to the fact that hacking is no longer profitable and you have - to learn a new mechanic. After you get the hang of the Bladeburner mechanic, however, - it becomes moderately easy. - -BitNode-7: Bladeburners 2079 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Description - In the middle of the 21st century, you were doing cutting-edge work at OmniTek Incorporated - as part of the AI design team for advanced synthetic androids, or Synthoids for short. You helped - achieve a major technological breakthrough in the sixth generation of the company's Synthoid - design, called MK-VI, by developing a hyperintelligent AI. Many argue that this was the first - sentient AI ever created. This resulted in Synthoid models that were stronger, faster, - and more intelligent than the humans that had created them. - - In this BitNode you will be able to access the Bladeburner API, which allows you to access - Bladeburner functionality through Netscript. Furthermore: - - * The rank you gain from Bladeburner contracts/operations is reduced by 40% - * Bladeburner skills cost twice as many skill points - * Augmentations are 3x more expensive - * Hacking and Hacknet Nodes will be significantly less profitable - * Your hacking level is reduced by 65% - * Hacking experience gain is reduced by 75% - * Corporations have 80% lower valuations and are therefore less profitable - * Working for companies is 50% less profitable - * Crimes and Infiltration are 25% less profitable - -Source-File - :Max Level: 3 - - This Source-File allows you to access the Bladeburner Netscript API in other - BitNodes. In addition, this Source-File will increase all of your Bladeburner multipliers by: - - * Level 1: 8% - * Level 2: 12% - * Level 3: 14% - -Difficulty - Slightly more difficult than BitNode-6. However, you will be able to automate more - aspects of the Bladeburner feature, which means it will be more passive. - -BitNode-8: Ghost of Wall Street -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Description - You are trying to make a name for yourself as an up-and-coming hedge fund manager on Wall Street. - - In this BitNode: - - * You start with $250 million - * The only way to earn money is by trading on the stock market - * You start with a WSE membership and access to the TIX API - * You are able to short stocks and place different types of orders (limit/stop) - * You can immediately donate to factions to gain reputation - -Source-File - :Max Level: 3 - - This Source-File grants the following benefits: - - * Level 1: Permanent access to WSE and TIX API - * Level 2: Ability to short stocks in other BitNodes - * Level 3: Ability to use limit/stop orders in other BitNodes - - This Source-File also increases your hacking growth multipliers by: - - * Level 1: 12% - * Level 2: 18% - * Level 3: 21% - -Difficulty - Very difficult until you unlock the Four Sigma (4S) Market Data API. After you - unlock the API however, it becomes moderately easy. - -BitNode-9: Hacktocracy -^^^^^^^^^^^^^^^^^^^^^^ -Description - When Fulcrum Technologies released their open-source Linux distro Chapeau, it quickly - became the OS of choice for the underground hacking community. Chapeau became especially - notorious for powering the Hacknet, a global, decentralized network used for nefarious - purposes. Fulcrum quickly abandoned the project and dissociated themselves from it. - - This BitNode unlocks the Hacknet Server, an upgraded version of the Hacknet Node. Hacknet Servers generate - hashes, which can be spent on a variety of different upgrades. - - In this BitNode: - - * Your stats are significantly decreased - * You cannot purchase additional servers - * Hacking is significantly less profitable - -Source-File - :Max Level: 3 - - This Source-File grants the following benefits: - - * Level 1: Permanently unlocks the Hacknet Server in other BitNodes - * Level 2: You start with 128GB of RAM on your home computer when entering a new BitNode - * Level 3: Grants a highly-upgraded Hacknet Server when entering a new BitNode - - (Note that the Level 3 effect of this Source-File only applies when entering a new BitNode, NOT - when installing Augmentations.) - - This Source-File also increases hacknet production and reduces hacknet costs by: - - * Level 1: 12% - * Level 2: 18% - * Level 3: 21% - -Difficulty - Hard - -BitNode-10: Digital Carbon -^^^^^^^^^^^^^^^^^^^^^^^^^^ -Description - In 2084, VitaLife unveiled to the world the Persona Core, a technology that allowed people - to digitize their consciousness. Their consciousness could then be transferred into Synthoids - or other bodies by trasmitting the digitized data. Human bodies became nothing more than 'sleeves' - for the human consciousness. Mankind had finally achieved immortality - at least for those - that could afford it. - - This BitNode unlocks Sleeve and grafting technologies. Sleeve technology allows you to: - - 1. Re-sleeve: Purchase and transfer your consciousness into a new body - 2. Duplicate Sleeves: Duplicate your consciousness into Synthoids, allowing you to perform different tasks synchronously - - Grafting technology allows you to graft Augmentations, which is an alternative way of installing Augmentations. - - In this BitNode: - - * Your stats are significantly decreased - * All methods of gaining money are half as profitable (except Stock Market) - * Purchased servers are more expensive, have less max RAM, and a lower maximum limit - * Augmentations are 5x as expensive and require twice as much reputation - -Source-File - :Max Level: 3 - - This Source-File unlocks Sleeve and grafting technologies in other BitNodes. - Each level of this Source-File also grants you a Duplicate Sleeve. - -Difficulty - Hard - -BitNode-11: The Big Crash -^^^^^^^^^^^^^^^^^^^^^^^^^ -Description - The 2050s was defined by the massive amounts of violent civil unrest and anarchic rebellion that rose all around the world. It was this period - of disorder that eventually lead to the governmental reformation of many global superpowers, most notably - the USA and China. But just as the world was slowly beginning to recover from these dark times, financial catastrophe hit. - - In many countries, the high cost of trying to deal with the civil disorder bankrupted the governments. In all of this chaos and confusion, hackers - were able to steal billions of dollars from the world's largest electronic banks, prompting an international banking crisis as - governments were unable to bail out insolvent banks. Now, the world is slowly crumbling in the middle of the biggest economic crisis of all time. - - In this BitNode: - - * Your hacking stat and experience gain are reduced - * The starting and maximum amount of money available on servers are reduced by 90% - * The growth rate of servers is significantly reduced - * Weakening a server is twice as effective - * Company wages are decreased by 50% - * Corporation valuations are 90% lower and are therefore significantly less profitable - * Hacknet Node production is significantly decreased - * Crime and Infiltration are more lucrative - * Augmentations are twice as expensive - -Source-File - :Max Level: 3 - - Destroying this BitNode will give you Source-File 11, or if you already have this Source-File it will - upgrade its level up to a maximum of 3. This Source-File makes it so that company favor increases BOTH - the player's salary and reputation gain rate at that company by 1% per favor (rather than just the reputation gain). - This Source-File also increases the player's company salary and reputation gain multipliers by: - - * Level 1: 32% - * Level 2: 48% - * Level 3: 56% - - This Source-File reduces the price increase for every aug bought by: - - * Level 1: 4% - * Level 2: 6% - * Level 3: 7% - -Difficulty - Hard - -BitNode-12: The Recursion -^^^^^^^^^^^^^^^^^^^^^^^^^ -Description - Every time this BitNode is destroyed, it becomes slightly harder. - -Source-File - :Max Level: Infinity - - Each level of Source-File 12 will let you start with Neuroflux Governor - equal to the level of this Source-File. - - This BitNode is meant to be done passively or when waiting for new content. - -Difficulty - Initially very easy, but then it (obviously) becomes harder as you continue to do it. - -BitNode-13: They're lunatics -^^^^^^^^^^^^^^^^^^^^^^^^^ -Description - With the invention of Augmentations in the 2040s a religious group known as the Church of the Machine God has rallied far more support than anyone would have hoped. - - Their leader, Allison "Mother" Stanek is said to have created her own Augmentation whose power goes beyond any other. Find her in Chongqing and gain her trust. - - In this BitNode: - - * Your hacking stat is reduced by 75% and exp by 90% - * Your combat stats are reduced by 30% - * Class and gym exp gains halved - * The starting and maximum amount of money available on servers is decreased - * The starting security on servers is significantly increased - * Hacking money is decreased by 80% - * Company wages are decreased by 60% and exp gains by 50% - * Hacknet Node production is decreased by 60% - * Crime money is decreased by 60% and exp gains by 50% - * Stockmarket data costs are increased 10-fold - * Corporation valuations are 99.9% lower and are therefore extremely less profitable - * The rank you gain from Bladeburner contracts/operations is reduced by 55% - * Bladeburner skills cost twice as many skill points - * Coding contracts rewards reduced by 60% - * Gangs gain are reduced significantly and offer low amount of Augmentations - * Size of Stanek's Gift is increased by 1 size - -Source-File - :Max Level: 3 - - Destroying this BitNode will give you Source-File 13, or if you already have this Source-File it will upgrade its level up to a maximum of 3. - This Source-File lets the Church of the Machine God appear in other BitNodes. - - Each level of this Source-File increases the size of Stanek's Gift. - - * Level 1: 5x5 - * Level 2: 6x6 - * Level 3: 7x7 - -Difficulty - Hard - -Recommended BitNodes --------------------- -As a player, you are not forced to tackle the BitNodes in any particular order. You are -free to choose whichever ones you want. The "best" order can vary between players, -depending on what you like to do any what kind of player you are. In general, here -are the recommended BitNodes for different things: - -For fast progression -^^^^^^^^^^^^^^^^^^^^ -.. note:: These paths do not recommend the absolute fastest path, since speed of progression is - highly dependant on playing style. Path 1 is the recommended path according to the discord community. - -Path 1 (new): - -1. (Optional) Repeat **BitNode-1: Source Genesis** until you max out its Source-File. Its Source-File - is extremely powerful, as it raises all multipliers by a significant amount. This also a let's you - get used to augments and other features resetting. - -2. Do **BitNode-3: Corporatocracy** at least once to unlock the Corporation mechanic, finishing all - 3 levels unlocks the full API for free allowing fully scripted corp. This mechanic has highest - profit potential in the game. - -3. Do **BitNode-10: Digital Carbon** once to unlock sleeves and grafting. Sleeves are useful in all nodes - and grafting can be useful in future BitNodes (especially 8). It's recommended to buy all purchasable sleeves and - their memory during the first run. - - The ordering of the next three is dependant on playing style and wants/needs. - -4. Do **BitNode-5: Artificial Intelligence** once or twice. The intelligence stat it unlocks - will gradually build up as you continue to play the game, and will be helpful - in the future. The Source-File also provides hacking multipliers, which are - strong because hacking is typically one of the best ways of earning money. - -5. Do **BitNode-4: The Singularity**. Its Source-File does not directly make you - more powerful in any way, but it does unlock the `Singularity API `_ which - let you automate significantly more aspects of the game. Consider repeating until Level 3, - since each level decreases the RAM cost of Singularity functions. - -6. Do **BitNode-2: Rise of the Underworld** once to unlock the gang mechanic. This mechanic - has high profit potential and offers large amounts of Augmentations in a single faction. - Having sleeves (Source-File 10) greatly reduces the time it takes to get access to gangs - outside this BitNode. - -7. Do **BitNode-9: Hacktocracy** to unlock the Hacknet Server mechanic. You can - consider repeating it as well, as its Level 2 and 3 effects are pretty helpful as well. - -Path 2 (old): - -1. Repeat **BitNode-1: Source Genesis** until you max out its Source-File. Its Source-File - is extremely powerful, as it raises all multipliers by a significant amount. - -2. Do **BitNode-5: Artificial Intelligence** once or twice. The intelligence stat it unlocks - will gradually build up as you continue to play the game, and will be helpful - in the future. The Source-File also provides hacking multipliers, which are - strong because hacking is typically one of the best ways of earning money. - -3. (Optional) Consider doing **BitNode-4: The Singularity**. Its Source-File does not directly make you - more powerful in any way, but it does unlock the `Singularity API `_ which - let you automate significantly more aspects of the game. - -4. Do **BitNode-3: Corporatocracy** once to unlock the Corporation mechanic. This mechanic - has high profit potential. - -5. Do **BitNode-6: Bladeburners** once to unlock the Bladeburners mechanic. The Bladeburner - mechanic is useful for some of the future BitNodes (such as 9 and 10). - -6. Do **BitNode-9: Hacktocracy** to unlock the Hacknet Server mechanic. You can - consider repeating it as well, as its Level 2 and 3 effects are pretty helpful as well. - -.. todo:: To be continued as more BitNodes get added - -For the strongest Source-Files -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Note that the strongest Source-Files are typically rewarded by the hardest BitNodes. - -The strongest Source-File is that from **BitNode-1: Source Genesis**, as it raises -all multipliers by a significant amount. - -Similarly, the Source-File from **BitNode-12: The Recursion** is also very strong -because it raises all multipliers. Each level of Source-File 12 is fairly weak, -but its effectiveness gets better over time since the effects of Source-Files and -Augmentations are multiplicative with each other. - -The Source-File from **BitNode-9: Hacktocracy** is good because it unlocks the Hacknet -Server mechanic. The Hacknet Server mechanic causes Hacknet Nodes to produce a new -currency called *hashes*, rather than money. *Hashes* can be spent on powerful upgrades -that benefit your hacking, Corporation, Bladeburner, etc. - -The Duplicate Sleeves granted by the Source-File from **BitNode-10: Digital Carbon** -are strong, but only after you have several of them and have spent some time/money upgrading -them. - -For more scripting/hacking -^^^^^^^^^^^^^^^^^^^^^^^^^^ -**BitNode-4: The Singularity** unlocks the `Singularity API `_, which -can be used to automate many different aspects of the game, including working for factions/companies, -purchasing & installing Augmentations, and creating programs - -**BitNode-6** and **BitNode-7** unlock Bladeburner and its corresponding -`Netscript API `_. This allows you to automate an entire -new mechanic. - -**BitNode-2: Rise of the Underworld** also unlocks a new mechanic and Netscript API for automating -it (the Gang mechanic). However, it is not as interesting as Bladeburner (in my opinion) - -**BitNode-9: Hacktocracy** unlocks the Hacknet Server mechanic and several new -functions in the :ref:`Hacknet Node API ` for using it. - -For new mechanics -^^^^^^^^^^^^^^^^^ -**BitNode-2: Rise of the Underworld** unlocks a new mechanic in which you can -manage a gang. Gangs earn you money and can be very profitable once they get large -and powerful. The biggest benefit of gangs, however, is that they make all -Augmentations available to you through their corresponding faction. - -**BitNode-3: Corporatocracy** unlocks a new mechanic in which you can manage a -corporation. You can earn money through Corporations by selling your stocks, or by -configuring your corporation to pay dividends to shareholders. If your Corporation -gets big enough, it can also bribe factions in exchange for faction reputation. - -**BitNode-6: Bladeburners** unlocks a new mechanic that centers around combat rather -than hacking. The main benefit of the Bladeburner mechanic is that it offers a new -method of destroying a BitNode. - -**BitNode-9: Hacktocracy** unlocks the Hacknet Server, which is an upgraded version of a -Hacknet Node. The Hacknet Server generates a computational unit called a *hash*. *Hashes* -can be spent on a variety of different upgrades that can benefit your hacking, -Corporation, Bladeburner progress, and more. It transforms the Hacknet Node from a -simple money-generator to a more interesting mechanic. - -**BitNode-10: Digital Carbon** unlocks two new mechanics: Re-Sleeving and -Duplicate Sleeves. - -**BitNode-13: They're lunatics** unlocks Stanek's Gift. This gift can improve skills, -hacknet production and costs, working and crime gains as well hacking power and speed. - -For a Challenge -^^^^^^^^^^^^^^^ -In general, the higher BitNodes are more difficult than the lower ones. -**BitNode-12: The Recursion** is an obvious exception as it gets progressively harder. - -**BitNode-8: Ghost of Wall Street** provides a unique challenge as the only method -of earning money in that BitNode is through trading at the stock market. diff --git a/doc/source/index.rst b/doc/source/index.rst deleted file mode 100644 index 2cbfb601c..000000000 --- a/doc/source/index.rst +++ /dev/null @@ -1,42 +0,0 @@ -.. Bitburner documentation master file, created by - sphinx-quickstart on Wed Oct 4 15:03:07 2017. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to Bitburner's documentation! -===================================== -Bitburner is a programming-based `incremental game `_ -that revolves around hacking and cyberpunk themes. The game is currently in the -early beta stage of development. It `can be played here `_. - -What is Bitburner? ------------------- -Bitburner is a cyberpunk-themed incremental RPG where you, the player, take the role of an unknown hacker in a dark, dystopian world. -When a mysterious hacker called jump3R messages you, they confirm your suspicions that there is something wrong with the world around you. -Now, aided by jump3R, you embark on a quest to gain money and power by any means necessary, in the hopes that this will lead you to uncover the -secrets that you've been searching for. - -.. toctree:: - :maxdepth: 5 - :caption: Contents: - - Full documentation - Basic documentation - Basic Gameplay - Advanced Gameplay - Remote API - Keyboard Shortcuts - Game Frozen or Stuck? - Guides & Tips - Tools & Resources - Changelog - v1.0.0 script migration guide - v2.0.0 script migration guide - 404 <404.rst> - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/doc/source/netscript.rst b/doc/source/netscript.rst deleted file mode 100644 index dd96b2d1c..000000000 --- a/doc/source/netscript.rst +++ /dev/null @@ -1,26 +0,0 @@ -.. _netscript: - -Netscript -========= -Netscript is the programming language used in the world of Bitburner. - -When you write scripts in Bitburner, they are written in the Netscript language. -Netscript is simply a subset of `JavaScript `_. -This means that Netscript's syntax is -identical to that of JavaScript, but it does not implement some of the features -that JavaScript has. - - -.. toctree:: - :maxdepth: 5 - :caption: Sections: - - Full documentation - Learn to Program - Netscript 1.0 - NetscriptJS (Netscript 2.0) - Script Arguments - Basic Functions - Advanced Functions - Hacknet Node API - Miscellaneous diff --git a/doc/source/netscript/advancedfunctions/autocomplete.rst b/doc/source/netscript/advancedfunctions/autocomplete.rst deleted file mode 100644 index c8371d43d..000000000 --- a/doc/source/netscript/advancedfunctions/autocomplete.rst +++ /dev/null @@ -1,39 +0,0 @@ -autocomplete() Netscript Function -================================= - -.. warning:: This feature is not officially supported yet and the API might change. It is also only supported in ns2 - -.. js:function:: autocomplete(data, args) - - :RAM cost: 0 GB - :param Object data: general data about the game you might want to autocomplete. - :param string[] args: current arguments. Minus `run script.js` - - data is an object with the following properties:: - - { - servers: list of all servers in the game. - txts: list of all text files on the current server. - scripts: list of all scripts on the current server. - flags: the same flags function as passed with ns. Calling this function adds all the flags as autocomplete arguments - } - - This function is special as it must be declared as a top level function like `main`. - - Example: - - .. code-block:: javascript - - export function autocomplete(data, args) { - return [...data.servers]; // This script autocompletes the list of servers. - return [...data.servers, ...data.scripts]; // Autocomplete servers and scripts - return ["low", "medium", "high"]; // Autocomplete 3 specific strings. - } - - Terminal: - - .. code-block:: bash - - $ run demo.js mega\t - // results in - $ run demo.js megacorp diff --git a/doc/source/netscript/advancedfunctions/inject_html.rst b/doc/source/netscript/advancedfunctions/inject_html.rst deleted file mode 100644 index a098e8be6..000000000 --- a/doc/source/netscript/advancedfunctions/inject_html.rst +++ /dev/null @@ -1,35 +0,0 @@ -Injecting HTML in the game -========================== - -Bitburner uses React and Material-UI to render everything. Modifying the UI is possible but -not officially supported. - -To automatically enter commands in the terminal (only works if looking at the terminal): - -.. code-block:: javascript - - // Acquire a reference to the terminal text field - const terminalInput = document.getElementById("terminal-input"); - - // Set the value to the command you want to run. - terminalInput.value="home;connect n00dles;home;connect n00dles;home;"; - - // Get a reference to the React event handler. - const handler = Object.keys(terminalInput)[1]; - - // Perform an onChange event to set some internal values. - terminalInput[handler].onChange({target:terminalInput}); - - // Simulate an enter press - terminalInput[handler].onKeyDown({key:'Enter',preventDefault:()=>null}); - - -To add lines to the terminal (only works if looking at the terminal): - -.. code-block:: javascript - - // Acquire a reference to the terminal list of lines. - const list = document.getElementById("generic-react-container").querySelector("ul"); - - // Inject some HTML. - list.insertAdjacentHTML('beforeend',`
  • whatever custom html

  • `) diff --git a/doc/source/netscript/autocomplete.png b/doc/source/netscript/autocomplete.png deleted file mode 100644 index 176a325c24e16c553d89d638addaf4927e1975f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61532 zcmb@uWl)?=6E2Lq1r`Y|!Cis}cXxMR+=9D11b3GZ+}%S6vS@G(65QQCk~~S?`p%#8 z<4{G_Zr^uL_gvG{Gt=F(;R{j1wJ8`F)dyn(19S;Gs;`EI1_ob2wA2WWu1aBHQA!5BL*1b6UgFW* zZsP1z9i25Cv^7YTUa$hio+c}#DB``4`{5j^xSsAi#-6{N%2~l zNQKW}4vvn3itvz-#t?B8I(kZAMonPzq@n`i;Pb2k2hMPw$YEJfhD2ax@bHc>wN+sA z5QDG7sRgbuh_xxK&uKr+{3prQ>A!Bhbdd4q z6GmnRCdR*Qzp(QDq;e|&-At`DM1VG?woWfH_};!{=l%8m|MBFX#Q)*c{9jI%|K z<7)}|6jPd?xENYmf0uTt;w1`?+(i}~^;RrN&B+KkNl#JgwCc0+XV+JawR5G-`2jTY z<%K72zbBr=LbW+@Qni!@^L&9-wX1tCs&@JWYBhd5iu7XAOR3Jfejd>- zVxZ5y=5HYE8p&bY9o=<(9)L}7EBk&ZvSQ?RAHebTvfW0>^Xi%85#4H1@nQbUqQ=TN ziikc#L~NH*sYvYUHt9;t_MzSivHE$V^5OdjJ7!AglaMhU_o)<~$k<4?smQW(VCL>> zyMK5=?lJ1wRrCft7Z!w&0GtLK6^JaC*Dsz(EWqkA zg1QN%AZT`-`uRg3z>O--e#M$iSwf9U^`SK&J@oA&0A4uI|I>DL083YTRD+l$?u^J6 zZZh(BEZ@EmNQqbr(GlFJ6G9Vi-Wh38mTT1(^ za$0h}0fZd0}uZ*h@v%F@BFv2Rpo0JP%A6n4{25q+yZx!Qd}OF z9p#?8u0GE0V^rMt$W6u-?jBMFg0Cu1T!Wq-b2}(@P88ILr;}0Jp5FnnTQ_#wqt}t8 zKoBcpCotc;gj+K>E`a2Aq%Xk1fx|*z9R^_pUO_7^OqW7M2KHFzc0ULty>(Q)Z=wT$ zYtZ4c;!)?)br&yjev|Bbim>w~b@EF~XGy1G;)shvz7eZU`C3IvwVq*bIb=<${2?5I zhHf?LbnMH#`DVdqN(`0GT)IeTi5!ye`tT3S72clOqar>-ScEGV5VUb-@Rm|m`F@|k z0%|Epp#b1WqoYvC5yo!!X&hgf+XcBCC}Q5%+ZSuC^t$66mV=e#jiBwfuu!^-IWAaI z?iQ2-@3S(UD5=F$fJnzx(*#y+y9+43gp-G!t%$)$v*23@$(hfZ98^+W-w%aWh)d2W z5F&+0p5ehs4CK3ut1Siv-3c%u4m0mIIXn=O@&Eqh(Pv-buh zPW8WUWuP&KAqCeE!8(K4`kW>p=ulL+b6$V~YRxYa&hu+C$F=KoAKs8gX>h<5#94u4orD?+W112))?49gi76f8(sIx9w;TEojJ< z#u3@`Z5_fhId*It^flwr6P7Xz4xEG-iVo@olY|s12n^0^RJ#);*hfFbx~WarHR!=^ zFQ#FcvYz0{E1N?Dmrb*qr%3}9_Xfk;9)NU#dX8oB4xD4ixBOm#ldtAz1MOohOz9Y25AvhT|0g4OBb%`Ck28tv7=;Z7iJsOl=@T5BwH`sDLrO+cJMJ zygl&n?TW!W2a03IbzpnZIeT~$qkGv8WCl9faDm6JjS9*$1ndw9=-@5DesRmtjRO45 zv&nJ_>I+OkevsgYw1Xs?D8b#t=QwM4p=*1O^0E!YTH0FA7}+Oiz9sn}U#4oBiXa*qsMz5f{gilaNmtDg?gSx`Vn zNEa-AO2|)*({POrB*|VPnF=2SQufae0O{_=^!l?bQ*Ybm#8pLbh!4k6Zjo2LjA>xJ z9~E8TS>v#%rwG^#lJ#$wK(fXP!Gsg}%lLx)ehqyUd{}UQm0hf}?KpaOfK&Q?iQBkR z93u8l*>iAVy+*<$JVM>Ea0Y6l^FH5*b|Zdq4M2S+-`v0>1|fp~LgR&~i@`Kr%Rnja zq8qu12Js}dCgFRSdLjMdh+f{{B{5hV(XIHgCg~lo{+skmz8)np14$KG5<>7VZGO5f zI}Eho{zZ`@zCR5Mb?-xo7@l$~l`8z@JYfe{)M%Gg*~9p$=PwcMasmLX|9?|VrY6Pi zZE~gZe>u@0^vH>^u&UM*hkhgQ!tTF9OpG9Hr;x<`PmL<{7d6T_i&*}uk<0M{$0VLg zk=$QWciB(PXyi&|{1D>F6b#7#uRuD2(o#&94;Tl$pihpJV zQcC)X=C2Nnufp9F^`ZkT@}n-^^w&1m*LE={Jt6#sSC3*Xg(0tAMOL#kf1wp7CB>Qz z=c|SNGdeHmxYm%11nN(3E~vq;#qas{)CBxKh!vx#Rvdzc_Uos)SSiOJ+?9Di1^l}} zA8*b1UnBerIWO_FnpDaJgh^<~ul6 zV-zLq(FoqTBJ}r*%@^&X<`?wtew|OCq9Kjq1yxmvU;RVznRHEEuxU{8)Wj%7!P^@n zDR~igQA{*g(ZT`^l*tzoA^pi>vC1^?yec@t5Aj-hu|MXT+so6GWG7-SeW=U`{Nb4-2%8-AB6fs$>*|IGeASp z&L5itTn-0|?m{TuuS`9-Bn|ohg?o(y>Osu#bvlml6oq-MXTT0co>Ug*GRn@k5hQBD^g!rv~u8tbTsf0TK4IQg!!lNSQIT%k` z4F7KX(~)^obiP1qV`H{Z|2A^uVN7vt z5NW)DZnyYVU{O5Pzpg@qPql38eB@SAR+iQGJr~V!rEyY; zuw><^3Tt&7ZdOve$g2GKse!;FeN|1t<&X8kfp?J_Ai%*X5FntS?4HL2hd@zdqu`DX zQC~DaTDw34A6-kTOKz7-mCyd!MTdNM$y7RJG*Rig368zrDs-d4+aZ_pJ)nf1@a??U|K>FK_sef&2-1WsP?DEV^#{VP9zIX*^j7-2ke{~n*HwH-l9JJZl zCIyuIr|K+}S8?@)mF1-SUpJF05C7tMN}7w9|B-lp%0PKbP4*Y@mx-^aaR+E(qxeg5 z4)rVL2`-F6+kyALnX`xphc8*n75G$HS^{}1`mS`epw@y1XhHXuja^Y!7m|SHQ!cwx zhWL94v)^)dJb(JKcjto3>-B?aY;4S5zU0=I50xQEzxbAgg%K0>3>%vrSEKws;7v7@ zwvx9P2EArYzp0P5*!-`>3l2O7or#>XL_tunQ=W$;8Wjb?zZfi|w${{>9WzBu;l+wu z-KdyflPQ1maR8DZ&Zn5e_FFKGAM_0*`13a%jua1l(ptO?J5j*p;7&3!CjDx`_VL23 zvZ=W+{%RYbBx{pJZ>KgYI5fy3@|VX;LF^?SJ4riFZ3+C=QH& zk=+N*RuVkT@(^9Z1sYF|b4G;6tO+v3!%F6V`oz7Eqy3d3>Z)f*it*GrAd=)8x9o>iwpq_49r6Oh7lR?$3;z}F%^x1WiCFl zbVR}3o!CNK*JF0i2?Tj*du@o6R2elhNkmezfwub}Y@Xlb>Ih90kLEsV-hV9Bi-NNw(wQ)GRD!c}fExDOFep1tIB26VsPkcKY92Ltm+&E5 zX3=%aISrM8;%nYIf@xCeRx<$ZXyaqOiBECHbWPoJy_29n_^6z8`fp>rc?GVGB<&?+ z)a8T>O5^em2n^gQA;)VE00b^QkQGxk39a;?FJ!!r!_A-aBXC0R*HRU8MuTNiwl{szA!k^ z09;&|YQpY412&wbdongQkrp1BIjvl5*ZokQH^jt#RW)ho8wI7MrNKi(Wtp;+AysRoGEx5K#K@{>5O~Zj~ zpWh4cmOk4zz6q`&4QhP54;x@WM%wEJ6T3ChO_#k@)>PW+c}E1ZRSD%yO;eg%NK(TV zPyeRviqKy34b%A5P5hvV$<~*a-tAh5eRwk3pq2Pi3~_2x$JrI$n8DX#6lzawrJpJb zruSW36u|Pnjbt*9GE}LVJr;M+%!u-E$ery#lsXajjR(Zn7_B$a`0AA!<|QmASd4z zc-1w?@xf>9NbWIpJu>x`gqKcYZS}zzS0No#7^R}xn+l9~H&Gj{Bp_@5J(;VcCMf@s zXq?`NFe_K&Vsfj1Ty2dI-d7-xK&z|9C=k9J$SWuJVZFsqfLU?^q%gUV$!nOXq?S8= z@Wa5Es#U@7G;`;;B3YmBm-i0*;O8MqUqxlEE_|QT#UBtBfneMufi{p5^?ja5wcbX( zu_EI}iD(QG%SeV;QSp_^mZ81%B$~9QjSB)G)!m6=kq$N0KVLQ!xmJtFnqZAU!(hgC zsVKg>Qeyw+Lt;F>e42HGW?fHwOoDdPu{m^6_A>UN&j)W_fj%Y3eqwU2o+4FnwYd06 znuTijD$pZ%6KwgLbmx*M&|>Ykay%#;VZnLO47iT4fSJJEe#xreD=Yj|F_GPf>TuC_9Oy!YuYh70-P17uqpkx#c0)}?SH$fy>`c*YPNq5W zS;ZVmgQsHa$!hHJVVKkGD?=Lx#c7iI7G7N=UCA%{he#VO!hl|wrJq{ z8H^awUkh7cnjd_m8NJ>^!YV7(dhSq8vUUE%YicP6P71?_iZR3=vZ}1YXl^Z$uqSsg zV}YR!ujv*RPi~lZr8KE|RlXpIWGf+1)SyEY4W=Dza~O53A-_gIG}6DwS1&}%$fxEH z!}RYBXigqAp>6ZQ$L5|w9a%2z%IiT-jgY6J!|f7lWEYevcA1qn_jYnYiNFESj4TNv zp)?1BTRqnxxSL?{qY&>4wBPO>22zA`X8X-XA1_ zd4EUGRzr@&q2sDU#Vetcs<58csP&2*z9I9z9lc_Plq5=kQpW>e4csqw*RZD>G{*a2 zr7Kx#>*_SCN&IIyL4Lrkh@x-f3ag9^*mc}!Wi>e)(rf3a@QpHd{ls-1%P4J(p7M+m zPW=|FMd<7F5npBq=4pO_*(SWxbY}}T24uoRm|q4EOUnk#K@_$Sq0L2VyryEs`Ai^+ zNcvu8fLTZIO4*y|$DZ7yjZJccf>uS&;XraK+UHPbb<2I+q~5?(934CuYmEpuGp7=W ze#9AcDq@@+)J;qt5URA;N)PEu{ftC^PSgp&fp0 zE&9ODy^ zW5{B`_sZw+8CWgErhogB|-O$GTn+cnz(KeUTy3@hQ!SVJ8`=|2raJ~$P zewx=#pO(;v)sg%PIbZ)iCmr|D5-YYdljlBt-D=n>&|13Yu)9BnnPvWmPhb)vvtk&q zhl^^M^ymK8zeg_jzVV5VA{19@p); zCEO#II{#$}w~WvU$Vx;BH;w9aq4E|3Hqk!KECt7lQ&^9F$f*#LRNcbq)2aAqc5;|) zCILaiU71!~8BZ-=bDQf6d@Rf1VaD%i{KC_8xUPGBQPfn?VW$Gtv6K+A3B^%Cp`l#f zg!x=E@Byk$4FW*pt6Sr^7m zXGK?R6;chcf*Ml;cGn}swG6Gc2vY(C?f6r>b)Ax0$QzL<1s|s?6*M?Rc!b)|aosYg zw1~yUpWZ9XK?F7#sOKa5EVv`Fr?Y9#qK9w1)gs2he;XN@Oc~>wSXDB)czIp#OKytA zA(;!y%p67(@N(ceQarD2?lzi9vtYG9Q3iV=R*1@*vstdu@1Mz)@8ebZ_VAs%5cL<# zE5ze=bacOu4fDI)EHb13#5&a%DLUI2^qm?B|Ue+R^$0xLPG-8bkRgBEO zJA4fUpB}}jT{K!Tjn|lJBz6*Zv#V2ly|^&&2BLi!Jr{cBJ)>deijkG4D%Zt7)D}@m zDeRXbiVci9a6!FWbH!L-iv*%WHI+w%WOMh`zyj6hQ^+WVcIFP9x^Y1Vtp9e~G3wJs z^bn9dojrFvxi6GD;QIo|{odyJk8G3&M zd%XeLS<6a_!aQUsSED>8DtZgV08J8D_hqzlr84Bby`VndtSn(Q`Tbd#y({?&!Lt6I ztM3GeLG0eRvnZmn{2P+{fqWX8`^Y*L8(->a%(QU%wB3go0q7$LLRlWPn0t!@k!OZt zX{`R3FjiFpdw8uVW-e->b!>;+OIa3BWjI*Rea^QgohY*PPbtYfzAN=!XVgEBF*tNk zNUzg?E3cz@-z2BTjm*Gp2Zo2Ly3_MOn8&7ZfNGx*P~)}TK5#s0;l?2MTsrjz^r@b? z@>gujvx+(%AebTbkQRU%9q2;I_iBz1ixK<0r#10nOqaQi4)2zC1Iu{DL0Q(?J1F1{ zp{aF^wH0M7M}@-Ry(7$2Yslq(2K`1EXSroyQsBuC1J}ff7Ftb8Deccd|&*`qh00#84Nb)pA_~Lv!V(%1Ga-{r_X+Ny_QA|Doyo(T{D(`M3Y+$iCA((JSBr|NjT=>%XmL`*w~+lC z#O!JuR4E~BPKD!}bDEnp=V84o%X6#TuF?r+&K%w&{|-&yM7^8}9h&!XzN(ea%kAQq zvAkhclVzP=SFA6$-1XM zIY(^I0d=0iCi6wGypR`!oszrrGl(&hC@n)p?e$&X)4{%~}X8Q>jatYh3)sxmgP zng4)F=ePT`*x;T{gb53U12oxFnEtX-&fByYAN3EEYq&W;a>y5t<7sX`ODWmcLNJY+ zDyp-kHekBxI)6eN{yxG2)N~*aNJUTYXf_K49z{v8%ArP);r=xNrkwa_wus^@!%d)% zc~WmMo8>0cd&}z;FLTW|vVURSfrKbdPR7z|JV@cQ_+&0CA{tzpJDWB&px_{hX|tGQ zQ^ph*XfzNjSF~BknS_OjDJTn)CETj|R9ZJ(a`=X_KOtOK=<-rlMT?=Q5f}URk2Q?X zLLsH-dDOUr7F417ix|n7NzyQ5A!5^!*1OkU_MdEC8Ueaob@Sy*?4c2~7PHwppX@A@ zw%@%39TTHz*`B`w0r)2QFFWdwYYJ&k^}n6_FT3=X=uS*em+K2bE{Wy$$ype&@t&*S zmVH~ZZ@D;Xy^y0Uz-k_4+!SkSrfijwrdG8mIE|u)E`Pr7$@YdsjG9&!RH34=xq8In z-DRr(9}e9DZw!J=`%PFBm1@b=`c@fPcHkajuwrJ|O{MzLrZ$dTZ&8C4bgbU%zmNj*TI?+kPd5r)|q_ z10rR8{+&ShCGRD~3n0X*)Z$2c@ciD~JSQO~8B=l=fxFOZ%s)NNp=2afuS9dTjiuyc zNUg0o34|+2Qva+ZELnR#G4&^^B4hxD!6YiCRSdsPba5;? zfe< zB5gHOX*MhMjF(wAj|o6STVt=UJPUmZ9;Tqvj0{mbx9JW3i%niIfKSzKNqaN}>yTZqU0Bb4%faF&?GNk_|lrLKKV{)9Y^MGqdcNHI5HTHhx!7$%WTa3i;-*+sc>zGO;4>T?*dLel^g_XU?h>CA{zD1O_8T*U$4mhrdE7w!3RyBK!0C8R zY!T`XY1?%jDf$f3{fs5TdHm+U(SXA8Ir*fG?L6P2-kK!O0uTNU+yQet2Uc8VdrsBN+$Q9~lgqJ{y)L+5cO?+X5OzOTl-2jeel38pGZPgnO zpycTMm}55H4I|sWlq3=o7TQ^=8!h<&ETE#`4(YtPa>~)EV_SH^rFZiAI8R3q6%GeN z2Egad4qa6EftfRP#KuPDuE*-#$BC}UkSKiFJd9$+zU)JlF3${K*BRK3$jHc&1bMz- zDQW55{i?2mB*LZ3Sx;(i?(~@|?M2$lHf5lM1XY&PmAms&4dpm_ir$*s2iq-pWW)kj z{aZf>$i>j~Oh_&jHII_gRZd-GjKI zMy4O`I}f%j_b>A*`ueN12*VGz15~C(`T3dbHY=Nju-*yvz;m%rAIlZ6VsFLAO7yXw zCuxy$oR=h}G?_C%7vmV$Q^^$>rLDyw4DYrh^nmg-1anYPf`UB&01jt$)g)@w5$-va zN1F|bEXTl|;W3PO3OZwl9yKk_#W24|G|J;XAI-z|yT|o)$OI*--7!?f$qLl#$R{aE zdZ^0Iy(Y`;j_cJ^u6R^FH~Gu&du3Jo4V_VhNu_(ETye6)YIFsk_ACR=NJ*hug>#qX zX0s-h#NaNBAxP3TRF8-GeX@qII+kOrK0j8bw4alzdY$q$d{b@Hw?Ny{X|g3)c0PYr z6c!Ggt@0SnYyn_ni-SP)7q{j)?j1hzv=7b`l+OKI>ZN>ncC_l1C-o5w=NrK|N_}dW zuSmv~A$$s|Ki7Ji6mn&vQ>8j0y-$>V`%S{eWi~}7&*Tkcl7eukQ;!#gztGo_XB4Fl z8tl)&@XQ&33Kcn7wt!_Od*A4=JSt+< zmaX+MY7u_ZWk4A~o+eC{QDw@}1RcJ~s@N`AKlY|`1#px?v13j!JB0yHh7tXvb7LW+ zWws?mYxl4ix&xY|c1c(+2DC z7A>$xLePs4ou&5-2nT0z%p+Ids6f^Q+JnAKUk}|$xPd?R3dsEci%aF)LpGqG{T{k4 zwozHxFk6>^b7%0<<>LrRj{(#8T#a#QUZ;PQ7#S$TmCa_gCVHk)S9lk=>-r4SxBA8#uh#_B&FKY;dy;_*zhbjkuKsxc0T>t1Yz9ekS{PGfQpPP zVQ>G2hlVmEK0bbj>ImCp`cqP(C-E#p*VEdP)2Mpr{%lndd)>JYv9MRV|9DcoH7j&5 zF4g;1e^PX0mFA9U1lRp%(#r;n{$d;|VCIM34P+I4VDaQ*rZ4KYt0I*5T(uzqDE)25 zc+-l4Mm^!Wr=|$pMWWvrCKeTD7l-+z-Mpv~hEHRj^FvQ_5BuE4QbXo8#5vsEkb*=L zF8jhG{E}U^Ocy)lR7psnbBSTyCrh?6=;NA2Q^+#f;1DtH`AidFz&_)5@Jp!;OH5%S z$@&MPKF9-Momu7|pRY_tyG9g*TB zXEi6>#T;9>e=$4Qa>OiOe=l?!X-G@Y;*5{8KzrbIOmU7A&^9PnK6~%E;jti>5+%KA3ej3PFzB+j@s`MZ}B&9Wh(cn%)Ij!R%azi+5JMAp!fgRU=|IhClw z);8axHC1s2G9EWo49uwgC$8Y9(d!<$<`Jo*sp(d}`7GBB;;ongYJ0bI-O(W0CllB9 z?SR|Hjl{NWrQ67C?=Tu{Un^`jvIcVf6{GLJ0&VIaZ`$_VG%SV^~_6^o3<_xd7e%>7~BDk~~Fx$mLOU zMW@8|+r7{(?r18R&clH&z%WB<1ME~*_#Dox_+zgqg(kf{_KM;F%AqY)ajkSfe5NPMk#zXr8(>n zcZa~*ahDOZs;SlJeSbw0EV`eOd{iM1>Ro?Xhq8NQyPv9hVCe{dfTKl-Aa^x9C&0d^ zLKm;IS+gdr=CkDqh+%oMP(~+YJt*ws`T=>Ha@ux105gm|2F%1BLP*SnMPB65>343# z6KHb}!GzU7mMbzTiff-@Pl@?)cbS~&+aO!eH_s3Uy47Pgp)J}$aKa@3%H?irP`8XX z_ZF!duwNglNagF|i`@t2g{fw+r;lyrSEykY5>#vXj&AeG=izvyR2d>_}Xy* za5irEedj5^=$69lvti67`Sg5zewl5cGcuFxLfg;g6s2U}{j4e+Q|r-v=k#W=?29J7 zjMl2p`V-_=>j-r<67P2kEDR>5=x5;XRhkLe<&`2foI>b+;7ONcgqC{R zj7BWm{HUP;l3a)PLC(XN<{RI%aL!oUQIDrMnRj_j-~kdX6?gLGxy6x(6d2Oa>gfA* z+x^>=oA~7CqFPLBZHhh}V=Ed6p$E%lR4m|nJZ2?&4m8}A1Gt>BBg6%bq!q!Z%Wo8^ zq4N?@3dT>BshQa2sOfAP8dOf_7e84W7@-G`8TJQZCPs{{HcZ1p4=Lh0T`Nz!MyfdC z!0zoOQ4O?HG*ThA-RID>Btf2*C40#hr$R;O*dqkXW{D1REQ{azcJo(h7;&;)WuRmj7bnli)SB-KuiD~u_JG}S><Or^^OW^Lyn-tuF_~RqP|&7U~Uu{q{Y{P z3YGfUXS9lV=Gl*lm_Z>XRko(mQE5W?NNkRcikfEiUZZ^1N6QuQ4V_%WQwjABX~|t1 zLqkK^DrBa?exz&4!KNXqw*vBVtPDk@><_}71wvaxes7^?AgE~2nq8h^D;V_a2}DtA zO(6n3X=8I^wN^h@nIj6(qqdK3GW4-$1e_z!K8Ls`E8)ob8=0tjp%_cUCt`jz{i4b) zx~tuo>9xw9Ls8prhC)j`JkPQwvo?A+7bk!1pl#nTpl3o3e}wgwozSi6HO;pt6*c4H z>e>@l9(gR`S10kjL*;8qQ*Bx+#X27Iyvo$Ll(n_jEVRh!IwC+z?1;~_trw!@<Jm zM5xW5R@gQt$*m>1(lAAIGAK4~JtpV9Ax(i4|) z8q?pP%Gpe}TthDFMFxJ5F>qvHmS%^oNTIub3kRTKh-2z^$TwunUKVPVn4({;ousv@JF0O*Tl*VP5NKG}=U3BKwBb>?Gv{Hu;_hdSmw zk=V~N&puy_(t4bCp5I;PD`ghTWr$hLlsD3*cSoQl(tOQ+heh7Q5SS1c!OPm=87O+H zdB-xLYF9nXv?O5s1Gc(%^64GNIqC4~Zg!6LZfMEklzL~6t*V+1cfzu#OX<`O9!_#{ zvUBosffM47=LpgYsfF~*GF}?mv|vA02r=_;?<5y=ZEoUK9F$Z0nc{TsqyD#e&s`BS9Vo~4s47MHK# z7ZVughKvL>6l1s#RSy@J6XS(s3#*BiCm8AR1Oq42YmLIG;mz7anA+;4RPlt}^cl6< z<+&G`(Ao;Hsb0sNy`nXV8`c0$Y=;ITp5bbX)L*FvT=F-cUNE!SPYEh zH3a%wU_oSxM@3R7yqTPuqGo3g`BX-qJW`mKY_2*ywLEs*`TRu<;J_lQwm(yCNZsgc zL&?gje3&b(mQ;_D=d>LkFQzGlq;HDr#C33z~x=i7WxXb7H@&e5fi?Y-pI) zT86o(tt37N|M`JR3aBw7DfV(|g{aCkb`pID?@<#jT4IkuQ(Cke zo-5c043iesp2?J5`TJ;1Ys_zS@P%oC*(9%C zC4;#i^od?9T2+y0yv>w!3)=D=nCEhx%5^(f0@gfOn!b41InyMWSNMg8RM5~^w4`*e z^Sqv4kxeC;RMbC@(wGIB-O=UeGTmcGMn`H&W2Pp3oLSrxex%(2V8cZCsgAR|7P8dv@~fg{ zd7x{4+WDNX{#>n*SX|YXPYmY7I&X6Az9lj(QECTUj4I@3=roO%aYR7PFmf5!i3=Oa z4D3<1G*y!22>nHzAuKGjHXV)DYkRTsVaS7co=7sy?kBi1Or%3hd#lmHjd%7w10h<= z=38<{{&gOYZz~#>^aShnOY*#7BEpRoiEZ9iRs_13dY*Rs%{uMNq+yl46Fx}ZUyO@`&4Ns7RY10^6jA4ZJ>J2-4@=^Onl_gq;l0T-ElT+Qi>Nl|jN_n*- zvIOe!3N@bLZ(l1p#r;{Jd#oA62SK0)a>L|_nF?*|fl8M>eBQE!25z6{O*>%0@$-bt zc_nixXG-Czm=vzO^9?k3{r3VjtxK`C-t9RxGqW~T(N*yQuOmWi0ARddU01-L0z=pS zNYr`oHf7?2Q%wGp{JTKDN23pI(-M3nYl(hJ8Z0bg=PDf&7k#m-m%9;7_wz%{BluEX z)%UP=7e`VwwA`^fW^qd(R>c`d-eEp$1`->zZ?igl~L5qh}7(QmC!-oY8Dq;Wjr@hx)w6^c9+1J8>(! zanWm>CGK^Fa=E9LzWk8!9h(kMH3YPyHL4lKE_wIe%#zZ5*u_nLfNdhq^QBWyPe(7%VX_;A$oSP%{%}#zNs7q zz%|Z&y$v;9EU#6XS6na|dM6%BSdcEbIxcP}$qLKTbvi1<{g}u~%|aSqESt@M5ZSbb zvhMM%3=E>8wyy35b*Le!fCJ~SMoX2#sk^uhz1PZ#cZyxu)Ys1(iX;{5jBV@)-gOJ5f!S={91CxQXECORJ>`k|9 zvO zragYv{OSg3us{rroYJvjNROet>r%VjM?(UMQqINz%X}5vnD5qdxc<-lE(a$VKAlQ16Tv!t(sLZ@84 zgQF!*=A@}OO4ZMj5|kvUYAKq#TdKV$S&~F6S6i7HOHbl2C7meAtilSO8X9=I^BTrw zws!cW*(4-=)i$P87Qh8O1GIHM-X;ByVQ|FQCxRK?hICq9=}>)@LAw{y_K!E(z$49xA+S|26=TLe2jHu!S;b1 z_YWMOGs>BWthAdP9=&^n{lSufi4VoF z;nPjv0&)IQsMLQp!;_XD<-vY_abWFKAzO1V!+|)g$#YcPgpygLY`-nVZ z0>q*U6&V@wJ<4r|r^1CBAPifpH)!fK+AGrN3H%4isBW*sRmW|msjI#W_hh=G zE}87(CYC35@fq^Ws0|@!@P&qG&uaG!29zBA$X%tOala;y;C_-}IlGL0IKEdIsLPN! z{RD_W>f}sKNVO5hX%AxRKDoR<*asIXc!+zZanq6%%VY*rhKYdE-<~_l9NC z$i1JNR-;Z7Lo8TJGU+#G@eU=kAT#`Gs|^&ck{+h2 zGi<-BD&_@c_8<(<^M>gUvdZO_8@$v7?H|M&T5q{!Vy6Y_*a>{K@g$~)Y2iP+qeCkn z%WsMyM!w`7i+BZi6}gTsXvL)gu&OZNZqR$`RW8dw*Joaz?198^siA2n*1&%E}sMOr%~d z1aYMieI*P&g>a*26n7c&dg|n-0hq_ z;BzJZxI&QVG`#gqN$F!bj>i5QubBxc%^o2~+2C8bvcaxnvCFdIFrFR{76lq1O1Zk> zvdhWLa3Bw;KZv|IF%8_YzN<2#fwsqC&r*$n*R>SL-C!0&0v-n7A_R zrGgt=Sj;Rva-fBB+NFxlZ1*HRm*y+R5%Pe6yu4M`*DDA*P!;`l%xbaZhG10~>{Vqk z(FP?XQ*fHT(zoMT3uemfs~+rIW@O$p^TnWQ(x7SEwmlvldW|yjWDY8}8-iSfETNq} z+-&wS1uW9Xe6Pwg7mjxU^nA^z(d8;V(INei-Xt14 z1RpX4xV|abI$*n(`N;42J7Ta{vNfCl4k+~KXP45@e@OOw$8k_lg!qP9WTx{)fvL;p z?FJU}*z|r5yt+U37V`I}XuV6P-5Jjl&idhc{idAyhCVOsrS^*t&f>hI z;IZ33oA`dK{d{aQ$(Np4vGS}f!RJ&oWvUlduVFZSgkSvRtgfn*4eHWp=-iX2OZdD0 zhX+=es>Q7&NRn|(@Gd3yJQ3$23Fr5MSy=-rKeFU}qz5!#Bb{mT&RvTu^1FTA%Wi|P zf;W=@))g*Mhu)Cd++AFUTyYY+4td1GDvvC8m}h_62kMn)D7Cp)l=SnCuFh!KHLYb1 zV7k?S%>?g8T3s2X*r*yhus`7Bb-@DygYDX-28ev~?=->fsOhS!6Kka5GI#=V*f`@{ z{nQ^Gzt9dvl(92|Zog9!<%s)iOKf=BXd1s98{CImOK9cd=r9&y_Z)%hns$Hxb2OVAL z^b}sNOo8TKf;7ml2|m@f?U3SAMcMWL$)lpCchoQhV=T%{He$k*UdlTwA($s3nV?Ob ziG4!9Vv`%+Q7IghADTwZR~OxD1p206ni~O`=}WZDfhrc^2>O$U<)$R=BLBvf!!VX@ zuU|J*cX|kx?xI+x`_$ebruCE)6Slp&BqU7PFu&C=NJh&LX^V6a#{mC_8-@qmSjYOn zzv?B!S6SBc3Asg@0!9!J&MC2`oboE zG%D^sxy+7#W~DG@XJKAyIs}RkHOiq4D=1=RTt`)s8pJ>WB;a3qF?2 z`piv1mLa=z(9GK?Dxr<#r?jF=cYXx0zJ|Oom*}sZEBX52@1TG|SgIhKn3}G%7X(S5 z!fjU6&GHR7(IutL4dtgSuWA9(WL02Zeh}mLZvmvLux6ciQE*=|g4lLPunsSu{Xy5ihtqUi2{bi5U_Srlg*t=`v zd^ZJRyIjJOCb|7n6XJ(fO=e(eZCyA%t`HFxRnJ2L+aXTu=?-QXDZ!+?@Twy5mX;OT z>0xM2dBI|P*37cJM%@Vs1~Qt6zh@?|ww8s4j;@+uIOe|&`uodu128d*Dw!!MJ#+QT zR(17}2kNZvzlrd4ZW1q>XHfYWySyrFyXWz|R&sV`TlN{~XnZm^H=lUtx@yalOz7g3<%3qodyr` zt?lhw$rKnDj^gaqFGo3Q4M$SsRg35&+08dm>_%0nZ&h%pJcB#ln;J~TmHoNgv_=R% zWuC*BFB-|`!q~LwDBHbaA!N4i;eaw|Irx;=Hv&krp07vPmqxDN1kMlq^&B-DHM^Ls1_odBnv=+n#*1j&m0D`86aGsUc{JeNfI1JR3h z-~23r;}d2?{^z!iewL@{D#ic1Kzj1}<(idOh#v00>tjpgFCMn7@XbGG@p8}hrSJ@? zgY8cphyYx(bhr6by70E1FlFna^yu}>VwGo{=ZUGT94_+>gI1-+Z{63l`iD?!n#NH4q>KcY?dSySux)yBzF4dGfsP_l@q+ zqi=fj1sCkW-mF!7t*TjbuBv@&vjtPpJU28l-Zow4705rsWAx0(gW`hi@cMTzZoWez zTdthDQ1+4Ua?t#*6E2V8pqaFjGM@d%lBnP|f9h(jRet@i({Wf}nf;ZU*_m#S#GvEt z@_poew>Q5s&1MoJ+YL$n*R4KMod@tEz4jQ^W^z2|-#lK=)Q-*`HmdW6{9comk*th-k?0s0NA;=aSyMUvliUTFl<*Pq=RptnZO_X!=C@%aE?65c z(G7)-t-}nm$S;{fhE|w)NYc4y&&UcoBC+qTjVK;mpBYk=Vlm84GPEtsEY1V5^Wfy+ z1|3hRncv54L3M&zXgxEaGcIf#>`J;mMEvj9j<=72@`~!}Nxm4d>rJwo%`?&2i&W3g zPra#n&)Npu4*guiUq627C|wighU&A?o6sM3dyX%d`nmWOxYon?j1UZdjfgvrK~qoL-oz&TD&#ljM1co+$XKz^faO|HVXc`;#KjdzQri!I<;VPjD= zG<>A!cT?U%YCEu0Pf_MuVOhGo?~;(G1M+gztMveJrk1bKY$nhMxIH3I&F!8v@vND<%lTXUxWQu-gMyvN)q%JAW!_QDROWZ#T z9LiCm;$uq!e-h*T)G4%5jeK9!Jw3729Hl61J2dRMj< z6>)n$5rNd-YF6ta_^zh~`Pdh06+dP_YuY`E4ig9j0dBNTqe~hT#hlA#81l#|m4+v| zmNWH4p;j|@d)1pCcgd(&*n--%+rI;BtF&tpP~t_^VY--$M2^DDjjZp^dF{fG;{l6N z#-S>!QVw32SaAUA_U_({&V!E9Jl3cT@c}}C-z)GD?fp#{5>q9mag7ca1OnVM`K2%S zB%TkebOMxyBz|tR?lv&%Gx~U(HsEKgM{m=OZNXWst*d~$v?WLLrSS8%vPGI0LLdY! znd;b`)5Ly5VSAmC!Y9n6Gc0bWzCxp;{;Gnho)rPRqfaa!Bb_cwe6RJ1SN*Mwbs*>) z-KI4r1X8^5U&sDD_YPN7J?bxBOce3=gPBS(hudL6D80x$>E!R%NySS8O zEqurcDoT>UC!g%8j)m*Yf8R2#+xF_ zD;;UwyZ*qRigRoUupvMs#*j+m%g8J7EQ<%8 zaSu%0GLs!%ybx$ROrwSKpDS{=^q>2_8R2n!9^WzTUYR&s8W_*lc;RRLq2r3$i{#y6 zf$#nJN^{0CdyrQ!o?~S4qd@;ntI#kclYULKfQUKRN4I0fe4Q*`J#N%={oTL5W~8pg zq3gS&`T8s~W*>u_`Y~Rr7IjNj&{~n+BGl0P-Z88B<4;_Vw^+SHi~6*F(I6!R-wvPZ zZ-Fxx3+ML*4Z|M`kMN3O=%ShfX&R z8aUY;^M%754`P^eh4ST)h7>Pit0h{%Gtn65rN9(a0IUmqy)VgLTkWHPJz@J@rgIUl zMVx|adux(<9hW|NcKV;5lVB)nWBPoZ{9pF&?%Nh77h|XyO8mFMjPq)XquR9^VgYA^ zfc)#;q_3*`P{`pyN`YnhU51j&-dTeQA-B;!x);@NT^@#?X^DQWiX`B&N+2_%8L$PE zX(GwW2EpcGn8;-*YC}sQVn#X2CmGR#b9ToURNh5oCJv`~SeRSq>^4$)oXX=UL2C7W zisW0#udWxiPHFy4xKlIkabXpIJ>Ew-3Sj<(`|Zk@pPVdsT%AceGnlC3iWFcLs^qAJ zPe?^m@F}W`E8`hh5OLb^eE$5}#FjvBJ62YfRv|+zth`jbn2f2W9v3%SyE|U(?2Zia zsr-rSJTX6u3tO{+OqyJFzmZfOqm3k1yr7z$HReKs_KcA(k7ggS@5t4ZP-I{teY%Wd zwP``KPXU~ii(!8vF{4yl>uyX|${>8t)bi^WnT8BFTY(1s4-IEQtcDpcUJK15PJtHaG3y1>n9F!j%($4qZ1r(((5ew$O zeP!fxCu(axG<`L1c&OliR%buV>O@=MmrCX8L~}Uk*vN~t<;yCitXT6#8haY^rdhiZ zY@KSod(~{-_s6j+xZICy&>hs$V^GGwH|==Jf^YWDH1+;ENgvjju=|MX%<`aLH6rsk z{k*fGm!nm|B}0W)RHOdss+5apf*A$(=Y{7M#%n3@61)8#WLzsuXsS#NLz};+VTaVHb_PBp^W@f&RfX=Lm;OA-rp@R4Ly|at<=SddVsT_PI)@+?={F7j1s7)2i>3YK^iho+0nU?cRiTkR*e2C5l z;d<|yzFxiL3xMT*5358#_G4=P_(WaGftuBb(l9(a^Q9R!X8h2QZ>SXgdFkhpmQG3R zhFEML1A8bEhW_}~yN!qVJ+y<^ZPKI9J|(`u`H@4K42M<1A$mH+Vfds-IehW3;4TFC z&oTp3Yt1d56^T~MM#_Lm?6~D~8iREYn<*6a^G`bx^%MEQEoc)V6l9A?@U(0hSoDOJ zH*_njM4W|ta{>!?ryKj;PZlGLr%SajeSCF9@En--FFIoxEGglOYw(iQ?M`NA+c%z3 z2(#O{0NV!jGd9awfy|DxRCojwr7vGdTl7y02A{HX9@d{eKtVw%N}4mTy-w=X3VL=N z_ZuJR9z~oZ7IM(0SR9SL3M#t~%fKVS=At+zdU|;e+-Pld*fxhLg>rF<4TvvSG;K>l zP=8P0eERk_t@nPsCKo{}4!%En>@k89CNPum3N_ok?}K)M?#F`O&xrQjO0vWdA(++N zrmFOP%1Q@DR7(`;0YY#4CmI1Un1AxSxNb|YVt2p_7UF=T4q?ScywOO204X$?pHVs6 zRH+s0===y6pnDTuvZ@&n(yz6R;jn~Mlt`+3IB5@G_2w1e>`}!bbU5MO9G!LH{nSST zJ*bLGA6Mqd#bHK;BI;NW1xP5Na;c$D5)juAL9PVf{@#ghw@_!Qn1ay&MF*E5<$7_K zzjpR8HN!!8<9X5~21>YBhp&hvrrbMt(sV>v7mHOTBNnskei>!4eKc?`z)V;g;3eeR z1?s-kde9o&gwW}q?Cnt!7OnC|-H8P`zpQ8)rT_42<(@y_PYP^%)sX>J9~DQd3ymkD zqoMtd!@AuHR(m&926!zM_%FI3Otf2UIji$wJ&p*vKRyiqh{la=-IiMZ6<^`?+L6MX zfc0G;xf$`cR#WSZ37|sa`B>(PGmyZAQM z277bg-^>ztXsmL{M_O$&>z)5f1#rVFFOH!`MO;PS4G?c$K#^3dFCfo7+a zHz4_E-Cs^v))#$rNVNL_zg@S<@d5!8!l>V{M8?RdRj51Q#E(-4f#HO5J1xF%nffi3d~8$&Y`!hznk|{)6)?R8t<<8_JpqIY}8p7!AM~J z$==!i+>5%+<)Q8v1)Mb?B-4ScODuQj-j!GpKEh>nsi3P5Ukhm=Le*YSqgk%On^YF_7?JBQ`6;46@IO(Xr`D(D9qK($81B|eMZC~ItY`r!Dy zEyQ?~(EcF#a^A7z4yH=g_5Hy6j?j&bmS*8HJ7i}j7Vc!bv(DjXpcTn-O;)_L2~H$! z*EJGZnLSe&^HKTp$?48MRURY)uVH^WMPgL|`($rYhJcigvZ7*(;P?X05d!_(!on*4 z*}Haa`gw{IL*$RI4jSG(6Uac?gQu7qj#Ql%mHcn{g*>`1Rz>O60Y};8+M+;lt; zrFl2-SMJjTO_<1>rQWrb>^9~C4TvwEEp2bw@7O0Q(gPbo*S9J2n(=Y&%KeM0qMC%T z>N1t%`_t2xOPvDlgNshj!s_H6mm9hzw1;j{caxCTQ4RAgGdyB$E$oL*;)*yTO= zb+rCp&<48JaIM;!LMF5}N)=>zXry7mGkRv!2=};7NNqe(mbKg~Y3NJAEgZLo#dH*~ zj-3;Vq4<=GSp5SalY4983G#R!maCA}2F?XA{<>f$wywq7h;W>$(Qs*fHR{iynaq3; zNt!5Xgpd;<`H01kq3`1wOtIyg8jg$oRV*7iaJ!}-12mjcHk+JPTI(Ejyfa)zw{AN+ zbj70A+^XOS`UN<8>DKLrhAiIqrR9%`Q*^l}Ml5mNfu{J@>(y0icy2}aF$?WkuIDX)viR$hr_iZ`4s~$ry8Lk- zmxPqDsWpwSn*5KwwexVTEQfHc14V~EXV!|D68H3wm72`+Jzw`eS+HXgep!sEU;s z7$>-x%`IoYqt#V|mY!vF-rk?Sb~?ZSP&Jxeauy^yAzQs8rM@%n^r5*{ixt$jf6u?x zhv|cs8c5A#oHKQ`B*vzS^SzA5nS_tB{(9gES)ytBYvchMAlv)FKwl*5E}`w|_H}rS z#%_Mbb4^1F==kre=g5aPicCWyFjDSe)|nZ|RiYYjj=w>Ncb`9ctE}Gq*om-^$N|fabWcQl0VcvM-M>d$XuyvTfQN7q}74@8wm1T|Ewjq($4FXL81`(q9bygl$44 zf7Z`z5(@nCBkB9iScBg6HuJa<1h80Hf{$GLVPti$Hg_usBr!bxcpP*Yhb$%a3b#cD3%Y^>5U>E z{>m4n{XTCwINR>9#8>e?o094zXP|E8_GrR#=^>>gYNO@70g`iuQhxpGh?{rfwC%gB z?YcL6`h>9U`cJh|yovI&Rb)ghWNGzhW)M|RrK_H{MEr(~C1%wp=B8TT?&$atdh2-l_F zWd=?&X@~m2$0P~8_q2s@bHy3XiG6lYCLtrKO6lIx02M6>m1!NEJK${yW<6@=|xf@^gv3?kBxqvkP89q*6Z8B>$e>uyTub< z7evyK2p z^C)QVN6^xrbC33SdyuP}!iJvObXWF zLA<)VKKx!aG{HAitqj{Ymyk1Fh>!8va<2ZQV{h%~c3$gapn>?h!3ZoQ1Vw%#2$@0P>Osp|_i!*`}poCn3 z4$pm;hUI$NUKm)V*2skq-xpp}Zb$SO)K0#0?Z+EszpuKJS5TsfE(knk;}LjvLkd@_ z_kaujaQ|7RvrN;#Uo^8;ophhv%kYb?Uam3aE~xnuBG9g&lV$f9fmqq^q8;d@IU*dT zE|Sj(g>Xh*Glzi4yhmWqRSrCo>)34XkFcGQszbI9D?#!3ZkiH|N@Ll`yc^ovu-NG&Q~9K~isa%4Z4L;#(Q3>m>Xk9AcHTjlSiP9wjx*7gcCAte}eQZR%$I1j>iEq@W{n&a*8x zML3HwQ>%0|A~T~Ca|ZxWuRXdQS<=brYaY}&`UsXuOUHlG9`_$@1|*H2xLaH+=(@XM zw#h*0=*2iATKZUPvD7Q_Eiz??x6)h&ZG2w3?1{lTKSXa!RU}+4-uGcDf7gYXHJ{-br~&I66A|;J4}*$@%&DDG6fw zYzZRw)iR#Xv46x<{Vb5&Wt_EPaB}w%5jrL2o|ea_yYCwt-qG{f#bnCsM$FQx@5XLL z%CI)m^UBV*MI|02Q9Z2?>Zi$n+g5FP;#54+{tgI0Vf)A9QA@-=(~%X|Dd_XxzLY z-9i}vsL+*O(DQ|uo10S>68i9Z?z%APevp1<9{=kf)tN~jR7uUEZ%eOerU04Fb)Y_S*3{ z6^6~1YJmE?*k*w`JG79-#GtVm4}XptD9k40b(wm3l9*DIAQa|xJIQVtB-5V!9G0~MOCL=?fntDh@LE)>0#!_6O>m-A`Wr-MbQF-~X-8cgo zvENjyyM%(aHl6iSbtE>UZZQ|ve#_lFzRI*e#FNurd`DfnxYmTgvtZp4x-;+jY=w@k ziwm-j+tw4PJp0Q<+XG3v~}y#ev8Y4!FKNzCI*JAR)dXNLdlHWGdpWU7N|Tg zdA@8V>qPk3#>@;h-EI3SE_p~$6Aw*1mD4uIcm!}=V_(Q0>ume-SQS20Z_QiO-ku@H zwWZE;T4`Quy~3bbd&p{GVNo3~Y&9K*MqU4Gz-zGf{rmUd-!TRhot=>yn&z%*2|)XV z=>y!LEgaI%)bI`T;fV&~Zxy`z2E~@8`497Nv3RK`>AL22`c&z@kCB*I*z)gBR{$3@ zZdd!wGT*!7KFnc3r6a1ahQ^ocl6b@HbP?@-{)d-fdT3`05w8%6%8*sBo3q=q20=4P zzA%r34Zvh`jr)xS*1P?bnA&u{Y$~Dr%)^GSa8C$%O+a1Lrj$e6-iYsh7f*OQ@K~#P zFM*dp{>HCOM(26OwnGAi@6s&v<|`}$LY|tgdj^GkhM6nTFhPJnT5L94T-3w5rwHM? z}N1bOyjdJ29Axg*Sl3XLWg; z*2~=ynzeSZ{8Y>}<}(!9>RpfTuNxMvyVRQ^DzLO&T_lyR7e4u8-w$@YAJ(jdkOE=L z%a^{4jijfvgy z21F=YzTUHRBd~T?U{XYWe7d?d8>*?dewJ++54{i)$I;k z;G!C_nVkr{P_Zl1rkuF@Kqpbe@L2kB%2&I*zoC#kiO(Ic)@mssJ?kUPh7T{Xz>6KE z)7fzk-1ZSR8~PmP%L{VPW|xRT{}1lTrW#IP-0i^gRNH)uVr1a_!s2(S{r$0(Pl4%& zU7>5Bqk`Y^GQBwx3f^Bi@rVRwWv3IJJJB11Novt)0WZDvZvE9TmokU5MZ7rEm2a)? zOL(CkcWLf8gQ|&Sqrm$KUegYfv6PVu3=3tZ)1@1f4&Ow^(CgZQg6*ye3|pTquhzEb z&e@`k&O*hVB>o8=-RX93{C2U=$8Rq;?@2B__-{9vK1@#|=3Z?{;`G?iwihqNmCh}O%s3CCLr=r*PXxSVq3XeS#TjJT<|jy51a8@H?w1dHlFE$auF zFzxNT1W-VK)LTKMjgkQ$xyCYZXqaPaddADQFB-k3U|C6syrkjhR)c>;<#n6XD?T_> zPhTlqTvClE8Z=wTrlwQB%!y0?bscU!L9k=)`mnFm?jX7W9Ja3On=&B_Gsk8^{K%qE z90D#wD<7P&6)jjV`2-YicD?9M%~GfZ4C&*XvDDkFjgK79mytPJ+S*R+6#kwjKV0cJ zytzN)$k}c&IWEqg)fP@QP|a>RFQp|-RU76P@O|>#UMS$=RDi@?2ca1;4D(2Q!|W! zt+^7l7YhS}p^D*-NhVG1tjYMKq+aj!*`io_r{6zWeBZP$k7xZ^Rcr$7SH)*BLE-${ zl38t}a6FU^$#@Dol8lT@(%Mw$r3?Gw0h;0JT{;ePJ~ zKypkn^2bxRn)a^s^{AEftjYiyZ#Eav=Md$Bal01m(}|#>BUKSikNY7MMT&aLOW|C+ z+p>yffdaM+0D4Lw9EQN2>XmR9STt77?i6 z8aSNbfcK2R(LseY8$-@WQ)3gFm-BDN)Yp-Sb4Vua>Df}gj>J}^rctFSQKizNVwVd;Bk3A`6&tf&#Q?L8uwir!H!UBSVnk& z&~IHpw<}&%I9X1!!tXTIjo5m5%~`EVs}Dakh3Gk7^EB>;w?QylA?*g5{Wv+*hRIQ~ zbG04XF>LulqmSl&5>aoK69D$=v5Ps$0N&BGW1h=y`4+9_eSg}g^?cpvsrH+>D^~un z2*3@BO&OH&uRkE6prr3{cKWGnp@*$ic7XR4%et9t87WH0R6$$b{h#(pg0N<#s1az@ z3oIAp+=deULK@5vBMq*$i5G`hEEyhuXX3&Cao6?#Q8X88brqR|DZ zC#h)*dKqhdp%FNy!5eAV)+!7aol%XRpK)=WE6ptpKY^XFKC$DnC0A>%j_R^vLe?Ul zCK3U{h0j>zOC250Hc@etc>(}z4w6?;mjR-3B}yr@+2b@p-S_veCc_d3 z-k(J}G=dea*TN#mOgfsupKiG@+5UC4#`A&b(h!qrY7qeW1A#tl&~v4P>(_d15$(nC z{+QOUj)aD@)MX6N>T`gdOi&nVQgcr^svGBXEB*AEC zcrvy7ORZM7Ke8 z+$<)uGKk2I09etv@^9N6zYHph#U&ba3$a0KnmirkZlr*Ovj%TR$>w%cRtTls_gKB; zqF=1OV3zU=1QMIii>Y^!>`&s;;*7T;6`y=XN-F4oYVB`ZEjn3RQ+e_#bQ7rLu{18LO44 zyScFCdq01slAESln8L=$)vZE+BlEaWgWn8TQ!)OiiX!V6SYt;Jk1^F<;3BJ+YMm;3dP`B-*{jmBjOu-={= zLf4@v0lsn_1em=<>~QX5ExpFjO;%3LMf1gvLnH~z*=YhXO|;`0~_}X=zmY!Pas%h9s08| zZrELMU4amzb4Ee?o%4B;Y8t04HV)vD9pZ_;bdyiPF+jWy7y?S4Al`Pdua|voUTG3@ zOrZ4)leC1+V0i3$G6Ucr0hY5#2I^M{1x@f4QL~JoMFb@e!Yu)&GGv$#;Gm50vg7>~ zQBIEik=Myi3g72F2Y2*Gepcj%_7>PkUwcm^2%8u<*VpA`1p&~#d5It3=<*)cr-$QU zvm_QMWHA{DL|4LJpI;63iZkOZ6lxpM%s_1kj?Ok81Nx!`@Kjgxzuu65i)Nw1{X~)` z>1G)G4L=ehw!ofs5fy@j&k{JFcv>qdT0VALmT4JEgEfiTU_65T@_A&g5(i=b9^DF3H|7o#50MA*_oc-^kK*YHsETSZ{lW@CH5#<%lCCZyLcy6Ayd=022D^>nymz+MPMc$O7B!Inhqf&h&f3 zqO%+iO4JUW@ghqExO@XDQSqLd9vDlJXcB1opI2~Af z+#dF?qpp2WQr4^D?kfW1u>E}#n5^Ic0M=s7R-Rl5>^liP#&UM1(tU1^0 zF&BZM2*hU82F+KWYlV8;k>k7HHqjGZ^LsjtRYpXjP#3@ABZ5G@2qaAA2Ub?r7;+uO zpSV0unA#mgBzxZn@6S><(_QfbGdBzhHEN(S9JEEzI^Jsc)zq7gDTyv7f76$0H(~yW ztike~$Y}dOMkZ2OUmwsHk=O;iOU=Fio58yH2M0IBQId9b9T+@bGLuTG{cHOW$Xj+Gxq_ej_$L=NwmUetri$qG&Gm5bkkevwIs>|; z92{7*+wkB~i1-3P#TsB1+6wwYUA=2ZUW@$Ox6_&R@9j|8UkPjd`!W| z5zD-H62^CjW;Qp4eKpdHRZBqZ9q~dqBEcdths`P}Ee;$e0GW^n9)nU2O+&^K^d&^v zmFwHvBRzWqsNiS@9S@c+ij0E^5X^=~^3b!$AwcUM{Y5@vFq2<4EM|pY)J!M)C&&M@ zVVC}lYw1D$0-!<-}-`6IJw8{ufqJ zz1yAcFLK}r%Y{@3v{a}n#VX&U-?#guE32vk@Yo6J#$nhQV<~;cTVGDS_bh!(Z%tLk*+*&WwGEEZjhR*_s zDOXlk&&Q43oUb;)Bqt|pj?k)9?iw$Y2M-;8rl9Bo0bjP|@iad7kdGHGki?lplVzzm zt02NoE`tvV)S_iiyuCV#O8Bn}BTo@JmoGwZ<4fUd^+B>X@JD^|ZNCiC$r*ovBcT;g zK?6+EN5CK7vowvxSsHx?KYNX*h*YlcZph&zPb4*qIF4;YR}GC3b=({zT9hwxwnZ(3E-T`Dv7bh!)|9? zGM1t!_@z`o8#kZZ2fT-ue0$00^Qe*;LYwjEWfEq$&#>K8~%l z&|ZK=b1~{PD;U`xmO#}}fdX~4gXsZ}5)U=CWVkYjfB0i^DGsn@beg3H#(^clNG^y+ zqm@ma!j+p2edU431z-DjcGWLsNN{SNEUmqPO^e0K_OwGTD3*I!;Df!qS;%y)@`l<$j#}pP=aM5>+g7D8e-~WbhOw>;cFL|33+vsdf`;1|E zswDscKC6=u~`}af(mu?Ec)Mu?pnk9xga$FI^LRAHnh#?KHADmPEXNDUeG?1kqJLWu3;;E=U*{ z_wsfDK27juig) z8GiutBP-}5jOfiRz<>yE=}Uw)$V6hIL_iCN9W-0X5}22kHxe52LD$7H#aBt`xZyf6 zZ5@2!llcsVoDecT9|8mt5}YOcct&Ay@sN6o$s7q+v(-itbuBGnCnv--9%sCAU8EUJ zy^R2myW=k_^%nuLv1Hoq1n>h<>3)xoZe?pKWtv#ab)GmWZ04iuu-?Q`L`Xq{gH(0E zj0_?fGjLdVcoS!xC!R_@FYcY!XO!7vW$3@V8j}DF;-Fcs0-@aVxTz9$ab?c0u+Z1I zC-RJo_?I%q=EThi2|K?SfC4?A!sJqTbP85u0H0GNr1Np_Kw ztdvy9ZxM;EyAw1eBJpCCB5)YwQ*Zhk}iEKE5tw;lu%HL z8g8{z_XSE?y~Bqd)X$uBL}JUl|A(!?M*C~Em&|A?Cj#){A}684Xh1HB|Jjq8cmW>| zuX_f>zHe@AF~l2uyV);e@_jSZAR_;}AB6ga&(?rwvVdBG(-%zZ>Wco@T(639S@3mNc+p-A1-DwdaWCOOlvuT8L&OyzB!)EB6gd<+7D?E z1V#rY3#2-vF zjLp3<$Rv=1hvR8)OhiI{{4_Usd3~s&r-f0kH4}JzyghJEOFt1>DA(nSa(vnfwK@x% zZ1!TgH&U-LDO*-CG}`GLDWS~LK?>=3TkeL+1Bq`SlI{6_me#Hy*mUKt;Eds%k%hx%sJyQNqN0Sl|A74lJ zygS4?+2kmZzjp|>*6iMOw&J=4Ldn_@F|je_r5N;Zwb5PrmX;&+7Q4&%Q;<-od=%+P zNs!JbJU3RDnjngZs<==GBzHoCfZ)jW)Veq~Rl(HMT2E;6SqII7u>D_;JQ)pgEx;?9 zt2$PendGwY@9QU(4Gn>y^jT6fys?pTG-HS1n~4dyz%J;_ZdVW-?6ARdZ8DSNKAYPG zzpc#%DcdJdA{Q8pkk}1^Q1K-vSe)$i11CB8`&&Jscq`ejb{@^!x4+7)$#r3ng6ckA z83tEYo>+MI_3_8=<>j{inr^%k1&;^{B>m(2{lUpT`F3M2GR@j6qA~qpi@6ErK}W}R zictZV{udyOS1*Q+YUhVQSL~f-Vst!fn*=c7sI}Nb?g@FSE`hYp@09Xury8j6?VPWLM$!zzm3m9BJWk%LGX8P5`j-$W~R&(pI+lM%NyR$s#KKcsJX zQ&aLhJ?RvVg#k#UKrrh6VJeY4aBanRyqYEKttfUDZp~C{HYHPr$hw_GLI=&+kpGgh zQV|xm(h9%44pJCu@1}l>XlW=8L=omXsi@Rq7Qp`3d7`WTvq@Y3ugtA`Up=hcX!k5M zbZy#)K)#NkPJCX21+id~qIyY6a`H=3*9Yusni2s09My*`6s*~7SheSDw2XN)5)k?m zohzTn;NNivk+vqw_|6-QmcFWso0}XMHrz!a>uugiwn-#P_s!1uOGZ|_LVGXZz2g68^Yyw@rj(o*ZtZU?SvY%LTmOIKE4=KzbEUsWW3o4HX5_ylo3i9cljB; z{h<&Cz**x)i;SRmFWRcLpQye<*y_o)|7Xamc4~oRsyN(wJ(oK6a z#Blc2V23@K&aSSQ3W(R9TC1YTd@A0k9w0R}wcSoXeW7vz_QPU?dm%HA^D&}0^}msw z2=;J?E6Pg!`a@$byX1sSpooE1k{|kqbbO?3EbGf|MRHfE*3*K`*4 z2fW_T7JW*n-?ll|>$p-5fHF5fx;$M%01>6o3Vxl$Xp>LNz2D)x#CMByr|_#OiNEEPcD!Qi`^iA;LpJT7wUvbm`!ggD^%G7%Dz~}%wd2blj+66_ zeo=8t)J613Ch7vU+g@>II(LZoWlhAbnu?80#-uYv&rzhJ{_p~-;n$`5_0B-F<0&3H z|KTD785yC?dMi?c4YifFD48*m^hknrWB%Ys3B<`e_YAVmW<@@#TQyht?->`7;W8ZtHolXDY5aYzbZxfr@*5?fC^L<`D0-KsX zo~}0GD=F!kr|Cps+gy$?(y}Lf9|a{Bms_D^qSs{=Wa3`E&yPn1dRtF72b#~8EB88u zswEU@JXnwq7lMK{Y-bgrI`RLEbRYQ+#?yxe5aF6&(a<>AqfD)>$Aa)2 zBaKOC*4tCUu#cVROOG}W)d@i-aA2hq=on|K%$fe$KmjzhJVY;a0;^-8ihUyzR$7Sp z%nStRQ$5CpsZHG$+S8_61W|z&)l#b4())%5JDY~g%`W6ZK#%*Gu=D!amQ;|C?(;qB ztUywme^+X%4=b@GGh186u$Z+A8i+OmtD^vAI)>olA*CQHpj_d10QrQ-88Y!f|aZ9m%z79Sd&+1=UiGR7>hoDgv8HvPZbJ`6Y3~)RMFgA8R zo&^VG0@RGOCv})=QM1K+kjTjQd?TZyaeC=#7GF|1%5p6lY&VP$iKNZ{1^7Z;XiRqH zC%I3IE?tq5{5T)LJX`QkvF<8L52^?cL>w%@U)+7TbMp%Zhef+*dl3c9xY0^Stqo*5 zG3&*0pLX=WeS_@kqU;h{?fdR6W9HyTDW4%U5Vig@KEACE3-pOWQ2Of+IwPXn&+C0d z%k`Kmqu+JPVa-!wuHka}7zoFY6rWn$_x?11(hjs}))X-Q>lOWMAPESHMVv;-(rIEt z#3*IRYknE^d4LWueDq3*3g|J=A`#dtvLXQi<;l7${X+8-aO`{l2q{A*SL~&rPkn&G z#svI|jomt)Q*gW7M4PS9Ls8f!A zZrrBGS6hqRX^%kyE|b5QxAfs~yn@gfLI{aS2&=)t2mBlsI$b_u3i-E`14ivfLL7j? z4y)UxT}Hu+C5XE5OF>5jDSe6zzxt+x9;b4?W-Ne0a{IkRbas+BrFQYbg|GU5ITQE< zkcI}IVEg;7T(alddgF}gJu_yqN?7l*a1CjE?JjVK)Afqm*=!Pp@5IfqXQdP0w@W5d zmdWx#$mSs1eA=vVrOi`~3v`wPpj~I73X6EVrw|3y=?IX5qv=MI0d;lfWvP5Cq53+cps zu7P5?@8P82H>VQBply)LLiP6|6~asK0@uK6mXwtTf45BCI!zCpY?}I%v}(=%p@zEY z?vbUGiv?{vc25(>+OnS>$JhW$eoUn}w^G9WYMUIi4(wa7t-60YJ(v5U?w}c?w-5}j{<}%)If8W`A>>uaP8G~PpwVt)s z^US#JEADBCHXCBr$4VBDkB?7ffga3dM+sShF}y!R^rz3B=w}*lM2)#BlwXY$psG~= zL9VaX!=Tv*!b4qQ9DmLEgBfA6&`5BRZeXCmLYfO`*|#u~CMLB5P^t(13XlG*Ow@6( zAsa}Fbn-Dn;sj5gZ0r!D{dOrRBhos7gKsOEq^Jc}C+Cuy*C#x6`nm1R(E0dyvo>^e zAa;TJj{7@XO`?1lk-y8RFjnuKxH9<{k!VpE{9g#IP9>B}O6oU9T2!;}hY6Dg9G(w( zD!!U~1(w?H8=+Fl<@p4|7%r+TFpuE(zU1jPR7dxI|58v?L{F#N9DiXC_+(?lk3l`2 zKz9D%cWi_)5zJAh)Ku^8VK097ch04NU2X(hP5fK)|AdKG=D8MlIc!X6>#$GOt|(y_ zrjQyKiu*u+3vr}IVv=eagwtdnsvukB5}oYh72uXxQ<6R?r`PmAz{bY*P`W<(LDdmM zGg_yMXIRZzWxsn+HzYX;J(7w7kB;u>BA-z_ocEi)BTGdBQaj%xddqq3(8oSOTPVYQ zMo_mkyS7eo#3-WXD0xOjL)Ob}@@ftyJXuE6upvns9$Ruym)B@3&8kBwyhD4czutfu zc)6XHG^0OVSJ5_HCrM>8Tg|G~g!MSmaJ80X035a!uN%E*?xlZsEuBI5j~j$STDu*ug+j!M;xDSy(^nP8l?>sMDlG^;C3;X^@%4&3V`8Oy_OX=ED zA1kJ27uK-N7L{YRe&&VS#OpJ5FCG2SpFg3hNVkrkMv7#zYhb=+t{|BpAR_uG9k4Tg z8~$Y;BLB)8n>V;!y{xt0t=@uv%I5~l--yXEtWR=nhM6uR$!_gXOn(>TX7`-xn3qQ* z#C$vCUQ4CunqXyB*EZ7-7z6n{!Q9D5`!_cAkUp)}`mAf3G<^VU9fq%Jfl9b3k%oYQ z0XdKeL^oG^;9lYXV=e(T3|>@zpj(#0+q}ofj$Yp70?oqtcg{q?nn>meFM!iS|KKSM z?{bLPS#IBAS_PS;5UeNh93pnES!9a;q4xnG(}Vyr&5N%pl7C@cnlOYQ`~TU6m>8le za>Vhuyfvzl^!BEr4y}|P7iyhF%dE;Ka}k(L6h159em``90oJAd{)5h~5sEaKWQ|gr zRXniklK+_h0f?oru*dpf$p!*u+@?p~vp;vKkr&*Ng%tgSt>t7#t#n5#(zg;4BkFqF zvo-i?>dK#v)EgYMy;10d0zD9`t7Cz$Y1WFe^z>jc@Q3?I#`^Qp-e2T@m?(e98rc3` z=aho*3C+eKSB1dlYx60S(#pyuL%<=?J|X;x_Rbq7cjz~m&5r*~B5r(R7@QhFHggX5 zOC;fgdGyE&!JBBwqt&JNt+-rKBI9;Y&{qY1b#?XUrEgiN1^+yvYw&;I+iYPXYK$R-g-N&7ZEgri(l>>E-V=26qzvvd0jR-3k&mPoSX?I7r@zIW}nCg&SLBqwch@TD*!DG z3$6!&x3kEuFzBRwSkt#=hK3!R_j}VHo8A2h^ZDG}fR?~jm?}3_@jg{)v7>`TN-B(u zn)=C0l|sZOmor!~F$50xYdTn1Scx+wit9rB0}G%RnWNApm$kI|4=`wRy#W|*sm)ic z)M6H`n@q$W@sE0ioaE*GQ9E}Mjt?1CZV7g8-%LPhtfky0tY6bdF?U(6VAVPZ71fK| zqk!zHPe`5Qe=jme{%|d|Ugmi#F7DmgDV(Q}9YVc=zG*sY+|lfQlg%^U3;4}FeanCR z<~Ka%Rh54vshQDV?8oXFBa=MS0Sv`h3neC}K(J(BS@QKfS}`j1xO*YrSz_{*)?6_L z#R2Rt74JPulHit?@twIiIAG<}zg2lkNC^K3!K3q}(+z_D0rwX>-e9-=+U;`rt@_g! zr|OIoj&_A;foONW@=utJd2Vk{kQ0pQ00BBTr*UF?Edm*CPMUxCRndD98O_vpN@?Lz zNIyz`EfCH8;DpChHfx)vynAMMqH5NT%<$@H@$2E%7~b3PNdJIGn``xEIMl#&?ZW!_ zF#Yb!>_qP7Ks{XofeO#1PoST!@I_J8F=vixIE#0g2=^i>PmTf`4c3_v}I*wQeSae zclF@dYmA41qgZ{uu~^lv+~w?bwY>?HqvfK}Oo5)$@fs37oe1ZjoyT7sLeoY&Jc}4N zS*rQ;#GUAA%I%}iD^K&n&GqyU#}l1}k}VC}rsj~J65o($UH_0P$fbEyBlkk;(g!~w zk-RlYdjGD z9gfni6+ov)AYtR&07}ME`dFQEKBnb8tw0MB=c8Ncuhs47{B&_Ui1eLQhWr5#8}Jpm z54ss+$A;$D{e+<{dkO4`e7p3U6T!#0$VX}+5xdL*&Q~iA=1}XY@$7wQ+sKokDg1`y3J=V zkk=9u{NSG1<`Wsiy5?O5ExEsEC&GI}ME*61BkKEuPeBz{lrNU&m z+-{T+vKKOgGKSaaaYuN5z>kPZ#HLqGfqE60y7)|Ia;o#mu!;!l?NN_|xLR8|Bv|q? zZ%}^XI=`vd?nK{XfwyFCp#C(@S-`!=0rhPRMUJ!DO&vb zEJE||RLA^;MMP+;9@PSzP&3k6^tA?QzTQ4ydo;Hc!Ad!NUQJzH@(TAQ^=-q_M1*Zn zWF!Jkh7w#bM6_o8O%>bdG>E5!5-$-CPuUgF@<4^-@XE*LjuEY3Gnpn8Zr{WD%gAQ&KnTvu)Nb-19G8rg&C zX&Z5`Q!Etw#eE)IJ@jZV69Luar-b}p4V2HGdDjSK&NRZix^m~#sXaG+b100O(%E(- z7sSNQ{+{Yx`3?Ik{S%|*b;+)&@2fdEIr)IveT(*p@X+k_HST^#dvR!GG=Rz7AV7J^LVreMocq5OGY zhpR5ZTBB^8fnESr2?Qnatr?|f7`{YL2z-SKpqKXUXxN)^uV#t`<>VMjl*FGsPV+Xm zgx-J6;-4*v+m4KklajJ;q{##gjZoW~F~`8lnmk*zbfhyb*X&kpQ%oHi91QK&Bp@|l zczL-hD^e{p37UoXNAP~3RgFNQow{7$JqxTa*YmeGn;2O5-d>qQhD4HxeDdjnZFjK4 zdhEAC4>l4OeqLlZHNvzsB;n*)IE(k!k5cdi+eBE?(pIL7F}THXpwON+Ezfk9klp^^ z{5C%JliE7%F3|Sy(4;RK2?^Oye*HBjeqsV1ePS@(w6eMWk}2tWU=8Q&#&D$w4(WqW zjiaOLRC&-4G4UQW9P&5@W;(~bZ}qDgzZc_d;2|}cnN;7=*xF<3dW7=#IpyneU9<(sQAhWj;3g-K@z<`Wf z1U%ZAUN(nm?Q(d#v@Lo^HwT-&Goi583~$~bT4;in*)s1WRqd_=&Y2V2TfGl_tEzAr z1@$-k8L5t(-mSH`^-EMbpS_F~Yieo;rK?U}?~XK*B=E;^{(6S@6UX!k1kQTt05JQO zQH!$Rcr=LFi@zFm!M~pO0fo&TM@&I?t_5cDJ|14yiaMfor{P<7I8j?)bl^0bI17u} znAdb%ytQm4DBnkB#%HQ_6AY`j-85ftTt4T&@|{)QpRr%I0H)$4kGDIMB|W#L#G5h` zW|PHTci&8Q?AE`h){^27-=w;8Kcl;apPE%QoQZ##`0WIr;r{-{_?LCjds(ZE{2J7n zC>qrvK&%j7aco_@yT9GTmdl{vDJQ|O{*)YFH@F#@>&rx^MO_2OWwY{JZxK`-OSe~w z1I}8+1-goMig~J)4Sl;VDE1jFParr{Kn%h~B7S?WitQ6>Ut~OYzS6~e7nx&hL=$E) z(hWO*#17ost`z0;JwE6zZX@Z3{u#lzTs}hj2A9^lznHTWD2ddou1@e@Ii6M}XgbN> z2fTONGUTv-8I)aAOLR9WB}5LB^6d@jGhi)UidY$DL=FIA)SLD1%1}3|3mWa^l#+4G zU!!k;lr(A8Z4xrglXe$=s84>}iAyqo`t%lBmw7|Kg?fsZ_oXLlYojwtt#>Klyld+6 zwP%C5oq(jtb7DOkO~6{9$(nh@0B^G%tmTnkELpCou+7i7i+h4Gsg)zx^_wgZq!1{+ zLP51}L(A%8^?VZ%)Lm>+U;{RpX*QvjW?@RjH8_!dA@;yOYGvM40M8cMipV)ki zk74_b_WPj{mP_ei@7wo+Ll%9$MbxTID=MGAsEXwfxD4q$vwl;Jo27w&*HBx_GW>z> zoBNuh#^Tw=#pM|3?^}%x?XGna-I@`shcrNI?wt)woqVc6TIgu_B$#$@TdxK@v?fQX(X60p7AE1-@L;mE1NF%t7NSa+B*#>#%-v zSA;l#R&A4x81V_Qj1C|BO$7l6OJ%MqE9=WAjQwlKrO=bY0lw`=j~mAg~MOWXzTyT)+IZhE>fs5*1-7lRbv>y-Hs`~q0tOi=ak&~wS&TNPT$68 zhppw|r1eslh~rV>_#RYqQFB00{K=A|1$I^zrNla?NLW}{n#JtIaG9YiDC*HJZ%Dm! zWmC<}eX1D&O$;e@f+8ZI!H)QZDUDH0L!*5p(;I`BxP5lnK?Z28&p0^=ighDDo%y>@ z&8YZ*iO>f4X(#o+%yneuIie7d0YLbN@@bFmUki_dhA>D@A@9#Lp#aC!#!0)gu&8LT zK~=$5O=hPHZCSnx!2JrEm^>lob|5YSH7iXh3RX930&C_QooNSBTjIZH*W;8q*%hdhmVPa$(CemNLn@ye z`(3v7-Y6j>ckOyR0uW8iqKm|WjA8GeqOEP|T*5s(KTXxM^hb~s`wG`UGPF@b79J!+ zm#n8$f@GsUyeS+sPyevmCO0|(M<-R(I^2r*TKD~0ts3wO8_$`+tCj=+3BM*?F*ic4 zEQ1x_m_fU~lLgl{UEFR0sQgT?UU^?$ez88;pa;k&5U5xJl(QijAv%*FfBniLgx+d( ze?C_CM>0yl=8x5E4{PG}QnxFEt%)M$AIK;u??2Rb`(ff+fBXPr0(Em~LtLm{p<)J3 zO~7C%Ov4D=MMZ6bHzC{Ip7znr4zVJ?p1|LiR|^ggUq5lam{&BznZ+T$k!x`Wybk!qq`kE6-C>1ZH=(Z7G;P zHOC}7t2PvfC3yM!6AUD>KI#s;k}~9{E+htC=@&9du1j(zUVR@1`kdy6@2;a zZ&vOjObiSW7A4N1&$Vi;6H)wY?L~o|z@HpEx)>W6yTZB{Pbh`a=+=iBV>O$1SZZ-4 zh|vv20e$n6URCNwaqLmk)#hs&Pu!X4)IQyn%1TT7`y$*qeVn@(lKISzTRC z(EhHiuJeZSaEf`RKCSxQ!@aLo!)UFIP%9}gf4Hd`VjEi9TRfMB-dASg;NTDhsoyNO zFq5Cpw>5R`KsiT%xjs2tgDVB*;EVoTSjhU3Mu$y?3Or>uwIrt({^M>ac}YxP~Y-@ z{UYAkVe@xk19rv*2A?;TKVWfz%FoHOyL*OT#z`=b`cca3cCYSo)ncu2u2^8-P?&CZ zM`#@?CJZCt4w;QzGNruT9_>N62TD+mO!BkwuAt^Kk<~zS3XvGy>`^hP+6;j|djm4e zOe&Lbo)X4CZ^sC08hwaa9t2ot<>nUPiEk%;FI6zkX`jNkkXQ2E(q+|6wUd&1jL&9Z z@U#OQrSa|KsII3r`sFC_RXCWvC*vRVOMDJI&7~kLZk%_cHu0tT%qaYy#YqDxkDsJc zCEMq-=u-O~)RTiM*rb>2V_f$CMZ{A((&bjIe1*ZGKD3MchnU5`PrG!juHc-LJ1G%_ z+laKTjsov2dH&H$7Obid+@^FrKwh0~d>n4XiX@^z)J!9QUJvSP!~6GKLZbD8wbxsj zZ5m&}!~Y|bOo2flS_A32$RLrXx%V} zku<+BBs(2n9$}Mf9_-FHOn2A#!lQng@jULMrYWXB-cf$ZxHBm`-x6Zt+bknj`o`O2 zB;!CB9N#!oi6oVp;_iclA{zO$?XKl*tQxF84TT{^ioa;bcaTBv-P)yk!NuBn<3bPMltEayw1@i(=KI$jswF>b+X^&{V#7YZ_f2QU zP8`1ZHBQ@h$iWto3J=_b$cSHYSU%s~T@22>(fpCJP-scyA(*eliS2>h+ua@FI*l8# zZ5{N=P_!*e9J|(=-le_jn;x7@mD%yAD5LI+RuCxuGzikp<=rvAAq0juG18|1N->`7 zOeS7tR5X7JZ`Ph>pIX1SLDE4!RXy(yDF*A2Y1P$3u=z|XU9N1Y9Vr(!cfvP$CfMjDF#c3h{@bXpd(~dfF*Q=6+-fYIYLbo*XM_Sr#pw!i#)i z$US$RuTd4EK<@=$ZO1^u$EznGZ4%#6o3p3(kzxaO2zj_$bbPaK@GE=WlJBg-R_|b) zC5b@C3fQ09K_8I(jYQqWYXe&YNy)5id<8Sj(!967vmXKkc%Tmc}`&?kP!D}JMa|CbEbZvPVjeuZ#;N+LZxy*C_ z@K9=eRW~avOZ;^A$H>CV%j~wNB$-z3uh9O~>_$;ue8pGddNh=&pW5-%B#_uN{+TzQ zLA%4^0e^Tqk%-Vg3ZD$79>7r%cA0!~gjgP>X?b6^=bl4uOBaUl#HSyiWu%HQ>d6{$&RsWT<7*@BHGQm&y4- zHYmYMmVe>{0K`N9joPgWSN#{(C5ISyG23&~|I5!Y5AkylQGNT(HU1tjIM1LnC1TAt zaF#Dw?D#PA^h{BakdUs%W@jB&x3-{0bKH@_iP(X*FSyX$;kMP*v&sA9RXaYg0Qk?= z9IOdNQWk{LD86{p6S4n{dW#sGM-p4uhu>}<_?Q6kk{~$P`7y9s(fVPYI0k{v6CGlt zsNTox(#ya(b~Vch%q_@4Ua`t>Z>8Mw6%V?(#xo>@1!VuBUjYdTv9LQGfBz}rniA4q@Hm7aO`OC ze{zkCvRhbW?H9}fvr1jHK}sb0mv%IeWJD0_*(tT07gZ~N=d6#Ox_Pv>|8YYdFz`GV z+VQC1d_wQ-(H5W6(^D8sHRSq-_IDzNnBKRLN9ysDF2|j7YRp?_ut(5X1-_7<7yt28 zi;iVxTa$z8)W>c7AUB7C_@PE8sojxG>L;vbh24Ffot2K-Nj~*#mp#6WW0_22NHzsiA z<~0S+b{wn^7Tl+rZc>R!{f365Om@zm9-I%SQ+VxoTBL)VsMqXM8JP%cuu=hd?vuZ` zTBW>6Na4PjIhRmY_6p4ZHFb8Y1@GEgj&*~#lG6UYy`DzSGgv@C@wJ?9oQey_1|HT9 zkTqM{o7OYdjbYYY8?CQG0LF^QSvd&ehtv}RZTEowah~~KT`F9_rQ!=B3zEQICZ}hb zkAcOM9D7E{$O%uJD-?JxS7S+HiGumW>2ndkM3FQwB&PwfVozsbNz)TTKmxw0%no*M zx+1cOUwQ)mAiXxSM5k%RD4(-*Jl9hzx2cH)o9(G-5^XUOL57#}=8(3j4)B~9Y5FN= zv4|d?6cIvdC1qO26#D8axexgRqz8^~d*Rd-_X>mptCwbKUnv!-_|M9~A*6np*EIh$ zc@Ipgm+lHraW-QW^W@sFAfQ(IE1P~b7vs`E0$HugS)vB^TCkS9o>&_ef2wx96U6<# zH}C3Ym7LG&54ARey*nL6E-j0)^4DtsTzUJ>c*~*9 zA^Jol|9vazJ5U+C_HGqoyO;go;U8Pz@p*lj^yk^`B+R$YSRqkS_<{JNBGI#k;*+-f z`^!~F%MROLT1?E%cd!+$V`DLA4bfI*X(67&Y3V;Z)=FBc59{XY-0|I9P?yd=UY}ho z&bD@CH*4UsSSK^T=es?dTr@MnrB(5JxU)iC>QHB0>X4lR%?6GTJfZR?%2(w3+o ze(H3w$c4{dI%Up!!?dtPy+8s&n)p0DPEP<^M!20(|+P z)cj|pXkTEb8&4zM-A_mKjOX}7?D|W-FlYy$^ApqbV+UU>oCJ`1#22vTf`T7dqI!P1 zmEM;dg{HY)Fkn3O@I|tBkm9JqoQJwkCFXVEVa`L3J7&tb@9jEP1G~p@?e#x1(H>XGD#eRqv^|JC^?yLAEb30a8 z)kpCJFHS|#dYqu5px`UFEh(7B1ok^@TIl7gJ|si0}g9EF0C;NPX?cMuooXJ%frD~F2XlW zbEJ1~@aT>naJbmEP*NS$;WvL>w;g?LxOC%Y*+NLMZ>(G1kGx;i%lVO`HCblRg~d?# zoH83Im=96zl0EdOb3?;8hmqG=;<`uVEO@+jTcpJfJyxAJ7dI!jpis8ehr&G!0%pWGS&M`O!pL*qkq>Z4U%n|ES@cUsfKx%4o!;sZV%q6ku2WYgD$U_3|k7kP$0GOUu6+IlK+D@_Jc*h5K-zNCsmi zB;a0gZsC$y-4!A5zfYxZFB|+248el`Q})$$fsf140c@7GnMnwZX)Jv`UZ!SBKNNsst z&qrPsE;$iw6Wm@hJ$ zUu%?7Ym;*GvH-y&M#eB*>KJvk_@i`>OZ{~7Ugs0MLl(=_@nY@Jo>)&25fRCDvO`OgIf*GKl+ z`>n#d!1VVGByuw(vSM=nr-e|5R>W6Ce*gfLH_5Xrqz!3gSA343sfs1DfrSPAnXj4K zq}zDJ4OBUbCl%`YDrFdb-qagS=cXzRx0%>t2QAirSUww;}xWf%}*+FDVop zYs>LCQFXkZ+D2sn;#GVq2>T61E3aL>>@=k4axE>F*Nyb-$_eP*Hgy`;yd{350P@4mGDb z0uv)+%aaj|xic>_zf4{QIj3n5qdpqRfe)AJatNjV(Qn@o@F30xYeM1WKnGlPds!kD z#e6+h)8E@Vg>6WOE6n5(Sll|&_R~KnB=o`IRrbrFj*OI*7Y;}{WFEiT0+oS-+@yF`Nw--NBdmbU@`V&}7TFuptxV;_wDIzM;G_uyTF>7=Qm!`#e_rSPe zglh7UyxAJ`sFL4>+3#lpthNHJki(2mRFsxDzr~DHJm*KkG#f^Sh*k-y=z-(eqk zVa&!4A8{^Jq~Q#OyczvM8r0X}JVskWWEWJid`%EV@DwvNK4;XZR8k4!3-GHJQaOB) zF8Po+vmQq!vsR_ZNgt5d^3AIH-N8abswO*EY^Eq0YEn-a0XpdHv2G!kNwa5Sx8wH` z6B-vHhC$It_caZK?w19TFb%t7JwDZIR{8$E!1e#tx=Jg0_vZ))PDju(Y2Tgz6S})h znru*GKvm02b2B;ru$_0~kamz2a8JnlJ!Y?#NDpQClRIxZE&N16o1@Q4WMPsG^;<`! zsG)+rq$-i{z)#;8ANGLNZOkPG&B5XqvAgN-n8L# zx6hJwnr^DtDVFV^FN0veuMJMtFuH`yn=kht%}RsISyCnICOd7 zQzyMrMaDAHk`ru!|C53;`t#>34v`?QW>}V8&$E619ehogNpfE@@@p77TLP$u{d(dQ z${rugSr{|*0%k2IYn(U|LUdDte6B&ymCpRVsb9~E7eK{E;iw;h&gu3x(`FTjPG({R z_B-*)GoXni_b<*EZXF?AOwj3Khy^!l&hZhU+=|C#wxp^afaMBbu3n`sEn&1ON|CxT zc_q&rZFsOAAFtGc(BkoV-gUDbO%MrcQ{QHUc_kcA^73x~?NaI4a`jmJD~j4&mD3Y> z5K{IuJiJ&eu!`KDs|!S--Rj-_9{bVF6$Fb=Agu}AOy7~prv5eYS~#6%M@OZXQXnI9 z(UL&xRGJW6IQsU;`uf1s$v&xUX$zzSJE|?d**Lu7_o-?NZ05I?tsni;luLB99az}o zH-TXEH5o4&C0k<9KEe_ta%bb>>8_NnZmb5;7Uf30&x8ev5CbqN0*>$<4TxonP)YgV zGZo&xeY!C*T-czpPBQZp60E7TJ|P zUnn-H_-^$9$*z^kXKJU7Ju8!07!#5`yeCNDz2V-PDkFJ#*gdGhZ;uz^s8nye310@} z;p;~lBRZ1>3F^+q%q%`ueY`F>eRt<+7BLtRhYvHe<_$Ys=-*UbkluOX(lvdcJE4{Q z6Ft)#EGr>nc!p(wouRjXL~#4IqPQJdu+yqUyZ#oz^7RA7 z)45j-*6joY;}%c$U*E=s&3*(8WD@b{)G~}c$$q6SJ-?Qh4t1lYl`O`@Y7gn{VYydR zr-7x2Dgn(KfpeNWYhUtRv&|}L##;y6$DPV1-7jB@d6Ub|;!#?DOdAz==c`H5+Y*6g zNNh5eXLEaRNPK|l@xnTJD-(9nAOgBZh6PUhTFh7bm26`OJ@xJF%gxy-wUcLZmx8iG zc{Cl^j$5>1pmhVSDJY)H^MmO1Y+`Yn#X(j!^{IrU=C)Tplm(VMK>&!R|ISJ;rQZ3WQNwra@P zDHeTFB8xw?BkfL;+?*avX%YX5Bj&bXVz zaji+s(GYjB)No7wQ8KSc8QYjkTA=2wCoYz){C<
    }~!E?t84Ioc#vcUStC#ZtHV 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 function except that it can be used to run a script on any - server, instead of just the current server. - - .. warning:: Running this function with a ``numThreads`` argument of 0 or - less will cause a runtime error. - - The simplest way to use the :doc:`exec` command is to call it with - just the script name and the target server. The following example will try - to run ``generic-hack.js`` on the ``foodnstuff`` server:: - - ns.exec("generic-hack.js", "foodnstuff"); - - The following example will try to run the script ``generic-hack.js`` on - the ``joesguns`` server with 10 threads:: - - ns.exec("generic-hack.js", "joesguns", 10); - - This last example will try to run the script ``foo.js`` on the - ``foodnstuff`` server with 5 threads. It will also pass the number 1 and the - string "test" in as arguments to the script:: - - ns.exec("foo.js", "foodnstuff", 5, 1, "test"); diff --git a/doc/source/netscript/basicfunctions/fileExists.rst b/doc/source/netscript/basicfunctions/fileExists.rst deleted file mode 100644 index 2be373b17..000000000 --- a/doc/source/netscript/basicfunctions/fileExists.rst +++ /dev/null @@ -1,29 +0,0 @@ -fileExists() Netscript Function -=============================== - -.. js:function:: fileExists(filename[, hostname = current hostname]) - - :RAM cost: 0.1 GB - - :param string filename: Filename of file to check. - :param string hostname: - Hostname of target server. This is optional. If it is not specified then - the function will use the current server as the target server. - :returns: ``true`` if the file exists. - - The filename for scripts and .txt files is case-sensitive, but for other types of files it - is not. For example, ``fileExists("brutessh.exe")`` will work fine, even - though the actual program is named ``BruteSSH.exe``. - - If the ``hostname`` argument is omitted, then the function will search - through the server running the script that calls this function for the file. - - Examples: - - .. code-block:: javascript - - ns.fileExists("foo.js", "foodnstuff"); // returns: false - ns.fileExists("ftpcrack.exe"); // returns: true - - The first example above will return true if the script named ``foo.js`` exists on the ``foodnstuff`` server, and false otherwise. - The second example above will return true if the current server contains the ``FTPCrack.exe`` program, and false otherwise. diff --git a/doc/source/netscript/basicfunctions/formatNumber.rst b/doc/source/netscript/basicfunctions/formatNumber.rst deleted file mode 100644 index 407f2407b..000000000 --- a/doc/source/netscript/basicfunctions/formatNumber.rst +++ /dev/null @@ -1,29 +0,0 @@ -formatRam() Netscript Function -============================== - -.. js:function:: formatRam(number[, fractionalDigits = 3[, suffixStart = 1000[, isInteger = false]]]) - - :RAM cost: 0 GB - - :param number number: Number to format. - :param number fractionalDigits: Number of digits to show in the fractional part of the decimal number. - :param number suffixStart: How high a number must be before a suffix will be added. - :param boolean isInteger: Whether the number represents an integer. Integers do not display fractional digits until a suffix is present. - - :returns: Formatted string. - - Converts a number into a string with formatting. - - The format depends on the Numeric Display settings (all options on the "Numeric Display" options page). - - Examples: - - .. code-block:: javascript - - const number = 1.23456789 - ns.print(ns.formatNumber(number)); //1.235 - ns.print(ns.formatNumber(number,4)); //1.2346 - ns.print(ns.formatNumber(number*1e9,3,1e10)); //1234567890 - ns.print(ns.formatNumber(number*1e10,5,1e6)); //12.34568b or 1.23457e9 - ns.print(ns.formatNumber(number,4,1000, true)); //1.235 - ns.print(ns.formatNumber(number,4,1000, false)); //1.2346 \ No newline at end of file diff --git a/doc/source/netscript/basicfunctions/formatPercent.rst b/doc/source/netscript/basicfunctions/formatPercent.rst deleted file mode 100644 index b14d0a551..000000000 --- a/doc/source/netscript/basicfunctions/formatPercent.rst +++ /dev/null @@ -1,23 +0,0 @@ -formatPercent() Netscript Function -============================== - -.. js:function:: formatPercent(number[, fractionalDigits = 2]) - - :RAM cost: 0 GB - - :param number number: Number to format. - :param number fractionalDigits: Number of digits to show in the fractional part of the decimal number. - - :returns: Formatted string. - - Converts a number into a string with percent formatting. - - The format depends on the Numeric Display settings (all options on the "Numeric Display" options page). - - Examples: - - .. code-block:: javascript - - const number = 1.23456789 - ns.print(ns.formatPercent(number)); //123.46% - ns.print(ns.formatPercent(number,4)); //123.4568% \ No newline at end of file diff --git a/doc/source/netscript/basicfunctions/formatRam.rst b/doc/source/netscript/basicfunctions/formatRam.rst deleted file mode 100644 index ce0036563..000000000 --- a/doc/source/netscript/basicfunctions/formatRam.rst +++ /dev/null @@ -1,26 +0,0 @@ -formatRam() Netscript Function -============================== - -.. js:function:: formatRam(number[, fractionalDigits = 2]) - - :RAM cost: 0 GB - - :param number number: Number to format. - :param number fractionalDigits: Number of digits to show in the fractional part of the decimal number. - - :returns: Formatted string. - - Converts a number into a string with ram formatting. - - The format depends on the Numeric Display settings (all options on the "Numeric Display" options page). - - Examples: - - .. code-block:: javascript - - const number = 1.23456789 - ns.print(ns.formatRam(number)); //1.23GB or 1.23GiB - ns.print(ns.formatRam(number,0)); //1GB or 1GiB - ns.print(ns.formatRam(number,3)); //1.235GB or 1.235GiB - ns.print(ns.formatRam(2**12,3)); //4.096tB or 4tiB - ns.print(ns.formatRam(2**20,3)); //1.049PB or 1PiB \ No newline at end of file diff --git a/doc/source/netscript/basicfunctions/ftpcrack.rst b/doc/source/netscript/basicfunctions/ftpcrack.rst deleted file mode 100644 index a42af2ab9..000000000 --- a/doc/source/netscript/basicfunctions/ftpcrack.rst +++ /dev/null @@ -1,17 +0,0 @@ -ftpcrack() Netscript Function -============================= - -.. js:function:: ftpcrack(hostname) - - :RAM cost: 0.05 GB - - :param string hostname: Hostname of the target server. - - Runs the ``FTPCrack.exe`` program on the target server. ``FTPCrack.exe`` - must exist on your home computer. - - Examples: - - .. code-block:: javascript - - ns.ftpcrack("foodnstuff"); diff --git a/doc/source/netscript/basicfunctions/getHackingLevel.rst b/doc/source/netscript/basicfunctions/getHackingLevel.rst deleted file mode 100644 index 780dba116..000000000 --- a/doc/source/netscript/basicfunctions/getHackingLevel.rst +++ /dev/null @@ -1,13 +0,0 @@ -getHackingLevel() Netscript Function -==================================== - -.. js:function:: getHackingLevel() - - :RAM cost: 0.05 GB - :returns: The player's current hacking level. - - Example: - - .. code-block:: javascript - - ns.getHackingLevel(); // returns: 124 diff --git a/doc/source/netscript/basicfunctions/getHackingMultipliers.rst b/doc/source/netscript/basicfunctions/getHackingMultipliers.rst deleted file mode 100644 index e1cd4d401..000000000 --- a/doc/source/netscript/basicfunctions/getHackingMultipliers.rst +++ /dev/null @@ -1,26 +0,0 @@ -getHackingMultipliers() Netscript Function -========================================== - -.. js:function:: getHackingMultipliers() - - :RAM cost: 0.25 GB - :returns: object containing the player's hacking multipliers. These - multipliers are returned in decimal forms, not percentages (e.g. 1.5 - instead of 150%). - - Structure:: - - { - chance: Player's hacking chance multiplier, - speed: Player's hacking speed multiplier, - money: Player's hacking money stolen multiplier, - growth: Player's hacking growth multiplier - } - - Example: - - .. code-block:: javascript - - const mults = ns.getHackingMultipliers(); - ns.print(mults.chance); - ns.print(mults.growth); diff --git a/doc/source/netscript/basicfunctions/getHacknetMultipliers.rst b/doc/source/netscript/basicfunctions/getHacknetMultipliers.rst deleted file mode 100644 index d2a9f9922..000000000 --- a/doc/source/netscript/basicfunctions/getHacknetMultipliers.rst +++ /dev/null @@ -1,27 +0,0 @@ -getHacknetMultipliers() Netscript Function -========================================== - -.. js:function:: getHacknetMultipliers() - - :RAM cost: 0.25 GB - :returns: object containing the player's hacknet multipliers. These - multipliers are returned in decimal forms, not percentages (e.g. 1.5 - instead of 150%). - - Structure:: - - { - production: Player's hacknet production multiplier, - purchaseCost: Player's hacknet purchase cost multiplier, - ramCost: Player's hacknet ram cost multiplier, - coreCost: Player's hacknet core cost multiplier, - levelCost: Player's hacknet level cost multiplier - } - - Example: - - .. code-block:: javascript - - const mults = ns.getHacknetMultipliers(); - ns.print(mults.production); - ns.print(mults.purchaseCost); diff --git a/doc/source/netscript/basicfunctions/getHostname.rst b/doc/source/netscript/basicfunctions/getHostname.rst deleted file mode 100644 index 9d116121f..000000000 --- a/doc/source/netscript/basicfunctions/getHostname.rst +++ /dev/null @@ -1,14 +0,0 @@ -getHostname() Netscript Function -============================== - -.. js:function:: getHostname() - - :RAM cost: 0.05 GB - - Returns a string with the hostname of the server that the script is running on. - - Examples: - - .. code-block:: javascript - - ns.tprint(ns.getHostname()) \ No newline at end of file diff --git a/doc/source/netscript/basicfunctions/getPurchasedServerCost.rst b/doc/source/netscript/basicfunctions/getPurchasedServerCost.rst deleted file mode 100644 index 25c261b42..000000000 --- a/doc/source/netscript/basicfunctions/getPurchasedServerCost.rst +++ /dev/null @@ -1,17 +0,0 @@ -getPurchasedServerCost() Netscript Function -=========================================== - -.. js:function:: getPurchasedServerCost(ram) - - :RAM cost: 0.25 GB - - :param number ram: Amount of RAM of a potential purchased server. Must be a power of 2 (2, 4, 8, 16, etc.). Maximum value of :doc:`getPurchasedServerMaxRam` - :returns: Cost to purchase a server with the specified amount of ``ram``. - - Giving any non-power-of-2 as an argument results in the function returning `Infinity` - - Example: - - .. code-block:: javascript - - ns.getPurchasedServerCost(8192); // returns: 450560000 diff --git a/doc/source/netscript/basicfunctions/getPurchasedServerLimit.rst b/doc/source/netscript/basicfunctions/getPurchasedServerLimit.rst deleted file mode 100644 index f6b109ad6..000000000 --- a/doc/source/netscript/basicfunctions/getPurchasedServerLimit.rst +++ /dev/null @@ -1,13 +0,0 @@ -getPurchasedServerLimit() Netscript Function -============================================ - -.. js:function:: getPurchasedServerLimit() - - :RAM cost: 0.05 GB - :returns: The maximum number of servers you can purchase. - - Example: - - .. code-block:: javascript - - ns.getPurchasedServerLimit() // returns: 25 diff --git a/doc/source/netscript/basicfunctions/getPurchasedServerMaxRam.rst b/doc/source/netscript/basicfunctions/getPurchasedServerMaxRam.rst deleted file mode 100644 index 81b7dab77..000000000 --- a/doc/source/netscript/basicfunctions/getPurchasedServerMaxRam.rst +++ /dev/null @@ -1,13 +0,0 @@ -getPurchasedServerMaxRam() Netscript Function -============================================= - -.. js:function:: getPurchasedServerMaxRam() - - :RAM cost: 0.05 GB - :returns: The maximum RAM that a purchased server can have. - - Example: - - .. code-block:: javascript - - ns.getPurchasedServerMaxRam(); // returns: 1048576 diff --git a/doc/source/netscript/basicfunctions/getPurchasedServerUpgradeCost.rst b/doc/source/netscript/basicfunctions/getPurchasedServerUpgradeCost.rst deleted file mode 100644 index 55e18e921..000000000 --- a/doc/source/netscript/basicfunctions/getPurchasedServerUpgradeCost.rst +++ /dev/null @@ -1,18 +0,0 @@ -getPurchasedServerUpgradeCost() Netscript Function -=========================================== - -.. js:function:: getPurchasedServerUpgradeCost(hostname, ram) - - :RAM cost: 0.1 GB - - :param string hostname: Hostname of target purchased server. - :param number ram: Target amount of RAM for purchased server. Must be a power of 2 (2, 4, 8, 16, etc.). Maximum value of :doc:`getPurchasedServerMaxRam` - :returns: Cost to purchase a server with the specified amount of ``ram``. - - Giving any non-power-of-2 as an argument results in the function returning `-1` - - Example: - - .. code-block:: javascript - ns.purchaseServer("smallServer",2) //costs 110000 - ns.getPurchasedServerUpgradeCost("smallServer",8); // returns: 330000 diff --git a/doc/source/netscript/basicfunctions/getPurchasedServers.rst b/doc/source/netscript/basicfunctions/getPurchasedServers.rst deleted file mode 100644 index 34d2c2d93..000000000 --- a/doc/source/netscript/basicfunctions/getPurchasedServers.rst +++ /dev/null @@ -1,13 +0,0 @@ -getPurchasedServers() Netscript Function -======================================== - -.. js:function:: getPurchasedServers() - - :RAM cost: 2.25 GB - :returns: String array of hostnames of all of the servers you have purchased. - - Example: - - .. code-block:: javascript - - ns.getPurchasedServers(); // returns: ['grow-server-0', 'grow-server-1', 'weaken-server-0'] diff --git a/doc/source/netscript/basicfunctions/getScriptRam.rst b/doc/source/netscript/basicfunctions/getScriptRam.rst deleted file mode 100644 index ef02fe4f4..000000000 --- a/doc/source/netscript/basicfunctions/getScriptRam.rst +++ /dev/null @@ -1,16 +0,0 @@ -getScriptRam() Netscript Function -================================= - -.. js:function:: getScriptRam(filename[, hostname = current hostname]) - - :RAM cost: 0.1 GB - :param string filename: Filename of script. - :param string hostname: Hostname of target server the script is located on. - Default to the server this script is running on. - :returns: Amount of RAM required to run the script, 0 if it does not exist. - - Example: - - .. code-block:: javascript - - ns.getScriptRam("grow.js"); // returns: 1.75 diff --git a/doc/source/netscript/basicfunctions/getServerMaxMoney.rst b/doc/source/netscript/basicfunctions/getServerMaxMoney.rst deleted file mode 100644 index 2163692a7..000000000 --- a/doc/source/netscript/basicfunctions/getServerMaxMoney.rst +++ /dev/null @@ -1,14 +0,0 @@ -getServerMaxMoney() Netscript Function -====================================== - -.. js:function:: getServerMaxMoney(hostname) - - :RAM cost: 0.1 GB - :param string hostname: Hostname of target server. - :returns: Maximum amount of money that can be available on a server. - - Example: - - .. code-block:: javascript - - ns.getServerMaxMoney('foodnstuff'); // returns: 50000000 diff --git a/doc/source/netscript/basicfunctions/getServerMaxRam.rst b/doc/source/netscript/basicfunctions/getServerMaxRam.rst deleted file mode 100644 index 687a46744..000000000 --- a/doc/source/netscript/basicfunctions/getServerMaxRam.rst +++ /dev/null @@ -1,15 +0,0 @@ -getServerMaxRam() Netscript Function -==================================== - -.. js:function:: getServerMaxRam(hostname) - - :RAM cost: 0.05 GB - :param string hostname: Hostname of target server. - :returns: Total ram available on that server. In GB. - - Example: - - .. code-block:: javascript - - const maxRam = ns.getServerMaxRam("helios"); // returns: 16 - ns.print("helios has "+maxRam + "GB"); diff --git a/doc/source/netscript/basicfunctions/getServerMinSecurityLevel.rst b/doc/source/netscript/basicfunctions/getServerMinSecurityLevel.rst deleted file mode 100644 index 0ed55e390..000000000 --- a/doc/source/netscript/basicfunctions/getServerMinSecurityLevel.rst +++ /dev/null @@ -1,14 +0,0 @@ -getServerMinSecurityLevel() Netscript Function -============================================== - -.. js:function:: getServerMinSecurityLevel(hostname) - - :RAM cost: 0.1 GB - :param string hostname: Hostname of target server. - :returns: The minimum security level of the target server. - - Example: - - .. code-block:: javascript - - ns.getServerMinSecurityLevel('foodnstuff'); // returns: 3 diff --git a/doc/source/netscript/basicfunctions/getServerMoneyAvailable.rst b/doc/source/netscript/basicfunctions/getServerMoneyAvailable.rst deleted file mode 100644 index d3ec06d97..000000000 --- a/doc/source/netscript/basicfunctions/getServerMoneyAvailable.rst +++ /dev/null @@ -1,19 +0,0 @@ -getServerMoneyAvailable() Netscript Function -============================================ - -.. js:function:: getServerMoneyAvailable(hostname) - - :RAM cost: 0.1 GB - :param string hostname: Hostname of target server. - :returns: Money available on that server. - - .. note:: - - Running this function on the home computer will return the player's money. - - Example: - - .. code-block:: javascript - - ns.getServerMoneyAvailable("foodnstuff"); // returns: 120000 - ns.getServerMoneyAvailable("home"); // returns: 1000 diff --git a/doc/source/netscript/basicfunctions/getServerNumPortsRequired.rst b/doc/source/netscript/basicfunctions/getServerNumPortsRequired.rst deleted file mode 100644 index ea281b00c..000000000 --- a/doc/source/netscript/basicfunctions/getServerNumPortsRequired.rst +++ /dev/null @@ -1,15 +0,0 @@ -getServerNumPortsRequired() Netscript Function -============================================== - -.. js:function:: getServerNumPortsRequired(hostname) - - :RAM cost: 0.1 GB - :param string hostname: Hostname of target server. - :returns: The number of open ports required to successfully run NUKE.exe on - the specified server. - - Example: - - .. code-block:: javascript - - ns.getServerNumPortsRequired("unitalife"); // returns: 4 diff --git a/doc/source/netscript/basicfunctions/getServerRequiredHackingLevel.rst b/doc/source/netscript/basicfunctions/getServerRequiredHackingLevel.rst deleted file mode 100644 index 614d6cf27..000000000 --- a/doc/source/netscript/basicfunctions/getServerRequiredHackingLevel.rst +++ /dev/null @@ -1,14 +0,0 @@ -getServerRequiredHackingLevel() Netscript Function -================================================== - -.. js:function:: getServerRequiredHackingLevel(hostname) - - :RAM cost: 0.1 GB - :param string hostname: Hostname of target server. - :returns: The required hacking level of target server. - - Example: - - .. code-block:: javascript - - ns.getServerRequiredHackingLevel("foodnstuff"); // returns: 5 diff --git a/doc/source/netscript/basicfunctions/getServerSecurityLevel.rst b/doc/source/netscript/basicfunctions/getServerSecurityLevel.rst deleted file mode 100644 index 08aba68b3..000000000 --- a/doc/source/netscript/basicfunctions/getServerSecurityLevel.rst +++ /dev/null @@ -1,14 +0,0 @@ -getServerSecurityLevel() Netscript Function -=========================================== - -.. js:function:: getServerSecurityLevel(hostname) - - :RAM cost: 0.1 GB - :param string hostname: Hostname of target server. - :returns: The security level of the target server. - - Example: - - .. code-block:: javascript - - ns.getServerSecurityLevel("foodnstuff"); // returns: 3.45 diff --git a/doc/source/netscript/basicfunctions/getServerUsedRam.rst b/doc/source/netscript/basicfunctions/getServerUsedRam.rst deleted file mode 100644 index 9f071fdca..000000000 --- a/doc/source/netscript/basicfunctions/getServerUsedRam.rst +++ /dev/null @@ -1,15 +0,0 @@ -getServerUsedRam() Netscript Function -===================================== - -.. js:function:: getServerUsedRam(hostname) - - :RAM cost: 0.05 GB - :param string hostname: Hostname of target server. - :returns: Used ram on that server. In GB. - - Example: - - .. code-block:: javascript - - const usedRam = ns.getServerUsedRam("harakiri-sushi"); // returns: 5.6 - ns.print("harakiri-sushi uses "+ usedRam + "GB"); // prints: "harakiri-sushi uses 5.6GB" diff --git a/doc/source/netscript/basicfunctions/getSharePower.rst b/doc/source/netscript/basicfunctions/getSharePower.rst deleted file mode 100644 index ff6a46728..000000000 --- a/doc/source/netscript/basicfunctions/getSharePower.rst +++ /dev/null @@ -1,16 +0,0 @@ -getSharePower() Netscript Function -============================== - -.. js:function:: getSharePower() - - :RAM cost: 0.2 GB - - :returns: Reputation gain rate multiplier from sharing. i.e. 1.5 means +50% rep gain rate. - - Calculate your share power, based on all the active share calls. - - Examples: - - .. code-block:: javascript - - ns.tprint(ns.getSharePower()) \ No newline at end of file diff --git a/doc/source/netscript/basicfunctions/grow.rst b/doc/source/netscript/basicfunctions/grow.rst deleted file mode 100644 index a06cddb2a..000000000 --- a/doc/source/netscript/basicfunctions/grow.rst +++ /dev/null @@ -1,38 +0,0 @@ -grow() Netscript Function -========================= - -.. js:function:: grow(hostname[, opts={}]) - - :RAM cost: 0.15 GB - :param string hostname: Hostname of the target server. - :param object opts: Optional parameters for configuring function behavior. Properties: - - * threads (*number*) - Number of threads to use for this function. - Must be less than or equal to the number of threads the script is running with. - * stock (*boolean*) - If true, the function can affect the stock market. See - :ref:`gameplay_stock_market_player_actions_influencing_stock` - - :returns: The number by which the money on the server was multiplied for the growth - - Increase the amount of money available on a server. The time it takes to - execute depends on your hacking level and the target server's security - level. When :doc:`grow` completes, the money available on a target - server will be increased by the number of threads used and a certain, fixed percentage. - The percentage is determined by the target server's growth rate (which varies between servers) - and security level. Generally, higher-level servers have higher growth - rates. - - Like :doc:`hack`, :doc:`grow` can be called on any server, from - any server. The :doc:`grow` command requires root access to the target - server, but there is no required hacking level to run the command. It also - raises the security level of the target server by 0.004 per thread. - - Action time is calculated at the start, effect is calculated at the end. - - Example: - - .. code-block:: javascript - - while(true) { - await ns.grow("foodnstuff"); - } diff --git a/doc/source/netscript/basicfunctions/hack.rst b/doc/source/netscript/basicfunctions/hack.rst deleted file mode 100644 index 764afaf31..000000000 --- a/doc/source/netscript/basicfunctions/hack.rst +++ /dev/null @@ -1,38 +0,0 @@ -hack() Netscript Function -========================= - -.. js:function:: hack(hostname[, opts={}]) - - :RAM cost: 0.1 GB - :param string hostname: Hostname of the target server. - :param object opts: Optional parameters for configuring function behavior. Properties: - - * threads (*number*) - Number of threads to use for this function. - Must be less than or equal to the number of threads the script is running with. - * stock (*boolean*) - If true, the function can affect the stock market. See - :ref:`gameplay_stock_market_player_actions_influencing_stock` - :returns: The amount of money stolen if the hack is successful, and zero otherwise - - Function that is used to try and hack servers to steal money and gain - hacking experience. The runtime for this command depends on your hacking - level and the target server's security level. In order to hack a server you - must first gain root access to that server and also have the required - hacking level. - - A script can hack a server from anywhere. It does not need to be running on - the same server to hack that server. For example, you can create a script - that hacks the 'foodnstuff' server and run that script on any server in the - game. - - A successful :doc:`hack` on a server will raise that server's security - level by 0.002. - - Action time is calculated at the start, effect is calculated at the end. - - Example: - - .. code-block:: javascript - - await ns.hack("foodnstuff"); - await ns.hack("10.1.2.3"); - await ns.hack("foodnstuff", { threads: 5 }); // Only use 5 threads to hack diff --git a/doc/source/netscript/basicfunctions/hasRootAccess.rst b/doc/source/netscript/basicfunctions/hasRootAccess.rst deleted file mode 100644 index 6559585da..000000000 --- a/doc/source/netscript/basicfunctions/hasRootAccess.rst +++ /dev/null @@ -1,22 +0,0 @@ -hasRootAccess() Netscript Function -================================== - -.. js:function:: hasRootAccess(hostname) - - :RAM cost: 0.05 GB - :param string hostname: Hostname of the target server. - :returns: ``true`` if you have root access on the target server. - - Example: - - .. code-block:: javascript - - if (ns.hasRootAccess("foodnstuff") == false) { - ns.nuke("foodnstuff"); - } - - .. code-block:: javascript - - if (ns.hasRootAccess("foodnstuff")) { - ns.exec("foo.js", 1, "foodnstuff"); - } diff --git a/doc/source/netscript/basicfunctions/httpworm.rst b/doc/source/netscript/basicfunctions/httpworm.rst deleted file mode 100644 index 1f9929785..000000000 --- a/doc/source/netscript/basicfunctions/httpworm.rst +++ /dev/null @@ -1,16 +0,0 @@ -httpworm() Netscript Function -============================= - -.. js:function:: httpworm(hostname) - - :RAM cost: 0.05 GB - :param string hostname: Hostname of the target server. - - Runs the ``HTTPWorm.exe`` program on the target server. ``HTTPWorm.exe`` - must exist on your home computer. - - Example: - - .. code-block:: javascript - - ns.httpworm("foodnstuff"); diff --git a/doc/source/netscript/basicfunctions/isLogEnabled.rst b/doc/source/netscript/basicfunctions/isLogEnabled.rst deleted file mode 100644 index 085aa2a40..000000000 --- a/doc/source/netscript/basicfunctions/isLogEnabled.rst +++ /dev/null @@ -1,14 +0,0 @@ -isLogEnabled() Netscript Function -================================= - -.. js:function:: isLogEnabled(functionName) - - :RAM cost: 0 GB - :param string functionName: Name of function to check. - :returns: ``true`` is logs are enabled for this function or for 'ALL' - - Example: - - .. code-block:: javascript - - ns.isLogEnabled('hack'); // returns: true diff --git a/doc/source/netscript/basicfunctions/isRunning.rst b/doc/source/netscript/basicfunctions/isRunning.rst deleted file mode 100644 index 64d4d8d70..000000000 --- a/doc/source/netscript/basicfunctions/isRunning.rst +++ /dev/null @@ -1,55 +0,0 @@ -isRunning() Netscript Function -============================== - -.. js:function:: isRunning(filename[, hostname = current hostname[, args...]]) -.. js:function:: isRunning(PID) - - :RAM cost: 0.1 GB - :param string filename: Filename of script to check. case-sensitive. - :param string hostname: Hostname of target server. Defaults to current server - :param args...: Arguments to specify/identify which scripts to search for - :returns: ``true`` if that script with those args is running on that server. - - .. note:: - - Remember that a script is uniquely identified by both its name and its arguments. - - **Examples:** - - In this first example below, the function call will return true if there is - a script named ``foo.js`` with no arguments running on the - ``foodnstuff`` server, and false otherwise: - - .. code-block:: javascript - - ns.isRunning("foo.js", "foodnstuff"); - - In this second example below, the function call will return true if there is - a script named ``foo.js`` with no arguments running on the current - server, and false otherwise: - - .. code-block:: javascript - - ns.isRunning("foo.js", ns.getHostname()); - - In this next example below, the function call will return true if there is a - script named ``foo.script`` running with the arguments 1, 5, and "test" (in - that order) on the ``joesguns`` server, and false otherwise: - - .. code-block:: javascript - - ns.isRunning("foo.js", "joesguns", 1, 5, "test"); - - -.. js:function:: isRunning(scriptPid) - - :RAM cost: 0.1 GB - :param number scriptPid: PID of the script to check. - - Same as the above version but with pid. - - Example: - - .. code-block:: javascript - - ns.isRunning(39); diff --git a/doc/source/netscript/basicfunctions/kill.rst b/doc/source/netscript/basicfunctions/kill.rst deleted file mode 100644 index c6d00ab54..000000000 --- a/doc/source/netscript/basicfunctions/kill.rst +++ /dev/null @@ -1,58 +0,0 @@ -kill() Netscript Function -========================= - -.. js:function:: kill(script[, hostname=current hostname[, args...]]) - - :RAM cost: 0.5 GB - :param string script: Filename of the script to kill. - :param string hostname: Hostname of the server on which to kill the script. - :param args...: Arguments to identify which script to kill. - :returns: ``true`` is that script was killed. - - Kills the script on the target server specified by the script's name and - arguments. Remember that scripts are uniquely identified by both their name - and arguments. For example, if ``foo.js`` is run with the argument 1, - then this is not the same as ``foo.js`` run with the argument 2, even - though they have the same code. - - Examples: - - The following example will try to kill a script named ``foo.js`` on the - ``foodnstuff`` server that was ran with no arguments: - - .. code-block:: javascript - - ns.kill("foo.js", "foodnstuff"); - - The following will try to kill a script named ``foo.js`` on the current - server that was ran with no arguments: - - .. code-block:: javascript - - ns.kill("foo.js"); - - The following will try to kill a script named ``foo.js`` on the current - server that was ran with the arguments 1 and "foodnstuff": - - .. code-block:: javascript - - ns.kill("foo.js", ns.getHostname(), 1, "foodnstuff"); - -.. js:function:: kill(scriptPid) - - :RAM cost: 0.5 GB - :param number scriptPid: PID of the script to kill - :returns: ``true`` that script was killed. - - Kills the script with the specified PID. Killing a script by its PID will - typically have better performance, especially if you have many scripts - running. - - - Example: - - .. code-block:: javascript - - if (ns.kill(10)) { - ns.print("Killed script with PID 10!"); - } diff --git a/doc/source/netscript/basicfunctions/killall.rst b/doc/source/netscript/basicfunctions/killall.rst deleted file mode 100644 index 182d957bc..000000000 --- a/doc/source/netscript/basicfunctions/killall.rst +++ /dev/null @@ -1,24 +0,0 @@ -killall() Netscript Function -============================ - -.. js:function:: killall([hostname = current hostname[, safetyguard = true]]) - - :RAM cost: 0.5 GB - :param string hostname: Hostname of the server on which to kill all scripts. - :param boolean safetyguard: Whether the function will safeguard the current script or not. - :returns: ``true`` if scripts were killed on target server. - - Kills all running scripts on the specified server. - - - Example: - - .. code-block:: javascript - - ns.killall('foodnstuff'); // returns: true - - .. code-block:: javascript - - ns.killall(); // returns: true, kills all scripts on the current server, except the current script - ns.killall(); // returns: false, because all no available scripts are running anymore - ns.killall(ns.getHostname(),false) // returns: true, but also kills the current script diff --git a/doc/source/netscript/basicfunctions/ls.rst b/doc/source/netscript/basicfunctions/ls.rst deleted file mode 100644 index c1c97b809..000000000 --- a/doc/source/netscript/basicfunctions/ls.rst +++ /dev/null @@ -1,17 +0,0 @@ -ls() Netscript Function -======================= - -.. js:function:: ls(hostname[, grep]) - - :RAM cost: 0.2 GB - :param string hostname: Hostname of the target server. - :param string grep: a substring to search for in the filename. - :returns: String array of all files in alphabetical order. - - Example: - - .. code-block:: javascript - - ns.ls("home"); // returns: ["demo.js", "msg1.txt"] - ns.ls("home", ".txt"); // returns: ["msg1.txt"] - ns.ls("home", ".script"); // returns: [] diff --git a/doc/source/netscript/basicfunctions/moveTail.rst b/doc/source/netscript/basicfunctions/moveTail.rst deleted file mode 100644 index 9b64b250e..000000000 --- a/doc/source/netscript/basicfunctions/moveTail.rst +++ /dev/null @@ -1,28 +0,0 @@ -moveTail() Netscript Function -=============================== - -.. js:function:: moveTail(x , y[, pid = current script]) - - :RAM cost: 0 GB - - :param number x: X coordinate to move the tail window to. - :param number y: Y coordinate to move the tail window to. - :param number pid: PID of the script of which tail window to move. Defaults to current script. - - Moves the tail window to the specified coordinates. The top left corner is (0,0). - - .. note:: - - Due to inner workings, something has to be awaited between opening a tail window and moving or resizing it. - - Examples: - - .. code-block:: javascript - - //open tail - ns.tail(); - await ns.sleep(0); - - //move the tail close to top left corner and make it big - ns.moveTail(10, 10); - ns.resizeTail(780, 510) \ No newline at end of file diff --git a/doc/source/netscript/basicfunctions/mv.rst b/doc/source/netscript/basicfunctions/mv.rst deleted file mode 100644 index 859037856..000000000 --- a/doc/source/netscript/basicfunctions/mv.rst +++ /dev/null @@ -1,22 +0,0 @@ -mv() Netscript Function -============================== - -.. js:function:: mv(hostname, sourceFile, targetFile) - - :RAM cost: 0 GB - - :param string hostname: Hostname of the target server. - :param string sourceFile: Name of the file to be moved/renamed. - :param string targetFile: Target name of the file. - - Move the source file to target file on the given server. - - This command only works for scripts and text files (.txt). It cannot, however, be used to convert from script to text file, or vice versa. - - This function can also be used to rename files. - - Examples: - - .. code-block:: javascript - - ns.mv("home", "foo.js", "old_foo.txt") \ No newline at end of file diff --git a/doc/source/netscript/basicfunctions/nFormat.rst b/doc/source/netscript/basicfunctions/nFormat.rst deleted file mode 100644 index 88d7c839e..000000000 --- a/doc/source/netscript/basicfunctions/nFormat.rst +++ /dev/null @@ -1,24 +0,0 @@ -nFormat() Netscript Function -============================== - -.. js:function:: nFormat(number, format) - - :RAM cost: 0 GB - - :param number number: Number to format. - :param string format: Formatting to use. Read http://numeraljs.com/#format for specifics. - :returns: Formatted string. - - Deprecated, might be removed in 2.3 version of the game. Use :doc:`formatPercent` for formatting percentages, - :doc:`formatRam` for formatting ram amounts and :doc:`formatNumber` for formatting other numbers. - - Converts a number into a string with the specified formatter. - This uses the numeral.js library, so the formatters must be compatible with that. - - Examples: - - .. code-block:: javascript - - ns.print(ns.nFormat(123456789.1,"0,0")) //logs "123,456,789" - ns.print(ns.nFormat(123456789.1,"0.00a")) //logs "123.46m" - ns.print(ns.nFormat(200000,"$0.00a")) //logs "$200.00k" \ No newline at end of file diff --git a/doc/source/netscript/basicfunctions/nuke.rst b/doc/source/netscript/basicfunctions/nuke.rst deleted file mode 100644 index 48759ac02..000000000 --- a/doc/source/netscript/basicfunctions/nuke.rst +++ /dev/null @@ -1,18 +0,0 @@ -nuke() Netscript Function -========================= - -.. js:function:: nuke(hostname) - - :RAM cost: 0.05 GB - :param string hostname: Hostname of the target server. - - Runs the ``NUKE.exe`` program on the target server. ``NUKE.exe`` must exist - on your home computer. Requires the targeted server to have enough ports opened, - otherwise will throw an error. - - - Example: - - .. code-block:: javascript - - ns.nuke("foodnstuff"); diff --git a/doc/source/netscript/basicfunctions/print.rst b/doc/source/netscript/basicfunctions/print.rst deleted file mode 100644 index a43aae109..000000000 --- a/doc/source/netscript/basicfunctions/print.rst +++ /dev/null @@ -1,18 +0,0 @@ -print() Netscript Function -=========================== - -.. js:function:: print(args...) - - :RAM cost: 0 GB - :param args: Values to be printed. - - Prints any number of values to the script's logs. - - Example: - - .. code-block:: javascript - - ns.print("Hello world!"); // Prints "Hello world!" in the logs. - ns.print({a:5}); // Prints '{"a":5}' in the logs. - const text = "can" - ns.print("I "+ text +" use variables :)") // Prints "I can use variables :)" \ No newline at end of file diff --git a/doc/source/netscript/basicfunctions/ps.rst b/doc/source/netscript/basicfunctions/ps.rst deleted file mode 100644 index acf57aa9a..000000000 --- a/doc/source/netscript/basicfunctions/ps.rst +++ /dev/null @@ -1,31 +0,0 @@ -ps() Netscript Function -======================= - -.. js:function:: ps([hostname=current hostname]) - - :RAM cost: 0.2 GB - :param string hostname: Hostname address of the target server. - If not specified, it will be the current server's IP by default. - :returns: array of objects - - Returns an array with general information about all scripts running on the - specified target server. The information for each server is given in an - object with the following structure:: - - { - filename: Script name, - threads: Number of threads script is running with, - args: Script's arguments, - pid: Script's pid - } - - Example: - - .. code-block:: javascript - - const processes = ns.ps("home"); - for (const i = 0; i < processes.length; ++i) { - ns.tprint(processes[i].filename + ' ' + processes[i].threads); - ns.tprint(processes[i].args); - ns.tprint(processes[i].pid); - } diff --git a/doc/source/netscript/basicfunctions/purchaseServer.rst b/doc/source/netscript/basicfunctions/purchaseServer.rst deleted file mode 100644 index 5c852c402..000000000 --- a/doc/source/netscript/basicfunctions/purchaseServer.rst +++ /dev/null @@ -1,34 +0,0 @@ -purchaseServer() Netscript Function -=================================== - -.. js:function:: purchaseServer(hostname, ram) - - :RAM cost: 2.25 GB - :param string hostname: Hostname of the purchased server. - :param number ram: Amount of RAM of the purchased server. Must be a power of - 2. Maximum value of :doc:`getPurchasedServerMaxRam` - :returns: The hostname of the newly purchased server. Empty string on failure. - - Purchases a server with the specified hostname and amount of RAM. - - The ``hostname`` argument can be any data type, but it will be converted to - a string and have whitespace removed. Anything that resolves to an empty - string will cause the function to fail. If there is already a server with - the specified hostname, then the function will automatically append a number - at the end of the ``hostname`` argument value until it finds a unique - hostname. For example, if the script calls ``purchaseServer("foo", 4)`` but - a server named "foo" already exists, the it will automatically change the - hostname to "foo-0". If there is already a server with the hostname "foo-0", - then it will change the hostname to "foo-1", and so on. - - Note that there is a maximum limit to the amount of servers you can purchase. - - Example: - - .. code-block:: javascript - - const ram = 64; - const name = "pserv-"; - for (const i = 0; i < 5; ++i) { - ns.purchaseServer(name + i, ram); - } diff --git a/doc/source/netscript/basicfunctions/relaysmtp.rst b/doc/source/netscript/basicfunctions/relaysmtp.rst deleted file mode 100644 index d0a53425c..000000000 --- a/doc/source/netscript/basicfunctions/relaysmtp.rst +++ /dev/null @@ -1,16 +0,0 @@ -relaysmtp() Netscript Function -============================== - -.. js:function:: relaysmtp(hostname) - - :RAM cost: 0.05 GB - :param string hostname: Hostname of the target server. - - Runs the ``relaySMTP.exe`` program on the target server. ``relaySMTP.exe`` - must exist on your home computer. - - Example: - - .. code-block:: javascript - - ns.relaysmtp("foodnstuff"); diff --git a/doc/source/netscript/basicfunctions/renamePurchasedServer.rst b/doc/source/netscript/basicfunctions/renamePurchasedServer.rst deleted file mode 100644 index ec34e8d33..000000000 --- a/doc/source/netscript/basicfunctions/renamePurchasedServer.rst +++ /dev/null @@ -1,17 +0,0 @@ -renamePurchasedServer() Netscript Function -=================================== - -.. js:function:: renamePurchasedServer(hostname, newName) - - :RAM cost: 2 GB - :param string hostname: Hostname of the purchased server. - :param string newName: New name for the given server. - :returns: ``true`` if the renaming was succesful. - - Renames the purchased server with the specified ``hostname`` to have the new name ``newName``. - - Example: - - .. code-block:: javascript - - ns.renamePurchasedServer("server", "old_server"); diff --git a/doc/source/netscript/basicfunctions/resizeTail.rst b/doc/source/netscript/basicfunctions/resizeTail.rst deleted file mode 100644 index 2a8a14698..000000000 --- a/doc/source/netscript/basicfunctions/resizeTail.rst +++ /dev/null @@ -1,28 +0,0 @@ -resizeTail() Netscript Function -=============================== - -.. js:function:: resizeTail(width, heigth[, pid = current script]) - - :RAM cost: 0 GB - - :param number width: Width of the window. - :param number heigth: Heigth of the window. - :param number pid: PID of the script of which tail window to resize. Defaults to current script. - - resizes the tail window to the specified size. - - .. note:: - - Due to inner workings, something has to be awaited between opening a tail window and moving or resizing it. - - Examples: - - .. code-block:: javascript - - //open tail - ns.tail(); - await ns.sleep(0); - - //move the tail close to top left corner and make it big - ns.moveTail(10, 10); - ns.resizeTail(780, 510) \ No newline at end of file diff --git a/doc/source/netscript/basicfunctions/rm.rst b/doc/source/netscript/basicfunctions/rm.rst deleted file mode 100644 index 840ef80cc..000000000 --- a/doc/source/netscript/basicfunctions/rm.rst +++ /dev/null @@ -1,19 +0,0 @@ -rm() Netscript Function -============================== - -.. js:function:: rm(Filename [,hostname = current hostname]) - - :RAM cost: 0 GB - - :param string Filename: Name of the file to be deleted. - :param string hostname: Hostname of the target server. - - Delete a file on the given server. - - .. warning!:: There is no safetychecks or recycling bins. Deleted files are lost. - - Examples: - - .. code-block:: javascript - - ns.rm("foo.js"); diff --git a/doc/source/netscript/basicfunctions/run.rst b/doc/source/netscript/basicfunctions/run.rst deleted file mode 100644 index 29d86f623..000000000 --- a/doc/source/netscript/basicfunctions/run.rst +++ /dev/null @@ -1,43 +0,0 @@ -run() Netscript Function -======================== - -.. js:function:: run(script[, numThreads=1[, args...]]) - - :RAM cost: 1 GB - :param string script: Filename of script to run - :param number numThreads: Optional thread count for new script. Set to 1 by - default. Has to be an integer. - :param args...: - Additional arguments to pass into the new script that is being run. Note - that if any arguments are being passed into the new script, then the - second argument ``numThreads`` must be filled in with a value. - :returns: The process id (PID) of the new process or 0 on failure. - - Run a script as a separate process. This function can only be used to run - scripts located on the current server (the server running the script that - calls this function). - - .. warning:: Running this function with a ``numThreads`` argument of 0 or - less will cause a runtime error. - - The simplest way to use the :doc:`run` command is to call it with just - the script name. The following example will run ``foo.js`` - single-threaded with no arguments: - - .. code-block:: javascript - - ns.run("foo.js"); - - The following example will run 'foo.js' but with 5 threads instead of - single-threaded: - - .. code-block:: javascript - - ns.run("foo.js", 5); - - This next example will run ``foo.js`` single-threaded, and will pass the - string ``foodnstuff`` into the script as an argument: - - .. code-block:: javascript - - ns.run("foo.sj", 1, 'foodnstuff'); diff --git a/doc/source/netscript/basicfunctions/scan.rst b/doc/source/netscript/basicfunctions/scan.rst deleted file mode 100644 index 6284967e9..000000000 --- a/doc/source/netscript/basicfunctions/scan.rst +++ /dev/null @@ -1,15 +0,0 @@ -scan() Netscript Function -========================= - -.. js:function:: scan(hostname = current hostname) - - :RAM cost: 0.2 GB - :param string hostname: Hostname of the server to scan. - :returns: array of strings of all the host directly connected to the target - server. - - Example: - - .. code-block:: javascript - - ns.scan("home"); // returns: ["foodnstuff", "sigma-cosmetics", "joesguns", "hong-fang-tea", "harakiri-sushi", "iron-gym"] diff --git a/doc/source/netscript/basicfunctions/scp.rst b/doc/source/netscript/basicfunctions/scp.rst deleted file mode 100644 index 9e334ab98..000000000 --- a/doc/source/netscript/basicfunctions/scp.rst +++ /dev/null @@ -1,33 +0,0 @@ -scp() Netscript Function -======================== - -.. js:function:: scp(files, destination [, source = current hostname]) - - :RAM cost: 0.6 GB - :param string/array files: Filename or an array of filenames of script/literature files to copy - :param string destination: Hostname of the destination server, which is the server to which the file will be copied. - :param string source: - Hostname of the source server, which is the server from which the file will be copied. - This argument is optional and if it's omitted the source will be the current server. - :returns: ``true`` if the copy was a success. - - Copies a script or literature (.lit) file(s) to another server. The - ``files`` argument can be either a string specifying a single file to copy, - or an array of strings specifying multiple files to copy. - - If the ``files`` argument is an array then this function will return true if - at least one of the files in the array is successfully copied. - - Example: - - .. code-block:: javascript - - //Copies "hack-template.script" from the current server to "foodnstuff" - ns.scp("hack-template.script", "foodnstuff"); // returns: true - - //Copies "foo.lit" from the helios server to the "home" computer - ns.scp("foo.lit", "home", "helios"); // returns: true - - //Tries to copy three files from "rothman-uni" to "home" computer - const files = ["foo1.lit", "foo2.script", "foo3.script"]; - ns.scp(files, "home", "rothman-uni"); // returns: true diff --git a/doc/source/netscript/basicfunctions/scriptKill.rst b/doc/source/netscript/basicfunctions/scriptKill.rst deleted file mode 100644 index 0eef48cad..000000000 --- a/doc/source/netscript/basicfunctions/scriptKill.rst +++ /dev/null @@ -1,18 +0,0 @@ -scriptKill() Netscript Function -=============================== - -.. js:function:: scriptKill(scriptname, hostname) - - :RAM cost: 1 GB - :param string scriptname: Filename of script to kill. case-sensitive. - :param string hostname: Hostname of target server. - :returns: ``true`` if any scripts were killed. - - Kills all scripts with the specified filename on the target server specified - by ``hostname``, regardless of arguments. - - Example: - - .. code-block:: javascript - - ns.scriptKill("demo.js", "home"); // returns: true diff --git a/doc/source/netscript/basicfunctions/scriptRunning.rst b/doc/source/netscript/basicfunctions/scriptRunning.rst deleted file mode 100644 index 922b79da0..000000000 --- a/doc/source/netscript/basicfunctions/scriptRunning.rst +++ /dev/null @@ -1,30 +0,0 @@ -scriptRunning() Netscript Function -================================== - -.. js:function:: scriptRunning(scriptname, hostname) - - :RAM cost: 1 GB - :param string scriptname: Filename of script to check. case-sensitive. - :param string hostname: Hostname of target server. - :returns: ``true`` if any script with that file name is running on that - server. - - This is different than the :doc:`isRunning` function because it - does not try to identify a specific instance of a running script by its - arguments. - - Examples: - - The example below will return true if there is any script named - ``foo.js`` running on the ``foodnstuff`` server, and false otherwise: - - .. code-block:: javascript - - ns.scriptRunning("foo.js", "foodnstuff"); - - The example below will return true if there is any script named - ``foo.js`` running on the current server, and false otherwise: - - .. code-block:: javascript - - ns.scriptRunning("foo.js", ns.getHostname()); diff --git a/doc/source/netscript/basicfunctions/serverExists.rst b/doc/source/netscript/basicfunctions/serverExists.rst deleted file mode 100644 index 55b9010fa..000000000 --- a/doc/source/netscript/basicfunctions/serverExists.rst +++ /dev/null @@ -1,14 +0,0 @@ -serverExists() Netscript Function -================================= - -.. js:function:: serverExists(hostname) - - :RAM cost: 0.1 GB - :param string hostname: Hostname of target server. - :returns: ``true`` if the target server exists. - - Example: - - .. code-block:: javascript - - ns.serverExists("foodnstuff"); // returns: true diff --git a/doc/source/netscript/basicfunctions/share.rst b/doc/source/netscript/basicfunctions/share.rst deleted file mode 100644 index cb63e452c..000000000 --- a/doc/source/netscript/basicfunctions/share.rst +++ /dev/null @@ -1,14 +0,0 @@ -share() Netscript Function -============================== - -.. js:function:: share() - - :RAM cost: 2.4 GB - - Increases your rep gain of all faction work types while share is called. Scales with thread count. - - Examples: - - .. code-block:: javascript - - while(true) await ns.share(); \ No newline at end of file diff --git a/doc/source/netscript/basicfunctions/sleep.rst b/doc/source/netscript/basicfunctions/sleep.rst deleted file mode 100644 index 6c06d2a8e..000000000 --- a/doc/source/netscript/basicfunctions/sleep.rst +++ /dev/null @@ -1,15 +0,0 @@ -sleep() Netscript Function -========================== - -.. js:function:: sleep([n = 0]) - - :RAM cost: 0 GB - :param number n: Number of milliseconds to sleep - - Suspends the script for n milliseconds. - - Example: - - .. code-block:: javascript - - await ns.sleep(3000); // Will wait 3 seconds. diff --git a/doc/source/netscript/basicfunctions/spawn.rst b/doc/source/netscript/basicfunctions/spawn.rst deleted file mode 100644 index ec3a1d4c4..000000000 --- a/doc/source/netscript/basicfunctions/spawn.rst +++ /dev/null @@ -1,25 +0,0 @@ -spawn() Netscript Function -========================== - -.. js:function:: spawn(script[, numThreads = 1[, args...]]) - - :RAM cost: 2 GB - :param string script: Filename of script to execute - :param number numThreads: Number of threads to spawn new script with. Has to be an integer. - :param args...: - Additional arguments to pass into the new script that is being run. - - Terminates the current script, and then after a delay of about 10 seconds it - will execute the newly-specified script. The purpose of this function is to - execute a new script without being constrained by the RAM usage of the - current one. This function can only be used to run scripts on the local - server. - - .. warning:: Running this function with a ``numThreads`` argument of 0 or - less will cause a runtime error. - - Example: - - .. code-block:: javascript - - ns.spawn('foo.js', 10, 'foodnstuff', 90); // "run foo.js foodnstuff 90 -t 10" in 10 seconds. diff --git a/doc/source/netscript/basicfunctions/sqlinject.rst b/doc/source/netscript/basicfunctions/sqlinject.rst deleted file mode 100644 index 970413389..000000000 --- a/doc/source/netscript/basicfunctions/sqlinject.rst +++ /dev/null @@ -1,16 +0,0 @@ -sqlinject() Netscript Function -============================== - -.. js:function:: sqlinject(hostname) - - :RAM cost: 0.05 GB - :param string hostname: Hostname of the target server. - - Runs the ``SQLInject.exe`` program on the target server. ``SQLInject.exe`` - must exist on your home computer. - - Example: - - .. code-block:: javascript - - ns.sqlinject("foodnstuff"); diff --git a/doc/source/netscript/basicfunctions/tFormat.rst b/doc/source/netscript/basicfunctions/tFormat.rst deleted file mode 100644 index 1085c5a0b..000000000 --- a/doc/source/netscript/basicfunctions/tFormat.rst +++ /dev/null @@ -1,19 +0,0 @@ -tFormat() Netscript Function -============================== - -.. js:function:: tFormat(milliseconds[, milliPrecision = false]) - - :RAM cost: 0 GB - - :param string milliseconds: Number of millisecond to format. - :param boolean milliPrecision: Format time with subsecond precision. - :returns: Formatted string. - - Format time to a readable string. - - Examples: - - .. code-block:: javascript - - ns.print(ns.tFormat(123456789)) //logs "1 day 10 hours 17 minutes 36 seconds" - ns.print(ns.tFormat(123456789,true)) //logs "1 day 10 hours 17 minutes 36.789 seconds" \ No newline at end of file diff --git a/doc/source/netscript/basicfunctions/tail.rst b/doc/source/netscript/basicfunctions/tail.rst deleted file mode 100644 index 66c5c5392..000000000 --- a/doc/source/netscript/basicfunctions/tail.rst +++ /dev/null @@ -1,34 +0,0 @@ -tail() Netscript Function -=============================== - -.. js:function:: tail([script, hostname[, numThreads=1[, args...]]]) - - :RAM cost: 0 GB - - :param string script: Filename of the script of which to open the logs. - :param string hostname: Hostname of the server on which the script is running on. - :param args...: Arguments to identify which script's log to open. - - Opens a script’s logs. This is functionally the same as the tail Terminal command. - - If the function is called with no arguments, it will open the current script’s logs. - - Examples: - - .. code-block:: javascript - - ns.tail("foo.js", "foodnstuff"); - ns.tail(); - -.. js:function:: tail(scriptPid) - - :RAM cost: 0 GB - :param number scriptPid: PID of the script of which to open the logs. - - Same as the above version but with pid. - - Example: - - .. code-block:: javascript - - ns.tail(12); \ No newline at end of file diff --git a/doc/source/netscript/basicfunctions/tprint.rst b/doc/source/netscript/basicfunctions/tprint.rst deleted file mode 100644 index 1398fea63..000000000 --- a/doc/source/netscript/basicfunctions/tprint.rst +++ /dev/null @@ -1,16 +0,0 @@ -tprint() Netscript Function -=========================== - -.. js:function:: tprint(args...) - - :RAM cost: 0 GB - :param args: Values to be printed - - Prints any number of values to the Terminal. - - Example: - - .. code-block:: javascript - - ns.tprint("Hello world!"); // Prints "Hello world!" to the terminal. - ns.tprint({a:5}); // Prints '{"a":5}' to the terminal. diff --git a/doc/source/netscript/basicfunctions/upgradePurchasedServer.rst b/doc/source/netscript/basicfunctions/upgradePurchasedServer.rst deleted file mode 100644 index 299ebbe0e..000000000 --- a/doc/source/netscript/basicfunctions/upgradePurchasedServer.rst +++ /dev/null @@ -1,27 +0,0 @@ -upgradePurchasedServer() Netscript Function -=================================== - -.. js:function:: upgradePurchasedServer(hostname, ram) - - :RAM cost: 0.25 GB - :param string hostname: Hostname of the purchased server. - :param number ram: Amount of RAM of the purchased server. Must be a power of - 2. Maximum value of :doc:`getPurchasedServerMaxRam` - :returns: ``true`` if the upgrade succeeded. - - Upgrades the purchased server with the specified hostname to have specified amount of RAM. - - The ``hostname`` argument can be any data type, but it will be converted to - a string and have whitespace removed. New RAM amount has to be higher than the current RAM - and a power of 2. Upgrading a server costs the difference of old RAM server cost and new RAM - server cost. - - Example: - - .. code-block:: javascript - - const ram = 64; - const name = "pserv-"; - for (const i = 0; i < 5; ++i) { - ns.upgradePurchasedServer(name + i, ram); - } diff --git a/doc/source/netscript/basicfunctions/weaken.rst b/doc/source/netscript/basicfunctions/weaken.rst deleted file mode 100644 index cb5647e9e..000000000 --- a/doc/source/netscript/basicfunctions/weaken.rst +++ /dev/null @@ -1,31 +0,0 @@ -weaken() Netscript Function -=========================== - -.. js:function:: weaken(hostname[, opts={}]) - - :RAM cost: 0.15 GB - :param string hostname: Hostname of the target server to weaken. - :param object opts: Optional parameters for configuring function behavior. Properties: - - * threads (*number*) - Number of threads to use for this function. - Must be less than or equal to the number of threads the script is running with. - :returns: The amount by which the target server's security level was - decreased. This is equivalent to 0.05 multiplied by the number of script - threads. - - Use your hacking skills to attack a server's security, lowering the server's - security level. The runtime for this command depends on your hacking level - and the target server's security level. This function lowers the security - level of the target server by 0.05. - - Like :doc:`hack` and :doc:`grow`, :doc:`weaken` can be - called on any server, regardless of where the script is running. This - command requires root access to the target server, but there is no required - hacking level to run the command. - - Example: - - .. code-block:: javascript - - await ns.weaken("foodnstuff"); - await ns.weaken("foodnstuff", { threads: 5 }); // Only use 5 threads to weaken diff --git a/doc/source/netscript/hacknetnodeapi/getCoreUpgradeCost.rst b/doc/source/netscript/hacknetnodeapi/getCoreUpgradeCost.rst deleted file mode 100644 index 09f0a5a82..000000000 --- a/doc/source/netscript/hacknetnodeapi/getCoreUpgradeCost.rst +++ /dev/null @@ -1,12 +0,0 @@ -getCoreUpgradeCost() Netscript Function -======================================= - -.. js:function:: getCoreUpgradeCost(i, n) - - :RAM cost: 0 GB - :param number i: Index of Hacknet Node. :ref:`See here for details ` - :param number n: Number of times to upgrade cores. Must be positive. Rounded to nearest integer - :returns: Cost of upgrading the number of cores of the specified Hacknet Node by ``n``. - - If an invalid value for ``n`` is provided, then this function returns ``0``. If the - specified Hacknet Node is already at the max number of cores, then ``Infinity`` is returned. diff --git a/doc/source/netscript/hacknetnodeapi/getLevelUpgradeCost.rst b/doc/source/netscript/hacknetnodeapi/getLevelUpgradeCost.rst deleted file mode 100644 index 683be393a..000000000 --- a/doc/source/netscript/hacknetnodeapi/getLevelUpgradeCost.rst +++ /dev/null @@ -1,12 +0,0 @@ -getLevelUpgradeCost() Netscript Function -======================================== - -.. js:function:: getLevelUpgradeCost(i, n) - - :RAM cost: 0 GB - :param number i: Index of Hacknet Node. :ref:`See here for details ` - :param number n: Number of levels to upgrade. Must be positive. Rounded to nearest integer - :returns: Cost of upgrading the specified Hacknet Node by ``n`` levels. - - If an invalid value for ``n`` is provided, then this function returns ``0``. If the - specified Hacknet Node is already at max level, then ``Infinity`` is returned. diff --git a/doc/source/netscript/hacknetnodeapi/getNodeStats.rst b/doc/source/netscript/hacknetnodeapi/getNodeStats.rst deleted file mode 100644 index 73da1ed06..000000000 --- a/doc/source/netscript/hacknetnodeapi/getNodeStats.rst +++ /dev/null @@ -1,28 +0,0 @@ -getNodeStats() Netscript Function -================================= - -.. warning:: This page contains spoilers for the game - -.. js:function:: getNodeStats(i) - - :RAM cost: 0 GB - :param number i: Index of Hacknet Node. :ref:`See here for details ` - :returns: Object containing a variety of stats about the specified Hacknet Node - - :: - - { - name: Node's name ("hacknet-node-5"), - level: Node's level, - ram: Node's RAM, - cores: Node's number of cores, - cache: Cache level. Only applicable for Hacknet Servers - hashCapacity: Hash Capacity provided by this Node. Only applicable for Hacknet Servers - production: Node's production per second - timeOnline: Number of seconds since Node has been purchased, - totalProduction: Total amount that the Node has produced - } - - .. note:: Note that for Hacknet Nodes, production refers to the amount of money the node generates. - For Hacknet Servers (the upgraded version of Hacknet Nodes), production refers to the amount - of hashes the node generates. diff --git a/doc/source/netscript/hacknetnodeapi/getPurchaseNodeCost.rst b/doc/source/netscript/hacknetnodeapi/getPurchaseNodeCost.rst deleted file mode 100644 index 0dd53c7a7..000000000 --- a/doc/source/netscript/hacknetnodeapi/getPurchaseNodeCost.rst +++ /dev/null @@ -1,7 +0,0 @@ -getPurchaseNodeCost() Netscript Function -======================================== - -.. js:function:: getPurchaseNodeCost() - - :RAM cost: 0 GB - :returns: Cost of purchasing a new Hacknet Node. diff --git a/doc/source/netscript/hacknetnodeapi/getRamUpgradeCost.rst b/doc/source/netscript/hacknetnodeapi/getRamUpgradeCost.rst deleted file mode 100644 index 1db422fb6..000000000 --- a/doc/source/netscript/hacknetnodeapi/getRamUpgradeCost.rst +++ /dev/null @@ -1,12 +0,0 @@ -getRamUpgradeCost() Netscript Function -====================================== - -.. js:function:: getRamUpgradeCost(i, n) - - :RAM cost: 0 GB - :param number i: Index of Hacknet Node. :ref:`See here for details ` - :param number n: Number of times to upgrade RAM. Must be positive. Rounded to nearest integer. - :returns: Cost of upgrading the RAM of the specified Hacknet Node ``n`` times. - - If an invalid value for ``n`` is provided, then this function returns ``0``. If the - specified Hacknet Node is already at max RAM, then ``Infinity`` is returned. diff --git a/doc/source/netscript/hacknetnodeapi/numNodes.rst b/doc/source/netscript/hacknetnodeapi/numNodes.rst deleted file mode 100644 index ef53758d1..000000000 --- a/doc/source/netscript/hacknetnodeapi/numNodes.rst +++ /dev/null @@ -1,7 +0,0 @@ -numNodes() Netscript Function -============================= - -.. js:function:: numNodes() - - :RAM cost: 0 GB - :returns: Number of Hacknet Nodes you own. diff --git a/doc/source/netscript/hacknetnodeapi/purchaseNode.rst b/doc/source/netscript/hacknetnodeapi/purchaseNode.rst deleted file mode 100644 index 2d198d940..000000000 --- a/doc/source/netscript/hacknetnodeapi/purchaseNode.rst +++ /dev/null @@ -1,11 +0,0 @@ -purchaseNode() Netscript Function -================================= - -.. js:function:: purchaseNode() - - :RAM cost: 0 GB - :returns: Index of the newly purchased node. -1 on failure. - - Purchases a new Hacknet Node. - This index is equivalent to the number at the end of the Hacknet Node's name - (e.g The Hacknet Node named 'hacknet-node-4' will have an index of 4). diff --git a/doc/source/netscript/hacknetnodeapi/upgradeCore.rst b/doc/source/netscript/hacknetnodeapi/upgradeCore.rst deleted file mode 100644 index 797fca393..000000000 --- a/doc/source/netscript/hacknetnodeapi/upgradeCore.rst +++ /dev/null @@ -1,11 +0,0 @@ -upgradeCore() Netscript Function -================================ - -.. js:function:: upgradeCore(i, n) - - :RAM cost: 0 GB - :param number i: Index of Hacknet Node. :ref:`See here for details ` - :param number n: Number of cores to purchase. Must be positive. Rounded to nearest integer - :returns: ``true`` if the upgrade was successful. - - Tries to purchase ``n`` cores for the specified Hacknet Node. diff --git a/doc/source/netscript/hacknetnodeapi/upgradeLevel.rst b/doc/source/netscript/hacknetnodeapi/upgradeLevel.rst deleted file mode 100644 index 498834c32..000000000 --- a/doc/source/netscript/hacknetnodeapi/upgradeLevel.rst +++ /dev/null @@ -1,11 +0,0 @@ -upgradeLevel() Netscript Function -================================= - -.. js:function:: upgradeLevel(i, n) - - :RAM cost: 0 GB - :param number i: Index of Hacknet Node. :ref:`See here for details ` - :param number n: Number of levels to purchase. Must be positive. Rounded to nearest integer - :returns: ``true`` if the upgrade was successful. - - Tries to upgrade the level of the specified Hacknet Node by *n*. diff --git a/doc/source/netscript/hacknetnodeapi/upgradeRam.rst b/doc/source/netscript/hacknetnodeapi/upgradeRam.rst deleted file mode 100644 index 9d2c7b569..000000000 --- a/doc/source/netscript/hacknetnodeapi/upgradeRam.rst +++ /dev/null @@ -1,13 +0,0 @@ -upgradeRam() Netscript Function -=============================== - -.. js:function:: upgradeRam(i, n) - - :RAM cost: 0 GB - :param number i: Index of Hacknet Node. :ref:`See here for details ` - :param number n: Number of times to upgrade RAM. Must be positive. Rounded to nearest integer. - :returns: ``true`` if the upgrade was successful. - - Tries to upgrade the specified Hacknet Node's RAM ``n`` times. Note that - each upgrade doubles the Node's RAM. So this is equivalent to multiplying - the Node's RAM by 2 :sup:`n`. diff --git a/doc/source/netscript/netscript1.rst b/doc/source/netscript/netscript1.rst deleted file mode 100644 index b2306a484..000000000 --- a/doc/source/netscript/netscript1.rst +++ /dev/null @@ -1,36 +0,0 @@ -.. _netscript1: - -Netscript 1.0 -============= - -.. note:: Note that NS1/.script is being deprecated, avoid using and migrate - scripts to NS2/.js if possible. - -Netscript 1.0 is implemented using a modified version of Neil Fraser's -`JS-Interpreter `_. - -This is an ES5 JavaScript interpreter. This means that (almost) any JavaScript feature -that is available in ES5 is also available in Netscript 1.0. However, this also means -that the interpreter does not natively support any JavaScript features introduced in versions -ES6 or after. - -If you are confused by the ES5/ES6/etc. terminology, consider reading this: -`WTF is ES6, ES8, ES2017, ECMAScript... `_ - -Netscript 1.0 scripts end with the ".script" extension in their filenames. - -Which ES6+ features are supported? ----------------------------------- - -Netscript 1.0 is a ES5 interpreter, but the following features from versions ES6 and -above are supported as well. - -* import - See :ref:`netscriptimporting` -* `Array `_ -* `Array find() `_ -* `Array findIndex() `_ -* `Array includes() `_ -* `String `_ -* `String endsWith() `_ -* `String includes() `_ -* `String startsWith() `_ diff --git a/doc/source/netscript/netscriptadvancedfunctions.rst b/doc/source/netscript/netscriptadvancedfunctions.rst deleted file mode 100644 index 0b32a5491..000000000 --- a/doc/source/netscript/netscriptadvancedfunctions.rst +++ /dev/null @@ -1,12 +0,0 @@ -Netscript Advanced Functions -============================ - -These Netscript functions become relevant later on in the game. They are put on a separate page because -they contain spoilers for the game. - -.. warning:: This page contains spoilers for the game - -.. toctree:: - - autocomplete() - Injecting HTML diff --git a/doc/source/netscript/netscriptfunctions.rst b/doc/source/netscript/netscriptfunctions.rst deleted file mode 100644 index a286ea979..000000000 --- a/doc/source/netscript/netscriptfunctions.rst +++ /dev/null @@ -1,78 +0,0 @@ -.. _netscriptfunctions: - -Netscript Basic Functions -========================= - -This page contains a subset of functions that are available in Bitburner. -For the complete list see https://github.com/bitburner-official/bitburner-src/tree/dev/markdown -This includes information such as function signatures, what they do, and their return values. - -.. toctree:: - :caption: Functions: - - hack() - grow() - weaken() - sleep() - print() - tprint() - tFormat() - nFormat() - formatNumber() - formatPercent() - formatRam() - disableLog() - enableLog() - isLogEnabled() - clearLog() - tail() - closeTail() - moveTail() - resizeTail() - scan() - nuke() - brutessh() - ftpcrack() - relaysmtp() - httpworm() - sqlinject() - run() - exec() - spawn() - kill() - killall() - scriptKill() - scriptRunning() - scp() - ls() - ps() - mv() - rm() - hasRootAccess() - getHostname() - getHackingLevel() - getHackingMultipliers() - getHacknetMultipliers() - getServerMoneyAvailable() - getServerMaxMoney() - getServerSecurityLevel() - getServerMinSecurityLevel() - getServerRequiredHackingLevel() - getServerNumPortsRequired() - getServerMaxRam() - getServerUsedRam() - serverExists() - fileExists() - isRunning() - purchaseServer() - deleteServer() - upgradePurchasedServer() - renamePurchasedServer() - getPurchasedServers() - getPurchasedServerLimit() - getPurchasedServerMaxRam() - getPurchasedServerCost() - getPurchasedServerUpgradeCost() - getScriptRam() - share() - getSharePower() \ No newline at end of file diff --git a/doc/source/netscript/netscripthacknetnodeapi.rst b/doc/source/netscript/netscripthacknetnodeapi.rst deleted file mode 100644 index 26d71ebcb..000000000 --- a/doc/source/netscript/netscripthacknetnodeapi.rst +++ /dev/null @@ -1,135 +0,0 @@ -.. _netscript_hacknetnodeapi: - -Netscript Hacknet Node API -========================== - -.. warning:: Not all functions in the Hacknet Node API are immediately available. - For this reason, the documentation for this API may contains spoilers - for the game. - -Netscript provides the following API for accessing and upgrading your Hacknet Nodes -through scripts. - -Note that none of these functions will write to the script's logs. If you want -to see what your script is doing you will have to print to the logs yourself. - -**Hacknet Node API functions must be accessed through the hacknet namespace** - -In Netscript 1.0:: - - hacknet.purchaseNode(); - hacknet.getNodeStats(3).level; - -In :ref:`netscriptjs`:: - - ns.hacknet.purchaseNode(); - ns.hacknet.getNodeStats(3).level; - -.. toctree:: - :caption: Hacknet Nodes API Functions: - - numNodes() - purchaseNode() - getPurchaseNodeCost() - getNodeStats() - upgradeLevel() - upgradeRam() - upgradeCore() - getLevelUpgradeCost() - getRamUpgradeCost() - getCoreUpgradeCost() - -.. _netscript_hacknetnodeapi_referencingahacknetnode: - -Referencing a Hacknet Node --------------------------- -Most of the functions in the Hacknet Node API perform an operation on a single -Node. Therefore, a numeric index is used to identify and specify which Hacknet -Node a function should act on. This index number corresponds to the number -at the end of the name of the Hacknet Node. For example, the first Hacknet Node you -purchase will have the name "hacknet-node-0" and is referenced using index 0. -The fifth Hacknet Node you purchase will have the name "hacknet-node-4" and is -referenced using index 4. - -RAM Cost --------- -Accessing the `hacknet` namespace incurs a one time cost of 4 GB of RAM. -In other words, using multiple Hacknet Node API functions in a script will not cost -more than 4 GB of RAM. - -Utilities ---------- -The following functions are not officially part of the Hacknet Node API, but they -can be useful when writing Hacknet Node-related scripts. Since they are not part -of the API, they do not need to be accessed using the *hacknet* namespace. - -* :js:func:`getHacknetMultipliers` - -Example(s) ----------- - -The following is an example of one way a script can be used to automate the -purchasing and upgrading of Hacknet Nodes. - -This script attempts to purchase Hacknet Nodes until the player has a total of 8. Then -it gradually upgrades those Node's to level 80, 16 GB RAM, and 8 cores - -.. code:: javascript - - export async function main(ns) { - function myMoney() { - return ns.getServerMoneyAvailable("home"); - } - - ns.disableLog("getServerMoneyAvailable"); - ns.disableLog("sleep"); - - const cnt = 8; - - while (ns.hacknet.numNodes() < cnt) { - res = ns.hacknet.purchaseNode(); - if (res != -1) ns.print("Purchased hacknet Node with index " + res); - await ns.sleep(1000); - }; - - ns.tprint("All " + cnt + " nodes purchased") - - for (const i = 0; i < cnt; i++) { - while (ns.hacknet.getNodeStats(i).level <= 80) { - var cost = ns.hacknet.getLevelUpgradeCost(i, 1); - while (myMoney() < cost) { - ns.print("Need $" + cost + " . Have $" + myMoney()); - await ns.sleep(3000); - } - res = ns.hacknet.upgradeLevel(i, 1); - }; - }; - - ns.tprint("All nodes upgraded to level 80"); - - for (var i = 0; i < cnt; i++) { - while (ns.hacknet.getNodeStats(i).ram < 16) { - var cost = ns.hacknet.getRamUpgradeCost(i, 1); - while (myMoney() < cost) { - ns.print("Need $" + cost + " . Have $" + myMoney()); - await ns.sleep(3000); - } - res = ns.hacknet.upgradeRam(i, 1); - }; - }; - - ns.tprint("All nodes upgraded to 16GB RAM"); - - for (var i = 0; i < cnt; i++) { - while (ns.hacknet.getNodeStats(i).cores < 8) { - var cost = ns.hacknet.getCoreUpgradeCost(i, 1); - while (myMoney() < cost) { - ns.print("Need $" + cost + " . Have $" + myMoney()); - await ns.sleep(3000); - } - res = ns.hacknet.upgradeCore(i, 1); - }; - }; - - ns.tprint("All nodes upgraded to 8 cores"); - } \ No newline at end of file diff --git a/doc/source/netscript/netscriptjs.rst b/doc/source/netscript/netscriptjs.rst deleted file mode 100644 index 70d5fc12c..000000000 --- a/doc/source/netscript/netscriptjs.rst +++ /dev/null @@ -1,154 +0,0 @@ -.. _netscriptjs: - -NS2 -=== -The improved version of Netscript that -allows users to write full-fledged Javascript code in their scripts, while -still being able to access the Netscript functions. - -ns2 was developed primarily by `Github user jaguilar `_ - -On top of having almost all of the features and capabilities of JavaScript, ns2 is also -significantly faster than ns1. - -This documentation will not go over any of the additional features of ns2, since -there is plenty of documentation on Javascript available on the web. - -Browser compatibility ---------------------- -As of the time of writing this, a few browsers do not support `dynamic import `_ functionality and therefore cannot run ns2 scripts. These browsers will thus only be capable of using ns1. - -How to use ns2 ----------------------- -Working with ns2 scripts is the same as ns1 scripts. The only difference -is that ns2 scripts use the ".js" extension rather than ".script". E.g.:: - - $ nano foo.js - $ run foo.js -t 100 arg1 arg2 arg3 - exec("foo.js", "purchasedServer1", "100", "randomArg"); - -The caveat when using ns2 to write scripts is that your code must be -asynchronous. Furthermore, instead of using the global scope and executing your code -sequentially, ns2 uses a :code:`main()` function as an entry point. - -Furthermore, the "Netscript environment" must be passed into a ns2 script through -the main function. This environment includes all of the pre-defined Netscript functions -(:code:`hack()`, :code:`exec`, etc.) as well as the arguments you pass to the script. - -Therefore, the signature of the :code:`main()` function must be:: - - export async function main(ns) { - ns.print("Starting script here"); - await ns.hack("foodnstuff"); //Use Netscript hack function - ns.print(ns.args); //The script arguments must be prefaced with ns as well - } - -Here is a summary of all rules you need to follow when writing Netscript JS code: - -* Write :code:`await` before any call to the following Netscript functions: - - * hack - * grow - * weaken - * sleep - * asleep - * prompt - * wget - -* Any function that contains :code:`await` must be declared as :code:`async` - -* Always :code:`await` any function that is marked as :code:`async` - -* Any functions that you want to be visible from other scripts must be marked with :code:`export`. - -* **Do not write any infinite loops without using a** :code:`sleep` **or one of the timed Netscript functions like** :code:`hack`. Doing so will freeze your game. - -* Any global variable declared in a ns2 script is shared between all instances of that - script. For example, assume you write a script *foo.js* and declared a global variable like so:: - - //foo.js - let globalVariable; - - export async function main(ns) { - globalVariable = ns.args.length; - while(true) { - ns.tprint(globalVariable); - await ns.sleep(3000); - } - } - - Then, you ran multiple instances of *foo.js*:: - - $ run foo.js 1 - $ run foo.js 1 2 3 - $ run foo.js 1 2 3 4 5 - - Then all three instances of foo.js will share the same instance of :code:`globalVariable`. - (In this example, the value of :code:`globalVariable` will be set to 5 because the - last instance of *foo.js* to run has 5 arguments. This means that all three instances of - the script will repeatedly print the value 5). - - These global variables can be thought of as `C++ static class members `_, - where a ns2 script is a class and a global variable is a static member within that class. - -Example -------- - -early-hack-template.script - -.. code-block:: javascript - - var target = args[0]; - var moneyThresh = getServerMaxMoney(target) * 0.75; - var securityThresh = getServerMinSecurityLevel(target) + 5; - if (fileExists("BruteSSH.exe", "home")) { - brutessh(target); - } - nuke(target); - while(true) { - if (getServerSecurityLevel(target) > securityThresh) { - weaken(target); - } else if (getServerMoneyAvailable(target) < moneyThresh) { - grow(target); - } else { - hack(target); - } - } - -early-hack-template.js - -.. code-block:: javascript - - export async function main(ns) { - var target = ns.args[0]; - var moneyThresh = ns.getServerMaxMoney(target) * 0.75; - var securityThresh = ns.getServerMinSecurityLevel(target) + 5; - if (ns.fileExists("BruteSSH.exe", "home")) { - ns.brutessh(target); - } - ns.nuke(target); - while(true) { - if (ns.getServerSecurityLevel(target) > securityThresh) { - await ns.weaken(target); - } else if (ns.getServerMoneyAvailable(target) < moneyThresh) { - await ns.grow(target); - } else { - await ns.hack(target); - } - } - } - -What's with the weird comment ------------------------------ - -You may have noticed that every new ns2 file will contains the following comment. - -.. code-block:: javascript - - /** @param {NS} ns */ - -This comment is used to help the text editor autocomplete functions in the Netscript API. You can enable it by pressing ctrl+space after `ns.` - -.. image:: autocomplete.png - -The comment can be safely removed but it is recommended to keep it as it will help you. diff --git a/doc/source/netscript/netscriptlearntoprogram.rst b/doc/source/netscript/netscriptlearntoprogram.rst deleted file mode 100644 index fe71c6a28..000000000 --- a/doc/source/netscript/netscriptlearntoprogram.rst +++ /dev/null @@ -1,69 +0,0 @@ -.. _netscriptlearntoprogram: - -Learn to Program in Netscript -============================= -Netscript is simply a subset of -`JavaScript `_, -with some additional functions added in to allow interaction with the game. - -For Beginner Programmers ------------------------- -If you have little to no programming experience, that's okay! You don't need to be -a great programmer in order to enjoy or play this game. In fact, this game could -help you learn some basic programming concepts. - -Here are some good tutorials for learning programming/JavaScript as a beginner: - -* `Learn-JS `_ -* `programiz `_ -* `Speaking JavaScript `_ - This is a bit on the longer side. You can skip all of the historical - background stuff. Recommended chapters: 1, 7-18 - -For Experienced Programmers ---------------------------- -The following section lists several good tutorials/resources for those who have experience -programming but who have not worked extensively with JavaScript before. - -Before that, however, it's important to clarify some terminology about the different -versions of JavaScript. These are summarized in this article: - -`WTF is ES6, ES8, ES2017, ECMAScript... `_ - -An important takeaway from this article is that ES6, also known as ES2015, introduced -many major features that are commonly seen in modern JavaScript programming. However, this -means that ES5 engines and interpreters will fail if they encounters these ES6 features. You'll see why this -is important further down. - -* `MDN Introduction to JS `_ -* `Eloquent JavaScript (ES6+) `_ - Recommended Chapters: Introduction, 1-6 -* `Modern Javascript Tutorial (ES6+) `_ - Recommended Chapters: 2, 4-6 - -Netscript 1.0 vs Netscript 2.0 ------------------------------- -There are two versions of Netscript: - -* :doc:`netscript1` -* :doc:`netscriptjs` - -Visit the pages above to get more details about each version. Note that :doc:`netscript1` is being depprecated, -so I'd recommend migrating any scripts using it to :doc:`netscriptjs` - -Here is a short summary of the differences between Netscript 1.0 and Netscript 2.0: - -**Netscript 1.0** - -* ES5 -* Some ES6 features implemented with polyfills -* Slow compared to NetscriptJS (interpreter runs at the "Netscript Exec Time" speed configured in options) -* Compatible with all browsers - -**Netscript JS (Netscript 2.0)** - -* Supports (almost) all features of modern JavaScript -* Extremely fast - code is executed as an Async Function -* Works on most modern browsers. -* Each script becomes a module and therefore all instances of that script can easily - share data between each other (essentially global/static variables) diff --git a/doc/source/netscript/netscriptmisc.rst b/doc/source/netscript/netscriptmisc.rst deleted file mode 100644 index eaefc381f..000000000 --- a/doc/source/netscript/netscriptmisc.rst +++ /dev/null @@ -1,238 +0,0 @@ -.. _netscript_misc: - -Netscript Miscellaneous -======================= - -.. _netscript_ports: - -Netscript Ports ---------------- -Netscript Ports are endpoints that can be used to communicate between scripts and across servers. -A port is implemented as a sort of serialized queue, where you can only write -and read one element at a time from the port. Only string and number types may be written to ports. When you read data from a port, -the element that is read is removed from the port. - -The :js:func:`read`, :js:func:`write`, :js:func:`tryWrite`, :js:func:`clear`, and :js:func:`peek` -Netscript functions can be used to interact with ports. - -When using the functions above, the ports are specified by passing the number as the first argument and the value as the second. -The default maximum capacity of a port is 50, but this can be changed in Options > System. Setting this too high can cause the game to use a lot of memory. - -.. important:: The data inside ports are not saved! This means if you close and re-open the game, or reload the page then you will lose all of the data in the ports! - -**Example Usage** - -Here's a brief example of how ports work. For the sake of simplicity we'll only deal with port 1. - -Let's assume Port 1 starts out empty (no data inside). We'll represent the port as such:: - - [] - -Now assume we ran the following simple script - -.. code:: javascript - - export async function main(ns) { - for (var i = 0; i < 10; ++i) { - ns.writePort(1, i); //Writes the value of i to port 1 - } - } - -After this script executes, our script will contain every number from 0 through 9, as so:: - - [0, 1, 2, 3, 4, 5, 6, 7 , 8, 9] - -Then, assume we run the following script - -.. code:: javascript - - export async function main(ns) { - for (var i = 0; i < 3; ++i) { - ns.print(ns.readPort(1)); //Reads a value from port 1 and then prints it - } - } - -This script above will read the first three values from port 1 and then print them to the script's log. The log will end up looking like:: - - 0 - 1 - 2 - -And the data in port 1 will look like:: - - [3, 4, 5, 6, 7, 8, 9] - -.. warning:: In :ref:`netscriptjs`, do not try writing base - `Promises `_ - to a port. - -**Port Handles** - -.. warning:: Port Handles only work in :ref:`netscriptjs`. They do not work in :ref:`netscript1` - -The :js:func:`getPortHandle` Netscript function can be used to get a handle to a Netscript Port. -This handle allows you to access several new port-related functions. The functions are: - -.. js:method:: NetscriptPort.writePort(data) - - :param data: Data to write to the port - :returns: If the port is full, the item that is removed from the port is returned. - Otherwise, null is returned. - - Writes `data` to the port. Works the same as the Netscript function `write`. - -.. js:method:: NetscriptPort.tryWritePort(data) - - :param data: Data to try to write to the port - :returns: True if the data is successfully written to the port, and false otherwise. - - Attempts to write `data` to the Netscript port. If the port is full, the data will - not be written. Otherwise, the data will be written normally. - -.. js::method:: NetscriptPort.readPort() - - :returns: The data read from the port. If the port is empty, "NULL PORT DATA" is returned - - Removes and returns the first element from the port. - Works the same as the Netscript function `read` - -.. js::method:: NetscriptPort.peek() - - :returns: The first element in the port, or "NULL PORT DATA" if the port is empty. - - Returns the first element in the port, but does not remove it. - Works the same as the Netscript function `peek` - -.. js:method:: NetscriptPort.full() - - :returns: True if the Netscript Port is full, and false otherwise - -.. js:method:: NetscriptPort.empty() - - :returns: True if the Netscript Port is empty, and false otherwise - -.. js:method:: NetscriptPort.clear() - - Clears all data from the port. Works the same as the Netscript function `clear` - -Port Handle Example - -.. code:: javascript - - export async function main(ns) { - port = ns.getPortHandle(5); - back = port.data.pop(); //Get and remove last element in port - - //Wait for port data before reading - while(port.empty()) { - await ns.sleep(10000); - } - res = port.read(); - - //Wait for there to be room in a port before writing - while (!port.tryWrite(5)) { - await ns.sleep(5000); - } - - //Successfully wrote to port! - } - -Comments --------- -Netscript supports comments using the same syntax as `Javascript comments `_. -Comments are not evaluated as code, and can be used to document and/or explain code:: - - //This is a comment and will not get executed even though its in the code - /* Multi - * line - * comment */ - ns.print("This code will actually get executed"); - -.. _netscriptimporting: - -Importing Functions -------------------- - -In Netscript you can import functions that are declared in other scripts. -The script will incur the RAM usage of all imported functions. -There are two ways of doing this:: - - import * as namespace from "script filename"; //Import all functions from script - import {fn1, fn2, ...} from "script filename"; //Import specific functions from script - -Suppose you have a library script called *testlibrary.js*:: - - -.. code:: javascript - - export function foo1(args) { - //function definition... - } - - export function foo2(args) { - //function definition... - } - - export async function foo3(args) { - //function definition... - } - - export function foo4(args) { - //function definition... - } - - export async function main(ns) { - //main function definition, can be empty but must exist... - } - -Then, if you wanted to use these functions in another script, you can import them like so:: - -.. code:: javascript - - import * as testlib from "testlibrary.js"; - - export async function main(ns) { - const values = [1,2,3]; - - //The imported functions must be specified using the namespace - const someVal1 = await testlib.foo3(...values); //'...' separates the array into separate values - const someVal2 = testlib.foo1(values[0]); - if (someVal1 > someVal2) { - //... - } else { - //... - } - } - -If you only wanted to import certain functions, you can do so without needing -to specify a namespace for the import - -.. code:: javascript - - import {foo1, foo3} from "testlibrary.js"; //Saves RAM since not all functions are imported! - - export async function main(ns) { - const values = [1,2,3]; - - //No namespace needed - const someVal1 = await foo3(...values); - const someVal2 = foo1(values[1]); - if (someVal1 > someVal2) { - //... - } else { - //... - } - } - -.. warning:: Note that the `export` keyword can **NOT** be used in :ref:`netscript1` as it's not supported. - It can, however, be used in :ref:`netscriptjs` (but it's not required). - -Standard, Built-In JavaScript Objects -------------------------------------- -Standard built-in JavaScript objects such as -`Math `_, -`Date `_, -`Number `_, -and others are supported as expected based on which version -of Netscript you use (i.e. :ref:`netscript1` will support built-in objects that are -defined in ES5, and :ref:`netscriptjs` will support whatever your browser supports). diff --git a/doc/source/netscript/netscriptscriptarguments.rst b/doc/source/netscript/netscriptscriptarguments.rst deleted file mode 100644 index 81c72c125..000000000 --- a/doc/source/netscript/netscriptscriptarguments.rst +++ /dev/null @@ -1,58 +0,0 @@ -.. _netscript_script_arguments: - -Netscript Script Arguments -========================== - -Arguments passed into a script can be accessed in Netscript using a -special array called ``args``. The arguments can be accessed using a -normal array using the ``[]`` operator (``args[0]``, ``args[1]``, etc...). -These arguments can be string, number, or boolean. - -For example, let's say we want to make a generic script -``generic-run.script`` and we plan to pass two arguments into that script. -The first argument will be the name of another script, and the second -argument will be a number. This generic script will run the -script specified in the first argument with the amount of threads -specified in the second argument. The code would look like: - -.. code:: javascript - - var fileName = args[0]; - var threads = args[1]; - run(fileName, threads); - -And it could be ran from the terminal like: - -``run generic-run.script myscript.script 7`` - -In .js / ns2, the above script would look like: - -.. code:: javascript - - export async function main(ns) { - let fileName = ns.args[0]; - let threads = ns.args[1]; - ns.run(fileName, threads); - } - -It is also possible to get the number of arguments that were passed -into a script using ``args.length``. - -If we want to make a script like ``foo.js`` that gets 2 arguments: a string to print -and a number of time to print that string, the code could look like: - -.. code:: javascript - - export async function main(ns) { - for (let i=0; i - fragmentDefinitions() - placedFragments() - clear() - canPlace() - place() - fragmentAt() - deleteAt() \ No newline at end of file diff --git a/doc/source/shortcuts.rst b/doc/source/shortcuts.rst deleted file mode 100644 index 492f0d867..000000000 --- a/doc/source/shortcuts.rst +++ /dev/null @@ -1,89 +0,0 @@ -.. _shortcuts: - -Keyboard Shortcuts -================== -This page documents the various keyboard shortcuts that can be used in the game. - -Game Navigation ---------------- -These are used to switch between the different menus/tabs in the game. -These shortcuts are almost always available. Exceptions include: - -* Working at a company or for a faction -* Creating a program -* Taking a university class -* Training at a gym -* Active Mission (aka Hacking Mission) - -========== =========================================================================== -Shortcut Action -========== =========================================================================== -Alt + t Switch to :ref:`terminal` -Alt + c Switch to 'Stats' page -Alt + e Switch to Script Editor. Will open up the last-edited file or a new file -Alt + s Switch to 'Active Scripts' page -Alt + h Switch to 'Hacknet Nodes' page -Alt + w Switch to 'City' page -Alt + j Go to the company where you are employed ('Job' page on navigation menu) -Alt + r Go to Travel Agency in current City ('Travel' page on navigation menu) -Alt + p Switch to 'Create Program' page -Alt + f Switch to 'Factions' page -Alt + a Switch to 'Augmentations' page -Alt + u Switch to 'Tutorial' page -Alt + o Switch to 'Options' page -Alt + g Switch to 'Gang' page -Alt + b Switch to 'Bladeburner' page -========== =========================================================================== - -Terminal Shortcuts ------------------- -These shortcuts are available only in the :ref:`terminal` - -============= =========================================================================== -Shortcut Action -============= =========================================================================== -Up/Down arrow Cycle through previous commands -Ctrl + c Cancel a hack/analyze action -Ctrl + l Clear screen -Tab Autocomplete command -============= =========================================================================== - -Terminal Bash Shortcuts ------------------------ -These shortcuts were implemented to better emulate a bash shell. They must be enabled -in your :ref:`terminal`'s *.fconf* file. This can be done be entering the Terminal command:: - - nano .fconf - -and then setting the *ENABLE_BASH_HOTKEYS* option to 1. - -**Note that these Bash shortcuts override any other shortcuts defined in the game (unless otherwise noted), -as well as your browser's shortcuts** - -**Also note that more Bash-like shortcuts will be implemented in the future** - -============= =========================================================================== -Shortcut Action -============= =========================================================================== -Ctrl + c Clears current Terminal input (does NOT override default Ctrl + c command) -Ctrl + p Same as Up Arrow -Ctrl + m Same as Down Arrow -Ctrl + a Move cursor to beginning of line (same as 'Home' key) -Ctrl + e Move cursor to end of line (same as 'End' key) -Ctrl + b Move cursor to previous character -Alt + b Move cursor to previous word -Ctrl + f Move cursor to next character -Alt + f Move cursor to next word -Ctrl + h/d Delete previous character ('Backspace') -============= =========================================================================== - -Popup/Dialog Box Shortcuts --------------------------- -The following shortcuts work if there are any popup or dialog boxes on the screen. - -============= =========================================================================== -Shortcut Action -============= =========================================================================== -Esc Close the current popup, cancelling any prompts on a dialog box -Enter Clicks the "Yes/Confirm" option for every dialog box -============= =========================================================================== diff --git a/doc/source/toolsandresources.rst b/doc/source/toolsandresources.rst deleted file mode 100644 index 7adb890a0..000000000 --- a/doc/source/toolsandresources.rst +++ /dev/null @@ -1,23 +0,0 @@ -Tools & Resources -================= - -Official Script Repository --------------------------- -There are plans to create an official repository of Bitburner scripts. As of right now, -this is not a priority and has not been started. However, if you'd like -to contribute scripts now, you can find the repository -`here `_ and submit pull requests. - -Visual Studio Code Extension ----------------------------- -One user created a Bitburner extension for the Visual Studio Code (VSCode) editor. - -This extension includes several features such as: - -* Dynamic RAM calculation -* RAM Usage breakdown -* Typescript definition files with jsdoc comments -* Netscript syntax highlighting - -You can find more information and download links -`on this reddit post `_. diff --git a/doc/source/v1.0.0_migration.rst b/doc/source/v1.0.0_migration.rst deleted file mode 100644 index fe58dfb48..000000000 --- a/doc/source/v1.0.0_migration.rst +++ /dev/null @@ -1,37 +0,0 @@ -v1.0.0 Migration Guide -====================== - -In v1.0.0 a few API have been broken. - -migrated (only for ns2): - -* bladeburner.getActionTime will return milliseconds instead of seconds. -* getHackTime will return milliseconds instead of seconds. -* getGrowTime will return milliseconds instead of seconds. -* getWeakenTime will return milliseconds instead of seconds. -* hackAnalyzePercent renamed to hackAnalyze -* hackAnalyzePercent will return decimal instead of percentage -* hackChance (not formulas.basic.hackChance) renamed to hackAnalyzeChance -* formulas.basic is split into formulas.skills and formulas.hacking - -not migrated (require manual changes sometimes): - -* getPlayer().hacking_skill renamed `hacking` -* same thing in sleeves -* getPurchasedServers won't let you query for ips instead of hostnames. -* getStats is deprecated in favor getPlayer -* getCharacterInformation is deprecated in favor getPlayer -* getServerRam deprecated in favor of getServerMaxRam and getServerUsedRam -* getServerBaseSecurityLevel will be deprecated in favor of nothing, it's not really used. -* sleep can no longer be called simultaneously, a new function called asleep will let you. -* write returns promise (needs to be await ed). -* scp returns a promise (needs to be await ed). -* free port, write, read -* write, read does not support port anymore, writePort and readPort does. - -Upon loading v1.0.0 the game will apply some rules to change everything. -The game never changes a file before making a backup called `BACKUP_filename.ext`, then, -in the script it will change whatever it thinks it should change. -But will prefix the modified line with the original line. - -A file called `v1_DETECTED_CHANGES.txt` will point out every file with some possible problem. diff --git a/doc/source/v2.0.0_migration.rst b/doc/source/v2.0.0_migration.rst deleted file mode 100644 index a211ce554..000000000 --- a/doc/source/v2.0.0_migration.rst +++ /dev/null @@ -1,109 +0,0 @@ -v2.0.0 Migration Guide -====================== - -In v2.0.0 a few more APIs have been broken. - -Working -------- - - Working has been rebuilt from the ground up. The motivation for this change is that all - different types of work all required different cached variables on the main Player object. - This caused a lot of bugs and crashes. It's been reworked in such a way as to prevent bugs - and make it nearly trivial to add new kinds of work. - All work types give their reward immediately. No need to stop work to bank rewards like reputation. - Faction and Company work no longer have a time limit. - Company work no longer reduces rep gain by half for quitting early. - Company factions now require 400k rep to join (up from 200k). - Backdooring a company server reduces faction requirement to 300k. - All types of work generally no longer keep track of cumulative gains like exp and reputation since it's applied instantly. - -commitCrime ------------ - - Crime now loops, meaning after finishing one shoplift you start the next one with no input. While the signature - has not changed, its behavior has. It also has a new 'focus' parameter. - -getPlayer ---------- - - The following work-related fields are no longer included: - - * workChaExpGained - * currentWorkFactionName - * workDexExpGained - * workHackExpGained - * createProgramReqLvl - * workStrExpGained - * companyName - * crimeType - * workRepGained - * workChaExpGainRate - * workType - * workStrExpGainRate - * isWorking - * workRepGainRate - * workDefExpGained - * currentWorkFactionDescription - * workHackExpGainRate - * workAgiExpGainRate - * workDexExpGainRate - * workMoneyGained - * workMoneyLossRate - * workMoneyGainRate - * createProgramName - * workDefExpGainRate - * workAgiExpGained - * className - - The reason for this, is that these fields are all, in one way or another, included in the new work field 'currentWork'. - Some of these values are also irrelevant. - Take a look at the new singularity.getCurrentWork function: - - All fields ending in _mult have been moved to the 'mults' struct. - For example: getPlayer().hacking_skill_mult => getPlayer().mults.hacking_skill - - skills has been moved to the skills struct - For example: getPlayer().hacking => getPlayer().skills.hacking - - exp has been moved to the exp struct - For example: getPlayer().hacking_exp => getPlayer().exp.hacking - - hp has been moved to the hp struct - For example: getPlayer().max_hp => getPlayer().hp.max or hp.current - - hasWseAccount, hasTixApiAccess, has4SData, has4SDataTixApi have been removed and replaced with similar stock functions. - -workForCompany --------------- - - The argument 'companyName' is now required. - - -getScriptIncome & getScriptExpGain ----------------------------------- - - These two functions used to have a call where, if no arguments were provided, it would return the total for all scripts. This caused weird signature. - If you want to get the total income/exp for all scripts, use the new getTotalScriptIncome / getTotalScriptExpGain instead. - -scp ---- - - The last two arguments of spc have been reversed. The signature is now scp(files, destination, optional_source) - -Singularity ------------ - - The top level singularity functions were deprecated a while ago in favor of the singularity namespace. - This means calls like 'ns.connect' need to be changed to 'ns.singularity.connect' - - -stock.buy, stock.sell, stock.short ----------------------------------- - - These functions were renamed to stock.buyStock, stock.sellStock, and stock.buyShort because 'buy', 'sell', and 'short' - are very common tokens that would trick the ram calculation. - -corporation.bribe ------------------ - - The ability to give shares as a bribe has been removed. The signature is now bribe(faction, money) diff --git a/doc/source/ystatic/agogo.css b/doc/source/ystatic/agogo.css deleted file mode 100644 index 10689d6a1..000000000 --- a/doc/source/ystatic/agogo.css +++ /dev/null @@ -1,551 +0,0 @@ -/* - * agogo.css_t - * ~~~~~~~~~~~ - * - * Sphinx stylesheet -- agogo theme. - * - * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -* { - margin: 0px; - padding: 0px; -} - -body { - font-family: "Verdana", Arial, sans-serif; - line-height: 1.4em; - color: black; - background-color: #eeeeec; -} - -/* Page layout */ - -div.header, -div.content, -div.footer { - width: 70em; - margin-left: auto; - margin-right: auto; -} - -div.header-wrapper { - background: #555573 url(bgtop.png) top left repeat-x; - border-bottom: 3px solid #2e3436; -} - -/* Default body styles */ -a { - color: #ce5c00; -} - -div.bodywrapper a, -div.footer a { - text-decoration: underline; -} - -.clearer { - clear: both; -} - -.left { - float: left; -} - -.right { - float: right; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -h1, -h2, -h3, -h4 { - font-family: "Georgia", "Times New Roman", serif; - font-weight: normal; - color: #3465a4; - margin-bottom: 0.8em; -} - -h1 { - color: #204a87; -} - -h2 { - padding-bottom: 0.5em; - border-bottom: 1px solid #3465a4; -} - -a.headerlink { - visibility: hidden; - color: #dddddd; - padding-left: 0.3em; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -img { - border: 0; -} - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 2px 7px 1px 7px; - border-left: 0.2em solid black; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -dt:target, -.highlighted { - background-color: #fbe54e; -} - -/* Header */ - -div.header { - padding-top: 10px; - padding-bottom: 10px; -} - -div.header .headertitle { - font-family: "Georgia", "Times New Roman", serif; - font-weight: normal; - font-size: 180%; - letter-spacing: 0.08em; - margin-bottom: 0.8em; -} - -div.header .headertitle a { - color: white; -} - -div.header div.rel { - margin-top: 1em; -} - -div.header div.rel a { - color: #fcaf3e; - letter-spacing: 0.1em; - text-transform: uppercase; -} - -p.logo { - float: right; -} - -img.logo { - border: 0; -} - -/* Content */ -div.content-wrapper { - background-color: white; - padding-top: 20px; - padding-bottom: 20px; -} - -div.document { - width: 50em; - float: left; -} - -div.body { - padding-right: 2em; - text-align: justify; -} - -div.document h1 { - line-height: 120%; -} - -div.document ul { - margin: 1.5em; - list-style-type: square; -} - -div.document dd { - margin-left: 1.2em; - margin-top: 0.4em; - margin-bottom: 1em; -} - -div.document .section { - margin-top: 1.7em; -} -div.document .section:first-child { - margin-top: 0px; -} - -div.document div.highlight { - padding: 3px; - background-color: #eeeeec; - border-top: 2px solid #dddddd; - border-bottom: 2px solid #dddddd; - margin-top: 0.8em; - margin-bottom: 0.8em; -} - -div.document div.literal-block-wrapper { - margin-top: 0.8em; - margin-bottom: 0.8em; -} - -div.document div.literal-block-wrapper div.highlight { - margin: 0; -} - -div.document div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.document div.code-block-caption span.caption-text { -} - -div.document h2 { - margin-top: 0.7em; -} - -div.document p { - margin-bottom: 0.5em; -} - -div.document li.toctree-l1 { - margin-bottom: 1em; -} - -div.document .descname { - font-weight: bold; -} - -div.document .sig-paren { - font-size: larger; -} - -div.document .docutils.literal { - background-color: #eeeeec; - padding: 1px; -} - -div.document .docutils.xref.literal { - background-color: transparent; - padding: 0px; -} - -div.document blockquote { - margin: 1em; -} - -div.document ol { - margin: 1.5em; -} - -/* Sidebar */ - -div.sidebar { - width: 20em; - position: fixed; - right: 10%; - height: 75%; - font-size: 0.9em; - overflow-y: auto; -} -/* -div.sidebar { - width: 20em; - float: right; - font-size: .9em; -} -*/ - -div.sidebar a, -div.header a { - text-decoration: none; -} - -div.sidebar a:hover, -div.header a:hover { - text-decoration: underline; -} - -div.sidebar h3 { - color: #2e3436; - text-transform: uppercase; - font-size: 130%; - letter-spacing: 0.1em; -} - -div.sidebar ul { - list-style-type: none; -} - -div.sidebar li.toctree-l1 a { - display: block; - padding: 1px; - border: 1px solid #dddddd; - background-color: #eeeeec; - margin-bottom: 0.4em; - padding-left: 3px; - color: #2e3436; -} - -div.sidebar li.toctree-l2 a { - background-color: transparent; - border: none; - margin-left: 1em; - border-bottom: 1px solid #dddddd; -} - -div.sidebar li.toctree-l3 a { - background-color: transparent; - border: none; - margin-left: 2em; - border-bottom: 1px solid #dddddd; -} - -div.sidebar li.toctree-l2:last-child a { - border-bottom: none; -} - -div.sidebar li.toctree-l1.current a { - border-right: 5px solid #fcaf3e; -} - -div.sidebar li.toctree-l1.current li.toctree-l2 a { - border-right: none; -} - -div.sidebar input[type="text"] { - width: 170px; -} - -div.sidebar input[type="submit"] { - width: 30px; -} - -/* Footer */ - -div.footer-wrapper { - background: url(bgfooter.png) top left repeat-x; - border-top: 4px solid #babdb6; - padding-top: 10px; - padding-bottom: 10px; - min-height: 80px; -} - -div.footer, -div.footer a { - color: #888a85; -} - -div.footer .right { - text-align: right; -} - -div.footer .left { - text-transform: uppercase; -} - -/* Styles copied from basic theme */ - -img.align-left, -.figure.align-left, -object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, -.figure.align-right, -object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, -.figure.align-center, -object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-right { - text-align: right; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -div.figure p.caption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text { -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li div.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- viewcode extension ---------------------------------------------------- */ - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: "Verdana", Arial, sans-serif; -} - -div.viewcode-block:target { - margin: -1px -3px; - padding: 0 3px; - background-color: #f4debf; - border-top: 1px solid #ac9; - border-bottom: 1px solid #ac9; -} - -div.code-block-caption { - background-color: #ddd; - color: #333; - padding: 2px 5px; - font-size: small; -} - -/* -- math display ---------------------------------------------------------- */ - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} diff --git a/doc/source/ystatic/maxwidthoverride.css b/doc/source/ystatic/maxwidthoverride.css deleted file mode 100644 index 783a8944f..000000000 --- a/doc/source/ystatic/maxwidthoverride.css +++ /dev/null @@ -1,3 +0,0 @@ -.wy-nav-content { - max-width: none; -} diff --git a/jest.config.js b/jest.config.js index 6ab887724..1478db196 100644 --- a/jest.config.js +++ b/jest.config.js @@ -4,6 +4,7 @@ module.exports = { transform: { "^.+\\.(js|jsx|ts|tsx)$": "babel-jest", }, + transformIgnorePatterns: ["node_modules/(?!react-markdown)/"], testPathIgnorePatterns: [".cypress", "node_modules", "dist"], testEnvironment: "./FixJSDOMEnvironment.ts", moduleNameMapper: { diff --git a/package-lock.json b/package-lock.json index f68f084cf..7fd9514cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "@mui/styles": "^5.11.2", "@mui/system": "^5.0.3", "@types/estree": "^1.0.0", + "@types/react-syntax-highlighter": "^15.5.7", "acorn": "^8.8.1", "acorn-walk": "^8.2.0", "arg": "^5.0.2", @@ -41,7 +42,10 @@ "react-beautiful-dnd": "^13.1.1", "react-dom": "^17.0.2", "react-draggable": "^4.4.4", + "react-markdown": "^8.0.7", "react-resizable": "^3.0.4", + "react-syntax-highlighter": "^15.5.0", + "remark-gfm": "^3.0.1", "sprintf-js": "^1.1.2" }, "devDependencies": { @@ -4249,6 +4253,14 @@ "@types/node": "*" } }, + "node_modules/@types/debug": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/escodegen": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.7.tgz", @@ -4329,6 +4341,14 @@ "@types/node": "*" } }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", @@ -4434,6 +4454,14 @@ "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", "dev": true }, + "node_modules/@types/mdast": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", + "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", @@ -4447,6 +4475,11 @@ "dev": true, "optional": true }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, "node_modules/@types/node": { "version": "16.18.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", @@ -4543,6 +4576,14 @@ "@types/react": "*" } }, + "node_modules/@types/react-syntax-highlighter": { + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.7.tgz", + "integrity": "sha512-bo5fEO5toQeyCp0zVHBeggclqf5SQ/Z5blfFmjwO5dkMVGPgmiwZsJh9nu/Bo5L7IHTuGWrja6LxJVE2uB5ZrQ==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -4661,6 +4702,11 @@ "node": ">=0.10.0" } }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, "node_modules/@types/webpack": { "version": "4.41.33", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.33.tgz", @@ -5807,6 +5853,15 @@ "@babel/core": "^7.0.0" } }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -6196,6 +6251,15 @@ } ] }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -6226,6 +6290,33 @@ "node": ">=10" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/check-more-types": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", @@ -6419,6 +6510,15 @@ "node": ">= 0.8" } }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/commander": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", @@ -6839,6 +6939,18 @@ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -6950,6 +7062,14 @@ "node": ">= 0.6" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -6975,6 +7095,14 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", @@ -8187,6 +8315,11 @@ "node": ">= 0.8" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -8258,6 +8391,18 @@ "reusify": "^1.0.4" } }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", @@ -8669,6 +8814,14 @@ "node": ">=8" } }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -9166,6 +9319,70 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript/node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hastscript/node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hastscript/node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -9175,6 +9392,14 @@ "he": "bin/he" } }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -9702,6 +9927,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -9734,6 +9964,28 @@ "node": ">= 10" } }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -9793,6 +10045,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -9831,6 +10105,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -9885,6 +10168,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-in-browser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", @@ -12396,6 +12688,15 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -12431,6 +12732,19 @@ "node": ">=8" } }, + "node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -12473,6 +12787,15 @@ "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -12537,6 +12860,220 @@ "speech-rule-engine": "^4.0.6" } }, + "node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -12598,6 +13135,541 @@ "resolved": "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.1.1.tgz", "integrity": "sha512-R75CUN6O6e1t8bgailrF1qPq+HhVeFTM3XQ0uzI+mXTybmphy3b6h4NbLOYhemViQ3lUs+6CKRkC3Ws1TlYREA==" }, + "node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "dependencies": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, "node_modules/micromatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", @@ -12729,6 +13801,14 @@ "monaco-editor": "*" } }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -13281,6 +14361,32 @@ "node": ">=0.10.0" } }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -13716,6 +14822,14 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -13758,6 +14872,15 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/property-information": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz", + "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -14007,6 +15130,41 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "node_modules/react-markdown": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", + "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/prop-types": "^15.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "prop-types": "^15.0.0", + "property-information": "^6.0.0", + "react-is": "^18.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/react-markdown/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/react-redux": { "version": "7.2.9", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", @@ -14052,6 +15210,21 @@ "react": ">= 16.3" } }, + "node_modules/react-syntax-highlighter": { + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", + "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.4.1", + "lowlight": "^1.17.0", + "prismjs": "^1.27.0", + "refractor": "^3.6.0" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -14205,6 +15378,28 @@ "@babel/runtime": "^7.9.2" } }, + "node_modules/refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "engines": { + "node": ">=6" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -14319,6 +15514,50 @@ "node": ">= 0.10" } }, + "node_modules/remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/renderkid": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", @@ -14510,6 +15749,17 @@ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -14952,6 +16202,15 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -15343,6 +16602,14 @@ "webpack": "^5.0.0" } }, + "node_modules/style-to-object": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz", + "integrity": "sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, "node_modules/stylis": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", @@ -15544,6 +16811,15 @@ "node": ">=12" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", @@ -15565,6 +16841,15 @@ "node": ">=0.8.0" } }, + "node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -15714,6 +16999,35 @@ "node": ">=4" } }, + "node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/union": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", @@ -15726,6 +17040,78 @@ "node": ">= 0.8.0" } }, + "node_modules/unist-util-generated": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -15822,6 +17208,31 @@ "node": ">= 0.4.0" } }, + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uvu/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/v8-to-istanbul": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", @@ -15864,6 +17275,34 @@ "node": ">= 0.8" } }, + "node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", @@ -16509,6 +17948,14 @@ "node": ">=0.1" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -16607,6 +18054,15 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "optional": true + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } }, "dependencies": { @@ -19564,6 +21020,14 @@ "@types/node": "*" } }, + "@types/debug": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "requires": { + "@types/ms": "*" + } + }, "@types/escodegen": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.7.tgz", @@ -19644,6 +21108,14 @@ "@types/node": "*" } }, + "@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "requires": { + "@types/unist": "*" + } + }, "@types/hoist-non-react-statics": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", @@ -19749,6 +21221,14 @@ "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", "dev": true }, + "@types/mdast": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", + "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", + "requires": { + "@types/unist": "*" + } + }, "@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", @@ -19762,6 +21242,11 @@ "dev": true, "optional": true }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, "@types/node": { "version": "16.18.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", @@ -19858,6 +21343,14 @@ "@types/react": "*" } }, + "@types/react-syntax-highlighter": { + "version": "15.5.7", + "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.7.tgz", + "integrity": "sha512-bo5fEO5toQeyCp0zVHBeggclqf5SQ/Z5blfFmjwO5dkMVGPgmiwZsJh9nu/Bo5L7IHTuGWrja6LxJVE2uB5ZrQ==", + "requires": { + "@types/react": "*" + } + }, "@types/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -19975,6 +21468,11 @@ } } }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, "@types/webpack": { "version": "4.41.33", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.33.tgz", @@ -20840,6 +22338,11 @@ "babel-preset-current-node-syntax": "^1.0.0" } }, + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -21117,6 +22620,11 @@ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001473.tgz", "integrity": "sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg==" }, + "ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==" + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -21140,6 +22648,21 @@ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, + "character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==" + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, "check-more-types": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", @@ -21290,6 +22813,11 @@ "delayed-stream": "~1.0.0" } }, + "comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" + }, "commander": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", @@ -21597,6 +23125,14 @@ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, + "decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "requires": { + "character-entities": "^2.0.0" + } + }, "decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -21674,6 +23210,11 @@ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" + }, "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -21692,6 +23233,11 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==" + }, "diff-sequences": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", @@ -22606,6 +24152,11 @@ } } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -22663,6 +24214,14 @@ "reusify": "^1.0.4" } }, + "fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "requires": { + "format": "^0.2.0" + } + }, "faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", @@ -22964,6 +24523,11 @@ } } }, + "format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==" + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -23340,12 +24904,59 @@ "has-symbols": "^1.0.2" } }, + "hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" + }, + "hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==" + }, + "hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "dependencies": { + "comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + }, + "property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "requires": { + "xtend": "^4.0.0" + } + }, + "space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + } + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" + }, "hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -23748,6 +25359,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, "internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -23771,6 +25387,20 @@ "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "dev": true }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, "is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -23815,6 +25445,11 @@ "has-tostringtag": "^1.0.0" } }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, "is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -23838,6 +25473,11 @@ "has-tostringtag": "^1.0.0" } }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -23871,6 +25511,11 @@ "is-extglob": "^2.1.1" } }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + }, "is-in-browser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", @@ -25773,6 +27418,11 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==" + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -25804,6 +27454,15 @@ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true }, + "lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "requires": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -25837,6 +27496,11 @@ "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, + "markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==" + }, "matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -25883,6 +27547,164 @@ "speech-rule-engine": "^4.0.6" } }, + "mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + } + }, + "mdast-util-find-and-replace": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "requires": { + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" + } + } + }, + "mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + } + }, + "mdast-util-gfm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "requires": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + } + }, + "mdast-util-gfm-autolink-literal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "requires": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + } + }, + "mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + } + }, + "mdast-util-gfm-strikethrough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + } + }, + "mdast-util-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "requires": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + } + }, + "mdast-util-gfm-task-list-item": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + } + }, + "mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "requires": { + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" + } + }, + "mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "requires": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + } + }, + "mdast-util-to-markdown": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + } + }, + "mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "requires": { + "@types/mdast": "^3.0.0" + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -25932,6 +27754,303 @@ "resolved": "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.1.1.tgz", "integrity": "sha512-R75CUN6O6e1t8bgailrF1qPq+HhVeFTM3XQ0uzI+mXTybmphy3b6h4NbLOYhemViQ3lUs+6CKRkC3Ws1TlYREA==" }, + "micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "requires": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "requires": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "micromark-extension-gfm": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "requires": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-extension-gfm-autolink-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "requires": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-extension-gfm-strikethrough": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-extension-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-extension-gfm-tagfilter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "requires": { + "micromark-util-types": "^1.0.0" + } + }, + "micromark-extension-gfm-task-list-item": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "requires": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "requires": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==" + }, + "micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==" + }, + "micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "requires": { + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==" + }, + "micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==" + }, "micromatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", @@ -26030,6 +28149,11 @@ "integrity": "sha512-4L8iHlhpYImhqQwGIfcsD9caxlW/eANRCk/77xTAAlxV2LLSfMpubnSXCGdoOu+GPlHM0frKFn3aUQJpoe0gjQ==", "requires": {} }, + "mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -26442,6 +28566,26 @@ "author-regex": "^1.0.0" } }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "dependencies": { + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + } + } + }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -26761,6 +28905,11 @@ } } }, + "prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -26799,6 +28948,11 @@ } } }, + "property-information": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz", + "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==" + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -26978,6 +29132,35 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "react-markdown": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", + "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", + "requires": { + "@types/hast": "^2.0.0", + "@types/prop-types": "^15.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "prop-types": "^15.0.0", + "property-information": "^6.0.0", + "react-is": "^18.0.0", + "remark-parse": "^10.0.0", + "remark-rehype": "^10.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, "react-redux": { "version": "7.2.9", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", @@ -27006,6 +29189,18 @@ "react-draggable": "^4.0.3" } }, + "react-syntax-highlighter": { + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", + "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", + "requires": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.4.1", + "lowlight": "^1.17.0", + "prismjs": "^1.27.0", + "refractor": "^3.6.0" + } + }, "react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -27126,6 +29321,23 @@ "@babel/runtime": "^7.9.2" } }, + "refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "requires": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "dependencies": { + "prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==" + } + } + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -27215,6 +29427,38 @@ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "dev": true }, + "remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + } + }, + "remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + } + }, + "remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "requires": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + } + }, "renderkid": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", @@ -27354,6 +29598,14 @@ } } }, + "sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "requires": { + "mri": "^1.1.0" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -27734,6 +29986,11 @@ } } }, + "space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==" + }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -28033,6 +30290,14 @@ "dev": true, "requires": {} }, + "style-to-object": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz", + "integrity": "sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==", + "requires": { + "inline-style-parser": "0.1.1" + } + }, "stylis": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", @@ -28179,6 +30444,11 @@ "punycode": "^2.1.1" } }, + "trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==" + }, "trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", @@ -28196,6 +30466,11 @@ } } }, + "trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==" + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -28299,6 +30574,27 @@ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true }, + "unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "requires": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "dependencies": { + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" + } + } + }, "union": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", @@ -28308,6 +30604,54 @@ "qs": "^6.4.0" } }, + "unist-util-generated": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==" + }, + "unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + } + }, + "unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + } + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -28377,6 +30721,24 @@ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true }, + "uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "requires": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "dependencies": { + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" + } + } + }, "v8-to-istanbul": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", @@ -28410,6 +30772,26 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, + "vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + } + }, + "vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + } + }, "w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", @@ -28871,6 +31253,11 @@ "resolved": "https://registry.npmjs.org/xmldom-sre/-/xmldom-sre-0.1.31.tgz", "integrity": "sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==" }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -28945,6 +31332,11 @@ "optional": true } } + }, + "zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==" } } } diff --git a/package.json b/package.json index e6d225f0f..c811b2fb0 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@mui/styles": "^5.11.2", "@mui/system": "^5.0.3", "@types/estree": "^1.0.0", + "@types/react-syntax-highlighter": "^15.5.7", "acorn": "^8.8.1", "acorn-walk": "^8.2.0", "arg": "^5.0.2", @@ -41,7 +42,10 @@ "react-beautiful-dnd": "^13.1.1", "react-dom": "^17.0.2", "react-draggable": "^4.4.4", + "react-markdown": "^8.0.7", "react-resizable": "^3.0.4", + "react-syntax-highlighter": "^15.5.0", + "remark-gfm": "^3.0.1", "sprintf-js": "^1.1.2" }, "description": "A cyberpunk-themed incremental game", @@ -123,6 +127,7 @@ "preversion": "npm install && npm run test", "version": "sh ./tools/build-release.sh && git add --all", "postversion": "git push -u origin dev && git push --tags", - "changelog": "node tools/fetch-changelog/index.js --from=$(cat last_changelog_hash) > changelog.md" + "changelog": "node tools/fetch-changelog/index.js --from=$(cat last_changelog_hash) > changelog.md", + "bundle-doc": "node tools/bundle-doc/index.js" } } diff --git a/src/Documentation/ui/DocumentationRoot.tsx b/src/Documentation/ui/DocumentationRoot.tsx new file mode 100644 index 000000000..092c93fa6 --- /dev/null +++ b/src/Documentation/ui/DocumentationRoot.tsx @@ -0,0 +1,52 @@ +import React from "react"; + +import Button from "@mui/material/Button"; +import { MD } from "../../ui/MD/MD"; + +import { getPage } from "./root"; +import { Navigator, useHistory } from "../../ui/React/Documentation"; + +const resolveRelativePath = (folder: string, relative: string): string => { + const noLastSlash = folder.endsWith("/") ? folder.slice(0, folder.length - 1) : folder; + const lastIndex = noLastSlash.lastIndexOf("/"); + const prefix = lastIndex === -1 ? "" : noLastSlash.slice(0, lastIndex + 1); + const suffix = relative.slice("../".length); + return prefix + suffix; +}; + +const resolvePath = (currentPath: string, newPath: string): string => { + const lastIndex = currentPath.lastIndexOf("/"); + const folder = lastIndex === -1 ? "" : currentPath.slice(0, lastIndex + 1); + if (!newPath.startsWith("../")) return folder + newPath; + + return resolveRelativePath(folder, newPath); +}; + +export function DocumentationRoot(): React.ReactElement { + const history = useHistory(); + const page = getPage(history.page); + const navigator = { + navigate(relPath: string, external: boolean) { + const newPath = resolvePath(history.page, relPath); + if (external) { + const url = `https://github.com/bitburner-official/bitburner-src/blob/stable/src/Documentation/ui/doc/${newPath}`; + window.open(url, "_newtab"); + return; + } + history.push(newPath); + + // Reset scroll to the top of the page. + window.scrollTo(0, 0); + }, + }; + + return ( + <> + + + + + + + ); +} diff --git a/src/Documentation/ui/doc/advanced/bitnodes.md b/src/Documentation/ui/doc/advanced/bitnodes.md new file mode 100644 index 000000000..5d8712591 --- /dev/null +++ b/src/Documentation/ui/doc/advanced/bitnodes.md @@ -0,0 +1,44 @@ +# BitNodes + +A BitNode is an important part of the game's storyline. In the game, you discover +what BitNodes are by following the trail of clues left by the mysterious `jump3r`. + +## What is a BitNode + +A BitNode is the complex simulated reality in which you reside. By following the messages +from `jump3r`, you discover that humanity was enslaved by an advanced alien race, called +the Enders, using virtual simulations that trapped the minds of humans. + +However, the Enders didn't just create a single virtual reality to enslave humans, but many +different simulations. In other words, there are many different BitNodes that exist. +These BitNode are very different from each other. + +jump3r tells you that the only hope for humanity is to destroy all of these BitNodes. +Therefore, the end goal for the player is to enter and then destroy each BitNode. + +Destroying a BitNode resets most of the player's progress but grants the player a +powerful second-tier persistent upgrade called a [Source-File](sourcefiles.md). +Different BitNodes grant different [Source-Files](sourcefiles.md). + +Each BitNode has unique characteristics that are related to varying backstories. For example, in one BitNode the world is in the middle of a financial catastrophe with a collapsing market. In another BitNode, most forms of income such as working at a [Company](../basic/companies.md) or [Hacknet Nodes](../basic/hacknet_nodes.md) are significantly less profitable. [Servers](../basic/servers.md) have less money on them and lowered growth rates, but it is easier to lower their security level using the `weaken` function. + +Furthermore, some BitNodes introduce new content and mechanics. For example there is one +BitNode that grants access to the [Singularity API](https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.singularity.md). +There is another BitNode in which you can manage a [Gang](gang.md) to earn money and [Reputation](../basic/reputation.md). + +## How to destroy a BitNode + +Initially, the only way to destroy a BitNode is to join Daedalus. +From Daedalus, the player can obtain an [Augmentation](../basic/augmentations.md) called `The Red Pill`, which doesn't cost any money but does require a good amount of [Faction](../basic/factions.md) [Reputation](../basic/reputation.md). + +After installing `The Red Pill`, the player must search for and then manually `hack` a +server called `w0r1d_d43m0n`. This server requires a hacking level of `3000`, sometimes more, in order to successfully hack it. This will destroy the player's current BitNode. + +There is a second method of destroying a BitNode, but it must be unlocked by first +destroying BitNode-6 or BitNode-7 ([Bladeburners](bladeburners.md)). + +When the player destroys a BitNode, most of their progress will be reset. This includes things such as [Augmentations](../basic/augmentations.md) and [RAM](../basic/ram.md) upgrades on the home computer. The only things that will persist through destroying BitNodes is: + +- [Source-Files](sourcefiles.md) +- [Scripts](../basic/scripts.md) on the home computer +- [Intelligence](intelligence.md) diff --git a/src/Documentation/ui/doc/advanced/bladeburners.md b/src/Documentation/ui/doc/advanced/bladeburners.md new file mode 100644 index 000000000..4d710e179 --- /dev/null +++ b/src/Documentation/ui/doc/advanced/bladeburners.md @@ -0,0 +1,3 @@ +# Bladeburners + +PLACEHOLDER diff --git a/src/Documentation/ui/doc/advanced/corporations.md b/src/Documentation/ui/doc/advanced/corporations.md new file mode 100644 index 000000000..e69de29bb diff --git a/src/Documentation/ui/doc/advanced/gang.md b/src/Documentation/ui/doc/advanced/gang.md new file mode 100644 index 000000000..c99a58077 --- /dev/null +++ b/src/Documentation/ui/doc/advanced/gang.md @@ -0,0 +1,5 @@ +# Gang + +Managing a gang can be very rewarding. By rising above all other gangs you get access to almost all augmentations in the game. + +PLACEHOLDER diff --git a/doc/source/advancedgameplay/grafting.rst b/src/Documentation/ui/doc/advanced/grafting.md similarity index 50% rename from doc/source/advancedgameplay/grafting.rst rename to src/Documentation/ui/doc/advanced/grafting.md index 99babe885..1987c5c31 100644 --- a/doc/source/advancedgameplay/grafting.rst +++ b/src/Documentation/ui/doc/advanced/grafting.md @@ -1,18 +1,16 @@ -.. _gameplay_grafting: +# Grafting -Grafting -======== Grafting is an experimental process through which you can obtain the benefits of -Augmentations, without needing to reboot your body. +[Augmentations](../basic/augmentations.md), without needing to reboot your body. Grafting can be done at VitaLife in New Tokyo, where you'll find a shady researcher with questionable connections. From there, you can spend a sum of money to begin grafting -Augmentations. This will take some time. When done, the Augmentation will be applied to +[Augmentations](../basic/augmentations.md). This will take some time. When done, the [Augmentation](../basic/augmentations.md) will be applied to your character without needing to install. Be warned, some who have tested grafting have reported an unidentified malware. Dubbed -"Entropy", this virus seems to grow in potency as more Augmentations are grafted, +`Entropy`, this virus seems to grow in potency as more [Augmentations](../basic/augmentations.md) are grafted, causing unpredictable affects to the victim. -Note that when crafting an Augmentation, cancelling will **not** save your progress, +Note that when crafting an [Augmentation](../basic/augmentations.md), cancelling will **not** save your progress, and the money spent will **not** be returned. diff --git a/src/Documentation/ui/doc/advanced/hacknetservers.md b/src/Documentation/ui/doc/advanced/hacknetservers.md new file mode 100644 index 000000000..454187013 --- /dev/null +++ b/src/Documentation/ui/doc/advanced/hacknetservers.md @@ -0,0 +1,5 @@ +# Hacknet Servers + +These are a very powerful upgrade to [Hacknet Nodes](../basic/hacknet_nodes.md). Instead of producing money the Hacknet Servers produce `hashes`. This currency can be exchanged for a variety of upgrade that boost most other mechanics of the game. + +They can also be used to run scripts on. However this reduces the amount of `hash` produced. diff --git a/src/Documentation/ui/doc/advanced/intelligence.md b/src/Documentation/ui/doc/advanced/intelligence.md new file mode 100644 index 000000000..07b26d013 --- /dev/null +++ b/src/Documentation/ui/doc/advanced/intelligence.md @@ -0,0 +1,17 @@ +# Intelligence + +Intelligence is a stat that is unlocked by having +[Source-File 5](sourcefiles.md) (i.e. Destroying [BitNode-5](bitnodes.md)). + +Intelligence is unique because it is permanent and persistent. It never gets reset +back to 1. However, gaining Intelligence experience is extremely slow. It is a stat +that gradually builds up as you continue to play the game. + +Intelligence will boost your production for many actions in the game, including: + +- [Hacking](../basic/hacking.md) +- [Infiltration](../basic/infiltration.md) +- [Crime](../basic/crimes.md) success rate +- [Bladeburner](bladeburners.md) actions +- [Reputation](../basic/reputation.md) gain for [Companies](../basic//companies.md) & [Factions](../basic/factions.md) +- [Augmentation](../basic/augmentations.md) [Grafting](grafting.md) speed diff --git a/src/Documentation/ui/doc/advanced/sleeves.md b/src/Documentation/ui/doc/advanced/sleeves.md new file mode 100644 index 000000000..27b2a8bc8 --- /dev/null +++ b/src/Documentation/ui/doc/advanced/sleeves.md @@ -0,0 +1,90 @@ +# Sleeves + +When VitaLife unveiled their Persona Core technology that allowed people to digitize +and transfer their consciousness into other vessels, human bodies became nothing more +than 'sleeves' for the human consciousness. This technology thus became known as +"Sleeve technology". + +Sleeve technology unlocks two different gameplay features: + +- Duplicate Sleeves +- [Grafting](grafting.md) + +Sleeve technology is unlocked in [BitNode-10](bitnodes.md). + +## Duplicate Sleeves + +Duplicate Sleeves are MK-V Synthoids (synthetic androids) into which your consciousness +has been copied. In other words, these Synthoids contain a perfect duplicate of your mind. + +Duplicate Sleeves are essentially clones which you can use to perform work-type actions, +such as working for a [Company](../basic/companies.md) / [Faction](../basic/factions.md) or committing a [Crime](../basic/crimes.md). When sleeves perform these tasks, +they will earn money, experience, and [Reputation](../basic/reputation.md). + +Sleeves are their own individuals, which means they each have their own experience and stats. + +When a sleeve earns experience, it earns experience for itself, the player's +original consciousness, as well as all of the player's other sleeves. + +Duplicate Sleeves are **not** reset when installing [Augmentations](../basic/augmentations.md), but they are reset +when switching [BitNodes](bitnodes.md). + +## Obtaining Duplicate Sleeves + +There are two methods of obtaining Duplicate Sleeves: + +1. Destroy [BitNode-10](bitnodes.md). Each completion gives you one additional Duplicate Sleeve. +2. Purchase Duplicate Sleeves from The Covenant. + This is only available in [BitNode-10](bitnodes.md). Sleeves purchased this way are **permanent** (they persist + through [BitNodes](bitnodes.md)). You can purchase up to 5 Duplicate Sleeves from The Covenant. + +## Synchronization + +Synchronization is a measure of how aligned your consciousness is with that of your +Duplicate Sleeves. It is a numerical value between `1` and `100`, and it affects how much experience +is earned when the sleeve is performing a task. + +Synchronization can be increased by assigning sleeves to the `Synchronize` task. + +## Sleeve Shock + +Sleeve shock is a measure of how much trauma the sleeve has due to being placed in a new +body. It is a numerical value between `0` and `100`, where `100` indicates full shock and `0` indicates +no shock. Shock affects the amount of experience earned by the sleeve. + +Sleeve shock slowly decreases over time. You can further increase the rate at which +it decreases by assigning sleeves to the `Shock Recovery` task. + +Let `X` be the sleeve's shock and `Y` be the sleeve's synchronization. When the sleeve earns experience by performing +a task, the sleeve gains `X%` of the amount of experience normally earned by the task. player’s original host consciousness and all of the player's other sleeves +earn `Y%` of the experience that the sleeve gained, or `X\*Y %` of the normal experience amount. + +## Augmentations + +You can purchase [Augmentations](../basic/augmentations.md) for your Duplicate +Sleeves. In order to do this, the sleeve's shock must be at `0`. Any [Augmentation](../basic/augmentations.md) +that is currently available to you through a faction is also available for your +Duplicate Sleeves. There are a few [Augmentations](../basic/augmentations.md), such as NeuroFlux Governor and +[Bladeburner](bladeburners.md)-specific ones, that cannot be purchased for a Duplicate Sleeve. + +When you purchase an [Augmentation](../basic/augmentations.md) for a Duplicate Sleeve, it is instantly installed. +When this happens, the sleeve's stats are instantly reset back to 0, similar to +when you normally install [Augmentations](../basic/augmentations.md). + +The cost of purchasing an [Augmentation](../basic/augmentations.md) for a Duplicate Sleeve is **not** affected +by how many [Augmentations](../basic/augmentations.md) you have purchased for yourself, and vice versa. + +## Memory + +Sleeve memory dictates what a sleeve's synchronization will be when it is reset by +switching [BitNodes](bitnodes.md). For example, if a sleeve has a memory of `10`, then when you +switch [BitNodes](bitnodes.md) its synchronization will initially be set to `10`, rather than 1. + +Memory can only be increased by purchasing upgrades from The Covenant. Just like +the ability to purchase additional sleeves, this is only available in [BitNode-10](bitnodes.md). + +Memory is a persistent stat, meaning it never gets reset back to `1`. +The maximum possible value for a sleeve's memory is `100`. + +Buying memory has no instant affect on synchronization, +memory affects only the starting synchronization upon entering a [BitNode](bitnodes.md). diff --git a/src/Documentation/ui/doc/advanced/sourcefiles.md b/src/Documentation/ui/doc/advanced/sourcefiles.md new file mode 100644 index 000000000..bf2d127ad --- /dev/null +++ b/src/Documentation/ui/doc/advanced/sourcefiles.md @@ -0,0 +1,9 @@ +# Source-Files + +Source-Files are a type of persistent upgrade that is more powerful than [Augmentations](../basic/augmentations.md). +Source-Files are received by destroying a [Bitnode](bitnodes.md). There are many different [BitNodes](bitnodes.md) +in the game and each [BitNode](bitnodes.md) will grant a different Source-File when it is destroyed. + +A Source-File can be upgraded by destroying its corresponding [BitNode](bitnodes.md) a second or +third time (playing through that [BitNode](bitnodes.md) again). It can be upgraded to a maximum +of level 3, with the exception of Source-File 12, which has no hard limit. diff --git a/src/Documentation/ui/doc/advanced/stanek.md b/src/Documentation/ui/doc/advanced/stanek.md new file mode 100644 index 000000000..c23e88841 --- /dev/null +++ b/src/Documentation/ui/doc/advanced/stanek.md @@ -0,0 +1,7 @@ +# Stanek + +Allison is a bit crazy. But her special [Augmentation](../basic/augmentations.md) is very useful despites it's ~~bugs~~ features. The Gift is consists of a grid of squares in which tetris-like pieces called fragments can be placed. Each fragment boost a different player multiplier. However the fragments are not very powerful by themselves. + +To increase the power of a fragment the `ns.stanek.charge()` function needs to be called. More thread means more power. + +There are also special fragments called booster fragments which increase the power of the fragment it touches. diff --git a/doc/source/basicgameplay/augmentations.rst b/src/Documentation/ui/doc/basic/augmentations.md similarity index 54% rename from doc/source/basicgameplay/augmentations.rst rename to src/Documentation/ui/doc/basic/augmentations.md index d273177e9..a22180d0c 100644 --- a/doc/source/basicgameplay/augmentations.rst +++ b/src/Documentation/ui/doc/basic/augmentations.md @@ -1,7 +1,5 @@ -.. _gameplay_augmentations: +# Augmentations -Augmentations -============= Advances in science and medicine have led to powerful new technologies that allow people to augment themselves beyond normal human capabilities. There are many different types of Augmentations, ranging from cybernetic @@ -10,28 +8,24 @@ user's physical and mental faculties. Augmentations provide persistent upgrades in the form of multipliers. These multipliers apply to a wide variety of things such as stats, -experience gain, and hacking, just to name a few. The effects of -Augmentations stack multiplicatively. Your multipliers can be viewed in -the 'Character' page (:ref:`keyboard shortcut ` Alt + c). +experience gain, and [hacking](hacking.md), just to name a few. The effects of +Augmentations stack multiplicatively. Your multipliers can be viewed in +the `Character` pages. + +## How to acquire Augmentations -How to acquire Augmentations -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Because of how powerful Augmentations are, the technology behind them is kept private and secret by the corporations and organizations that create them. Therefore, the only way for the player to obtain -Augmentations is through Factions. After joining a Faction and earning -enough reputation in it, you will be able to purchase its Augmentations. -Different Factions offer different Augmentations. Augmentations must be -purchased in order to be installed, and they are fairly expensive. +Augmentations is through [Factions](factions.md). After joining a [Faction](factions.md) and earning +enough [Reputation](reputation.md) in it, you will be able to purchase its Augmentations. +Different [Factions](factions.md) offer different Augmentations. Augmentations must be +purchased in order to be installed, and they are fairly expensive. They also require [Reputation](reputation.md) from a [Factions](factions.md) before they will let you purchase their Augmentations. -.. _gameplay_augmentations_installing: +## Installing Augmentations -Installing Augmentations -^^^^^^^^^^^^^^^^^^^^^^^^ -You will not gain the benefits of your purchased Augmentations until you -actually install them. You can choose to install Augmentations through -the 'Augmentations' menu tab (Found under 'Character'. Alternatively, -use the keyboard shortcut Alt + a). +You will not gain the benefits of your purchased Augmentations until you install them. You can choose to install Augmentations through +the `Augmentations` menu tab, found under `Character`. Unfortunately, installing Augmentations has side effects. You will lose most of the progress you've made, including your skills, stats, and @@ -39,36 +33,34 @@ money. You will have to start over, but you will have all of the Augmentations you have installed to help you progress. This is the game's "soft reset" or "prestige" mechanic. -To summarize, here is a list of everything you will LOSE when you install +To summarize, here is a list of everything you will **LOSE** when you install an Augmentation: -* Stats/Skills -* Money -* Scripts on all servers EXCEPT your home computer -* Purchased servers -* Hacknet Nodes -* Company/faction reputation -* Jobs and Faction memberships -* Programs -* Stocks -* TOR router +- Stats/Skills +- Money +- [Scripts](scripts.md) on all [servers](servers.md) EXCEPT your home computer +- Purchased [servers](servers.md) +- [Hacknet Nodes](hacknet_nodes.md) +- [Company](companies.md) / [Faction](factions.md) [Reputation](reputation.md), but you gain [Reputation](reputation.md). +- Jobs and [Faction](factions.md) memberships +- Programs +- [Stocks](stockmarket.md) +- TOR router Here is everything you will KEEP when you install an Augmentation: -* Every Augmentation you have installed -* Scripts on your home computer -* RAM/Core Upgrades on your home computer -* World Stock Exchange account and TIX API Access -* Previously installed Augmentations +- Every Augmentation you have installed +- [Scripts](scripts.md) on your home computer +- [RAM](ram.md) / Core Upgrades on your home computer +- [World Stock Exchange account](stockmarket.md) and [TIX API](https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.tix.md) Access +- Previously installed Augmentations -.. _gameplay_augmentations_purchasingmultiple: +## Purchasing Multiple Augmentations -Purchasing Multiple Augmentations -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You do not have to install an Augmentation right after you purchase it. You can purchase as many Augmentations as you'd like before you choose to -install them. When you install your purchased Augmentations they will ALL -get installed. +install them. When you install your purchased Augmentations they will **ALL** +get installed at once. There are a few drawbacks to this, however. First, obviously, you won't gain the benefits of your purchased Augmentations until after you install @@ -77,6 +69,6 @@ will cause the Augmentations to get progressively more expensive. When you purchase an Augmentation, the price of purchasing another Augmentation doubles. This multiplier stacks for each Augmentation you purchase. Once you install your purchased Augmentations, their costs -are reset back to the original prices. You can only purchase each augmentation -once, with the exception of NeuroFlux Governor, which can be purchased infinitely +are reset back to the original prices. You can only purchase each augmentation +once, with the exception of `NeuroFlux Governor`, which can be purchased infinitely at increasing cost. diff --git a/src/Documentation/ui/doc/basic/codingcontracts.md b/src/Documentation/ui/doc/basic/codingcontracts.md new file mode 100644 index 000000000..4f11e7678 --- /dev/null +++ b/src/Documentation/ui/doc/basic/codingcontracts.md @@ -0,0 +1,86 @@ +# Coding Contracts + +Coding Contracts are a mechanic that lets players earn rewards in +exchange for solving programming problems. + +Coding Contracts are files with the `.cct` extensions. They can +be accessed through the [Terminal](terminal.md) or through [Scripts](scripts.md) using +the [Coding Contract API](https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.codingcontract.md) + +Each contract has a limited number of attempts. If you +provide the wrong answer too many times and exceed the +number of attempts, the contract will self destruct (delete itself) + +Currently, Coding Contracts are randomly generated and +spawned over time. They can appear on any [server](servers.md) (including your +home computer), except for your purchased [servers](servers.md). + +## Running in Terminal + +To run a Coding Contract in the [Terminal](terminal.md), simply use the +`run` command: + + $ run some-contract.cct + +Doing this will bring up a popup. The popup will display +the contract's problem, the number of attempts remaining, and +an area to provide an answer. + +## Interacting through Scripts + +See the [Coding Contract API](https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.codingcontract.md). +Interacting with Coding Contracts via the [Terminal](terminal.md) can be tedious the more +contracts you solve. Consider using the [API](https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.codingcontract.md) to automate various aspects of +your solution. For example, some contracts have long solutions while others +have even longer solutions. You might want to use the [API](https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.codingcontract.md) to automate the +process of submitting your solution rather than copy and paste a long +solution into an answer box. + +However, using the [API](https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.codingcontract.md) comes at a cost. Like most functions in other APIs, +each function in the [Coding Contract API](https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.codingcontract.md) has a RAM cost. Depending on which +function you use, the initial [RAM](ram.md) on your home server might not be enough +to allow you to use various [API](https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.codingcontract.md) functions. Plan on upgrading the [RAM](ram.md) on your +home server if you want to use the [Coding Contract API](https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.codingcontract.md). + +## Submitting Solutions + +Different contract problem types will require different types of +solutions. Some may be numbers, others may be strings or arrays. +If a contract asks for a specific solution format, then +use that. Otherwise, follow these rules when submitting solutions: + +- String-type solutions should **not** have quotation marks surrounding + the string (unless specifically asked for). Only quotation + marks that are part of the actual string solution should be included. +- Array-type solutions should be submitted with each element + in the array separated by commas. Brackets are optional. For example, + both of the following are valid solution formats:: + + - `1,2,3` + - `[1,2,3]` + +However, if the solution is a multidimensional array, then +all arrays that are not the outer-most array DO require the brackets. +For example, an array of arrays can be submitted as one of the following: + +- `[1,2],[3,4]` +- `[[1,2],[3,4]]` + +Numeric solutions should be submitted normally, as expected + +## Rewards + +There are currently four possible rewards for solving a Coding Contract: + +- [Faction](factions.md) [Reputation](reputation.md) for a specific [Faction](factions.md) +- [Faction](factions.md) [Reputation](reputation.md) for all [Factions](factions.md) that you are a member of +- [Company](companies.md) [Reputation](reputation.md) for a specific [Company](companies.md) +- Money + +The `amount` of the reward varies based on the difficulty of the problem +posed by the Coding Contract. There is no way to know what a +Coding Contract's exact reward will be until it is solved. + +## Notes + +- The `scp` [Terminal](terminal.md) command does not work on Coding Contracts diff --git a/src/Documentation/ui/doc/basic/companies.md b/src/Documentation/ui/doc/basic/companies.md new file mode 100644 index 000000000..1a950df67 --- /dev/null +++ b/src/Documentation/ui/doc/basic/companies.md @@ -0,0 +1,15 @@ +# Companies + +When exploring the [World](world.md), you can visit various companies. At +these companies, you can apply for jobs. + +Working a job lets you earn money, experience, and [Reputation](reputation.md) with that company. + +While working for a company, you can click `Do something else simultaneously` to be able +to do things while you continue to work in the background. There is a 20% penalty to the +related gains. Clicking the `Focus` button under the overview will return you to the +current work. + +If you've been hired to do a job you can click that `Apply for X Job` button again to get a +promotion if you meet the requirements. You can see the requirements by hovering your cursor +over the button. Higher positions give increased rewards. diff --git a/src/Documentation/ui/doc/basic/crimes.md b/src/Documentation/ui/doc/basic/crimes.md new file mode 100644 index 000000000..ddd290514 --- /dev/null +++ b/src/Documentation/ui/doc/basic/crimes.md @@ -0,0 +1,27 @@ +# Crimes + +Committing crimes is an active gameplay mechanic that allows the player to train +their [Stats](stats.md) and potentially earn money. The player can attempt to commit crimes +by visiting `The Slums` through the `City` tab (Alt + w). +`The Slums` is available in every city. + +## Basic Mechanics + +When you visit `The Slums` you will see a list of buttons that show all of the +available crimes. Simply select one of the options to begin attempting that +crime. Attempting to commit a crime takes a certain amount of time. This time +varies between crimes. + +While doing crimes, you can click `Do something else simultaneously` +to be able to do things while you continue to do crimes in the background. There is a +20% penalty to the related gains. Clicking the `Focus` button under the overview +will return you to the current task. + +Crimes are not always successful. Your rate of success is determined by your +[Stats](stats.md) and [Augmentations](augmentations.md). The odds can be seen on the crime-selection +page. If you are unsuccessful at committing a crime you will gain EXP, +but you will not earn money. If you are successful at committing the crime +you will gain extra EXP (4x of what an unsuccessful attempt would give) +and earn money. + +Harder crimes are typically more profitable, and also give more EXP. diff --git a/src/Documentation/ui/doc/basic/factions.md b/src/Documentation/ui/doc/basic/factions.md new file mode 100644 index 000000000..dd132fff3 --- /dev/null +++ b/src/Documentation/ui/doc/basic/factions.md @@ -0,0 +1,26 @@ +# Factions + +Throughout the game you may receive invitations from factions. There are +many different factions, and each faction has different criteria for +determining its potential members. Joining a faction and furthering +its cause is crucial to progressing in the game and unlocking endgame +content. + +It is possible to join multiple factions if you receive invitations from +them. However, note that joining a faction may prevent you from joining +other rival factions. (Don't worry, this usually isn't the case. Also, +it would only be temporary since resetting the game by installing +[Augmentations](augmentations.md) will clear all your factions) + +The `Factions` link on the menu brings up a list of all factions that +you have joined. You can select a Faction on this list to go to that +Faction page. This page displays general information about the Faction +and also lets you perform work for the faction. Working for a Faction +is similar to working for a [Company](companies.md) except that you don't get paid a +salary. You will only earn [Reputation](reputation.md) in your Faction and train your +[Stats](stats.md). + +Earning [Reputation](reputation.md) for a Faction unlocks powerful [Augmentations](augmentations.md). +Purchasing and installing these [Augmentations](augmentations.md) will upgrade your +abilities. The [Augmentations](augmentations.md) that are available to unlock vary +from Faction to Faction. diff --git a/src/Documentation/ui/doc/basic/hacking.md b/src/Documentation/ui/doc/basic/hacking.md new file mode 100644 index 000000000..2e11bb56a --- /dev/null +++ b/src/Documentation/ui/doc/basic/hacking.md @@ -0,0 +1,102 @@ +# Hacking + +In the year 2077, currency has become digital and decentralized. +People and corporations store their money on [servers](servers.md). By hacking +these [servers](servers.md), you can steal their money and gain experience. + +## Gaining Root Access + +The first step to hacking a [server](servers.md) is to gain root access to that [server](servers.md). +This can be done using the `NUKE.exe` virus. You start the +game with a copy of the `NUKE.exe` virus on your home computer. The +`NUKE.exe` virus attacks the target [server](servers.md)'s open ports using buffer +overflow exploits. When successful, you are granted root +administrative access to the machine. + +In order for the `NUKE.exe` virus to succeed, the target [server](servers.md) +needs to have enough open ports. Some [servers](servers.md) have no +security and will not need any ports opened. Some will have very high +security and will need many ports opened. In order to open ports on +another [server](servers.md), you will need to run programs that attack the [server](servers.md) +to open specific ports. These programs can be coded once your hacking +skill gets high enough, or they can be purchased if you can find a seller. + +**There are two ways to execute port-opening programs and the NUKE virus:** + +1. Connect to the target [server](servers.md) through the [Terminal](terminal.md) and use the `run` command: + + $ run [programName] + +1. Use a function: + +- `nuke` +- `brutessh` +- `ftpcrack` +- `relaysmtp` +- `httpworm` +- `sqlinject` + +**There are two ways to determine how many ports need to be opened +on a [server](servers.md) in order to successfully NUKE it:** + +1. Connect to that [server](servers.md) through the [Terminal](terminal.md) and use the `analyze` command. +1. Use the `getServerNumPortsRequired` function. + +Once you have enough ports opened on a [server](servers.md) and have ran the NUKE virus +to gain root access, you will be able to hack it. + +## General Hacking Mechanics + +When you execute the `hack` command, either manually through the [Terminal](terminal.md) +or automatically through a script, you attempt to hack the [server](servers.md). +This action takes time. The more advanced a [server](servers.md)'s security is, +the more time it will take. Your hacking skill level also affects +the hacking time, with a higher hacking skill leading to shorter +hacking times. Also, running the hack command manually through [Terminal](terminal.md) +is faster than hacking from a script. + +Your attempt to hack a [server](servers.md) will not always succeed. The chance you +have to successfully hack a [server](servers.md) is also determined by the [server](servers.md)'s +security and your hacking skill level. Even if your hacking attempt +is unsuccessful, you will still gain experience points. + +When you successfully hack a [server](servers.md). You steal a certain percentage +of that [server](servers.md)'s total money. This percentage is, once again, determined by the +[server](servers.md)'s security and your hacking skill level. The amount of money +on a [server](servers.md) is not limitless. So, if you constantly hack a [server](servers.md) +and deplete its money, then you will encounter diminishing returns +in your hacking (since you are only hacking a certain percentage). +You can increase the amount of money on a [server](servers.md) using a script and +the `grow` function. + +## Server Security + +Each [server](servers.md) has a security level, typically between `1` and `100`. +A higher number means the [server](servers.md) has stronger security. + +As mentioned above, a [server](servers.md)'s security level is an important factor +to consider when hacking. You can check a [server](servers.md)'s security level +using the `analyze` [Terminal](terminal.md) command. You can +also check a [server](servers.md)'s security in +a script, using the `getServerSecurityLevel` function. + +Whenever a [server](servers.md) is hacked manually or through a script, its security +level increases by a small amount. Calling the `grow` function in a +script will also increase security level of the target [server](servers.md). These +actions will make it harder for you to hack the [server](servers.md), and decrease +the amount of money you can steal. You can lower a [server](servers.md)'s security +level in a script using the `weaken` function. + +This means that a [server](servers.md)'s security level will not fall below this +value if you are trying to `weaken` it. + +## Backdoors + +[server](servers.md) that can be hacked can also have backdoors installed. These backdoors +will provide you with a benefit; the services may be cheaper, penalties may +be reduced or there may be other results. Honeypots exist and will let factions +know when you have succeeded at backdooring their system. Once you have a +backdoor installed, you can connect to that [server](servers.md) directly. + +When you visit a location in the city and see that the name is partially scrambled, +this indicates that you have backdoored the [server](servers.md) related to the location. diff --git a/src/Documentation/ui/doc/basic/hacknet_nodes.md b/src/Documentation/ui/doc/basic/hacknet_nodes.md new file mode 100644 index 000000000..3a4f98cc8 --- /dev/null +++ b/src/Documentation/ui/doc/basic/hacknet_nodes.md @@ -0,0 +1,7 @@ +# Hacknet nodes + +This distributed network of computer allows you to gain money passively. By upgrading a nodes stats you can increase the amount of money it earns. If the cost gets too high it is also possile to purchase brand new nodes. + +Hacknet nodes won't make as much money as scripts but they can be useful at the start. + +There is a very powerful upgrade to them called [Hacknet Servers](../advanced/hacknetservers.md) diff --git a/src/Documentation/ui/doc/basic/infiltration.md b/src/Documentation/ui/doc/basic/infiltration.md new file mode 100644 index 000000000..42fcda853 --- /dev/null +++ b/src/Documentation/ui/doc/basic/infiltration.md @@ -0,0 +1,68 @@ +# Infiltration + +Infiltration is a gameplay mechanic that allows you to infiltrate a +[Company](companies.md)'s facility to try and steal the [Company](companies.md)'s classified secrets. +These secrets can be sold for money or for [Reputation](reputation.md) with a [Faction](factions.md). + +## Overview + +Many companies have facilities that you can attempt to infiltrate. +By infiltrating, you can steal classified [Company](companies.md) secrets and then sell +these for money or for [Faction](factions.md) [Reputation](reputation.md). To try and infiltrate a [Company](companies.md), +visit a [Company](companies.md) through the [World](world.md) menu. There will be an option that +says 'Infiltrate [Company](companies.md)'. + +When infiltrating a [Company](companies.md) you will be presented with short active challenges. +None of the challenges use the mouse. + +The difficulty at the top lowers with better combat stats and charisma. It is not recommended +to attempt infiltrations above mid-normal. + +The `maximum level` is the number of challenges you will need to pass to receive +the infiltration reward. + +Every time you fail an infiltration challenge, you will take damage based on the +difficulty of the infiltration. If you are reduced to `0` hp or below, the +infiltration will immediately end. + +- Most use spacebar as `action` +- Some use WASD or arrows interchangeably. +- A few others use the rest of the keyboard. + +### Slash when his guard is down! + +Press space when the guard is preparing to attack you. +There's 3 phases +The first is guarding, where attacking back will result in failure. +The 2nd is preparing, where attacking will result in a victory. +The 3rd is attack, where the guard will attack you resulting in failure. + +### 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. diff --git a/src/Documentation/ui/doc/basic/ram.md b/src/Documentation/ui/doc/basic/ram.md new file mode 100644 index 000000000..fcb53c4ed --- /dev/null +++ b/src/Documentation/ui/doc/basic/ram.md @@ -0,0 +1,7 @@ +# RAM + +In bitburner RAM determines how many [Scripts](scripts.md) can run on a [Server](servers.md). + +Multiplying the number of threads a [Script](scripts.md) uses multiplies it RAM cost but also multiplies the effectiveness of several functions, like `ns.hack()`, `ns.grow()`, and `ns.weaken()`. + +You can purchase more RAM for your home computer from tech vendors. You can also use other computers as source of additional RAM. diff --git a/src/Documentation/ui/doc/basic/reputation.md b/src/Documentation/ui/doc/basic/reputation.md new file mode 100644 index 000000000..4fc6148eb --- /dev/null +++ b/src/Documentation/ui/doc/basic/reputation.md @@ -0,0 +1,9 @@ +# Reputation + +In order to acquire [Augmentations](augmentations.md) from [Factions](factions.md) you need to acquire their trust. + +This can be done in a variety of ways but the most common is offering your services to a [Faction](faction.md). But also from [Infiltrations](infiltration.md). + +When installing [Augmentations](augmentations.md) all your reputation gets converted to favor. Favor increases the rate at which reputation is gained with that faction. + +With enough favor, donations are unlocked. Donations allow you to spend money to acquire reputation directly. Without working for the faction. This feature is particularily useful when a very large amount of reputation is needed for an augmentation. diff --git a/doc/source/basicgameplay/scripts.rst b/src/Documentation/ui/doc/basic/scripts.md similarity index 55% rename from doc/source/basicgameplay/scripts.rst rename to src/Documentation/ui/doc/basic/scripts.md index 254c605bf..6303cd5e9 100644 --- a/doc/source/basicgameplay/scripts.rst +++ b/src/Documentation/ui/doc/basic/scripts.md @@ -1,57 +1,51 @@ -.. _gameplay_scripts: +# Scripts -Scripts -======= Scripts are programs that can be used to automate the hacking process and almost every other part of the game. Scripts must be written -in the :ref:`netscript` language. +in javascript. It is highly recommended that you have a basic background in programming to start writing scripts. You by no means need to be an expert. All you need is some familiarity with basic programming constructs like -for/while loops, conditionals (if/else), functions, variables, etc. +`for`/`while` loops, conditionals (`if`/`else`), `functions`, `variables`, etc. If you'd like to learn a little bit about programming, see -:ref:`netscriptlearntoprogram`. +[this page](../programming/learn.md). + +## Script Arguments -Script Arguments -^^^^^^^^^^^^^^^^ When running a script, you can choose to pass arguments to that script. The script's logic can access and act on these arguments. This allows -for flexibility in your scripts. For more details, see -:ref:`netscript_script_arguments`. +for flexibility in your scripts. For information on how to run scripts with arguments, see -:ref:`gameplay_working_with_scripts_in_terminal` and -:ref:`gameplay_working_with_scripts_in_netscript` below. +[Scripts](scripts.md) + +## Identifying a Script -Identifying a Script -^^^^^^^^^^^^^^^^^^^^ Many commands and functions act on an executing script (i.e. a script that is running). Therefore, there must be a way to specify which script you want those commands & functions to act on. The best way to identify a script is by its PID (Process IDentifier). This -unique number is returned from :js:func:`run`, :js:func:`exec`, etc., and also -shows in the output of "ps". +unique number is returned from `run`, `exec`, etc., and also +shows in the output of `ps`. A secondary way to identify scripts is by name **and** arguments. However (by default) you can run a multiple copies of a script with the same arguments, so this does not necessarily **uniquely** identify a script. In case of multiple matches, most functions will return an arbitrary one (typically the first one -to be started). An exception is :js:func:`kill`, which will kill all the +to be started). An exception is `kill`, which will kill all the matching scripts. The arguments must be an **exact** match. This means that both the order and type of the arguments matter. -.. _gameplay_scripts_multithreadingscripts: +## Multithreading scripts -Multithreading scripts -^^^^^^^^^^^^^^^^^^^^^^ A script can be run with multiple threads. This is also called multithreading. The effect of multithreading is that every call to the -:js:func:`hack`, :js:func:`grow`, and :js:func:`weaken` Netscript functions +`hack`, `grow`, and `weaken` functions will have their results multiplied by the number of threads. For example, if a normal single-threaded script is able to hack $10,000, then running the same script with 5 threads would @@ -61,30 +55,28 @@ yield $50,000. Scripts will not actually become multithreaded in the real-world sense.) -When multithreading a script, the total RAM cost can be calculated by -simply multiplying the base RAM cost of the script with the number of -threads, where the base cost refers to the amount of RAM required to -run the script single-threaded. In the terminal, you can run the -:ref:`mem_terminal_command` Terminal command to see how much RAM a script +When multithreading a script, the total [RAM](ram.md) cost can be calculated by +simply multiplying the base [RAM](ram.md) cost of the script with the number of +threads, where the base cost refers to the amount of [RAM](ram.md) required to +run the script single-threaded. In the [terminal](terminal.md), you can run the +`mem` [Terminal](terminal.md) command to see how much [RAM](ram.md) a script requires with `n` threads:: $ mem [scriptname] -t n -.. _gameplay_working_with_scripts_in_terminal: +## Working with Scripts in Terminal -Working with Scripts in Terminal -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Running a script requires RAM. The more complex a script is, the more -RAM it requires to run. Scripts can be run on any server you have root +Running a script requires [RAM](ram.md). The more complex a script is, the more +[RAM](ram.md) it requires to run. Scripts can be run on any [server](server.md) you have root access to. -Here are some :ref:`terminal` commands that are useful when working +Here are some [terminal](terminal.md) commands that are useful when working with scripts: **check [script] [args...]** Prints the logs of the script specified by the name and arguments to -Terminal. Arguments should be separated by a space. Remember that scripts +[Terminal](terminal.md). Arguments should be separated by a space. Remember that scripts are uniquely identified by their arguments as well as their name. For example, if you ran a script `foo.js` with the argument `foodnstuff` then in order to 'check' it you must also add the `foodnstuff` argument @@ -94,7 +86,7 @@ to the check command:: **free** -Shows the current server's RAM usage and availability +Shows the current server's [RAM](ram.md) usage and availability **kill [pid]** or **kill [script] [args...]** @@ -102,27 +94,26 @@ Stops a script that is running with the specified PID, or script name and arguments. Arguments should be separated by a space. Remember that scripts are identified by their arguments as well as their name. For example, if you ran a script `foo.js` with -the argument 1 and 2, then just typing "`kill foo.js`" will -not work. You have to use:: +the argument 1 and 2, then just typing `kill foo.js` will +not work. You have to use: $ kill foo.js 1 2 **mem [script] [-t] [n]** -Check how much RAM a script requires to run with n threads +Check how much [RAM](ram.md) a script requires to run with n threads **nano [script]** -Create/Edit a script. The name of the script must end with a valid -extension: .script, or .js +Create/Edit a script. The name of the script must end with `.js` **ps** -Displays all scripts that are actively running on the current server +Displays all scripts that are actively running on the current [server](servers.md) **rm [script]** -Delete a script from the server. This is permanent +Delete a script from the [server](servers.md). This is permanent **run [script] [-t] [n] [args...]** @@ -133,64 +124,56 @@ with no arguments. Examples: -Run 'foo.js' single-threaded with no arguments:: +Run `foo.js` single-threaded with no arguments:: $ run foo.js -Run 'foo.js' with 10 threads and no arguments:: +Run `foo.js` with 10 threads and no arguments: $ run foo.js -t 10 -Run 'foo.js' single-threaded with three arguments: [foodnstuff, sigma-cosmetics, 10]:: +Run `foo.js` single-threaded with three arguments: [foodnstuff, sigma-cosmetics, 10]: $ run foo.js foodnstuff sigma-cosmetics 10 -Run 'foo.js' with 50 threads and a single argument: [foodnstuff]:: +Run `foo.js` with 50 threads and a single argument: [foodnstuff]: $ run foo.js -t 50 foodnstuff - **tail [pid]** or **tail [script] [args...]** Displays the logs of the script specified by the PID or name and arguments. Note that - scripts are identified by their arguments as well as their name. For example, - if you ran a script 'foo.js' with the argument 'foodnstuff' then in order to - 'tail' it you must also add the 'foodnstuff' argument to the tail command as - so: tail foo.js foodnstuff +scripts are identified by their arguments as well as their name. For example, +if you ran a script `foo.js` with the argument `foodnstuff` then in order to +`tail` it you must also add the `foodnstuff` argument to the tail command as +so: `tail foo.js foodnstuff` **top** -Displays all active scripts and their RAM usage +Displays all active scripts and their [RAM](ram.md) usage -.. _gameplay_working_with_scripts_in_netscript: +## Notes about how Scripts work offline -Working with Scripts in Netscript -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -TODO/Coming Soon... - -Notes about how Scripts Work Offline -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The scripts that you write and execute are interpreted in Javascript. +The scripts that you write and execute are in Javascript. For this reason, it is not possible for these scripts to run while offline (when the game is closed). It is important to note that for -this reason, conditionals such as if/else statements and certain -commands such as purchaseHacknetNode() or nuke() will not work while +this reason, conditionals such as `if`/`else` statements and certain +commands such as `purchaseHacknetNode()` or `nuke()` will not work while the game is offline. However, Scripts WILL continue to generate money and hacking exp for you while the game is offline. This offline production is based off of the scripts' production while the game is online. -grow() and weaken() are two Netscript commands that will also be +`grow()` and `weaken()` are two functions that will also be applied when the game is offline, although at a slower rate compared to if the game was open. This is done by having each script keep -track of the rate at which the grow() and weaken() commands are called +track of the rate at which the `grow()` and `weaken()` commands are called when the game is online. These calculated rates are used to determine how many times these function calls would be made while the game is offline. -Also, note that because of the way the Netscript interpreter is -implemented, whenever you reload or re-open the game all of the +Also, note that because of the way the javascript engine works, whenever you reload or re-open the game all of the scripts that you are running will start running from the BEGINNING of the code. The game does not keep track of where exactly the execution of a script is when it saves/loads. diff --git a/src/Documentation/ui/doc/basic/servers.md b/src/Documentation/ui/doc/basic/servers.md new file mode 100644 index 000000000..21ed860c3 --- /dev/null +++ b/src/Documentation/ui/doc/basic/servers.md @@ -0,0 +1,77 @@ +# Servers + +In this game, a server refers to a computer that can be connected to, +accessed, and manipulated through the [Terminal](terminal.md). All servers in the +game are connected to each other to form a large, global network. +To learn about how to navigate this network and connect to other +servers, see the [terminal](terminal.md) page. + +## Server Statistics + +Each server has it's own statistics, such as [RAM](ram.md), required hacking level and number of +ports required to successfully `NUKE` it. + +Perhaps the most important property of a server to make note of is its [RAM](ram.md), +which refers to how much memory is available on that machine. [RAM](ram.md) is +important because it is required to run [Scripts](scripts.md). More [RAM](ram.md) allows +the user to run more powerful and complicated [scripts](scripts.md) as well as executing +a script with more threads. + +The `free`, `scan-analyze`, and `analyze` [Terminal](terminal.md) commands +can be used to check how much [RAM](ram.md) a server has. + +Some servers have some randomized statistics, such as [RAM](ram.md), max Money or +required hacking level. These statistics are randomly generated from a range of values. + +## Identifying Servers + +A server is identified by its hostname. +A hostname is a label assigned to a server. +A hostname will usually give you a general idea of what the server +is. For example, the company Nova Medical might have a server with +the hostname `nova-med`. + +Hostnames are unique. This means that if one +server has the the hostname `some-server`, then no other server +in the game can have that that hostname. + +There are many `functions` +and [terminal](terminal.md) commands in the game +that will require you to target a specific server by hostname. + +## Player-owned Servers + +The player starts with a single server: his/her home computer. +This server will have the hostname `home`. The player's home +computer is special for a variety of reasons: + +1. The home computer's [RAM](ram.md) can be upgraded. This can be done by visiting + certain locations in the World. + +2. The home computer persists through [Augmentation](augmentations.md) Installations. This means + that you will not lose any [RAM](ram.md) upgrades or [Scripts](scripts.md) on your + home computer when you install [Augmentations](augmentations.md) (you will + however, lose programs and messages on your home computer). + +The player can also purchase additional servers. This can be +done by visiting certain locations in the World, or it can be +done automatically through a script using the `purchaseServer` +function. The advantage of purchased servers is that, +in terms of [RAM](ram.md), they are cheaper than upgrading your home +computer. The disadvantage is that your purchased servers +are lost when you install [Augmentations](augmentations.md). + +## Hackable Servers + +Most servers that are not owned by the player can be hacked for money +and exp. See the hacking page for more details. + +Different servers have different levels of security, but also offer +different rewards when being hacked. + +## Server Connections + +The servers are in a randomly organized tree-structure. The distance from +the home computer to each server is fixed, but the exact route to them is +randomized when you install [augmentations](augmentations.md). In general the +further away from home computer a server is the higher it's statistics are. diff --git a/src/Documentation/ui/doc/basic/stats.md b/src/Documentation/ui/doc/basic/stats.md new file mode 100644 index 000000000..b03240da0 --- /dev/null +++ b/src/Documentation/ui/doc/basic/stats.md @@ -0,0 +1,114 @@ +# Stats + +The player has several stats that can be increased in order to progress +in the game. + +## Hacking + +Represents the player's ability to code and hack. + +Affects: + +- Time it takes to hack a server +- Time it takes to execute the `grow()` and `weaken()` function +- Chance to successfully hack a server +- Percent money stolen when hacking a server +- Success rate of certain [crimes](crimes.md) +- Time it takes to create a program +- [Faction](factions.md) [Reputation](reputation.md) gain when carrying out Hacking Contracts or Field Work +- [Company](companies.md) [Reputation](reputation.md) gain for certain jobs + +Gain experience by: + +- Manually hacking servers through [Terminal](terminal.md) +- Executing `hack()`, `grow()`, or `weaken()` through a script +- Committing certain [crimes](crimes.md) +- Carrying out Hacking Contracts or doing Field work for [Factions](factions.md) +- Working certain jobs at a [Company](companies.md) +- Studying at a university + +## Strength + +Represents the player's physical offensive power + +Affects: + +- Success rate of certain [crimes](crimes.md) +- [Faction](factions.md) [Reputation](reputation.md) gain for Security and Field Work +- [Company](companies.md) [Reputation](reputation.md) gain for certain jobs + +Gain experience by: + +- Committing certain [crimes](crimes.md) +- Working out at a gym +- Doing Security/Field Work for a [Faction](factions.md) +- Working certain jobs at a [Company](companies.md) + +## Defense + +Represents the player's ability to withstand damage + +Affects: + +- Success rate of certain [crimes](crimes.md) +- The player's HP +- [Faction](factions.md) [Reputation](reputation.md) gain for Security and Field Work +- [Company](companies.md) [Reputation](reputation.md) gain for certain jobs + +Gain experience by: + +- Committing certain [crimes](crimes.md) +- Working out at a gym +- Doing Security/Field Work for a [Faction](factions.md) +- Working certain jobs at a [Company](companies.md) + +## Dexterity + +Represents the player's skill and adeptness in performing certain tasks + +Affects: + +- Success rate of certain [crimes](crimes.md) +- [Faction](factions.md) [Reputation](reputation.md) gain for Security and Field Work +- [Company](companies.md) [Reputation](reputation.md) gain for certain jobs + +Gain experience by: + +- Committing certain [crimes](crimes.md) +- Working out at a gym +- Doing Security/Field Work for a [Faction](factions.md) +- Working certain jobs at a [Company](companies.md) + +## Agility + +Represents the player's speed and ability to move + +Affects: + +- Success rate of certain [crimes](crimes.md) +- [Faction](factions.md) [Reputation](reputation.md) gain for Security and Field Work +- [Company](companies.md) [Reputation](reputation.md) gain for certain jobs + +Gain experience by: + +- Committing certain [crimes](crimes.md) +- Working out at a gym +- Doing Security/Field Work for a [Faction](factions.md) +- Working certain jobs at a [Company](companies.md) + +## Charisma + +Represents the player's social abilities + +Affects: + +- Success rate of certain [crimes](crimes.md) +- [Faction](factions.md) [Reputation](reputation.md) gain for Field Work +- [Company](companies.md) [Reputation](reputation.md) gain for most jobs + +Gain experience by: + +- Committing certain [crimes](crimes.md) +- Studying at a university +- Working a relevant job at a [Company](companies.md) +- Doing Field work for a [Faction](factions.md) diff --git a/doc/source/basicgameplay/stockmarket.rst b/src/Documentation/ui/doc/basic/stockmarket.md similarity index 58% rename from doc/source/basicgameplay/stockmarket.rst rename to src/Documentation/ui/doc/basic/stockmarket.md index c8734c29a..f78cc0c04 100644 --- a/doc/source/basicgameplay/stockmarket.rst +++ b/src/Documentation/ui/doc/basic/stockmarket.md @@ -1,23 +1,21 @@ -.. _gameplay_stock_market: +# Stock Market -Stock Market -============ The Stock Market refers to the World Stock Exchange (WSE), through which you can buy and sell stocks in order to make money. -The WSE can be found in the 'City' tab, and is accessible in every city. +The WSE can be found in the `City` tab, and is accessible in every city. + +## Fundamentals -Fundamentals ------------- The Stock Market is not as simple as "buy at price X and sell at price Y". The following are several fundamental concepts you need to understand about the stock market. -.. note:: For those that have experience with finance/trading/investing, please be aware - that the game's stock market does not function exactly like it does in the real - world. So these concepts below should seem similar, but won't be exactly the same. +For those that have experience with finance/trading/investing, please be aware +that the game's stock market does not function exactly like it does in the real +world. So these concepts below should seem similar, but won't be exactly the same. + +## Positions: Long vs Short -Positions: Long vs Short -^^^^^^^^^^^^^^^^^^^^^^^^ When making a transaction on the stock market, there are two types of positions: Long and Short. A Long position is the typical scenario where you buy a stock and earn a profit if the price of that stock increases. Meanwhile, a Short position @@ -25,34 +23,32 @@ is the exact opposite. In a Short position you purchase shares of a stock and earn a profit if the price of that stock decreases. This is also called 'shorting' a stock. -.. note:: Shorting stocks is not available immediately, and must be unlocked later in the - game. +Shorting stocks is not available immediately, and must be unlocked later in the +game. + +## Forecast & Second-Order Forecast -Forecast & Second-Order Forecast -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A stock's forecast is its likelihood of increasing or decreasing in value. The forecast is typically represented by its probability of increasing in either -a decimal or percentage form. For example, a forecast of 70% means the stock -has a 70% chance of increasing and a 30% chance of decreasing. +a decimal or percentage form. For example, a forecast of `70%` means the stock +has a `70%` chance of increasing and a `30%` chance of decreasing. A stock's second-order forecast is the target value that its forecast trends towards. -For example, if a stock has a forecast of 60% and a second-order forecast of 70%, -then the stock's forecast should slowly trend towards 70% over time. However, this is -determined by RNG so there is a chance that it may never reach 70%. +For example, if a stock has a forecast of `60%` and a second-order forecast of `70%`, +then the stock's forecast should slowly trend towards `70%` over time. However, this is +determined by RNG so there is a chance that it may never reach `70%`. Both the forecast and the second-order forecast change over time. A stock's forecast can be viewed after purchasing Four Sigma (4S) Market Data access. This lets you see the forecast info on the Stock Market UI. If you also purchase access to the 4S Market Data TIX API, then you can view a stock's forecast -using the :js:func:`getStockForecast` function. +using the `getStockForecast` function. A stock's second-order forecast is always hidden. -.. _gameplay_stock_market_spread: +## Spread (Bid Price & Ask Price) -Spread (Bid Price & Ask Price) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The **bid price** is the maximum price at which someone will buy a stock on the stock market. @@ -72,8 +68,8 @@ bid price. Note that this is reversed for a short position. Purchasing a stock in the short position will occur at the stock's bid price, and selling a stock in the short position will occur at the stock's ask price. -Transactions Influencing Stock Forecast -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +## Transactions Influencing Stock Forecast + Buying or selling a large number of shares of a stock will influence that stock's forecast & second-order forecast. The forecast is the likelihood that the stock will increase or decrease in price. @@ -83,15 +79,13 @@ More shares will have a bigger effect. The effect that transactions have on a stock's second-order forecast is significantly smaller than the effect on its forecast. -.. _gameplay_stock_market_order_types: +## Order Types -Order Types -^^^^^^^^^^^ There are three different types of orders you can make to buy or sell stocks on the exchange: Market Order, Limit Order, and Stop Order. -.. note:: Limit Orders and Stop Orders are not available immediately, and must be unlocked - later in the game. +Limit Orders and Stop Orders are not available immediately, and must be unlocked +later in the game. When you place a Market Order to buy or sell a stock, the order executes immediately at whatever the current price of the stock is. For example if you choose to short a stock @@ -133,76 +127,76 @@ A Stop Order to buy will execute if the stock's price <= order's price A Stop Order to sell will execute if the stock's price >= order's price. -.. _gameplay_stock_market_player_actions_influencing_stock: +## Player Actions Influencing Stocks -Player Actions Influencing Stocks -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It is possible for your actions elsewhere in the game to influence the stock market. Hacking - If a server has a corresponding stock (e.g. *foodnstuff* server -> FoodNStuff - stock), then hacking that server can decrease the stock's second-order - forecast. This causes the corresponding stock's forecast to trend downwards in value - over time. +If a server has a corresponding stock (e.g. _foodnstuff_ server -> FoodNStuff +stock), then hacking that server can decrease the stock's second-order +forecast. This causes the corresponding stock's forecast to trend downwards in value +over time. - This effect only occurs if you set the *stock* option to - true when calling the :js:func:`hack` function. The chance that hacking a - server will cause this effect is based on what percentage of the - server's total money you steal. +This effect only occurs if you set the stock option to +true when calling the `hack` function. The chance that hacking a +server will cause this effect is based on what percentage of the +server's total money you steal. - A single hack will have a minor - effect, but continuously hacking a server for lots of money over time - will have a noticeable effect in making the stock's forecast trend downwards. +A single hack will have a minor +effect, but continuously hacking a server for lots of money over time +will have a noticeable effect in making the stock's forecast trend downwards. -Growing - If a server has a corresponding stock (e.g. *foodnstuff* server -> FoodNStuff - stock), then growing that server's money can increase the stock's - second-order forecast. This causes the corresponding stock's - forecast to trend upwards in value over time. +## Growing - This effect only occurs if you set the *stock* option to true when calling the - :js:func:`grow` function. The chance that growing a server will cause this - effect is based on what percentage of the server's total money to add to it. +If a server has a corresponding stock (e.g. `foodnstuff` server -> FoodNStuff +stock), then growing that server's money can increase the stock's +second-order forecast. This causes the corresponding stock's +forecast to trend upwards in value over time. - A single grow operation will have a minor effect, but continuously growing - a server for lots of money over time will have a noticeable effect in making - the stock's forecast trend upwards. +This effect only occurs if you set the `stock` option to true when calling the +`grow` function. The chance that growing a server will cause this +effect is based on what percentage of the server's total money to add to it. -Working for a Company - If a company has a corresponding stock, then working for that company will - increase the corresponding stock's second-order forecast. This will - cause the stock's forecast to (slowly) trend upwards in value - over time. +A single grow operation will have a minor effect, but continuously growing +a server for lots of money over time will have a noticeable effect in making +the stock's forecast trend upwards. - The potency of this effect is based on how "effective" you are when you work - (i.e. its based on your stats and multipliers). +## Working for a Company + +If a [Company](companies.md) has a corresponding stock, then working for that [Company](companies.md) will +increase the corresponding stock's second-order forecast. This will +cause the stock's forecast to (slowly) trend upwards in value +over time. + +The potency of this effect is based on how effective you are when you work +(i.e. its based on your stats and multipliers). + +## Automating the Stock Market -Automating the Stock Market ---------------------------- You can write scripts to perform automatic and algorithmic trading on the Stock Market. -See `TIX API `_ for more details. +See [TIX API](https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.tix.md) for more details. + +## Under the Hood -Under the Hood --------------- Stock prices are updated every ~6 seconds. -Whether a stock's price moves up or down is determined by RNG. However, +Whether a stock's price moves up or down is random. However, stocks have properties that can influence the way their price moves. These properties are hidden, although some of them can be made visible by purchasing the Four Sigma (4S) Market Data upgrade. Some examples of these properties are: -* Volatility -* Likelihood of increasing or decreasing (i.e. the stock's forecast) -* Likelihood of forecast increasing or decreasing (i.e. the stock's second-order forecast) -* How easily a stock's price/forecast is influenced by transactions -* Spread percentage -* Maximum price (not a real maximum, more of a "soft cap") +- Volatility +- Likelihood of increasing or decreasing (i.e. the stock's forecast) +- Likelihood of forecast increasing or decreasing (i.e. the stock's second-order forecast) +- How easily a stock's price/forecast is influenced by transactions +- Spread percentage +- Maximum price (not a real maximum, more of a "soft cap") Each stock has its own unique values for these properties. -Offline Progression -------------------- +## Offline Progression + The Stock Market does not change or process anything while the game has closed. However, it does accumulate time when offline. This accumulated time allows -the stock market to run 50% faster when the game is opened again. This means +the stock market to run `50%` faster when the game is opened again. This means that stock prices will update every ~4 seconds instead of 6. diff --git a/src/Documentation/ui/doc/basic/terminal.md b/src/Documentation/ui/doc/basic/terminal.md new file mode 100644 index 000000000..2d6713a0a --- /dev/null +++ b/src/Documentation/ui/doc/basic/terminal.md @@ -0,0 +1,130 @@ +# Terminal + +The Terminal is a console emulator program that lets you interface with all of the +Servers in the game. The Terminal can be accessed by clicking the `Terminal` tab +on the navigation menu on the left-hand side of the game (you may need to expand +the 'Hacking' header in order to see the `Terminal` tab). Alternatively, the shortcut Alt + t can be used to open the Terminal. + +## Filesystem (Directories) + +The Terminal contains a **very** basic filesystem that allows you to store and +organize your files into different directories. Note that this is **not** a true +filesystem implementation. Instead, it is done almost entirely using string manipulation. +For this reason, many of the nice & useful features you'd find in a real +filesystem do not exist. + +Here are the Terminal commands you'll commonly use when dealing with the filesystem. + +- `ls` (view all files in the current folder) +- `cd` (change folder) +- `mv` (rename a file) + +## Directories + +In order to create a directory, simply name a file using a full absolute Linux-style path: + + /scripts/myScript.js + +This will automatically create a "directory" called `scripts`. This will also work +for subdirectories: + + /scripts/hacking/helpers/myHelperScripts.js + +Files in the root directory do not need to begin with a forward slash: + + thisIsAFileInTheRootDirectory.txt + +Note that there is no way to manually create or remove directories. The creation and +deletion of directories is automatically handled as you name/rename/delete +files. + +## Absolute vs Relative Paths + +Many Terminal commands accept both absolute and relative paths for specifying a +file. + +An absolute path specifies the location of the file from the root directory (/). +Any path that begins with the forward slash is an absolute path: + + $ nano /scripts/myScript.js + $ cat /serverList.txt + +A relative path specifies the location of the file relative to the current working directory. +Any path that does **not** begin with a forward slash is a relative path. Note that the +Linux-style dot symbols will work for relative paths: + + . (a single dot) - represents the current directory + .. (two dots) - represents the parent directory + + $ cd .. + $ nano ../scripts/myScript.js + $ nano ../../helper.js + +## Scripts + +Note that in order to reference a file, `functions` require the +**full** absolute file path. For example + + ns.run("/scripts/hacking/helpers.myHelperScripts.js"); + ns.rm("/logs/myHackingLogs.txt"); + ns.rm("thisIsAFileInTheRootDirectory.txt"); + +A full file path **must** begin with a forward slash (/) if that file +is not in the root directory. + +## Missing Features + +These features that are typically in Linux filesystems have not yet been added to the game: + +- Tab autocompletion does not work with relative paths +- `mv` only accepts full filepaths for the destination argument. It does not accept directories + +## Argument Parsing + +When evaluating a terminal command, arguments are initially parsed based on whitespace (usually spaces). +Each whitespace character signifies the end of an argument, and potentially the start +of new one. For most terminal commands, this is all you need to know. + +When running scripts, however, it is important to know in more detail how arguments are parsed. +There are two main points: + +1. Quotation marks can be used to wrap a single argument and force it to be parsed as + a string. Any whitespace inside the quotation marks will not cause a new argument + to be parsed. +2. Anything that can represent a number is automatically cast to a number, unless its + surrounded by quotation marks. + +Here's an example to show how these rules work. Consider the following script `argType.js`: + + export async function main(ns) { + ns.tprint("Number of args: " + ns.args.length); + for (var i = 0; i < ns.args.length; ++i) { + ns.tprint(typeof ns.args[i]); + } + } + +Then if we run the following terminal command: + + $ run argType.js 123 1e3 "5" "this is a single argument" + +We'll see the following in the Terminal: + + Running script with 1 thread(s) and args: [123, 1000, "5", "this is a single argument"]. + May take a few seconds to start up the process... + argType.js: Number of args: 4 + argType.js: number + argType.js: number + argType.js: string + argType.js: string + +## Chaining Commands + +You can run multiple Terminal commands at once by separating each command +with a semicolon (;). + +Example: + + $ run foo.js; tail foo.js + +This does `not` wait for commands with a delay to finish executing, so it +generally doesn't work with things like `hack`, `wget`, etc. diff --git a/src/Documentation/ui/doc/basic/world.md b/src/Documentation/ui/doc/basic/world.md new file mode 100644 index 000000000..628695b92 --- /dev/null +++ b/src/Documentation/ui/doc/basic/world.md @@ -0,0 +1,14 @@ +# World + +In Bitburner, the world consists of six different cities: + +- Sector-12 (this is where you start out) +- Aevum +- Ishima +- New Tokyo +- Chongqing +- Volhaven + +Each city has it's own map and [Factions](factions.md). Each city also +offers different services, such as gyms, universities, hardware +stores and places of work. diff --git a/src/Documentation/ui/doc/changelog.md b/src/Documentation/ui/doc/changelog.md new file mode 100644 index 000000000..c0b4179dc --- /dev/null +++ b/src/Documentation/ui/doc/changelog.md @@ -0,0 +1,3837 @@ +.. \_changelog: + +# Changelog + +## v2.3.1 - Bugfixes 7 June 2023 + +NETSCRIPT: + +- Added ns.setTitle, which sets the titlebar of a script's tail window (@d0sboots) +- Added ns.getFunctionRamCost, which gets the ramcost of a function (@G4mingJon4s) +- ns.ls results will filter as if the filenames have a leading slash (@Snarling) + +GENERAL / MISC: + +- Changed tail window buttons into icon buttons, allow setting custom title, and tail window bugfixes. (@d0sboots) +- Terminal no longer scrolls to the bottom constantly while an action is being performed (@bezrodnov) +- Added a close button to modals (@bezrodnov) +- Fixed several issues with script editor tabs (@bezrodnov) +- scp terminal command can copy multiple files at once, like help text indicates (@Snarling) +- Root directory is no longer displayed as ~ in the terminal prompt, it is displayed as / (@Snarling) +- cd with no arguments will change to the root directory (@Snarling) +- Documentation updates (various) +- Nerf noodle bar + +HOTFIXES (these were already backported to 2.3.0 before 2.3.1 release): + +- Several important fixes for savegame migration issues from older version (@d0sboots) +- Prevent scripts from loading during intial migration to 2.3.0 save format, to prevent a crash that could occur. (@Snarling) +- Fix scp logging (hostname was being logged incorrectly in multiple places and showing as [Object object]) (@Snarling) +- Update terminal parsing logic so that the old syntax for alias works again. (@Snarling) +- Fix clickable script links from ls command not working outside root directory (@Snarling) +- Fix an issue with Find All Valid Math Expressions not accepting empty array when that was the solution. (@Snarling) +- Fix an issue with scan-analyze display when the player had AutoLink.exe (@Snarling) +- Reverted undocumented change that program filenames were case sensitive for ns.fileExists. They are case insensitive again. (@Snarling) +- An issue from pre-2.3 could cause scripts to have the wrong "server" property. This caused issues in 2.3, and a fix now repairs any scripts with a mismatched server property. (@Snarling) +- More fixes to help old savegames load correctly (@Snarling) +- Servers can no longer have infinite time-to-hack. (@Snarling) + +SPOILER SECTIONS: + +SF2: + +- Overall gang respect gain rate now reads accurately, instead of showing ~10x. (@Snarling) + +SF3: + +- Added "maxProducts" property to ns.corporation.getDivision return value (@kateract) +- Fixed an issue with sell price parsing for materials (@zerbosh) +- Fixed display of market price for materials and products (@zerbosh) +- Fixes for Corp import/export issues, such as -IPROD and Smart Supply not working right (@d0sboots) +- Improvements to the max-affordable-upgrades calculation (@bezrodnov) +- Perform additional validation when setting up an export. Exports are now unique per targeted division+city. (@Snarling) +- ns.corporation.cancelExport no longer requires the exported amount (@Snarling) +- Fix NaN bug that could impact Robot material in Robotics division (@Snarling, @kateract) +- Can no longer commence product development in a city with no office (which would immediately error out the game loop) (@Snarling) +- (Hotfix) Fix issue that could lead to SF3 research desync. (@Snarling) +- (Hotfix) Fix SF3 "Spring Water" industry (@Snarling) + +SF4: + +- Fixed an issue that could cause singularity run-after-reset callback scripts to not launch correctly (@Snarling) + +## v2.3.0 - SF3 rework and performance improvements (25 May 2023) + +BREAKING CHANGES: These changes may require changes to your scripts. + +- Major changes to the SF3 mechanic. See the related section below for more detailed info on the changes. +- The same script filename can now be ran multiple times with the same args. If running a script from another script (ns.run/ns.exec/etc), this limitation can be re-imposed with the preventDuplicates RunOption (see general section for info on RunOptions). +- The same .js script will now be the same js module whether the script was ran directly or used as an import. This means top-level variables (variables defined outside of any function) are shared across all instances of the script. +- The js module for a script will also be reused by any script that has the exact same compiled text, even if that script is on another server or has a different filename. This can lead to unexpected results when using top-level variables. +- Some properties removed from ns.getPlayer and added to a separate function ns.getResetInfo. These are still accessible from getPlayer but will produce a warning message the first time they are accessed per game session. +- hackAnalyzeThreads now returns -1, instead of 0, when no money can be hacked from the targeted server. +- ns.iKnowWhatImDoing has been removed, replaced by ns.tprintRaw for printing custom react content to the terminal (limited support). + +PERFORMANCE: + +- Minimize impact of unavoidable memory leak when modules are created, by reusing modules as much as possible (@d0sboots) +- Internal data structure changes (@d0sboots, @Snarling) +- Fix memory leak when initializing large number of netscript ports (@Snarling) +- Improve performance while on the Active Scripts page if many scripts are starting/ending. (@d0sboots) + +NETSCRIPT GENERAL: + +- Remove requirement for script args to be unique. This was also related to performance improvements. (@d0sboots) +- ns.hackAnalyzeThreads no longer indicates infinity any time a single thread would hack less than $1 (@Snarling) +- ns.renamePurchasedServer no longer crashes if player is connected to the server being renamed (@Snarling) +- ns.hackAnalyzeThreads now return -1 (instead of 0) if no money can be hacked from the targeted server. (@d0sboots) +- Fix a possible infinite atExit loop if a script killed itself. (@Snarling) +- Static timestamps of last resets can be obtained via ns.getResetInfo, replacing playtimeSinceLastX from ns.getPlayer (@G4mingJon4s) +- Improved support for printing react content directly to the terminal (ns.tprintRaw) or to a script log (ns.printRaw). +- Added RunOptions, which can optionally replace the "threads" argument for ns.run/ns.exec/ns.spawn. (@d0sboots) + - RunOptions.threads: Provide a thread count (since RunOptions can replace the threads argument) + - RunOptions.temporary: Prevents the script execution from being included in the save file. + - RunOptions.ramOverride: Provide a static ram cost for the script to override what is calculated by the game. Dynamic ram checking is still enforced. + - RunOptions.preventDuplicates: Fail to launch the script if the args are identical to a script already running. + +GENERAL / MISC: + +- Fixed a bug that could cause the overview skill bars to become desynced (@d0sboots) +- There is now an autoexec setting to specify a script on home to automatically run when loading the game. (@d0sboots) +- Monaco script editor updated to a newer version and has more config options available now. (@Snarling) +- Improve Electron's handling of external links (@Snarling) +- Improved support for ANSI color codes (@d0sboots) +- Improved consistency of file paths. Correct names for files no longer start with a / even if they are in a directory. (@Snarling) +- All Math Expressions contract no longer accepts wrong answers (@Snarling) +- Faction invites now trigger immediately when backdooring a server. (@Snarling) +- Fixed issue where duplicate programs could be created. (@Minzenkatze) +- UI improvements to create program page (@Minzenkatze) +- Fix inconsistency in skill xp to skill level conversion (@hydroflame) +- Updated blood donation counter to reflect number of confirmed blood donations. (@hydroflame) +- Minor improvements to ram calculation process (@Snarling) +- Improved terminal arguments detection (@Snarling) +- Improved display for ls terminal command. (@Snarling) +- Added more internal tests and improved test quality (@d0sboots) +- Various codebase improvements (@Snarling, @d0sboots) +- Documentation improvements (Many contributors) +- Nerf noodle bar + +SPOILER SECTIONS: + +SF2: + +- Corrected the "Next equipment unlock" text for member upgrades. (@LiamGeorge1999) + +SF3: + +- Many Corporation API changes, due to functionality changes and due to property name changes. See documentation for correct usage. +- Can now have multiple divisions within the same industry. (@Mughur) +- Can now sell a division or sell the entire corporation. (@Mughur) +- Product quality now depends on material quality (@Mughur) +- Product price can be set separately per-city (@Mughur) +- Exports can be set relative to inventory or production (@Mughur) +- ns.corporation.getProduct is city-specific (@Mughur) +- Bulk purchasing is available from the start (@Mughur) +- Can buy multiple upgrades at a time, similar to hacknet node upgrades (@Mughur) +- Various UI changes (@Mughur) +- Removed happiness from employees (@Mughur) +- Coffee renamed to tea (@Mughur) +- Training position renamed to intern (@Mughur) +- More options for SmartSupply (@Mughur) +- Advertising nerf (@Mughur) +- Nerfed investors and reduced effectiveness of "fraud" (@Mughur) +- Fixed React errors, renamed most corp object properties (@Snarling) +- Various other changes (@Mughur, @Snarling) + +SF4: + +- Faction invites trigger immediately when running ns.singularity.getFactionInvitations (@Snarling) +- Added ns.singularity.getCompanyPositionInfo (@jeek) + +SF6: + +- Failing a contract or operation now consumes the action (@Zelow79) + +SF9: + +- The SF9.3 bonus is also given to the player when inside of BN9. (@Zelow79) +- Adjusted the SF1 bonus for hacknet costs (slight nerf), and raised the SF9 bonus to compensate. (@d0sboots) +- Added option to purchase company favor using hashes. (@jeek) + +SF10: + +- Sleeve shock recovery now scales with intelligence. (@Tyasuh) +- Sleeve kills during crimes count towards numPeopleKilled (@Zelow79) +- Fix a misspelled moneySourceTracker call for sleeves (@zerbosh) +- ns.sleeve.getTask return value now includes cyclesNeeded where applicable (@Snarling) +- Internal type refactoring on Sleeve Work. (@Snarling) + +SF12: + +- Fix inconsistency in how BN12 multipliers were calculated + +SF13: + +- Improve performance of Stanek's gift update cycle, and rework (buff) bonus time handling. (@Snarling) + +## v2.2.2 - 21 Feb 2023 + +PLANNED 2.3 BREAKING CHANGES: + +- 2.3 will include a large planned rework to corporation. This may cause api breaks for any corporation scripts, and there will be large changes in how the corporation mechanic functions. + +NETSCRIPT API: + +- Added ns.formatNumber, ns.formatRam, and ns.formatPercent, which allow formatting these types of numbers the same way the game does (@Snarling, See UI section). +- Deprecated ns.nFormat. Likely to be removed in 2.3. Now just directly wraps numeral.format (@Snarling) +- EXPERIMENTAL CHANGE (may be reverted next patch): BasicHGWOptions now allows specifying a number of additionalMsec. This should allow easier and more reliable coordination + of completion times for hack, grow, and weaken. Since this is an experimental change, be prepared for a possible API break next patch if you use this functionality. (@d0sboots) + +- Corporation API: + + - Fix bugs with ns.corporation.setAutoJobAssignment. (@zerbosh and @croy) + +- Formulas API: + + - Added ns.formulas.hacking.growThreads function (@d0sboots) + +- Sleeve API: + + - ns.sleeve.getTask now also includes cyclesWorked for the task types where this applies. (@Zelow79) + - Added ns.sleeve.setToIdle function (@Zelow79) + +- Unsupported API: + + - Added ns.printRaw - allows printing custom React content to script logs. Use at your own risk, misuse is very likely to cause a crash. (@d0sboots) + +ELECTRON (STEAM) VERSION: + +- Fix security issue where player scripts were allowed to access any part of the player's filesystem. Now access is limited to the game's 'dist' folder. (@Snarling) + +SCRIPTS: + +- Fix an issue where multiple copies of the same script could be launched with same args/same server (@Mughur) +- Followup changes to API wrapping from 2.2.1 changes. (@d0sboots) + +UI: + +- Add new number formatting code to replace internal use of unmaintained package numeral.js. Added several Numeric Display options. (@Snarling) +- Removed ingame donation section. (@hydroflame) +- Improve some bladeburner number formatting (@Zelow79) +- Added IronMan theme (@MattiYT) +- Factions that have not been joined yet will show how many unowned augments they have available. (@Zelow79) +- Added more features to dev menu (@Zelow79 and @Snarling) + +CORPORATION: + +- Reverted previous change to employee needs. Now they will trend up on their own again. (@d0sboots) +- Improvements to how Market TA II works (@d0sboots) +- ns.corporation.getOffice return value now includes a totalExperience property. (@Snarling) + +HACKNET: + +- Hacknet servers are now named hacknet-server-# instead of hacknet-node-#. (@Tyasuh) +- Fix bug related to renaming hacknet servers (@Mughur) + +GRAFTING: + +- Bladeburner augs can be grafted if player is in Bladeburner faction (@Tyasuh) + +DOCUMENTATION + +- Many documentation updates (@Mughur, @d0sboots, @Snarling, @teauxfu). +- Official non-markdown docs are at http://bitburner-official.readthedocs.io/ +- Official dev version markdown docs are at https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.ns.md +- Official stable version markdown docs are at https://github.com/bitburner-official/bitburner-src/blob/stable/markdown/bitburner.ns.md +- Dev version documentation is now kept up to date as changes are made. (@Snarling) + +CODEBASE: + +- Updated many dependencies (@d0sboots) +- Updated lots of the build processes and GitHub workflows. (@Snarling) +- Internal refactoring of how BitNode multipliers are stored (@d0sboots) +- Added some extra helper function (useRerender hook, positiveInteger ns argument validator). (@Snarling) + +MISC: + +- Nerf noodle bar + +## v2.2.1 Hotfixes + +Hotfix / bugfix: + +- (@d0sboots) Implemented a new API wrapping solution that prevents the need for binding functions to ns when placing them in a new variable, but maintains and perhaps improves upon the performance gains from the previous v2.2.0 changes. +- Fixed some issues with savegames failing to load, or causing the main engine loop to stall after load. +- Fixed an issue where .script files were not receiving the correct args when ran +- Fixed an issue with sleeve HP calculation +- Possible fix for MathJax "Typesetting Failed" errors +- There was an issue with Corporations decaying their employees to 0 stats, even though the minimum was supposed to be 5. Moved the variable storing the min decay value to corporation constants, and raised it to 10. +- Regenerated documentation at https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.ns.md due to corporation changes related to min decay stats. +- Faction XP was unintentionally providing 20x the experience gain as it did prior to v2.0. This caused faction work to exceed gym/university as the optimal way to gain experience. Values have been reduced to only about 2x what they were prior to v2.0, and they are no longer better than gym/university. +- Fixed an issue where the overview skill bars could be displayed inaccurately based on player multipliers. + +## v2.2.0 - Jan 2 2023 Development Reboot + +Dev notes + +- The previous main developer, hydroflame, is stepping back from this project for the foreseeable future. To facilitate this, we've moved the repo to a new location at https://github.com/bitburner-official/bitburner-src. +- Sorry for the large number of API breaks in this version. To ease the pain here, attempting to use any of the removed functions will provide an error guiding you to the new replacement function to use instead. + +BREAKING API CHANGES: + +- No longer applicable as of v2.2.1! (ns2 only) ns functions use the 'this' value from ns: if you move the function to its own variable off of ns, it needs to be bound to ns. The internal changes that make this necessary led to very large performance gains for running many scripts at once. e.g.: + + const tprint1 = ns.tprint; // This doesn't work and will error out when calling tprint1(); + + const tprint = ns.tprint.bind(ns); // This works because the 'this' value is preserved. + +- ns.getPlayer no longer provides properties tor, inBladeburner, or hasCorporation. This information can be looked up using standlone functions: ns.hasTorRouter(), ns.bladeburner.inBladeburner(), ns.corporation.hasCorporation(). +- Removed many functions, with replacement ways to get the same info. + + - getServerRam: use getServerMaxRam and getServerUsedRam instead. + - corporation.assignJob: use setAutoJobAssignment instead. + - corporation.getEmployee: No longer available (employees are not individual objects). + - corporation.getExpandCityCost: use ns.corporation.getConstants().officeInitialCost + - corporation.getExpandIndustryCost: use getIndustryData instead. + - corporation.getIndustryTypes: use ns.corporation.getConstants().industryNames + - corporation.getMaterialNames: use ns.corporation.getConstants().materialNames + - corporation.getPurchaseWarehouseCost: use ns.corporation.getConstants().warehouseInitialCost + - corporation.getResearchNames: use ns.corporation.getConstants().researchNames + - corporation.getUnlockables: use ns.corporation.getConstants().unlockNames + - corporation.getUpgradeNames: use ns.corporation.getConstants().upgradeNames + - formulas.work.classGains: split into universityGains and gymGains + - singularity.getAugmentationCost: use getAugmentationPrice and getAugmentationRepReq instead + - sleeve.getSleeveStats: use getSleeve instead + - sleeve.getInformation: use getSleeve instead + +- An error dialog will inform the player of the above API changes if the player tries to use one of the removed functions above. +- enums.toast was renamed ToastVariant to provide consistency with internal code. + +- codingcontract.attempt always returns a string (empty string for a failed attempt). This may break player code if a direct boolean comparison (e.g. 'attemptResult === true') was being made. The string can be used directly as the conditional, because empty string evaluates to false as a boolean. + +- corporation.getCorporation().divisions now returns an array of division names, instead of division objects. Use corporation.getDivision(name) to get the division info object. + +DEVELOPMENT + +- Development repo moved to https://github.com/bitburner-official/bitburner-src +- Dev version available on web at https://bitburner-official.github.io/bitburner-src/ +- Development is active again for non-bugfix. +- A bunch of fixes, setup, and assistance related to moving to a new repo (@hydroflame) + +TUTORIAL + +- Removed NS1/NS2 selection. Tutorial now only references .js files (NS1 is essentially deprecated) (@Mughur) +- Fix Ram Text (by @jaculler) + +NETSCRIPT + +- Base NS API: + - More enums and more types are exposed to the player instead of "magic strings", as type documentation and on ns.enums. + - Added ns.pid property to access a script's PID without a function call. (@jeek) + - Much faster API wrapping on script launch. (@d0sboots) To support this, ns functions need to keep their "this" value from their parent object. + - tFormat: Fix display for negative time + - ns.getPlayer: removed tor, inBladeburner, and hasCorporation properties + - Added ns.hasTorRouter() function. +- Coding Contract API + - ns.codingcontract.attempt always returns a string. (@Snarling) +- Corporation API + - Removed ns.corporation.getEmployee and ns.corporation.assignJob, due to employees no longer being objects. + - Added ns.corporation.hasCorporation() + - Reworked how ram costs are applied for corporation. +- Formulas API + - ns.formulas.work.classGains removed, replaced with ns.formulas.work.universityGains and ns.formulas.work.gymGains (@Snarling) + - Add ns.formulas.work.companyGains function (@AlexeyKozhemiakin) +- Ports + - added portHandle.nextWrite() (@LJNeon) + - Make ns.writePort synchronous (@Snarling) +- Sleeve API + - ns.sleeve.getSleeve added. getPlayer and getSleeve can both be used for formulas. (@Snarling) + - getSleeve also includes storedCycles (i.e. bonusTime) (@zerbosh) +- Stock API + - ns.stock.getOrganization added for getting org from stock symbol (@SamuraiNinjaGuy) + +SCRIPTS + +- Fixed bug where zombie scripts could be created after a soft reset (@Snarling) +- Scripts now have a maximum ram cost of 1024GB per thread. + +SCRIPT LOGS + +- Add ctrl-a support for selecting all text in tail window (@Snarling) + +CORPORATION + +- Remove corp employees as objects (by @Kelenius) +- API access is provided automatically if the player is in BN3. (@zerbosh) +- Happiness/Energy/Morale trend down even for productive corps (by @Snarling) +- Typo fixes in modals to sell materials and products (by @quacksouls) +- Reworked MP formula validation to prevent possible save corruption on invalid entry (by @Snarling) +- Internal reorganization of Industry data (by @Snarling) +- Added check to material buy amount (by @G4mingJon4s) +- Check there is room to make a new product before opening popup. (by @G4mingJon4s) +- Fix typos in research descriptions (by @quacksouls) + +SLEEVE + +- Fixed inconsistencies in how sleeve work rewards are handled. (by @Snarling) +- Fix bug that prevented selecting some crimes from UI. (by @Snarling) +- Internally shock starts at 100 and lowers to 0. Previously this was backwards. + +STOCKMARKET + +- Fix broken initializer when manually buying WSE access (by @Snarling) + +TERMINAL + +- Added changelog command to re-display the changelog dialog. +- Connect command will connect to player owned servers from anywhere. (by @Snarling) + +UI + +- Improve UI performance of sidebar and character overview using memoization (@d0sboots) +- Other UI additions / improvements (@Mughur, @d0sboots, probably others) +- Fixed spacing of text in Trade for reputation button after Infiltration (by @PyroGenesis) +- Fix spacing on ANSI background escape codes (by @Snarling) +- Fix several instances where newlines were not being displayed properly (by @quacksouls) +- SoftResetButton.tsx Tooltip changed to make more sense (by @rai68) +- GANG: Fix Gang UI to correctly report the bonus time multiplier as 25x (by @TheMas3212) +- Change formatting for skill levels to use localeStr (@G4mingJon4s) + +DOC + +- Fix incorrect examples for grow (by @quacksouls) +- Updated limitMaterialProduction() and limitProductProduction() documentation to mention removing limits. (by @PyroGenesis) +- Add ns documentation for possible sleeve tasks (by @Snarling) +- Update documentation for workForFaction and workForCompany (by @quacksouls) +- Improve CCT documentation for HammingCodes (by @quacksouls) +- cleanup in doc of Netscript functions (by @quacksouls) +- Various other doc fixes (by @quacksouls) +- Update documentation for ns.args (by @Snarling) +- De-uglify ns.print examples (by @LJNeon) + +STATS + +- Fix logic for increasing HP based on defense skill levels (by @mattgarretson) +- Fix a bug where HP could be something other than max after a bitnode reset. + +INFILTRATION + +- Fix SlashGame scaling. (by @Snarling) + +GANG + +- When starting a gang, any in progress work with that faction will end. (@G4mingJon4s) + +MISC + +- Lots of typesafety improvements with internal code +- Remove google analytics (@hydroflame) +- Some error handling streamlining (by @Snarling) +- fix: check both ts and js source now (by @Tanimodori) +- chore: sync version in package-lock.json (by @Tanimodori) +- Better safety when loading game for multiple save corruption issues (by @Snarling) +- Nerf Noodle bar + +## v2.1.0 - 2022-09-23 Remote File API + +Dev note + +- The most important change about this update is the introduction of the Remote File API (RFA). + With this we also deprecate the HTTP file API and the Visual Studio extension. Those things + were made during the rush of Steam and aren't well thought out. This new process works with + both the web and Steam version of the game and every text editor. Moving forward we also + won't be doing much, if any, upgrades to the in-game editor. We think it's good enough for + now and if you need more we recommend you hook up your favorite external editor. + +--- NEW FEATURES --- + +- New Remote File API for transmitting files to the game (by @Hoekstraa) +- Added a new Augmentation, Z.O.Ë., which allows Sleeves to benefit from Stanek. + +--- FIXES --- + +API + +- Remove incorrectly placed 's' in ns.tFormat() (by @LJNeon) +- More ports (previously max 20, now practically unlimited) (by @Hoekstraa) +- Corp functions now return copy of constant arrays instead of the original (by @Mughur) +- All the player sub-objects need to be copied for `getPlayer`. (by @MageKing17) +- add corp get functions, UI (by @Mughur) +- [danielyxie/bitburner#3860] destroyW0r1dD43m0n now properly gives achievements +- [danielyxie/bitburner#3890] favor now properly syncs across pages and the Donate achievement is now given correctly (by @Aerophia) +- getCrimeStats use bitnode multipliers in the output of crime stats (by @phyzical) +- add singularity function for exporting game save back (by @phyzical) + +CODING CONTRACTS + +- inconsistent probability for generation between online and offline (by @quacksouls) +- Don't stringify answer if already a string (by @alainbryden) +- [danielyxie/bitburner#3755] change input handling for contract attempts (by @Snarling) + +CORPORATION + +- [danielyxie/bitburner#3880], [danielyxie/bitburner#3876], [danielyxie/bitburner#3322], [danielyxie/bitburner#3138] Bunch of corporation fixes (by @Mughur) +- Gave investors some economics classes (by @Mughur) +- Limit shareholder priority on newly issued shares (by @Undeemiss) +- dont take research points for something already researched via api (by @phyzical) + +CORPORATION API + +- Fix up param order for limitProductProduction to match docs (by @phyzical) +- [danielyxie/bitburner#3655] Expose exports from Material (by @Rasmoh) + +DOCUMENTATION + +- update docs a bit more, amending some BN and SF texts (by @Mughur) +- Fixed Argument order for scp() (by @njalooo) +- Some typo fixes in Netscript functions (by @quacksouls) +- [danielyxie/bitburner#4033] Why use Coding Contract API (by @quacksouls) +- typo fix in description of Caesar cipher (by @quacksouls) +- typo fix in terminal.rst (by @BugiDev) +- Update bitburner.sleeve.settobladeburneraction.md (by @borisflagell) +- Correct documentation for `run()` with 0 threads. (by @MageKing17) +- Some doc updates (by @Mughur) +- fix documentation for remote api (by @hydroflame) + +NETSCRIPT + +- Added functions to resize, move, and close tail windows +- [danielyxie/bitburner#2376] ns.exit now exits immediately (by @Snarling) +- [danielyxie/bitburner#4055] Fix dynamic ram check (by @Snarling) +- [danielyxie/bitburner#4037] ns1 wraps deeper layers correctly. (by @Snarling) +- [danielyxie/bitburner#3963] Prevent bladeburner.setActionLevel from setting invalid action levels (by @MPJ-K) +- Typo fixes in CodingContract, Hacknet, Singularity APIs (by @quacksouls) +- Fix a typo in doc of Singularity.travelToCity() (by @quacksouls) +- Update netscript definition file for scp, write, read, and flags (by @Snarling) +- Correct missing ! for boolean coercion in Corporation.createCorporation(). (by @Risenafis) +- Normalized Stock API logging (by @Snarling) +- [danielyxie/bitburner#3992] allow null duration in toast ns function (by @RollerKnobster) +- Correct missing `!` for boolean coercion in `singularity.workForCompany()`. (by @MageKing17) +- ns.scp and ns.write are now synchronous + fix exec race condition (by @Snarling) +- [danielyxie/bitburner#2931] atExit now allows synchronous ns functions (by @Snarling) +- Improve real life CPU and memory performance of scripts. (by @Snarling) +- Prompt Add user friendly message to avoid throwing recovery screen for invalid choices (by @phyzical) +- [danielyxie/bitburner#4081] Rerunning a script from tail window recalculates ram usage (by @Snarling) +- [danielyxie/bitburner#3962] The correct script will be closed even if the player modifies args (v2.0) (by @Snarling) +- Corrected ns formula for infiltration rewards (by @ezylot) +- Add singularity check for finishing company work (by @Snarling) + +SLEEVES + +- [danielyxie/bitburner#3819] Allow using the regeneration chamber with sleeves to heal them. (by @coderanger) +- [danielyxie/bitburner#4063] fix crash when player tries to assign more than 3 sleeves to Bladeburner contracts (by @Snarling) +- [danielyxie/bitburner#4051] Sleeves no longer crash when player quits company sleeve was working (by @Snarling) +- [danielyxie/bitburner#4022], [danielyxie/bitburner#4024], [danielyxie/bitburner#4025], [danielyxie/bitburner#3998] (by @Mughur) +- Sleeve crime gain bitnode multiplier fix (by @Mughur) + +REMOTE FILE API + +- NetscriptDefinitions retains export strings (by @Hoekstraa) +- Fix type of RFAMessages with non-String results (by @Hoekstraa) + +UI + +- [danielyxie/bitburner#2962] add a setting to display middle time unit in Time Elapsed String (by @hydroflame) +- [danielyxie/bitburner#4106] fix incorrect experience display in Crime UI. (by @SilverNexus) +- Bitnode stats now show if BB/Corporation are disabled (by @Kelenius) +- Removed three empty lines from BB status screen (by @Kelenius) +- Add missing space to BN7 description (by @hex7cd) +- Improvements to crime work UI (by @Kelenius) +- [danielyxie/bitburner#3975], [danielyxie/bitburner#3882] Script Editor more responsive on resize, and fix dirty file indicator (by @Snarling) + +MISC + +- Added weight to GangMemberTask construction call (by @ezylot) +- Fix ANSI display bugs (by @Snarling) +- Debounce updateRAM calls in script editor. (by @Snarling) +- [danielyxie/bitburner#3979] Allow characters & and ' in filenames (by @Snarling) +- [danielyxie/bitburner#3965] Corrected tutorial text (by @mihilt) +- Fix infil definitions.d.ts (by @phyzical) +- Modify PR template (by @Hoekstraa) +- crime gains, sleeve gang augs and faq (by @Mughur) +- [danielyxie/bitburner#3649] Preventing server starting security level from going above 100 (by @Shiiyu) +- Adds Shadows of Anarchy (by @Lagicrus) +- Added intormation about hacking managers to hacking algorithms page (by @Kelenius) +- Fix Jest CI Error (by @geggleto) +- multiple hasAugmentation checks didn't check if the augment was installed (by @Mughur) +- [danielyxie/bitburner#2442] & [danielyxie/bitburner#2795] (by @G4mingJon4s) +- Adds info regarding augments and focus (by @Lagicrus) +- Removed console.log line (by @dhosborne) +- Update some doc (by @hydroflame) +- trying to fix int problems (by @hydroflame) +- Fix broken ns filesnames (by @hydroflame) +- new formula functions (by @hydroflame) +- test fixes/md updates (by @phyzical) +- Remove "based" from positive adjectives in infiltrations (by @faangbait) +- minor fix in instance calculation (by @hydroflame) +- fix dynamic ram miscalc not triggering (by @hydroflame) +- Refactor game options into separate components (by @hydroflame) +- fix settings unfocusing on every key stroke (by @hydroflame) +- fix some stuff with the timestamp settings (by @hydroflame) +- Fix unique key problem with ascii elements (by @hydroflame) +- Improve wrong arg user message and add ui.windowSize (by @hydroflame) +- fix stack trace missing in some errors (by @hydroflame) +- Fix scp and write in ns1 (by @hydroflame) +- Did some changes of the remote api and added documentation (by @hydroflame) +- Add dummy function to generate a mock server or player for formulas stuff (by @hydroflame) +- fix compile error (by @hydroflame) +- regen doc (by @hydroflame) +- rm console log (by @hydroflame) +- regen doc (by @hydroflame) +- Added more info about blood program, change some aug descriptions (by @hydroflame) +- use triple equal (by @hydroflame) +- Minor improvements to Netscript Port loading and unloading (by @hydroflame) +- Fix hostname generation being weird about dash 0 added (by @hydroflame) +- upgrade version number. (by @hydroflame) +- Nerf noodle bar. + +## v2.0.0 - 2022-07-19 Work rework + +API break rewards + +- Everyone is awarded 10 NFG. +- All work in progress program is auto completed. +- All work in progress crafting is auto completed without adding entropy. + + Work (Create program / Work for faction / Studying / etc ...) + +- Working has been rebuilt from the grounds up. The motivation for that change is that all + different types of work all required different cached variables on the main Player object. + This caused a lot of bugs and crashes. It's been reworked in such a way as to prevent bugs + and make it nearly trivial to add new kinds of work. However, since this caused a few API break + I've decided to mark this version following semver protocols and call it 2.0.0 +- Crime can be unfocused and auto loops, no more spam clicking. +- All work type give their reward immediately. No need to stop work to bank rewards like reputation. +- Faction and Company work no longer have a time limit. +- Company work no longer reduces rep gain by half for quitting early. +- Company faction require 400k rep to join (from 200k) +- Backdooring company server reduces faction requirement to 300k. +- All work generally no longer keep track of cumulative gains like exp and reputation since it's applied instantly. +- getPlayer returns way less fields but does return the new 'currentWork' field, some fields are moved around. + +API breaks + +- workForCompany argument 'companyName' is now not-optional +- commitCrime now has 'focus' optional parameter +- using getScriptIncome to get total income has been separated to getTotalScriptIncome. +- using getScriptExpGain to get total income has been separated to getTotalScriptExpGain. +- scp has it's 2 last argument reversed, the signature is now (files, destination, optional_source) +- ns.connect and other singularity function are no longer available at the top level. + They were already hidden from documentation but now they're gone. +- stock.buy and stock.sell were renamed to stock.buyStock and stock.sellStock because 'buy' and 'sell' + are very common tokens. +- corporation.bribe no longer allows to give shares as bribe. + + Netscript + +- Add singularity.getCurrentWork +- Add singularity.getAugmentationBasePrice +- Add sleeve.getSleeveAugmentationPrice +- Add sleeve.getSleeveAugmentationRepReq +- Fix infiltration.getInfiltrationLocations +- Singularity.goToLocation support for non-city-specific locations (@Ansopedian) +- All corporation functions are synchronous. Job assignment only works on the following cycle. (@stalefishies) +- Add batch functionality to NS spendHashes API (@undeemiss) +- Fix #3661 Add missing memory property to Sleeve API (@borisflagell) +- FIX#3732 Cannot assign two sleeve on "Take on contracts" regardless of contract type. (@borisflagell) + + Corporation + +- Dividend fixes and exposing dividends info via scripts (@stalefishies) +- Add big number format support in some Corporation's modal (@borisflagell) +- Fix #3261 Industry overview number formatting (@nickofolas) + + Multipliers + +- The main player object was also plagues with a million fields all called '\*\_mult'. Representing the different multipliers +- These have been refactored in a field called 'mults'. + + Misc. + +- #3596 Enhanced terminal command parsing (@RevanProdigalKnight) +- Fix #3366 Sleeve UI would sometimes displays the wrong stat while working out. (@borisflagell) +- Two new encryption themed contracts - caesar and vigenere (@Markus-D-M) +- Fixes #3132 several Sleeve can no longer works concurrently in the same company (@borisflagell) +- FIX #3514 Clear recently killed tab on BN end event (@Daniel-Barbera) +- HammingCodes description and implementation fixes (@s2ks) +- FIX #3794 Sleeve were getting less shocked when hospitalized (was positive, should have detrimental) (@borisflagell) +- Fix #3803 Servers can no longer have duplicate IPs (@crimsonhawk47) +- Fix #3854 ctrl+c does not clear terminal input (@evil-tim) +- Nerf noodle bar, obviously. + +## v1.6.3 - 2022-04-01 Few stanek fixes + +Stanek Gift + +- Has a minimum size of 2x3 +- Active Fragment property 'avgCharge' renamed to 'highestCharge' +- Formula for fragment effect updated to make 561% more sense. + Now you can charge to your heart content. +- Logs for the 'chargeFragment' function updated. + + Misc. + +- Nerf noodle bar. + +## v1.6.0 - 2022-03-29 Grafting + +** Vitalife secret lab ** + +- A new mechanic called Augmentation Grafting has been added. Resleeving has been removed. +- Credit to @nickofolas for his incredible work. + +** Stanek ** + +- BREAKING: Many functions in the stanek API were renamed in order to avoid name collision with things like Map.prototype.get + +** UI ** + +- Major update to Sleeve, Gang UI, and Create Program (@nickofolas) +- re-add pre tags to support slash n in prompt (@jacktose) +- Tabelize linked output of 'ls' (@Master-Guy) +- Add the ability to filter open scripts (@phyzical) +- Add minHeight to editor tabs (@nickofolas) +- Properly expand gang equipment cards to fill entire screen (@nickofolas) +- Add shortcut to Faction augmentations page from FactionsRoot (@nickofolas) +- Fix extra space on editor tabs (@nickofolas) +- Present offline message as list (@DSteve595) +- add box showing remaining augments per faction (@jjayeon) +- Add tab switching support to vim mode (@JParisFerrer) +- Show current task on gang management screen (@zeddrak) +- Fix for ui of gang members current task when set via api (@phyzical) +- Don't hide irrelevant materials if their stock is not empty and hide irrelevant divisions from Export (@SagePtr) +- Fix regex to enable alpha transparency hex codes (8 digits) (@surdaft) + +** API ** + +- Added dark web functions to ns api +- BREAKING: purchaseTor() should returns true if player already has Tor. (@DavidGrinberg, @waffleattack) +- Implement getBonusTime in Corporation API (@t-wolfeadam) +- Added functions to purchase TIX and WSI (@incubusnb) +- purchaseSleeveAug checks shock value (@incubusnb) +- Fix bug with hacknet api +- Fix spendHashes bug +- Added 0 cost of asleep() (@Master-Guy) +- Fix some misleading corporation errors (@TheRealMaxion) +- expose the inBladeburner on the player object (@phyzical) +- added ram charge for stanek width and height (@phyzical) +- Fix sufficient player money check to buy back shares. (@ChrissiQ) +- Fix Static Ram Circumventing for some NS functions (@CrafterKolyan) +- added CorporationSoftCap to NetscriptDefinitions (@phyzical) +- Added definition of autocomplete() 'data' argument. (@tigercat2000) +- Adding support for text/select options in Prompt command (@PhilipArmstead) +- Added the ability to exportGame via api (@phyzical) + +** Arcade ** + +- Added an arcade to New Tokyo where you can play a 4 year old version of bitburner. + +** Misc. ** + +- Add a warning triggered while auto-saves are off. (@MartinFournier) +- Log info for field analysis now displays actual rank gained. (@ApamNapat) +- Removed BladeburnerSkillCost from skill point cost description. (@ApamNapat) +- Fix handling for UpArrow in bladeburner console. (@dowinter) +- Add GitHub action to check PRs for generated files. (@MartinFournier) +- Cap Staneks gift at 25x25 to prevent crashes. (@waffleattack) +- Remove old & unused files from repository. (@MartinFournier) +- Factions on the factions screens are sorted by story progress / type. (@phyzical) +- Fix log manager not picking up new runs of scripts. (@phyzical) +- Added prettier to cicd. +- UI improvements (@phyzical) +- Documentation / Typos (@nanogyth, @Master-Guy, @incubusnb, @ApamNapat, @phyzical, @SagePtr) +- Give player code a copy of Division.upgrades instead of the live object (@Ornedan) +- Fix bug with small town achievement. +- Fix bug with purchaseSleeveAug (@phyzical) +- Check before unlocking corp upgrade (@gianfun) +- General codebase improvements. (@phyzical, @Master-Guy, @ApamNapat) +- Waiting on promises in NS1 no longer freezes the script. (@Master-Guy) +- Fix bug with missing ramcost for tFormat (@TheMas3212) +- Fix crash with new prompt +- Quick fix to prevent division by 0 in terminal (@Master-Guy) +- removed ip references (@phyzical, @Master-Guy) +- Terminal now supports 'ls -l' +- Fix negative number formatting (@Master-Guy) +- Fix unique ip generation (@InDieTasten) +- remove terminal command theme from docs (@phyzical) +- Fix 'Augmentations Left' with gang factions (@nickofolas) +- Attempt to fix 'bladeburner.process()' early routing issue (@MartinFournier) +- work in progress augment fix (@phyzical) +- Fixes missing space in Smart Supply (@TheRealMaxion) +- Change license to Apache 2 with Commons Clause +- updated regex sanitization (@mbrannen) +- Sleeve fix for when faction isnt found (@phyzical) +- Fix editor "close" naming (@phyzical) +- Fix bug with sleeves where some factions would be listed as workable. (@phyzical) +- Fix research tree of product industries post-prestige (@pd) +- Added a check for exisiting industry type before expanding (@phyzical) +- fix hackAnalyzeThreads returning infinity (@chrisrabe) +- Make growthAnalyze more accurate (@dwRchyngqxs) +- Add 'Zoom -> Reset Zoom' command to Steam (@smolgumball) +- Add hasOwnProperty check to GetServer (@SagePtr) +- Speed up employee productivity calculation (@pd) +- Field Work and Security Work benefit from 'share' (@SagePtr) +- Nerf noodle bar. + +## v1.5.0 - Steam Cloud integration + +** Steam Cloud Saving ** + +- Added support for steam cloud saving (@MartinFournier) + +** UI ** + +- background now matches game primary color (@nickofolas) +- page title contains version (@MartinFourier) +- Major text editor improvements (@nickofolas) +- Display bonus time on sleeve page (@MartinFourier) +- Several UI improvements (@nickofolas, @smolgumball, @DrCuriosity, @phyzical) +- Fix aug display in alpha (@Dominik Winter) +- Fix display of corporation product equation (@SagePtr) +- Make Bitverse more accessible (@ChrissiQ) +- Make corporation warehouse more accessible (@ChrissiQ) +- Make tab style more consistent (@nickofolas) + +** Netscript ** + +- Fix bug with async. +- Add 'printf' ns function (@Ninetailed) +- Remove blob caching. +- Fix formulas access check (@Ornedan) +- Fix bug in exp calculation (@qcorradi) +- Fix NaN comparison (@qcorradi) +- Fix travelToCity with bad argument (@SlyCedix) +- Fix bug where augs could not be purchased via sing (@reacocard) +- Fix rounding error in donateToFaction (@Risenafis) +- Fix bug with weakenAnalyze (@rhobes) +- Prevent exploit with atExit (@Ornedan) +- Double 'share' power + +** Corporations ** + +- Fix bugs with corp API (@pigalot) +- Add smart supply func to corp API (@pd) + +** Misc. ** + +- The file API now allows GET and DELETE (@lordducky) +- Force achievement calculation on BN completion (@SagePtr) +- Cleanup in repository (@MartinFourier) +- Several improvements to the electron version (@MartinFourier) +- Fix bug with casino roulette (@jamie-mac) +- Terminal history persists in savefile (@MartinFourier) +- Fix tests (@jamie-mac) +- Fix crash with electron windows tracker (@smolgumball) +- Fix BN6/7 passive reputation gain (@BrianLDev) +- Fix Sleeve not resetting on install (@waffleattack) +- Sort joined factions (@jjayeon) +- Update documentation / typo (@lethern, @Meowdoleon, @JohnnyUrosevic, @JosephDavidTalbot, + @pd, @lethern, @lordducky, @zeddrak, @fearnlj01, @reasonablytall, @MatthewTh0, + @SagePtr, @manniL, @Jedimaster4559, @loganville, @Arrow2thekn33, @wdpk, @fwolfst, + @fschoenfeldt, @Waladil, @AdamTReineke, @citrusmunch, @factubsio, @ashtongreen, + @ChrissiQ, @DJ-Laser, @waffleattack, @ApamNapat, @CrafterKolyan, @DSteve595) +- Nerf noodle bar. + +## v1.4.0 - 2022-01-18 Sharing is caring + +** Computer sharing ** + +- A new mechanic has been added, it's is invoked by calling the new function 'share'. + This mechanic helps you farm reputation faster. + +** gang ** + +- Installing augs means losing a little bit of ascension multipliers. + +** Misc. ** + +- Prevent gang API from performing actions for the type of gang they are not. (@TheMas3212) +- Fix donation to gang faction. (@TheMas3212) +- Fix gang check crashing the game. (@TheMas3212) +- Make time compression more robust. +- Fix bug with scp. +- Add zoom to steam version. (@MartinFourier) +- Fix donateToFaction accepts donation of NaN. (@woody-lam-cwl) +- Show correct hash capacity gain on cache level upgrade tooltip. (@woody-lam-cwl) +- Fix tests (@woody-lam-cwl) +- Fix cache tooltip (@woody-lam-cwl) +- Added script to prettify save file for debugging (@MartinFourier) +- Update documentation / typos (@theit8514, @thadguidry, @tigercat2000, @SlyCedix, @Spacejoker, @KenJohansson, + @Ornedan, @JustAnOkapi, @nickofolas, @philarmstead, @TheMas3212, @dcragusa, @XxKingsxX-Pinu, + @paiv, @smolgumball, @zeddrak, @stinky-lizard, @nickofolas, @Feodoric, @daanflore, + @markusariliu, @mstruebing, @erplsf, @waffleattack, @Dexalt142, @AIT-OLPE, @deathly809, @BuckAMayzing, + @MartinFourier, @pigalot, @lethern) +- Fix BN3+ achievement (@SagePtr) +- Fix reputation carry over bug (@TheMas3212) +- Add button to exit infiltrations (@TheMas3212) +- Add dev menu achievement check (@TheMas3212) +- Add 'host' config for electron server (@MartinFourier) +- Suppress save toast only works for autosave (@MartinFourier) +- Fix some achievements not triggering with 'backdoor' (@SagePtr) +- Update Neuroflux Governor description. +- Fix bug with electron server. +- Fix bug with corporation employee assignment function (@Ornedan) +- Add detailed information to terminal 'mem' command (@MartinFourier) +- Add savestamp to savefile (@MartinFourier) +- Dev menu can apply export bonus (@MartinFourier) +- Icarus message no longer applies on top of itself (@Feodoric) +- purchase augment via API can no longer buy Neuroflux when it shouldn't (@Feodoric) +- Syntax highlighter should be smarter (@neuralsim) +- Fix some miscalculation when calculating money stolen (@zeddrak) +- Fix max cache achievement working with 0 cache (@MartinFourier) +- Add achievements in the game, not just steam (@MartinFourier) +- Overflow hash converts to money automatically (@MartinFourier) +- Make mathjax load locally (@MartinFourier) +- Make favor calculation more efficient (@kittycat2002) +- Fix some scripts crashing the game on startup (@MartinFourier) +- Toasts will appear above tail window (@MartinFourier) +- Fix issue that can cause terminal actions to start on one server and end on another (@MartinFourier) +- Fix 'fileExists' not correctly matching file names (@TheMas3212) +- Refactor some code to be more efficient (@TheMas3212) +- Fix exp gain for terminal grow and weaken (@nickofolas) +- Refactor script death code to reject waiting promises instead of resolving (@Ornedan) +- HP recalculates on defense exp gain (@TheMas3212) +- Fix log for ascendMember (@TheMas3212) +- Netscript ports clear on reset (@TheMas3212) +- Fix bug related to company (@TheMas3212) +- Fix bug where corporation handbook would not be correctly added (@TheMas3212) +- Servers in hash upgrades are sorted alpha (@MartinFourier) +- Fix very old save not properly migrating augmentation renamed in 0.56 (@MartinFourier) +- Add font height and line height in theme settings (@MartinFourier) +- Fix crash when quitting job (@MartinFourier) +- Added save file validation system (@TheMas3212) +- React and ReactDOM are now global objects (@pigalot) +- 'nano' supports globs (@smolgumball) +- Character overview can be dragged (@MartinFourier) +- Job page updates in real time (@nickofolas) +- Company favor gain uses the same calculation as faction, this is just performance + the value didn't change (@nickofolas) +- ns2 files work with more import options (@theit8514) +- Allow autocomplete for partial executables (@nickofolas) +- Add support for contract completion (@nickofolas) +- 'ls' link are clickable (@smolgumball) +- Prevent steam from opening external LOCAL files (@MartinFourier) +- Fix a bug with autocomplete (@Feodoric) +- Optimise achievement checks (@Feodoric) +- Hacknet server achievements grant associated hacknet node achievement (@Feodoric) +- Fix display bug with hacknet (@Feodoric) +- 'analyze' now says if the server is backdoored (@deathly809) +- Add option to exclude running script from save (@MartinFourier) +- Game now catches more errors and redirects to recovery page (@MartinFourier) +- Fix bug with autocomplete (@nickofolas) +- Add tooltip to unfocus work (@nickofolas) +- Add detailst overview (@MartinFourier) +- Fix focus bug (@deathly809) +- Fix some NaN handling (@deathly809) +- Added 'mv' ns function (@deathly809) +- Add focus argument to some singularity functions (@nickofolas) +- Fix some functions not disabling log correctly (@deathly809) +- General UI improvements (@nickofolas) +- Handle steamworks errors gravefully (@MartinFourier) +- Fix some react component not unmounting correctly (@MartinFourier) +- 'help' autocompletes (@nickofolas) +- No longer push all achievements to steam (@Ornedan) +- Recovery page has more information (@MartinFourier) +- Added 'getGameInfo' ns function (@MartinFourier) +- SF3.3 unlocks all corp API (@pigalot) +- Major improvements to corp API (@pigalot) +- Prevent seed money outside BN3 (@pigalot) +- Fix bug where using keyboard shortcuts would crash if the feature is not available (@MartinFourier)\ +- Sidebar remains opened/closed on save (@MartinFourier) +- Added tooltip to sidebar when closed (@MartinFourier) +- Fix bug where Formulas.exe is not available when starting BN5 (@TheMas3212) +- Fix CI (@tvanderpol) +- Change shortcuts to match sidebar (@MartinFourier) +- Format gang respect (@attrib) +- Add modal to text editor with ram details (@nickofolas) +- Fix several bugs with singularity focus (@nickofolas) +- Nerf noodle bar. + +## v1.3.0 - 2022-01-04 Cleaning up + +** External IDE integration ** + +- The Steam version has a webserver that allows integration with external IDEs. + A VSCode extension is available on the market place. (The documentation for the ext. isn't + written yet) + +** Source-Files ** + +- SF4 has been reworked. +- New SF -1. + +** UI ** + +- Fix some edge case with skill bat tooltips (@MartinFournier) +- Made some background match theme color (@Kejikus) +- Fix problem with script editor height not adjusting correctly (@billyvg) +- Fix some formatting issues with Bladeburner (@MartinFournier, @nickofolas) +- Fix some functions like 'alert' format messages better (@MageKing17) +- Many community themes added. +- New script editor theme (@Hedrauta, @Dexalt142) +- Improvements to tail windows (@theit8514) +- Training is more consise (@mikomyazaki) +- Fix Investopedia not displaying properly (@JotaroS) +- Remove alpha from theme editor (@MartinFournier) +- Fix corporation tooltip not displaying properly (@MartinFournier) +- Add tooltip on backdoored location names (@MartinFournier) +- Allow toasts to be dismissed by clicking them (@nickofolas) +- Darkweb item listing now shows what you own. (@hexnaught) + +** Bug fix ** + +- Fix unit tests (@MartinFournier) +- Fixed issue with 'cat' and 'read' not finding foldered files (@Nick-Colclasure) +- Buying on the dark web will remove incomplete exe (@hexnaught) +- Fix bug that would cause the game to crash trying to go to a job without a job (@hexnaught) +- purchaseServer validation (@nickofolas) +- Script Editor focuses code when changing tab (@MartinFournier) +- Fix script editor for .txt files (@65-7a) +- Fix 'buy' command not displaying correctly. (@hexnaught) +- Fix hackAnalyzeThread returning NaN (@mikomyazaki) +- Electron handles exceptions better (@MageKing17) +- Electron will handle 'unresponsive' event and present the opportunity to reload the game with no scripts (@MartinFournier) +- Fix 'cp' between folders (@theit8514) +- Fix throwing null/undefined errors (@nickofolas) +- Allow shortcuts to work when unfocused (@MageKing17) +- Fix some dependency issue (@locriacyber) +- Fix corporation state returning an object instead of a string (@antonvmironov) +- Fix 'mv' overwriting files (@theit8514) +- Fix joesguns not being influenced by hack/grow (@dou867, @MartinFournier) +- Added warning when opening external links. (@MartinFournier) +- Prevent applying for positions that aren't offered (@TheMas3212) +- Import has validation (@MartinFournier) + +** Misc. ** + +- Added vim mode to script editor (@billyvg) +- Clean up script editor code (@Rez855) +- 'cat' works on scripts (@65-7a) +- Add wordWrap for Monaco (@MartinFournier) +- Include map bundles in electron for easier debugging (@MartinFournier) +- Fix importing very large files (@MartinFournier) +- Cache program blob, reducing ram usage of the game (@theit8514) +- Dev menu can set server to $0 (@mikomyazaki) +- 'backdoor' allows direct connect (@mikomyazaki) +- Github workflow work (@MartinFournier) +- workForFaction / workForCompany have a new parameter (@theit8514) +- Alias accept single quotes (@sporkwitch, @FaintSpeaker) +- Add grep options to 'ps' (@maxtimum) +- Added buy all option to 'buy' (@anthonydroberts) +- Added more shortcuts to terminal input (@Frank-py) +- Refactor some port code (@ErzengelLichtes) +- Settings to control GiB vs GB (@ErzengelLichtes) +- Add electron option to export save game (@MartinFournier) +- Electron improvements (@MartinFournier) +- Expose some notifications functions to electron (@MartinFournier) +- Documentation (@MartinFournier, @cyn, @millennIumAMbiguity, @2PacIsAlive, + @TheCoderJT, @hexnaught, @sschmidTU, @FOLLGAD, @Hedrauta, @Xynrati, + @mikomyazaki, @Icehawk78, @aaronransley, @TheMas3212, @Hedrauta, @alkemann, + @ReeseJones, @amclark42, @thadguidry, @jasonhaxstuff, @pan-kuleczka, @jhollowe, + @ApatheticsAnonymous, @erplsf, @daanflore, @nickofolas, @Kebap, @smolgumball, + @woody-lam-cwl) + +## v1.1.0 - 2021-12-18 You guys are awesome (community because they're god damn awesome) + +** Script Editor ** + +- The text editor can open several files at once. (@Rez855 / @Shadow72) + It's not perfect so keep the feedback coming. + +** Steam ** + +- Windows has a new launch option that lets player start with killing all their scripts + This is a safety net in case all the other safety nets fail. +- Linux has several launch options that use different flags for different OS. +- Debug and Fullscreen are available in the window utility bar. +- Tried (and maybe failed) to make the game completely kill itself after closing. + This one I still don't know wtf is going. +- No longer has background throttling. +- Default color should be pitch black when loading +- Add BN13: Challenge achievement. + +** Tutorial ** + +- I watched someone play bitburner on youtube and reworked part of + the tutorial to try to make some parts of the game clearer. + https://www.youtube.com/watch?v=-_JETXff4Zo +- Add option to restart tutorial. + +** Netscript ** + +- getGangInformation returns more information. +- getAscensionResult added +- getMemberInformation returns more info +- Formulas API has new functions for gang. +- Added documentation for corp API. +- exec has clearer error message when you send invalid data. +- getServer returns all defined field for hacknet servers. +- Fix a bug with scp multiple files (@theit8514) +- Stack traces should be smarter at replacing blobs with filenames +- Fix a weird error message that would occur when throwing raw strings. +- Fix shortcuts not working. +- Re-added setFocus and isFocused (@theit8514) +- new function getHashUpgrades (@MartinFournier) +- enableLog accepts "ALL" like disableLog (@wynro) +- toast() doesn't crash on invalid data (@ivanjermakov) +- alert() doesn't crash on invalid data (@Siern) +- Fixed an issue where scripts don't run where they should. +- Sleeve getInformation now returns cha +- getServer does work with no argument now +- workForFaction returns false when it mistakenly returned null + +** Character Overview ** + +- The character overview now shows the amount of exp needed to next level (@MartinFournier) + +** Misc. ** + +- Add option to supress Game Saved! toasts (@MartinFournier) +- Fix bug where ctrl+alt+j was eaten by the wrong process. (@billyvg) +- Theme Editor lets you paste colors (@MartinFournier) +- ctrl + u/k/w should work on terminal (@billyvg) +- Game now shows commit number, this is mostly for me. (@MartinFourier) +- running a bad script will give a clearer error message (@TheCoderJT) +- Default terminal capacity is maximum (@SayntGarmo) +- Fix problems with cp and mv (@theit8514) +- Make monaco load fully offline for players behind firewalls. +- change beginer guide to use n00dles instead of foodnstuff +- BN13 is harder +- nerf int gain from manualHack +- Fix UI displaying wrong stats (@DJMatch3000) +- Fix button not disabling as it should. +- New location in Ishima. +- Add setting to suppress stock market popups. +- Typo fixes (@Hedrauta, @cvr-119, @Ationi, @millennIumAMbiguity + @TealKoi, @TheCoderJT, @cblte, @2PacIsAlive, @MageKing17, + @Xynrati, @Adraxas, @pobiega) +- Fix 100% territory achievement. +- Reword message on active scripts page. +- Fix terminal not clearing after BN +- Remove references to .fconf +- Augmentation pages shows BN difficulty with SF5 +- Fix scripts saving on wrong server while 'connect'ing +- Fix gym discount not working. +- Fix scan-analyze not working with timestamps +- Hash upgrades remember last choice. +- Save files now sort by date +- The covenant no longer supports negative memory purchases +- Fix corp shares buyback triggering by pressing enter +- Staneks gift display avg / num charges +- Infiltration rewards no longer decay with better stats +- terminal 'true' is parsed as boolean not string +- tail and kill use autocomplete() +- Fix focus for coding contract +- massive boost to noodle bar. + +** Special Thanks ** + +- Special thank you to everyone on Discord who can answer + new player questions so I can focus on more important things. + +## v1.1.0 - 2021-12-03 BN13: They're Lunatics (hydroflame & community) + +** BN13: They're Lunatics ** + +- BN13 added. + +** Steam ** + +- Tested on all 3 major OS. +- 94 achievements added +- Release is 2021-12-10. + +** Corporation API ** + +- Added corporation API. (Unstable) + +** Netscript ** + +- tprintf crashes when not giving a format as first arg. +- tprintf no longer prints filename (@BartKoppelmans) +- TIX buy/sell/sellShort all return askprice/bidprice (@Insight) +- getRunningScript now works. +- Fix disableLog for gang and TIX API +- getOwnedSourceFiles is not singularity anymore (makes it easier to share scripts.) (@theit8514) +- true/false is a valid value to send to other scripts. +- workForFaction no longer returns null when trying to work for gang. +- Scripts logging no longer generates the string if logging is disabled. + This should give performance boost for some scripts. + +** Gang ** + +- Gang with 0 territory can no longer fight +- Territory now caps at exactly 0 or 1. + +** Misc. ** + +- Clicking "previous" on the browser will not pretend you had unsaved information + allowing you to cancel if needs be. +- Fixed some tail box coloring issue. +- Fixed BladeBurner getCityCommunities ram cost +- The download terminal command no longer duplicate extensions (@Insight) +- Fix #000 on #000 text in blackjack. (@Insight) +- Remove reference to .fconf +- Tail boxes all die on soft reset. +- Fix codign contract focus bug. +- Megacorp factions simply re-invite you instead of auto added on reset. (@theit8514) +- Tail window is bound to html body. +- Infiltration reward is tied to your potential stats, not your actual stats + So you won't lose reward for doing the same thing over and over. +- intelligence lowers program creation requirements. +- Terminal parses true as the boolean, not the string. +- Tail and kill autocomplete using the ns2 autocomplete feature. +- scan-analyze doesn't take up as many terminal entries. +- GangOtherInfo documentation now renders correctly. +- ActiveScripts search box also searches for script names. +- Infinite money no longer allows for infinite hacknet server. +- Blackjack doesn't make you lose money twice. +- Recent Scripts is now from most to least recent. +- Fix mathjax ascii art bug in NiteSec. +- Remove warning that the theme editor is slow, it's only slow in dev mode. +- In BN8 is it possible to reduce the money on a server without gaining any. +- In the options, the timestamp feature has a placeholder explaining the expected format. +- Bunch of doc typo fix. (hydroflame & @BartKoppelmans & @cvr-119) +- nerf noodle bar + +## v1.0.2 - 2021-11-17 It's the little things (hydroflame) + +** Breaking (very small I promise!) ** + +- buy / sell now return getAskPrice / getBidPrice instead of just price. + This should help solve some inconsistencies. + +** Misc. ** + +- scripts logs are colorized. Start your log with SUCCESS, ERROR, FAIL, WARN, INFO. +- documentation for scp not say string | string[] +- Donation link updated. +- nerf noodle bar + +## v1.0.1 - 2021-11-17 New documentation (hydroflame) + +** Documentation ** + +- The new documentation for the netscript API is available at + https://github.com/danielyxie/bitburner/blob/dev/markdown/bitburner.ns.md + This documentation is used in-game to validate the code, in-editor to autocomplete, and + for users to reference. This is a huge quality of life improvements for me. + +** Reputation ** + +- Fixed favor not affecting faction work reputation gain (Yeah, I know right?) + +** Hacknet ** + +- Servers are now considerd "purchasedByPlayers" + +** Script Editor ** + +- solarized themes now work. + +** Corporation ** + +- Dividends are now much more taxed. +- The 2 upgrades that reduced taxes are now much stronger. + +** Misc. ** + +- Starting / Stopping scripts on hashnet servers immediately updates their hash rate (instead of on the next tick) +- Hacknet has tooltip showing what the result of the upgrade would be. +- Augmentations page displayes current price multiplier as well as explains the mechanic. +- Terminal now is 25x stronger. +- Tail boxes use pre-wrap for it's lines. +- Tail boxes allow you to rerun dead scripts. +- Tail boxes can no longer open the same one twice. +- Terminal now autocompletes through aliases. +- Make alter reality harder. +- Fix bladeburner cancelling actions when manually starting anything with Simulacrum. +- Buying hash upgrade to increase uni class or gym training will apply to current class. +- Internally the game no longer uses the decimal library. +- Fix an issue where 'download \*' would generate weird windows files. +- Timestamps can be set to any format in the options. +- Fix typo in documentation share popup. +- Remove bunch of debug log. +- Fix typo in corporation handbook literature. +- Fix typo in documentation +- Fix duplicate SF -1 exploit. (Yeah, an exploit of exploits, now were meta) +- Fix offline hacking earning being attributed to hacknet. +- nerf noodle bar + +## v1.0.0 - 2021-11-10 Breaking the API :( (blame hydroflame) + +** Announcement ** + +- Several API breaks have been implemented. +- See the v1.0.0 migration guide https://bitburner.readthedocs.io/en/latest/v1.0.0_migration.html +- Everyone gets 10 free neuroflux level. + +** Netscript ** + +- Fix a bug that would cause RAM to not get recalculated. +- New function: hackAnalyzeSecurity +- New function: growthAnalyzeSecurity +- New function: weakenAnalyze + +** Script Editor ** + +- Sometimes warn you about unawaited infinite loops. +- ns1 functions are now correctly colors in Monokai. + +** Programs ** + +- Formulas.exe is a new program that lets you use the formulas API. + +** Corporations ** + +- Real Estate takes up a tiny bit of room. +- Dividends are now taxes exponentially in certain bitnodes. +- UI displays how many level of each corporation upgrade. +- Fix exploit with going public. +- Employee salary no longer increase. + +** Documentation ** + +- The documentation is now autogenerated into .md files. + It is usable but not yet linked to readthedocs. It's on github. + +** Misc. ** + +- Favor is not internall floating point. Meaning I don't have to save an extra variable. +- Manually starting a Bladeburner action cancels unfocused action. +- Updated description of gang territory to be clearer. +- Hacknet expenses and profit are in different categories. +- Fixed favor equation. +- Toast messages aren't hidden behind work in progress screen. +- Fix bug that made infiltration checkmark look off by one. +- Fix some inconsistency with running files that start or don't start with / +- Can't tail the same window twice. +- Added recovery mode. Hopefully no one will ever have to use it. +- Fix readthedocs +- Programs now give int exp based on time not program. +- Many sing. functions now give int exp. +- Active Scripts page now displays some arguments next to script name. +- Fixed some invisible black text. +- Button colors can be edited. +- Added 2 new colors in the theme editor: background primary and background secondary. +- infiltration uses key instead of keycode so it should work better on non-american keyboards. +- buff noodle bar. + +## v0.58.0 - 2021-10-27 Road to Steam (hydroflame & community) + +** Announcement ** + +- To prepare for Steam we will fix some inconsistencies in the Netscript API. Ideally we can also write a + save file migration that will automatically convert all breaking changes in your scripts without any + player input. + +** BREAKING (kindof) ** + +- All stock market functions are now under the 'stock' namespace, like 'hacknet' + However when you load your game with v0.58.0 for the first time it should automatically convert everything. + +** SF -1 ** + +- new SF -1: Reality Alteration + +** Gang ** + +- Ascension formula now better +- Karma requirement now much lower in most nodes +- Territory heavily penalizes gains +- T.R.P. not available outside BN2. + +** Netscript ** + +- It is no longer possible to send anything but strings or numbers to other scripts. (prevents exploits) +- Improve code for some netscript functions (@omuretsu) + +** Script Editor ** + +- Added Solarized light/dark as theme (@CalvinTrops) +- Fixed sleeve namespace smart autocomplete. + +** Hacknet Servers ** + +- Cores affect grow/weaken like they do on home computer + +** Infiltration ** + +- Slash game modified to be easier. + +** Misc. ** + +- Fix typo in corp (@Saynt_Garmo) +- Fixed a bug where corp wouldn't let you buyback shares. (@Saynt_Garmo) +- Fixed a bug where sleeves couldn't perform some crimes. (@Saynt_Garmo) +- Hospitalization and Eating noodles are now toasts (@Saynt_Garmo) +- Fixed some repeated code (@omuretsu) +- Fixed Character Overview preventing clicks underneath it even when hidden. (@omuretsu) +- Fixed typo in tutorial. (@omuretsu) +- Create Programs and Factions invitation badges now dissapear when you open their respective pages. +- Add killall script in character overview. +- Fixed bug in corp that made last city production be the production for all cities for newly created product. +- Fix bug that allowed reputation to transfer to new jobs. +- Fixed memory leak with ns2. +- nerf noodle bar + +## v0.57.0 - 2021-10-16 It was too cheap! (hydroflame & community) + +** BREAKING (kindof) ** + +- purchased server cost now scales exponentially past 2^10. + I'm going to actually explain this one: Currently the cost of a 2^20GB server is 57b + Most players can get that before their first install. In an effort to nerf good players + a softcap was added. This softcap is different for every BN. + +** Script Editor ** + +- Added a theme that is close to monokai. Unfortunately a full monokai is impossible because + Monaco doesn't have a very good tokenizer. +- Opening a file and connecting to a new server will still save the file on the server that the file + was opened. + +** Netscript ** + +- New function: alert, which creates a textbox. +- New function: toast, creates a notification in the bottom right. +- New function: upgradeHomeCores (@Saynt_Garmo) +- New function: atExit, allows you to set a callback for when the script closes. +- New kindof function: autocomplete, this allows you to tell the game what it should + autocomplete on the terminal. + +** Augmentation ** + +- ENM Core (the Augmentation from The Black Hand with the highest rep cost) rep cost + reduced from 250 to 175. This will help new players transition from TBH to BitRunners more easily. + +** Bladeburner ** + +- New general action: Incite Violence. This action adds other action counts but increases chaos. + +** Misc. ** + +- Current bladeburner action is shown on the character overview. +- Fix blackop being #000 on #000. +- The last clicked Tail Box goes in front of the others. +- Fixed an issue where some values were loaded as 0 when they should be null. +- Implemented toasts. +- .msg are no longer saved in the text file. +- Tail boxes no longer display all the args, they use "..." after 30 characters. +- Fixed cancelation penalty bonus not being properly applied after the IP <-> hostname switch. +- Fixed an exploit where you could send non-strings or numbers to other scripts. +- Fixed issue when trying to work for a faction with a work type that doesn't exist while + already working for that faction. +- Fixed not being able to work for the CIA. (Don't ask) +- nerf noodle bar + +## v0.56.0 - 2021-10-11 Trimming the backlog (hydroflame & community) + +** BREAKING ** + +- The 'write' function is now async. This helps when making scripts that write scripts. + +** Terminal ** + +- 'grow' and 'weaken' have been added as terminal command. This should help player transition + from commands to scripts. The tutorial also talks about it. +- 'cp' command added +- Improved performance by rate limiting refresh. + +** IP vs Hostname ** + +- The game now uses hostname as primary key for it's servers (yeah believe it or not IPs were + used until then). This has caused some issues with purchased servers (they couldn't be sold). + You might need to soft reset for the game to fully convert itself. + +** Sleeve ** + +- Fixed bug where they couldn't train at Volhaven. +- No longer consume all bonus time at once, making it look buggy. + +** SF9 ** + +- Now boosts hacknet production by 8/12/14% + +** Hacknet Servers ** + +- production nerfed by 10% +- Max money increase gets weaker above 10t max money + +** Corporation ** + +- Warehouse tooltip now also displays the amount of space taken by products. +- Changed research box completely to avoid dependency on Treant (Treant is a pita) +- All textbox should accept MAX/MP case insensitive. +- Fixed export popup not refreshing dropdowns correctly. +- Fixed product mku becoming zero +- Increased scaling of Wilson to avoid feedback loop. +- Can no longer get in debt by buying real estate +- Bonus time is consumed faster. + +** Netscript ** + +- isBusy takes bitverse and infiltration into account +- hospitalize can't be called when in infiltration. +- setToCommitCrime now accepts crime rough name instead of perfect name. +- disableLog All now works for bladeburner functions. +- Fixed netscript port for ns1. + +** Augmentation ** + +- Added augmentation to Ti Di Hui that removes penalty for being unfocused. +- Neuroflux no longer appears in special factions. + +** Script Editor ** + +- Ram check is debounced instead of refreshed every second. +- Added the vscode extension documentation to the game (it doesn't work well, thought) +- Fixed issue where autocomplete list would grow forever +- Added semi-monokai as theme. +- Fixed issue where modifying filename would mess it up. +- Font size can be changed now. + +** Infiltration ** + +- Fixed issue where game controls would become unfocused. + +** Misc. ** + +- Fixed loader incorrectly assuming some null values are incorrect. +- installBackdoor trigger Bitverse sequence +- Some improvements to the theme editor +- Improved documentation about where to learn javascript. +- Added some instructions for contributors. +- Fixed typo in corporation sell shares modal (@Saynt_Garmo) +- Fixed pagination being black on black in Active Scripts +- Create Script tab renamed to Script Editor +- Fixed an issue where corp some textbox wouldn't update when changing city. +- Fixed an issue where hacknet online time was always 0. +- Netscript function prompt fixed. +- Fixed miscalculation in growth. +- Script with syntax errors will try to be a tad more helpful. +- Corporations can no longer bribe bladeburners. +- Augmentation Graphene Branchiblade renamed to Brachi, like the rest of them. +- All ram is displayed in GB/TB/PB now. +- Game now saves when saving a file, this can be turned off. +- Several improvement to log window. +- Bladeburner current action returns General type instead of the name of the action. +- Bladeburner travel and Sleeve travel respect disable ASCII. +- Tutorial fits on small screens. +- Import is much slower but more consistent now. +- Fix intelligence not updating properly. +- Added SF -1: Time Compression +- ReadTheDoc theme now matches the game. +- Logbox should wrap text better +- Logbox behavior should feel better. +- Fix font for AutoLink.exe +- nerf noodle bar + +## v0.55.0 - 2021-09-20 Material UI (hydroflame & community) + +** Global ** + +- The game is now 100% in typescript, react, and Material-UI + +** Misc. ** + +- Corporations can no longer bribe special factions +- Infiltration can no longer lose focus of the keyboard. +- Fix terminal line limit +- Added theme editor +- Theme applies on game load (@Nolshine) +- Sleeves no longer consume all bonus time for some actions +- Fix a bug where the autocomlete list would get duplicates +- Fix tutorial not scaling properly on small screens +- Import should be more consistent +- Typo with 'help' command +- Fix infinite loop in casino +- nerf noodle bar + +## v0.54.0 - 2021-09-20 One big react node (hydroflame & community) + +** UI ** + +- The UI is now completely(ish) in react and I'm starting to implement + Material-UI everywhere. This will help make the game feel more consistent. +- Major help from (@threehams) +- New Terminal +- New Active Scripts page +- New sidebar. +- New Character overview +- New tutorial +- New options page +- New create program page (@Nolshine) + +** Netscript ** + +- Add companyName to getPlayer + +** Factions ** + +- Megacorp factions are no longer removed when installing. + +** Corporation ** + +- All research tooltips are always visible. +- Smart supply is enabled by default if purchased (@Nolshine) + +** Misc. ** + +- Fix "Game saved" animation. (@Nolshine) +- Update commitCrime documentation (@Tryneus) +- Fix logbox scrolling weird (@Nolshine) +- Fix weird scrolling in corporations (@BartKoppelmans) +- Fix typo (@BartKoppelmans & @Nolshine) +- Delete game now has a confirmation modal (@Nolshine) +- Fix issue where skills would not get properly updated when entering new + BN. (@Nolshine) +- Convert create gang to popup (@vmesecher) +- Fixed a bug that prevented travel to Sector-12 and New Tokyo when not using + ASCII art. +- nerf noodle bar + +## 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 ** + +- Correctly reloads old script when clicking "Script Editor" +- No longer jumps to the end of the text for no reason. + +** Hash upgrades ** + +- Fixed an issue where the default option would say ecorp but was really + foodnstuff + +** Misc. ** + +- The "Delete all active script" button under the options has a clearer + description. +- Removed some debug console.log +- nerf noodle bar + +## v0.52.7 - 2021-08-21 Fixing the previous patch tbh (hydroflame) + +** Netscript ** + +- API BREAKING CHANGE: getActionEstimatedSuccessChance now returns a pair of + value to reflect the UI changes. I'm very sorry. + +** Bladeburner ** + +- General actions now display time required. +- Recruitment now displays success chance. +- All other success chance now display a range instead of a single value + The real value is guaranteed to be within that range. + +** Misc. ** + +- Fix tutorial not working after Monaco upate +- Fix logbox logs not taking up the whole logbox +- Fix script editor shortcut (ctrl+b) +- Fix Corporation popup appearing in the wrong order, hiding one of them +- Fix error when loading Corp +- Fix logbox dragging (smoother now) +- Fix logbox name collision +- Fix logbox allowing to open the same box multiple times +- Fix netscript write. +- nerf noodle bar + +## v0.52.6 - 2021-08-21 Logboxes and VS-code (hydroflame) + +** Text Editor ** + +- Ace and Codemirror have been removed in favor of monaco (web version of + vs-code). The options are a bit lackluster but more will be added as + feedback comes. + +** Log boxes ** + +- Multiple log boxes can be opened at once. They can be moved around the + screen. (but the movement behavior is a bit weird.) + +** Misc. ** + +- Job promotion now correctly updates the UI. +- Milestones now call the faction CyberSec instead of CSEC +- Can no longer create file that break the filesystem. +- Remove dollar sign in blade contract UI element +- nerf noodle bar + +## v0.52.5 - 2021-08-19 CPU cores are useful!? (hydroflame) + +** Terminal ** + +- When executing 'run SCRIPT' any script can now add '--tail' to + automatically bring up the logs. + +** Netscript ** + +- The 'flags' function now works with single letter flags but they only take + one dash. +- Fix several broken bladeburner netscript functions. +- Fix gang.getMemberInformation returning inconsistent data after the gang + rework. + +** CPU Cores ** + +- CPU Cores on the home computer now provide a bonus to grow() money gain + and makes weaken lower more security. Only for scripts running on 'home' + +** Misc. ** + +- Fix weird scrolling in the new Bladeburner React console. +- nerf noodle bar + +## v0.52.4 - 2021-08-19 Bladeburner in React (hydroflame) + +** Bladeburner ** + +- The entire UI was rebuild in React. It should be more responsive + +** Hacknet ** + +- Displays how many time each hash upgrade was bought. +- Displays cummulative effect of the upgrade. +- Removed "Close" button from hash upgrade menu. + +** Misc. ** + +- More popup/modals have dark background, can be dismissed by clicking + outside, or by pressing escape. +- Small reword in the guide. +- Fix several typos in the bladeburner documentation. +- Linting (no one cares except the dev) +- nerf noodle bar + +## v0.52.3 - 2021-08-15 Gangs were OP (hydroflame) + +** Gang ** + +- Significant rework. Ascension is now based on exp gained. +- All upgrades give exp bonuses. +- Maximum gang members reduced to 12. +- Respect required to recruit sharply increased. +- Rewritten in React, the UI should be smoother and less laggy now. + +** Infiltration ** + +- Now isTrusted protected. + +** Misc. ** + +- Many UI element are now "noselect" protected. +- Fixed an issue where you could join the same faction twice via script and + UI simultaneously. +- Factions list screen converted to React. +- nerf noodle bar + +## v0.52.2 - 2021-08-15 Oh yeah, BN11 is a thing (drunk hydroflame tbh) + +** Source-Files ** + +- Source-File 11 now also provides a small reduction to the price increase + multiplier. + +** Augmentations ** + +- New Augmentation offered by Aevum, themed around 777 and offers some basic + programs. +- Augmentation descriptions are now more concise and consistent. + +** Misc. ** + +- nerf noodle bar + +## v0.52.1 - 2021-08-10 bugfixing (hydroflame & community) + +** Misc. ** + +- Fix game crash/corruption when quitting a job while working for it unfocused. +- Fix typo in corporation Market Data. +- Fix typo in docs for hackPercent. +- The tutorial encourages the players to connect to home before creating `n00dles.script` +- The dark web `buy` command now accepts `-1` (one) and `--list` instead of just `-l`. Helps some confused players. +- Character overview screen no longer hidden on the corporation screen. +- Infiltration difficulty display is now more explicit (It's a big arrow instead of just one word.) +- Fix wrong ram value in tutorial. (@MageKing17) +- Plenty of augmentation description cleanup (@Kwazygloo) +- Plenty of typo/description fixed (@MageKing17) +- Cleanup description of singularity function on readthedocs (@PurePandemonium) +- Fix bug when autolinking a server while backdooring (@schroederIT) +- nerf noodle bar + +## v0.52.0 - 2021-06-13 Infiltration 2.0 (hydroflame & community) + +**Infiltration** + +- Completely reworked. Not the same mechanic at all. + +**Terminal** + +- tail is smarter. It automatically assume the only possible options in some + cases. + +**Intelligence** + +- Now available when starting BN5 instead of after beating it for the first + time. +- Nerf the effect of intelligence on reputation gain. + +**Augmentation** + +- Added a new augmentation, the 'Unstable Circadian Modulator', whose + gimmick is that its stats are randomized every hour. + +**Netscript** + +- 'getPlayer' is not a singularity function anymore. +- 'hacknetNodes.constants' returns the correct values. +- 'createGang' has been added. +- 'inGang' has been added. + +**Tutorial** + +- Updated the tutorial. Made it look cleaner, fixed typos, etc. + +**Misc.** + +- Fix many typos in literature (@kwazygloo) +- Fix being able to unfocus from gym and university. +- Fix being able to do hacking missions while unfocused. +- Fix many typos in Augmentation descriptions (@kwazygloo) +- More numbers handle absurdly large values. (@Tesseract1234567890) +- Fix many typos (@Tesseract1234567890) +- Fixed an issue that caused a UI desync when sleeves were set to workout + stats other than strength at the gym. +- Fix weird alignment of donation text box and button. (@Tesseract1234567890) +- Fixed an issue where reputation could be transfered to new jobs when unfocused. +- Empty stack traces should no longer appear. +- Purchasing anything with Infinity money doesn't result in NaN. +- nerf noodle bar + +## v0.51.10 - 2021-05-31 Focus Mark, Focus! (hydroflame) + +**Focus** + +- You can now use the terminal and write scripts while working for factions + but you will gain reputation at a slower rate. + +**SF -1** + +- Added a new SF -1: Bypass + +**Gang** + +- "Vigilante justice"/"Ethical hacking" now reduces wanted level by a very + small percentage as well an absolute value. + +**Netscript** + +- 'tFormat' now has a second argument to display with millisecond precision. +- 'purchaseSleeveAug' can no longer purchase the same aug over and over for + the same sleeve. +- fix typo in logging for 'getServerSecurityLevel' +- Fixed some weird issue where very rarely you would get 0 exp from 'grow' +- 'getActionTime' now returns correct values for Diplomacy and Regeneration. + +**Corporations** + +- Fixed an exploit where you could get nearly infinite corporation funds by + entering negative numbers in textboxes. +- Fixed an exploit where shares could be sold again by clicking the + "sell share" button via scripts. + +**Documentation** + +- typo fix in purchaseTor +- typo fix in basicgameplay/stats + +**Misc.** + +- Very large number will no longer appear as "$NaNt" +- Hash capacity now displays in the "big number" format. +- nerf noodle bar + +## v0.51.9 - 2021-05-17 offline progress and exports! (hydroflame & community) + +**Alias** + +- several commands can be included in 1 alias. Recursive alias now work to + a depth of 10. (@Dawe) + +**Offline** + +- Offline money gain has been reworked (it is more generous) +- If you're not working anywhere and go offline the game will work for you + at all your factions evenly. + +**Export** + +- Exporting now gives +1 favor to all joined factions every 24h. + +**Corp** + +- Self-fund with an invalid name no longer takes away 150b anyway. +- Can no longer export negative amount + +**Bladeburner** + +- No longer waste overflowing time. + +**Text Editors** + +- All settings will now be saved and loaded correctly. + +**Terminal** + +- 'scan' now works for servers that are more than 21 character long. + +**Misc.** + +- ls now correctly lists all files. +- importing auto save+reloads (@Dawe) +- Fix a bug where .fconf could not be created +- Fix formatting inconsistencies for some logs of netscript functions. +- Fix a bug where Cashroot starter kit would appear as [object Object] in + confirmation dialog. +- Fix some ram not displayed as 0.00GB +- Fix error message throw undefined variable error +- City hall now has some generic text if you can't create a corp yet. +- Deleting a file without extension now returns an appropriate error message. +- Fixed an issue where bladeburner would miscalculate the cost of hospitalization. +- It is now possible to suppress bladeburner "action stopped" popup. +- Updated several dependencies (big who cares, I know) +- ls no longer prints lingering newline. +- Money earned/spent by sleeves is now tracked under Character>Money +- nerf noodle bar + +## v0.51.8 - 2021-05-07 It was there all along (hydroflame & community) + +**Servers** + +- Update n00dles metadata + +**Netscript** + +- 'hashGainRate' use the correct 'usedRam' and 'maxRam' +- Fix 'setActionAutolevel' logging. +- Fix 'setActionLevel' not working at all. +- Add 'installBackdoor' singularity function. + +**Hacknet** + +- Fix Hacknet Servers total production always displaying 0 + +**Documentation** + +- Updated guide to no longer recommend BN12. +- Fix documentation for maxNumNodes (@ModdedGamers) +- Fix typo in 'sourcefiles.rst' +- Fix typo in 'recommendedbitnodeorder.rst' +- Fix 'getServer' documentation missing 'server' argument. +- Fix missing ram cost in 'getData.rst' +- Fix basic formulas examples. +- Fix typo in BN11 description. +- Fix formatting issue in Bladeburner (@Pimgd) + +**Misc.** + +- Fix negative money being displayed in full. +- Fix Hacking Missions not working. +- Fix Corporation tree not rendering. +- Fix script being needlessly recompiled. This should save real ram (not game ram) +- w0r1d_d43m0n can be backdoored +- Coding Contracts title is click-to-copy (@Rodeth) +- Covenant memory upgrade works better. +- Fix Neuroflux not being correctly calculated when entering BN with SF12. +- Delete Active Script now delete all active scripts, not just home. +- Now you can 'cd' in directories that only contain '.txt' files. +- Fix 'analyze' always saying players had root access +- Passive faction rep no longer builds for special factions. +- Donation option no longer appears for special factions. +- Rephrased some milestones. +- donation textbox now accepts money in the format '1b' and the like (@Dawe) +- Fix being able to join hated factions simultaneously. (@Dawe) +- 'ls' now displays files in multiple column. (Helps players with many files) +- Bladeburner multiplers now appear under Character>Stats and + Character>Augmentation when they are relevant. +- Fix missing functions syntax highlight in codemirror. +- Fix infiltration number formatting. +- script income transfers to parent on death. This helps keep track of + income for scripts that spawn short lived scripts. +- nerf noodle bar + +## v0.51.7 - 2021-04-28 n00dles (hydroflame & community) + +**Tutorial servers** + +- All the tutorial servers have been reverted to their original value +- The new server n00dles has been added as tutorial server. + +**Terminal** + +- 'tail' now accepts Pid. +- 'analyze' now handles Hacknet Servers correctly. +- 'ServerProfiler.exe' now handles Hacknet Servers correctly. + +**SF12** + +- Now makes you start with Neuroflux Governor equal to the level of the SF. + +**Netscript** + +- Deprecated 'getServerRam'. +- 'getServerMaxRam' added to replace 'getServerRam' +- 'getServerUsedRam' added to replace 'getServerRam' +- 'getBitnodeMultipliers' is available inside BN5 +- Time logged by hack/grow/weaken now displays in human time. +- thread count logged by hack/grow/weaken now displays with commas every + thousands place. + +**Donation** + +- Always visible but locked until favor requirements are reached. + +**Augmentations** + +- City factions has been rebalanced to give a reason to visit them all. + +**Sleeves** + +- Fix sleeves not being able to work at Volhavens gym. + +**Lint** + +- This shouldn't change anything but was like 10h of work. So I'm logging it. + +**Misc.** + +- Plethora of typo fixed (@Pimgd) +- ps documentation fix (@Dawe) +- The dev menu now has a quick bitflume option. +- Fix SF -1 not being as powerful as intended. +- Fix cashroot starter kit not displaying correctly. +- Fix DOM element 'character-overview-text' being nested twice. +- Hacknet documentation example fix. +- Money amount under 1000 dont display 3 decimal anymore. +- Fix nextSourceFile flag miscalculation on the bitverse (for Bn12) +- Faction invite text says "Decide later"/"Join!" instead of "No"/"Yes" +- nerf noodle bar + +## v0.51.6 - 2021-04-28 Backdoor! (hydroflame & community) + +**Backdoor** + +- a new terminal command, backdoor, has been added to help differentiate + between the terminal hack command and the netscript hack function. (@dewint) + +**Servers** + +- foodnstuff, sigma-cosmetics, and joesguns have been rebalanced to help new players. + +**Milestones** + +- A new tab under the Help menu has been added to guide players through the + game. + +**Casino** + +- Blackjack has been added (@BigD) + +**Netscript** + +- 'prompt' now converts input to JSON. +- 'getRunningScript' is a new netscript function that returns a bunch of + data related to a running script. + +**Coding contracts** + +- trivial puzzles should no longer appear. + +**Infiltration** + +- All numbers are formatted like the rest of the game. + +**Misc.** + +- Server security is capped at 100. +- Added option to quit a job. +- 'cd' no longer works on unexistent folders. +- cd with no arguments brings you back to top level folder (@Andreas) +- 'softReset' documentation udpated. +- Money tracker now accounts for going to the hospital manually. +- codemirror is now the default editor (for new save files) +- fix typo in dark web help text (@Rodeth) +- so many documentation and typos fixes (@Pimgd) +- A corruption visual effect has been added to location with servers that + have backdoor installed. (@dewint) +- nerf noodle bar + +## v0.51.5 - 2021-04-20 Flags! (hydroflame) + +**Netscript** + +- 'flags' is a new function that helps script handle flags. + This is subject to change if it doesn't meet the need of the players. +- 'ps' now returns the pid. +- 'tail' now works with pid as first argument. +- 'tail' hostname defaults to current server. (like the documentation says) +- 'isRunning' hostname defaults to current server. +- 'isRunning' now works with pid as first argument. + +**Gang** + +- Nerfed ascension mechanic once again :( + +**Misc.** + +- Souce-File typo fix +- Fix 'while you were away' screen. +- Bladeburner team size can no longer be set to negative amounts. +- nerf noodle bar + +## v0.51.4 - 2021-04-19 Manual hacking is fun (hydroflame) + +**Manual hacking** + +- These bonus require an install or a soft reset to take effect. +- Manual hacking gyms and university gives you a 10% discount. +- Manual hacking a corporation server decreases the penalty for leaving work + early. + +**BladeBurner** + +- nerfed int exp gained. + +**Documentation** + +- purchaseServer specifies what happens on failure. +- Fixed typo in recommended bitnode page. +- Removed misleading ram requirements for hacking factions. + +**Netscript** + +- growthAnalyze handles Infinity correctly. + +**Misc.** + +- Faction Augmentation will list how much reputation is required even after + that goal has been reached. +- Removed dollar sign in travel agency confirmation dialog box. +- Fixed typo in alpha-omega.lit +- the 'Game saved!' text no longer blocks the save game/options button. +- The text editor now remembers the location of your cursor and restores it. +- skills are recalculated instantly. +- Fix typo in Operation Zero description. +- nerf noodle bar + +## v0.51.3 - 2021-04-16 Y'all broke it on the first day (hydroflame) + +**Passive faction reputation** + +- Reworked, from 1 rep / 2 minute. Now is a complicated percentage of the + reputation you'd gain working for them. It's not op but it feels a bit + more useful. + +**Netscript** + +- print/tprint now take any number of arguments. +- print/tprint will now print object as json. +- print/tprint now handle passing in an undefined argument properly. + +**Casino** + +- Cannot bet negative money anymore. +- Roulette max bet is a bit higher. +- Coin Flip has a small cooldown. +- All buttons reject unstrusted mouse events. + +**Documentation** + +- Changed a message that said nsjs only works on Chrome. + +**Bugfix** + +- hacknet.maxNumNodes now works for both nodes and servers. +- Fixed a bug where the popup boxes would contain data from previous popup boxes. +- .js files will also have the 'export async function' boilerplate. + +**Misc.** + +- turned off web form autocomplete for the terminal text input. +- Fixed an issue on Windows+Firefox where pressing up on the terminal would + bring the cursor to the begining of the line. (Issue #836) +- Hacknet node names is easier to handle for screen readers. +- Money spent on classes is now tracked independently of work money. +- running coding contract from the terminal will display its name. +- nerf noodle bar + +## v0.51.2 - 2021-04-09 Vegas, Baby! (hydroflame) + +**New location: The Iker Molina Casino** + +- A casino opened in Aevum. However the house is rumored to cheat. If only + we could give them a taste of their own medicine. + +**Misc.** + +- Link to discord added under options +- 'getMemberInformation' doc updated, oops +- tech vendor now handle max ram and cores. +- nerf noodle bar + +## v0.51.1 - 2021-04-06 Bugfixes because the author of the last patch sucks (it's hydroflame) + +**Netscript** + +- 'getPlayer' returns players faction and tor +- 'hospitalization' is a new singularity function. +- 'gang.getMemberInformation' now returns more information. +- 'hacknet.hashCapacity' is a new hacknet function that returns the maximum hash capacity. + +**Hospitalization** + +- Now only cost at most 10% of your money. + +**Bugfix** + +- confirmation dialog box no longer use previous text + +**Accessibility** + +- The game is a little easier to handle for screen readers (yes, there's an + absolute legend playing this game with a screen reader) +- Infiltration use buttons instead of a-links +- New option to disable ASCII art. This will make the metro map and world + map display as a list of buttons. + +**Misc.** + +- 'fl1ght.exe' will no longer suggest the combat path. Related faction + requirements unchanged. +- nerf noodle bar + +## v0.51.0 - 2021-03-31 Formulas (hydroflame) + +**Formulas API** + +- A new API is introduced, this gives players access to various formulas used in the game. + It'll help you make more informed decisions. + +**Netscript** + +- 'getServer' is a new function meant to be used with the formulas API. +- 'getPlayer' is a new function meant to be used with the formulas API. +- 'getStats' and 'getCharacterInformation' are deprecated in favor of 'getPlayer' +- 'getCurrentServer' is a new function that returns the server the player is currently connected. + +**Display** + +- All money should now consistently be orange. +- All rep should now consistently be light-yellow. +- Most numbers should display consistently now (aka all money is formatted the same). + +**Click to copy** + +- Certain UI elements are now 'click-to-copy' + +** Misc. ** + +- nerf noodle bar + +## v0.50.2 - 2021-03-25 Everyone asked for this one. (hydroflame) + +**BitNodeMultipliers** + +- 'GangKarmaRequirements': a new multipler that influences how much karma is required to make a gang different bitnodes. + +**Netscript** + +- 'connect': a new singularity function that connects you to a server. (like the terminal command) +- 'manualHack': a new singularity function that performs a manual hack on the players current server. +- ns2 stack trace works on Firefox now. + +**Misc.** + +- New shortcut, Alt + b, brings you to bladeburner +- New shortcut, Alt + g, brings you to gang +- nerf noodle bar + +## v0.50.1 - 2021-03-22 (hydroflame) + +**Netscript** + +- getTaskStats works + +**Source-File -1** + +- Added a new Exploit + +**Factions** + +- Augmentations offered by a Faction but already bought are in a separate list at the bottom of the page. + +**Bug fixed** + +- Fixed a bug where completing a maxed non-repeatable BitNode would make its color on the BitVerse like level 1. + +**Misc.** + +- Minor spacing in stats tables. +- nerf noodle bar + +## v0.50.0 - 2021-03-20 Intelligence (hydroflame) + +**Intelligence** + +- int exp gain and effect has been reworked. It is now much more easy to + acquire and far more powerful. The goal here is to feel like players have + another tool in their arsenal. + +**Factions** + +- Hacking factions no longer have hacking level requirements since their associated servers do. + +**Misc.** + +- Sleeve styling. +- number formatting +- remove wiki button in Hacking Missions. +- Fix NaN displayed when very very large numbers are reached. +- nerf noodle bar + +## v0.49.2 - 2021-03-13 (hydroflame) + +**BN8** + +- A new bitnode multipler has been added, it lets you reduce money from a + server without gaining actually any money. This is important for BN8 where + hack/grow can influence the stock market. No money can be gained from + hacking but server money can still be reduced. + +**Documentation** + +- readthedocs should now be more consistent and many examples were added. + +**Netscript** + +- Ace editor will now correctly highlight all functions. +- 'tFormat' is a new netscript function that returns a human readable + representation of milliseconds. eg. "2 hours 15 minute 43 seconds" + +**Gang** + +- style improvements + +**Bladeburner** + +- style improvements +- fix bug where 'skill list SKILL' would crash if skill is level 0. + +**Sleeve** + +- karma gain now scales with sync. + +**Misc.** + +- Fix issue where the effective stats under Character>Stats were being calculated. +- nerf noodle bar + +## v0.49.0 - 2021-03-11 Source-File -1 (hydroflame) + +**Source-File -1** + +- For advanced players: The game now embraces exploits and will reward + players for doing so. + +**Gang** + +- ascension is less effective as the ascension multiplier goes up. +- territory gain scales with power difference. + +**Netscript** + +- 'gang.getEquipmentStats' returns the stats of the equipment. +- 'gang.getTaskStats' returns the stats of a task. +- 'getCrimeStats' returns the stats of a crime. +- Crashes should now print the ns stack trace. +- Log messages are now more consistent. +- 'softReset' now accepts a callback script like 'installAugmentations' + +**Misc.** + +- Minor formatting under Hacking>Active Scripts +- option menu colors now match the rest of the game, kinda. +- nerf noodle bar + +## v0.48.0 - ASCII - 2021-03-07 (hydroflame) + +**ASCII** + +- Travel Agency now displays a world map +- Cities are now top view of metro station maps + +**Netscript** + +- 'softReset' is a new netscript function that performs a soft reset + regardless of if the player has bought augmentations or not. +- 'getAugmentationStats' is a new netscript function that returns the stats of + an augmentation. +- getCharacterInformation now additionally returns exp +- pid resets back to 1 when installing or destroying a BitNode. +- New '.ns' scripts start with a main function. +- 'hacknet.maxNumNodes' returns the maximum number of hacknet nodes. + +**Bladeburner** + +- Current stamina will scale as max stamina increases, this prevents players + from having very high penalty when they gain huge amount of exp at the + start of a reset. + +**Misc.** + +- Fixed an issue where SF3 was listed as infinitly repeatable and SF12 as + having a limit of 3. +- Fixed an issue where the gang equipment screen would freeze the game if a + script installed augmentations while it is open. +- All BonusTime now displays in the 'H M S' format. +- Donation textbox style updated to match the rest of the game. +- Corporation name style updated to match the rest of the game. +- minor formatting under Hacking>Active Scripts +- typo in BN12 description +- BN12 now reduces contract money +- Character>Stats percentages are aligned, server and hacknet limit are + displayed, if the player has SF5 the reduces stats are shown. +- Character>Augmentations now displays by how much the player stats will + increase. +- Character>Augmentations has a badge indicating how many augs the player + has bought but not installed +- Character>Factions has a badge indicating how many factions have pending + invites. +- nerf noodle bar + +## v0.47.2 - 7/15/2019 + +**Netscript Changes** + +- Added tail() Netscript function +- hacknet.getNodeStats() function now returns an additional property for Hacknet Servers: hashCapacity +- When writing to a file, the write() function now casts the data being written to a string (using String()) +- BitNode-selection page now shows what Source-File level you have for each BitNode +- Overloaded kill() function so that you can kill a script by its PID +- spawn() now only takes 10 seconds to run (decreased from 20 seconds) +- run() and exec() now return the PID of the newly-executed scripts, rather than a boolean + - (A PID is just a positive integer) +- run(), exec(), and spawn() no longer need to be await-ed in NetscriptJS +- Script parsing and RAM calculations now support ES9 +- installAugmentations() no longer has a return value since it causes all scripts to die +- isBusy() now returns true if you are in a Hacking Mission +- Bug fix: workForFaction() function now properly accounts for disabled logs +- Bug fix: RAM should now be properly calculated when running a callback script with installAugmentations() +- Bug fix: Fixed bug that caused scripts killed by exit()/spawn() to "clean up" twice + +**Misc Changes** + +- The 'kill' Terminal command can now kill a script by its PID +- Added 'Solarized Dark' theme to CodeMirror editor +- After Infiltration, you will now return to the company page rather than the city page +- Bug fix: Stock Market UI should no longer crash for certain locale settings +- Bug fix: You can now properly remove unfinished programs (the `*.exe-N%-INC` files) +- Bug fix: Fixed an issue that allowed you to increase money on servers with a 'maxMoney' of 0 (like CSEC) +- Bug fix: Scripts no longer persist if they were started with syntax/import errors +- Bug fix: 'hack' and 'analyze' Terminal commands are now blocking +- Bug fix: Exp earned by duplicate sleeves at universities/gyms now takes hash upgrades into account + +## v0.47.1 - 6/27/2019 + +- Stock Market changes: + + - Transactions no longer influence stock prices (but they still influence forecast) + - Changed the way stocks behave, particularly with regard to how the stock forecast occasionally "flips" + - Hacking & growing a server can potentially affect the way the corresponding stock's forecast changes + - Working for a company positively affects the way the corresponding stock's forecast changes + +- Scripts now start/stop instantly +- Improved performance when starting up many copies of a new NetscriptJS script (by Ornedan) +- Improved performance when killing scripts +- Dialog boxes can now be closed with the ESC key (by jaguilar) +- NetscriptJS scripts should now be "re-compiled" if their dependencies change (by jaguilar) +- write() function should now properly cause NetscriptJS scripts to "re-compile" (by jaguilar) + +## v0.47.0 - 5/17/2019 + +- Stock Market changes: + + - Implemented spread. Stock's now have bid and ask prices at which transactions occur + - Large transactions will now influence a stock's price and forecast + - This "influencing" can take effect in the middle of a transaction + - See documentation for more details on these changes + - Added getStockAskPrice(), getStockBidPrice() Netscript functions to the TIX API + - Added getStockPurchaseCost(), getStockSaleGain() Netscript functions to the TIX API + +- Re-sleeves can no longer have the NeuroFlux Governor augmentation + + - This is just a temporary patch until the mechanic gets re-worked + +- hack(), grow(), and weaken() functions now take optional arguments for number of threads to use (by MasonD) +- codingcontract.attempt() now takes an optional argument that allows you to configure the function to return a contract's reward +- Adjusted RAM costs of Netscript Singularity functions (mostly increased) +- Adjusted RAM cost of codingcontract.getNumTriesRemaining() Netscript function +- Netscript Singularity functions no longer cost extra RAM outside of BitNode-4 +- Corporation employees no longer have an "age" stat +- Gang Wanted level gain rate capped at 100 (per employee) +- Script startup/kill is now processed every 3 seconds, instead of 6 seconds +- getHackTime(), getGrowTime(), and getWeakenTime() now return Infinity if called on a Hacknet Server +- Money/Income tracker now displays money lost from hospitalizations +- Exported saves now have a unique filename based on current BitNode and timestamp +- Maximum number of Hacknet Servers decreased from 25 to 20 +- Bug Fix: Corporation employees stats should no longer become negative +- Bug Fix: Fixed sleeve.getInformation() throwing error in certain scenarios +- Bug Fix: Coding contracts should no longer generate on the w0r1d_d43m0n server +- Bug Fix: Duplicate Sleeves now properly have access to all Augmentations if you have a gang +- Bug Fix: getAugmentationsFromFaction() & purchaseAugmentation() functions should now work properly if you have a gang +- Bug Fix: Fixed issue that caused messages (.msg) to be sent when refreshing/reloading the game +- Bug Fix: Purchasing hash upgrades for Bladeburner/Corporation when you don't actually have access to those mechanics no longer gives hashes +- Bug Fix: run(), exec(), and spawn() Netscript functions now throw if called with 0 threads +- Bug Fix: Faction UI should now automatically update reputation +- Bug Fix: Fixed purchase4SMarketData() +- Bug Fix: Netscript1.0 now works properly for multiple 'namespace' imports (import \* as namespace from "script") +- Bug Fix: Terminal 'wget' command now correctly evaluates directory paths +- Bug Fix: wget(), write(), and scp() Netscript functions now fail if an invalid filepath is passed in +- Bug Fix: Having Corporation warehouses at full capacity should no longer freeze game in certain conditions +- Bug Fix: Prevented an exploit that allows you to buy multiple copies of an Augmentation by holding the 'Enter' button +- Bug Fix: gang.getOtherGangInformation() now properly returns a deep copy +- Bug Fix: Fixed getScriptIncome() returning an undefined value +- Bug Fix: Fixed an issue with Hacknet Server hash rate not always updating + +## v0.46.3 - 4/20/2019 + +- Added a new Augmentation: The Shadow's Simulacrum +- Improved tab autocompletion feature in Terminal so that it works better with directories +- Bug Fix: Tech vendor location UI now properly refreshed when purchasing a TOR router +- Bug Fix: Fixed UI issue with faction donations +- Bug Fix: The money statistics & breakdown should now properly track money earned from Hacknet Server (hashes -> money) +- Bug Fix: Fixed issue with changing input in 'Minimum Path Sum in a Triangle' coding contract problem +- Fixed several typos in various places + +## v0.46.2 - 4/14/2019 + +- Source-File 2 now allows you to form gangs in other BitNodes when your karma reaches a very large negative value + + - (Karma is a hidden stat and is lowered by committing crimes) + +- Gang changes: + + - Bug Fix: Gangs can no longer clash with themselve + - Bug Fix: Winning against another gang should properly reduce their power + +- Bug Fix: Terminal 'wget' command now works properly +- Bug Fix: Hacknet Server Hash upgrades now properly reset upon installing Augs/switching BitNodes +- Bug Fix: Fixed button for creating Corporations + +## v0.46.1 - 4/12/2019 + +- Added a very rudimentary directory system to the Terminal + + - Details here: https://bitburner.readthedocs.io/en/latest/basicgameplay/terminal.html#filesystem-directories + +- Added numHashes(), hashCost(), and spendHashes() functions to the Netscript Hacknet Node API +- 'Generate Coding Contract' hash upgrade is now more expensive +- 'Generate Coding Contract' hash upgrade now generates the contract randomly on the server, rather than on home computer +- The cost of selling hashes for money no longer increases each time +- Selling hashes for money now costs 4 hashes (in exchange for $1m) +- Bug Fix: Hacknet Node earnings should work properly when game is inactive/offline +- Bug Fix: Duplicate Sleeve augmentations are now properly reset when switching to a new BitNode + +## v0.46.0 - 4/3/2019 + +- Added BitNode-9: Hacktocracy +- Changed BitNode-11's multipliers to make it slightly harder overall +- Source-File 11 is now slightly stronger +- Added several functions to Netscript Sleeve API for buying Sleeve augmentations (by hydroflame) +- Added a new stat for Duplicate Sleeves: Memory +- Increase baseline experience earned from Infiltration, but it now gives diminishing returns (on exp) as you get to higher difficulties/levels +- In Bladeburner, stamina gained from Hyperbolic Regeneration Chamber is now a percentage of your max stamina + +- Corporation Changes: + + - 'Demand' value of products decreases more slowly + - Bug Fix: Fixed a Corporation issue that broke the Market-TA2 Research + - Bug Fix: Issuing New Shares now works properly + +- Bug Fix: Money Statistics tracker was incorrectly recording profits when selling stocks manually +- Bug Fix: Fixed an issue with the job requirement tooltip for security jobs + +## v0.45.1 - 3/23/2019 + +- Added two new Corporation Researches +- General UI improvements (by hydroflame and koriar) +- Bug Fix: Sleeve Netscript API should no longer cause Dynamic RAM errors +- Bug Fix: sleeve.getSleeveStats() should now work properly + +## v0.45.0 - 3/22/2019 + +- Corporation changes: + + - Decreased the time of a full market cycle from 15 seconds to 10 seconds. + - This means that each Corporation 'state' will now only take 2 seconds, rather than 3 + - Increased initial salaries for newly-hired employees + - Increased the cost multiplier for upgrading office size (the cost will increase faster) + - The stats of your employees now has a slightly larger effect on production & sales + - Added several new Research upgrades + - Market-TA research now allows you to automatically set sale price at optimal values + - Market-TA research now works for Products (not just Materials) + - Reduced the amount of Scientific Research needed to unlock the Hi-Tech R&D Laboratory from 10k to 5k + - Energy Material requirement of the Software industry reduced from 1 to 0.5 + - It is now slightly easier to increase the Software industry's production multiplier + - Industries now have a maximum number of allowed products, starting at 3. This can be increased through research. + - You can now see an approximation of how each material affects an industry's production multiplier by clicking the "?" help tip next to it + - Significantly changed the effects of the different employee positions. See updated descriptions + - Reduced the amount of money you gain from private investors + - Training employees is now 3x more effective + - Bug Fix: An industry's products are now properly separated between different cities + +- The QLink Augemntation is now significantly stronger, but also significantly more expensive (by hydroflame) +- Added a Netscript API for Duplicate Sleeves (by hydroflame) +- Modified the multipliers of BitNode-3 and BitNode-8 to make them slightly harder +- After installing Augmentations, Duplicate Sleeves will now default to Synchronize if their Shock is 0 +- Bug Fix: Bladeburner's Hyperbolic Regeneration Chamber should no longer instantly refill all stamina +- Bug Fix: growthAnalyze() function now properly accounts for BitNode multipliers +- Bug Fix: The cost of purchasing Augmentations for Duplicate Sleeves no longer scales with how many Augs you've purchased for yourself + +## v0.44.1 - 3/4/2019 + +- Duplicate Sleeve changes: + + - You can now purchase Augmentations for your Duplicate Sleeves + - Sleeves are now assigned to Shock Recovery task by default + - Shock Recovery and Synchronize tasks are now twice as effective + +- Changed documentation so that Netscript functions are own their own pages. Sorry if this is annoying, it was necessary for properly cross-referencing +- Officially deprecated the Wiki (the fandom site). Use the 'readthedocs' Documentation instead +- Bug Fix: 'rm' Terminal and Netscript commands now work on non-program files that have '.exe' in the name (by Github user MasonD) +- Bug Fix: The 'Find All Valid Math Expressions' Coding Contract should now properly ignore whitespace in answers +- Bug Fix: The 'Merge Overlapping Intervals' Coding Contract should now properly accept 2D arrays when being attempted through Netscript + +## v0.44.0 - 2/26/2019 + +- Bladeburner Changes: + - Reduced the amount of rank needed to earn a skill point + - Reduced the effects of the "Reaper" and "Evasive System" skills + - Increased the effect of the "Hyperdrive" and "Hands of Midas" skills + - Slightly increased the rate which the skill point cost rises for almost all skills + - The "Overlock" Skill now has a maximum level of 90 instead of 95 + - Money earned from Contracts increased by 400% + - Changed the way population affects success rate. Extreme populations now have less dramatic effects + - Added two new General Actions: Diplomacy and Hyperbolic Regeneration Chamber + - Lowered the rep and money cost of the "Blade's Simulacrum" augmentation + - Significantly decreased the initial amount of Contracts/Operations (the "Contracts/Operations remaining" value) + - Decreased the rate at which the amount of Contracts/Operations increases over time + - Decreased the number of successes you need to increase the max level of a Contract/Operation + - Increased the average number of Synthoid communities each city has + - Reduced the amount by which a successful raid will decrease the population of a city + - The "riots" event will now increase the chaos of a city by a greater amount + - Significantly increased the effect that Agility and Dexterity have on action time +- Added new BitNode multipliers: + - HomeComputerRamCost - Affects how much it costs to upgrade home computer's RAM + - DaedalusAugsRequirement - Affects how many Augmentations you need in order to get invited to Daedalus + - FourSigmaMarketDataCost - Affects how much it costs to unlock the stock market's 4S Market Data + - FourSigmaMarketDataApiCost - Affects how much it costs to unlock the stock market's 4S Market Data API +- A few minor changes to BitNode multipliers across the board (mostly for the new multipliers) +- 'The Covenant' now requires 20 total Augmentations to get invited, rather than 30 +- You can now purchase permanent Duplicate Sleeves from 'The Covenant'. This requires Source-File 10, and you must be in BN-10 or after +- You can now track where all of your money comes from in the 'Stats' page +- Increased the money gained from Coding Contracts by 50% +- getCharacterInformation() function now returns the player's HP and max HP +- Bug Fix: You can no longer disconnect the enemy's connections in Hacking Missions +- Bug Fix: Duplicate Sleeve faction reputation gain is now properly affected by faction favor +- Bug Fix: After installing Augmentations, the Terminal display will now correctly show the current server as "home" +- Bug Fix: Fixed an exploit where you could change the duration of timed functions (e.g. hack, weaken) in NetscriptJS +- Bug Fix: You should now properly be able to use the ServerProfile.exe program +- Bug Fix: Prevented exploit that allowed you to accept faction invites programmatically through NetscriptJS +- Bug Fix: Faction invitations for megacorporations should now work properly + +## v0.43.1 - 2/11/2019 + +- Terminal changes: + + - Quoted arguments are now properly parsed. (e.g. 'run f.script "this is one argument"' will be correctly parsed) + - Errors are now shown in red text + - 'unalias' command now has a different format and no longer needs the quotations + - Bug Fix: Fixed several edge cases where autocomplete wasn't working properly + +- Added two new Bladeburner skills for increasing money and experience gain +- Made some minor adjustments to Bladeburner UI +- Corporation "Smart Factories" and "Smart Storage" upgrades have slightly lower price multipliers +- Added nFormat Netscript function +- Added 6 new Coding Contract problems +- Updated documentation with list of all Coding Contract problems +- Minor improvements for 'Active Scripts' UI +- Implemented several optimizations for active scripts. The game should now use less memory and the savefile should be slightly smaller when there are many scripts running +- Bug Fix: A Stock Forecast should no longer go above 1 (i.e. 100%) +- Bug Fix: The cost of Resleeves should no longer be affected by buying Augs +- Bug Fix: Duplicate Sleeves now use their own stats to determine crime success rate, instead of the host consciousness' stats +- Bug Fix: You can now call the prompt() Netscript function from multiple scripts simultaneously + +## v0.43.0 - 2/4/2019 + +- Added BitNode-10: Digital Carbon + +- Stock Market Changes: + + - Each stock now has a maximum number of shares you can purchase (both Long and Short positions combined) + - Added getStockMaxShares() Netscript function to the TIX API + - The cost of 4S Market Data TIX API Access increased from $20b to $25b + +- Job Changes: + + - You can now hold multiple jobs at once. This means you no longer lose reputation when leaving a company + - Because of this change, the getCharacterInformation() Netscript function returns a slightly different value + +- Script Editor Changes: + + - Added new script editor: CodeMirror. You can choose between the old editor (Ace) or CodeMirror + - Navigation keyboard shortcuts no longer work if the script editor is focused + +- Trying to programmatically run a script (run(), exec()) with a 'threads' argument of 0 will now cause the function to return false without running the script +- Home Computer RAM is now capped at 2 ^ 30 GB (1073741824 GB) +- The maximum amount, maximum RAM, and cost of purchasing servers can now vary between different BitNodes (new BitNode multipliers) +- Pop-up dialog boxes are a little bit bigger +- Bug Fix: When importing scripts, "./" will now be properly ignored (e.g. import { foo } from "./lib.script" ) + +## v0.42.0 - 1/8/2019 + +- Corporation Changes: + + - Corporation can now be self-funded with $150b or using seed money in exchange for 500m newly-issued shares + - In BitNode-3, you no longer start with $150b + - Changed initial market prices for many materials + - Changed the way a material's demand, competition, and market price change over time + - The sale price of materials can no longer be marked-up as high + - Added a Research Tree mechanic. Spend Scientific Research on permanent upgrades for each industry + - You can now redistribute earnings to shareholders (including yourself) as dividends + - Cost of "Smart Supply" upgraded reduced from $50b to $25b + - Now has offline progress, which works similarly to the Gang/Bladeburner mechanics + - Slightly reduced the amount of money offered to you by investment firms + - Employee salaries now slowly increase over time + - Slightly reduced the effect "Real Estate" has on the Production Multiplier for the Agriculture industry + - Changed the way your Corporation's value is calculated (this is what determines stock price) + - After taking your corporation public, it is now possible to issue new shares to raise capital + - Issuing new shares can only be done once every 12 hours + - Buying back shares must now be done at a premium + - Selling shares can now only be done once per hour + - Selling large amounts of shares now immediately impacts stock price (during the transaction) + - Reduced the initial cost of the DreamSense upgrade from $8b to $4b, but increased its price multiplier + - Reduced the price multiplier for ABC SalesBots upgrade + +- Added getOrders() Netscript function to the TIX API +- Added getAugmentationPrereq() Singularity function (by havocmayhem) +- Added hackAnalyzePercent() and hackAnalyzeThreads() Netscript functions +- Stock Market, Travel, and Corporation main menu links are now properly styled +- Many pop-up/dialog boxes now support the 'Enter' and 'Esc' hotkeys. If you find a pop-up/dialog box that doesnt support this, let me know specifically which one ('Enter' for the default option, 'Esc' for cancelling and closing the pop-up box) +- Added "brace_style = preserve_inline" configuration to Script Editor Beautifier +- ServerProfiler.exe can now be purchased from the Dark Web +- Added an option to copy save data to clipboard +- Added total multiplier information on the "Augmentations" page +- Bug Fix: gymWorkout() Singularity function should now work properly with Millenium Fitness Gym +- Began migrating gameplay information to the ReadTheDocs documentation + +## v0.41.2 - 11/23/2018 + +- IMPORTANT - Netscript Changes: + + - rm() now takes an optional parameter that lets you specify on which server to delete the file + - Added growthAnalyze() Netscript function + +- Gang Changes: + + - UI now displays your chance to win a clash with other gangs + - Added getChanceToWinClash() function to the Gang API + - Added getEquipmentType() function to the Gang API + - Added several new hacking-based equipment and Augmentations + - Rebalanced several equipment/upgrades to give less defense + - Wanted level gain rate is now be slightly higher for all tasks + - Rebalanced parameters for "hacking" tasks + +- Added new Main Menu configuration in .fconf: "compact" +- Added the terminal command 'expr', which can be used to evaluate simple mathematical expressions +- Bug Fix: Can no longer purchase duplicate equipment/Augmentations through gang.purchaseEquipment() +- Bug Fix: scp() should no longer throw errors when used with 2-arguments and an array of files +- Bug Fix: Coding Contracts no longer give money in BitNode-8 +- Bug Fix: In Bladeburner, you can no longer start a BlackOp through the Netscript API if it has already been completed +- Bug Fix: In Bladeburner, fixed a bug which caused the configured 'automate' actions to occasionally be switched to other actions +- Bug Fix: 'Return to World' button at locations no longer accumulates event listeners +- Bug Fix: Working & taking classes now continuously add/subtract money during the action, instead of doing it at completion +- Bug Fix: Top-right overview panel now displays negative money using '-' instead of '()' +- Bug Fix: Stock Market UI should no longer show 'NaN' profit immediately after buying a stock + +## v0.41.1 - 11/5/2018 + +- IMPORTANT - Netscript Changes: + + - purchaseTor() now returns true if you already have a TOR router (it used to return false) + - getPurchasedServerCost() now returns Infinity if the specified RAM is an invalid amount or is greater than the max amount of RAM (2 ^ 20 GB) + - Added purchase4SMarketData() and purchase4SMarketDataTixApi() functions + - getScriptLogs() now takes in optional arguments that let you get the logs of another script + +- Stock Market changes: + + - Stocks now have "maximum prices". These are hidden from the player + - If a stock reaches its "maximum price", it will most likely drop in value (although it might still rise) + - Each stock has its own, unique maximum price + - Maximum price for each stock are randomly generated and change during each 'reset' + - Stock Market cycles are now accumulated/stored, much like it is for Gangs and Bladeburners + - Accumulated/stored cycles cause stock prices to update up to 50% faster (from every 6 seconds to 4 seconds) + - This means that after coming back from being offline, stock prices will update faster to make up for offline time + +- Decreased the Hacking Level multiplier for BitNodes 6 and 7 to 0.4 (from 0.5) +- Bladeburner console history is now saved and persists when switching screens or closing/reopening the game +- In Bladeburner, if your stamina reaches 0 your current action will be cancelled +- b1t_flum3.exe is no longer removed from your home computer upon reset +- Added main menu link for the Stock Market (once you've purchased an account) +- Job main menu link only appears if you actually have a job +- Bug Fix: Netscript Gang API functions purchaseEquipment() and ascendMember() should now work properly +- Bug Fix: After installing Augs, the "Portfolio Mode" button on the Stock Market page should be properly reset +- Bug Fix: bladeburner.getActionCountRemaining()'s return value is now rounded down (by Kline-) + +## v0.41.0 - 10/29/2018 + +- WARNING: In NetscriptJS, defining a function called print() is no longer possible +- Gang Mechanic Changes (BitNode-2): + - Added a Gang Netscript API + - Added new 'ascension' mechanic for Gang Members + - The first three gang members are now 'free' (can be recruited instantly) + - Maximum number of increased Gang Members increased from 20 to 30 + - Changed the formula for calculating respect needed to recruit the next gang member + - Added a new category of upgrades for Gang Members: Augmentations + - Non-Augmentation Gang member upgrades are now significantly weaker + - Reputation for your Gang faction can no longer be gained through Infiltration + - Re-worked the territory 'warfare' mechanic so that player can choose when to engage in it + - Gang Members can now be killed during territory 'warfare' + - Changed BitNode-2 Multipliers to make hacking slightly less profitable + - Gang Member Equipment + Upgrades now get cheaper as your gang grows in power and respect + - The effects of Source-File 2 are now slightly more powerful +- RAM Cost of accessing the global document object lowered from 100 GB to 25 GB +- RAM Cost to use Singularity Functions outside of BitNode-4 lowered by 75%. They now only cost twice as much as they do in BitNode-4 +- b1t_flum3.exe now takes significantly less time to create +- Crimes commited through Singularity function no longer give half money/exp (there is now no penalty) +- Improved number formatting for Player 'work' actions (including crimes, etc.). These numbers should also adhere to locale settings now (by Kline-) +- The order that Augmentations are listed in (when purchasing from Faction and viewing your Augmentations) is now saved and persists when choosing different orders +- getCharacterInformation() Singularity function now returns multiplier information (from Augmentations/Source Files) +- Bug Fix: Calling print() in NetscriptJS no longer brings up the print dialog +- Bug Fix: Fixed a bug that sometimes caused a blank black screen when destroying/resetting/switching BitNodes +- Bug Fix: Netscript calls that throw errors will now no longer cause the 'concurrent calls' error if they are caught in the script. i.e. try/catch should now work properly in scripts +- Bug Fix: Fixed a bug where sometimes the NeuroFlux Governor Augmentation level would be incorrectly calculated when the game was loaded +- Bug Fix: Fixed a bug where calling the scp() Netscript function with invalid hostname/ips would throw an unclear error message +- Bug Fix: Bladeburner API function getActionCountRemaining() should now work properly for BlackOps +- Bug Fix: Black Ops can no longer be attempted out-of-order or without the required rank via Bladeburner API +- Bug Fix: Dynamic RAM Calculation now properly accounts for number of threads +- RAM cost for basic Netscript functions added to documentation (by CBJamo) + +## v0.40.5 - 10/09/2018 + +- Added codingcontract.getContractType() Netscript function +- Bug Fix: codingcontract.getData() Netscript function now returns arrays by value rather than reference +- Bug Fix: Decreased highest possible data value for 'Find Largest Prime Factor' Coding Contract (to avoid hangs when solving it) +- Bug Fix: Fixed a bug that caused game to freeze during Coding Contract generation + +## v0.40.4 - 9/29/2018 + +- Added new Coding Contracts mechanic. Solve programming problems to earn rewards +- The write() and read() Netscript functions now work on scripts +- Added getStockSymbols() Netscript function to the TIX API (by InfraK) +- Added wget() Netscript function +- Added bladeburner.getActionRepGain() function to the Netscript Bladeburner API +- The getLevelUpgradeCost(), getRamUpgradeCost(), and getCoreUpgradeCost() functions in the Hacknet API now return Infinity if the node is at max level. See documentation +- It is now possible to use freely use angled bracket (<, >) and create DOM elements using tprint() +- The game's theme colors can now be set through the Terminal configuration (.fconf). +- You can now switch to the old left-hand main menu bar through the Terminal configuration (.fconf) +- Bug Fix: grow() percentage is no longer reported as Infinity when a server's money is grown from 0 to X +- Bug Fix: Infiltration popup now displays the correct amount of exp gained + +## v0.40.3 - 9/15/2018 + +- Bladeburner Changes: + - Increased the effect that agi and dexterity have on action time + - Starting number of contracts/operations available will be slightly lower + - Random events will now happen slightly more often + - Slightly increased the rate at which the Overclock skill point cost increases +- The maximum volatility of stocks is now randomized (randomly generated within a certain range every time the game resets) +- Increased the range of possible values for initial stock prices +- b1t_flum3.exe program can now be created immediately at Hacking level 1 (rather than hacking level 5) +- UI improvements for the character overview panel and the left-hand menu (by mat-jaworski) +- General UI improvements for displays and Terminal (by mat-jaworski) +- Added optional parameters to the getHackTime(), getGrowTime(), and getWeakenTime() Netscript functions +- Added isLogEnabled() and getScriptLogs() Netscript functions +- Added donateToFaction() Singularity function +- Updated documentation to reflect the fact that Netscript port handles (getPortHandle()) only works in NetscriptJS (2.0), NOT Netscript 1.0 +- Added tryWrite() Netscript function +- When working (for a company/faction), experience is gained immediately/continuously rather than all at once when the work is finished +- Added a setting in .fconf for enabling line-wrap in the Terminal input +- Adding a game option for changing the locale that most numbers are displayed in (this mostly applies for whenever money is displayed) +- The randomized parameters of many high-level servers can now take on a higher range of values +- Many 'foreign' servers (hackable servers that you don't own) now have a randomized amount of RAM +- Added 'wget' Terminal command +- Improved the introductory tutorial + +## v0.40.2 - 8/27/2018 + +- Bladeburner Changes: + - Added getBonusTime(), getSkillUpgradeCost(), and getCity() Netscript functions to the API + - Buffed the effects of many Bladeburner Augmentations + - The Blade's Simulacrum Augmentation requires significantly less reputation but slightly more money + - Slightly increased the amount of successes needed for a Contract/Operation in order to increase its max level + - Increased the amount of money gained from Contracts by ~25% + - Increased the base amount of rank gained from Operations by 10% + - Significantly increased the 'randomness' in determining a Contract/Operation's initial count and rate of count increase + - The number (count) of Operations should now increase significantly faster + - There are now, on average, more Synthoid communities in a city + - If automation is enabled (the feature in Bladeburner console), then switching to another action such as working for a company will now disable the automation +- Stock Market Changes: + - Added a watchlist filter feature to the UI that allows you to specify which stocks to show + - Added the Four Sigma (4S) Market Data feed, which provides volatility and price forecast information about stocks + - Added the 4S Market Data TIX API, which lets you access the aforementioned data through Netscript +- There is now a setting for enabling/disabling the popup that appears when you are hospitalized +- Bug Fix: Stock market should now be correctly initialized in BitNode-8 (by Kline-) +- Bug Fix: bladeburner.getCurrentAction() should now properly an 'Idle' object rather than null (by Kline-) +- Bug Fix: Bladeburner skill cost multiplier should now properly increase in BitNode-12 (by hydroflame) +- Bug Fix: 'document', 'hacknet', and 'window' keywords should no longer be counted multiple times in RAM calculations +- Bug Fix: Joining factions through Singularity functions should now prevent you from joining opposing factions +- Bug Fix: Four Sigma should no longer have two 'Speech Enhancement' Augmentations (by Kline-) + +## v0.40.1 - 8/5/2018 - Community Update + +- Added getPurchasedServerCost() Netscript function (by kopelli) +- Added getFavorToDonate() Netscript function (by hydroflame) +- Added getFactionFavorGain() and getCompanyFavorGain() Singularity functions (by hydroflame) +- Accumulated 'bonus' time in Bladeburner is now displayed in the UI (by hydroflame) +- The Red Pill can now be purchased with negative money (since its supposed to be free) (by hydroflame) +- Cranial Signal Processor Augmentations now have the previous generation as a prerequisite. i.e. Cranial Signal Processor - Gen II requires Gen I (by Kline-) +- Terminal now supports semicolon usage (end of command). This allows chaining multiple Terminal commands (by hydroflame) +- Bladeburner Raid operations can no longer be performed if your estimate of Synthoid communities is zero (by hydroflame) +- The difficulty of BN-12 now scales faster (by hydroflame) +- Active Scripts UI now shows a RAM Usage bar for each server (by kopelli) +- Bug Fix: Corrected terminal timestamp format (by kopelli) +- Bug Fix: NetscriptJS scripts should now die properly if they don't have a 'main' function (by hydroflame) +- Bug Fix: write(), read(), and tryWrite() Netscript functions should now work properly for writing Arrays/objects to Netscript Ports +- Various minor UI/QOL fixes by hydroflame, kopelli, and Kline- + +## v0.40.0 - 7/28/2018 + +- **WARNING: This update makes some significant changes to Netscript and therefore you may need to make some changes to your scripts. See** `this post `\_ **this post for details** +- Netscript 1.0 (NS1) now uses a fully-fledged ES5 JavaScript Interpreter. This means many new features are now available in NS1, and this also fixes several bugs. + However this also means any ES6+ features are no longer supported in NS1 +- When a server is hacked with a very large number of threads and left with no money, the server's security level + now only increases by however many threads were needed to drain the server. For example, if you hack a server with + 5000 threads but it only needed 2000 threads to deplete the server's money, then the server's security will only increase + as if you had hacked it with 2000 threads (change by hydroflame) +- Added getCurrentAction() to Bladeburner API +- Added a variety of functions to Bladeburner API that deal with action levels (change by hydroflame) +- Added getPurchasedServerLimit() and getPurchasedServerMaxRam() functions to Netscript (change by hydroflame & kopelli) +- Added getOwnedSourceFiles() Singularity function (by hydroflame) +- Completely re-designed the Hacknet Node API +- getSkillLevel() in Bladeburner API now returns an error if no argument is passed in (as opposed to an object with all skill levels). This may break scripts +- Minimum Netscript execution time reduced from 15ms to 10ms (configurable in Options) +- Company reputation needed to get invited to Megacorporation factions decreased from 250k to 200k +- HP is now reset (restored) when Augmenting +- Source-File 6 now increases both the level and experience gain of all combat stats (it was only experience gain previously) +- Reverted a previous change for Source-File 12. It's benefits are now multiplicative rather than additive +- Starting Infiltration security level for almost every location decreased by ~10% +- Changed 'fl1ght.exe' message when its listed conditions are fulfilled (by hydroflame) +- The 'Save Game' button in the top-right overview panel now flashes red if autosave is disabled +- Bug Fix: Infiltration buttons can no longer be clicked through NetscriptJS +- Bug Fix: Bladeburner 'Overclock' skill can no longer be leveled above max level through the API (by hydroflame) +- Bug Fix: Healthcare division in Bladeburner should no longer cause game to crash + +## v0.39.1 - 7/4/2018 + +- Bladeburner Rank gain in BN-7 is now reduced by 40% instead of 50% +- Quadrupled the amount of money gained from Bladeburner contracts +- Added joinBladeburnerDivision() Netscript function to Bladeburner API +- Doubled the effects of Source-File 5. Now gives 8%, 12%, and 14% increase to all hacking multipliers at levels 1, 2, and 3, respectively (increased from 4%/6%, 7%) +- Increased the effect of Source-File 8. It now gives a 12%, 18% and 21% to your hacking growth multiplier at levels 1, 2, and 3, respectively (increased from 8%, 12%, 14%) +- The effect of Source-File 12 is now additive with itself, rather than multiplicative. This means that level N of Source-File 12 now increases all multipliers by N% +- The setting to suppress the confirmation box when purchasing Augmentations was moved into the main Options menu (by Github user hydroflame) +- Bug Fix: Crime Success rates were being calculated incorrectly (by Github user hydroflame) +- When an Infiltration is finished, you will now return back to the company's page, rather than the city +- Infiltration faction reputation selector now remembers your last choice +- Significantly increased the amount of money gained from Infiltration +- Bug Fix: Copying a NetscriptJS script to another server using scp now properly takes into account the script's changes. +- Bug Fix: Fixed an issue where game would not load in Edge due to incompatible features +- travelToCity() Singularity function no longer grants Intelligence exp" + +## v0.39.0 - 6/25/2018 + +- Added BitNode-7: Bladeburner 2079 +- Infiltration base difficulty decreased by 10% for most locations +- Experience gains from Infiltration slightly increased +- Money gained from Infiltration increased by 20% +- Added 'var' declarations in Netscript 1.0 (only works with 'var', not 'let' or 'const') +- Script base RAM cost is now 1.6 GB (increased from 1.4 GB) +- While/for loops and if statements no longer cost RAM in scripts +- Made short-circuit evaluation logic more consistent in Netscript 1.0 (see https://github.com/danielyxie/bitburner/issues/308) +- Changelog button in the Options menu now links to the new Changelog URL (by Github user thePalindrome) +- Skill level calculation is now 'smoother' (by Github user hydroflame) +- Added a button to 'beautify' scripts in the text editor (by Github user hydroflame) +- Added favicon (by Github user kopelli) + +## v0.38.1 - 6/15/2018 + +- Bug Fix: Using 'Object.prototype' functions like toLocaleString() or toString() should no longer cause errors in NetscriptJS +- Implemented by Github user hydroflame: + - Accessing the 'window' and 'document' objects in Netscript JS now requires a large amount of RAM (100 GB) + - Added game option to suppress travel confirmation + - Text on buttons can no longer be highlighted + - Bug Fix: Fixed an issue that caused NaN values when exporting Real Estate in Corporations + - Bug Fix: Competition and Demand displays in Corporation are now correct (were reversed before) + - Added ps() Netscript function + - Bug Fix: grow() should no longer return/log a negative value when it runs on a server that's already at max money + - Bug Fix: serverExists() Netscript function should now properly return false for non-existent hostname/ips + - Bug Fix: Sever's security level should now properly increase when its money is grown to max value + +## v0.38.0 - 6/12/2018 + +- New BitNode: BN-12 The Recursion - Implemented by Github user hydroflame +- Bladeburner Changes: + - Bladeburner progress is no longer reset when installing Augmentations + - The number of successess needed to increase a Contract/Operation's max level now scales with the current max level (gradually gets harder) + - All Bladeburner Augmentations are now slightly more expensive and require more reputation + - Black Operations now give higher rank rewards + - Doubled the base amount of money gained from Contracts + - Increased the amount of experience gained from Contracts/Actions + - Added a new Augmentation: The Blade's Simulacrum + - Bladeburner faction reputation gain is now properly affected by favor +- Hacking is now slightly less profitable in BitNode-3 +- Updated Hacknet Nodes UI - Implemented by Github user kopelli +- Bug Fix: Fixed an exploit that allowed calling any Netscript function without incurring any RAM Cost in NetscriptJS + +## v0.37.2 - 6/2/2018 + +- After joining the Bladeburners division, there is now a button to go to the Bladeburner content + in the 'City' page +- You now start with $250m in BitNode-8 (increased from $100m) +- Bug Fix: You can now no longer directly edit Hacknet Node values through NetscriptJS (hopefully) +- Bug Fix: Bladeburners is no longer accessible in BN-8 +- Bug Fix: getBitNodeMultipliers() Netscript function now returns a copy rather than the original object + +## v0.37.1 - 5/22/2018 + +- You now earn money from successfully completing Bladeburner contracts. The amount you earn is based + on the difficulty of the contract. +- Completing Field Analysis in Bladeburner now grants 0.1 rank +- The maximum RAM you can get on a purchased server is now 1,048,576 GB (2^20) +- Bug Fix: Fixed Netscript syntax highlighting issues with the new NetscriptJS +- Bug Fix: Netscript Functions now properly incur RAM costs in NetscriptJS +- Bug Fix: deleteServer() now fails if its called on the server you are currently connected to +- Removed in-game Netscript documentation, since it was outdated and difficult to maintain. +- Bug Fix: Updated the gymWorkout() Singularity function with the new exp/cost values for gyms + +## v0.37.0 - 5/20/2018 + +- NetscriptJS (Netscript 2.0) released (Documentation here: http://bitburner.readthedocs.io/en/latest/netscriptjs.html) +- Running the game with the '?noScripts' query will start the game without loading any of your scripts. This should be used if you accidentally write a script that crashes your game + +## v0.36.1 - 5/11/2018 + +- Bladeburner Changes: + - Bug Fix: You can no longer get Bladeburner faction reputation through Infiltration + - Initial difficulty of Tracking contracts reduced + - Datamancer skill effect increased from 4% per level to 5% + - Slightly decreased the base stamina cost of contracts/operations + - Slightly increased the effects of the Tracer, Digital Observer, Short Circuit, Cloak, and Blade's Intuition skills + - Overclock skill capped at level 95, rather than 99 + - Training gives significantly more exp/s +- Crime, Infiltration, and Hacking are now slightly more profitable in BN-6 +- Gyms are now more expensive, but give slightly more exp +- Added getScriptName() and getHacknetMultipliers() Netscript functions (added by Github user hydroflame) +- getScriptRam() Netscript function now has default value for the second argument, which is hostname/ip (implemented by Github user hydroflame) +- There is now a soft-cap on stock price, which means it's no longer possible for the price of a stock to reach insanely-high values +- The ctrl+b hotkey in the text editor should now also be triggered by command+b on OSX (I don't have OSX so I can't confirm if this works) +- Many servers now have additional RAM +- Added an option to disable hotkeys/keyboard shortcuts +- Refactored 'Active Scripts' UI page to optimize its performance +- Added a new .fconf Terminal setting: ENABLE_TIMESTAMP +- 'Netscript Execution Time', which can be found in the Options, now has a minimum value of 15ms rather than 25ms +- Bug Fix: Fixed a typo in the Fulcrum Technologies company name (Technolgies -> Technologies) +- Bug Fix: hacknetnodes keyword should no longer incur RAM cost if its in a comment +- Bug Fix: disableLog() now works for the commitCrime() Netscript function (fixed by Github user hydroflame) + +## v0.36.0 - 5/2/2018 + +- Added BN-6: Bladeburners +- Rebalanced many combat Augmentations so that they are slightly less powerful +- Bug Fix: When faction invites are suppressed, an invitation will no longer load the Faction page + +## v0.35.2 - 3/26/2018 + +- Corporation Changes: + - Fixed an issue with Warehouse upgrade cost. Should now be significantly cheaper than before. + - Scientific Research now has a slightly more significant effect on Product quality + - The Energy and Water Utilities industries are now slightly more profitable + - The Robotics and Computer Hardware industries are now less profitable + - The Software industry is slightly less profitable + - When selling Materials and Products, the 'PROD' qualifier can now be used to set dynamic sell amounts based on your production + - Exporting MAX should now work properly + - You can no longer export past storage limits + - Scientific Research production reduced + - Effects of AdVert. Inc upgrade were reduced, but the effect that popularity and awareness have on sales was increased to compensate (popularity/awareness numbers were getting too big with Advert. Inc) + - Bug Fix: Products from Computer Hardware division should now properly have ratings +- Improved Augmentation UI/UX. Now contains collapsible headers and sort buttons +- Improved Faction Augmentations display UI/UX. Now contains sort buttons. There is also an option to disable confirmation when purchasing Augmentations + +## v0.35.1 - 3/12/2018 + +- You can now easily download all of your scripts/text files as zip folders. Use the 'help download' Terminal command for details +- Scripts are now downloaded with the .script.js extension at the end of their filename +- Corporation Management Changes: + - Implemented Smart Supply unlock + - Changed the way a division's Production Multiplier is calculated. It is now the sum of the individual Production Multiplier for every city. Therefore, it is now beneficial to open offices in different cities + - Several small UI/UX improvements + - Numerous balance changes. The significant ones are listed below. + - Product descriptions will now display their estimated market price + - The sale price of Products can no longer be marked up as high as before + - Scientific Research now affects the rating of Products + - In general, the maximum amount of product you are able to sell is reduced + - Sale bonus from advertising (popularity/awareness) now has diminishing returns rather than scaling linearly +- Experience gained during Infiltration now scales linearly based on the clearance level you reach. Compared to before, the experience gained will be much less at lower clearance levels, but much more at higher clearance levels +- The editor can now be used to edit both scripts and text files +- New Terminal config file that can be edited using the command 'nano .fconf'. Right now there is only one option, but there will be more in the future. +- You can now enable Bash-style Terminal hotkeys using the .fconf file referenced above +- Bug Fix: Fixed an issue with the UI elements of Gang Management persisting across different instances of BitNode-2 + +## v0.35.0 - 3/3/2018 + +- Minor rebalancing of BitNodes due to the fact that Corporations provide a (relatively) new method of progressing +- Corporation Management Changes: + - Once your Corporation gets big/powerful enough, you can now bribe Factions for reputation using company funds an/or stock shares + - You can now only create one Division for every Industry type + - Added several new UI/UX elements + - Wilson Analytics multiplier was significantly reduced to 1% per level (additive). + - Reduced the effect of Advert Inc upgrade. Advert Inc. upgrade price increases faster + - Materials can now be marked up at higher prices +- Added Javascript's built-in Number object to Netscript +- Added getCharacterInformation(), getCompanyFavor(), and getFactionFavor() Netscript Singularity functions +- Rebalanced Singularity Function RAM Costs. They now cost x8 as much when outside of BN-4 (rather than x10). Also, many of the functions now use significantly less RAM +- Refactored Netscript Ports. You can now get a handle for a Netscript port using the getPortHandle() Netscript function. This allows you to access a port's underlying queue (which is just an array) and also makes several new functions available such as tryWrite(), full(), and empty(). +- Number of Netscript Ports increased from 10 to 20 +- Netscript assignments should now return proper values. i.e. i = 5 should return 5. +- Added throw statements to Netscript. It's not super useful since 'catch' isn't implemented, but it can be used to generate custom runtime error messages. +- Added import declaration to Netscript. With this, you are able to import functions (and only functions) from other files. Using export declarations is not necessary +- Most Netscript Runtime errors (the ones that cause your script to crash) should now include the line number where the error occured +- When working for a company, your current company reputation is now displayed +- Whenever you get a Faction Invite it will be immediately appended to your 'invited factions' list. Therefore the checkFactionInvitations() Singularity Function should now be properly useable since you no longer need to decline a Faction Invitation before it shows up in the result. +- Bug Fix: When purchasing servers, whitespace should now automatically be removed from the hostname +- Bug Fix: Can no longer have whitespace in the filename of text files created using write() +- Bug Fix: In Netscript, you can no longer assign a Hacknet Node handle (hacknetnodes[i]) to another value +- Bug Fix: If you are in the Factions tab when you accept an invitation from a Faction, the page will now properly 'refresh' +- Bug Fix: Scripts that run recursive functions should now be killed properly + +## v0.34.5 - 2/24/2018 + +- Corporation Management Changes: + - Market Research unlocks are now cheaper + - New 'VeChain' upgrade: displays useful statistics about Corporation + - Corporation cycles are processed 25% faster + - Corporation valuation was lowered by ~10% (this affects stock price and investments) + - Rebalanced the effects of advertising. Should now be more effective for every Industry + - Fixed several bugs/exploits involving selling and buying back stock shares + - You will now receive a Corporation Handbook (.lit file) when starting out BitNode-3. It contains a brief guide to help you get started. This same handbook can be viewed from the Corporation management screen + - Slightly decreased the amount by which a Product's sell price can be marked up + - Employees can now be assigned to a 'Training' task, during which they will slowly increase several of their stats +- Hopefully fixed an exploit with Array.forEach(). If there are any issues with using forEach, let me know +- Arguments passed into a script are now passed by value. This means modifying the 'args' array in a script should no longer cause issues +- Scripts executed programatically (via run(), exec(), etc.) will now fail if null/undefined is passed in as an argument +- Added peek() Netscript function +- killall() Netscript function now returns true if any scripts were killed, and false otherwise. +- hack() Netscript function now returns the amount of money gained for successful hacks, and 0 for failed hacks +- scp Terminal command and Netscript function now work for txt files +- Changes courtesy of Wraithan: + - Text files are now displayed using 'pre' rather than 'p' elements when using the 'cat' Terminal command. This means tabs are retained and lines don't automatically wrap + - ls() Netscript function now returns text files as well +- Removed round() Netscript function, since you can just use Math.round() instead +- Added disableLog() and enableLog() Netscript functions +- Removed the 'log' argument from sleep(), since you can now use the new disableLog function +- 'Netscript Documentation' button on script editor now points to new readthedocs documentation rather than wiki +- When working for a faction, your current faction reputation is now displayed +- Bug Fix: Hacking Missions should no longer break when dragging an existing connection to another Node +- Bug Fix: Fixed RAM usage of getNextHacknetNodeCost() (is not 1.5GB instead of 4GB) + +## v0.34.4 - 2/14/2018 + +- Added several new features to Gang UI to make it easier to manage your Gang. +- Changed the Gang Member upgrade mechanic. Now, rather than only being able to have one weapon/armor/vehicle/etc., you can purchase all the upgrades for each Gang member and their multipliers will stack. To balance this out, the effects (AKA multipliers) of each Gang member upgrade were reduced. +- Added a new script editor option: Max Error Count. This affects how many approximate lines the script editor will process (JSHint) for common errors. Increasing this option can affect negatively affect performance +- Game theme colors (set using 'theme' Terminal command) are now saved when re-opening the game +- 'download' Terminal command now works on scripts +- Added stopAction() Singularity function and the spawn() Netscript function +- The 'Purchase Augmentations' UI screen will now tell you if you need a certain prerequisite for Augmentations. +- Augmentations with prerequisites can now be purchased as long as their prerequisites are puchased (before, you had to actually install the prerequisites before being able to purchase) + +## v0.34.3 - 1/31/2018 + +- Minor balance changes to Corporations: + - Upgrades are generally cheaper and/or have more powerful effects. + - You will receive more funding while your are a private company. + - Product demand decreases at a slower rate. + - Production multiplier for Industries (receives for owning real estate/hardware/robots/etc.) is slightly higher +- Accessing the hacknetnodes array in Netscript now costs 4.0GB of RAM (only counts against RAM usage once) +- Bug Fix: Corporation oustanding shares should now be numeric rather than a string +- Bug Fix: Corporation production now properly calculated for industries that dont produce materials. +- Bug Fix: Gangs should now properly reset when switching BitNodes +- Bug Fix: Corporation UI should now properly reset when you go public + +## v0.34.2 - 1/27/2018 + +- Corporation Management Changes: + - Added advertising mechanics + - Added Industry-specific purchases + - Re-designed employee management UI + - Rebalancing: Made many upgrades/purchases cheaper. Receive more money from investors in early stage. Company valuation is higher after going public + - Multiple bug fixes +- Added rm() Netscript function +- Updated the way script RAM usage is calculated. Now, a function only increases RAM usage the first time it is called. i.e. even if you call hack() multiple times in a script, it only counts against RAM usage once. The same change applies for while/for loops and if conditionals. +- The RAM cost of the following were increased: + - If statements: increased by 0.05GB + - run() and exec(): increased by 0.2GB + - scp(): increased by 0.1GB + - purchaseServer(): increased by 0.25GB +- Note: You may need to re-save all of your scripts in order to re-calculate their RAM usages. Otherwise, it should automatically be re-calculated when you reset/prestige +- The cost to upgrade your home computer's RAM has been increased (both the base cost and the exponential upgrade multiplier) +- The cost of purchasing a server was increased by 10% (it is now $55k per RAM) +- Bug fix: (Hopefully) removed an exploit where you could avoid RAM usage for Netscript function calls by assigning functions to a variable (foo = hack(); foo('helios');) +- Bug fix: (Hopefully) removed an exploit where you could run arbitrary Javascript code using the constructor() method +- Thanks to Github user mateon1 and Reddit users havoc_mayhem and spaceglace for notifying me of the above exploits +- The fileExists() Netscript function now works on text files (.txt). Thanks to Github user devoidfury for this + +## v0.34.1 - 1/19/2018 + +- Updates to Corporation Management: + - Added a number of upgrades to various aspects of your Corporation + - Rebalanced the properties of Materials and the formula for determining the valuation of the Corporation + - Fixed a number of bugs +- 'Stats' page now shows information about current BitNode +- You should now be able to create Corporations in other BitNodes if you have Source-File 3 +- Added a new create-able program called b1t_flum3.exe. This program can be used to reset and switch BitNodes +- Added an option to adjust autosave interval +- Line feeds, newlines, and tabs will now work with the tprint() Netscript function +- Bug fix: 'check' Terminal command was broken +- Bug fix: 'theme' Terminal command was broken when manually specifying hex codes +- Bug fix: Incorrect promotion requirement for 'Business'-type jobs +- Bug fix: Settings input bars were incorrectly formatted when loading game + +## v0.34.0 - 12/6/2017 + +- Added clear() and exit() Netscript functions +- When starting out or prestiging, you will now receive a 'Hacking Starter Guide'. It provides tips/pointers for new players +- Doubled the amount of RAM on low-level servers (up to required hacking level 150) +- Slightly increased experience gain from Infiltration +- buyStock(), sellStock(), shortStock(), and sellShort() Netscript function now return the stock price at which the transaction occurred, rather than a boolean. If the function fails for some reason, 0 will be returned. +- Hacking Mission Changes: + - You can now select multiple Nodes of the same type by double clicking. This allows you to set the action of all of selected nodes at once (e.g. set all Transfer Nodes to Fortify). Creating connections does not work with this multi-select functionality yet + - Shield and Firewall Nodes can now fortify + - The effects of Fortifying are now ~5% lower + - Conquering a Spam Node now increases your time limit by 25 seconds instead of 15 + - Damage dealt by Attacking was slightly reduced + - The effect of Scanning was slightly reduced + - Enemy CPU Core Nodes start with slightly more attack. Misc Nodes start with slightly less defense +- Corporation Management changes: + - Added several upgrades that unlock new features + - Implemented Exporting mechanic + - Fixed many bugs + +## v0.33.0 - 12/1/2017 + +- Added BitNode-3: Corporatocracy. In this BitNode you can start and manage your own corporation. This feature is incomplete. Much more will be added to it in the near future +- Minor bug fixes + +## v0.32.1 - 11/2/2017 + +- Updated Netscript's 'interpreter/engine' to use the Bluebird promise library instead of native promises. It should now be faster and more memory-efficient. If this has broken any Netscript features please report it through Github or the subreddit (reddit.com/r/bitburner) +- Rebalanced stock market (adjusted parameters such as the volatility/trends/starting price of certain stocks) +- Added prompt() Netscript function +- Added 'Buy Max' and 'Sell All' functions to Stock Market UI +- Added 'Portfolio' Mode to Stock Market UI so you can only view stocks you have a position/order in +- Added a button to kill a script from its log display box + +## v0.32.0 - 10/25/2017 + +- Added BitNode-8: Ghost of Wall Street +- Re-designed Stock Market UI +- Minor bug fixes + +## v0.31.0 - 10/15/2017 + +- Game now saves to IndexedDb (if your browser supports it). This means you should no longer have trouble saving the game when your save file gets too big (from running too many scripts). The game will still be saved to localStorage as well +- New file type: text files (.txt). You can read or write to text files using the read()/write() Netscript commands. You can view text files in Terminal using 'cat'. Eventually I will make it so you can edit them in the editor but that's not available yet. You can also download files to your real computer using the 'download' Terminal command +- Added a new Crime: Bond Forgery. This crime takes 5 minutes to attempt and gives $4,500,000 if successful. It is meant for mid game. +- Added commitCrime(), getCrimeChance(), isBusy(), and getStats() Singularity Functions. +- Removed getIntelligence() Netscript function +- Added sprintf and vsprintf to Netscript. See [https://github.com/alexei/sprintf.js this Github page for details] +- Increased the amount of money gained from Infiltration by 20%, and the amount of faction reputation by 12% +- Rebalanced BitNode-2 so that Crime and Infiltration are more profitable but hacking is less profitable. Infiltration also gives more faction rep +- Rebalanced BitNode-4 so that hacking is slightly less profitable +- Rebalanced BitNode-5 so that Infiltration is more profitable and gives more faction rep +- Rebalanced BitNode-11 so that Crime and Infiltration are more profitable. Infiltration also gives more faction rep. +- Fixed an annoying issue in Hacking Missions where sometimes you would click a Node but it wouldnt actually get selected +- Made the Hacking Mission gameplay a bit slower by lowering the effect of Scan and reducing Attack damage +- Slightly increased the base reputation gain rate for factions when doing Field Work and Security Work + +## v0.30.0 - 10/9/2017 + +- Added getAugmentations() and getAugmentationsFromFaction() Netscript Singularity Functions +- Increased the rate of Intelligence exp gain +- Added a new upgrade for home computers: CPU Cores. Each CPU core on the home computer grants an additional starting Core Node in Hacking Missions. I may add in other benefits later. Like RAM upgrades, upgrading the CPU Core on your home computer persists until you enter a new BitNode. +- Added lscpu Terminal command to check number of CPU Cores +- Changed the effect of Source-File 11 and made BitNode-11 a little bit harder +- Fixed a bug with Netscript functions (the ones you create yourself) +- Hacking Missions officially released (they give reputation now). Notable changes in the last few updates: + - Misc Nodes slowly gain hp/defense over time + - Conquering a Misc Node will increase the defense of all remaining Misc Nodes that are not being targeted by a certain percentage + - Reputation reward for winning a Mission is now affected by faction favor and Player's faction rep multiplier + - Whenever a Node is conquered, its stats are reduced + +## v0.29.3 - 10/3/2017 + +- Fixed bug for killing scripts and showing error messages when there are errors in a player-defined function +- Added function name autocompletion in Script Editor. Press Ctrl+space on a prefix to show autocompletion options. +- Minor rebalancing and bug fixes for Infiltration and Hacking Missions + +## v0.29.2 - 10/1/2017 + +- installAugmentations() Singularity Function now takes a callback script as an argument. This is a script that gets ran automatically after Augmentations are installed. The script is run with no arguments and only a single thread, and must be found on your home computer. +- Added the ability to create your own functions in Netscript. See [[Netscript Functions|this link]] for details +- Added :q, :x, and :wq Vim Ex Commands when using the Vim script editor keybindings. :w, :x, and :wq will all save the script and return to Terminal. :q will quit (return to Terminal) WITHOUT saving. If anyone thinks theres an issue with this please let me know, I don't use Vim +- Added a new Augmentation: ADR-V2 Pheromone Gene +- In Hacking Missions, enemy nodes will now automatically target Nodes and perform actions. +- Re-balanced Hacking Missions through minor tweaking of many numbers +- The faction reputation reward for Hacking Missions was slightly increased + +## v0.29.1 - 9/27/2017 + +- New gameplay feature that is currently in BETA: Hacking Missions. Hacking Missions is an active gameplay mechanic (its a minigame) that is meant to be used to earn faction reputation. However, since this is currently in beta, hacking missions will NOT grant reputation for the time being, since the feature likely has many bugs, balance problems, and other issues. If you have any feedback regarding the new feature, feel free to let me know +- CHANGED THE RETURN VALUE OF getScriptIncome() WHEN RAN WITH NO ARGUMENTS. It will now return an array of two values rather than a single value. This may break your scripts, so make sure to update them! +- Added continue statement for for/while loops +- Added getServerMinSecurityLevel(), getPurchasedServers(), and getTimeSinceLastAug() Netscript functions +- Netscript scp() function can now take an array as the first argument, and will try to copy every file specified in the array (it will just call scp() normally for every element in the array). If an array is passed in, then the scp() function returns true if at least one element from the array is successfully copied +- Added Javascript's Date module to Netscript. Since 'new' is not supported in Netscript yet, only the Date module's static methods will work (now(), UTC(), parse(), etc.). +- Failing a crime now gives half the experience it did before +- The forced repeated 'Find The-Cave' message after installing The Red Pill Augmentation now only happens if you've never destroyed a BitNode before, and will only popup every 15 minutes. If you have already destroyed a BitNode, the message will not pop up if you have messages suppressed (if you don't have messages suppressed it WILL still repeatedly popup) +- fileExists() function now works on literature files + +## v0.29.0 - 9/19/2017 + +- Added BitNode-5: Artificial Intelligence +- Added getIp(), getIntelligence(), getHackingMultipliers(), and getBitNodeMultipliers() Netscript functions (requires Source-File 5) +- Updated scan() Netscript function so that you can choose to have it print IPs rather than hostnames +- Refactored scp() Netscript function so that it takes an optional 'source server' argument +- For Infiltration, decreased the percentage by which the security level increases by about 10% for every location +- Using :w in the script editor's Vim keybinding mode should now save and quit to Terminal +- Some minor optimizations that should reduce the size of the save file +- scan-analyze Terminal command will no longer show your purchased servers, unless you pass a '-a' flag into the command +- After installing the Red Pill augmentation from Daedalus, the message telling you to find 'The-Cave' will now repeatedly pop up regardless of whether or not you have messages suppressed +- Various bugfixes + +## v0.28.6 - 9/15/2017 + +- Time required to create programs now scales better with hacking level, and should generally be much faster +- Added serverExists(hostname/ip) and getScriptExpGain(scriptname, ip, args...) Netscript functions +- Short circuiting && and || logical operators should now work +- Assigning to multidimensional arrays should now work +- Scripts will no longer wait for hack/grow/weaken functions to finish if they are killed. They will die immediately +- The script loop that checks whether any scripts need to be started/stopped now runs every 6 seconds rather than 10 (resulting in less delays when stopping/starting scripts) +- Fixed several bugs/exploits +- Added some description for BitNode-5 (not implemented yet, should be soon though) + +## v0.28.5 - 9/13/2017 + +- The fl1ght.exe program that is received from jump3r is now sent very early on in the game, rather than at hacking level 1000 +- Hostname is now displayed in Terminal +- Syntax highlighting now works for all Netscript functions +- Export should now work on Edge/IE + +## v0.28.4 - 9/11/2017 + +- Added getScriptIncome() Netscript function +- Added Javascript's math module to Netscript. See [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math this link for details] +- Added several member variables for the Hacknet Node API that allow you to access info about their income +- All valid Netscript functions are now syntax highlighted as keywords in the editor. This means they will a different color than invalid netscript functions. The color will depend on your theme. Note that right now, this only applies for normal Netscript functions, not functions in the TIX API, Hacknet Node API, or Singularity Functions. +- Comments and operators no longer count towards RAM usage in scripts. +- Variety of bug fixes and updates to informational text in the game + +## v0.28.3 - 9/7/2017 + +- Added ls() Netscript function +- Increased company wages by about ~10% across the board +- The scp() Netsction function and Terminal command now works for .lit files +- Increased the amount of RAM on many lower level servers (up to level 200 hacking level required). + +## v0.28.2 - 9/4/2017 + +- Added several configuration options for script editor (key bindings, themes, etc.) +- Certain menu options will now be hidden until their relevant gameplay is unlocked. This includes the Factions, Augmentations, Create Program, Travel, and Job tabs. This will only affect newer players. +- Most unrecognize or un-implemented syntax errors in Netscript will now include the line number in the error message + +## v0.28.1 - 9/1/2017 + +- The script editor now uses the open-source Ace editor, which provides a much better experience when coding! +- Added tprint() Netscript function + +## v0.28.0 - 8/30/2017 + +- Added BitNode-4: The Singularity +- Added BitNode-11: The Big Crash +- Migrated the codebase to use webpack (doesn't affect any in game content, except maybe some slight performance improvements and there may be bugs that result from dependency errors + +## v0.27.3 - 8/19/2017 + +- You can now purchase upgrades for Gang Members (BitNode 2 only) +- Decreased Gang respect gains and slightly increased wanted gains (BitNode 2 only) +- Other gangs will increase in power faster (BitNode 2 only) +- Added getHackTime(), getGrowTime(), and getWeakenTime() Netscript functions + +## v0.27.2 - 8/18/2017 + +- Added getServerGrowth() Netscript function +- Added getNextHacknetNodeCost() Netscript function +- Added new 'literature' files (.lit extension) that are used to build lore for the game. These .lit files can be found in certain servers throughout the game. They can be viewed with the 'cat' Terminal command and copied over to other servers using the 'scp' command. These .lit files won't be found until you reset by installing Augmentations +- Fixed some bugs with Gang Territory(BitNode 2 only) + +## v0.27.1 - 8/15/2017 + +- Changed the way Gang power was calculated to make it scale better late game (BitNode 2 only) +- Lowered the respect gain rate in Gangs (Bitnode 2 only) +- Added '| grep pattern' option for ls Terminal command. This allows you to only list files that contain a certain pattern +- Added break statement in Netscript +- Display for some numerical values is now done in shorthand (e.g 1.000m instead of 1,000,000) + +## v0.27.0 - 8/13/2017 + +- Added secondary 'prestige' system - featuring Source Files and BitNodes +- MILD SPOILERS HERE: Installing 'The Red Pill' Augmentation from Daedalus will unlock a special server called w0r1d_d43m0n. Finding and manually hacking this server through Terminal will destroy the Player's current BitNode, and allow the player to enter a new one. When destroying a BitNode, the player loses everything except the scripts on his/her home computer. The player will then gain a powerful second-tier persistent upgrade called a Source File. The player can then enter a new BitNode to start the game over. Each BitNode has different characteristics, and many will have new content/mechanics as well. Right now there are only 2 BitNodes. Each BitNode grants its own unique Source File. Restarting and destroying a BitNode you already have a Source File for will upgrade your Source File up to a maximum level of 3. + +- Reputation gain with factions and companies is no longer a linear conversion, but an exponential one. It will be much easier to gain faction favor at first, but much harder later on. +- Significantly increased Infiltration exp gains +- Fixed a bug with company job requirement tooltips +- Added scriptRunning(), scriptKill(), and getScriptRam() Netscript functions. See documentation for details +- Fixed a bug with deleteServer() Netscript function + +## v0.26.4 - 8/1/2017 + +- All of the 'low-level servers' in early game that have a required hacking level now have 8GB of RAM instead of 4GB +- Increased the amount of experience given at university +- Slightly increased the production of Hacknet Nodes and made them cheaper to upgrade +- Infiltration now gives slightly more EXP and faction reputation +- Added two new crimes. These crimes are viable to attempt early on in the game and are relatively passive (each take 60+ seconds to complete) +- Crimes give more exp and more money +- Max money available on a server decreased from 50x the server's starting money to 25x +- Significantly increased wages for all jobs + +## v0.26.3 + +- Added support for large numbers using Decimal.js. Right now it only applies for the player's money +- Purchasing servers with the Netscript function purchaseServer() is no longer 2x as expensive as doing manually it now costs the same +- Early game servers have more starting money + +## v0.26.2 + +- Major rebalancing and randomization of the amount of money that servers start with +- Significantly lowered hacking exp gain from hacking servers. The exp gain for higher-level servers was lowered more than that of low level servers. (~16% for lower level servers, up to ~25% for higher-level servers) +- Added deleteServer() Netscript function +- You can now purchase a maximum of 25 servers each run (Deleting a server will allow you to purchase a new one) +- Added autocompletion for './' Terminal command +- Darkweb prices now displayed properly using toLocaleString() +- Added NOT operator (!) and negation operator(-) in Netscript, so negative numbers should be functional now +- Rejected faction invitations will now show up as 'Outstanding Faction Invites' in the Factions page. These can be accepted at any point in the future +- Added a few more configurable game settings for suppressing messages and faction invitations +- Added tooltips for company job requirements + +## v0.26.1 + +- Added autocompletion for aliases +- Added getServerRam() Netscript function() +- Added getLevelUpgradeCost(n), getRamUpgradeCost(), getCoreUpgradeCost() functions for Netscript Hacknet Node API +- Added some configurable settings (See Game Options menu) + +## v0.26.0 + +- Game now has a real ending, although it's not very interesting/satisfying right now. It sets up the framework for the secondary prestige system in the future +- Forgot to mention that since last update, comments now work in Netscript. Use // for single line comments or /\* and \*/ for multiline comments just like in Javascript +- Added ports to Netscript. These ports are essentially serialized queues. You can use the write() Netscript function to write a value to a queue, and then you can use the read() Netscript function to read the value from the queue. Once you read a value from the queue it will be removed. There are only 10 queues (1-10), and each has a maximum capacity of 50 entries. If you try to write to a queue that is full, the the first value is removed. See wiki/Netscript documentation for more details +- You can now use the 'help' Terminal command for specific commands +- You can now use './' to run a script/program (./NUKE.exe). However, tab completion currently doesn't work for it (I'm working on it) +- Decreased the base growth rate of servers by ~25% +- Both the effect of weaken() and its time to execute were halved. In other words, calling weaken() on a server only lowers its security by 0.05 (was 0.1 before) but the time to execute the function is half of what it was before. Therefore, the effective rate of weaken() should be about the same +- Increased all Infiltration rewards by ~10%, and increased infiltration rep gains by an additional 20% (~32% total for rep gains) +- The rate at which the security level of a facility increases during Infiltration was decreased significantly (~33%) +- Getting treated at the Hospital is now 33% more expensive +- Slightly increased the amount of time it takes to hack a server +- Slightly decreased the amount of money gained when hacking a server (~6%) +- Slightly decreased the base cost for RAM on home computer, but increased the cost multiplier. This means that upgrading RAM on the home computer should be slightly cheaper at the start, but slightly more expensive later on +- Increased the required hacking level for many late game servers +- The sleep() Netscript function now takes an optional 'log' argument that specifies whether or not the 'Sleeping for N milliseconds' will be logged for the script +- Added clearLog() Netscript function +- Deleted a few stocks. Didn't see a reason for having so many, and it just affects performance. Won't take effect until you reset by installing Augmentations +- There was a typo with Zeus Medical's server hostname. It is now 'zeus-med' rather than 'zeud-med' +- Added keyboard shortcuts to quickly navigate between different menus. See wiki link (http://bitburner.wikia.com/wiki/Shortcuts) +- Changed the Navigation Menu UI + +## v0.25.0 + +- Refactored Netscript to use the open-source Acorns Parser. This re-implementation was done by [https://github.com/MrNuggelz Github user MrNuggelz]. This has resulted in several changes in the Netscript language. Some scripts might break because of these changes. Changes listed below: +- Arrays are now fully functional Javascript arrays. You no longer need to use the 'Array' keyword to declare them. +- The length(), clear/clear(), insert(), and remove() functions no longer work for arrays. +- All Javascript array methods are available (splice(), push(), pop(), join(), shift(), indexOf(), etc. See documentation) +- Variables assigned to arrays are now passed by value rather than reference + +- Incrementing/Decrementing are now available (i++, ++i) + +- You no longer need semicolons at the end of block statements + +- Elif is no longer valid. Use 'else if' instead + +- Netscript's Hacknet Node API functions no longer log anything +- Stock prices now update every ~6 seconds when the game is active (was 10 seconds before) +- Added a new mechanic that affects how stock prices change +- Script editor now has dynamic indicators for RAM Usage and Line number +- Augmentation Rebalancing - Many late game augmentations are now slightly more expensive. Several early game augmentations had their effects slightly decreased +- Increased the amount of rewards (both money and rep) you get from infiltration +- Purchasing servers is now slightly more expensive +- Calling the Netscript function getServerMoneyAvailable('home') now return's the player's money +- Added round(n) Netscript function - Rounds a number +- Added purchaseServer(hostname, ram) Netscript function +- Added the TIX API. This must be purchased in the WSE. It persists through resets. Access to the TIX API allows you to write scripts that perform automated algorithmic trading. See Netscript documentation +- Minor rebalancing in a lot of different areas +- Changed the format of IP Addresses so that they are smaller (will consist mostly of single digit numbers now). This will reduce the size of the game's save file. + +## v0.24.1 + +- Adjusted cost of upgrading home computer RAM. Should be a little cheaper for the first few upgrades (up to ~64GB), and then will start being more expensive than before. High RAM upgrades should now be significantly more expensive than before. +- Slightly lowered the starting money available on most mid-game and end-game servers (servers with required hacking level greater than 200) by about 10-15% +- Rebalanced company/company position reputation gains and requirements +- Studying at a university now gives slightly more EXP and early jobs give slightly less EXP +- Studying at a university is now considerably more expensive +- Rebalanced stock market +- Significantly increased cost multiplier for purchasing additional Hacknet Nodes +- The rate at which facility security level increases during infiltration for each clearance level was lowered slightly for all companies +- Updated Faction descriptions +- Changed the way alias works. Normal aliases now only work at the start of a Terminal command (they will only replace the first word in the Terminal command). You can also create global aliases that work on any part of the command, like before. Declare global aliases by entering the optional -g flag: alias -g name="value" - [https://github.com/MrNuggelz Courtesy of Github user MrNuggelz] +- 'top' Terminal command implemented courtesy of [https://github.com/LTCNugget Github user LTCNugget]. Currently, the formatting gets screwed up if your script names are really long. + +## v0.24.0 + +- Players now have HP, which is displayed in the top right. To regain HP, visit the hospital. Currently the only way to lose HP is through infiltration +- Infiltration - Attempt to infiltrate a company and steal their classified secrets. See 'Companies' documentation for more details +- Stock Market - Added the World Stock Exchange (WSE), a brokerage that lets you buy/sell stocks. To begin trading you must first purchase an account. A WSE account will persist even after resetting by installing Augmentations. How the stock market works should hopefully be self explanatory. There is no documentation about it currently, I will add some later. NOTE: Stock prices only change when the game is open. The Stock Market is reset when installing Augmentations, which means you will lose all your stocks +- Decreased money gained from hacking by ~12% +- Increased reputation required for all Augmentations by ~40% +- Cost increase when purchasing multiple augmentations increased from 75% to 90% +- Added basic variable runtime to Netscript operations. Basic commands run in 100ms. Any function incurs another 100ms in runtime (200ms total). Any function that starts with getServer incurs another 100ms runtime (300ms total). exec() and scp() require 400ms total. +- Slightly reduced the amount of experience gained from hacking + +## v0.23.1 + +- scan() Netscript function now takes a single argument representing the server from which to scan. + +## v0.23.0 + +- You can now purchase multiple Augmentations in a run. When you purchase an Augmentation you will lose money equal to the price and then the cost of purchasing another Augmentation during this run will be increased by 75%. You do not gain the benefits of your purchased Augmentations until you install them. This installation can be done through the 'Augmentation' tab. When you install your Augmentations, your game will reset like before. +- Reputation needed to gain a favor from faction decreased from 7500 to 6500 +- Reputation needed to gain a favor from company increased from 5000 to 6000 +- Reputation cost of all Augmentations increased by 16% +- Higher positions at companies now grant slightly more reputation for working +- Added getServerMaxMoney() Netscript function +- Added scan() Netscript function +- Added getServerNumPortsRequired() Netscript function +- There is now no additional RAM cost incurred when multithreading a script + +## v0.22.1 + +- You no longer lose progress on creating programs when cancelling your work. Your progress will be saved and you will pick up where you left off when you start working on it again +- Added two new programs: AutoLink.exe and ServerProfiler.exe +- Fixed bug with Faction Field work reputation gain + +## v0.22.0 - Major rebalancing, optimization, and favor system + +- Significantly nerfed most augmentations +- Almost every server with a required hacking level of 200 or more now has slightly randomized server parameters. This means that after every Augmentation purchase, the required hacking level, base security level, and growth factor of these servers will all be slightly different +- The hacking speed multiplier now increases rather than decreases. The hacking time is now divided by your hacking speed multiplier rather than multiplied. In other words, a higher hacking speed multiplier is better +- Servers now have a minimum server security, which is approximately one third of their starting ('base') server security +- If you do not steal any money from a server, then you gain hacking experience equal to the amount you would have gained had you failed the hack +- The effects of grow() were increased by 50% +- grow() and weaken() now give hacking experience based on the server's base security level, rather than a flat exp amount +- Slightly reduced amount of exp gained from hack(), weaken(), and grow() +- Rebalanced formulas that determine crime success +- Reduced RAM cost for multithreading a script. The RAM multiplier for each thread was reduced from 1.02 to 1.005 +- Optimized Script objects so they take less space in the save file +- Added getServerBaseSecurityLevel() Netscript function +- New favor system for companies and factions. Earning reputation at a company/faction will give you favor for that entity when you reset after installing an Augmentation. This favor persists through the rest of the game. The more favor you have, the faster you will earn reputation with that faction/company +- You can no longer donate to a faction for reputation until you have 150 favor with that faction +- Added unalias Terminal command +- Changed requirements for endgame Factions + +## v0.21.1 + +- IF YOUR GAME BREAKS, DO THE FOLLOWING: Options -> Soft Reset -> Save Game -> Reload Page. Sorry about that! +- Autocompletion for aliases - courtesy of [https://github.com/LTCNugget Github user LTCNugget] + +## v0.21.0 + +- Added dynamic arrays. See Netscript documentation +- Added ability to pass arguments into scripts. See documentation +- The implementation/function signature of functions that deal with scripts have changed. Therefore, some old scripts might not work anymore. Some of these functions include run(), exec(), isRunning(), kill(), and some others I may have forgot about. Please check the updated Netscript documentation if you run into issues.-Note that scripts are now uniquely identified by the script name and their arguments. For example, you can run a script using:: + + run foodnstuff.script 1 + +and you can also run the same script with a different argument:: + + run foodnstuff.script 2 + +These will be considered two different scripts. To kill the first script you must run:: + + kill foodnstuff.script 1 + +and to kill the second you must run:: + + kill foodnstuff.script 2 + +Similar concepts apply for Terminal Commands such as tail, and Netscript commands such as run(), exec(), kill(), isRunning(), etc. + +- Added basic theme functionality using the 'theme' Terminal command - All credit goes to /u/0x726564646974 who implemented the awesome feature +- Optimized Script objects, which were causing save errors when the player had too many scripts +- Formula for determining exp gained from hacking was changed +- Fixed bug where you could purchase Darkweb items without TOR router +- Slightly increased cost multiplier for Home Computer RAM +- Fixed bug where you could hack too much money from a server (and bring its money available below zero) +- Changed tail command so that it brings up a display box with dynamic log contents. To get old functionality where the logs are printed to the Terminal, use the new 'check' command +- As a result of the change above, you can no longer call tail/check on scripts that are not running +- Added autocompletion for buying Programs in Darkweb + +## v0.20.2 + +- Fixed several small bugs +- Added basic array functionality to Netscript +- Added ability to run scripts with multiple threads. Running a script with n threads will multiply the effects of all hack(), grow(), and weaken() commands by n. However, running a script with multiple threads has drawbacks in terms of RAM usage. A script's ram usage when it is 'multithreaded' is calculated as: base cost _ numThreads _ (1.02 ^ numThreads). A script can be run multithreaded using the 'run [script] -t n' Terminal command or by passing in an argument to the run() and exec() Netscript commands. See documentation. +- RAM is slightly (~10%) more expensive (affects purchasing server and upgrading RAM on home computer) +- NeuroFlux Governor augmentation cost multiplier decreased +- Netscript default operation runtime lowered to 200ms (was 500ms previously) + +## v0.20.1 + +- Fixed bug where sometimes scripts would crash without showing the error +- Added Deepscan programs to Dark Web +- Declining a faction invite will stop you from receiving invitations from that faction for the rest of the run +- (BETA) Added functionality to export/import saves. WARNING This is only lightly tested. You cannot choose where to save your file it just goes to the default save location. Also I have no idea what will happen if you try to import a file that is not a valid save. I will address these in later updates + +## v0.20.0 + +- Refactored Netscript Interpreter code. Operations in Netscript should now run significantly faster (Every operation such as a variable assignment, a function call, a binary operator, getting a variable's value, etc. used to take up to several seconds, now each one should only take ~500 milliseconds). +- Percentage money stolen when hacking lowered to compensate for faster script speeds +- Hacking experience granted by grow() halved +- Weaken() is now ~11% faster, but only grants 3 base hacking exp upon completion instead of 5 +- Rebalancing of script RAM costs. Base RAM Cost for a script increased from 1GB to 1.5GB. Loops, hack(), grow() and weaken() all cost slightly less RAM than before +- Added getServerRequiredHackingLevel(server) Netscript command. +- Added fileExists(file, [server]) Netscript command, which is used to check if a script/program exists on a specified server +- Added isRunning(script, [server]) Netscript command, which is used to check if a script is running on the specified server +- Added killall Terminal command. Kills all running scripts on the current machine +- Added kill() and killall() Netscript commands. Used to kill scripts on specified machines. See Netscript documentation +- Re-designed 'Active Scripts' tab +- Hacknet Node base production rate lowered from 1.6 to 1.55 ($/second) +- Increased monetary cost of RAM (Upgrading home computer and purchasing servers will now be more expensive) +- NEW GROWTH MECHANICS - The rate of growth on a server now depends on a server's security level. A higher security level will result in lower growth on a server when using the grow() command. Furthermore, calling grow() on a server raises that server's security level by 0.004. For reference, if a server has a security level of 10 it will have approximately the same growth rate as before. +- Server growth no longer happens naturally +- Servers now have a maximum limit to their money. This limit is 50 times it's starting money +- Hacking now grants 10% less hacking experience +- You can now edit scripts that are running +- Augmentations cost ~11% more money and 25% more faction reputation + +## v0.19.7 + +- Added changelog to Options menu +- Bug fix with autocompletion (wasn't working properly for capitalized filenames/programs + +## v0.19.6 + +- Script editor now saves its state even when you change tabs +- scp() command in Terminal/script will now overwrite files at the destination +- Terminal commands are no longer case-sensitive (only the commands themselves such as 'run' or 'nano'. Filenames are still case sensitive +- Tab automcompletion will now work on commands + +## v0.19.0 + +- Hacknet Nodes have slightly higher base production, and slightly increased RAM multiplier. But they are also a bit more expensive at higher levels +- Calling grow() and weaken() in a script will now work offline, at slower rates than while online (The script now keeps track of the rate at which grow() and weaken() are called when the game is open. These calculated rates are used to determine how many times the calls would be made while the game is offline) +- Augmentations now cost 20% more reputation and 50% more money +- Changed the mechanic for getting invited to the hacking factions (CyberSec, NiteSec, The Black Hand, BitRunners) Now when you get to the required level to join these factions you will get a message giving you instructions on what to do in order to get invited. +- Added a bit of backstory/plot into the game. It's not fully fleshed out yet but it will be used in the future +- Made the effects of many Augmentations slightly more powerful +- Slightly increased company job wages across the board (~5-10% for each position) +- Gyms and classes are now significantly more expensive +- Doubled the amount by which a server's security increases when it is hacked. Now, it will increase by 0.002. Calling weaken() on a server will lower the security by 0.1. + +## v0.18.0 + +- Major rebalancing (sorry didn't record specifics. But in general hacking gives more money and hacknet nodes give less) +- Server growth rate (both natural and manual using grow()) doubled +- Added option to Soft Reset +- Cancelling a full time job early now only results in halved gains for reputation. Exp and money earnings are gained in full +- Added exec() Netscript command, used to run scripts on other servers. +- NEW HACKING MECHANICS: Whenever a server is hacked, its 'security level' is increased by a very small amount. The security level is denoted by a number between 1-100. A higher security level makes it harder to hack a server and also decreases the amount of money you steal from it. Two Netscript functions, weaken() and getServerSecurityLevel() level, were added. The weaken(server) function lowers a server's security level. See the Netscript documentation for more details +- When donating to factions, the base rate is now $1,000,000 for 1 reputation point. Before, it was $1,000 for 1 reputation point. +- Monetary costs for all Augmentations increased. They are now about ~3.3 - 3.75 times more expensive than before + +## v0.17.1 + +- Fixed issue with purchasing Augmentations that are 'upgrades' and require previous Augmentations to be installed +- Increased the percentage of money stolen from servers when hacking + +## v0.17.0 + +- Greatly increased amount of money gained for crimes (by about 400% for most crimes) +- Criminal factions require slightly less negative karma to get invited to +- Increased the percentage of money stolen from servers when hacking +- Increased the starting amount of money available on beginning servers (servers with <50 required hacking)) +- Increased the growth rate of servers (both naturally and manually when using the grow() command in a script) +- Added getHostname() command in Netscript that returns the hostname of the server a script is running on +- jQuery preventDefault() called when pressing ctrl+b in script editor +- The Neuroflux Governor augmentation (the one that can be repeatedly leveled up) now increases ALL multipliers by 1%. To balance it out, it's price multiplier when it levels up was increased +- Hacknet Node base production decreased from $1.75/s to $1.65/s +- Fixed issue with nested for loops in Netscript (stupid Javascript references) +- Added 'scp' command to Terminal and Netscript +- Slightly nerfed Hacknet Node Kernel DNI and Hacknet Node Core DNI Augmentations +- Increased TOR Router cost to $200k + +## v0.16.0 + +- New Script Editor interface +- Rebalanced hacknet node - Increased base production but halved the multiplier from additional cores. This should boost its early-game production but nerf its late-game production +- Player now starts with 8GB of RAM on home computer +- 'scan-analyze' terminal command displays RAM on servers +- Slightly buffed the amount of money the player steals when hacking servers (by about ~8%) +- Time to execute grow() now depends on hacking skill and server security, rather than taking a flat 2 minutes. +- Clicking outside of a pop-up dialog box will now close it +- BruteSSH.exe takes 33% less time to create +- 'iron-gym' and 'max-hardware' servers now have 2GB of RAM +- Buffed job salaries across the board +- Updated Tutorial +- Created a Hacknet Node API for Netscript that allows you to access and upgrade your Hacknet Nodes. See the Netscript documentation for more details. WARNING The old upgradeHacknetNode() and getNumHacknetNodes() functions waere removed so any script that has these will no longer work + +## v0.15.0 + +- Slightly reduced production multiplier for Hacknet Node RAM +- Faction pages now scroll +- Slightly increased amount of money gained from hacking +- Added 'alias' command +- Added 'scan-analyze' terminal command - used to get basic hacking info about all immediate network connections +- Fixed bugs with upgradeHacknetNode() and purchaseHacknetNode() commands +- Added getNumHacknetNodes() and hasRootAccess(hostname/ip) commands to Netscript +- Increased Cost of university classes/gym +- You can now see what an Augmentation does and its price even while its locked diff --git a/src/Documentation/ui/doc/help/bitnode_order.md b/src/Documentation/ui/doc/help/bitnode_order.md new file mode 100644 index 000000000..7a7d756af --- /dev/null +++ b/src/Documentation/ui/doc/help/bitnode_order.md @@ -0,0 +1,116 @@ +# What BitNode should I do? + +After destroying their first [BitNode](../advanced/bitnodes.md), many players +wonder which [BitNode](../advanced/bitnodes.md) they should tackle next. This guide hopefully helps answer +that question. + +## Recommended BitNodes + +As a player, you are not forced to tackle the [BitNodes](../advanced/bitnodes.md) in any particular order. You are +free to choose whichever ones you want. The "best" order can vary between players, +depending on what you like to do any what kind of player you are. In general, here +are the recommended [BitNodes](../advanced/bitnodes.md) for different things: + +## For fast progression + +These paths do not recommend the absolute fastest path, since speed of progression is +highly dependant on playing style. + +1. Repeat BN-1 until you max out its [Source-File](../advanced/sourcefiles.md). Its [Source-File](../advanced/sourcefiles.md) + is extremely powerful, as it raises all multipliers by a significant amount. This also a let's you + get used to augments and other features resetting. + +2. Do BN-3 at least once to unlock the [Corporation](../advanced/corporations.md) mechanic, finishing all + 3 levels unlocks the full API for free allowing fully scripted corp. This mechanic has highest + profit potential in the game. + +3. Do BN-10 once to unlock [Sleeves](../advanced/sleeves.md) and [Grafting](../advanced/grafting.md). [Sleeves](../advanced/sleeves.md) are useful in all nodes + and grafting can be useful in future [BitNodes](../advanced/bitnodes.md) (especially 8). It's recommended to buy all purchasable [Sleeves](../advanced/sleeves.md) and + their memory during the first run. + + The ordering of the next three is dependant on playing style and wants/needs. + +4. Do BN-5 once or twice. The [Intelligence](../advanced/intelligence.md) stat it unlocks + will gradually build up as you continue to play the game, and will be helpful + in the future. The [Source-File](../advanced/sourcefiles.md) also provides [hacking](../basic/hacking.md) multipliers, which are + strong because [hacking](../basic/hacking.md) is typically one of the best ways of earning money. + +5. Do BN-4. Its [Source-File](../advanced/sourcefiles.md) does not directly make you + more powerful in any way, but it does unlock the [Singularity API](https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.singularity.md) which + let you automate significantly more aspects of the game. Consider repeating until Level 3, + since each level decreases the [RAM](../basic/ram.md) cost of the functions. + +6. Do BN-2 once to unlock the [Gang](../advanced/gang.md) mechanic. This mechanic + has high profit potential and offers large amounts of [Augmentations](../basic/augmentations.md) in a single faction. + Having sleeves ([Source-File](../advanced/sourcefiles.md) 10) greatly reduces the time it takes to get access to [Gangs](../advanced/gang.md) + outside this [BitNode](../advanced/bitnodes.md). + +7. Do BN-9 to unlock the [Hacknet Server](../advanced/hacknetservers.md) mechanic. You can + consider repeating it as well, as its Level 2 and 3 effects are pretty helpful as well. + +## For the strongest Source-Files + +Note that the strongest [Source-Files](../advanced/sourcefiles.md) are typically rewarded by the hardest [BitNodes](../advanced/bitnodes.md). + +The strongest [Source-File](../advanced/sourcefiles.md) is that from BN-1, as it raises +all multipliers by a significant amount. + +The [Source-File](../advanced/sourcefiles.md) from BN-9 is good because it unlocks the Hacknet +Server mechanic. The [Hacknet Server](../advanced/hacknetservers.md) mechanic causes [Hacknet Nodes](../basic/hacknet_nodes.md) to produce a new +currency called `hashes`, rather than money. `Hashes` can be spent on powerful upgrades +that benefit your [hacking](../basic/hacking.md), [Corporation](../advanced/corporations.md), [Bladeburner](../advanced/bladeburners.md), etc. + +The [Sleeves](../advanced/sleeves.md) granted by the [Source-File](../advanced/sourcefiles.md) from BN-10 +are strong, but only after you have several of them and have spent some time/money upgrading +them. + +## For more scripting/hacking + +BN-4 unlocks the [Singularity API](https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.singularity.md), which +can be used to automate many different aspects of the game, including working for [Factions](../basic/factions.md) / [Companies](../basic/companies.md), +purchasing & installing [Augmentations](../basic/augmentations.md), and creating programs + +BN-6 and BN-7 unlock [Bladeburner](../advanced/bladeburners.md) and its corresponding +[Bladeburner API](https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.bladeburner.md). This allows you to automate an entire +new mechanic. + +BN-2 also unlocks a new mechanic and API for automating +the [Gang](../advanced/gang.md) mechanic. However, it is not as interesting as [Bladeburner](../advanced/bladeburners.md) + +BN-9 unlocks the [Hacknet Server](../advanced/hacknetservers.md) mechanic and several new +functions in the [Hacknet Node API](https://github.com/bitburner-official/bitburner-src/blob/dev/markdown/bitburner.hacknet.md) for using it. + +## For new mechanics + +BN-2 unlocks a new mechanic in which you can +manage a [Gang](../advanced/gang.md). [Gangs](../advanced/gang.md) earn you money and can be very profitable once they get large +and powerful. The biggest benefit of [Gangs](../advanced/gang.md), however, is that they make all +[Augmentations](../basic/augmentations.md) available to you through their corresponding [Faction](../basic/factions.md). + +BN-3 unlocks a new mechanic in which you can manage a +[Corporation](../advanced/corporations.md). You can earn money through [Corporations](../advanced/corporations.md) by selling your stocks, or by +configuring your [Corporation](../advanced/corporations.md) to pay dividends to shareholders. If your [Corporation](../advanced/corporations.md) +gets big enough, it can also bribe [Factions](../basic/factions.md) in exchange for [Faction](../basic/factions.md) [Reputation](../basic/reputation.md). + +BN-6 unlocks a new mechanic that centers around combat rather +than hacking. The main benefit of the [Bladeburner](../advanced/bladeburners.md) mechanic is that it offers a new +method of destroying a [BitNode](../advanced/bitnodes.md). + +BN-9 unlocks the [Hacknet Server](../advanced/hacknetservers.md), which is an upgraded version of a +[Hacknet Node](../basic/hacknet_nodes.md). The [Hacknet Server](../advanced/hacknetservers.md) generates a computational unit called a `hash`. `Hashes` +can be spent on a variety of different upgrades that can benefit your hacking, +[Corporation](../advanced/corporations.md), [Bladeburner](../advanced/bladeburners.md) progress, and more. It transforms the [Hacknet Node](../basic/hacknet_nodes.md) from a +simple money-generator to a more interesting mechanic. + +BN-10 unlocks two new mechanics: [Sleeves](../advanced/sleeves.md) and [Grafting](../advanced/grafting.md) + +BN-13 unlocks [Stanek's Gift](../advanced/stanek.md). This gift can improve skills, +[hacknet](../basic/hacknet_nodes.md) production and costs, working and [crime](../basic/crimes.md) gains as well [hacking](../basic/hacking.md) power and speed. + +## For a Challenge + +In general, the higher [BitNodes](../advanced/bitnodes.md) are more difficult than the lower ones. +BN-12 is an obvious exception as it gets progressively harder. + +BN-8 provides a unique challenge as the only method +of earning money in that [BitNode](../advanced/bitnodes.md) is through trading at the stock market. diff --git a/src/Documentation/ui/doc/help/getting_started.md b/src/Documentation/ui/doc/help/getting_started.md new file mode 100644 index 000000000..9a407b4fe --- /dev/null +++ b/src/Documentation/ui/doc/help/getting_started.md @@ -0,0 +1,843 @@ +# Getting Started Guide for Beginner Programmers + +note: Note that the [Scripts](../basic/scripts.md) and strategies given in this guide aren't necessarily +optimal. They're just meant to introduce you to the game and help you get +started. + +This is an introductory guide to getting started with Bitburner. It is not meant to be a +comprehensive guide for the entire game, only the early stages. If you are confused +or overwhelmed by the game, especially the programming and scripting aspects, this +guide is perfect for you! + +Note that this guide is tailored towards those with minimal programming experience. + +## Introduction + +Bitburner is a cyberpunk-themed incremental RPG. The player progresses by raising +their [Stats](../basic/stats.md), earning money, and climbing the corporate ladder. +Eventually, after reaching certain criteria, the player will begin receiving invitations +from [Factions](../basic/factions.md). Joining these [Factions](../basic/factions.md) and working for them will unlock +[Augmentations](../basic/augmentations.md). Purchasing and installing [Augmentations](../basic/augmentations.md) provide persistent +upgrades and are necessary for progressing in the game. + +The game has a minimal story/quest-line that can be followed to reach the end of the game. +Since this guide is only about getting started with Bitburner, it will not cover the +entire "quest-line". + +## First Steps + +I'm going to assume you followed the introductory tutorial when you first began the game. +In this introductory tutorial you created a [Script](../basic/scripts.md) called `n00dles.js` and ran it +on the `n00dles` server. Right now, we'll kill this [Script](../basic/scripts.md). There are two ways +to do this: + +1. You can go to the Terminal and enter: + + $ kill n00dles.js + +2. You can go to the `Active Scripts` page (Alt + s) and + press the `Kill Script` button for `n00dles.js`. + +If you skipped the introductory tutorial, then ignore the part above. Instead, go to the +`Hacknet Nodes` page (Alt + h) and purchase a +[Hacknet Node](../basic/hacknet_nodes.md) to start generating some passive income. + +## Creating our First Script + +Now, we'll create a generic [hacking](../basic/hacking.md) [Script](../basic/scripts.md) that can be used early on in the game (or throughout the +entire game, if you want). + +Before we write the [Script](../basic/scripts.md), here are some things you'll want to familiarize yourself with: + +- `hacking` +- `security` +- `hack` +- `grow` +- `weaken` +- `brutessh` +- `nuke` + +To briefly summarize the information from the links above: Each [Server](../basic/servers.md) has a +security level that affects how difficult it is to hack. Each [Server](../basic/servers.md) also has a +certain amount of money, as well as a maximum amount of money it can hold. [Hacking](../basic/hacking.md) a +[Server](../basic/servers.md) steals a percentage of that [Server](../basic/servers.md)'s money. The `hack()` function +is used to hack a [Server](../basic/servers.md). The `grow()` function is used to increase +the amount of money available on a [Server](../basic/servers.md). The `weaken()` function is +used to decrease a [Server](../basic/servers.md)'s security level. + +Now let's move on to actually creating the [Script](../basic/scripts.md). +Go to your home computer and then create a [Script](../basic/scripts.md) called `early-hack-template.js` by +going to [Terminal](../basic/terminal.md) and entering the following two commands: + + $ home + $ nano early-hack-template.js + +This will take you to the [Script](../basic/scripts.md) editor, which you can use to code and create +[Scripts](../basic/scripts.md). + +Enter the following code in the [Script](../basic/scripts.md) editor: + + /** @param {NS} ns */ + export async function main(ns) { + // Defines the "target server", which is the server + // that we're going to hack. In this case, it's "n00dles" + const target = "n00dles"; + + // Defines how much money a server should have before we hack it + // In this case, it is set to the maximum amount of money. + const moneyThresh = ns.getServerMaxMoney(target); + + // Defines the maximum security level the target server can + // have. If the target's security level is higher than this, + // we'll weaken it before doing anything else + const securityThresh = ns.getServerMinSecurityLevel(target); + + // If we have the BruteSSH.exe program, use it to open the SSH Port + // on the target server + if (ns.fileExists("BruteSSH.exe", "home")) { + ns.brutessh(target); + } + + // Get root access to target server + ns.nuke(target); + + // Infinite loop that continously hacks/grows/weakens the target server + while(true) { + if (ns.getServerSecurityLevel(target) > securityThresh) { + // If the server's security level is above our threshold, weaken it + await ns.weaken(target); + } else if (ns.getServerMoneyAvailable(target) < moneyThresh) { + // If the server's money is less than our threshold, grow it + await ns.grow(target); + } else { + // Otherwise, hack it + await ns.hack(target); + } + } + } + +The [Script](../basic/scripts.md) above contains comments that document what it does, but let's go through it +step-by-step anyways. + + const target = "n00dles"; + +This first command defines a string which contains our target [Server](../basic/servers.md). That's the [Server](../basic/servers.md) +that we're going to [hack](../basic/hacking.md). For now, it's set to `"n00dles"` because that's the only +[Server](../basic/servers.md) with a required hacking level of `1`. If you want to [hack](../basic/hacking.md) a different [Server](../basic/servers.md), +simply change this +variable to be the hostname of another [Server](../basic/servers.md). + + const moneyThresh = ns.getServerMaxMoney(target); + +This second command defines a numerical value representing the minimum +amount of money that must be available on the target [Server](../basic/servers.md) in order for our [Script](../basic/scripts.md) +to [hack](../basic/hacking.md) it. If the money available on the target [Server](../basic/servers.md) is less than this value, +then our [Script](../basic/scripts.md) will `grow()` the [Server](../basic/servers.md) rather than [hacking](../basic/hacking.md) it. +It is set to the maximum amount of money that can be available on the [Server](../basic/servers.md). +The `getServerMaxMoney()` function is used to find this value + + const securityThresh = ns.getServerMinSecurityLevel(target); + +This third command defines a numerical value representing the maximum security level +the target [Server](../basic/servers.md) can have. If the target [Server](../basic/servers.md)'s security level is higher than +this value, then our [Script](../basic/scripts.md) will `weaken()` the [Script](../basic/scripts.md) before doing anything else. + + if (ns.fileExists("BruteSSH.exe", "home")) { + ns.brutessh(target); + } + + ns.nuke(target); + +This section of code is used to gain root access on the target [Server](../basic/servers.md). This is +necessary for [hacking](../basic/hacking.md). + + while (true) { + if (ns.getServerSecurityLevel(target) > securityThresh) { + // If the server's security level is above our threshold, weaken it + await ns.weaken(target); + } else if (ns.getServerMoneyAvailable(target) < moneyThresh) { + // Otherwise, if the server's money is less than our threshold, grow it + await ns.grow(target); + } else { + // Otherwise, hack it + await ns.hack(target); + } + } + +This is the main section that drives our [Script](../basic/scripts.md). It dictates the [Script](../basic/scripts.md)'s logic +and carries out the [hacking](../basic/hacking.md) operations. The `while (true)` creates an infinite loop +that will continuously run the [hacking](../basic/hacking.md) logic until the the [Script](../basic/scripts.md) is killed. + +The await keyword is needed for `hack()` / `grow()` / `weaken()` because these commands take +time to execute, unlike the others. If you forget to await these commands, you will get +an exception saying you tried to do multiple things at once, because your code will +immediately finish the function call without waiting for the operation to be done. Also +important is that await can only be used in functions marked `async` (note that `main()` is marked `async`). + +## Running our Scripts + +Now we want to start running our [hacking](../basic/hacking.md) [Script](../basic/scripts.md) so that it can start earning us +money and experience. Our home computer only has 8GB of [RAM](../basic/ram.md) and we'll be using it for +something else later. So instead, we'll take advantage of the [RAM](../basic/ram.md) on other machines. + +Go to `Terminal` and enter the following command: + + $ scan-analyze 2 + +This will show detailed information about some [Servers](../basic/servers.md) on the network. The +**network is randomized so it will be different for every person**. +Here's what mine showed at the time I made this: + + [home ~]> scan-analyze 2 + ┕ home + ┃ Root Access: YES, Required hacking skill: 1 + ┃ Number of open ports required to NUKE: 5 + ┃ RAM: 8.00GB + ┣ n00dles + ┃ ┃ Root Access: YES, Required hacking skill: 1 + ┃ ┃ Number of open ports required to NUKE: 0 + ┃ ┃ RAM: 4.00GB + ┃ ┕ nectar-net + ┃ Root Access: NO, Required hacking skill: 20 + ┃ Number of open ports required to NUKE: 0 + ┃ RAM: 16.00GB + ┣ foodnstuff + ┃ ┃ Root Access: NO, Required hacking skill: 1 + ┃ ┃ Number of open ports required to NUKE: 0 + ┃ ┃ RAM: 16.00GB + ┃ ┕ zer0 + ┃ Root Access: NO, Required hacking skill: 75 + ┃ Number of open ports required to NUKE: 1 + ┃ RAM: 32.00GB + ┣ sigma-cosmetics + ┃ ┃ Root Access: NO, Required hacking skill: 5 + ┃ ┃ Number of open ports required to NUKE: 0 + ┃ ┃ RAM: 16.00GB + ┃ ┕ max-hardware + ┃ Root Access: NO, Required hacking skill: 80 + ┃ Number of open ports required to NUKE: 1 + ┃ RAM: 32.00GB + ┣ joesguns + ┃ Root Access: NO, Required hacking skill: 10 + ┃ Number of open ports required to NUKE: 0 + ┃ RAM: 16.00GB + ┣ hong-fang-tea + ┃ Root Access: NO, Required hacking skill: 30 + ┃ Number of open ports required to NUKE: 0 + ┃ RAM: 16.00GB + ┣ harakiri-sushi + ┃ Root Access: NO, Required hacking skill: 40 + ┃ Number of open ports required to NUKE: 0 + ┃ RAM: 16.00GB + ┕ iron-gym + ┃ Root Access: NO, Required hacking skill: 100 + ┃ Number of open ports required to NUKE: 1 + ┃ RAM: 32.00GB + ┕ CSEC + Root Access: NO, Required hacking skill: 55 + Number of open ports required to NUKE: 1 + RAM: 8.00GB + +Take note of the following servers: + +- `sigma-cosmetics` +- `joesguns` +- `nectar-net` +- `hong-fang-tea` +- `harakiri-sushi` + +All of these servers have 16GB of [RAM](../basic/ram.md). Furthermore, all of these servers do not require +any open ports in order to NUKE. In other words, we can gain root access to all of these +servers and then run [Scripts](../basic/scripts.md) on them. + +First, let's determine how many threads of our [hacking](../basic/hacking.md) [Script](../basic/scripts.md) we can run. +`Read more about multithreading scripts here` +The [Script](../basic/scripts.md) we wrote +uses 2.6GB of [RAM](../basic/ram.md). You can check this using the following `Terminal` command: + + $ mem early-hack-template.js + +This means we can run 6 threads on a 16GB server. Now, to run our [Scripts](../basic/scripts.md) on all of these +servers, we have to do the following: + +1. Use the `scp` command to copy our [Script](../basic/scripts.md) to each server. +2. Use the `connect` command to connect to a server. +3. Use the `run` command to run the `NUKE.exe` program and + gain root access. +4. Use the `run` command again to run our [Script](../basic/scripts.md). +5. Repeat steps 2-4 for each server. + +Here's the sequence of `Terminal` commands I used in order to achieve this: + + $ home + $ scp early-hack-template.js n00dles + $ scp early-hack-template.js sigma-cosmetics + $ scp early-hack-template.js joesguns + $ scp early-hack-template.js nectar-net + $ scp early-hack-template.js hong-fang-tea + $ scp early-hack-template.js harakiri-sushi + $ connect n00dles + $ run NUKE.exe + $ run early-hack-template.js -t 1 + $ home + $ connect sigma-cosmetics + $ run NUKE.exe + $ run early-hack-template.js -t 6 + $ home + $ connect joesguns + $ run NUKE.exe + $ run early-hack-template.js -t 6 + $ home + $ connect hong-fang-tea + $ run NUKE.exe + $ run early-hack-template.js -t 6 + $ home + $ connect harakiri-sushi + $ run NUKE.exe + $ run early-hack-template.js -t 6 + $ home + $ connect hong-fang-tea + $ connect nectar-net + $ run NUKE.exe + $ run early-hack-template.js -t 6 + +Pressing the `Tab` key in the middle of a Terminal command will attempt to +auto-complete the command. For example, if you type in `scp ea` and then +hit `Tab`, the rest of the [Script](../basic/scripts.md)'s name should automatically be filled in. +This works for most commands in the game! + +The `home` command is used to connect to the home +computer. When running our [Scripts](../basic/scripts.md) with the `run early-hack-template.js -t 6` +command, the `-t 6` specifies that the [Script](../basic/scripts.md) should be run with 6 threads. + +Note that the `nectar-net` [Server](../basic/servers.md) isn't in the home computer's immediate network. +This means you can't directly connect to it from home. You will have to search for it +inside the network. The results of the `scan-analyze 2` command we ran before +will show where it is. In my case, I could connect to it by going from +`hong-fang-tea` -> `nectar-net`. However, this will probably be different for you. + +After running all of these `Terminal` commands, our [Scripts](../basic/scripts.md) are now up and running. +These will earn money and hacking experience over time. These gains will be +really slow right now, but they will increase once our hacking skill rises and +we start running more [Scripts](../basic/scripts.md). + +## Increasing Hacking Level + +There are many [Servers](../basic/servers.md) besides `n00dles` that can be hacked, but they have +higher required hacking levels. Therefore, we should raise our hacking level. Not only +will this let us hack more [Servers](../basic/servers.md), but it will also increase the effectiveness of our [hacking](../basic/hacking.md) +against `n00dles`. + +The easiest way to train your hacking level is to visit Rothman University. You can do this by +clicking the `City` tab on the left-hand navigation menu, or you can use Alt + w. Rothman University should be one of the buttons +near the top. Click the button to go to the location. + +Once you go to Rothman University, you should see a screen with several options. These +options describe different courses you can take. You should click the first button, which +says: `Study Computer Science (free)`. + +After you click the button, you will start studying and earning hacking experience. While you +are doing this, you cannot interact with any other part of the game until you click the button +that says "Stop taking course". + +Right now, we want a hacking level of 10. You need approximately 174 hacking experience to reach +level 10. You can check how much hacking experience you have by clicking the `Stats` tab +on the left-hand navigation menu, or by using Alt + c. +Since studying at Rothman University earns you 1 experience per second, this will take +174 seconds, or approximately 3 minutes. Feel free to do something in the meantime! + +## Editing our Hacking Script + +Now that we have a hacking level of 10, we can hack the `joesguns` [Server](../basic/servers.md). This [Server](../basic/servers.md) +will be slightly more profitable than `n00dles`. Therefore, we want to change our [hacking](../basic/hacking.md) +[Script](../basic/scripts.md) to target `joesguns` instead of `n00dles`. + +Go to `Terminal` and edit the [hacking](../basic/hacking.md) [Script](../basic/scripts.md) by entering: + + $ home + $ nano early-hack-template.js + +At the top of the [Script](../basic/scripts.md), change the `target` variable to be `"joesguns"`: + + const target = "joesguns"; + +Note that this will **NOT** affect any instances of the [Script](../basic/scripts.md) that are already running. +This will only affect instances of the [Script](../basic/scripts.md) that are ran from this point forward. + +## Creating a New Script to Purchase New Servers + +Next, we're going to create a [Script](../basic/scripts.md) that automatically purchases additional [Servers](../basic/servers.md). These +[Servers](../basic/servers.md) will be used to run many [Scripts](../basic/scripts.md). Running this [Script](../basic/scripts.md) will initially be very +expensive since purchasing a [Server](../basic/servers.md) costs money, but it will pay off in the long run. + +In order to create this [Script](../basic/scripts.md), you should familiarize yourself with the following +functions: + +- `purchaseServer()` +- `getPurchasedServerCost()` +- `getPurchasedServerLimit()` +- `getServerMoneyAvailable()` +- `scp()` +- `exec()` + +Create the [Script](../basic/scripts.md) by going to `Terminal` and typing: + + $ home + $ nano purchase-server-8gb.js + +Paste the following code into the [Script](../basic/scripts.md) editor: + + /** @param {NS} ns */ + export async function main(ns) { + // How much RAM each purchased server will have. In this case, it'll + // be 8GB. + const ram = 8; + + // Iterator we'll use for our loop + let i = 0; + + // Continuously try to purchase servers until we've reached the maximum + // amount of servers + while (i < ns.getPurchasedServerLimit()) { + // Check if we have enough money to purchase a server + if (ns.getServerMoneyAvailable("home") > ns.getPurchasedServerCost(ram)) { + // If we have enough money, then: + // 1. Purchase the server + // 2. Copy our hacking script onto the newly-purchased server + // 3. Run our hacking script on the newly-purchased server with 3 threads + // 4. Increment our iterator to indicate that we've bought a new server + let hostname = ns.purchaseServer("pserv-" + i, ram); + ns.scp("early-hack-template.js", hostname); + ns.exec("early-hack-template.js", hostname, 3); + ++i; + } + //Make the script wait for a second before looping again. + //Removing this line will cause an infinite loop and crash the game. + await ns.sleep(1000); + } + } + +This code uses a while loop to purchase the maximum amount of [Servers](../basic/servers.md) using the +`purchaseServer()` function. Each of these [Servers](../basic/servers.md) will have +8GB of [RAM](../basic/ram.md), as defined in the `ram` variable. Note that the [Script](../basic/scripts.md) uses the command +`getServerMoneyAvailable("home")` to get the amount of money you currently have. +This is then used to check if you can afford to purchase a [Server](../basic/servers.md). + +Whenever the script purchases a new [Server](../basic/servers.md), it uses the `scp()` function to copy +our [Script](../basic/scripts.md) onto that new [Server](../basic/servers.md), and then it uses the `exec()` function to +execute it on that [Server](../basic/servers.md). + +To run this [Script](../basic/scripts.md), go to `Terminal` and type: + + $ run purchase-server-8gb.js + +This purchase will continuously run until it has purchased the maximum number of [Servers](../basic/servers.md). +When this happens, it'll mean that you have a bunch of new [Servers](../basic/servers.md) that are all running +[hacking](../basic/hacking.md) [Scripts](../basic/scripts.md) against the `joesguns` [Server](../basic/servers.md)! + +The reason we're using so many [Scripts](../basic/scripts.md) to hack `joesguns` instead of targeting other +[Servers](../basic/servers.md) is because it's more effective. This early in the game, we don't have enough [RAM](../basic/ram.md) +to efficiently hack multiple targets, and trying to do so would be slow as we'd be spread +too thin. You should definitely do this later on, though! + +Note that purchasing a [Server](../basic/servers.md) is fairly expensive, and purchasing the maximum amount of +[Servers](../basic/servers.md) even more so. At the time of writing this guide, the [Script](../basic/scripts.md) above requires +$11 million in order to finish purchasing all of the 8GB [Servers](../basic/servers.md). +Therefore, we need to find additional ways to make money to speed +up the process! These are covered in the next section. + +## Additional Sources of Income + +There are other ways to gain money in this game besides [Scripts](../basic/scripts.md) & [hacking](../basic/hacking.md). + +## Hacknet Nodes + +If you completed the introductory tutorial, you were already introduced to this method: Hacknet Nodes. +Once you have enough money, you can start upgrading your Hacknet Nodes in order to increase +your passive income stream. This is completely optional. Since each Hacknet Node upgrade +takes a certain amount of time to "pay itself off", it may not necessarily be in your best +interest to use these. + +Nonetheless, Hacknet Nodes are a good source of income early in the game, although +their effectiveness tapers off later on. If you do wind up purchasing and upgrading Hacknet Nodes, +I would suggest only upgrading their levels for now. I wouldn't bother with [RAM](../basic/ram.md) and Core +upgrades until later on. + +## Crime + +The best source of income right now is from crimes. +This is because it not only gives you a large amount of money, but it also raises your +hacking level. To commit crimes, click on the `City` tab on the left-hand +navigation menu or use the Alt + w. +Then, click on the link that says `The Slums`. + +In the Slums, you can attempt to commit a variety of crimes, each of which gives certain +types of experience and money if successful. See crimes for more details. + +You are not always successful when you attempt to commit a crime. Nothing bad happens +if you fail a crime, but you won't earn any money and the experience gained will be +reduced. Raising your stats improves your chance of successfully committing a crime. + +Right now, the best option is the `Rob Store` crime. This takes 60 seconds to attempt +and gives $400k if successful. I suggest this crime because you don't have to click or check +in too often since it takes a whole minute to attempt. Furthermore, it gives hacking experience, +which is very important right now. + +Alternatively, you can also use the `Shoplift` crime. This takes 2 seconds to attempt +and gives $15k if successful. This crime is slightly easier and is more profitable +than `Rob Store`, but it requires constant clicking and it doesn't give +hacking experience. + +## Work for a Company + +If you don't want to constantly check in on the game to commit crimes, there's another option +that's much more passive: working for a company. +This will not be nearly as profitable as crimes, but it's completely passive. + +Go to the `City` tab on the left-hand navigation menu and then go to +`Joe's Guns`. At `Joe's Guns`, there will be an option that says +`Apply to be an Employee`. Click this to get the job. Then, a new option +will appear that simply says `Work`. Click this to start working. +Working at `Joe's Guns` earns $110 per second and also grants some experience +for every stat except hacking. + +Working for a company is completely passive. You can choose to focus on your work, do +something else simultaneously, or switch between those two. While you focus on work, +you will not be able to do anything else in the game. If you do something else meanwhile, +you will not gain reputation at the same speed. You can cancel working at any time. +You'll notice that cancelling your work early causes you to lose out on some reputation +gains, but you shouldn't worry about this. Company reputation isn't important right now. + +Once your hacking hits level 75, you can visit `Carmichael Security` in the city +and get a software job there. This job offers higher pay and also earns you +hacking experience. + +There are many more companies in the `City` tab that offer more pay and also more gameplay +features. Feel free to explore! + +## After you Purchase your New Servers + +After you've made a total of $11 million, your automatic [Server](../basic/servers.md)-purchasing [Script](../basic/scripts.md) should +finish running. This will free up some [RAM](../basic/ram.md) on your home computer. We don't want this [RAM](../basic/ram.md) +to go to waste, so we'll make use of it. Go to `Terminal` and enter the following commands: + + $ home + $ run early-hack-template.js -t 3 + +## Reaching a Hacking Level of 50 + +Once you reach a hacking level of 50, two new important parts of the game open up. + +## Creating your first program: BruteSSH.exe + +On the left-hand navigation menu you will notice a `Create Programs` tab with a +red notification icon. This indicates that there are programs available to be created. +Click on that tab (or use Alt + p) and you'll see a +list of all the programs you can currently create. Hovering over a program will give a +brief description of its function. Simply click on a program to start creating it. + +Right now, the program we want to create is `BruteSSH.exe`. This program is used +to open up SSH ports on [Servers](../basic/servers.md). This will allow you to hack more [Servers](../basic/servers.md), +as many [Servers](../basic/servers.md) in the game require a certain number of opened ports in order for +`NUKE.exe` to gain root access. + +When you are creating a program, you cannot interact with any other part of the game. +Feel free to cancel your work on creating a program at any time, as your progress will +be saved and can be picked back up later. `BruteSSH.exe` takes about +10 minutes to complete. + +## Optional: Create AutoLink.exe + +On the `Create Programs` page, you will notice another program you can create +called `AutoLink.exe`. If you don't mind waiting another 10-15 minutes, you should +go ahead and create this program. It makes it much less tedious to connect to other [Servers](../basic/servers.md), +but it's not necessary for progressing. + +## Joining your first faction: CyberSec + +Shortly after you reached level 50 hacking, you should have received a message that +said this: + + Message received from unknown sender: + + We've been watching you. Your skills are very impressive. But you're wasting + your talents. If you join us, you can put your skills to good use and change + the world for the better. If you join us, we can unlock your full potential. + But first, you must pass our test. Find and hack our server using the Terminal. + + -CyberSec + + This message was saved as csec-test.msg onto your home computer. + +If you didn't, or if you accidentally closed it, that's okay! Messages get saved onto +your home computer. Enter the following `Terminal` commands to view the message: + + $ home + $ cat csec-test.msg + +This message is part of the game's main "quest-line". It is a message from the +|CyberSec faction| that is asking you to pass their test. +Passing their test is simple, you just have to find their [Server](../basic/servers.md) and hack it through +the `Terminal`. Their [Server](../basic/servers.md) is called `CSEC`. +To do this, we'll use the `scan-analyze` +Terminal command, just like we did before: + + $ home + $ scan-analyze 2 + +This will show you the network for all [Servers](../basic/servers.md) that are up to 2 "nodes" away from +your home computer. Remember that the network is randomly generated so it'll look +different for everyone. Here's the relevant part of my `scan-analyze` results: + + ┕ home + ┃ Root Access: YES, Required hacking skill: 1 + ┃ Number of open ports required to NUKE: 5 + ┃ RAM: 8.00GB + ┣ harakiri-sushi + ┃ Root Access: NO, Required hacking skill: 40 + ┃ Number of open ports required to NUKE: 0 + ┃ RAM: 16.00GB + ┕ iron-gym + ┃ Root Access: NO, Required hacking skill: 100 + ┃ Number of open ports required to NUKE: 1 + ┃ RAM: 32.00GB + ┕ CSEC + Root Access: NO, Required hacking skill: 55 + Number of open ports required to NUKE: 1 + RAM: 8.00GB + +This tells me that I can reach `CSEC` by going through `iron-gym`: + + $ connect iron-gym + $ connect CSEC + +If you created the `AutoLink.exe` program earlier, then there is an easier +method of connecting to `CSEC`. You'll notice that in the `scan-analyze` +results, all of the [Server](../basic/servers.md) hostnames are white and underlined. You can simply +click one of the [Server](../basic/servers.md) hostnames in order to connect to it. So, simply click +`CSEC`! + +Make sure you notice the required hacking skill for the `CSEC` [Server](../basic/servers.md). +This is a random value between 51 and 60. Although you receive the message +from CSEC once you hit 50 hacking, you cannot actually pass their test +until your hacking is high enough to install a backdoor on their [Server](../basic/servers.md). + +After you are connected to the `CSEC` [Server](../basic/servers.md), you can backdoor it. Note that this +[Server](../basic/servers.md) requires one open port in order to gain root access. We can open the SSH port +using the `BruteSSH.exe` program we created earlier. In `Terminal`: + + $ run BruteSSH.exe + $ run NUKE.exe + $ backdoor + +After you successfully install the backdoor, you should receive a faction +invitation from `CyberSec` shortly afterwards. Accept it. If you accidentally +reject the invitation, that's okay. Just go to the `Factions` tab +(Alt + f) and you should see an option that lets you +accept the invitation. + +Congrats! You just joined your first faction. Don't worry about doing anything +with this faction yet, we can come back to it later. + +## Using Additional Servers to Hack Joesguns + +Once you have the `BruteSSH` program, you will be able to gain root access +to several additional [Servers](../basic/servers.md). These [Servers](../basic/servers.md) have more [RAM](../basic/ram.md) that you can use to +run [Scripts](../basic/scripts.md). We'll use the [RAM](../basic/ram.md) on these [Servers](../basic/servers.md) to run more [Scripts](../basic/scripts.md) that target +`joesguns`. + +## Copying our Scripts + +The [Server](../basic/servers.md)'s we'll be using to run our [Scripts](../basic/scripts.md) are: + +- `neo-net` +- `zer0` +- `max-hardware` +- `iron-gym` + +All of these [Servers](../basic/servers.md) have 32GB of [RAM](../basic/ram.md). You can use the `Terminal` command +`scan-analyze 3` to see for yourself. To copy our [hacking](../basic/hacking.md) [Scripts](../basic/scripts.md) onto these [Servers](../basic/servers.md), +go to `Terminal` and run: + + $ home + $ scp early-hack-template.js neo-net + $ scp early-hack-template.js zer0 + $ scp early-hack-template.js max-hardware + $ scp early-hack-template.js iron-gym + +Since each of these [Servers](../basic/servers.md) has 32GB of [RAM](../basic/ram.md), we can run our [hacking](../basic/hacking.md) script with 12 threads +on each [Server](../basic/servers.md). By now, you should know how to connect to [Servers](../basic/servers.md). So find and connect to +each of the [Servers](../basic/servers.md) above using the `scan-analyze 3` `Terminal` command. Then, use +following `Terminal` command to run our [hacking](../basic/hacking.md) +script with 12 threads: + + $ run early-hack-template.js -t 12 + +Remember that if you have the `AutoLink` program, you can simply click on the hostname of a [Server](../basic/servers.md) +after running `scan-analyze` to connect to it. + +## Profiting from Scripts & Gaining Reputation with CyberSec + +Now it's time to play the waiting game. It will take some time for your [Scripts](../basic/scripts.md) to start +earning money. Remember that most of your [Scripts](../basic/scripts.md) are targeting `joesguns`. It will take a +bit for them to `grow()` and `weaken()` the [Server](../basic/servers.md) to the appropriate values +before they start [hacking](../basic/hacking.md) it. Once they do, however, the [Scripts](../basic/scripts.md) will be very profitable. + +For reference, in about two hours after starting my first [Script](../basic/scripts.md), my [Scripts](../basic/scripts.md) had a +production rate of $20k per second and had earned a total of $70 million. +(You can see these stats on the `Active Scripts` tab). + +After another 15 minutes, the production rate had increased to $25k per second +and the [Scripts](../basic/scripts.md) had made an additional $55 million. + +Your results will vary based on how fast you earned money from crime/working/hacknet nodes, +but this will hopefully give you a good indication of how much the [Scripts](../basic/scripts.md) can earn. + +In the meantime, we are going to be gaining reputation with the `CyberSec` faction. +Go to the `Factions` tab on the left-hand +navigation menu, and from there select `CyberSec`. In the middle of +the page there should be a button for `Hacking Contracts`. +Click it to start earning reputation for the `CyberSec` faction (as well +as some hacking experience). The higher your hacking level, the more reputation you +will gain. Note that while you are working for a faction, you can choose to not interact +with the rest of the game in any way to gain reputation at full speed. You can also select to +do something else simultaneously, gaining reputation a bit more slowly, until you focus again. +You can cancel your faction work at any time with no penalty to your reputation gained so far. + +## Purchasing Upgrades and Augmentations + +As I mentioned before, within 1-2 hours I had earned over $200 million. Now, it's time +to spend all of this money on some persistent upgrades to help progress! + +## Upgrading RAM on Home computer + +The most important thing to upgrade right now is the [RAM](../basic/ram.md) on your home computer. This +will allow you to run more [Scripts](../basic/scripts.md). + +To upgrade your [RAM](../basic/ram.md), go to the `City` tab and visit the company `Alpha Enterprises`. +There will be an option that says `Purchase additional RAM for Home Computer`. +Click it and follow the dialog box to upgrade your [RAM](../basic/ram.md). + +I recommend getting your home computer's [RAM](../basic/ram.md) to **at least** 128GB. Getting it even +higher would be better. + +## Purchasing your First Augmentations + +Once you get ~1000 reputation with the `CyberSec` faction, you can purchase +your first `Augmentation` from them. + +To do this, go to the `Factions` tab on the left-hand navigation menu +(Alt + f) and select `CyberSec`. There is an button +near the bottom that says `Purchase Augmentations`. This will bring up a +page that displays all of the Augmentations available from `CyberSec`. Some of them +may be locked right now. To unlock these, you will need to earn more +reputation with `CyberSec`. + +Augmentations give persistent upgrades in the form of multipliers. These aren't very +powerful early in the game because the multipliers are small. However, the effects +of Augmentations stack multiplicatively **with each other**, so as you continue to install +many Augmentations their effects will increase significantly. + +Because of this, I would recommend investing more in [RAM](../basic/ram.md) upgrades for your home computer rather +than Augmentations early on. Having enough [RAM](../basic/ram.md) to run many [Scripts](../basic/scripts.md) will allow you to make +much more money, and then you can come back later on and get all these Augmentations. + +Right now, I suggest purchasing at the very least the `Neurotrainer I` Augmentation from +`CyberSec`. If you have the money to spare, I would also suggest getting `BitWire` and +several levels of the `NeuroFlux Governor` (`NFG`) Augmentations. Note that each time +you purchase an Augmentation, +**the price of purchasing another increases by 90%**, +so make sure you buy the most expensive Augmentation first. Don't worry, once you choose to +install Augmentations, their prices will reset back to their original values. + +## Next Steps + +That's the end of the walkthrough portion of this guide! You should continue to explore +what the game has to offer. There's quite a few features that aren't covered or mentioned +in this guide, and even more that get unlocked as you continue to play! + +Also, check out the api documentation to see what it has to offer. Writing +[Scripts](../basic/scripts.md) to perform and automate various tasks is where most of the fun in the game comes +from (in my opinion)! + +The following are a few things you may want to consider doing in the near future. + +## Installing Augmentations (and Resetting) + +If you've purchased any Augmentations, you'll need to install them before you +actually gain their effects. Installing Augmentations is the game's "soft-reset" or "prestige" +mechanic. You can [read more details about it here](). + +To install your Augmentations, click the `Augmentations` tab on the left-hand navigation +menu (Alt + a). You will see a list of all of the Augmentations +you have purchased. Below that, you will see a button that says `Install Augmentations`. +Be warned, after clicking this there is no way to undo it (unless you load an earlier save). + +## Automating the Script Startup Process + +Whenever you install Augmentations, all of your [Scripts](../basic/scripts.md) are killed and you'll have to +re-run them. Doing this every time you install Augmentations would be very tedious and annoying, +so you should write a [Script](../basic/scripts.md) to automate the process. Here's a simple example for a +startup [Script](../basic/scripts.md). Feel free to adjust it to your liking. + + /** @param {NS} ns */ + export async function main(ns) { + // Array of all servers that don't need any ports opened + // to gain root access. These have 16 GB of RAM + const servers0Port = ["sigma-cosmetics", + "joesguns", + "nectar-net", + "hong-fang-tea", + "harakiri-sushi"]; + + // Array of all servers that only need 1 port opened + // to gain root access. These have 32 GB of RAM + const servers1Port = ["neo-net", + "zer0", + "max-hardware", + "iron-gym"]; + + // Copy our scripts onto each server that requires 0 ports + // to gain root access. Then use nuke() to gain admin access and + // run the scripts. + for (let i = 0; i < servers0Port.length; ++i) { + const serv = servers0Port[i]; + + ns.scp("early-hack-template.js", serv); + ns.nuke(serv); + ns.exec("early-hack-template.js", serv, 6); + } + + // Wait until we acquire the "BruteSSH.exe" program + while (!ns.fileExists("BruteSSH.exe")) { + await ns.sleep(60000); + } + + // Copy our scripts onto each server that requires 1 port + // to gain root access. Then use brutessh() and nuke() + // to gain admin access and run the scripts. + for (let i = 0; i < servers1Port.length; ++i) { + const serv = servers1Port[i]; + + ns.scp("early-hack-template.js", serv); + ns.brutessh(serv); + ns.nuke(serv); + ns.exec("early-hack-template.js", serv, 12); + } + } + +## Random Tips + +- Early on in the game, it's better to spend your money on upgrading [RAM](../basic/ram.md) and purchasing + new [Servers](../basic/servers.md) rather than spending it on Augmentations +- The more money available on a [Server](../basic/servers.md), the more effective the `hack()` and + `grow()` functions will be. This is because both of these functions + use percentages rather than flat values. `hack()` steals a percentage of a [Server](../basic/servers.md)'s + total available money, and `grow()` increases a [Server](../basic/servers.md)'s money by X%. +- There is a limit to how much money can exist on a [Server](../basic/servers.md). This value is different for each + [Server](../basic/servers.md). The `getServerMaxMoney()` function will tell you this maximum value. +- At this stage in the game, your combat stats (strength, defense, etc.) are not nearly + as useful as your hacking stat. Do not invest too much time or money into gaining combat + stat exp. +- As a rule of thumb, your hacking target should be the [Server](../basic/servers.md) with highest max money that's + required hacking level is under 1/2 of your hacking level. diff --git a/src/Documentation/ui/doc/help/tools_and_resources.md b/src/Documentation/ui/doc/help/tools_and_resources.md new file mode 100644 index 000000000..cbbea7987 --- /dev/null +++ b/src/Documentation/ui/doc/help/tools_and_resources.md @@ -0,0 +1,22 @@ +# Tools & Resources + +## Official Script Repository + +There are plans to create an official repository of Bitburner scripts. As of right now, +this is not a priority and has not been started. However, if you'd like +to contribute scripts now, you can find the repository +[here](https://github.com/bitburner-official/bitburner-scripts) and submit pull requests. + +## Visual Studio Code Extension + +One user created a Bitburner extension for the Visual Studio Code (VSCode) editor. + +This extension includes several features such as: + +- Dynamic RAM calculation +- RAM Usage breakdown +- Typescript definition files with jsdoc comments +- Syntax highlighting + +You can find more information and download links +[on this reddit post](https://www.reddit.com/r/Bitburner/comments/bh48y2/visual_studio_code_ram_calculator_extra/). diff --git a/src/Documentation/ui/doc/index.md b/src/Documentation/ui/doc/index.md new file mode 100644 index 000000000..c4112c9db --- /dev/null +++ b/src/Documentation/ui/doc/index.md @@ -0,0 +1,48 @@ +# Documentation + +## [Beginners guide](help/getting_started.md) + +## Mechanics + +- [stats](basic/stats.md) +- [terminal](basic/terminal.md) +- [hacking](basic/hacking.md) +- [scripts](basic/scripts.md) +- [servers](basic/servers.md) +- [ram](basic/ram.md) +- [hacknet_nodes](basic/hacknet_nodes.md) +- [augmentations](basic/augmentations.md) +- [companies](basic/companies.md) +- [factions](basic/factions.md) +- [crimes](basic/crimes.md) +- [infiltration](basic/infiltration.md) +- [reputation](basic/reputation.md) +- [stockmarket](basic/stockmarket.md) +- [world](basic/world.md) +- [codingcontracts](basic/codingcontracts.md) + +## Advanced Mechanics + +- [BitNodes](advanced/bitnodes.md) +- [BladeBurners](advanced/bladeburners.md) +- [Corporations](advanced/corporations.md) +- [Gang](advanced/gang.md) +- [Grafting](advanced/grafting.md) +- [Hacknet Servers](advanced/hacknetservers.md) +- [Intelligence](advanced/intelligence.md) +- [Sleeves](advanced/sleeves.md) +- [Source-Files](advanced/sourcefiles.md) +- [Stanek's Gift](advanced/stanek.md) + +## Resources + +- [Learn to program](programming/learn.md) +- [Remote API](programming/remote_api.md) +- [Game Frozen or Stuck?](programming/game_frozen.md) +- [Tools & Resources](tools_and_resources.md) +- [Changelog](changelog.md) + +## Migration + +- [v1.0.0 script migration guide](migrations/v1.md) +- [v2.0.0 script migration guide](migrations/v2.md) diff --git a/src/Documentation/ui/doc/migrations/v1.md b/src/Documentation/ui/doc/migrations/v1.md new file mode 100644 index 000000000..3262ce726 --- /dev/null +++ b/src/Documentation/ui/doc/migrations/v1.md @@ -0,0 +1,36 @@ +# v1.0.0 Migration Guide + +In v1.0.0 a few API have been broken. + +migrated (only for ns2): + +- bladeburner.getActionTime will return milliseconds instead of seconds. +- getHackTime will return milliseconds instead of seconds. +- getGrowTime will return milliseconds instead of seconds. +- getWeakenTime will return milliseconds instead of seconds. +- hackAnalyzePercent renamed to hackAnalyze +- hackAnalyzePercent will return decimal instead of percentage +- hackChance (not formulas.basic.hackChance) renamed to hackAnalyzeChance +- formulas.basic is split into formulas.skills and formulas.hacking + +not migrated (require manual changes sometimes): + +- getPlayer().hacking_skill renamed `hacking` +- same thing in sleeves +- getPurchasedServers won't let you query for ips instead of hostnames. +- getStats is deprecated in favor getPlayer +- getCharacterInformation is deprecated in favor getPlayer +- getServerRam deprecated in favor of getServerMaxRam and getServerUsedRam +- getServerBaseSecurityLevel will be deprecated in favor of nothing, it's not really used. +- sleep can no longer be called simultaneously, a new function called asleep will let you. +- write returns promise (needs to be await ed). +- scp returns a promise (needs to be await ed). +- free port, write, read +- write, read does not support port anymore, writePort and readPort does. + +Upon loading v1.0.0 the game will apply some rules to change everything. +The game never changes a file before making a backup called `BACKUP_filename.ext`, then, +in the script it will change whatever it thinks it should change. +But will prefix the modified line with the original line. + +A file called `v1_DETECTED_CHANGES.txt` will point out every file with some possible problem. diff --git a/src/Documentation/ui/doc/migrations/v2.md b/src/Documentation/ui/doc/migrations/v2.md new file mode 100644 index 000000000..17b52c59e --- /dev/null +++ b/src/Documentation/ui/doc/migrations/v2.md @@ -0,0 +1,97 @@ +# v2.0.0 Migration Guide + +In v2.0.0 a few more APIs have been broken. + +## Working + +Working has been rebuilt from the ground up. The motivation for this change is that all +different types of work all required different cached variables on the main Player object. +This caused a lot of bugs and crashes. It's been reworked in such a way as to prevent bugs +and make it nearly trivial to add new kinds of work. +All work types give their reward immediately. No need to stop work to bank rewards like reputation. +Faction and Company work no longer have a time limit. +Company work no longer reduces rep gain by half for quitting early. +Company factions now require 400k rep to join (up from 200k). +Backdooring a company server reduces faction requirement to 300k. +All types of work generally no longer keep track of cumulative gains like exp and reputation since it's applied instantly. + +## commitCrime + +Crime now loops, meaning after finishing one shoplift you start the next one with no input. While the signature +has not changed, its behavior has. It also has a new 'focus' parameter. + +## getPlayer + +The following work-related fields are no longer included: + +- workChaExpGained +- currentWorkFactionName +- workDexExpGained +- workHackExpGained +- createProgramReqLvl +- workStrExpGained +- companyName +- crimeType +- workRepGained +- workChaExpGainRate +- workType +- workStrExpGainRate +- isWorking +- workRepGainRate +- workDefExpGained +- currentWorkFactionDescription +- workHackExpGainRate +- workAgiExpGainRate +- workDexExpGainRate +- workMoneyGained +- workMoneyLossRate +- workMoneyGainRate +- createProgramName +- workDefExpGainRate +- workAgiExpGained +- className + +The reason for this, is that these fields are all, in one way or another, included in the new work field `currentWork`. +Some of these values are also irrelevant. +Take a look at the new singularity.getCurrentWork function: + +All fields ending in `_mult` have been moved to the `mults` struct. +For example: `getPlayer().hacking_skill_mult` => `getPlayer().mults.hacking_skill` + +skills has been moved to the skills struct +For example: `getPlayer().hacking` => `getPlayer().skills.hacking` + +exp has been moved to the exp struct +For example: `getPlayer().hacking_exp` => `getPlayer().exp.hacking` + +hp has been moved to the hp struct +For example: `getPlayer().max_hp` => `getPlayer().hp.max` or `hp.current` + +`hasWseAccount`, `hasTixApiAccess`, `has4SData`, `has4SDataTixApi` have been removed and replaced with similar stock functions. + +## workForCompany + +The argument 'companyName' is now required. + +## getScriptIncome & getScriptExpGain + +These two functions used to have a call where, if no arguments were provided, it would return the total for all scripts. This caused weird signature. +If you want to get the total income/exp for all scripts, use the new getTotalScriptIncome / getTotalScriptExpGain instead. + +## scp + +The last two arguments of spc have been reversed. The signature is now scp(files, destination, optional_source) + +## Singularity + +The top level singularity functions were deprecated a while ago in favor of the singularity namespace. +This means calls like 'ns.connect' need to be changed to 'ns.singularity.connect' + +## stock.buy, stock.sell, stock.short + +These functions were renamed to stock.buyStock, stock.sellStock, and stock.buyShort because 'buy', 'sell', and 'short' +are very common tokens that would trick the ram calculation. + +## corporation.bribe + +The ability to give shares as a bribe has been removed. The signature is now bribe(faction, money) diff --git a/doc/source/gamefrozen.rst b/src/Documentation/ui/doc/programming/game_frozen.md similarity index 59% rename from doc/source/gamefrozen.rst rename to src/Documentation/ui/doc/programming/game_frozen.md index efa9d8291..751056ac7 100644 --- a/doc/source/gamefrozen.rst +++ b/src/Documentation/ui/doc/programming/game_frozen.md @@ -1,17 +1,15 @@ -Game Frozen or Stuck? -===================== +# Game Frozen or Stuck? -Infinite Loop in NetscriptJS ----------------------------- +## Infinite Loop in Scripts If your game is frozen or stuck in any way, then the most likely culprit is an -infinitely running loop in :ref:`netscriptjs`. To get past the freezing, run the game with +infinitely running loop in your script. To get past the freezing, run the game with `?noScripts` in the URL: -`https://danielyxie.github.io/bitburner/?noScripts `_ +[Link to no freeze](https://danielyxie.github.io/bitburner/?noScripts) -Then, to fix your script, make sure you have a sleep or any other timed function like `hack()` or -`grow()` in any infinite loops:: +Then, to fix your script, make sure you have a `sleep()` or any other timed function like `hack()` or +`grow()` in any infinite loops: while(true) { // This is an infinite loop that does something @@ -19,8 +17,8 @@ Then, to fix your script, make sure you have a sleep or any other timed function await ns.sleep(1000); // Add a 1s sleep to prevent freezing } -Also make sure that each while loop gets to the `awaited` function or `break`, for example the next snippet has a sleep -function, but it nor any possible conditional breaks are never reached and therefore will crash the game:: +Also make sure that each while loop gets to the `await`ed function or `break`, for example the next snippet has a `sleep()` +function, but it nor any possible conditional breaks are never reached and therefore will crash the game: while(true) { let currentMoney = ns.getServerMoneyAvailable("n00dles"); @@ -33,11 +31,11 @@ function, but it nor any possible conditional breaks are never reached and there } } -If `n00dles` current money is, for example, 75% of the maximum money, the script will reach neither `grow` nor `break` and the game will crash. +If `n00dles` current money is, for example, 75% of the maximum money, the script will reach neither `grow()` nor `break` and the game will crash. Adding a sleep like in the first example, or changing the code so that the `awaited` function or `break` is always reached, would prevent the crash. -Common infinite loop when translating the server purchasing script in starting guide to :ref:`netscriptjs` is to have a -while loop, where the condition's change is conditional:: +Common infinite loop when translating the server purchasing script in starting guide to scripts is to have a +while loop, where the condition's change is conditional: var ram = 8; var i = 0; @@ -52,22 +50,19 @@ while loop, where the condition's change is conditional:: } If the player does not currently have enough money to purchase a server, the `if`'s condition will be false and `++i` will not be reached. -Since the script doesn't have `sleep` and value `i` will not change without the `if` being true, this will crash the game. Adding a `sleep` +Since the script doesn't have `sleep()` and value `i` will not change without the `if` being true, this will crash the game. Adding a `sleep()` that is always reached would prevent the crash. -Blackscreen ------------ +## Blackscreen -If the game window becomes a black screen without the game itself crashing, this is caused by -the game running too many concurrent scripts (the game runs on a browser and each tab can only +If the game window becomes a black screen without the game itself crashing, this is caused by +the game running too many concurrent scripts (the game runs on a browser and each tab can only use so much ram until it crashes). Depending on which scripts are running and your hardware, -this number can vary between 50000 to 100000 instances (in version 2.0.2. In prior versions this number -was about 1/5th of that). To prevent this from happening make sure to :ref:`multithread` - the scripts as much as possible. +this number can vary between 50000 to 100000 instances (in version 2.0.2. In prior versions this number +was about 1/5th of that). To prevent this from happening make sure to multithread +the scripts as much as possible. - -Bug ---- +## Bug Otherwise, the game is probably frozen/stuck due to a bug. To report a bug, follow -the guidelines `here `_. +the guidelines [here](https://github.com/bitburner-official/bitburner-src/blob/master/doc/CONTRIBUTING.md#reporting-bugs). diff --git a/doc/source/advancedgameplay/hackingalgorithms.rst b/src/Documentation/ui/doc/programming/hackingalgorithms.md similarity index 65% rename from doc/source/advancedgameplay/hackingalgorithms.rst rename to src/Documentation/ui/doc/programming/hackingalgorithms.md index 7c420aab5..6c760a1d7 100644 --- a/doc/source/advancedgameplay/hackingalgorithms.rst +++ b/src/Documentation/ui/doc/programming/hackingalgorithms.md @@ -1,68 +1,63 @@ -Hacking algorithms -================== +# Hacking algorithms There are three primary families of hacking algorithms. This guide will go over each of them and advise on how they can be implemented. -Self-contained algorithms -------------------------- -**Difficulty**: Easy +## Self-contained algorithms -Pros: +**Difficulty**: Easy -* Easy to implement -* Does not require other scripts to work -* Works at any stage of the game +Pros: -Cons: +- Easy to implement +- Does not require other scripts to work +- Works at any stage of the game -* Limits income generation -* Extremely RAM inefficient -* Utilizes script online time poorly -* Risk of over hacking +Cons: -Self-contained algorithms are the simplest family of hacking algorithms to implement. Each script is tasked with choosing which function to execute based on the status of the target server. Because of this, they guarantee a consistent, but relatively small, flow of money. +- Limits income generation +- Extremely [RAM](../basic/ram.md) inefficient +- Utilizes script online time poorly +- Risk of over hacking + +Self-contained algorithms are the simplest family of hacking algorithms to implement. Each script is tasked with choosing which function to execute based on the status of the target server. Because of this, they guarantee a consistent, but relatively small, flow of money. The general logic goes like this: - .. code-block:: javascript - - loop forever { - if security is not minimum { - await ns.weaken(target) - } else if money is not maximum { - await ns.grow(target) - } else { - await ns.hack(target) - } + loop forever { + if security is not minimum { + await ns.weaken(target) + } else if money is not maximum { + await ns.grow(target) + } else { + await ns.hack(target) } + } This algorithm is perfectly capable of paving the way through the majority of the game, but it has a few significant issues. - It tends to make all your scripts on every server do the same thing. (e.g. If the target is 0.01 security above the minimum, all scripts will decide to weaken, when only a handful of threads should be devoted to the task) - At higher thread counts, these scripts have the potential to hack the server to $0, or maximum security, requiring a long setup time while the scripts return the server to the best stats. -- Requires function calls such as `getServerSecurityLevel()` and `getServerMoneyAvailable()`, as well as calling all three hacking functions, increasing RAM cost which is multiplied by the number of allocated threads - -Loop algorithms ---------------- +- Requires function calls such as `getServerSecurityLevel` and `getServerMoneyAvailable`, as well as calling all three hacking functions, increasing RAM cost which is multiplied by the number of allocated threads + +## Loop algorithms + **Difficulty**: Easy to Medium -Pros: +Pros: -* Simple to understand -* Works at any stage of the game -* Maximize RAM usage +- Simple to understand +- Works at any stage of the game +- Maximize RAM usage Cons: -* Requires a script that handles deployment +- Requires a script that handles deployment -By splitting our hack, weaken, and grow functions into three separate scripts, we can both remove our reliance on functions such as `getServerSecurityLevel()` as well as removing functions that cannot work concurrently, reducing RAM requirements, and thus increasing our thread limits. Loop scripts are formatted like this: +By splitting our hack, weaken, and grow functions into three separate scripts, we can both remove our reliance on functions such as `getServerSecurityLevel` as well as removing functions that cannot work concurrently, reducing RAM requirements, and thus increasing our thread limits. Loop scripts are formatted like this: - .. code-block:: javascript - - loop forever { - await ns.hack(target) // or grow, or weaken - } + loop forever { + await ns.hack(target) // or grow, or weaken + } Now we can take the total amount of threads available and split it and allocate, for example: @@ -74,29 +69,27 @@ Meaning if we have space for 100 threads across the entire network 7 threads wil When utilizing this strategy, monitor the amount of money and security on the target server, if the money is not hovering around maximum and the security around the minimum, the ratios should be tweaked until that is the case. -Utilizing `sleep()` or `asleep()` to ensure that your scripts do not all start at the same time can decrease the chance of issues associated with overhacking occurring. Both functions have a ram cost of zero. +Utilizing `sleep` or `asleep` to ensure that your scripts do not all start at the same time can decrease the chance of issues associated with overhacking occurring. Both functions have a ram cost of zero. + +## Batch algorithms (HGW, HWGW, or Cycles) -Batch algorithms (HGW, HWGW, or Cycles) ---------------------------------------- **Difficulty**: Hard Pros: -* Maximum potential income +- Maximum potential income Cons: -* Very difficult to implement without prior programming knowledge -* Very difficult to make work on servers with less than 1TB of RAM +- Very difficult to implement without prior programming knowledge +- Very difficult to make work on servers with less than 1TB of RAM -Batch algorithms utilize a master script that uses `exec()` many scripts which utilize a relevant hacking function in batches. +Batch algorithms utilize a master script that uses `exec` many scripts which utilize a relevant hacking function in batches. The scripts used to execute the hacking functions are even simpler than the previous algorithms but a complex controller is required to calculate the effect, time taken, and the necessary delay. - .. code-block:: javascript - - await ns.sleep(a bit) - await ns.hack(target) // or grow, or weaken + await ns.sleep(a bit) + await ns.hack(target) // or grow, or weaken A few things need to be known before this algorithm can be implemented: @@ -111,13 +104,12 @@ A single batch consists of four actions: 3. A grow script counters the money decrease caused by the hack script. 4. A weaken script counters the security increase caused by the grow script. -It is also important that these 4 scripts finish in the order specified above, and all of their effects be precalculated to optimize the ratios between them. This is the reason for the delay in the scripts. +It is also important that these 4 scripts finish in the order specified above, and all of their effects be precalculated to optimize the ratios between them. This is the reason for the delay in the scripts. -It is possible to create batches with 3 scripts (HGW) but the efficiency of grow will be harmed by the security increase caused by the hack scripts. - -The following is an image demonstrating batches in action: - -.. image:: batch.png + |= hack ====================| + |=weaken 1======================================| + |= grow ==========================| + |=weaken 2======================================| Batches only function predictably when the target server is at minimum security and maximum money, so your script must also handle preparing a server for your batches. You can utilize batches to prepare a server by using no hack threads during preparation. diff --git a/src/Documentation/ui/doc/programming/learn.md b/src/Documentation/ui/doc/programming/learn.md new file mode 100644 index 000000000..c45b4ff02 --- /dev/null +++ b/src/Documentation/ui/doc/programming/learn.md @@ -0,0 +1,36 @@ +# Learn to Program in Javascript + +## For Beginner Programmers + +If you have little to no programming experience, that's okay! You don't need to be +a great programmer in order to enjoy or play this game. In fact, this game could +help you learn some basic programming concepts. + +Here are some good tutorials for learning programming/JavaScript as a beginner: + +- [Learn-JS](http://www.learn-js.org/en/Welcome) +- [programiz](https://www.programiz.com/javascript/get-started) +- [Speaking JavaScript](https://exploringjs.com/es5/) + This is a bit on the longer side. You can skip all of the historical + background stuff. Recommended chapters: 1, 7-18 + +## For Experienced Programmers + +The following section lists several good tutorials/resources for those who have experience +programming but who have not worked extensively with JavaScript before. + +Before that, however, it's important to clarify some terminology about the different +versions of JavaScript. These are summarized in this article: + +[WTF is ES6, ES8, ES2017, ECMAScript...](https://codeburst.io/javascript-wtf-is-es6-es8-es-2017-ecmascript-dca859e4821c) + +An important takeaway from this article is that ES6, also known as ES2015, introduced +many major features that are commonly seen in modern JavaScript programming. However, this +means that ES5 engines and interpreters will fail if they encounters these ES6 features. You'll see why this +is important further down. + +- [MDN Introduction to JS](https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript) +- [Eloquent JavaScript (ES6+)](http://eloquentjavascript.net/) + Recommended Chapters: Introduction, 1-6 +- [Modern Javascript Tutorial (ES6+)](https://javascript.info/) + Recommended Chapters: 2, 4-6 diff --git a/doc/source/remoteapi.rst b/src/Documentation/ui/doc/programming/remote_api.md similarity index 73% rename from doc/source/remoteapi.rst rename to src/Documentation/ui/doc/programming/remote_api.md index c887da0dc..bf68d2a19 100644 --- a/doc/source/remoteapi.rst +++ b/src/Documentation/ui/doc/programming/remote_api.md @@ -1,19 +1,15 @@ - -Remote API -========== +# Remote API All versions of Bitburner can use websockets to connect to a server. That server can then perform a number of actions. Most commonly this is used in conjunction with an external text editor or API in order to make writing scripts easier, or even use typescript. -To make use of this Remote API through the official server, look here: https://github.com/bitburner-official/typescript-template. +To make use of this Remote API through the official server, look [here](https://github.com/bitburner-official/typescript-template). If you want to make your own server, see below for API details. This API uses the JSON RPC 2.0 protocol. Inputs are in the following form: - .. code-block:: javascript - { "jsonrpc": "2.0", "id": number, @@ -23,8 +19,6 @@ This API uses the JSON RPC 2.0 protocol. Inputs are in the following form: Outputs: - .. code-block:: javascript - { "jsonrpc": "2.0", "id": number, @@ -32,15 +26,11 @@ Outputs: "error": any } +## Methods -Methods -------- +## `pushFile` -`pushFile` -^^^^^^^^^^ - Create or update a file. - - .. code-block:: javascript +Create or update a file. { "jsonrpc": "2.0", @@ -53,7 +43,6 @@ Methods } } - .. code-block:: javascript { "jsonrpc": "2.0", @@ -61,11 +50,9 @@ Methods "result": "OK" } -`getFile` -^^^^^^^^^ - Read a file and it's content. +## `getFile` - .. code-block:: javascript +Read a file and it's content. { "jsonrpc": "2.0", @@ -77,7 +64,6 @@ Methods } } - .. code-block:: javascript { "jsonrpc": "2.0", @@ -85,11 +71,9 @@ Methods "result": string } -`deleteFile` -^^^^^^^^^^^^ - Delete a file. +## `deleteFile` - .. code-block:: javascript +Delete a file. { "jsonrpc": "2.0", @@ -101,7 +85,6 @@ Methods } } - .. code-block:: javascript { "jsonrpc": "2.0", @@ -109,11 +92,9 @@ Methods "result": "OK" } -`getFileNames` -^^^^^^^^^^^^^^ - List all file names on a server. +## `getFileNames` - .. code-block:: javascript +List all file names on a server. { "jsonrpc": "2.0", @@ -124,7 +105,6 @@ Methods } } - .. code-block:: javascript { "jsonrpc": "2.0", @@ -132,11 +112,9 @@ Methods "result": string[] } -`getAllFiles` -^^^^^^^^^^^^^ - Get the content of all files on a server. +## `getAllFiles` - .. code-block:: javascript +Get the content of all files on a server. { "jsonrpc": "2.0", @@ -147,7 +125,6 @@ Methods } } - .. code-block:: javascript { "jsonrpc": "2.0", @@ -158,11 +135,9 @@ Methods }[] } -`calculateRam` -^^^^^^^^^^^^^^ - Calculate the in-game ram cost of a script. +## `calculateRam` - .. code-block:: javascript +Calculate the in-game ram cost of a script. { "jsonrpc": "2.0", @@ -174,7 +149,6 @@ Methods } } - .. code-block:: javascript { "jsonrpc": "2.0", @@ -182,12 +156,9 @@ Methods "result": number } +## `getDefinitionFile` -`getDefinitionFile` -^^^^^^^^^^^^^^^^^^^ - Get the definition file of the API. - - .. code-block:: javascript +Get the definition file of the API. { "jsonrpc": "2.0", @@ -195,12 +166,9 @@ Methods "method": "getDefinitionFile" } - .. code-block:: javascript { "jsonrpc": "2.0", "id": number, "result": string } - - diff --git a/src/Documentation/ui/pages.ts b/src/Documentation/ui/pages.ts new file mode 100644 index 000000000..4faf9056a --- /dev/null +++ b/src/Documentation/ui/pages.ts @@ -0,0 +1,80 @@ +// THIS FILE IS AUTOGENERATED +import file0 from "!!raw-loader!./doc/advanced/bitnodes.md"; +import file1 from "!!raw-loader!./doc/advanced/bladeburners.md"; +import file2 from "!!raw-loader!./doc/advanced/corporations.md"; +import file3 from "!!raw-loader!./doc/advanced/gang.md"; +import file4 from "!!raw-loader!./doc/advanced/grafting.md"; +import file5 from "!!raw-loader!./doc/advanced/hacknetservers.md"; +import file6 from "!!raw-loader!./doc/advanced/intelligence.md"; +import file7 from "!!raw-loader!./doc/advanced/sleeves.md"; +import file8 from "!!raw-loader!./doc/advanced/sourcefiles.md"; +import file9 from "!!raw-loader!./doc/advanced/stanek.md"; +import file10 from "!!raw-loader!./doc/basic/augmentations.md"; +import file11 from "!!raw-loader!./doc/basic/codingcontracts.md"; +import file12 from "!!raw-loader!./doc/basic/companies.md"; +import file13 from "!!raw-loader!./doc/basic/crimes.md"; +import file14 from "!!raw-loader!./doc/basic/factions.md"; +import file15 from "!!raw-loader!./doc/basic/hacking.md"; +import file16 from "!!raw-loader!./doc/basic/hacknet_nodes.md"; +import file17 from "!!raw-loader!./doc/basic/infiltration.md"; +import file18 from "!!raw-loader!./doc/basic/ram.md"; +import file19 from "!!raw-loader!./doc/basic/reputation.md"; +import file20 from "!!raw-loader!./doc/basic/scripts.md"; +import file21 from "!!raw-loader!./doc/basic/servers.md"; +import file22 from "!!raw-loader!./doc/basic/stats.md"; +import file23 from "!!raw-loader!./doc/basic/stockmarket.md"; +import file24 from "!!raw-loader!./doc/basic/terminal.md"; +import file25 from "!!raw-loader!./doc/basic/world.md"; +import file26 from "!!raw-loader!./doc/changelog.md"; +import file27 from "!!raw-loader!./doc/help/bitnode_order.md"; +import file28 from "!!raw-loader!./doc/help/getting_started.md"; +import file29 from "!!raw-loader!./doc/help/tools_and_resources.md"; +import file30 from "!!raw-loader!./doc/index.md"; +import file31 from "!!raw-loader!./doc/migrations/v1.md"; +import file32 from "!!raw-loader!./doc/migrations/v2.md"; +import file33 from "!!raw-loader!./doc/programming/game_frozen.md"; +import file34 from "!!raw-loader!./doc/programming/hackingalgorithms.md"; +import file35 from "!!raw-loader!./doc/programming/learn.md"; +import file36 from "!!raw-loader!./doc/programming/remote_api.md"; + +interface Document { + default: string; +} +export const AllPages: Record = {}; +AllPages["advanced/bitnodes.md"] = file0; +AllPages["advanced/bladeburners.md"] = file1; +AllPages["advanced/corporations.md"] = file2; +AllPages["advanced/gang.md"] = file3; +AllPages["advanced/grafting.md"] = file4; +AllPages["advanced/hacknetservers.md"] = file5; +AllPages["advanced/intelligence.md"] = file6; +AllPages["advanced/sleeves.md"] = file7; +AllPages["advanced/sourcefiles.md"] = file8; +AllPages["advanced/stanek.md"] = file9; +AllPages["basic/augmentations.md"] = file10; +AllPages["basic/codingcontracts.md"] = file11; +AllPages["basic/companies.md"] = file12; +AllPages["basic/crimes.md"] = file13; +AllPages["basic/factions.md"] = file14; +AllPages["basic/hacking.md"] = file15; +AllPages["basic/hacknet_nodes.md"] = file16; +AllPages["basic/infiltration.md"] = file17; +AllPages["basic/ram.md"] = file18; +AllPages["basic/reputation.md"] = file19; +AllPages["basic/scripts.md"] = file20; +AllPages["basic/servers.md"] = file21; +AllPages["basic/stats.md"] = file22; +AllPages["basic/stockmarket.md"] = file23; +AllPages["basic/terminal.md"] = file24; +AllPages["basic/world.md"] = file25; +AllPages["changelog.md"] = file26; +AllPages["help/bitnode_order.md"] = file27; +AllPages["help/getting_started.md"] = file28; +AllPages["help/tools_and_resources.md"] = file29; +AllPages["index.md"] = file30; +AllPages["migrations/v1.md"] = file31; +AllPages["migrations/v2.md"] = file32; +AllPages["programming/game_frozen.md"] = file33; +AllPages["programming/hackingalgorithms.md"] = file34; +AllPages["programming/learn.md"] = file35; +AllPages["programming/remote_api.md"] = file36; diff --git a/src/Documentation/ui/root.ts b/src/Documentation/ui/root.ts new file mode 100644 index 000000000..464efffb9 --- /dev/null +++ b/src/Documentation/ui/root.ts @@ -0,0 +1,10 @@ +import index from "!!raw-loader!./doc/index.md"; +import { AllPages } from "./pages"; + +export type Document = typeof index; + +export const Root = { + content: index, +}; + +export const getPage = (title: string): Document => AllPages[title] ?? Root; diff --git a/src/GameOptions/ui/GameOptionsRoot.tsx b/src/GameOptions/ui/GameOptionsRoot.tsx index e7e45d67d..e29013bbf 100644 --- a/src/GameOptions/ui/GameOptionsRoot.tsx +++ b/src/GameOptions/ui/GameOptionsRoot.tsx @@ -13,6 +13,7 @@ interface IProps { export: () => void; forceKill: () => void; softReset: () => void; + reactivateTutorial: () => void; } export type OptionsTabName = "System" | "Interface" | "Numeric Display" | "Gameplay" | "Misc" | "Remote API"; const tabs: Record = { @@ -26,7 +27,6 @@ const tabs: Record = { export function GameOptionsRoot(props: IProps): React.ReactElement { const [currentTab, setCurrentTab] = useState("System"); - return ( Options @@ -38,6 +38,7 @@ export function GameOptionsRoot(props: IProps): React.ReactElement { export={props.export} forceKill={props.forceKill} softReset={props.softReset} + reactivateTutorial={props.reactivateTutorial} /> {tabs[currentTab]} diff --git a/src/GameOptions/ui/GameOptionsSidebar.tsx b/src/GameOptions/ui/GameOptionsSidebar.tsx index 255c161b0..cf39d9939 100644 --- a/src/GameOptions/ui/GameOptionsSidebar.tsx +++ b/src/GameOptions/ui/GameOptionsSidebar.tsx @@ -33,6 +33,7 @@ interface IProps { export: () => void; forceKill: () => void; softReset: () => void; + reactivateTutorial: () => void; } interface ITabProps { @@ -58,6 +59,8 @@ export const GameOptionsSidebar = (props: IProps): React.ReactElement => { const [importSaveOpen, setImportSaveOpen] = useState(false); const [importData, setImportData] = useState(null); + const [confirmResetOpen, setConfirmResetOpen] = useState(false); + function startImport(): void { if (!window.File || !window.FileReader || !window.FileList || !window.Blob) return; const ii = importInput.current; @@ -237,8 +240,8 @@ export const GameOptionsSidebar = (props: IProps): React.ReactElement => { gridArea: "links", display: "grid", gridTemplateAreas: `"bug changelog" - "docs docs" "discord reddit" + "tut tut" "plaza plaza"`, gridTemplateColumns: "1fr 1fr", my: 1, @@ -260,13 +263,8 @@ export const GameOptionsSidebar = (props: IProps): React.ReactElement => { > Changelog - - setConfirmResetOpen(false)} - onConfirm={props.reactivateTutorial} - confirmationText={"This will reset all your stats to 1 and money to 1k. Are you sure?"} - /> - - Getting Started - -
    - - Servers & Networking - -
    - - Hacking - -
    - - Scripts - -
    - - Netscript Programming Language - -
    - - Traveling - -
    - - Companies - -
    - - Infiltration - -
    - - Factions - -
    - - Augmentations - -
    - - Keyboard Shortcuts - -
    - - NS1 vs NS2 (or .script vs .js) - -
    - - Simplified list of functions - - -
    - - Complete list of functions - - - - ); -} diff --git a/src/ui/GameRoot.tsx b/src/ui/GameRoot.tsx index 67733ec59..392b670be 100644 --- a/src/ui/GameRoot.tsx +++ b/src/ui/GameRoot.tsx @@ -37,7 +37,7 @@ import { ProgramsRoot } from "../Programs/ui/ProgramsRoot"; import { ScriptEditorRoot } from "../ScriptEditor/ui/ScriptEditorRoot"; import { MilestonesRoot } from "../Milestones/ui/MilestonesRoot"; import { TerminalRoot } from "../Terminal/ui/TerminalRoot"; -import { TutorialRoot } from "../Tutorial/ui/TutorialRoot"; +import { DocumentationRoot } from "../Documentation/ui/DocumentationRoot"; import { ActiveScriptsRoot } from "./ActiveScripts/ActiveScriptsRoot"; import { FactionsRoot } from "../Faction/ui/FactionsRoot"; import { FactionRoot } from "../Faction/ui/FactionRoot"; @@ -70,6 +70,7 @@ import { Apr1 } from "./Apr1"; import { V2Modal } from "../utils/V2Modal"; import { MathJaxContext } from "better-react-mathjax"; import { useRerender } from "./React/hooks"; +import { HistoryProvider } from "./React/Documentation"; const htmlLocation = location; @@ -277,16 +278,8 @@ export function GameRoot(): React.ReactElement { mainPage = ; break; } - case Page.Tutorial: { - mainPage = ( - { - prestigeAugmentation(); - Router.toPage(Page.Terminal); - iTutorialStart(); - }} - /> - ); + case Page.Documentation: { + mainPage = ; break; } case Page.DevMenu: { @@ -337,6 +330,11 @@ export function GameRoot(): React.ReactElement { }} forceKill={killAllScripts} softReset={softReset} + reactivateTutorial={() => { + prestigeAugmentation(); + Router.toPage(Page.Terminal); + iTutorialStart(); + }} /> ); break; @@ -376,40 +374,42 @@ export function GameRoot(): React.ReactElement { - - - {(parentOpen) => - !ITutorial.isRunning ? ( - saveObject.saveGame()} - killScripts={killAllScripts} - /> - ) : ( - - ) - } - - {withSidebar ? ( - - + + + + {(parentOpen) => + !ITutorial.isRunning ? ( + saveObject.saveGame()} + killScripts={killAllScripts} + /> + ) : ( + + ) + } + + {withSidebar ? ( + + + {mainPage} + + ) : ( {mainPage} - - ) : ( - {mainPage} - )} - - {withPopups && ( - <> - - - - - - - )} - - + )} + + {withPopups && ( + <> + + + + + + + )} + + + diff --git a/src/ui/InteractiveTutorial/InteractiveTutorialRoot.tsx b/src/ui/InteractiveTutorial/InteractiveTutorialRoot.tsx index 0ac520f5e..5cf28ef45 100644 --- a/src/ui/InteractiveTutorial/InteractiveTutorialRoot.tsx +++ b/src/ui/InteractiveTutorial/InteractiveTutorialRoot.tsx @@ -326,10 +326,6 @@ export function InteractiveTutorialRoot(): React.ReactElement { Scripts must end with the .js extension. Let's make a script now by entering {`[home ~/]> nano ${tutorialScriptName}`} - - - after the hack command finishes running (Sidenote: Pressing ctrl + c will end a command like hack early) - ), canNext: false, @@ -338,8 +334,8 @@ export function InteractiveTutorialRoot(): React.ReactElement { content: ( <> - This is the script editor. You can use it to program your scripts. Copy and paste the following code into - the script editor:
    + This is the script editor. You can use it to program your scripts. Click this text to copy it and paste it + into the text editor:
    @@ -358,7 +354,7 @@ export function InteractiveTutorialRoot(): React.ReactElement { continuously hack the n00dles server.

    - To save and close the script editor, press the button in the bottom left, or press ctrl + s then ctrl + b. + To save and close the script editor, press the button at the bottom.
    ), @@ -458,7 +454,7 @@ export function InteractiveTutorialRoot(): React.ReactElement { - Tutorial + Documentation in the main navigation menu to look at the documentation. @@ -524,28 +520,20 @@ export function InteractiveTutorialRoot(): React.ReactElement { - Tutorial + Documentation ), canNext: false, }, - [iTutorialSteps.TutorialPageInfo as number]: { + [iTutorialSteps.DocumentationPageInfo as number]: { content: ( This page contains a lot of different documentation about the game's content and mechanics. I know it's a lot, but I highly suggest you read (or at least skim) through this before you start playing.

    - The{" "} - - Getting Started - {" "} - contains the guide for new players, navigating you through most of early game. + The Beginner's Guide contains the guide for new players, navigating you through most of early game.

    That's the end of the tutorial. Hope you enjoy the game! @@ -570,7 +558,7 @@ export function InteractiveTutorialRoot(): React.ReactElement { <> {content.content} - {step !== iTutorialSteps.TutorialPageInfo && ( + {step !== iTutorialSteps.DocumentationPageInfo && ( <> {step !== iTutorialSteps.Start && ( @@ -587,7 +575,7 @@ export function InteractiveTutorialRoot(): React.ReactElement {

    diff --git a/src/ui/MD/MD.tsx b/src/ui/MD/MD.tsx new file mode 100644 index 000000000..4149cbb87 --- /dev/null +++ b/src/ui/MD/MD.tsx @@ -0,0 +1,37 @@ +import React from "react"; +import ReactMarkdown from "react-markdown"; +import { TableHead } from "@mui/material"; +import remarkGfm from "remark-gfm"; +import { h1, h2, h3, h4, h5, h6, li, Td, Th, table, tr, Blockquote, p } from "./components"; +import { code, Pre } from "./code"; +import { A } from "./a"; + +export function MD(props: { md: string }): React.ReactElement { + return ( + + {props.md} + + ); +} diff --git a/src/ui/MD/a.tsx b/src/ui/MD/a.tsx new file mode 100644 index 000000000..7df82ac51 --- /dev/null +++ b/src/ui/MD/a.tsx @@ -0,0 +1,39 @@ +import React from "react"; +import { Link } from "@mui/material"; +import { useNavigator } from "../React/Documentation"; +import { CorruptableText } from "../React/CorruptableText"; +import { Player } from "@player"; + +export const isSpoiler = (title: string): boolean => title.includes("advanced/") && Player.sourceFileLvl(1) === 0; + +export const A = (props: React.PropsWithChildren<{ href?: string }>): React.ReactElement => { + const navigator = useNavigator(); + const ref = props.href ?? ""; + + const onClick = (event: React.MouseEvent) => { + navigator.navigate(ref, event.ctrlKey); + }; + if (ref.startsWith("http")) + return ( + + {props.children} + + ); + + if (isSpoiler(ref)) + return ( + + + + ); + return ( + + {props.children} + + ); +}; diff --git a/src/ui/MD/code.tsx b/src/ui/MD/code.tsx new file mode 100644 index 000000000..fd2334c75 --- /dev/null +++ b/src/ui/MD/code.tsx @@ -0,0 +1,56 @@ +import React from "react"; +import SyntaxHighlighter from "react-syntax-highlighter"; +import { monokaiSublime as theme } from "react-syntax-highlighter/dist/esm/styles/hljs"; +import { Theme } from "@mui/material/styles"; +import makeStyles from "@mui/styles/makeStyles"; +import createStyles from "@mui/styles/createStyles"; +import { CodeProps } from "react-markdown/lib/ast-to-react"; +import { Typography } from "@mui/material"; + +const useStyles = makeStyles((theme: Theme) => + createStyles({ + pre: { + borderRadius: "6px", + }, + code: { + paddingBottom: "2.72px", + paddingLeft: "5.44px", + paddingRight: "5.44px", + paddingTop: "2.72px", + borderRadius: "6px", + display: "inline", + backgroundColor: theme.palette.background.paper, + }, + }), +); + +export const Pre = (props: React.PropsWithChildren): React.ReactElement => { + const classes = useStyles(); + return ( + + {props.children} + + ); +}; + +const InlineCode = (props: React.PropsWithChildren): React.ReactElement => ( + + {props.children} + +); + +const BigCode = (props: React.PropsWithChildren): React.ReactElement => ( + + {String(props.children)} + +); + +export const code = (props: React.PropsWithChildren): React.ReactElement => + props.inline ? : ; diff --git a/src/ui/MD/components.tsx b/src/ui/MD/components.tsx new file mode 100644 index 000000000..2e138a4c7 --- /dev/null +++ b/src/ui/MD/components.tsx @@ -0,0 +1,115 @@ +import React from "react"; +import { Theme } from "@mui/material/styles"; +import makeStyles from "@mui/styles/makeStyles"; +import createStyles from "@mui/styles/createStyles"; +import { ListItemText, Table, TableCell, TableCellProps, TableRow, Typography } from "@mui/material"; +import { LiProps, TableDataCellProps, TableHeaderCellProps } from "react-markdown/lib/ast-to-react"; + +const useStyles = makeStyles((theme: Theme) => + createStyles({ + th: { whiteSpace: "pre", fontWeight: "bold" }, + td: { whiteSpace: "pre" }, + blockquote: { + borderLeftColor: theme.palette.background.paper, + borderLeftStyle: "solid", + borderLeftWidth: "4px", + paddingLeft: "16px", + paddingRight: "16px", + }, + }), +); + +export const h1 = (props: React.PropsWithChildren): React.ReactElement => ( + // We are just going to cheat and lower every h# by 1. + {props.children} +); + +export const h2 = (props: React.PropsWithChildren): React.ReactElement => ( + // We are just going to cheat and lower every h# by 1. + {props.children} +); + +export const h3 = (props: React.PropsWithChildren): React.ReactElement => ( + // We are just going to cheat and lower every h# by 1. + {props.children} +); + +export const h4 = (props: React.PropsWithChildren): React.ReactElement => ( + // We are just going to cheat and lower every h# by 1. + {props.children} +); + +export const h5 = (props: React.PropsWithChildren): React.ReactElement => ( + // We are just going to cheat and lower every h# by 1. + {props.children} +); + +export const h6 = (props: React.PropsWithChildren): React.ReactElement => ( + // Except for h6, that's going to stay h6. If there's complaints we'll figure it out. + {props.children} +); + +export const p = (props: React.PropsWithChildren): React.ReactElement => ( + {props.children} +); + +export const li = (props: React.PropsWithChildren): React.ReactElement => { + const prefix = props.ordered ? `${props.index + 1}. ` : "· "; + return ( + + {prefix} + {props.children} + + ); +}; + +// This function is needed because native td have different values for `align` than Mui TableCell. +// I really hate the implementation but I don't know how to get typescript to cooperate. +const fixAlign = (align: React.CSSProperties["textAlign"]): TableCellProps["align"] => { + if (align === "-moz-initial") return "inherit"; + if (align === "initial") return "inherit"; + if (align === "revert") return "inherit"; + if (align === "revert-layer") return "inherit"; + if (align === "unset") return "inherit"; + if (align === "end") return "inherit"; + if (align === "start") return "inherit"; + if (align === "match-parent") return "inherit"; + return align; +}; + +export const Td = (props: React.PropsWithChildren): React.ReactElement => { + const classes = useStyles(); + const align = fixAlign(props.style?.textAlign); + return ( + + + {props.children} + + + ); +}; + +export const Th = (props: React.PropsWithChildren): React.ReactElement => { + const classes = useStyles(); + const align = fixAlign(props.style?.textAlign); + return ( + + + {props.children} + + + ); +}; + +export const table = (props: React.PropsWithChildren): React.ReactElement => { + return {props.children}
    ; +}; + +export const tr = (props: React.PropsWithChildren): React.ReactElement => { + return {props.children}; +}; + +export const Blockquote = (props: React.PropsWithChildren): React.ReactElement => { + const classes = useStyles(); + return
    {props.children}
    ; +}; diff --git a/src/ui/MD/md_samples.ts b/src/ui/MD/md_samples.ts new file mode 100644 index 000000000..296166b03 --- /dev/null +++ b/src/ui/MD/md_samples.ts @@ -0,0 +1,59 @@ +// This file contains almost all features that markdown ever uses. It is split by section to be better able to test different features. +// This file isn't used at the moment but should be included when we verify that Markdown is rendered correctly. + +const headers = + "# Headers\r\n\r\n```\r\n# h1 Heading 8-)\r\n## h2 Heading\r\n### h3 Heading\r\n#### h4 Heading\r\n##### h5 Heading\r\n###### h6 Heading\r\n\r\nAlternatively, for H1 and H2, an underline-ish style:\r\n\r\nAlt-H1\r\n======\r\n\r\nAlt-H2\r\n------\r\n```\t\r\n\r\n# h1 Heading 8-)\r\n## h2 Heading\r\n### h3 Heading\r\n#### h4 Heading\r\n##### h5 Heading\r\n###### h6 Heading\r\n\r\nAlternatively, for H1 and H2, an underline-ish style:\r\n\r\nAlt-H1\r\n======\r\n\r\nAlt-H2\r\n------\r\n\r\n------\r\n\r\n"; +const emphasis = + "# Emphasis\r\n\r\n```\r\nEmphasis, aka italics, with *asterisks* or _underscores_.\r\n\r\nStrong emphasis, aka bold, with **asterisks** or __underscores__.\r\n\r\nCombined emphasis with **asterisks and _underscores_**.\r\n\r\nStrikethrough uses two tildes. ~~Scratch this.~~\r\n\r\n**This is bold text**\r\n\r\n__This is bold text__\r\n\r\n*This is italic text*\r\n\r\n_This is italic text_\r\n\r\n~~Strikethrough~~\r\n```\r\n\r\nEmphasis, aka italics, with *asterisks* or _underscores_.\r\n\r\nStrong emphasis, aka bold, with **asterisks** or __underscores__.\r\n\r\nCombined emphasis with **asterisks and _underscores_**.\r\n\r\nStrikethrough uses two tildes. ~~Scratch this.~~\r\n\r\n**This is bold text**\r\n\r\n__This is bold text__\r\n\r\n*This is italic text*\r\n\r\n_This is italic text_\r\n\r\n~~Strikethrough~~\r\n\r\n------\r\n\r\n"; + +const lists = + "# Lists\r\n\r\n```\r\n1. First ordered list item\r\n2. Another item\r\n\u22C5\u22C5* Unordered sub-list.\r\n1. Actual numbers don't matter, just that it's a number\r\n\u22C5\u22C51. Ordered sub-list\r\n4. And another item.\r\n\r\n\u22C5\u22C5\u22C5You can have properly indented paragraphs within list items. Notice the blank line above, and the leading spaces (at least one, but we'll use three here to also align the raw Markdown).\r\n\r\n\u22C5\u22C5\u22C5To have a line break without a paragraph, you will need to use two trailing spaces.\u22C5\u22C5\r\n\u22C5\u22C5\u22C5Note that this line is separate, but within the same paragraph.\u22C5\u22C5\r\n\u22C5\u22C5\u22C5(This is contrary to the typical GFM line break behaviour, where trailing spaces are not required.)\r\n\r\n* Unordered list can use asterisks\r\n- Or minuses\r\n+ Or pluses\r\n\r\n1. Make my changes\r\n 1. Fix bug\r\n 2. Improve formatting\r\n - Make the headings bigger\r\n2. Push my commits to GitHub\r\n3. Open a pull request\r\n * Describe my changes\r\n * Mention all the members of my team\r\n * Ask for feedback\r\n\r\n+ Create a list by starting a line with `+`, `-`, or `*`\r\n+ Sub-lists are made by indenting 2 spaces:\r\n - Marker character change forces new list start:\r\n * Ac tristique libero volutpat at\r\n + Facilisis in pretium nisl aliquet\r\n - Nulla volutpat aliquam velit\r\n+ Very easy!\r\n```\r\n\r\n1. First ordered list item\r\n2. Another item\r\n\u22C5\u22C5* Unordered sub-list.\r\n1. Actual numbers don't matter, just that it's a number\r\n\u22C5\u22C51. Ordered sub-list\r\n4. And another item.\r\n\r\n\u22C5\u22C5\u22C5You can have properly indented paragraphs within list items. Notice the blank line above, and the leading spaces (at least one, but we'll use three here to also align the raw Markdown).\r\n\r\n\u22C5\u22C5\u22C5To have a line break without a paragraph, you will need to use two trailing spaces.\u22C5\u22C5\r\n\u22C5\u22C5\u22C5Note that this line is separate, but within the same paragraph.\u22C5\u22C5\r\n\u22C5\u22C5\u22C5(This is contrary to the typical GFM line break behaviour, where trailing spaces are not required.)\r\n\r\n* Unordered list can use asterisks\r\n- Or minuses\r\n+ Or pluses\r\n\r\n1. Make my changes\r\n 1. Fix bug\r\n 2. Improve formatting\r\n - Make the headings bigger\r\n2. Push my commits to GitHub\r\n3. Open a pull request\r\n * Describe my changes\r\n * Mention all the members of my team\r\n * Ask for feedback\r\n\r\n+ Create a list by starting a line with `+`, `-`, or `*`\r\n+ Sub-lists are made by indenting 2 spaces:\r\n - Marker character change forces new list start:\r\n * Ac tristique libero volutpat at\r\n + Facilisis in pretium nisl aliquet\r\n - Nulla volutpat aliquam velit\r\n+ Very easy!\r\n\r\n------\r\n\r\n"; + +const taskLists = + "# Task lists\r\n\r\n```\r\n- [x] Finish my changes\r\n- [ ] Push my commits to GitHub\r\n- [ ] Open a pull request\r\n- [x] @mentions, #refs, [links](), **formatting**, and tags supported\r\n- [x] list syntax required (any unordered or ordered list supported)\r\n- [x] this is a complete item\r\n- [ ] this is an incomplete item\r\n```\r\n\r\n- [x] Finish my changes\r\n- [ ] Push my commits to GitHub\r\n- [ ] Open a pull request\r\n- [x] @mentions, #refs, [links](), **formatting**, and tags supported\r\n- [x] list syntax required (any unordered or ordered list supported)\r\n- [ ] this is a complete item\r\n- [ ] this is an incomplete item\r\n\r\n------\r\n\r\n"; + +const ignoringMarkdownFormatting = + "# Ignoring Markdown formatting\r\n\r\nYou can tell GitHub to ignore (or escape) Markdown formatting by using \\ before the Markdown character.\r\n\r\n```\r\nLet's rename \\*our-new-project\\* to \\*our-old-project\\*.\r\n```\r\n\r\nLet's rename \\*our-new-project\\* to \\*our-old-project\\*.\r\n\r\n------\r\n\r\n"; +const links = + "# Links\r\n\r\n```\r\n[I'm an inline-style link](https://www.google.com)\r\n\r\n[I'm an inline-style link with title](https://www.google.com \"Google's Homepage\")\r\n\r\n[I'm a reference-style link][Arbitrary case-insensitive reference text]\r\n\r\n[I'm a relative reference to a repository file](../blob/master/LICENSE)\r\n\r\n[You can use numbers for reference-style link definitions][1]\r\n\r\nOr leave it empty and use the [link text itself].\r\n\r\nURLs and URLs in angle brackets will automatically get turned into links.\r\nhttp://www.example.com or and sometimes\r\nexample.com (but not on Github, for example).\r\n\r\nSome text to show that the reference links can follow later.\r\n\r\n[arbitrary case-insensitive reference text]: https://www.mozilla.org\r\n[1]: http://slashdot.org\r\n[link text itself]: http://www.reddit.com\r\n```\r\n\r\n[I'm an inline-style link](https://www.google.com)\r\n\r\n[I'm an inline-style link with title](https://www.google.com \"Google's Homepage\")\r\n\r\n[I'm a reference-style link][Arbitrary case-insensitive reference text]\r\n\r\n[I'm a relative reference to a repository file](../blob/master/LICENSE)\r\n\r\n[You can use numbers for reference-style link definitions][1]\r\n\r\nOr leave it empty and use the [link text itself].\r\n\r\nURLs and URLs in angle brackets will automatically get turned into links.\r\nhttp://www.example.com or and sometimes\r\nexample.com (but not on Github, for example).\r\n\r\nSome text to show that the reference links can follow later.\r\n\r\n[arbitrary case-insensitive reference text]: https://www.mozilla.org\r\n[1]: http://slashdot.org\r\n[link text itself]: http://www.reddit.com\r\n\r\n------\r\n\r\n"; + +const images = + '# Images\r\n\r\n```\r\nHere\'s our logo (hover to see the title text):\r\n\r\nInline-style:\r\n![alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 1")\r\n\r\nReference-style:\r\n![alt text][logo]\r\n\r\n[logo]: https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 2"\r\n\r\n![Minion](https://octodex.github.com/images/minion.png)\r\n![Stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat")\r\n\r\nLike links, Images also have a footnote style syntax\r\n\r\n![Alt text][id]\r\n\r\nWith a reference later in the document defining the URL location:\r\n\r\n[id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat"\r\n```\r\n\r\nHere\'s our logo (hover to see the title text):\r\n\r\nInline-style:\r\n![alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 1")\r\n\r\nReference-style:\r\n![alt text][logo]\r\n\r\n[logo]: https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 2"\r\n\r\n![Minion](https://octodex.github.com/images/minion.png)\r\n![Stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat")\r\n\r\nLike links, Images also have a footnote style syntax\r\n\r\n![Alt text][id]\r\n\r\nWith a reference later in the document defining the URL location:\r\n\r\n[id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat"\r\n\r\n------\r\n\r\n'; +const footnotes = + "# [Footnotes](https://github.com/markdown-it/markdown-it-footnote)\r\n\r\n```\r\nFootnote 1 link[^first].\r\n\r\nFootnote 2 link[^second].\r\n\r\nInline footnote^[Text of inline footnote] definition.\r\n\r\nDuplicated footnote reference[^second].\r\n\r\n[^first]: Footnote **can have markup**\r\n\r\n and multiple paragraphs.\r\n\r\n[^second]: Footnote text.\r\n```\r\n\r\nFootnote 1 link[^first].\r\n\r\nFootnote 2 link[^second].\r\n\r\nInline footnote^[Text of inline footnote] definition.\r\n\r\nDuplicated footnote reference[^second].\r\n\r\n[^first]: Footnote **can have markup**\r\n\r\n and multiple paragraphs.\r\n\r\n[^second]: Footnote text.\r\n\r\n------\r\n\r\n"; + +const codeAndSyntaxHighlighing = + "# Code and Syntax Highlighting\r\n\r\n```\r\nInline `code` has `back-ticks around` it.\r\n```\r\n\r\nInline `code` has `back-ticks around` it.\r\n\r\n```javascript\r\nfunction $initHighlight(block, cls) {\r\n try {\r\n if (cls.search(/\\bno\\-highlight\\b/) != -1)\r\n return process(block, true, 0x0F) +\r\n ` class=\"${cls}\"`;\r\n } catch (e) {\r\n /* handle exception */\r\n }\r\n for (var i = 0 / 2; i < classes.length; i++) {\r\n if (checkCondition(classes[i]) === undefined)\r\n console.log('undefined');\r\n }\r\n}\r\n\r\nexport $initHighlight;\r\n```\r\n\r\n------\r\n\r\n"; + +const table = + "# Tables\r\n\r\n```\r\nColons can be used to align columns.\r\n\r\n| Tables | Are | Cool |\r\n| ------------- |:-------------:| -----:|\r\n| col 3 is | right-aligned | $1600 |\r\n| col 2 is | centered | $12 |\r\n| zebra stripes | are neat | $1 |\r\n\r\nThere must be at least 3 dashes separating each header cell.\r\nThe outer pipes (|) are optional, and you don't need to make the\r\nraw Markdown line up prettily. You can also use inline Markdown.\r\n\r\nMarkdown | Less | Pretty\r\n--- | --- | ---\r\n*Still* | `renders` | **nicely**\r\n1 | 2 | 3\r\n\r\n| First Header | Second Header |\r\n| ------------- | ------------- |\r\n| Content Cell | Content Cell |\r\n| Content Cell | Content Cell |\r\n\r\n| Command | Description |\r\n| --- | --- |\r\n| git status | List all new or modified files |\r\n| git diff | Show file differences that haven't been staged |\r\n\r\n| Command | Description |\r\n| --- | --- |\r\n| `git status` | List all *new or modified* files |\r\n| `git diff` | Show file differences that **haven't been** staged |\r\n\r\n| Left-aligned | Center-aligned | Right-aligned |\r\n| :--- | :---: | ---: |\r\n| git status | git status | git status |\r\n| git diff | git diff | git diff |\r\n\r\n| Name | Character |\r\n| --- | --- |\r\n| Backtick | ` |\r\n| Pipe | \\| |\r\n```\r\n\r\nColons can be used to align columns.\r\n\r\n| Tables | Are | Cool |\r\n| ------------- |:-------------:| -----:|\r\n| col 3 is | right-aligned | $1600 |\r\n| col 2 is | centered | $12 |\r\n| zebra stripes | are neat | $1 |\r\n\r\nThere must be at least 3 dashes separating each header cell.\r\nThe outer pipes (|) are optional, and you don't need to make the\r\nraw Markdown line up prettily. You can also use inline Markdown.\r\n\r\nMarkdown | Less | Pretty\r\n--- | --- | ---\r\n*Still* | `renders` | **nicely**\r\n1 | 2 | 3\r\n\r\n| First Header | Second Header |\r\n| ------------- | ------------- |\r\n| Content Cell | Content Cell |\r\n| Content Cell | Content Cell |\r\n\r\n| Command | Description |\r\n| --- | --- |\r\n| git status | List all new or modified files |\r\n| git diff | Show file differences that haven't been staged |\r\n\r\n| Command | Description |\r\n| --- | --- |\r\n| `git status` | List all *new or modified* files |\r\n| `git diff` | Show file differences that **haven't been** staged |\r\n\r\n| Left-aligned | Center-aligned | Right-aligned |\r\n| :--- | :---: | ---: |\r\n| git status | git status | git status |\r\n| git diff | git diff | git diff |\r\n\r\n| Name | Character |\r\n| --- | --- |\r\n| Backtick | ` |\r\n| Pipe | \\| |\r\n\r\n------\r\n\r\n"; + +const Blockquotes = + "# Blockquotes\r\n\r\n```\r\n> Blockquotes are very handy in email to emulate reply text.\r\n> This line is part of the same quote.\r\n\r\nQuote break.\r\n\r\n> This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can *put* **Markdown** into a blockquote.\r\n\r\n> Blockquotes can also be nested...\r\n>> ...by using additional greater-than signs right next to each other...\r\n> > > ...or with spaces between arrows.\r\n```\r\n\r\n> Blockquotes are very handy in email to emulate reply text.\r\n> This line is part of the same quote.\r\n\r\nQuote break.\r\n\r\n> This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can *put* **Markdown** into a blockquote.\r\n\r\n> Blockquotes can also be nested...\r\n>> ...by using additional greater-than signs right next to each other...\r\n> > > ...or with spaces between arrows.\r\n\r\n------\r\n\r\n"; + +const inlineHTML = + "# Inline HTML\r\n\r\n```\r\n
    \r\n
    Definition list
    \r\n
    Is something people use sometimes.
    \r\n\r\n
    Markdown in HTML
    \r\n
    Does *not* work **very** well. Use HTML tags.
    \r\n
    \r\n```\r\n\r\n
    \r\n
    Definition list
    \r\n
    Is something people use sometimes.
    \r\n\r\n
    Markdown in HTML
    \r\n
    Does *not* work **very** well. Use HTML tags.
    \r\n
    \r\n\r\n------\r\n\r\n"; + +const horizontalRules = + "# Horizontal Rules\r\n\r\n```\r\nThree or more...\r\n\r\n---\r\n\r\nHyphens\r\n\r\n***\r\n\r\nAsterisks\r\n\r\n___\r\n\r\nUnderscores\r\n```\r\n\r\nThree or more...\r\n\r\n---\r\n\r\nHyphens\r\n\r\n***\r\n\r\nAsterisks\r\n\r\n___\r\n\r\nUnderscores\r\n\r\n------\r\n\r\n"; + +const YoutubeVideos = + '# YouTube Videos\r\n\r\n```\r\n\r\nIMAGE ALT TEXT HERE\r\n\r\n```\r\n\r\n\r\nIMAGE ALT TEXT HERE\r\n\r\n\r\n```\r\n[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/YOUTUBE_VIDEO_ID_HERE/0.jpg)](http://www.youtube.com/watch?v=YOUTUBE_VIDEO_ID_HERE)\r\n```\r\n\r\n[![IMAGE ALT TEXT HERE](https://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/YouTube_logo_2015.svg/1200px-YouTube_logo_2015.svg.png)](https://www.youtube.com/watch?v=ciawICBvQoE)'; + +const all = + headers + + emphasis + + lists + + taskLists + + ignoringMarkdownFormatting + + links + + images + + footnotes + + codeAndSyntaxHighlighing + + table + + Blockquotes + + inlineHTML + + horizontalRules + + YoutubeVideos; + +export const markdownSample = all; diff --git a/src/ui/React/Documentation.tsx b/src/ui/React/Documentation.tsx new file mode 100644 index 000000000..a3851bf07 --- /dev/null +++ b/src/ui/React/Documentation.tsx @@ -0,0 +1,71 @@ +import React, { useContext, useState } from "react"; + +interface Navigator { + navigate: (s: string, external: boolean) => void; +} + +export const Navigator = React.createContext({ navigate: () => undefined }); + +export const useNavigator = (): Navigator => useContext(Navigator); + +interface History { + pages: string[]; + page: string; + push(p: string): void; + pop(): void; + home(): void; +} + +const defaultPage = "index.md"; + +const HistoryContext = React.createContext({ + page: "", + pages: [], + push: () => undefined, + pop: () => undefined, + home: () => undefined, +}); + +export const Provider = HistoryContext.Provider; +export const useHistory = (): History => useContext(HistoryContext); + +const onPush = (h: History, p: string): History => { + return { + ...h, + page: p, + pages: [...h.pages, h.page], + }; +}; + +const onPop = (h: History): History => { + const page = h.pages.pop() ?? defaultPage; + return { + ...h, + page: page, + }; +}; + +const onHome = (h: History): History => { + return { + ...h, + page: defaultPage, + pages: [], + }; +}; + +export const HistoryProvider = (props: React.PropsWithChildren): React.ReactElement => { + const [history, setHistory] = useState({ + page: defaultPage, + pages: [], + push(p: string) { + setHistory((h) => onPush(h, p)); + }, + pop() { + setHistory((h) => onPop(h)); + }, + home() { + setHistory((h) => onHome(h)); + }, + }); + return {props.children}; +}; diff --git a/src/ui/Router.ts b/src/ui/Router.ts index 4c6b3bcd4..237cee763 100644 --- a/src/ui/Router.ts +++ b/src/ui/Router.ts @@ -28,7 +28,7 @@ export enum SimplePage { StockMarket = "Stock Market", Terminal = "Terminal", Travel = "Travel", - Tutorial = "Tutorial", + Documentation = "Documentation", Work = "Work", BladeburnerCinematic = "Bladeburner Cinematic", Loading = "Loading", diff --git a/tools/bundle-doc/index.js b/tools/bundle-doc/index.js new file mode 100644 index 000000000..2583f5b69 --- /dev/null +++ b/tools/bundle-doc/index.js @@ -0,0 +1,35 @@ +const fs = require("fs"); + +const files = []; +const docRoot = "./src/Documentation/ui/doc"; +const processDir = (dir) => { + console.log(dir); + for (const file of fs.readdirSync(dir)) { + const path = `${dir}/${file}`; + if (fs.lstatSync(`${dir}/${file}`).isDirectory()) { + processDir(path); + continue; + } + if (path.startsWith(docRoot + "/")) { + files.push(path.slice(docRoot.length + 1)); + } + } +}; +processDir(docRoot); + +const autogenfile = `// THIS FILE IS AUTOGENERATED +${files.map((f, i) => `import file${i} from "!!raw-loader!./doc/${f}";`).join("\n")} + +interface Document { + default: string; +} +export const AllPages: Record = {}; +${files.map((f, i) => `AllPages["${f}"] = file${i};`).join("\n")} +`; + +fs.writeFile(docRoot + "/../pages.ts", autogenfile, (err) => { + if (err) { + console.error(err); + } + // file written successfully +});