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
+12 -10
View File
@@ -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>" +
+10 -4
View File
@@ -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",
+3 -3
View File
@@ -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
+7 -7
View File
@@ -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);
}
+6 -12
View File
@@ -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)";
+19 -20
View File
@@ -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) {
+13 -6
View File
@@ -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();
}
+14 -14
View File
@@ -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);
+1 -1
View File
@@ -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");