diff --git a/css/interactivetutorial.scss b/css/interactivetutorial.scss
index e3f7a58a5..f6e0cebe4 100644
--- a/css/interactivetutorial.scss
+++ b/css/interactivetutorial.scss
@@ -69,3 +69,22 @@
float: right;
padding: 4px;
}
+
+.interactive-tutorial-command {
+ background-color: #000;
+ color: $hacker-green;
+ white-space: nowrap;
+}
+
+.interactive-tutorial-code {
+ background-color: #272822;
+ color: white;
+ padding: 3px;
+}
+
+.interactive-tutorial-tab {
+ background-color: #555;
+ color: #e6e6e6;
+ padding: 3px;
+ box-shadow: 0 0 3px #000;
+}
\ No newline at end of file
diff --git a/src/InteractiveTutorial.js b/src/InteractiveTutorial.js
index a8e93b71f..8f5dc12fe 100644
--- a/src/InteractiveTutorial.js
+++ b/src/InteractiveTutorial.js
@@ -11,7 +11,6 @@ import { createElement } from "../utils/uiHelpers/createElement";
import { createPopup } from "../utils/uiHelpers/createPopup";
import { removeElementById } from "../utils/uiHelpers/removeElementById";
-
// Ordered array of keys to Interactive Tutorial Steps
const orderedITutorialSteps = [
"Start",
@@ -24,10 +23,10 @@ const orderedITutorialSteps = [
"TerminalScan", // Using 'scan' Terminal command
"TerminalScanAnalyze1", // Using 'scan-analyze' Terminal command
"TerminalScanAnalyze2", // Using 'scan-analyze 3' Terminal command
- "TerminalConnect", // Connecting to foodnstuff
- "TerminalAnalyze", // Analyzing foodnstuff
- "TerminalNuke", // NUKE foodnstuff
- "TerminalManualHack", // Hack foodnstuff
+ "TerminalConnect", // Connecting to n00dles
+ "TerminalAnalyze", // Analyzing n00dles
+ "TerminalNuke", // NUKE n00dles
+ "TerminalManualHack", // Hack n00dles
"TerminalHackingMechanics", // Explanation of hacking mechanics
"TerminalCreateScript", // Create a script using 'nano'
"TerminalTypeScript", // Script Editor page - Type script and then save & close
@@ -51,7 +50,7 @@ for (let i = 0; i < orderedITutorialSteps.length; ++i) {
iTutorialSteps[orderedITutorialSteps[i]] = i;
}
-var ITutorial = {
+const ITutorial = {
currStep: 0, // iTutorialSteps.Start
isRunning: false,
@@ -76,21 +75,21 @@ function iTutorialStart() {
document.getElementById("interactive-tutorial-container").style.display = "block";
// Exit tutorial button
- var exitButton = clearEventListeners("interactive-tutorial-exit");
+ const exitButton = clearEventListeners("interactive-tutorial-exit");
exitButton.addEventListener("click", function() {
iTutorialEnd();
return false;
});
// Back button
- var backButton = clearEventListeners("interactive-tutorial-back");
+ const backButton = clearEventListeners("interactive-tutorial-back");
backButton.addEventListener("click", function() {
iTutorialPrevStep();
return false;
});
// Next button
- var nextButton = clearEventListeners("interactive-tutorial-next");
+ const nextButton = clearEventListeners("interactive-tutorial-next");
nextButton.addEventListener("click", function() {
iTutorialNextStep();
return false;
@@ -103,12 +102,12 @@ function iTutorialEvaluateStep() {
if (!ITutorial.isRunning) {return;}
// Disable and clear main menu
- var terminalMainMenu = clearEventListeners("terminal-menu-link");
- var statsMainMenu = clearEventListeners("stats-menu-link");
- var activeScriptsMainMenu = clearEventListeners("active-scripts-menu-link");
- var hacknetMainMenu = clearEventListeners("hacknet-nodes-menu-link");
- var cityMainMenu = clearEventListeners("city-menu-link");
- var tutorialMainMenu = clearEventListeners("tutorial-menu-link");
+ const terminalMainMenu = clearEventListeners("terminal-menu-link");
+ const statsMainMenu = clearEventListeners("stats-menu-link");
+ const activeScriptsMainMenu = clearEventListeners("active-scripts-menu-link");
+ const hacknetMainMenu = clearEventListeners("hacknet-nodes-menu-link");
+ const cityMainMenu = clearEventListeners("city-menu-link");
+ const tutorialMainMenu = clearEventListeners("tutorial-menu-link");
terminalMainMenu.removeAttribute("class");
statsMainMenu.removeAttribute("class");
activeScriptsMainMenu.removeAttribute("class");
@@ -117,20 +116,20 @@ function iTutorialEvaluateStep() {
tutorialMainMenu.removeAttribute("class");
// Interactive Tutorial Next button
- var nextBtn = document.getElementById("interactive-tutorial-next");
+ const nextBtn = document.getElementById("interactive-tutorial-next");
switch(ITutorial.currStep) {
case iTutorialSteps.Start:
Engine.loadTerminalContent();
iTutorialSetText("Welcome to Bitburner, a cyberpunk-themed incremental RPG! " +
- "The game takes place in a dark, dystopian future...The year is 2077...
" +
+ "The game takes place in a dark, dystopian future... The year is 2077...
" +
"This tutorial will show you the basics of the game. " +
"You may skip the tutorial at any time.");
nextBtn.style.display = "inline-block";
break;
case iTutorialSteps.GoToCharacterPage:
Engine.loadTerminalContent();
- iTutorialSetText("Let's start by heading to the Stats page. Click the 'Stats' tab on " +
+ iTutorialSetText("Let's start by heading to the Stats page. Click the Stats
tab on " +
"the main navigation menu (left-hand side of the screen)");
nextBtn.style.display = "none";
@@ -144,13 +143,13 @@ function iTutorialEvaluateStep() {
break;
case iTutorialSteps.CharacterPage:
Engine.loadCharacterContent();
- iTutorialSetText("The Stats page shows a lot of important information about your progress, " +
- "such as your skills, money, and bonuses/multipliers. ")
+ iTutorialSetText("The Stats
page shows a lot of important information about your progress, " +
+ "such as your skills, money, and bonuses. ")
nextBtn.style.display = "inline-block";
break;
case iTutorialSteps.CharacterGoToTerminalPage:
Engine.loadCharacterContent();
- iTutorialSetText("Let's head to your computer's terminal by clicking the 'Terminal' tab on the " +
+ iTutorialSetText("Let's head to your computer's terminal by clicking the Terminal
tab on the " +
"main navigation menu.");
nextBtn.style.display = "none";
@@ -164,57 +163,56 @@ function iTutorialEvaluateStep() {
break;
case iTutorialSteps.TerminalIntro:
Engine.loadTerminalContent();
- iTutorialSetText("The Terminal is used to interface with your home computer as well as " +
+ iTutorialSetText("The Terminal
is used to interface with your home computer as well as " +
"all of the other machines around the world.");
nextBtn.style.display = "inline-block";
break;
case iTutorialSteps.TerminalHelp:
Engine.loadTerminalContent();
- iTutorialSetText("Let's try it out. Start by entering the 'help' command into the Terminal " +
+ iTutorialSetText("Let's try it out. Start by entering the help
command into the Terminal
" +
"(Don't forget to press Enter after typing the command)");
nextBtn.style.display = "none"; // next step triggered by terminal command
break;
case iTutorialSteps.TerminalLs:
Engine.loadTerminalContent();
- iTutorialSetText("The 'help' command displays a list of all available Terminal commands, how to use them, " +
- "and a description of what they do.
Let's try another command. Enter the 'ls' command");
+ iTutorialSetText("The help
command displays a list of all available Terminal
commands, how to use them, " +
+ "and a description of what they do.
Let's try another command. Enter the ls
command.");
nextBtn.style.display = "none"; // next step triggered by terminal command
break;
case iTutorialSteps.TerminalScan:
Engine.loadTerminalContent();
- iTutorialSetText("'ls' is a basic command that shows all of the contents (programs/scripts) " +
- "on the computer. Right now, it shows that you have a program called 'NUKE.exe' on your computer. " +
+ iTutorialSetText(" ls
is a basic command that shows files " +
+ "on the computer. Right now, it shows that you have a program called NUKE.exe
on your computer. " +
"We'll get to what this does later.
Using your home computer's terminal, you can connect " +
"to other machines throughout the world. Let's do that now by first entering " +
- "the 'scan' command.");
+ "the scan
command.");
nextBtn.style.display = "none"; // next step triggered by terminal command
break;
case iTutorialSteps.TerminalScanAnalyze1:
Engine.loadTerminalContent();
- iTutorialSetText("The 'scan' command shows all available network connections. In other words, " +
+ iTutorialSetText("The scan
command shows all available network connections. In other words, " +
"it displays a list of all servers that can be connected to from your " +
- "current machine. A server is identified by either its IP or its hostname.
" +
+ "current machine. A server is identified by its hostname.
" +
"That's great and all, but there's so many servers. Which one should you go to? " +
- "The 'scan-analyze' command gives some more detailed information about servers on the " +
- "network. Try it now");
+ "The scan-analyze
command gives some more detailed information about servers on the " +
+ "network. Try it now!");
nextBtn.style.display = "none"; // next step triggered by terminal command
break;
case iTutorialSteps.TerminalScanAnalyze2:
Engine.loadTerminalContent();
- iTutorialSetText("You just ran 'scan-analyze' with a depth of one. This command shows more detailed " +
+ iTutorialSetText("You just ran scan-analyze
with a depth of one. This command shows more detailed " +
"information about each server that you can connect to (servers that are a distance of " +
- "one node away).
It is also possible to run 'scan-analyze' with " +
- "a higher depth. Let's try a depth of two with the following command: 'scan-analyze 2'.")
+ "one node away).
It is also possible to run scan-analyze
with " +
+ "a higher depth. Let's try a depth of two with the following command: scan-analyze 2
.")
nextBtn.style.display = "none"; // next step triggered by terminal command
break;
case iTutorialSteps.TerminalConnect:
Engine.loadTerminalContent();
iTutorialSetText("Now you can see information about all servers that are up to two nodes away, as well " +
"as figure out how to navigate to those servers through the network. You can only connect to " +
- "a server that is one node away. To connect to a machine, use the 'connect [ip/hostname]' command. You can type in " +
- "the ip or the hostname, but dont use both.
" +
- "From the results of the 'scan-analyze' command, we can see that the 'foodnstuff' server is " +
- "only one node away. Let's connect so it now using: 'connect foodnstuff'");
+ "a server that is one node away. To connect to a machine, use the connect [hostname]
command.
" +
+ "From the results of the scan-analyze
command, we can see that the n00dles
server is " +
+ "only one node away. Let's connect so it now using: connect n00dles
");
nextBtn.style.display = "none"; // next step triggered by terminal command
break;
case iTutorialSteps.TerminalAnalyze:
@@ -223,30 +221,30 @@ function iTutorialEvaluateStep() {
"become digital and decentralized. People and corporations store their money " +
"on servers and computers. Using your hacking abilities, you can hack servers " +
"to steal money and gain experience.
" +
- "Before you try to hack a server, you should run diagnostics using the 'analyze' command");
+ "Before you try to hack a server, you should run diagnostics using the analyze
command.");
nextBtn.style.display = "none"; // next step triggered by terminal command
break;
case iTutorialSteps.TerminalNuke:
Engine.loadTerminalContent();
- iTutorialSetText("When the 'analyze' command finishes running it will show useful information " +
- "about hacking the server.
For this server, the required hacking skill is only 1, " +
+ iTutorialSetText("When the analyze
command finishes running it will show useful information " +
+ "about hacking the server.
For this server, the required hacking skill is only 1, " +
"which means you can hack it right now. However, in order to hack a server " +
- "you must first gain root access. The 'NUKE.exe' program that we saw earlier on your " +
+ "you must first gain root access. The NUKE.exe
program that we saw earlier on your " +
"home computer is a virus that will grant you root access to a machine if there are enough " +
- "open ports.
The 'analyze' results shows that there do not need to be any open ports " +
+ "open ports.
The analyze
results shows that there do not need to be any open ports " +
"on this machine for the NUKE virus to work, so go ahead and run the virus using the " +
- "'run NUKE.exe' command.");
+ "run NUKE.exe
command.");
nextBtn.style.display = "none"; // next step triggered by terminal command
break;
case iTutorialSteps.TerminalManualHack:
Engine.loadTerminalContent();
- iTutorialSetText("You now have root access! You can hack the server using the 'hack' command. " +
+ iTutorialSetText("You now have root access! You can hack the server using the hack
command. " +
"Try doing that now.");
nextBtn.style.display = "none"; // next step triggered by terminal command
break;
case iTutorialSteps.TerminalHackingMechanics:
Engine.loadTerminalContent();
- iTutorialSetText("You are now attempting to hack the server. Note that performing a hack takes time and " +
+ iTutorialSetText("You are now attempting to hack the server. Performing a hack takes time and " +
"only has a certain percentage chance " +
"of success. This time and success chance is determined by a variety of factors, including " +
"your hacking skill and the server's security level.
" +
@@ -261,25 +259,22 @@ function iTutorialEvaluateStep() {
Engine.loadTerminalContent();
iTutorialSetText("Hacking is the core mechanic of the game and is necessary for progressing. However, " +
"you don't want to be hacking manually the entire time. You can automate your hacking " +
- "by writing scripts!
To create a new script or edit an existing one, you can use the 'nano' " +
- "command. Scripts must end with the '.script' extension. Let's make a script now by " +
- "entering 'nano foodnstuff.script' after the hack command finishes running (Sidenote: Pressing ctrl + c" +
+ "by writing scripts!
To create a new script or edit an existing one, you can use the nano
" +
+ "command. Scripts must end with the .script
extension. Let's make a script now by " +
+ "entering nano n00dles.script
after the hack command finishes running (Sidenote: Pressing ctrl + c" +
" will end a command like hack early)");
nextBtn.style.display = "none"; // next step triggered by terminal command
break;
case iTutorialSteps.TerminalTypeScript:
- Engine.loadScriptEditorContent("foodnstuff.script", "");
+ Engine.loadScriptEditorContent("n00dles.script", "");
iTutorialSetText("This is the script editor. You can use it to program your scripts. Scripts are " +
- "written in the Netscript language, a programming language created for " +
- "this game. There are details about the Netscript language in the documentation, which " +
- "can be accessed in the 'Tutorial' tab on the main navigation menu. I highly suggest you check " +
- "it out after this tutorial. For now, just copy " +
- "and paste the following code into the script editor:
" +
- "while(true) {
" +
- " hack('foodnstuff');
" +
- "}
" +
+ "written in a simplified version of javascript. Copy and paste the following code into the script editor:
" +
+ "
" + + "while(true) {\n" + + " hack('n00dles');\n" + + "}" + "For anyone with basic programming experience, this code should be straightforward. " + - "This script will continuously hack the 'foodnstuff' server.
n00dles
server.free
command.");
nextBtn.style.display = "none"; // next step triggered by terminal commmand
break;
case iTutorialSteps.TerminalRunScript:
Engine.loadTerminalContent();
iTutorialSetText("We have 16GB of free RAM on this machine, which is enough to run our " +
- "script. Let's run our script using 'run foodnstuff.script'.");
+ "script. Let's run our script using run n00dles.script
.");
nextBtn.style.display = "none"; // next step triggered by terminal commmand
break;
case iTutorialSteps.TerminalGoToActiveScriptsPage:
Engine.loadTerminalContent();
- iTutorialSetText("Your script is now running! The script might take a few seconds to 'fully start up'. " +
- "Your scripts will continuously run in the background and will automatically stop if " +
- "the code ever completes (the 'foodnstuff.script' will never complete because it " +
+ iTutorialSetText("Your script is now running! " +
+ "It will continuously run in the background and will automatically stop if " +
+ "the code ever completes (the n00dles.script
will never complete because it " +
"runs an infinite loop). Active Scripts
link in the main navigation menu.");
nextBtn.style.display = "none";
// Flash 'Active Scripts' menu and set its tutorial click handler
@@ -319,10 +314,9 @@ function iTutorialEvaluateStep() {
break;
case iTutorialSteps.ActiveScriptsPage:
Engine.loadActiveScriptsContent();
- iTutorialSetText("This page displays stats/information about all of your scripts that are " +
- "running across every existing server. You can use this to gauge how well " +
- "your scripts are doing. Let's go back to the Terminal now using the 'Terminal' " +
- "link.");
+ iTutorialSetText("This page displays information about all of your scripts that are " +
+ "running across every server. You can use this to gauge how well " +
+ "your scripts are doing. Let's go back to the Terminal
");
nextBtn.style.display = "none";
// Flash 'Terminal' button and set its tutorial click handler
@@ -336,27 +330,27 @@ function iTutorialEvaluateStep() {
case iTutorialSteps.ActiveScriptsToTerminal:
Engine.loadTerminalContent();
iTutorialSetText("One last thing about scripts, each active script contains logs that detail " +
- "what it's doing. We can check these logs using the 'tail' command. Do that " +
- "now for the script we just ran by typing 'tail foodnstuff.script'");
+ "what it's doing. We can check these logs using the tail
command. Do that " +
+ "now for the script we just ran by typing tail n00dles.script
");
nextBtn.style.display = "none"; // next step triggered by terminal command
break;
case iTutorialSteps.TerminalTailScript:
Engine.loadTerminalContent();
iTutorialSetText("The log for this script won't show much right now (it might show nothing at all) because it " +
"just started running...but check back again in a few minutes! Tutorial
link in the " +
"main navigation menu to look at the documentation. " +
"If you are an experienced JavaScript " +
"developer, I would highly suggest you check out the section on " +
- "NetscriptJS/Netscript 2.0.Hacknet
page through the main navigation menu now.");
nextBtn.style.display = "none";
// Flash 'Hacknet' menu and set its tutorial click handler
@@ -369,7 +363,7 @@ function iTutorialEvaluateStep() {
break;
case iTutorialSteps.HacknetNodesIntroduction:
Engine.loadHacknetNodesContent();
- iTutorialSetText("From this page you can purchase new Hacknet Nodes and upgrade your " +
+ iTutorialSetText("here you can purchase new Hacknet Nodes and upgrade your " +
"existing ones. Let's purchase a new one now.");
nextBtn.style.display = "none"; // Next step triggered by purchaseHacknet() (HacknetNode.js)
break;
@@ -379,7 +373,7 @@ function iTutorialEvaluateStep() {
"earn you money over time, both online and offline. When you get enough " +
" money, you can upgrade " +
"your newly-purchased Hacknet Node below.City
page through the main navigation menu.");
nextBtn.style.display = "none";
// Flash 'City' menu and set its tutorial click handler
@@ -396,7 +390,7 @@ function iTutorialEvaluateStep() {
"travel to. Each location has something that you can do. " +
"There's a lot of content out in the world, make sure " +
"you explore and discover!Tutorial
link in the main navigation menu.");
nextBtn.style.display = "none";
// Flash 'Tutorial' menu and set its tutorial click handler
@@ -493,8 +487,8 @@ function iTutorialEnd() {
document.getElementById("interactive-tutorial-container").style.display = "none";
// Create a popup with final introductory stuff
- var popupId = "interactive-tutorial-ending-popup";
- var txt = createElement("p", {
+ const popupId = "interactive-tutorial-ending-popup";
+ const txt = createElement("p", {
innerHTML:
"If you are new to the game, the following links may be useful for you!