Playtesting - Rebalancing, UI improvements, added tooltip for programs, home computer no longer reset on prestige

This commit is contained in:
Daniel Xie 2017-05-08 09:33:26 -05:00
parent 21f73088f6
commit 20d8a40e17
13 changed files with 147 additions and 84 deletions

@ -201,6 +201,10 @@
width: 99%;
}
#create-program-page-text {
width: 80%;
}
.create-program-a-link-button {
text-decoration: none;
background-color: #555;
@ -210,6 +214,7 @@
border-right: 1px solid #333333;
border-bottom: 1px solid #333333;
border-left: 1px solid #333333;
width: 50%;
}
.create-program-a-link-button-inactive {

@ -140,4 +140,27 @@ tr:focus {
color: #333;
border-radius: 0px;
padding: 0px;
}
/* Tool tips (when hovering over an element */
.tooltip {
position: relative;
display: inline-block;
}
.tooltip .tooltiptext {
visibility: hidden;
width: 200px;
background-color: black;
border: 2px solid white;
color: white;
text-align: center;
padding: 4px;
position: absolute;
z-index: 1;
}
.tooltip:hover .tooltiptext {
visibility: visible;
}

@ -376,13 +376,40 @@
<!-- Create a program(executable) -->
<div id="create-program-container">
<p id="create-program-page-text">
This page displays any programs that you are able to create. Writing the code for a program takes time, which
can vary based on how complex the program is. Once you start working on a program you must see it all the way
through. If you cancel before the program is complete you will lose all your progress and have to start all over
if you want to code it again.
</p>
<ul id="create-program-list">
<a class="create-program-a-link-button" id="create-program-porthack" href="#">PortHack.exe</a>
<a class="create-program-a-link-button" id="create-program-brutessh" href="#">BruteSSH.exe</a>
<a class="create-program-a-link-button" id="create-program-ftpcrack" href="#">FTPCrack.exe</a>
<a class="create-program-a-link-button" id="create-program-relaysmtp" href="#">relaySMTP.exe</a>
<a class="create-program-a-link-button" id="create-program-httpworm" href="#">HTTPWorm.exe</a>
<a class="create-program-a-link-button" id="create-program-sqlinject" href="#">SQLInject.exe</a>
<a class="create-program-a-link-button tooltip" id="create-program-nuke" href="#">
NUKE.exe
<span class="tooltiptext"> This virus is used to gain root access to a machine if enough ports are opened. </span>
</a>
<a class="create-program-a-link-button tooltip" id="create-program-brutessh" href="#">
BruteSSH.exe
<span class="tooltiptext"> This program executes a brute force attack that opens SSH ports </span>
</a>
<a class="create-program-a-link-button tooltip" id="create-program-ftpcrack" href="#">
FTPCrack.exe
<span class="tooltiptext"> This program cracks open FTP ports</span>
</a>
<a class="create-program-a-link-button tooltip" id="create-program-relaysmtp" href="#">
relaySMTP.exe
<span class="tooltiptext"> This program opens SMTP ports by redirecting data </span>
</a>
<a class="create-program-a-link-button tooltip" id="create-program-httpworm" href="#">
HTTPWorm.exe
<span class="tooltiptext"> This virus opens up HTTP ports </span>
</a>
<a class="create-program-a-link-button tooltip" id="create-program-sqlinject" href="#">
SQLInject.exe
<span class="tooltiptext"> This virus opens SQL ports</span>
</a>
</ul>
</div>

@ -436,7 +436,7 @@ initAugmentations = function() {
var SynapticEnhancement = new Augmentation(AugmentationNames.SynapticEnhancement);
SynapticEnhancement.setRequirements(1500, 1200000);
SynapticEnhancement.setInfo("A small cranial implant that continuously uses weak electric signals to stimulate the brain and " +
"induce stronger synaptic activity. This improves the the user's cognitive abilities.<br><br>" +
"induce stronger synaptic activity. This improves the user's cognitive abilities.<br><br>" +
"This augmentation increases the player's hacking speed by 1%.");
SynapticEnhancement.addToFactions(["CyberSec"]);
if (augmentationExists(AugmentationNames.SynapticEnhancement)) {
@ -684,7 +684,7 @@ initAugmentations = function() {
AddToAugmentations(PCDNINeuralNetwork);
var ADRPheromone1 = new Augmentation(AugmentationNames.ADRPheromone1);
ADRPheromone1.setRequirements(2000, 2000000);
ADRPheromone1.setRequirements(1500, 2000000);
ADRPheromone1.setInfo("The body is genetically re-engineered so that it produces the ADR-V1 pheromone, " +
"an artificial pheromone discovered by scientists. The ADR-V1 pheromone, when excreted " +
"triggers feelings of admiration and approval in other people. <br><br>" +
@ -700,7 +700,7 @@ initAugmentations = function() {
//HacknetNode Augmentations
var HacknetNodeCPUUpload = new Augmentation(AugmentationNames.HacknetNodeCPUUpload);
HacknetNodeCPUUpload.setRequirements(4000, 5000000);
HacknetNodeCPUUpload.setRequirements(3000, 5000000);
HacknetNodeCPUUpload.setInfo("Uploads the architecture and design details of a Hacknet Node's CPU into " +
"the brain. This allows the user to engineer custom hardware and software " +
"for the Hacknet Node that provides better performance.<br><br>" +
@ -715,7 +715,7 @@ initAugmentations = function() {
AddToAugmentations(HacknetNodeCPUUpload);
var HacknetNodeCacheUpload = new Augmentation(AugmentationNames.HacknetNodeCacheUpload);
HacknetNodeCacheUpload.setRequirements(2000, 2500000);
HacknetNodeCacheUpload.setRequirements(1500, 2500000);
HacknetNodeCacheUpload.setInfo("Uploads the architecture and design details of a Hacknet Node's main-memory cache " +
"into the brain. This allows the user to engineer custom cache hardware for the " +
"Hacknet Node that offers better performance.<br><br>" +
@ -730,7 +730,7 @@ initAugmentations = function() {
AddToAugmentations(HacknetNodeCacheUpload);
var HacknetNodeNICUpload = new Augmentation(AugmentationNames.HacknetNodeNICUpload);
HacknetNodeNICUpload.setRequirements(1000, 1000000);
HacknetNodeNICUpload.setRequirements(750, 1000000);
HacknetNodeNICUpload.setInfo("Uploads the architecture and design details of a Hacknet Node's Network Interface Card (NIC) " +
"into the brain. This allows the user to engineer a custom NIC for the Hacknet Node that " +
"offers better performance.<br><br>" +
@ -745,7 +745,7 @@ initAugmentations = function() {
AddToAugmentations(HacknetNodeNICUpload);
var HacknetNodeKernelDNI = new Augmentation(AugmentationNames.HacknetNodeKernelDNI);
HacknetNodeKernelDNI.setRequirements(12000, 30000000);
HacknetNodeKernelDNI.setRequirements(8000, 30000000);
HacknetNodeKernelDNI.setInfo("Installs a Direct-Neural Interface jack into the arm that is capable of connecting to a " +
"Hacknet Node. This lets the user access and manipulate the Node's kernel using the mind's " +
"electrochemical signals.<br><br>" +
@ -758,7 +758,7 @@ initAugmentations = function() {
AddToAugmentations(HacknetNodeKernelDNI);
var HacknetNodeCoreDNI = new Augmentation(AugmentationNames.HacknetNodeCoreDNI);
HacknetNodeCoreDNI.setRequirements(20000, 50000000);
HacknetNodeCoreDNI.setRequirements(12000, 50000000);
HacknetNodeCoreDNI.setInfo("Installs a Direct-Neural Interface jack into the arm that is capable of connecting " +
"to a Hacknet Node. This lets the user access and manipulate the Node's processing logic using " +
"the mind's electrochemical signals.<br><br>" +
@ -777,8 +777,10 @@ initAugmentations = function() {
NeuroFluxGovernor.owned = oldAug.owned;
NeuroFluxGovernor.level = oldAug.level;
var mult = Math.pow(CONSTANTS.NeuroFluxGovernorLevelMult, NeuroFluxGovernor.level-1);
NeuroFluxGovernor.setRequirements(1500 * mult, 1500000 * mult);
NeuroFluxGovernor.setRequirements(1000 * mult, 1000000 * mult);
delete Augmentations[AugmentationNames.NeuroFluxGovernor];
} else {
NeuroFluxGovernor.setRequirements(1000, 1000000);
}
NeuroFluxGovernor.setInfo("A device that is embedded in the back of the neck. The NeuroFlux Governor " +
"monitors and regulates nervous impulses coming to and from the spinal column, " +
@ -790,7 +792,7 @@ initAugmentations = function() {
AddToAugmentations(NeuroFluxGovernor);
var Neurotrainer1 = new Augmentation(AugmentationNames.Neurotrainer1);
Neurotrainer1.setRequirements(1000, 1000000);
Neurotrainer1.setRequirements(1000, 750000);
Neurotrainer1.setInfo("A decentralized cranial implant that improves the brain's ability to learn. It is " +
"installed by releasing millions of nanobots into the human brain, each of which " +
"attaches to a different neural pathway to enhance the brain's ability to retain " +
@ -804,7 +806,7 @@ initAugmentations = function() {
AddToAugmentations(Neurotrainer1);
var Neurotrainer2 = new Augmentation(AugmentationNames.Neurotrainer2);
Neurotrainer2.setRequirements(5000, 10000000);
Neurotrainer2.setRequirements(4000, 10000000);
Neurotrainer2.setInfo("A decentralized cranial implant that improves the brain's ability to learn. This " +
"is a more powerful version of the Neurotrainer I augmentation, but it does not " +
"require Neurotrainer I to be installed as a prerequisite.<br><br>" +

@ -18,13 +18,13 @@ CONSTANTS = {
/* Hacknet Node constants */
HacknetNodeMoneyGainPerLevel: 0.75,
HacknetNodePurchaseNextMult: 1.35, //Multiplier when purchasing an additional hacknet node
HacknetNodeUpgradeLevelMult: 1.07, //Multiplier for cost when upgrading level
HacknetNodeUpgradeRamMult: 1.2, //Multiplier for cost when upgrading RAM
HacknetNodeUpgradeCoreMult: 1.5, //Multiplier for cost when buying another core
HacknetNodeUpgradeLevelMult: 1.06, //Multiplier for cost when upgrading level
HacknetNodeUpgradeRamMult: 1.15, //Multiplier for cost when upgrading RAM
HacknetNodeUpgradeCoreMult: 1.45, //Multiplier for cost when buying another core
/* Augmentation */
//NeuroFlux Governor cost multiplier as you level up
NeuroFluxGovernorLevelMult: 1.1,
NeuroFluxGovernorLevelMult: 1.08,
/* Script related things */
//Time (ms) it takes to run one operation in Netscript.
@ -83,6 +83,12 @@ CONSTANTS = {
ClassManagement: "taking a Management course",
ClassLeadership: "taking a Leadership course",
ClassDataStructuresBaseCost: 1,
ClassNetworksBaseCost: 5,
ClassAlgorithmsBaseCost: 20,
ClassManagementBaseCost: 10,
ClassLeadershipBaseCost: 20,
CrimeShoplift: "shoplift",
CrimeMug: "mug someone",
CrimeDrugs: "deal drugs",

@ -11,14 +11,14 @@ Programs = {
//TODO Right now the times needed to complete work are hard-coded...
//maybe later make this dependent on hacking level or something
function displayCreateProgramContent() {
var portHackALink = document.getElementById("create-program-porthack");
var nukeALink = document.getElementById("create-program-nuke");
var bruteSshALink = document.getElementById("create-program-brutessh");
var ftpCrackALink = document.getElementById("create-program-ftpcrack");
var relaySmtpALink = document.getElementById("create-program-relaysmtp");
var httpWormALink = document.getElementById("create-program-httpworm");
var sqlInjectALink = document.getElementById("create-program-sqlinject");
portHackALink.style.display = "none";
nukeALink.style.display = "none";
bruteSshALink.style.display = "none";
ftpCrackALink.style.display = "none";
relaySmtpALink.style.display = "none";
@ -27,7 +27,7 @@ function displayCreateProgramContent() {
//PortHack.exe (in case you delete it lol)
if (Player.getHomeComputer().programs.indexOf(Programs.NukeProgram) == -1) {
portHackALink.style.display = "block";
nukeALink.style.display = "block";
}
//BruteSSH

@ -1,32 +1,32 @@
/* Crimes.js */
function commitShopliftCrime() {
Player.crimeType = CONSTANTS.CrimeShoplift;
Player.startCrime(0, 0.5, 0.5, 0.5, 0.5, 0, 500, 3000); //$166.66/s, .167 exp/s
Player.startCrime(0, 0.5, 0.5, 0.5, 0.5, 0, 1000, 2000); //$500/s, .25 exp/s
}
function commitMugCrime() {
Player.crimeType = CONSTANTS.CrimeMug;
Player.startCrime(0, 1, 1, 1, 1, 0, 1000, 5000); //$200/s, .2 exp/s
Player.startCrime(0, 1, 1, 1, 1, 0, 3000, 4000); //$750/s, .2 exp/s
}
function commitDealDrugsCrime() {
Player.crimeType = CONSTANTS.CrimeDrugs;
Player.startCrime(0, 2, 2, 2, 2, 2, 2500, 10000); //$250/s, .2 exp/s
Player.startCrime(0, 2, 2, 2, 2, 2, 10000, 10000); //$1000/s, .2 exp/s
}
function commitTraffickArmsCrime() {
Player.crimeType = CONSTANTS.CrimeTraffickArms;
Player.startCrime(0, 8, 8, 8, 8, 12, 15000, 40000); //$375/s, .2 combat exp/s, .3 cha exp/s
Player.startCrime(0, 8, 8, 8, 8, 12, 60000, 40000); //$1500/s, .2 combat exp/s, .3 cha exp/s
}
function commitHomicideCrime() {
Player.crimeType = CONSTANTS.CrimeHomicide;
Player.startCrime(0, 2, 2, 2, 2, 0, 600, 3000); //$200/s, 0.66 combat exp/s
Player.startCrime(0, 2, 2, 2, 2, 0, 1000, 3000); //$333.3/s, 0.66 combat exp/s
}
function commitKidnapCrime() {
Player.crimeType = CONSTANTS.CrimeKidnap;
Player.startCrime(0, 20, 20, 20, 20, 20, 50000, 120000); //$416.67/s. .167 exp/s
Player.startCrime(0, 20, 20, 20, 20, 20, 200000, 120000); //$1666.666/s. .167 exp/s
}
function determineCrimeSuccess(crime, moneyGained) {
@ -95,7 +95,7 @@ function determineCrimeChanceTraffickArms() {
Player.strength / CONSTANTS.MaxSkillLevel +
Player.defense / CONSTANTS.MaxSkillLevel +
Player.dexterity / CONSTANTS.MaxSkillLevel +
Player.agility / CONSTANTS.MaxSkillLevel));
Player.agility / CONSTANTS.MaxSkillLevel)) / 2;
return Math.min(chance, 1);
}

@ -1525,18 +1525,12 @@ displayUniversityLocationContent = function(costMult) {
classManagementButton.style.display = "block";
classLeadershipButton.style.display = "block";
//Costs (per second)
var baseDataStructuresCost = 1;
var baseNetworksCost = 5;
var baseAlgorithmsCost = 20;
var baseManagementCost = 10;
var baseLeadershipCost = 20;
var dataStructuresCost = baseDataStructuresCost * costMult;
var networksCost = baseNetworksCost * costMult;
var algorithmsCost = baseAlgorithmsCost * costMult;
var managementCost = baseManagementCost * costMult;
var leadershipCost = baseLeadershipCost * costMult;
//Costs (per second)
var dataStructuresCost = CONSTANTS.ClassDataStructuresBaseCost * costMult;
var networksCost = CONSTANTS.ClassNetworksBaseCost * costMult;
var algorithmsCost = CONSTANTS.ClassAlgorithmsBaseCost * costMult;
var managementCost = CONSTANTS.ClassManagementBaseCost * costMult;
var leadershipCost = CONSTANTS.ClassLeadershipBaseCost * costMult;
//Update button text to show cost
classDataStructuresButton.innerHTML = "Take Data Structures course ($" + dataStructuresCost + " / sec)";

@ -172,7 +172,7 @@ PlayerObject.prototype.init = function() {
AddToAllServers(t_homeComp);
this.getHomeComputer().programs.push(Programs.NukeProgram);
}
}
PlayerObject.prototype.getCurrentServer = function() {
return AllServers[this.currentServer];
@ -792,19 +792,13 @@ PlayerObject.prototype.startClass = function(costMult, expMult, className) {
this.className = className;
var gameCPS = 1000 / Engine._idleSpeed;
//Base costs/exp (per second)
var baseDataStructuresCost = 1;
var baseNetworksCost = 5;
var baseAlgorithmsCost = 20;
var baseManagementCost = 10;
var baseLeadershipCost = 20;
var baseStudyComputerScienceExp = 0.02;
var baseDataStructuresExp = 0.1;
var baseNetworksExp = 0.4;
var baseAlgorithmsExp = 1.5;
var baseManagementExp = 0.8;
var baseLeadershipExp = 1.5;
var baseStudyComputerScienceExp = 0.05;
var baseDataStructuresExp = 0.2;
var baseNetworksExp = 0.8;
var baseAlgorithmsExp = 2.0;
var baseManagementExp = 1.0;
var baseLeadershipExp = 2.0;
//Find cost and exp gain per game cycle
var cost = 0;
@ -815,23 +809,23 @@ PlayerObject.prototype.startClass = function(costMult, expMult, className) {
hackExp = baseStudyComputerScienceExp * expMult / gameCPS;
break;
case CONSTANTS.ClassDataStructures:
cost = baseDataStructuresCost * costMult / gameCPS;
cost = CONSTANTS.ClassDataStructuresBaseCost * costMult / gameCPS;
hackExp = baseDataStructuresExp * expMult / gameCPS;
break;
case CONSTANTS.ClassNetworks:
cost = baseNetworksCost * costMult / gameCPS;
cost = CONSTANTS.ClassNetworksBaseCost * costMult / gameCPS;
hackExp = baseNetworksExp * expMult / gameCPS;
break;
case CONSTANTS.ClassAlgorithms:
cost = baseAlgorithmsCost * costMult / gameCPS;
cost = CONSTANTS.ClassAlgorithmsBaseCost * costMult / gameCPS;
hackExp = baseAlgorithmsExp * expMult / gameCPS;
break;
case CONSTANTS.ClassManagement:
cost = baseManagementCost * costMult / gameCPS;
cost = CONSTANTS.ClassManagementBaseCost * costMult / gameCPS;
chaExp = baseManagementExp * expMult / gameCPS;
break;
case CONSTANTS.ClassLeadership:
cost = baseLeadershipCost * costMult / gameCPS;
cost = CONSTANTS.ClassLeadershipBaseCost * costMult / gameCPS;
chaExp = baseLeadershipExp * expMult / gameCPS;
break;
default:
@ -951,11 +945,16 @@ PlayerObject.prototype.startCrime = function(hackExp, strExp, defExp, dexExp, ag
PlayerObject.prototype.commitCrime = function (numCycles) {
this.timeWorked += Engine._idleSpeed * numCycles;
if (this.timeWorked >= this.timeNeededToCompleteWork) {Player.finishCrime(false);}
if (this.timeWorked >= this.timeNeededToCompleteWork) {Player.finishCrime(false); return;}
var percent = Math.round(Player.timeWorked / Player.timeNeededToCompleteWork * 100);
var numBars = Math.round(percent / 5);
var progressBar = "[" + Array(numBars+1).join("|") + Array(20 - numBars + 1).join(" ") + "]";
var txt = document.getElementById("work-in-progress-text");
txt.innerHTML = "You are attempting to " + Player.crimeType + ".<br>" +
"Time remaining: " + convertTimeMsToTimeElapsedString(this.timeNeededToCompleteWork - this.timeWorked);
"Time remaining: " + convertTimeMsToTimeElapsedString(this.timeNeededToCompleteWork - this.timeWorked) + "<br>" +
progressBar.replace( / /g, "&nbsp;" );
}
PlayerObject.prototype.finishCrime = function(cancelled) {

@ -54,9 +54,7 @@ function prestigeAugmentation() {
Player.charisma_exp = 0;
Player.money = 1000;
Player.homeComputer = "";
Player.city = Locations.Sector12;
Player.location = "";
@ -101,12 +99,23 @@ function prestigeAugmentation() {
Player.lastUpdate = new Date().getTime();
//Delete all servers
var homeComp = null;
//Delete all servers except home computer
for (var member in AllServers) {
//Don't delete home computer
if (member == Player.homeComputer) {
homeComp = AllServers[member];
continue;
}
delete AllServers[member];
}
AllServers = {};
//Reset home computer (only the programs) and add to AllServers
homeComp.programs.length = 0;
homeComp.programs.push(Programs.NukeProgram);
addToAllServers(homeComp);
//Delete all running scripts objects
for (var i = 0; i < workerScripts.length; ++i) {
workerScripts[i].env.stopFlag = true;
@ -143,10 +152,8 @@ function prestigeAugmentation() {
//Inititialization
SpecialServerIps = new SpecialServerIpsMap();
Player.init();
initForeignServers();
initCompanies();
//CompanyPositions.init(); Dont think this is needed
Engine.loadTerminalContent();
}

@ -410,13 +410,13 @@ initForeignServers = function() {
var SigmaCosmeticsServer = new Server();
SigmaCosmeticsServer.init(createRandomIp(), "sigma-cosmetics", "Sigma Cosmetics", true, false, false, false, 0);
SigmaCosmeticsServer.setHackingParameters(5, 500000, 10, 10);
SigmaCosmeticsServer.setHackingParameters(5, 750000, 10, 10);
SigmaCosmeticsServer.setPortProperties(0);
AddToAllServers(SigmaCosmeticsServer);
var JoesGunsServer = new Server();
JoesGunsServer.init(createRandomIp(), "joesguns", "Joe's Guns", true, false, false, false, 2);
JoesGunsServer.setHackingParameters(10, 200000, 20, 25);
JoesGunsServer.setHackingParameters(10, 600000, 20, 20);
JoesGunsServer.setPortProperties(0);
AddToAllServers(JoesGunsServer);
@ -428,74 +428,74 @@ initForeignServers = function() {
var NectarNightclubServer = new Server();
NectarNightclubServer.init(createRandomIp(), "nectar-net", "Nectar Nightclub Network", true, false, false, false, 2);
NectarNightclubServer.setHackingParameters(20, 400000, 20, 25);
NectarNightclubServer.setHackingParameters(20, 6500000, 20, 25);
NectarNightclubServer.setPortProperties(0);
AddToAllServers(NectarNightclubServer);
var NeoNightclubServer = new Server();
NeoNightclubServer.init(createRandomIp(), "neo-net", "Neo Nightclub Network", true, false, false, false, 2);
NeoNightclubServer.setHackingParameters(50, 500000, 25, 25);
NeoNightclubServer.setHackingParameters(50, 900000, 25, 25);
NeoNightclubServer.setPortProperties(1);
AddToAllServers(NeoNightclubServer);
var SilverHelixServer = new Server();
SilverHelixServer.init(createRandomIp(), "silver-helix", "Silver Helix", true, false, false, false, 2);
SilverHelixServer.setHackingParameters(150, 1000000, 30, 30);
SilverHelixServer.setHackingParameters(150, 5000000, 30, 30);
SilverHelixServer.setPortProperties(2);
AddToAllServers(SilverHelixServer);
var HongFangTeaHouseServer = new Server();
HongFangTeaHouseServer.init(createRandomIp(), "hong-fang-tea", "HongFang Teahouse", true, false, false, false, 0);
HongFangTeaHouseServer.setHackingParameters(30, 250000, 15, 10);
HongFangTeaHouseServer.setHackingParameters(30, 800000, 15, 15);
HongFangTeaHouseServer.setPortProperties(0);
AddToAllServers(HongFangTeaHouseServer);
var HaraKiriSushiBarServer = new Server();
HaraKiriSushiBarServer.setHackingParameters(40, 100000, 15, 40);
HaraKiriSushiBarServer.setHackingParameters(40, 800000, 15, 40);
HaraKiriSushiBarServer.init(createRandomIp(), "harakiri-sushi", "HaraKiri Sushi Bar Network", true, false, false, false, 0);
HaraKiriSushiBarServer.setPortProperties(1);
AddToAllServers(HaraKiriSushiBarServer);
var PhantasyServer = new Server();
PhantasyServer.init(createRandomIp(), "phantasy", "Phantasy Club", true, false, false, false, 4);
PhantasyServer.setHackingParameters(100, 300000, 20, 35);
PhantasyServer.setHackingParameters(100, 1500000, 20, 35);
PhantasyServer.setPortProperties(2);
AddToAllServers(PhantasyServer);
var MaxHardwareServer = new Server();
MaxHardwareServer.init(createRandomIp(), "max-hardware", "Max Hardware Store", true, false, false, false, 0);
MaxHardwareServer.setHackingParameters(80, 150000, 15, 25);
MaxHardwareServer.setHackingParameters(80, 800000, 15, 25);
MaxHardwareServer.setPortProperties(1);
AddToAllServers(MaxHardwareServer);
var OmegaSoftwareServer = new Server();
OmegaSoftwareServer.init(createRandomIp(), "omega-net", "Omega Software", true, false, false, false, 8);
OmegaSoftwareServer.setHackingParameters(200, 1000000, 30, 30);
OmegaSoftwareServer.setHackingParameters(200, 10000000, 30, 35);
OmegaSoftwareServer.setPortProperties(2);
AddToAllServers(OmegaSoftwareServer);
//Gyms
var CrushFitnessGymServer = new Server();
CrushFitnessGymServer.init(createRandomIp(), "crush-fitness", "Crush Fitness", true, false, false, false, 0);
CrushFitnessGymServer.setHackingParameters(250, 300000, 40, 25);
CrushFitnessGymServer.setHackingParameters(250, 5000000, 40, 25);
CrushFitnessGymServer.setPortProperties(2);
AddToAllServers(CrushFitnessGymServer);
var IronGymServer = new Server();
IronGymServer.init(createRandomIp(), "iron-gym", "Iron Gym Network", true, false, false, false, 0);
IronGymServer.setHackingParameters(100, 150000, 30, 15);
IronGymServer.setHackingParameters(100, 2500000, 30, 15);
IronGymServer.setPortProperties(1);
AddToAllServers(IronGymServer);
var MilleniumFitnessGymServer = new Server();
MilleniumFitnessGymServer.init(createRandomIp(), "millenium-fitness", "Millenium Fitness Network", true, false, false, false, 0);
MilleniumFitnessGymServer.setHackingParameters(500, 400000, 50, 30);
MilleniumFitnessGymServer.setHackingParameters(500, 7500000, 50, 30);
MilleniumFitnessGymServer.setPortProperties(3);
AddToAllServers(MilleniumFitnessGymServer);
var PowerhouseGymServer = new Server();
PowerhouseGymServer.init(createRandomIp(), "powerhouse-fitness", "Powerhouse Fitness", true, false, false, false, 0);
PowerhouseGymServer.setHackingParameters(1000, 1000000, 60, 50);
PowerhouseGymServer.setHackingParameters(1000, 20000000, 60, 50);
PowerhouseGymServer.setPortProperties(5);
AddToAllServers(PowerhouseGymServer);

@ -932,7 +932,7 @@ var Engine = {
});
//Create Program buttons
var portHackALink = document.getElementById("create-program-porthack");
var portHackALink = document.getElementById("create-program-nuke");
var bruteSshALink = document.getElementById("create-program-brutessh");
var ftpCrackALink = document.getElementById("create-program-ftpcrack");
var relaySmtpALink = document.getElementById("create-program-relaysmtp");

@ -42,7 +42,7 @@ purchaseRamForHomeBoxCreate = function() {
purchaseRamForHomeBoxSetText("Would you like to purchase additional RAM for your home computer? <br><br>" +
"This will upgrade your RAM from " + currentRam + "GB to " + newRam + "GB. <br><br>" +
"This will cost $" + cost);
"This will cost $" + formatNumber(cost, 2));
purchaseRamForHomeBoxOpen();