streamline programs

This commit is contained in:
Olivier Gagnon
2018-06-01 19:31:34 -04:00
parent 496ea728d0
commit aa56227851
9 changed files with 217 additions and 363 deletions
+128 -230
View File
@@ -2,138 +2,127 @@ import {CONSTANTS} from "./Constants.js";
import {Player} from "./Player.js";
import {createElement} from "../utils/HelperFunctions.js";
// a function that returns a requirement for a program that requires only that
// the player has at least the given skill level.
function requireLevel(lvl) {
return function() {
return Player.hacking_skill >= lvl;
}
}
function Program(name, create) {
this.name = name;
this.create = create;
}
Program.prototype.htmlID = function() {
const name = this.name.endsWith('.exe') ? this.name.slice(0, -('.exe'.length)) : this.name;
return "create-program-"+name;
}
/* Create programs */
let Programs = {
NukeProgram: "NUKE.exe",
BruteSSHProgram: "BruteSSH.exe",
FTPCrackProgram: "FTPCrack.exe",
RelaySMTPProgram: "relaySMTP.exe",
HTTPWormProgram: "HTTPWorm.exe",
SQLInjectProgram: "SQLInject.exe",
DeepscanV1: "DeepscanV1.exe",
DeepscanV2: "DeepscanV2.exe",
ServerProfiler: "ServerProfiler.exe",
AutoLink: "AutoLink.exe",
Flight: "fl1ght.exe",
BitFlume: "b1t_flum3.exe"
const Programs = {
NukeProgram: new Program("NUKE.exe", {
level: 1,
tooltip:"This virus is used to gain root access to a machine if enough ports are opened.",
req: requireLevel(1),
time: CONSTANTS.MillisecondsPerFiveMinutes,
}),
BruteSSHProgram: new Program("BruteSSH.exe", {
level: 50,
tooltip:"This program executes a brute force attack that opens SSH ports",
req: requireLevel(50),
time: CONSTANTS.MillisecondsPerFiveMinutes * 2,
}),
FTPCrackProgram: new Program("FTPCrack.exe", {
level: 100,
tooltip:"This program cracks open FTP ports",
req: requireLevel(100),
time: CONSTANTS.MillisecondsPerHalfHour,
}),
RelaySMTPProgram: new Program("relaySMTP.exe", {
level: 250,
tooltip:"This program opens SMTP ports by redirecting data",
req: requireLevel(250),
time: CONSTANTS.MillisecondsPer2Hours,
}),
HTTPWormProgram: new Program("HTTPWorm.exe", {
level: 500,
tooltip:"This virus opens up HTTP ports",
req: requireLevel(500),
time: CONSTANTS.MillisecondsPer4Hours,
}),
SQLInjectProgram: new Program("SQLInject.exe", {
level: 750,
tooltip:"This virus opens SQL ports",
req: requireLevel(750),
time: CONSTANTS.MillisecondsPer8Hours,
}),
DeepscanV1: new Program("DeepscanV1.exe", {
level: 75,
tooltip:"This program allows you to use the scan-analyze command with a depth up to 5",
req: requireLevel(75),
time: CONSTANTS.MillisecondsPerQuarterHour,
}),
DeepscanV2: new Program("DeepscanV2.exe", {
level: 400,
tooltip:"This program allows you to use the scan-analyze command with a depth up to 10",
req: requireLevel(400),
time: CONSTANTS.MillisecondsPer2Hours,
}),
ServerProfiler: new Program("ServerProfiler.exe", {
level: 75,
tooltip:"This program is used to display hacking and Netscript-related information about servers",
req: requireLevel(75),
time: CONSTANTS.MillisecondsPerHalfHour,
}),
AutoLink: new Program("AutoLink.exe", {
level: 25,
tooltip:"This program allows you to directly connect to other servers through the 'scan-analyze' command",
req: requireLevel(25),
time: CONSTANTS.MillisecondsPerQuarterHour,
}),
BitFlume: new Program("b1t_flum3.exe", {
level: 5,
tooltip:"This program creates a portal to the BitNode Nexus (allows you to restart and switch BitNodes)",
req: function() {return Player.sourceFiles.length > 0 && Player.hacking_skill >= 5},
time: CONSTANTS.MillisecondsPerFiveMinutes / 5,
}),
// special because you can't create it.
Flight: new Program("fl1ght.exe"),
};
var nukeALink, bruteSshALink, ftpCrackALink, relaySmtpALink, httpWormALink, sqlInjectALink,
deepscanv1ALink, deepscanv2ALink, servProfilerALink, autolinkALink, bitFlumeALink;
function displayCreateProgramContent() {
nukeALink.style.display = "none";
bruteSshALink.style.display = "none";
ftpCrackALink.style.display = "none";
relaySmtpALink.style.display = "none";
httpWormALink.style.display = "none";
sqlInjectALink.style.display = "none";
deepscanv1ALink.style.display = "none";
deepscanv2ALink.style.display = "none";
servProfilerALink.style.display = "none";
autolinkALink.style.display = "none";
bitFlumeALink.style.display = "none";
// this has the same key as 'Programs', not program names
const aLinks = {};
//NUKE.exe (in case you delete it lol)
if (Player.getHomeComputer().programs.indexOf(Programs.NukeProgram) == -1) {
nukeALink.style.display = "inline-block";
}
//BruteSSH
if (Player.getHomeComputer().programs.indexOf(Programs.BruteSSHProgram) == -1 &&
Player.hacking_skill >= 50) {
bruteSshALink.style.display = "inline-block";
}
//FTPCrack
if (Player.getHomeComputer().programs.indexOf(Programs.FTPCrackProgram) == -1 &&
Player.hacking_skill >= 100) {
ftpCrackALink.style.display = "inline-block";
}
//relaySMTP
if (Player.getHomeComputer().programs.indexOf(Programs.RelaySMTPProgram) == -1 &&
Player.hacking_skill >= 250) {
relaySmtpALink.style.display = "inline-block";
}
//HTTPWorm
if (Player.getHomeComputer().programs.indexOf(Programs.HTTPWormProgram) == -1 &&
Player.hacking_skill >= 500) {
httpWormALink.style.display = "inline-block";
}
//SQLInject
if (Player.getHomeComputer().programs.indexOf(Programs.SQLInjectProgram) == -1 &&
Player.hacking_skill >= 750) {
sqlInjectALink.style.display = "inline-block";
}
//Deepscan V1 and V2
if (!Player.hasProgram(Programs.DeepscanV1) && Player.hacking_skill >= 75) {
deepscanv1ALink.style.display = "inline-block";
}
if (!Player.hasProgram(Programs.DeepscanV2) && Player.hacking_skill >= 400) {
deepscanv2ALink.style.display = "inline-block";
}
//Server profiler
if (!Player.hasProgram(Programs.ServerProfiler) && Player.hacking_skill >= 75) {
servProfilerALink.style.display = "inline-block";
}
//Auto Link
if (!Player.hasProgram(Programs.AutoLink) && Player.hacking_skill >= 25) {
autolinkALink.style.display = "inline-block";
}
//Bit Flume
if (!Player.hasProgram(Programs.BitFlume) && Player.sourceFiles.length > 0 && Player.hacking_skill >= 5) {
bitFlumeALink.style.display = "inline-block";
function displayCreateProgramContent() {
for(const key in aLinks) {
const p = Programs[key]
aLinks[key].style.display = "none";
if(!Player.hasProgram(p.name) && p.create.req()){
aLinks[key].style.display = "inline-block";
}
}
}
//Returns the number of programs that are currently available to be created
function getNumAvailableCreateProgram() {
var count = 0;
//PortHack.exe (in case you delete it lol)
if (Player.getHomeComputer().programs.indexOf(Programs.NukeProgram) == -1) {
++count;
}
//BruteSSH
if (Player.getHomeComputer().programs.indexOf(Programs.BruteSSHProgram) == -1 &&
Player.hacking_skill >= 50) {
++count;
}
//FTPCrack
if (Player.getHomeComputer().programs.indexOf(Programs.FTPCrackProgram) == -1 &&
Player.hacking_skill >= 100) {
++count;
}
//relaySMTP
if (Player.getHomeComputer().programs.indexOf(Programs.RelaySMTPProgram) == -1 &&
Player.hacking_skill >= 250) {
++count;
}
//HTTPWorm
if (Player.getHomeComputer().programs.indexOf(Programs.HTTPWormProgram) == -1 &&
Player.hacking_skill >= 500) {
++count;
}
//SQLInject
if (Player.getHomeComputer().programs.indexOf(Programs.SQLInjectProgram) == -1 &&
Player.hacking_skill >= 750) {
++count;
}
//Deepscan V1 and V2
if (!Player.hasProgram(Programs.DeepscanV1) && Player.hacking_skill >= 75) {
++count;
}
if (!Player.hasProgram(Programs.DeepscanV2) && Player.hacking_skill >= 400) {
++count;
}
//Server profiler
if (!Player.hasProgram(Programs.ServerProfiler) && Player.hacking_skill >= 75) {
++count;
}
//Auto link
if (!Player.hasProgram(Programs.AutoLink) && Player.hacking_skill >= 25) {
++count;
}
//Bit Flume
if (!Player.hasProgram(Programs.BitFlume) && Player.sourceFiles.length > 0 && Player.hacking_skill >= 5) {
++count;
for(const key in Programs) {
if(Programs[key].create === undefined) { // a program we can't create
continue
}
if(Player.hasProgram(Programs[key].name)) { // can't create it twice
continue
}
if(!Programs[key].create.req()) { // if you don't fullfill the creation requirement
continue
}
count++;
}
if (Player.firstProgramAvailable === false && count > 0) {
Player.firstProgramAvailable = true;
document.getElementById("create-program-tab").style.display = "list-item";
@@ -145,116 +134,25 @@ function getNumAvailableCreateProgram() {
function initCreateProgramButtons() {
var createProgramList = document.getElementById("create-program-list");
nukeALink = createElement("a", {
class:"a-link-button", id:"create-program-nuke", innerText:Programs.NukeProgram,
tooltip:"This virus is used to gain root access to a machine if enough ports are opened.",
});
createProgramList.appendChild(nukeALink);
for(const key in Programs) {
if(Programs[key].create === undefined) {
continue
}
const elem = createElement("a", {
class: "a-link-button", id: Programs[key].htmlID(), innerText: Programs[key].name,
tooltip: Programs[key].create.tooltip,
});
aLinks[key] = elem;
createProgramList.appendChild(elem);
}
bruteSshALink = createElement("a", {
class:"a-link-button", id:"create-program-brutessh", innerText:Programs.BruteSSHProgram,
tooltip:"This program executes a brute force attack that opens SSH ports"
});
createProgramList.appendChild(bruteSshALink);
ftpCrackALink = createElement("a", {
class:"a-link-button", id:"create-program-ftpcrack", innerText:Programs.FTPCrackProgram,
tooltip:"This program cracks open FTP ports"
});
createProgramList.appendChild(ftpCrackALink);
relaySmtpALink = createElement("a", {
class:"a-link-button", id:"create-program-relaysmtp", innerText:Programs.RelaySMTPProgram,
tooltip:"This program opens SMTP ports by redirecting data"
}) ;
createProgramList.appendChild(relaySmtpALink);
httpWormALink = createElement("a", {
class:"a-link-button", id:"create-program-httpworm", innerText:Programs.HTTPWormProgram,
tooltip:"This virus opens up HTTP ports"
});
createProgramList.appendChild(httpWormALink);
sqlInjectALink = createElement("a", {
class:"a-link-button", id:"create-program-sqlinject", innerText:Programs.SQLInjectProgram,
tooltip:"This virus opens SQL ports"
});
createProgramList.appendChild(sqlInjectALink);
deepscanv1ALink = createElement("a", {
class:"a-link-button", id:"create-program-deepscanv1", innerText:Programs.DeepscanV1,
tooltip:"This program allows you to use the scan-analyze command with a depth up to 5"
});
createProgramList.appendChild(deepscanv1ALink);
deepscanv2ALink = createElement("a", {
class:"a-link-button", id:"create-program-deepscanv2", innerText:Programs.DeepscanV2,
tooltip:"This program allows you to use the scan-analyze command with a depth up to 10"
});
createProgramList.appendChild(deepscanv2ALink);
servProfilerALink = createElement("a", {
class:"a-link-button", id:"create-program-serverprofiler", innerText:Programs.ServerProfiler,
tooltip:"This program is used to display hacking and Netscript-related information about servers"
});
createProgramList.appendChild(servProfilerALink);
bitFlumeALink = createElement("a", {
class:"a-link-button", id:"create-program-bitflume", innerText:Programs.BitFlume,
tooltip:"This program creates a portal to the BitNode Nexus (allows you to restart and switch BitNodes)"
});
createProgramList.appendChild(bitFlumeALink);
autolinkALink = createElement("a", {
class:"a-link-button", id:"create-program-autolink", innerText:"AutoLink.exe",
tooltip:"This program allows you to directly connect to other servers through the 'scan-analyze' command"
});
createProgramList.appendChild(autolinkALink);
nukeALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.NukeProgram, CONSTANTS.MillisecondsPerFiveMinutes, 1);
return false;
});
bruteSshALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.BruteSSHProgram, CONSTANTS.MillisecondsPerFiveMinutes * 2, 50);
return false;
});
ftpCrackALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.FTPCrackProgram, CONSTANTS.MillisecondsPerHalfHour, 100);
return false;
});
relaySmtpALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.RelaySMTPProgram, CONSTANTS.MillisecondsPer2Hours, 250);
return false;
});
httpWormALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.HTTPWormProgram, CONSTANTS.MillisecondsPer4Hours, 500);
return false;
});
sqlInjectALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.SQLInjectProgram, CONSTANTS.MillisecondsPer8Hours, 750);
return false;
});
deepscanv1ALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.DeepscanV1, CONSTANTS.MillisecondsPerQuarterHour, 75);
return false;
});
deepscanv2ALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.DeepscanV2, CONSTANTS.MillisecondsPer2Hours, 400);
return false;
});
servProfilerALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.ServerProfiler, CONSTANTS.MillisecondsPerHalfHour, 75);
return false;
});
autolinkALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.AutoLink, CONSTANTS.MillisecondsPerQuarterHour, 25);
return false;
});
bitFlumeALink.addEventListener("click", function() {
Player.startCreateProgramWork(Programs.BitFlume, CONSTANTS.MillisecondsPerFiveMinutes / 5, 5);
return false;
});
for(const key in aLinks) {
const p = Programs[key]
aLinks[key].addEventListener("click", function() {
Player.startCreateProgramWork(p.name, p.create.time, p.create.level);
return false;
});
}
}
export {Programs, displayCreateProgramContent, getNumAvailableCreateProgram,