diff --git a/src/ActiveScriptsUI.js b/src/ActiveScriptsUI.js
new file mode 100644
index 000000000..12903448b
--- /dev/null
+++ b/src/ActiveScriptsUI.js
@@ -0,0 +1,222 @@
+/* Active Scripts UI*/
+
+function setActiveScriptsClickHandlers() {
+ //Server panel click handlers
+ var serverPanels = document.getElementsByClassName("active-scripts-server-header");
+ if (serverPanels == null) {
+ console.log("ERROR: Could not find Active Scripts server panels");
+ return;
+ }
+ for (i = 0; i < serverPanels.length; ++i) {
+ serverPanels[i].onclick = function() {
+ this.classList.toggle("active");
+
+ var panel = this.nextElementSibling;
+ if (panel.style.display === "block") {
+ panel.style.display = "none";
+ } else {
+ panel.style.display = "block";
+ }
+ }
+ }
+
+ //Script Panel click handlers
+ var scriptPanels = document.getElementsByClassName("active-scripts-script-header");
+ if (scriptPanels == null) {
+ console.log("ERROR: Could not find Active Scripts panels for individual scripts");
+ return;
+ }
+ for (var i = 0; i < scriptPanels.length; ++i) {
+ scriptPanels[i].onclick = function() {
+ this.classList.toggle("active");
+
+ var panel = this.nextElementSibling;
+ if (panel.style.display === "block") {
+ panel.style.display = "none";
+ } else {
+ panel.style.display = "block";
+ }
+ }
+ }
+}
+
+//Returns the ul element containins all script items for a specific server
+function getActiveScriptsServerList(server) {
+ if (server == null) {return null;}
+ var panelname = "active-scripts-server-panel-" + server.hostname;
+ var item = document.getElementById(panelname + "-script-list");
+ if (item == null) {
+ console.log("ERROR: Cannot find list for: " + server.hostname);
+ }
+ return item;
+}
+
+function createActiveScriptsServerPanel(server) {
+ var panelname = "active-scripts-server-panel-" + server.hostname;
+ var activeScriptsList = document.getElementById("active-scripts-list");
+
+ //Div of entire Panel
+ var panelDiv = document.createElement("div");
+ panelDiv.setAttribute("id", panelname);
+
+ //Panel Header
+ var panelHdr = document.createElement("button");
+ panelHdr.setAttribute("class", "active-scripts-server-header")
+ panelHdr.setAttribute("id", panelname + "-hdr");
+ panelHdr.innerHTML = server.hostname;
+
+ //Panel content
+ var panelContentDiv = document.createElement("div");
+ panelContentDiv.setAttribute("class", "active-scripts-server-panel");
+ panelContentDiv.setAttribute("id", panelname + "-content");
+
+ //List of scripts
+ var panelScriptList = document.createElement("ul");
+ panelScriptList.setAttribute("id", panelname + "-script-list");
+
+ panelContentDiv.appendChild(panelScriptList);
+ panelDiv.appendChild(panelHdr);
+ panelDiv.appendChild(panelContentDiv);
+ activeScriptsList.appendChild(panelDiv);
+
+ setActiveScriptsClickHandlers() //Reset click handlers
+
+ return panelDiv;
+ //TODO Alphabetize Active Scripts list?
+}
+
+//Deletes the info for a particular server (Dropdown header + Panel with all info)
+//in the Active Scripts page if it exists
+function deleteActiveScriptsServerPanel(server) {
+ var panelname = "active-scripts-server-panel-" + server.hostname;
+ var panel = document.getElementById(panelname);
+ if (panel == null) {
+ console.log("No such panel exists: " + panelname);
+ return;
+ }
+
+ //Remove the panel if it has no elements
+ var scriptList = document.getElementById(panelname + "-script-list");
+ if (scriptList.childNodes.length == 0) {
+ panel.parentNode.removeChild(panel);
+ }
+}
+
+function addActiveScriptsItem(workerscript) {
+ //Get server panel
+ var server = getServer(workerscript.serverIp);
+ if (server == null) {
+ console.log("ERROR: Invalid server IP for workerscript.");
+ return;
+ }
+ var panelname = "active-scripts-server-panel-" + server.hostname;
+
+ var panel = document.getElementById(panelname);
+ if (panel == null) {
+ panel = createActiveScriptsServerPanel(server);
+ }
+
+ //Create the element itself. Each element is an accordion collapsible
+ var itemName = "active-scripts-" + server.hostname + "-" + workerscript.name;
+ var item = document.createElement("li");
+ item.setAttribute("id", itemName);
+
+ var btn = document.createElement("button");
+ btn.setAttribute("class", "active-scripts-script-header");
+ btn.innerHTML = workerscript.name;
+
+ var itemContentDiv = document.createElement("div");
+ itemContentDiv.setAttribute("class", "active-scripts-script-panel");
+ itemContentDiv.setAttribute("id", itemName + "-content");
+
+ item.appendChild(btn);
+ item.appendChild(itemContentDiv);
+
+ createActiveScriptsText(workerscript, itemContentDiv);
+
+ //Append element to list
+ var list = getActiveScriptsServerList(server);
+ list.appendChild(item);
+
+ setActiveScriptsClickHandlers() //Reset click handlers
+}
+
+function deleteActiveScriptsItem(workerscript) {
+ var server = getServer(workerscript.serverIp);
+ if (server == null) {
+ console.log("ERROR: Invalid server IP for workerscript.");
+ return;
+ }
+ var itemName = "active-scripts-" + server.hostname + "-" + workerscript.name;
+ var li = document.getElementById(itemName);
+ if (li == null) {
+ console.log("could not find Active scripts li element for: " + workerscript.name);
+ return;
+ }
+ li.parentNode.removeChild(li);
+ deleteActiveScriptsServerPanel(server);
+}
+
+//Update the ActiveScriptsItems array
+function updateActiveScriptsItems() {
+ var total = 0;
+ for (var i = 0; i < workerScripts.length; ++i) {
+ total += updateActiveScriptsItemContent(workerScripts[i]);
+ }
+ document.getElementById("active-scripts-total-prod").innerHTML =
+ "Total online production rate: $" + formatNumber(total, 2) + " / second";
+}
+
+//Updates the content of the given item in the Active Scripts list
+function updateActiveScriptsItemContent(workerscript) {
+ var server = getServer(workerscript.serverIp);
+ if (server == null) {
+ console.log("ERROR: Invalid server IP for workerscript.");
+ return;
+ }
+ var itemName = "active-scripts-" + server.hostname + "-" + workerscript.name;
+ var itemContent = document.getElementById(itemName + "-content")
+
+ //Clear the item
+ while (itemContent.firstChild) {
+ itemContent.removeChild(itemContent.firstChild);
+ }
+
+ //Add the updated text back. Returns the total online production rate
+ return createActiveScriptsText(workerscript, itemContent);
+}
+
+function createActiveScriptsText(workerscript, item) {
+ var itemText = document.createElement("p");
+
+ //Server ip/hostname
+ var hostname = workerscript.getServer().hostname;
+ var serverIpHostname = "Server: " + hostname + "(" + workerscript.serverIp + ")";
+
+ //Online
+ var onlineTotalMoneyMade = "Total online production: $" + formatNumber(workerscript.scriptRef.onlineMoneyMade, 2);
+ var onlineTotalExpEarned = (Array(26).join(" ") + formatNumber(workerscript.scriptRef.onlineExpGained, 2) + " hacking exp").replace( / /g, " ");
+
+ var onlineMps = workerscript.scriptRef.onlineMoneyMade / workerscript.scriptRef.onlineRunningTime;
+ var onlineMpsText = "Online production rate: $" + formatNumber(onlineMps, 2) + "/second";
+ var onlineEps = workerscript.scriptRef.onlineExpGained / workerscript.scriptRef.onlineRunningTime;
+ var onlineEpsText = (Array(25).join(" ") + formatNumber(onlineEps, 4) + " hacking exp/second").replace( / /g, " ");
+
+ //Offline
+ var offlineTotalMoneyMade = "Total offline production: $" + formatNumber(workerscript.scriptRef.offlineMoneyMade, 2);
+ var offlineTotalExpEarned = (Array(27).join(" ") + formatNumber(workerscript.scriptRef.offlineExpGained, 2) + " hacking exp").replace( / /g, " ");
+
+ var offlineMps = workerscript.scriptRef.offlineMoneyMade / workerscript.scriptRef.offlineRunningTime;
+ var offlineMpsText = "Offline production rate: $" + formatNumber(offlineMps, 2) + "/second";
+ var offlineEps = workerscript.scriptRef.offlineExpGained / workerscript.scriptRef.offlineRunningTime;
+ var offlineEpsText = (Array(26).join(" ") + formatNumber(offlineEps, 4) + " hacking exp/second").replace( / /g, " ");
+
+ itemText.innerHTML = serverIpHostname + "
" + onlineTotalMoneyMade + "
" + onlineTotalExpEarned + "
" +
+ onlineMpsText + "
" + onlineEpsText + "
" + offlineTotalMoneyMade + "
" + offlineTotalExpEarned + "
" +
+ offlineMpsText + "
" + offlineEpsText + "
";
+
+ item.appendChild(itemText);
+
+ //Return total online production rate
+ return onlineMps;
+}
\ No newline at end of file
diff --git a/src/Constants.js b/src/Constants.js
index bfbb273bb..b04b2479a 100644
--- a/src/Constants.js
+++ b/src/Constants.js
@@ -74,8 +74,8 @@ CONSTANTS = {
ServerWeakenAmount: 0.1, //Amount by which server's security decreases when weakened
//Augmentation Constants
- AugmentationCostMultiplier: 4.5, //Used for balancing costs without having to readjust every Augmentation cost
- AugmentationRepMultiplier: 1.2, //Used for balancing rep cost without having to readjust every value
+ AugmentationCostMultiplier: 5, //Used for balancing costs without having to readjust every Augmentation cost
+ AugmentationRepMultiplier: 1.5, //Used for balancing rep cost without having to readjust every value
//Maximum number of log entries for a script
MaxLogCapacity: 40,
@@ -560,7 +560,8 @@ CONSTANTS = {
"-Server growth no longer happens naturally
" +
"-Servers now have a maximum limit to their money. This limit is 50 times it's starting money
" +
"-Hacking now grants 10% less hacking experience
" +
- "-You can now edit scripts that are running
" +
+ "-You can now edit scripts that are running
+ " +
+ "-Augmentations cost ~11% more money and 25% more faction reputation
" +
"v0.19.7
" +
"-Added changelog to Options menu
" +
"-Bug fix with autocompletion (wasn't working properly for capitalized filenames/programs
" +
@@ -644,7 +645,7 @@ CONSTANTS = {
"-You can now see what an Augmentation does and its price even while its locked
",
LatestUpdate:
- "v0.20.0
" +
+ "v0.20.0
" +
"-Refactored Netscript Interpreter code. Operations in Netscript should now run significantly faster (Every operation " +
"such as a variable assignment, a function call, a binary operator, getting a variable's value, etc. used to take up to several seconds, " +
"now each one should only take 750 milliseconds).
" +
@@ -669,5 +670,6 @@ CONSTANTS = {
"-Server growth no longer happens naturally
" +
"-Servers now have a maximum limit to their money. This limit is 50 times it's starting money
" +
"-Hacking now grants 10% less hacking experience
" +
- "-You can now edit scripts that are running
",
+ "-You can now edit scripts that are running
+ " +
+ "-Augmentations cost ~11% more money and 25% more faction reputation
",
}
\ No newline at end of file
diff --git a/src/NetscriptEvaluator.js b/src/NetscriptEvaluator.js
index 249ffd88c..78623ed88 100644
--- a/src/NetscriptEvaluator.js
+++ b/src/NetscriptEvaluator.js
@@ -268,7 +268,7 @@ function evaluate(exp, workerScript) {
Promise.all(argPromises).then(function(args) {
if (env.stopFlag) {return reject(workerScript);}
filename = args[0];
- if (exp.args.length == 2) {
+ if (exp.args.length == 1) {
return Promise.resolve(workerScript.serverIp);
} else {
return evaluate(exp.args[1], workerScript);
@@ -448,7 +448,7 @@ function evaluate(exp, workerScript) {
Promise.all(argPromises).then(function(args) {
if (env.stopFlag) {return reject(workerScript);}
filename = args[0];
- if (exp.args.length == 2) {
+ if (exp.args.length == 1) {
return Promise.resolve(workerScript.serverIp);
} else {
return evaluate(exp.args[1], workerScript);
@@ -484,7 +484,7 @@ function evaluate(exp, workerScript) {
Promise.all(argPromises).then(function(args) {
if (env.stopFlag) {return reject(workerScript);}
filename = args[0];
- if (exp.args.length == 2) {
+ if (exp.args.length == 1) {
return Promise.resolve(workerScript.serverIp);
} else {
return evaluate(exp.args[1], workerScript);
diff --git a/src/NetscriptFunctions.js b/src/NetscriptFunctions.js
index 3add329cc..9f13539b5 100644
--- a/src/NetscriptFunctions.js
+++ b/src/NetscriptFunctions.js
@@ -147,10 +147,10 @@ function netscriptGrow(exp, workerScript) {
server.moneyAvailable += 1; //It can be grown even if it has no money
var growthPercentage = processSingleServerGrowth(server, 450);
workerScript.scriptRef.recordGrow(server.ip);
- workerScript.scriptRef.log("Available money on " + server.hostname + " grown by "
- + formatNumber(growthPercentage*100 - 100, 6) + "%");
var expGain = 0.5 * Player.hacking_exp_mult;
- workerScript.scriptRef.log("Gained " + expGain + " hacking experience");
+ workerScript.scriptRef.log("Available money on " + server.hostname + " grown by "
+ + formatNumber(growthPercentage*100 - 100, 6) + "%. Gained " +
+ formatNumber(expGain, 4) + " hacking exp");
workerScript.scriptRef.onlineExpGained += expGain;
Player.gainHackingExp(expGain);
return Promise.resolve(growthPercentage);
@@ -194,10 +194,9 @@ function netscriptWeaken(exp, workerScript) {
if (env.stopFlag) {return Promise.reject(workerScript);}
server.weaken(CONSTANTS.ServerWeakenAmount);
workerScript.scriptRef.recordWeaken(server.ip);
- workerScript.scriptRef.log("Server security level on " + server.hostname + " weakened to " + server.hackDifficulty);
- workerScript.scriptRef.log("Gained 3 hacking experience");
var expGain = 3 * Player.hacking_exp_mult;
- workerScript.scriptRef.log("Gained " + expGain + " hacking experience");
+ workerScript.scriptRef.log("Server security level on " + server.hostname + " weakened to " + server.hackDifficulty +
+ ". Gained " + formatNumber(expGain, 4) + " hacking exp");
workerScript.scriptRef.onlineExpGained += expGain;
Player.gainHackingExp(expGain);
return Promise.resolve(CONSTANTS.ServerWeakenAmount);