diff --git a/src/Constants.ts b/src/Constants.ts index babe87666..305101fcd 100644 --- a/src/Constants.ts +++ b/src/Constants.ts @@ -6,7 +6,7 @@ import { IMap } from "./types"; export let CONSTANTS: IMap = { - Version: "0.47.0", + Version: "0.47.1", /** Max level for any skill, assuming no multipliers. Determined by max numerical value in javascript for experience * and the skill level formula in Player.js. Note that all this means it that when experience hits MAX_INT, then @@ -230,51 +230,9 @@ export let CONSTANTS: IMap = { * Scripts now start/stop instantly * Improved performance when starting up many copies of a new NetscriptJS script (by Ornedan) + * Improved performance when killing scripts * Dialog boxes can now be closed with the ESC key (by jaguilar) * NetscriptJS scripts should now be "re-compiled" if their dependencies change (by jaguilar) * write() function should now properly cause NetscriptJS scripts to "re-compile" (by jaguilar) - - v0.47.0 - * Stock Market changes: - ** Implemented spread. Stock's now have bid and ask prices at which transactions occur - ** Large transactions will now influence a stock's price and forecast - ** This "influencing" can take effect in the middle of a transaction - ** See documentation for more details on these changes - ** Added getStockAskPrice(), getStockBidPrice() Netscript functions to the TIX API - ** Added getStockPurchaseCost(), getStockSaleGain() Netscript functions to the TIX API - - * Re-sleeves can no longer have the NeuroFlux Governor augmentation - ** This is just a temporary patch until the mechanic gets re-worked - - * hack(), grow(), and weaken() functions now take optional arguments for number of threads to use (by MasonD) - * codingcontract.attempt() now takes an optional argument that allows you to configure the function to return a contract's reward - * Adjusted RAM costs of Netscript Singularity functions (mostly increased) - * Adjusted RAM cost of codingcontract.getNumTriesRemaining() Netscript function - * Netscript Singularity functions no longer cost extra RAM outside of BitNode-4 - * Corporation employees no longer have an "age" stat - * Gang Wanted level gain rate capped at 100 (per employee) - * Script startup/kill is now processed every 3 seconds, instead of 6 seconds - * getHackTime(), getGrowTime(), and getWeakenTime() now return Infinity if called on a Hacknet Server - * Money/Income tracker now displays money lost from hospitalizations - * Exported saves now have a unique filename based on current BitNode and timestamp - * Maximum number of Hacknet Servers decreased from 25 to 20 - * Bug Fix: Corporation employees stats should no longer become negative - * Bug Fix: Fixed sleeve.getInformation() throwing error in certain scenarios - * Bug Fix: Coding contracts should no longer generate on the w0r1d_d43m0n server - * Bug Fix: Duplicate Sleeves now properly have access to all Augmentations if you have a gang - * Bug Fix: getAugmentationsFromFaction() & purchaseAugmentation() functions should now work properly if you have a gang - * Bug Fix: Fixed issue that caused messages (.msg) to be sent when refreshing/reloading the game - * Bug Fix: Purchasing hash upgrades for Bladeburner/Corporation when you don't actually have access to those mechanics no longer gives hashes - * Bug Fix: run(), exec(), and spawn() Netscript functions now throw if called with 0 threads - * Bug Fix: Faction UI should now automatically update reputation - * Bug Fix: Fixed purchase4SMarketData() - * Bug Fix: Netscript1.0 now works properly for multiple 'namespace' imports (import * as namespace from "script") - * Bug Fix: Terminal 'wget' command now correctly evaluates directory paths - * Bug Fix: wget(), write(), and scp() Netscript functions now fail if an invalid filepath is passed in - * Bug Fix: Having Corporation warehouses at full capacity should no longer freeze game in certain conditions - * Bug Fix: Prevented an exploit that allows you to buy multiple copies of an Augmentation by holding the 'Enter' button - * Bug Fix: gang.getOtherGangInformation() now properly returns a deep copy - * Bug Fix: Fixed getScriptIncome() returning an undefined value - * Bug Fix: Fixed an issue with Hacknet Server hash rate not always updating ` } diff --git a/src/NetscriptWorker.js b/src/NetscriptWorker.js index 0d69234d2..66f709870 100644 --- a/src/NetscriptWorker.js +++ b/src/NetscriptWorker.js @@ -409,7 +409,7 @@ function processNetscript1Imports(code, workerScript) { } /** - * + * Find and return the next availble PID for a script */ let pidCounter = 1; function generateNextPid() { diff --git a/src/Terminal.js b/src/Terminal.js index 12e150742..ae05244bb 100644 --- a/src/Terminal.js +++ b/src/Terminal.js @@ -55,6 +55,7 @@ import { Message } from "./Message/Message"; import { showMessage } from "./Message/MessageHelpers"; import { addWorkerScript } from "./NetscriptWorker"; import { killWorkerScript } from "./Netscript/killWorkerScript"; +import { WorkerScriptStartStopEventEmitter } from "./Netscript/WorkerScriptStartStopEventEmitter"; import { Player } from "./Player"; import { hackWorldDaemon } from "./RedPill"; import { RunningScript } from "./Script/RunningScript"; @@ -1146,8 +1147,9 @@ let Terminal = { } case "killall": { for (let i = s.runningScripts.length - 1; i >= 0; --i) { - killWorkerScript(s.runningScripts[i], s.ip); + killWorkerScript(s.runningScripts[i], s.ip, false); } + WorkerScriptStartStopEventEmitter.emitEvent(); post("Killing all running scripts. May take up to a few minutes for the scripts to die..."); break; } @@ -1250,7 +1252,7 @@ let Terminal = { } for (let i = 0; i < s.runningScripts.length; i++) { let rsObj = s.runningScripts[i]; - let res = rsObj.filename; + let res = `(PID - ${rsObj.pid}) ${rsObj.filename}`; for (let j = 0; j < rsObj.args.length; ++j) { res += (" " + rsObj.args[j].toString()); } @@ -1432,7 +1434,23 @@ let Terminal = { return; } - post("Script Threads RAM Usage"); + // Headers + const scriptWidth = 40; + const pidWidth = 10; + const threadsWidth = 16; + + const scriptTxt = "Script"; + const pidTxt = "PID"; + const threadsTxt = "Threads"; + const ramTxt = "RAM Usage"; + + const spacesAfterScriptTxt = " ".repeat(scriptWidth - scriptTxt.length); + const spacesAfterPidTxt = " ".repeat(pidWidth - pidTxt.length); + const spacesAfterThreadsTxt = " ".repeat(threadsWidth - threadsTxt.length); + + const headers = `${scriptTxt}${spacesAfterScriptTxt}${pidTxt}${spacesAfterPidTxt}${threadsTxt}${spacesAfterThreadsTxt}${ramTxt}`; + + post(headers); let currRunningScripts = s.runningScripts; // Iterate through scripts on current server @@ -1440,19 +1458,30 @@ let Terminal = { let script = currRunningScripts[i]; // Calculate name padding - let numSpacesScript = 32 - script.filename.length; // 26 -> width of name column - if (numSpacesScript < 0) {numSpacesScript = 0;} - let spacesScript = Array(numSpacesScript+1).join(" "); + const numSpacesScript = Math.max(0, scriptWidth - script.filename.length); + const spacesScript = " ".repeat(numSpacesScript); + + // Calculate PID padding + const numSpacesPid = Math.max(0, pidWidth - (script.pid + "").length); + const spacesPid = " ".repeat(numSpacesPid); // Calculate thread padding - let numSpacesThread = 16 - (script.threads + "").length; // 16 -> width of thread column - let spacesThread = Array(numSpacesThread+1).join(" "); + const numSpacesThread = Math.max(0, threadsWidth - (script.threads + "").length); + const spacesThread = " ".repeat(numSpacesThread); // Calculate and transform RAM usage - let ramUsage = numeralWrapper.format(getRamUsageFromRunningScript(script) * script.threads, '0.00') + " GB"; + const ramUsage = numeralWrapper.format(getRamUsageFromRunningScript(script) * script.threads, '0.00') + " GB"; - var entry = [script.filename, spacesScript, script.threads, spacesThread, ramUsage]; - post(entry.join("")); + const entry = [ + script.filename, + spacesScript, + script.pid, + spacesPid, + script.threads, + spacesThread, + ramUsage + ].join(""); + post(entry); } break; }