Merge pull request #266 from hydroflame/streamline-create-programs

Streamline create programs
This commit is contained in:
danielyxie 2018-06-25 19:34:08 -05:00 committed by GitHub
commit b2a24002ee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 185 additions and 330 deletions

@ -2,138 +2,127 @@ import {CONSTANTS} from "./Constants.js";
import {Player} from "./Player.js"; import {Player} from "./Player.js";
import {createElement} from "../utils/HelperFunctions.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 */ /* Create programs */
let Programs = { const Programs = {
NukeProgram: "NUKE.exe", NukeProgram: new Program("NUKE.exe", {
BruteSSHProgram: "BruteSSH.exe", level: 1,
FTPCrackProgram: "FTPCrack.exe", tooltip:"This virus is used to gain root access to a machine if enough ports are opened.",
RelaySMTPProgram: "relaySMTP.exe", req: requireLevel(1),
HTTPWormProgram: "HTTPWorm.exe", time: CONSTANTS.MillisecondsPerFiveMinutes,
SQLInjectProgram: "SQLInject.exe", }),
DeepscanV1: "DeepscanV1.exe", BruteSSHProgram: new Program("BruteSSH.exe", {
DeepscanV2: "DeepscanV2.exe", level: 50,
ServerProfiler: "ServerProfiler.exe", tooltip:"This program executes a brute force attack that opens SSH ports",
AutoLink: "AutoLink.exe", req: requireLevel(50),
Flight: "fl1ght.exe", time: CONSTANTS.MillisecondsPerFiveMinutes * 2,
BitFlume: "b1t_flum3.exe" }),
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, // this has the same key as 'Programs', not program names
deepscanv1ALink, deepscanv2ALink, servProfilerALink, autolinkALink, bitFlumeALink; const aLinks = {};
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";
//NUKE.exe (in case you delete it lol) function displayCreateProgramContent() {
if (Player.getHomeComputer().programs.indexOf(Programs.NukeProgram) == -1) { for(const key in aLinks) {
nukeALink.style.display = "inline-block"; const p = Programs[key]
aLinks[key].style.display = "none";
if(!Player.hasProgram(p.name) && p.create.req()){
aLinks[key].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";
} }
} }
//Returns the number of programs that are currently available to be created //Returns the number of programs that are currently available to be created
function getNumAvailableCreateProgram() { function getNumAvailableCreateProgram() {
var count = 0; var count = 0;
//PortHack.exe (in case you delete it lol) for(const key in Programs) {
if (Player.getHomeComputer().programs.indexOf(Programs.NukeProgram) == -1) { if(Programs[key].create === undefined) { // a program we can't create
++count; continue
} }
//BruteSSH if(Player.hasProgram(Programs[key].name)) { // can't create it twice
if (Player.getHomeComputer().programs.indexOf(Programs.BruteSSHProgram) == -1 && continue
Player.hacking_skill >= 50) {
++count;
} }
//FTPCrack
if (Player.getHomeComputer().programs.indexOf(Programs.FTPCrackProgram) == -1 && if(!Programs[key].create.req()) { // if you don't fullfill the creation requirement
Player.hacking_skill >= 100) { continue
++count;
} }
//relaySMTP
if (Player.getHomeComputer().programs.indexOf(Programs.RelaySMTPProgram) == -1 && count++;
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;
} }
if (Player.firstProgramAvailable === false && count > 0) { if (Player.firstProgramAvailable === false && count > 0) {
Player.firstProgramAvailable = true; Player.firstProgramAvailable = true;
document.getElementById("create-program-tab").style.display = "list-item"; document.getElementById("create-program-tab").style.display = "list-item";
@ -145,116 +134,25 @@ function getNumAvailableCreateProgram() {
function initCreateProgramButtons() { function initCreateProgramButtons() {
var createProgramList = document.getElementById("create-program-list"); var createProgramList = document.getElementById("create-program-list");
nukeALink = createElement("a", { for(const key in Programs) {
class:"a-link-button", id:"create-program-nuke", innerText:Programs.NukeProgram, if(Programs[key].create === undefined) {
tooltip:"This virus is used to gain root access to a machine if enough ports are opened.", continue
}
const elem = createElement("a", {
class: "a-link-button", id: Programs[key].htmlID(), innerText: Programs[key].name,
tooltip: Programs[key].create.tooltip,
}); });
createProgramList.appendChild(nukeALink); aLinks[key] = elem;
createProgramList.appendChild(elem);
}
bruteSshALink = createElement("a", { for(const key in aLinks) {
class:"a-link-button", id:"create-program-brutessh", innerText:Programs.BruteSSHProgram, const p = Programs[key]
tooltip:"This program executes a brute force attack that opens SSH ports" aLinks[key].addEventListener("click", function() {
}); Player.startCreateProgramWork(p.name, p.create.time, p.create.level);
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; return false;
}); });
}
} }
export {Programs, displayCreateProgramContent, getNumAvailableCreateProgram, export {Programs, displayCreateProgramContent, getNumAvailableCreateProgram,

@ -88,7 +88,7 @@ function checkForMessagesToSend() {
} }
} else if (jumper0 && !jumper0.recvd && Player.hacking_skill >= 25) { } else if (jumper0 && !jumper0.recvd && Player.hacking_skill >= 25) {
sendMessage(jumper0); sendMessage(jumper0);
Player.getHomeComputer().programs.push(Programs.Flight); Player.getHomeComputer().programs.push(Programs.Flight.name);
} else if (jumper1 && !jumper1.recvd && Player.hacking_skill >= 40) { } else if (jumper1 && !jumper1.recvd && Player.hacking_skill >= 40) {
sendMessage(jumper1); sendMessage(jumper1);
} else if (cybersecTest && !cybersecTest.recvd && Player.hacking_skill >= 50) { } else if (cybersecTest && !cybersecTest.recvd && Player.hacking_skill >= 50) {

@ -430,7 +430,7 @@ function NetscriptFunctions(workerScript) {
workerScript.scriptRef.log("Cannot call nuke(). Invalid IP or hostname passed in: " + ip); workerScript.scriptRef.log("Cannot call nuke(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call nuke(). Invalid IP or hostname passed in: " + ip); throw makeRuntimeRejectMsg(workerScript, "Cannot call nuke(). Invalid IP or hostname passed in: " + ip);
} }
if (!Player.hasProgram(Programs.NukeProgram)) { if (!Player.hasProgram(Programs.NukeProgram.name)) {
throw makeRuntimeRejectMsg(workerScript, "You do not have the NUKE.exe virus!"); throw makeRuntimeRejectMsg(workerScript, "You do not have the NUKE.exe virus!");
} }
if (server.openPortCount < server.numOpenPortsRequired) { if (server.openPortCount < server.numOpenPortsRequired) {
@ -461,7 +461,7 @@ function NetscriptFunctions(workerScript) {
workerScript.scriptRef.log("Cannot call brutessh(). Invalid IP or hostname passed in: " + ip); workerScript.scriptRef.log("Cannot call brutessh(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call brutessh(). Invalid IP or hostname passed in: " + ip); throw makeRuntimeRejectMsg(workerScript, "Cannot call brutessh(). Invalid IP or hostname passed in: " + ip);
} }
if (!Player.hasProgram(Programs.BruteSSHProgram)) { if (!Player.hasProgram(Programs.BruteSSHProgram.name)) {
workerScript.scriptRef.log("You do not have the BruteSSH.exe program!"); workerScript.scriptRef.log("You do not have the BruteSSH.exe program!");
throw makeRuntimeRejectMsg(workerScript, "You do not have the BruteSSH.exe program!"); throw makeRuntimeRejectMsg(workerScript, "You do not have the BruteSSH.exe program!");
} }
@ -491,7 +491,7 @@ function NetscriptFunctions(workerScript) {
workerScript.scriptRef.log("Cannot call ftpcrack(). Invalid IP or hostname passed in: " + ip); workerScript.scriptRef.log("Cannot call ftpcrack(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call ftpcrack(). Invalid IP or hostname passed in: " + ip); throw makeRuntimeRejectMsg(workerScript, "Cannot call ftpcrack(). Invalid IP or hostname passed in: " + ip);
} }
if (!Player.hasProgram(Programs.FTPCrackProgram)) { if (!Player.hasProgram(Programs.FTPCrackProgram.name)) {
throw makeRuntimeRejectMsg(workerScript, "You do not have the FTPCrack.exe program!"); throw makeRuntimeRejectMsg(workerScript, "You do not have the FTPCrack.exe program!");
} }
if (!server.ftpPortOpen) { if (!server.ftpPortOpen) {
@ -520,7 +520,7 @@ function NetscriptFunctions(workerScript) {
workerScript.scriptRef.log("Cannot call relaysmtp(). Invalid IP or hostname passed in: " + ip); workerScript.scriptRef.log("Cannot call relaysmtp(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call relaysmtp(). Invalid IP or hostname passed in: " + ip); throw makeRuntimeRejectMsg(workerScript, "Cannot call relaysmtp(). Invalid IP or hostname passed in: " + ip);
} }
if (!Player.hasProgram(Programs.RelaySMTPProgram)) { if (!Player.hasProgram(Programs.RelaySMTPProgram.name)) {
throw makeRuntimeRejectMsg(workerScript, "You do not have the relaySMTP.exe program!"); throw makeRuntimeRejectMsg(workerScript, "You do not have the relaySMTP.exe program!");
} }
if (!server.smtpPortOpen) { if (!server.smtpPortOpen) {
@ -549,7 +549,7 @@ function NetscriptFunctions(workerScript) {
workerScript.scriptRef.log("Cannot call httpworm(). Invalid IP or hostname passed in: " + ip); workerScript.scriptRef.log("Cannot call httpworm(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call httpworm(). Invalid IP or hostname passed in: " + ip); throw makeRuntimeRejectMsg(workerScript, "Cannot call httpworm(). Invalid IP or hostname passed in: " + ip);
} }
if (!Player.hasProgram(Programs.HTTPWormProgram)) { if (!Player.hasProgram(Programs.HTTPWormProgram.name)) {
throw makeRuntimeRejectMsg(workerScript, "You do not have the HTTPWorm.exe program!"); throw makeRuntimeRejectMsg(workerScript, "You do not have the HTTPWorm.exe program!");
} }
if (!server.httpPortOpen) { if (!server.httpPortOpen) {
@ -578,7 +578,7 @@ function NetscriptFunctions(workerScript) {
workerScript.scriptRef.log("Cannot call sqlinject(). Invalid IP or hostname passed in: " + ip); workerScript.scriptRef.log("Cannot call sqlinject(). Invalid IP or hostname passed in: " + ip);
throw makeRuntimeRejectMsg(workerScript, "Cannot call sqlinject(). Invalid IP or hostname passed in: " + ip); throw makeRuntimeRejectMsg(workerScript, "Cannot call sqlinject(). Invalid IP or hostname passed in: " + ip);
} }
if (!Player.hasProgram(Programs.SQLInjectProgram)) { if (!Player.hasProgram(Programs.SQLInjectProgram.name)) {
throw makeRuntimeRejectMsg(workerScript, "You do not have the SQLInject.exe program!"); throw makeRuntimeRejectMsg(workerScript, "You do not have the SQLInject.exe program!");
} }
if (!server.sqlPortOpen) { if (!server.sqlPortOpen) {
@ -2882,6 +2882,7 @@ function NetscriptFunctions(workerScript) {
if (workerScript.checkingRam) { if (workerScript.checkingRam) {
return updateStaticRam("createProgram", ramCost); return updateStaticRam("createProgram", ramCost);
} }
if (Player.bitNodeN != 4) {
updateDynamicRam("createProgram", ramCost); updateDynamicRam("createProgram", ramCost);
if (Player.bitNodeN != 4) { if (Player.bitNodeN != 4) {
if (!(hasSingularitySF && singularitySFLvl >= 3)) { if (!(hasSingularitySF && singularitySFLvl >= 3)) {
@ -2900,78 +2901,34 @@ function NetscriptFunctions(workerScript) {
} }
} }
switch(name.toLowerCase()) { name = name.toLowerCase();
case Programs.NukeProgram.toLowerCase():
Player.startCreateProgramWork(Programs.NukeProgram, CONSTANTS.MillisecondsPerFiveMinutes, 1); let p = null;
break; for (const key in Programs) {
case Programs.BruteSSHProgram.toLowerCase(): if(Programs[key].name.toLowerCase() == name) {
if (Player.hacking_skill < 50) { p = Programs[key];
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create BruteSSH (level 50 req)");
return false;
} }
Player.startCreateProgramWork(Programs.BruteSSHProgram, CONSTANTS.MillisecondsPerFiveMinutes * 2, 50);
break;
case Programs.FTPCrackProgram.toLowerCase():
if (Player.hacking_skill < 100) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create FTPCrack (level 100 req)");
return false;
} }
Player.startCreateProgramWork(Programs.FTPCrackProgram, CONSTANTS.MillisecondsPerHalfHour, 100);
break; if(p == null) {
case Programs.RelaySMTPProgram.toLowerCase():
if (Player.hacking_skill < 250) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create relaySMTP (level 250 req)");
return false;
}
Player.startCreateProgramWork(Programs.RelaySMTPProgram, CONSTANTS.MillisecondsPer2Hours, 250);
break;
case Programs.HTTPWormProgram.toLowerCase():
if (Player.hacking_skill < 500) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create HTTPWorm (level 500 req)");
return false;
}
Player.startCreateProgramWork(Programs.HTTPWormProgram, CONSTANTS.MillisecondsPer4Hours, 500);
break;
case Programs.SQLInjectProgram.toLowerCase():
if (Player.hacking_skill < 750) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create SQLInject (level 750 req)");
return false;
}
Player.startCreateProgramWork(Programs.SQLInjectProgram, CONSTANTS.MillisecondsPer8Hours, 750);
break;
case Programs.DeepscanV1.toLowerCase():
if (Player.hacking_skill < 75) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create DeepscanV1 (level 75 req)");
return false;
}
Player.startCreateProgramWork(Programs.DeepscanV1, CONSTANTS.MillisecondsPerQuarterHour, 75);
break;
case Programs.DeepscanV2.toLowerCase():
if (Player.hacking_skill < 400) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create DeepscanV2 (level 400 req)");
return false;
}
Player.startCreateProgramWork(Programs.DeepscanV2, CONSTANTS.MillisecondsPer2Hours, 400);
break;
case Programs.ServerProfiler.toLowerCase():
if (Player.hacking_skill < 75) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create ServerProfiler (level 75 req)");
return false;
}
Player.startCreateProgramWork(Programs.ServerProfiler, CONSTANTS.MillisecondsPerHalfHour, 75);
break;
case Programs.AutoLink.toLowerCase():
if (Player.hacking_skill < 25) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create AutoLink (level 25 req)");
return false;
}
Player.startCreateProgramWork(Programs.AutoLink, CONSTANTS.MillisecondsPerQuarterHour, 25);
break;
default:
workerScript.scriptRef.log("ERROR: createProgram() failed because the specified program does not exist: " + name); workerScript.scriptRef.log("ERROR: createProgram() failed because the specified program does not exist: " + name);
return false; return false;
} }
if(Player.hasProgram(p.name)) {
workerScript.scriptRef.log('ERROR: createProgram() failed because you already have the ' + p.name + ' program');
return false;
}
if(!p.create.req()) {
workerScript.scriptRef.log("ERROR: createProgram() failed because hacking level is too low to create " + p.name + " (level " + p.create.level + " req)");
return false
}
Player.startCreateProgramWork(p.name, p.create.time, p.create.level);
if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.createProgram == null) {
workerScript.scriptRef.log("Began creating program: " + name); workerScript.scriptRef.log("Began creating program: " + name);
}
return true; return true;
}, },
commitCrime : function(crimeRoughName) { commitCrime : function(crimeRoughName) {

@ -220,7 +220,7 @@ PlayerObject.prototype.init = function() {
this.currentServer = t_homeComp.ip; this.currentServer = t_homeComp.ip;
AddToAllServers(t_homeComp); AddToAllServers(t_homeComp);
this.getHomeComputer().programs.push(Programs.NukeProgram); this.getHomeComputer().programs.push(Programs.NukeProgram.name);
} }
PlayerObject.prototype.prestigeAugmentation = function() { PlayerObject.prototype.prestigeAugmentation = function() {

@ -59,13 +59,13 @@ function prestigeAugmentation() {
if (augmentationExists(AugmentationNames.Neurolink) && if (augmentationExists(AugmentationNames.Neurolink) &&
Augmentations[AugmentationNames.Neurolink].owned) { Augmentations[AugmentationNames.Neurolink].owned) {
homeComp.programs.push(Programs.FTPCrackProgram); homeComp.programs.push(Programs.FTPCrackProgram.name);
homeComp.programs.push(Programs.RelaySMTPProgram); homeComp.programs.push(Programs.RelaySMTPProgram.name);
} }
if (augmentationExists(AugmentationNames.CashRoot) && if (augmentationExists(AugmentationNames.CashRoot) &&
Augmentations[AugmentationNames.CashRoot].owned) { Augmentations[AugmentationNames.CashRoot].owned) {
Player.setMoney(new Decimal(1000000)); Player.setMoney(new Decimal(1000000));
homeComp.programs.push(Programs.BruteSSHProgram); homeComp.programs.push(Programs.BruteSSHProgram.name);
} }
//Re-create foreign servers //Re-create foreign servers

@ -829,7 +829,7 @@ function prestigeHomeComputer(homeComp) {
homeComp.serversOnNetwork = []; homeComp.serversOnNetwork = [];
homeComp.isConnectedTo = true; homeComp.isConnectedTo = true;
homeComp.ramUsed = 0; homeComp.ramUsed = 0;
homeComp.programs.push(Programs.NukeProgram); homeComp.programs.push(Programs.NukeProgram.name);
//Update RAM usage on all scripts //Update RAM usage on all scripts
homeComp.scripts.forEach(function(script) { homeComp.scripts.forEach(function(script) {

@ -1356,11 +1356,11 @@ let Terminal = {
post("Incorrect usage of scan-analyze command. depth argument must be positive numeric"); post("Incorrect usage of scan-analyze command. depth argument must be positive numeric");
return; return;
} }
if (depth > 3 && !Player.hasProgram(Programs.DeepscanV1) && if (depth > 3 && !Player.hasProgram(Programs.DeepscanV1.name) &&
!Player.hasProgram(Programs.DeepscanV2)) { !Player.hasProgram(Programs.DeepscanV2.name)) {
post("You cannot scan-analyze with that high of a depth. Maximum depth is 3"); post("You cannot scan-analyze with that high of a depth. Maximum depth is 3");
return; return;
} else if (depth > 5 && !Player.hasProgram(Programs.DeepscanV2)) { } else if (depth > 5 && !Player.hasProgram(Programs.DeepscanV2.name)) {
post("You cannot scan-analyze with that high of a depth. Maximum depth is 5"); post("You cannot scan-analyze with that high of a depth. Maximum depth is 5");
return; return;
} else if (depth > 10) { } else if (depth > 10) {
@ -1761,7 +1761,7 @@ let Terminal = {
} }
if (d == 0) {continue;} //Don't print current server if (d == 0) {continue;} //Don't print current server
var titleDashes = Array((d-1) * 4 + 1).join("-"); var titleDashes = Array((d-1) * 4 + 1).join("-");
if (Player.hasProgram(Programs.AutoLink)) { if (Player.hasProgram(Programs.AutoLink.name)) {
post("<strong>" + titleDashes + "> <a class='scan-analyze-link'>" + s.hostname + "</a></strong>", false); post("<strong>" + titleDashes + "> <a class='scan-analyze-link'>" + s.hostname + "</a></strong>", false);
} else { } else {
post("<strong>" + titleDashes + ">" + s.hostname + "</strong>"); post("<strong>" + titleDashes + ">" + s.hostname + "</strong>");
@ -1826,7 +1826,7 @@ let Terminal = {
programName = splitArgs[0]; programName = splitArgs[0];
} }
switch (programName) { switch (programName) {
case Programs.NukeProgram: case Programs.NukeProgram.name:
if (s.hasAdminRights) { if (s.hasAdminRights) {
post("You already have root access to this computer. There is no reason to run NUKE.exe"); post("You already have root access to this computer. There is no reason to run NUKE.exe");
} else { } else {
@ -1839,7 +1839,7 @@ let Terminal = {
} }
} }
break; break;
case Programs.BruteSSHProgram: case Programs.BruteSSHProgram.name:
if (s.sshPortOpen) { if (s.sshPortOpen) {
post("SSH Port (22) is already open!"); post("SSH Port (22) is already open!");
} else { } else {
@ -1848,7 +1848,7 @@ let Terminal = {
++s.openPortCount; ++s.openPortCount;
} }
break; break;
case Programs.FTPCrackProgram: case Programs.FTPCrackProgram.name:
if (s.ftpPortOpen) { if (s.ftpPortOpen) {
post("FTP Port (21) is already open!"); post("FTP Port (21) is already open!");
} else { } else {
@ -1857,7 +1857,7 @@ let Terminal = {
++s.openPortCount; ++s.openPortCount;
} }
break; break;
case Programs.RelaySMTPProgram: case Programs.RelaySMTPProgram.name:
if (s.smtpPortOpen) { if (s.smtpPortOpen) {
post("SMTP Port (25) is already open!"); post("SMTP Port (25) is already open!");
} else { } else {
@ -1866,7 +1866,7 @@ let Terminal = {
++s.openPortCount; ++s.openPortCount;
} }
break; break;
case Programs.HTTPWormProgram: case Programs.HTTPWormProgram.name:
if (s.httpPortOpen) { if (s.httpPortOpen) {
post("HTTP Port (80) is already open!"); post("HTTP Port (80) is already open!");
} else { } else {
@ -1875,7 +1875,7 @@ let Terminal = {
++s.openPortCount; ++s.openPortCount;
} }
break; break;
case Programs.SQLInjectProgram: case Programs.SQLInjectProgram.name:
if (s.sqlPortOpen) { if (s.sqlPortOpen) {
post("SQL Port (1433) is already open!"); post("SQL Port (1433) is already open!");
} else { } else {
@ -1884,7 +1884,7 @@ let Terminal = {
++s.openPortCount; ++s.openPortCount;
} }
break; break;
case Programs.ServerProfiler: case Programs.ServerProfiler.name:
if (splitArgs.length != 2) { if (splitArgs.length != 2) {
post("Must pass a server hostname or IP as an argument for ServerProfiler.exe"); post("Must pass a server hostname or IP as an argument for ServerProfiler.exe");
return; return;
@ -1902,20 +1902,20 @@ let Terminal = {
post("Netscript grow() execution time: " + formatNumber(scriptCalculateGrowTime(serv)/1000, 1) + "s"); post("Netscript grow() execution time: " + formatNumber(scriptCalculateGrowTime(serv)/1000, 1) + "s");
post("Netscript weaken() execution time: " + formatNumber(scriptCalculateWeakenTime(serv)/1000, 1) + "s"); post("Netscript weaken() execution time: " + formatNumber(scriptCalculateWeakenTime(serv)/1000, 1) + "s");
break; break;
case Programs.AutoLink: case Programs.AutoLink.name:
post("This executable cannot be run."); post("This executable cannot be run.");
post("AutoLink.exe lets you automatically connect to other servers when using 'scan-analyze'."); post("AutoLink.exe lets you automatically connect to other servers when using 'scan-analyze'.");
post("When using scan-analyze, click on a server's hostname to connect to it."); post("When using scan-analyze, click on a server's hostname to connect to it.");
break; break;
case Programs.DeepscanV1: case Programs.DeepscanV1.name:
post("This executable cannot be run."); post("This executable cannot be run.");
post("DeepscanV1.exe lets you run 'scan-analyze' with a depth up to 5."); post("DeepscanV1.exe lets you run 'scan-analyze' with a depth up to 5.");
break; break;
case Programs.DeepscanV2: case Programs.DeepscanV2.name:
post("This executable cannot be run."); post("This executable cannot be run.");
post("DeepscanV2.exe lets you run 'scan-analyze' with a depth up to 10."); post("DeepscanV2.exe lets you run 'scan-analyze' with a depth up to 10.");
break; break;
case Programs.Flight: case Programs.Flight.name:
post("Augmentations: " + Player.augmentations.length + " / 30"); post("Augmentations: " + Player.augmentations.length + " / 30");
post("Money: " + numeral(Player.money.toNumber()).format('($0.000a)') + " / " + numeral(1e11).format('($0.000a)')); post("Money: " + numeral(Player.money.toNumber()).format('($0.000a)') + " / " + numeral(1e11).format('($0.000a)'));
@ -1928,7 +1928,7 @@ let Terminal = {
post("Dexterity: " + Player.dexterity + " / 1500"); post("Dexterity: " + Player.dexterity + " / 1500");
post("Agility: " + Player.agility + " / 1500"); post("Agility: " + Player.agility + " / 1500");
break; break;
case Programs.BitFlume: case Programs.BitFlume.name:
var yesBtn = yesNoBoxGetYesButton(), var yesBtn = yesNoBoxGetYesButton(),
noBtn = yesNoBoxGetNoButton(); noBtn = yesNoBoxGetNoButton();
yesBtn.innerHTML = "Travel to BitNode Nexus"; yesBtn.innerHTML = "Travel to BitNode Nexus";

@ -21,7 +21,7 @@ import {cinematicTextFlag} from "./CinematicText.js";
import {CompanyPositions, initCompanies} from "./Company.js"; import {CompanyPositions, initCompanies} from "./Company.js";
import {Corporation} from "./CompanyManagement.js"; import {Corporation} from "./CompanyManagement.js";
import {CONSTANTS} from "./Constants.js"; import {CONSTANTS} from "./Constants.js";
import {Programs, displayCreateProgramContent, import {displayCreateProgramContent,
getNumAvailableCreateProgram, getNumAvailableCreateProgram,
initCreateProgramButtons} from "./CreateProgram.js"; initCreateProgramButtons} from "./CreateProgram.js";
import {displayFactionContent, joinFaction, import {displayFactionContent, joinFaction,