mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-11-29 19:13:49 +01:00
commit
8080e28b64
@ -5,12 +5,15 @@ import {workerScripts,
|
|||||||
import {Player} from "./Player";
|
import {Player} from "./Player";
|
||||||
import {getServer} from "./Server";
|
import {getServer} from "./Server";
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {printArray, createElement,
|
import {createAccordionElement} from "../utils/uiHelpers/createAccordionElement";
|
||||||
createAccordionElement, removeElement,
|
import {arrayToString} from "../utils/helpers/arrayToString";
|
||||||
removeChildrenFromElement, exceptionAlert} from "../utils/HelperFunctions";
|
import {createElement} from "../utils/uiHelpers/createElement";
|
||||||
|
import {exceptionAlert} from "../utils/helpers/exceptionAlert";
|
||||||
import {logBoxCreate} from "../utils/LogBox";
|
import {logBoxCreate} from "../utils/LogBox";
|
||||||
import numeral from "numeral/min/numeral.min";
|
import numeral from "numeral/min/numeral.min";
|
||||||
import {formatNumber} from "../utils/StringHelperFunctions";
|
import {formatNumber} from "../utils/StringHelperFunctions";
|
||||||
|
import {removeChildrenFromElement} from "../utils/uiHelpers/removeChildrenFromElement";
|
||||||
|
import {removeElement} from "../utils/uiHelpers/removeElement";
|
||||||
|
|
||||||
/* {
|
/* {
|
||||||
* serverName: {
|
* serverName: {
|
||||||
@ -110,7 +113,7 @@ function addActiveScriptsItem(workerscript) {
|
|||||||
//Threads, args, kill/log button
|
//Threads, args, kill/log button
|
||||||
panel.appendChild(createElement("p", {
|
panel.appendChild(createElement("p", {
|
||||||
innerHTML: "Threads: " + workerscript.scriptRef.threads + "<br>" +
|
innerHTML: "Threads: " + workerscript.scriptRef.threads + "<br>" +
|
||||||
"Args: " + printArray(workerscript.args)
|
"Args: " + arrayToString(workerscript.args)
|
||||||
}));
|
}));
|
||||||
var panelText = createElement("p", {
|
var panelText = createElement("p", {
|
||||||
innerText:"Loading...", fontSize:"14px",
|
innerText:"Loading...", fontSize:"14px",
|
||||||
|
@ -12,11 +12,13 @@ import {Script, RunningScript} from "./Script";
|
|||||||
import {Server} from "./Server";
|
import {Server} from "./Server";
|
||||||
import {SourceFiles} from "./SourceFile";
|
import {SourceFiles} from "./SourceFile";
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {createElement, createAccordionElement,
|
import {createAccordionElement} from "../utils/uiHelpers/createAccordionElement";
|
||||||
removeChildrenFromElement, clearObject} from "../utils/HelperFunctions";
|
|
||||||
import {Reviver, Generic_toJSON,
|
import {Reviver, Generic_toJSON,
|
||||||
Generic_fromJSON} from "../utils/JSONReviver";
|
Generic_fromJSON} from "../utils/JSONReviver";
|
||||||
import {isString} from "../utils/StringHelperFunctions";
|
import {clearObject} from "../utils/helpers/clearObject";
|
||||||
|
import {createElement} from "../utils/uiHelpers/createElement";
|
||||||
|
import {isString} from "../utils/helpers/isString";
|
||||||
|
import {removeChildrenFromElement} from "../utils/uiHelpers/removeChildrenFromElement";
|
||||||
|
|
||||||
//Augmentations
|
//Augmentations
|
||||||
function Augmentation(params) {
|
function Augmentation(params) {
|
||||||
|
@ -9,16 +9,22 @@ import {Player} from "./Player";
|
|||||||
import {hackWorldDaemon, redPillFlag} from "./RedPill";
|
import {hackWorldDaemon, redPillFlag} from "./RedPill";
|
||||||
import {KEY} from "./Terminal";
|
import {KEY} from "./Terminal";
|
||||||
|
|
||||||
|
import {createProgressBarText} from "../utils/helpers/createProgressBarText";
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {getRandomInt, addOffset, clearObject,
|
import {removeChildrenFromElement} from "../utils/uiHelpers/removeChildrenFromElement";
|
||||||
createElement, removeChildrenFromElement,
|
|
||||||
exceptionAlert, createPopup, appendLineBreaks,
|
|
||||||
removeElementById, removeElement,
|
|
||||||
createProgressBarText} from "../utils/HelperFunctions";
|
|
||||||
import {Reviver, Generic_toJSON,
|
import {Reviver, Generic_toJSON,
|
||||||
Generic_fromJSON} from "../utils/JSONReviver";
|
Generic_fromJSON} from "../utils/JSONReviver";
|
||||||
import numeral from "numeral/min/numeral.min";
|
import numeral from "numeral/min/numeral.min";
|
||||||
|
import {addOffset} from "../utils/helpers/addOffset";
|
||||||
|
import {appendLineBreaks} from "../utils/uiHelpers/appendLineBreaks";
|
||||||
|
import {clearObject} from "../utils/helpers/clearObject";
|
||||||
|
import {createElement} from "../utils/uiHelpers/createElement";
|
||||||
|
import {createPopup} from "../utils/uiHelpers/createPopup";
|
||||||
|
import {exceptionAlert} from "../utils/helpers/exceptionAlert";
|
||||||
import {formatNumber} from "../utils/StringHelperFunctions";
|
import {formatNumber} from "../utils/StringHelperFunctions";
|
||||||
|
import {getRandomInt} from "../utils/helpers/getRandomInt";
|
||||||
|
import {removeElement} from "../utils/uiHelpers/removeElement";
|
||||||
|
import {removeElementById} from "../utils/uiHelpers/removeElementById";
|
||||||
|
|
||||||
|
|
||||||
var CityNames = ["Aevum", "Chongqing", "Sector-12", "New Tokyo", "Ishima", "Volhaven"];
|
var CityNames = ["Aevum", "Chongqing", "Sector-12", "New Tokyo", "Ishima", "Volhaven"];
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
import {Engine} from "./engine";
|
import {Engine} from "./engine";
|
||||||
|
|
||||||
import {removeChildrenFromElement,
|
import {removeChildrenFromElement} from "../utils/uiHelpers/removeChildrenFromElement";
|
||||||
createElement, exceptionAlert} from "../utils/HelperFunctions";
|
import {createElement} from "../utils/uiHelpers/createElement";
|
||||||
import {isString} from "../utils/StringHelperFunctions";
|
import {exceptionAlert} from "../utils/helpers/exceptionAlert";
|
||||||
|
import {isString} from "../utils/helpers/isString";
|
||||||
|
|
||||||
var cinematicTextFlag = false;
|
var cinematicTextFlag = false;
|
||||||
|
|
||||||
|
@ -7,14 +7,17 @@ import {Player} from "./Player";
|
|||||||
|
|
||||||
import Decimal from "decimal.js";
|
import Decimal from "decimal.js";
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {getRandomInt, removeElementById,
|
import {clearSelector} from "../utils/uiHelpers/clearSelector";
|
||||||
createElement, createAccordionElement,
|
|
||||||
removeChildrenFromElement, createPopup,
|
|
||||||
clearSelector} from "../utils/HelperFunctions";
|
|
||||||
import {Reviver, Generic_toJSON,
|
import {Reviver, Generic_toJSON,
|
||||||
Generic_fromJSON} from "../utils/JSONReviver";
|
Generic_fromJSON} from "../utils/JSONReviver";
|
||||||
import numeral from "numeral/min/numeral.min";
|
import numeral from "numeral/min/numeral.min";
|
||||||
import {formatNumber, isString, generateRandomString} from "../utils/StringHelperFunctions";
|
import {createElement} from "../utils/uiHelpers/createElement";
|
||||||
|
import {createPopup} from "../utils/uiHelpers/createPopup";
|
||||||
|
import {formatNumber, generateRandomString} from "../utils/StringHelperFunctions";
|
||||||
|
import {getRandomInt} from "../utils/helpers/getRandomInt";
|
||||||
|
import {isString} from "../utils/helpers/isString";
|
||||||
|
import {removeChildrenFromElement} from "../utils/uiHelpers/removeChildrenFromElement";
|
||||||
|
import {removeElementById} from "../utils/uiHelpers/removeElementById";
|
||||||
import {yesNoBoxCreate, yesNoTxtInpBoxCreate,
|
import {yesNoBoxCreate, yesNoTxtInpBoxCreate,
|
||||||
yesNoBoxGetYesButton, yesNoBoxGetNoButton,
|
yesNoBoxGetYesButton, yesNoBoxGetNoButton,
|
||||||
yesNoTxtInpBoxGetYesButton, yesNoTxtInpBoxGetNoButton,
|
yesNoTxtInpBoxGetYesButton, yesNoTxtInpBoxGetNoButton,
|
||||||
@ -4921,3 +4924,4 @@ Corporation.fromJSON = function(value) {
|
|||||||
Reviver.constructors.Corporation = Corporation;
|
Reviver.constructors.Corporation = Corporation;
|
||||||
|
|
||||||
export {Corporation};
|
export {Corporation};
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import {CONSTANTS} from "./Constants";
|
import {CONSTANTS} from "./Constants";
|
||||||
import {Player} from "./Player";
|
import {Player} from "./Player";
|
||||||
import {createElement} from "../utils/HelperFunctions";
|
import {createElement} from "../utils/uiHelpers/createElement";
|
||||||
|
|
||||||
// a function that returns a requirement for a program that requires only that
|
// a function that returns a requirement for a program that requires only that
|
||||||
// the player has at least the given skill level.
|
// the player has at least the given skill level.
|
||||||
|
@ -3,7 +3,7 @@ import {Player} from "./Player";
|
|||||||
import {SpecialServerIps} from "./SpecialServerIps";
|
import {SpecialServerIps} from "./SpecialServerIps";
|
||||||
import {post} from "./Terminal";
|
import {post} from "./Terminal";
|
||||||
|
|
||||||
import {isValidIPAddress} from "../utils/IPAddress";
|
import {isValidIPAddress} from "../utils/helpers/isValidIPAddress";
|
||||||
import {formatNumber} from "../utils/StringHelperFunctions";
|
import {formatNumber} from "../utils/StringHelperFunctions";
|
||||||
|
|
||||||
|
|
||||||
|
@ -11,8 +11,8 @@ import {Settings} from "./Settings";
|
|||||||
|
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {factionInvitationBoxCreate} from "../utils/FactionInvitationBox";
|
import {factionInvitationBoxCreate} from "../utils/FactionInvitationBox";
|
||||||
import {clearEventListeners, createElement,
|
import {removeChildrenFromElement} from "../utils/uiHelpers/removeChildrenFromElement";
|
||||||
removeChildrenFromElement} from "../utils/HelperFunctions";
|
import {createElement} from "../utils/uiHelpers/createElement";
|
||||||
import {Reviver, Generic_toJSON,
|
import {Reviver, Generic_toJSON,
|
||||||
Generic_fromJSON} from "../utils/JSONReviver";
|
Generic_fromJSON} from "../utils/JSONReviver";
|
||||||
import numeral from "numeral/min/numeral.min";
|
import numeral from "numeral/min/numeral.min";
|
||||||
|
11
src/Gang.js
11
src/Gang.js
@ -6,12 +6,15 @@ import {Player} from "./Player";
|
|||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {Reviver, Generic_toJSON,
|
import {Reviver, Generic_toJSON,
|
||||||
Generic_fromJSON} from "../utils/JSONReviver";
|
Generic_fromJSON} from "../utils/JSONReviver";
|
||||||
import {getRandomInt, createElement,
|
import {createAccordionElement} from "../utils/uiHelpers/createAccordionElement";
|
||||||
removeChildrenFromElement,
|
import {createElement} from "../utils/uiHelpers/createElement";
|
||||||
createAccordionElement, createPopup,
|
import {createPopup} from "../utils/uiHelpers/createPopup";
|
||||||
removeElementById, removeElement} from "../utils/HelperFunctions";
|
|
||||||
import numeral from "numeral/min/numeral.min";
|
import numeral from "numeral/min/numeral.min";
|
||||||
import {formatNumber} from "../utils/StringHelperFunctions";
|
import {formatNumber} from "../utils/StringHelperFunctions";
|
||||||
|
import {getRandomInt} from "../utils/helpers/getRandomInt";
|
||||||
|
import {removeChildrenFromElement} from "../utils/uiHelpers/removeChildrenFromElement";
|
||||||
|
import {removeElement} from "../utils/uiHelpers/removeElement";
|
||||||
|
import {removeElementById} from "../utils/uiHelpers/removeElementById";
|
||||||
import {yesNoBoxCreate, yesNoTxtInpBoxCreate,
|
import {yesNoBoxCreate, yesNoTxtInpBoxCreate,
|
||||||
yesNoBoxGetYesButton, yesNoBoxGetNoButton,
|
yesNoBoxGetYesButton, yesNoBoxGetNoButton,
|
||||||
yesNoTxtInpBoxGetYesButton, yesNoTxtInpBoxGetNoButton,
|
yesNoTxtInpBoxGetYesButton, yesNoTxtInpBoxGetNoButton,
|
||||||
|
@ -5,11 +5,12 @@ import {iTutorialSteps, iTutorialNextStep,
|
|||||||
iTutorialIsRunning, currITutorialStep} from "./InteractiveTutorial";
|
iTutorialIsRunning, currITutorialStep} from "./InteractiveTutorial";
|
||||||
import {Player} from "./Player";
|
import {Player} from "./Player";
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {clearEventListeners, createElement,
|
import {clearEventListeners} from "../utils/uiHelpers/clearEventListeners";
|
||||||
getElementById} from "../utils/HelperFunctions";
|
|
||||||
import {Reviver, Generic_toJSON,
|
import {Reviver, Generic_toJSON,
|
||||||
Generic_fromJSON} from "../utils/JSONReviver";
|
Generic_fromJSON} from "../utils/JSONReviver";
|
||||||
|
import {createElement} from "../utils/uiHelpers/createElement";
|
||||||
import {formatNumber} from "../utils/StringHelperFunctions";
|
import {formatNumber} from "../utils/StringHelperFunctions";
|
||||||
|
import {getElementById} from "../utils/uiHelpers/getElementById";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Overwrites the inner text of the specified HTML element if it is different from what currently exists.
|
* Overwrites the inner text of the specified HTML element if it is different from what currently exists.
|
||||||
|
@ -3,7 +3,8 @@ import {CONSTANTS} from "./Constants";
|
|||||||
import {Engine} from "./engine";
|
import {Engine} from "./engine";
|
||||||
import {Player} from "./Player";
|
import {Player} from "./Player";
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {clearEventListeners, getRandomInt} from "../utils/HelperFunctions";
|
import {clearEventListeners} from "../utils/uiHelpers/clearEventListeners";
|
||||||
|
import {getRandomInt} from "../utils/helpers/getRandomInt";
|
||||||
import {infiltrationBoxCreate} from "../utils/InfiltrationBox";
|
import {infiltrationBoxCreate} from "../utils/InfiltrationBox";
|
||||||
import {formatNumber} from "../utils/StringHelperFunctions";
|
import {formatNumber} from "../utils/StringHelperFunctions";
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import {Engine} from "./engine";
|
import {Engine} from "./engine";
|
||||||
import {Player} from "./Player";
|
import {Player} from "./Player";
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {clearEventListeners} from "../utils/HelperFunctions";
|
import {clearEventListeners} from "../utils/uiHelpers/clearEventListeners";
|
||||||
|
|
||||||
/* InteractiveTutorial.js */
|
/* InteractiveTutorial.js */
|
||||||
let iTutorialSteps = {
|
let iTutorialSteps = {
|
||||||
|
@ -15,7 +15,7 @@ import {Settings} from "./Settings";
|
|||||||
import {SpecialServerNames, SpecialServerIps} from "./SpecialServerIps";
|
import {SpecialServerNames, SpecialServerIps} from "./SpecialServerIps";
|
||||||
|
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {clearEventListeners, createElement} from "../utils/HelperFunctions";
|
import {clearEventListeners} from "../utils/uiHelpers/clearEventListeners";
|
||||||
import {createRandomIp} from "../utils/IPAddress";
|
import {createRandomIp} from "../utils/IPAddress";
|
||||||
import numeral from "numeral/min/numeral.min";
|
import numeral from "numeral/min/numeral.min";
|
||||||
import {formatNumber} from "../utils/StringHelperFunctions";
|
import {formatNumber} from "../utils/StringHelperFunctions";
|
||||||
|
@ -3,10 +3,11 @@ import {Engine} from "./engine";
|
|||||||
import {displayFactionContent} from "./Faction";
|
import {displayFactionContent} from "./Faction";
|
||||||
import {Player} from "./Player";
|
import {Player} from "./Player";
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {addOffset, getRandomInt,
|
import {clearEventListeners} from "../utils/uiHelpers/clearEventListeners";
|
||||||
clearEventListenersEl,
|
import {addOffset} from "../utils/helpers/addOffset";
|
||||||
clearEventListeners} from "../utils/HelperFunctions";
|
import {formatNumber} from "../utils/StringHelperFunctions";
|
||||||
import {formatNumber, isString} from "../utils/StringHelperFunctions";
|
import {getRandomInt} from "../utils/helpers/getRandomInt";
|
||||||
|
import {isString} from "../utils/helpers/isString";
|
||||||
import jsplumb from 'jsplumb'
|
import jsplumb from 'jsplumb'
|
||||||
|
|
||||||
let inMission = false; //Flag to denote whether a mission is running
|
let inMission = false; //Flag to denote whether a mission is running
|
||||||
|
@ -9,9 +9,9 @@ import {Script, findRunningScript,
|
|||||||
RunningScript} from "./Script";
|
RunningScript} from "./Script";
|
||||||
|
|
||||||
import {parse, Node} from "../utils/acorn";
|
import {parse, Node} from "../utils/acorn";
|
||||||
import {printArray} from "../utils/HelperFunctions";
|
import {arrayToString} from "../utils/helpers/arrayToString";
|
||||||
import {isValidIPAddress} from "../utils/IPAddress";
|
import {isValidIPAddress} from "../utils/helpers/isValidIPAddress";
|
||||||
import {isString} from "../utils/StringHelperFunctions";
|
import {isString} from "../utils/helpers/isString";
|
||||||
|
|
||||||
var Promise = require("bluebird");
|
var Promise = require("bluebird");
|
||||||
|
|
||||||
@ -872,7 +872,7 @@ function runScriptFromScript(server, scriptname, args, workerScript, threads=1)
|
|||||||
} else {
|
} else {
|
||||||
//Able to run script
|
//Able to run script
|
||||||
if(workerScript.disableLogs.ALL == null && workerScript.disableLogs.exec == null && workerScript.disableLogs.run == null && workerScript.disableLogs.spawn == null) {
|
if(workerScript.disableLogs.ALL == null && workerScript.disableLogs.exec == null && workerScript.disableLogs.run == null && workerScript.disableLogs.spawn == null) {
|
||||||
workerScript.scriptRef.log("Running script: " + scriptname + " on " + server.hostname + " with " + threads + " threads and args: " + printArray(args) + ". May take a few seconds to start up...");
|
workerScript.scriptRef.log("Running script: " + scriptname + " on " + server.hostname + " with " + threads + " threads and args: " + arrayToString(args) + ". May take a few seconds to start up...");
|
||||||
}
|
}
|
||||||
var runningScriptObj = new RunningScript(script, args);
|
var runningScriptObj = new RunningScript(script, args);
|
||||||
runningScriptObj.threads = threads;
|
runningScriptObj.threads = threads;
|
||||||
|
@ -48,9 +48,11 @@ import {NetscriptPort} from "./NetscriptPort";
|
|||||||
|
|
||||||
import Decimal from "decimal.js";
|
import Decimal from "decimal.js";
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {printArray, powerOfTwo} from "../utils/HelperFunctions";
|
import {isPowerOfTwo} from "../utils/helpers/isPowerOfTwo";
|
||||||
|
import {arrayToString} from "../utils/helpers/arrayToString";
|
||||||
import {createRandomIp} from "../utils/IPAddress";
|
import {createRandomIp} from "../utils/IPAddress";
|
||||||
import {formatNumber, isString, isHTML} from "../utils/StringHelperFunctions";
|
import {formatNumber, isHTML} from "../utils/StringHelperFunctions";
|
||||||
|
import {isString} from "../utils/helpers/isString";
|
||||||
import {yesNoBoxClose, yesNoBoxGetYesButton,
|
import {yesNoBoxClose, yesNoBoxGetYesButton,
|
||||||
yesNoBoxGetNoButton, yesNoBoxCreate,
|
yesNoBoxGetNoButton, yesNoBoxCreate,
|
||||||
yesNoBoxOpen} from "../utils/YesNoBox";
|
yesNoBoxOpen} from "../utils/YesNoBox";
|
||||||
@ -685,18 +687,18 @@ function NetscriptFunctions(workerScript) {
|
|||||||
}
|
}
|
||||||
var runningScriptObj = findRunningScript(filename, argsForKillTarget, server);
|
var runningScriptObj = findRunningScript(filename, argsForKillTarget, server);
|
||||||
if (runningScriptObj == null) {
|
if (runningScriptObj == null) {
|
||||||
workerScript.scriptRef.log("kill() failed. No such script "+ filename + " on " + server.hostname + " with args: " + printArray(argsForKillTarget));
|
workerScript.scriptRef.log("kill() failed. No such script "+ filename + " on " + server.hostname + " with args: " + arrayToString(argsForKillTarget));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
var res = killWorkerScript(runningScriptObj, server.ip);
|
var res = killWorkerScript(runningScriptObj, server.ip);
|
||||||
if (res) {
|
if (res) {
|
||||||
if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.kill == null) {
|
if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.kill == null) {
|
||||||
workerScript.scriptRef.log("Killing " + filename + " on " + server.hostname + " with args: " + printArray(argsForKillTarget) + ". May take up to a few minutes for the scripts to die...");
|
workerScript.scriptRef.log("Killing " + filename + " on " + server.hostname + " with args: " + arrayToString(argsForKillTarget) + ". May take up to a few minutes for the scripts to die...");
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.kill == null) {
|
if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.kill == null) {
|
||||||
workerScript.scriptRef.log("kill() failed. No such script "+ filename + " on " + server.hostname + " with args: " + printArray(argsForKillTarget));
|
workerScript.scriptRef.log("kill() failed. No such script "+ filename + " on " + server.hostname + " with args: " + arrayToString(argsForKillTarget));
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1546,7 +1548,7 @@ function NetscriptFunctions(workerScript) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ram = Math.round(ram);
|
ram = Math.round(ram);
|
||||||
if (isNaN(ram) || !powerOfTwo(ram)) {
|
if (isNaN(ram) || !isPowerOfTwo(ram)) {
|
||||||
workerScript.scriptRef.log("ERROR: purchaseServer() failed due to invalid ram argument. Must be numeric and a power of 2");
|
workerScript.scriptRef.log("ERROR: purchaseServer() failed due to invalid ram argument. Must be numeric and a power of 2");
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
@ -1977,7 +1979,7 @@ function NetscriptFunctions(workerScript) {
|
|||||||
}
|
}
|
||||||
var runningScriptObj = findRunningScript(scriptname, argsForScript, server);
|
var runningScriptObj = findRunningScript(scriptname, argsForScript, server);
|
||||||
if (runningScriptObj == null) {
|
if (runningScriptObj == null) {
|
||||||
workerScript.scriptRef.log("getScriptIncome() failed. No such script "+ scriptname + " on " + server.hostname + " with args: " + printArray(argsForScript));
|
workerScript.scriptRef.log("getScriptIncome() failed. No such script "+ scriptname + " on " + server.hostname + " with args: " + arrayToString(argsForScript));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return runningScriptObj.onlineMoneyMade / runningScriptObj.onlineRunningTime;
|
return runningScriptObj.onlineMoneyMade / runningScriptObj.onlineRunningTime;
|
||||||
@ -2007,7 +2009,7 @@ function NetscriptFunctions(workerScript) {
|
|||||||
}
|
}
|
||||||
var runningScriptObj = findRunningScript(scriptname, argsForScript, server);
|
var runningScriptObj = findRunningScript(scriptname, argsForScript, server);
|
||||||
if (runningScriptObj == null) {
|
if (runningScriptObj == null) {
|
||||||
workerScript.scriptRef.log("getScriptExpGain() failed. No such script "+ scriptname + " on " + server.hostname + " with args: " + printArray(argsForScript));
|
workerScript.scriptRef.log("getScriptExpGain() failed. No such script "+ scriptname + " on " + server.hostname + " with args: " + arrayToString(argsForScript));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return runningScriptObj.onlineExpGained / runningScriptObj.onlineRunningTime;
|
return runningScriptObj.onlineExpGained / runningScriptObj.onlineRunningTime;
|
||||||
|
@ -16,8 +16,9 @@ import {Settings} from "./Settings";
|
|||||||
|
|
||||||
import {parse} from "../utils/acorn";
|
import {parse} from "../utils/acorn";
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {compareArrays, printArray,
|
import {compareArrays} from "../utils/helpers/compareArrays";
|
||||||
roundToTwo} from "../utils/HelperFunctions";
|
import {arrayToString} from "../utils/helpers/arrayToString";
|
||||||
|
import {roundToTwo} from "../utils/helpers/roundToTwo";
|
||||||
import {isString} from "../utils/StringHelperFunctions";
|
import {isString} from "../utils/StringHelperFunctions";
|
||||||
|
|
||||||
function WorkerScript(runningScriptObj) {
|
function WorkerScript(runningScriptObj) {
|
||||||
@ -319,7 +320,7 @@ function runScriptsLoop() {
|
|||||||
|
|
||||||
dialogBoxCreate("Script runtime error: <br>Server Ip: " + serverIp +
|
dialogBoxCreate("Script runtime error: <br>Server Ip: " + serverIp +
|
||||||
"<br>Script name: " + scriptName +
|
"<br>Script name: " + scriptName +
|
||||||
"<br>Args:" + printArray(w.args) + "<br>" + errorMsg);
|
"<br>Args:" + arrayToString(w.args) + "<br>" + errorMsg);
|
||||||
w.scriptRef.log("Script crashed with runtime error");
|
w.scriptRef.log("Script crashed with runtime error");
|
||||||
} else {
|
} else {
|
||||||
w.scriptRef.log("Script killed");
|
w.scriptRef.log("Script killed");
|
||||||
@ -379,7 +380,7 @@ function addWorkerScript(runningScriptObj, server) {
|
|||||||
var ramAvailable = server.maxRam - server.ramUsed;
|
var ramAvailable = server.maxRam - server.ramUsed;
|
||||||
if (ramUsage > ramAvailable) {
|
if (ramUsage > ramAvailable) {
|
||||||
dialogBoxCreate("Not enough RAM to run script " + runningScriptObj.filename + " with args " +
|
dialogBoxCreate("Not enough RAM to run script " + runningScriptObj.filename + " with args " +
|
||||||
printArray(runningScriptObj.args) + ". This likely occurred because you re-loaded " +
|
arrayToString(runningScriptObj.args) + ". This likely occurred because you re-loaded " +
|
||||||
"the game and the script's RAM usage increased (either because of an update to the game or " +
|
"the game and the script's RAM usage increased (either because of an update to the game or " +
|
||||||
"your changes to the script.)");
|
"your changes to the script.)");
|
||||||
return;
|
return;
|
||||||
|
@ -21,7 +21,7 @@ import {SourceFiles, applySourceFile} from "./SourceFile";
|
|||||||
|
|
||||||
import Decimal from "decimal.js";
|
import Decimal from "decimal.js";
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {clearEventListeners} from "../utils/HelperFunctions";
|
import {clearEventListeners} from "../utils/uiHelpers/clearEventListeners";
|
||||||
import {createRandomIp} from "../utils/IPAddress";
|
import {createRandomIp} from "../utils/IPAddress";
|
||||||
import {Reviver, Generic_toJSON,
|
import {Reviver, Generic_toJSON,
|
||||||
Generic_fromJSON} from "../utils/JSONReviver";
|
Generic_fromJSON} from "../utils/JSONReviver";
|
||||||
|
@ -30,8 +30,10 @@ import {initStockMarket, initSymbolToStockMap,
|
|||||||
import {Terminal, postNetburnerText} from "./Terminal";
|
import {Terminal, postNetburnerText} from "./Terminal";
|
||||||
import Decimal from "decimal.js";
|
import Decimal from "decimal.js";
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {createPopup, createElement,
|
import {removeElementById} from "../utils/uiHelpers/removeElementById";
|
||||||
removeElementById, exceptionAlert} from "../utils/HelperFunctions";
|
import {createElement} from "../utils/uiHelpers/createElement";
|
||||||
|
import {createPopup} from "../utils/uiHelpers/createPopup";
|
||||||
|
import {exceptionAlert} from "../utils/helpers/exceptionAlert";
|
||||||
import {yesNoBoxCreate, yesNoBoxGetYesButton,
|
import {yesNoBoxCreate, yesNoBoxGetYesButton,
|
||||||
yesNoBoxGetNoButton, yesNoBoxClose} from "../utils/YesNoBox";
|
yesNoBoxGetNoButton, yesNoBoxClose} from "../utils/YesNoBox";
|
||||||
|
|
||||||
|
@ -6,9 +6,9 @@ import {SourceFiles, SourceFile,
|
|||||||
PlayerOwnedSourceFile} from "./SourceFile";
|
PlayerOwnedSourceFile} from "./SourceFile";
|
||||||
import {Terminal} from "./Terminal";
|
import {Terminal} from "./Terminal";
|
||||||
|
|
||||||
|
import {clearEventListeners} from "../utils/uiHelpers/clearEventListeners";
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {clearEventListeners,
|
import {removeChildrenFromElement} from "../utils/uiHelpers/removeChildrenFromElement";
|
||||||
removeChildrenFromElement} from "../utils/HelperFunctions";
|
|
||||||
import {yesNoBoxCreate, yesNoBoxGetYesButton,
|
import {yesNoBoxCreate, yesNoBoxGetYesButton,
|
||||||
yesNoBoxGetNoButton, yesNoBoxClose} from "../utils/YesNoBox";
|
yesNoBoxGetNoButton, yesNoBoxClose} from "../utils/YesNoBox";
|
||||||
|
|
||||||
|
@ -19,11 +19,13 @@ import {loadSpecialServerIps, SpecialServerIps} from "./SpecialServerIps";
|
|||||||
import {loadStockMarket, StockMarket} from "./StockMarket";
|
import {loadStockMarket, StockMarket} from "./StockMarket";
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {gameOptionsBoxClose} from "../utils/GameOptions";
|
import {gameOptionsBoxClose} from "../utils/GameOptions";
|
||||||
import {clearEventListeners, createElement,
|
import {clearEventListeners} from "../utils/uiHelpers/clearEventListeners";
|
||||||
createPopup, removeElementById} from "../utils/HelperFunctions";
|
|
||||||
import {Reviver, Generic_toJSON,
|
import {Reviver, Generic_toJSON,
|
||||||
Generic_fromJSON} from "../utils/JSONReviver";
|
Generic_fromJSON} from "../utils/JSONReviver";
|
||||||
|
import {createElement} from "../utils/uiHelpers/createElement";
|
||||||
|
import {createPopup} from "../utils/uiHelpers/createPopup";
|
||||||
import {formatNumber} from "../utils/StringHelperFunctions";
|
import {formatNumber} from "../utils/StringHelperFunctions";
|
||||||
|
import {removeElementById} from "../utils/uiHelpers/removeElementById";
|
||||||
|
|
||||||
import Decimal from "decimal.js";
|
import Decimal from "decimal.js";
|
||||||
|
|
||||||
|
@ -36,10 +36,10 @@ import {parse, Node} from "../utils/acorn";
|
|||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {Reviver, Generic_toJSON,
|
import {Reviver, Generic_toJSON,
|
||||||
Generic_fromJSON} from "../utils/JSONReviver";
|
Generic_fromJSON} from "../utils/JSONReviver";
|
||||||
import {compareArrays, createElement,
|
import {compareArrays} from "../utils/helpers/compareArrays";
|
||||||
roundToTwo} from "../utils/HelperFunctions";
|
import {createElement} from "../utils/uiHelpers/createElement";
|
||||||
import {formatNumber, numOccurrences,
|
import {formatNumber} from "../utils/StringHelperFunctions";
|
||||||
numNetscriptOperators} from "../utils/StringHelperFunctions";
|
import {roundToTwo} from "../utils/helpers/roundToTwo";
|
||||||
|
|
||||||
var keybindings = {
|
var keybindings = {
|
||||||
ace: null,
|
ace: null,
|
||||||
|
@ -4,10 +4,11 @@ import {Programs} from "./CreateProgram";
|
|||||||
import {Player} from "./Player";
|
import {Player} from "./Player";
|
||||||
import {RunningScript, Script} from "./Script";
|
import {RunningScript, Script} from "./Script";
|
||||||
import {SpecialServerNames, SpecialServerIps} from "./SpecialServerIps";
|
import {SpecialServerNames, SpecialServerIps} from "./SpecialServerIps";
|
||||||
import {getRandomInt} from "../utils/HelperFunctions";
|
import {getRandomInt} from "../utils/helpers/getRandomInt";
|
||||||
import {createRandomIp, isValidIPAddress, ipExists} from "../utils/IPAddress";
|
import {createRandomIp, ipExists} from "../utils/IPAddress";
|
||||||
import {Reviver, Generic_toJSON,
|
import {Reviver, Generic_toJSON,
|
||||||
Generic_fromJSON} from "../utils/JSONReviver";
|
Generic_fromJSON} from "../utils/JSONReviver";
|
||||||
|
import {isValidIPAddress} from "../utils/helpers/isValidIPAddress";
|
||||||
|
|
||||||
function Server(params={ip:createRandomIp(), hostname:""}) {
|
function Server(params={ip:createRandomIp(), hostname:""}) {
|
||||||
/* Properties */
|
/* Properties */
|
||||||
|
@ -6,13 +6,13 @@ import {WorkerScript} from "./NetscriptWorker";
|
|||||||
import {Player} from "./Player";
|
import {Player} from "./Player";
|
||||||
|
|
||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {clearEventListeners, getRandomInt,
|
import {clearEventListeners} from "../utils/uiHelpers/clearEventListeners";
|
||||||
removeElementById,
|
|
||||||
clearEventListenersEl} from "../utils/HelperFunctions";
|
|
||||||
import {Reviver, Generic_toJSON,
|
import {Reviver, Generic_toJSON,
|
||||||
Generic_fromJSON} from "../utils/JSONReviver";
|
Generic_fromJSON} from "../utils/JSONReviver";
|
||||||
import numeral from "numeral/min/numeral.min";
|
import numeral from "numeral/min/numeral.min";
|
||||||
import {formatNumber} from "../utils/StringHelperFunctions";
|
import {formatNumber} from "../utils/StringHelperFunctions";
|
||||||
|
import {getRandomInt} from "../utils/helpers/getRandomInt";
|
||||||
|
import {removeElementById} from "../utils/uiHelpers/removeElementById";
|
||||||
import {yesNoBoxCreate, yesNoTxtInpBoxCreate,
|
import {yesNoBoxCreate, yesNoTxtInpBoxCreate,
|
||||||
yesNoBoxGetYesButton, yesNoBoxGetNoButton,
|
yesNoBoxGetYesButton, yesNoBoxGetNoButton,
|
||||||
yesNoTxtInpBoxGetYesButton, yesNoTxtInpBoxGetNoButton,
|
yesNoTxtInpBoxGetYesButton, yesNoTxtInpBoxGetNoButton,
|
||||||
|
@ -34,8 +34,10 @@ import {SpecialServerIps,
|
|||||||
import {TextFile, getTextFile} from "./TextFile";
|
import {TextFile, getTextFile} from "./TextFile";
|
||||||
|
|
||||||
import {containsAllStrings, longestCommonStart,
|
import {containsAllStrings, longestCommonStart,
|
||||||
formatNumber, isString} from "../utils/StringHelperFunctions";
|
formatNumber} from "../utils/StringHelperFunctions";
|
||||||
import {addOffset, printArray} from "../utils/HelperFunctions";
|
import {addOffset} from "../utils/helpers/addOffset";
|
||||||
|
import {isString} from "../utils/helpers/isString";
|
||||||
|
import {arrayToString} from "../utils/helpers/arrayToString";
|
||||||
import {logBoxCreate} from "../utils/LogBox";
|
import {logBoxCreate} from "../utils/LogBox";
|
||||||
import {yesNoBoxCreate,
|
import {yesNoBoxCreate,
|
||||||
yesNoBoxGetYesButton,
|
yesNoBoxGetYesButton,
|
||||||
@ -2033,7 +2035,7 @@ let Terminal = {
|
|||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
//Able to run script
|
//Able to run script
|
||||||
post("Running script with " + numThreads + " thread(s) and args: " + printArray(args) + ".");
|
post("Running script with " + numThreads + " thread(s) and args: " + arrayToString(args) + ".");
|
||||||
post("May take a few seconds to start up the process...");
|
post("May take a few seconds to start up the process...");
|
||||||
var runningScriptObj = new RunningScript(script, args);
|
var runningScriptObj = new RunningScript(script, args);
|
||||||
runningScriptObj.threads = numThreads;
|
runningScriptObj.threads = numThreads;
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
import {dialogBoxCreate} from "../utils/DialogBox";
|
import {dialogBoxCreate} from "../utils/DialogBox";
|
||||||
import {gameOptionsBoxOpen, gameOptionsBoxClose}from "../utils/GameOptions";
|
import {gameOptionsBoxOpen, gameOptionsBoxClose}from "../utils/GameOptions";
|
||||||
import {clearEventListeners, createElement,
|
import {removeChildrenFromElement} from "../utils/uiHelpers/removeChildrenFromElement";
|
||||||
removeChildrenFromElement,
|
import {clearEventListeners} from "../utils/uiHelpers/clearEventListeners";
|
||||||
exceptionAlert} from "../utils/HelperFunctions";
|
import {createElement} from "../utils/uiHelpers/createElement";
|
||||||
|
import {exceptionAlert} from "../utils/helpers/exceptionAlert";
|
||||||
import numeral from "numeral/min/numeral.min";
|
import numeral from "numeral/min/numeral.min";
|
||||||
import {formatNumber,
|
import {formatNumber,
|
||||||
convertTimeMsToTimeElapsedString,
|
convertTimeMsToTimeElapsedString,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import {Faction, joinFaction} from "../src/Faction";
|
import {Faction, joinFaction} from "../src/Faction";
|
||||||
import {Engine} from "../src/engine";
|
import {Engine} from "../src/engine";
|
||||||
import {Player} from "../src/Player";
|
import {Player} from "../src/Player";
|
||||||
import {clearEventListeners} from "./HelperFunctions";
|
import {clearEventListeners} from "./uiHelpers/clearEventListeners";
|
||||||
|
|
||||||
/* Faction Invitation Pop-up box */
|
/* Faction Invitation Pop-up box */
|
||||||
function factionInvitationBoxClose() {
|
function factionInvitationBoxClose() {
|
||||||
|
@ -1,298 +0,0 @@
|
|||||||
//General helper functions
|
|
||||||
import {isString} from "./StringHelperFunctions";
|
|
||||||
import {dialogBoxCreate} from "./DialogBox";
|
|
||||||
|
|
||||||
//Returns the size (number of keys) of an object
|
|
||||||
function sizeOfObject(obj) {
|
|
||||||
var size = 0, key;
|
|
||||||
for (key in obj) {
|
|
||||||
if (obj.hasOwnProperty(key)) size++;
|
|
||||||
}
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
function clearObject(obj) {
|
|
||||||
for (var key in obj) {
|
|
||||||
if (obj.hasOwnProperty(key)) {
|
|
||||||
delete obj[key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Adds a random offset to a number within a certain percentage
|
|
||||||
//e.g. addOffset(100, 5) will return anything from 95 to 105.
|
|
||||||
//The percentage argument must be between 0 and 100;
|
|
||||||
function addOffset(n, percentage) {
|
|
||||||
if (percentage < 0 || percentage > 100) {return n;}
|
|
||||||
|
|
||||||
var offset = n * (percentage / 100);
|
|
||||||
|
|
||||||
return n + ((Math.random() * (2 * offset)) - offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Given an element by its Id(usually an 'a' element), removes all event listeners
|
|
||||||
//from that element by cloning and replacing. Then returns the new cloned element
|
|
||||||
function clearEventListeners(elemId) {
|
|
||||||
var elem = document.getElementById(elemId);
|
|
||||||
if (elem == null) {console.log("ERR: Could not find element for: " + elemId); return null;}
|
|
||||||
var newElem = elem.cloneNode(true);
|
|
||||||
elem.parentNode.replaceChild(newElem, elem);
|
|
||||||
return newElem;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Same as clearEventListeners except it takes a DOM element object rather than an ID
|
|
||||||
function clearEventListenersEl(el) {
|
|
||||||
if (el == null) {console.log("ERR: element passed into clearEventListenersEl is null"); return null;}
|
|
||||||
var newElem = el.cloneNode(true);
|
|
||||||
el.parentNode.replaceChild(newElem, el);
|
|
||||||
return newElem;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Given its id, this function removes an element AND its children
|
|
||||||
function removeElementById(id) {
|
|
||||||
var elem = document.getElementById(id);
|
|
||||||
if (elem == null) {return;}
|
|
||||||
while(elem.firstChild) {elem.removeChild(elem.firstChild);}
|
|
||||||
elem.parentNode.removeChild(elem);
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeElement(elem) {
|
|
||||||
if (elem == null || !(elem instanceof Element)) {return;}
|
|
||||||
while(elem.firstChild) {elem.removeChild(elem.firstChild);}
|
|
||||||
elem.parentNode.removeChild(elem);
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeChildrenFromElement(el) {
|
|
||||||
if (isString(el)) {
|
|
||||||
el = document.getElementById(el);
|
|
||||||
}
|
|
||||||
if (el == null) {return;}
|
|
||||||
if (el instanceof Element) {
|
|
||||||
while(el.firstChild) {
|
|
||||||
el.removeChild(el.firstChild);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a reference to the first object with the specified value of the ID or NAME attribute, throwing an error if it is unable to find it.
|
|
||||||
* @param {string} elementId The HTML ID to retrieve the element by.
|
|
||||||
* @returns {HTMLElement} The single element.
|
|
||||||
* @throws {Error} When the 'idString' cannot be found.
|
|
||||||
*/
|
|
||||||
function getElementById(elementId) {
|
|
||||||
var el = document.getElementById(elementId);
|
|
||||||
if (el == null) {
|
|
||||||
throw new Error("Unable to find element with id '" + elementId + "'");
|
|
||||||
}
|
|
||||||
|
|
||||||
return el;
|
|
||||||
}
|
|
||||||
|
|
||||||
function createElement(type, params={}) {
|
|
||||||
var el = document.createElement(type);
|
|
||||||
if (params.id) {el.id = params.id;}
|
|
||||||
if (params.class) {el.className = params.class;}
|
|
||||||
if (params.name) {el.name = params.name;}
|
|
||||||
if (params.innerHTML) {el.innerHTML = params.innerHTML;}
|
|
||||||
if (params.innerText) {el.innerText = params.innerText;}
|
|
||||||
if (params.value) {el.value = params.value;}
|
|
||||||
if (params.text) {el.text = params.text;}
|
|
||||||
if (params.display) {el.style.display = params.display;}
|
|
||||||
if (params.visibility) {el.style.visibility = params.visibility;}
|
|
||||||
if (params.margin) {el.style.margin = params.margin;}
|
|
||||||
if (params.marginLeft) {el.style.marginLeft = params.marginLeft;}
|
|
||||||
if (params.marginTop) {el.style.marginTop = params.marginTop;}
|
|
||||||
if (params.padding) {el.style.padding = params.padding;}
|
|
||||||
if (params.color) {el.style.color = params.color;}
|
|
||||||
if (params.border) {el.style.border = params.border;}
|
|
||||||
if (params.float) {el.style.cssFloat = params.float;}
|
|
||||||
if (params.fontSize) {el.style.fontSize = params.fontSize;}
|
|
||||||
if (params.whiteSpace) {el.style.whiteSpace = params.whiteSpace;}
|
|
||||||
if (params.width) {el.style.width = params.width;}
|
|
||||||
if (params.backgroundColor) {
|
|
||||||
el.style.backgroundColor = params.backgroundColor
|
|
||||||
}
|
|
||||||
if (params.position) {el.style.position = params.position;}
|
|
||||||
if (params.type) {el.type = params.type;}
|
|
||||||
if (params.checked) {el.checked = params.checked;}
|
|
||||||
if (params.for) {el.htmlFor = params.for;}
|
|
||||||
if (params.pattern) {el.pattern = params.pattern;}
|
|
||||||
if (params.maxLength) {el.maxLength = params.maxLength;}
|
|
||||||
if (params.placeholder) {el.placeholder = params.placeholder;}
|
|
||||||
if (params.tooltip && params.tooltip !== "") {
|
|
||||||
el.className += " tooltip";
|
|
||||||
el.appendChild(createElement("span", {
|
|
||||||
class:"tooltiptext",
|
|
||||||
innerHTML:params.tooltip
|
|
||||||
}));
|
|
||||||
} else if (params.tooltipleft) {
|
|
||||||
el.className += " tooltip";
|
|
||||||
el.appendChild(createElement("span", {
|
|
||||||
class:"tooltiptextleft",
|
|
||||||
innerHTML:params.tooltipleft
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
if (params.href) {el.href = params.href;}
|
|
||||||
if (params.target) {el.target = params.target;}
|
|
||||||
if (params.tabIndex) {el.tabIndex = params.tabIndex;}
|
|
||||||
if (params.clickListener) {
|
|
||||||
el.addEventListener("click", params.clickListener);
|
|
||||||
}
|
|
||||||
if (params.inputListener) {
|
|
||||||
el.addEventListener("input", params.inputListener);
|
|
||||||
}
|
|
||||||
if (params.changeListener) {
|
|
||||||
el.addEventListener("change", params.changeListener);
|
|
||||||
}
|
|
||||||
if (params.onkeyup) {
|
|
||||||
el.addEventListener("keyup", params.onkeyup);
|
|
||||||
}
|
|
||||||
if (params.onfocus) {
|
|
||||||
el.addEventListener("focus", params.onfocus);
|
|
||||||
}
|
|
||||||
return el;
|
|
||||||
}
|
|
||||||
|
|
||||||
function createPopup(id, elems) {
|
|
||||||
var container = createElement("div", {
|
|
||||||
class:"popup-box-container",
|
|
||||||
id:id,
|
|
||||||
display:"block"
|
|
||||||
}),
|
|
||||||
content = createElement("div", {
|
|
||||||
class:"popup-box-content",
|
|
||||||
id:id + "-content",
|
|
||||||
});
|
|
||||||
|
|
||||||
for (var i = 0; i < elems.length; ++i) {
|
|
||||||
content.appendChild(elems[i]);
|
|
||||||
}
|
|
||||||
container.appendChild(content);
|
|
||||||
document.getElementById("entire-game-container").appendChild(container);
|
|
||||||
return container;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Creates both the header and panel element of an accordion and sets the click handler
|
|
||||||
function createAccordionElement(params) {
|
|
||||||
var li = document.createElement("li"),
|
|
||||||
hdr = document.createElement("button"),
|
|
||||||
panel = document.createElement("div");
|
|
||||||
hdr.classList.add("accordion-header");
|
|
||||||
panel.classList.add("accordion-panel");
|
|
||||||
|
|
||||||
if (params.id) {
|
|
||||||
hdr.id = params.id + "-hdr";
|
|
||||||
panel.id = params.id + "-panel";
|
|
||||||
}
|
|
||||||
if (params.hdrText) {hdr.innerHTML = params.hdrText;}
|
|
||||||
if (params.panelText) {panel.innerHTML = params.panelText;}
|
|
||||||
li.appendChild(hdr);
|
|
||||||
li.appendChild(panel);
|
|
||||||
//Click handler
|
|
||||||
hdr.onclick = function() {
|
|
||||||
this.classList.toggle("active");
|
|
||||||
var tmpPanel = this.nextElementSibling;
|
|
||||||
if (tmpPanel.style.display === "block") {
|
|
||||||
tmpPanel.style.display = "none";
|
|
||||||
} else {
|
|
||||||
tmpPanel.style.display = "block";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return [li, hdr, panel];
|
|
||||||
}
|
|
||||||
|
|
||||||
//Appends n line breaks (as children) to the Element el
|
|
||||||
function appendLineBreaks(el, n) {
|
|
||||||
for (var i = 0; i < n; ++i) {
|
|
||||||
el.appendChild(createElement("br"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function clearSelector(selector) {
|
|
||||||
for (var i = selector.options.length - 1; i >= 0; --i) {
|
|
||||||
selector.remove(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getRandomInt(min, max) {
|
|
||||||
if (min > max) {return getRandomInt(max, min);}
|
|
||||||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Returns true if all elements are equal, and false otherwise
|
|
||||||
//Assumes both arguments are arrays and that there are no nested arrays
|
|
||||||
function compareArrays(a1, a2) {
|
|
||||||
if (a1.length != a2.length) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = 0; i < a1.length; ++i) {
|
|
||||||
if (a1[i] != a2[i]) {return false;}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function printArray(a) {
|
|
||||||
return "[" + a.join(", ") + "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
//Returns bool indicating whether or not its a power of 2
|
|
||||||
function powerOfTwo(n) {
|
|
||||||
if (isNaN(n)) {return false;}
|
|
||||||
return n && (n & (n-1)) === 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Rounds a number to two decimal places
|
|
||||||
function roundToTwo(n) {
|
|
||||||
return +(Math.round(n + "e+2") + "e-2");
|
|
||||||
}
|
|
||||||
|
|
||||||
function exceptionAlert(e) {
|
|
||||||
dialogBoxCreate("Caught an exception: " + e + "<br><br>" +
|
|
||||||
"Filename: " + e.fileName + "<br><br>" +
|
|
||||||
"Line Number: " + e.lineNumber + "<br><br>" +
|
|
||||||
"This is a bug, please report to game developer with this " +
|
|
||||||
"message as well as details about how to reproduce the bug.<br><br>" +
|
|
||||||
"If you want to be safe, I suggest refreshing the game WITHOUT saving so that your " +
|
|
||||||
"safe doesn't get corrupted");
|
|
||||||
}
|
|
||||||
|
|
||||||
/*Creates a graphical "progress bar"
|
|
||||||
* e.g.: [||||---------------]
|
|
||||||
* params:
|
|
||||||
* @totalTicks - Total number of ticks in progress bar. Preferably a factor of 100
|
|
||||||
* @progress - Current progress, taken as a decimal (i.e. 0.6 to represent 60%)
|
|
||||||
*/
|
|
||||||
function createProgressBarText(params={}) {
|
|
||||||
//Default values
|
|
||||||
var totalTicks = (params.totalTicks == null ? 20 : params.totalTicks);
|
|
||||||
var progress = (params.progress == null ? 0 : params.progress);
|
|
||||||
|
|
||||||
var percentPerTick = 1 / totalTicks;
|
|
||||||
var numTicks = Math.floor(progress / percentPerTick);
|
|
||||||
var numDashes = totalTicks - numTicks;
|
|
||||||
return "[" + Array(numTicks+1).join("|") + Array(numDashes+1).join("-") + "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
export {sizeOfObject,
|
|
||||||
clearObject,
|
|
||||||
addOffset,
|
|
||||||
clearEventListeners,
|
|
||||||
getRandomInt,
|
|
||||||
compareArrays,
|
|
||||||
printArray,
|
|
||||||
powerOfTwo,
|
|
||||||
roundToTwo,
|
|
||||||
clearEventListenersEl,
|
|
||||||
removeElementById,
|
|
||||||
removeElement,
|
|
||||||
createElement,
|
|
||||||
createAccordionElement,
|
|
||||||
appendLineBreaks,
|
|
||||||
removeChildrenFromElement,
|
|
||||||
createPopup,
|
|
||||||
clearSelector,
|
|
||||||
exceptionAlert,
|
|
||||||
createProgressBarText,
|
|
||||||
getElementById};
|
|
@ -1,13 +1,15 @@
|
|||||||
import {AllServers} from "../src/Server";
|
import {AllServers} from "../src/Server";
|
||||||
|
import {getRandomByte} from "./helpers/getRandomByte";
|
||||||
|
|
||||||
/* Functions to deal with manipulating IP addresses*/
|
/* Functions to deal with manipulating IP addresses*/
|
||||||
|
|
||||||
//Generate a random IP address
|
//Generate a random IP address
|
||||||
//Will not return an IP address that already exists in the AllServers array
|
//Will not return an IP address that already exists in the AllServers array
|
||||||
function createRandomIp() {
|
function createRandomIp() {
|
||||||
var ip = createRandomByte(99) +'.' +
|
var ip = getRandomByte(99) + '.' +
|
||||||
createRandomByte(9) +'.' +
|
getRandomByte(9) + '.' +
|
||||||
createRandomByte(9) +'.' +
|
getRandomByte(9) + '.' +
|
||||||
createRandomByte(9);
|
getRandomByte(9);
|
||||||
|
|
||||||
//If the Ip already exists, recurse to create a new one
|
//If the Ip already exists, recurse to create a new one
|
||||||
if (ipExists(ip)) {
|
if (ipExists(ip)) {
|
||||||
@ -28,16 +30,4 @@ function ipExists(ip) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function createRandomByte(n=9) {
|
export {createRandomIp, ipExists};
|
||||||
return Math.round(Math.random()*n);
|
|
||||||
}
|
|
||||||
|
|
||||||
function isValidIPAddress(ipaddress) {
|
|
||||||
if (/^(25[0-6]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-6]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-6]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-6]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(ipaddress))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
export {createRandomIp, ipExists, isValidIPAddress};
|
|
||||||
|
@ -3,7 +3,7 @@ import {CONSTANTS} from "../src/Constants";
|
|||||||
import {Factions, Faction} from "../src/Faction";
|
import {Factions, Faction} from "../src/Faction";
|
||||||
import {Player} from "../src/Player";
|
import {Player} from "../src/Player";
|
||||||
import {dialogBoxCreate} from "./DialogBox";
|
import {dialogBoxCreate} from "./DialogBox";
|
||||||
import {clearEventListeners} from "./HelperFunctions";
|
import {clearEventListeners} from "./uiHelpers/clearEventListeners";
|
||||||
import {formatNumber} from "./StringHelperFunctions";
|
import {formatNumber} from "./StringHelperFunctions";
|
||||||
|
|
||||||
//Keep track of last faction
|
//Keep track of last faction
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import {killWorkerScript} from "../src/NetscriptWorker";
|
import {killWorkerScript} from "../src/NetscriptWorker";
|
||||||
import {printArray, clearEventListeners} from "./HelperFunctions";
|
import {clearEventListeners} from "./uiHelpers/clearEventListeners";
|
||||||
|
import {arrayToString} from "./helpers/arrayToString";
|
||||||
|
|
||||||
$(document).keydown(function(event) {
|
$(document).keydown(function(event) {
|
||||||
if (logBoxOpened && event.keyCode == 27) {
|
if (logBoxOpened && event.keyCode == 27) {
|
||||||
@ -47,7 +48,7 @@ function logBoxCreate(script) {
|
|||||||
document.getElementById('log-box-kill-script').style.display = "inline-block";
|
document.getElementById('log-box-kill-script').style.display = "inline-block";
|
||||||
logBoxOpen();
|
logBoxOpen();
|
||||||
document.getElementById("log-box-text-header").innerHTML =
|
document.getElementById("log-box-text-header").innerHTML =
|
||||||
logBoxCurrentScript.filename + " " + printArray(logBoxCurrentScript.args) + ":<br><br>";
|
logBoxCurrentScript.filename + " " + arrayToString(logBoxCurrentScript.args) + ":<br><br>";
|
||||||
logBoxCurrentScript.logUpd = true;
|
logBoxCurrentScript.logUpd = true;
|
||||||
logBoxUpdateText();
|
logBoxUpdateText();
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { EqualityFunc } from "../src/types";
|
import { EqualityFunc } from "../src/types";
|
||||||
import { dialogBoxCreate } from "./DialogBox";
|
import { isString } from "./helpers/isString";
|
||||||
|
|
||||||
// Netburner String helper functions
|
// Netburner String helper functions
|
||||||
|
|
||||||
@ -49,7 +49,8 @@ function longestCommonStart(strings: string[]): string {
|
|||||||
if (!containsAllStrings(strings)) {return ""; }
|
if (!containsAllStrings(strings)) {return ""; }
|
||||||
if (strings.length === 0) {return ""; }
|
if (strings.length === 0) {return ""; }
|
||||||
|
|
||||||
const A: string[] = strings.concat().sort();
|
const A: string[] = strings.concat()
|
||||||
|
.sort();
|
||||||
const a1: string = A[0];
|
const a1: string = A[0];
|
||||||
const a2: string = A[A.length - 1];
|
const a2: string = A[A.length - 1];
|
||||||
const L: number = a1.length;
|
const L: number = a1.length;
|
||||||
@ -62,11 +63,6 @@ function longestCommonStart(strings: string[]): string {
|
|||||||
return a1.substring(0, i);
|
return a1.substring(0, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns whether a variable is a string
|
|
||||||
function isString(str: any): boolean {
|
|
||||||
return (typeof str === "string" || str instanceof String);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns whether an array contains entirely of string objects
|
// Returns whether an array contains entirely of string objects
|
||||||
function containsAllStrings(arr: string[]): boolean {
|
function containsAllStrings(arr: string[]): boolean {
|
||||||
return arr.every(isString);
|
return arr.every(isString);
|
||||||
@ -80,59 +76,12 @@ function formatNumber(num: number, numFractionDigits: number): string {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Count the number of times a substring occurs in a string
|
|
||||||
function numOccurrences(text: string, subString: string): number {
|
|
||||||
const input: string = `${text}`;
|
|
||||||
const search: string = `${subString}`;
|
|
||||||
if (search.length <= 0) { return (input.length + 1); }
|
|
||||||
|
|
||||||
let n: number = 0;
|
|
||||||
let pos: number = 0;
|
|
||||||
const step: number = search.length;
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
pos = input.indexOf(search, pos);
|
|
||||||
if (pos >= 0) {
|
|
||||||
++n;
|
|
||||||
pos += step;
|
|
||||||
} else { break; }
|
|
||||||
}
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Counters the number of Netscript operators in a string
|
|
||||||
function numNetscriptOperators(text: string): number {
|
|
||||||
const total: number = numOccurrences(text, "+") +
|
|
||||||
numOccurrences(text, "-") +
|
|
||||||
numOccurrences(text, "*") +
|
|
||||||
numOccurrences(text, "/") +
|
|
||||||
numOccurrences(text, "%") +
|
|
||||||
numOccurrences(text, "&&") +
|
|
||||||
numOccurrences(text, "||") +
|
|
||||||
numOccurrences(text, "<") +
|
|
||||||
numOccurrences(text, ">") +
|
|
||||||
numOccurrences(text, "<=") +
|
|
||||||
numOccurrences(text, ">=") +
|
|
||||||
numOccurrences(text, "==") +
|
|
||||||
numOccurrences(text, "!=");
|
|
||||||
if (isNaN(total)) {
|
|
||||||
// tslint:disable-next-line:max-line-length
|
|
||||||
const message: string = "ERROR in counting number of operators in script. This is a bug, please report to game developer";
|
|
||||||
dialogBoxCreate(message, false);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return total;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Checks if a string contains HTML elements
|
// Checks if a string contains HTML elements
|
||||||
function isHTML(str: string): boolean {
|
function isHTML(str: string): boolean {
|
||||||
const element: HTMLDivElement = document.createElement("div");
|
const element: HTMLDivElement = document.createElement("div");
|
||||||
element.innerHTML = str;
|
element.innerHTML = str;
|
||||||
const c: NodeListOf<Node & ChildNode> = element.childNodes;
|
const c: NodeListOf<Node & ChildNode> = element.childNodes;
|
||||||
for (let i: number = c.length-1; i >= 0; i--) {
|
for (let i: number = c.length - 1; i >= 0; i--) {
|
||||||
if (c[i].nodeType === 1) {
|
if (c[i].nodeType === 1) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -154,5 +103,5 @@ function generateRandomString(n: number): string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export {convertTimeMsToTimeElapsedString, longestCommonStart,
|
export {convertTimeMsToTimeElapsedString, longestCommonStart,
|
||||||
isString, containsAllStrings, formatNumber,
|
containsAllStrings, formatNumber,
|
||||||
numOccurrences, numNetscriptOperators, isHTML, generateRandomString, replaceAt};
|
isHTML, generateRandomString, replaceAt};
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import {clearEventListeners} from "./HelperFunctions";
|
import {clearEventListeners} from "./uiHelpers/clearEventListeners";
|
||||||
/* Generic Yes-No Pop-up box
|
/* Generic Yes-No Pop-up box
|
||||||
* Can be used to create pop-up boxes that require a yes/no response from player
|
* Can be used to create pop-up boxes that require a yes/no response from player
|
||||||
*/
|
*/
|
||||||
|
23
utils/helpers/addOffset.ts
Normal file
23
utils/helpers/addOffset.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* Adds a random offset to a number within a certain percentage
|
||||||
|
* @example
|
||||||
|
* // Returns between 95-105
|
||||||
|
* addOffset(100, 5);
|
||||||
|
* @example
|
||||||
|
* // Returns between 63-77
|
||||||
|
* addOffSet(70, 10);
|
||||||
|
* @param midpoint The number to be the midpoint of the offset range
|
||||||
|
* @param percentage The percentage (in a range of 0-100) to offset
|
||||||
|
*/
|
||||||
|
export function addOffset(midpoint: number, percentage: number) {
|
||||||
|
const maxPercent: number = 100;
|
||||||
|
if (percentage < 0 || percentage > maxPercent) {
|
||||||
|
return midpoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
const offset: number = midpoint * (percentage / maxPercent);
|
||||||
|
|
||||||
|
// Double the range to account for both sides of the midpoint.
|
||||||
|
// tslint:disable-next-line:no-magic-numbers
|
||||||
|
return midpoint + ((Math.random() * (offset * 2)) - offset);
|
||||||
|
}
|
6
utils/helpers/arrayToString.ts
Normal file
6
utils/helpers/arrayToString.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
/**
|
||||||
|
* Returns the input array as a comma separated string.
|
||||||
|
*/
|
||||||
|
export function arrayToString<T>(a: T[]) {
|
||||||
|
return `[${a.join(", ")}]`;
|
||||||
|
}
|
14
utils/helpers/clearObject.ts
Normal file
14
utils/helpers/clearObject.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Clears defined properties from an object.
|
||||||
|
* Does not delete up the prototype chain.
|
||||||
|
* @deprecated Look into using `Map` or `Set` rather than manipulating properties on an Object.
|
||||||
|
* @param obj the object to clear all properties
|
||||||
|
*/
|
||||||
|
export function clearObject(obj: any) {
|
||||||
|
for (const key in obj) {
|
||||||
|
if (obj.hasOwnProperty(key)) {
|
||||||
|
// tslint:disable-next-line:no-dynamic-delete
|
||||||
|
delete obj[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
19
utils/helpers/compareArrays.ts
Normal file
19
utils/helpers/compareArrays.ts
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Does a shallow compare of two arrays to determine if they are equal.
|
||||||
|
* @param a1 The first array
|
||||||
|
* @param a2 The second array
|
||||||
|
*/
|
||||||
|
export function compareArrays<T>(a1: T[], a2: T[]) {
|
||||||
|
if (a1.length !== a2.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i: number = 0; i < a1.length; ++i) {
|
||||||
|
if (a1[i] !== a2[i]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
44
utils/helpers/createProgressBarText.ts
Normal file
44
utils/helpers/createProgressBarText.ts
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/**
|
||||||
|
* Represents the possible configuration values that can be provided when creating the progress bar text.
|
||||||
|
*/
|
||||||
|
interface IProgressBarConfiguration {
|
||||||
|
/**
|
||||||
|
* Current progress, taken as a decimal (i.e. '0.6' to represent '60%')
|
||||||
|
*/
|
||||||
|
progress?: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Total number of ticks in progress bar. Preferably a factor of 100.
|
||||||
|
*/
|
||||||
|
totalTicks?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents concrete configuration values when creating the progress bar text.
|
||||||
|
*/
|
||||||
|
interface IProgressBarConfigurationMaterialized extends IProgressBarConfiguration {
|
||||||
|
progress: number;
|
||||||
|
totalTicks: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a graphical "progress bar"
|
||||||
|
* e.g.: [||||---------------]
|
||||||
|
* @param params The configuration parameters for the progress bar
|
||||||
|
*/
|
||||||
|
export function createProgressBarText(params: IProgressBarConfiguration) {
|
||||||
|
// Default values
|
||||||
|
const defaultParams: IProgressBarConfigurationMaterialized = {
|
||||||
|
progress: 0,
|
||||||
|
totalTicks: 20,
|
||||||
|
};
|
||||||
|
|
||||||
|
// tslint:disable-next-line:prefer-object-spread
|
||||||
|
const derivedParams: IProgressBarConfigurationMaterialized = Object.assign({}, params, defaultParams);
|
||||||
|
|
||||||
|
const bars: number = Math.floor(derivedParams.progress / (1 / derivedParams.totalTicks));
|
||||||
|
const dashes: number = derivedParams.totalTicks - bars;
|
||||||
|
|
||||||
|
// String.prototype.repeat isn't completley supported, but good enough for our purposes
|
||||||
|
return `[${"|".repeat(bars + 1)}${"-".repeat(dashes + 1)}]`;
|
||||||
|
}
|
16
utils/helpers/exceptionAlert.js
Normal file
16
utils/helpers/exceptionAlert.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { dialogBoxCreate } from "../DialogBox";
|
||||||
|
|
||||||
|
function exceptionAlert(e) {
|
||||||
|
dialogBoxCreate("Caught an exception: " + e + "<br><br>" +
|
||||||
|
"Filename: " + (e.fileName || "UNKNOWN FILE NAME") + "<br><br>" +
|
||||||
|
"Line Number: " + (e.lineNumber || "UNKNOWN LINE NUMBER") + "<br><br>" +
|
||||||
|
"This is a bug, please report to game developer with this " +
|
||||||
|
"message as well as details about how to reproduce the bug.<br><br>" +
|
||||||
|
"If you want to be safe, I suggest refreshing the game WITHOUT saving so that your " +
|
||||||
|
"safe doesn't get corrupted");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
exceptionAlert
|
||||||
|
}
|
13
utils/helpers/getRandomByte.ts
Normal file
13
utils/helpers/getRandomByte.ts
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import { getRandomInt } from "./getRandomInt";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a random value in the range of a byte (0 - 255), or up to the maximum.
|
||||||
|
* @param max The maximum value (up to 255).
|
||||||
|
*/
|
||||||
|
export function getRandomByte(max: number) {
|
||||||
|
// Technically 2^8 is 256, but the values are 0-255, not 1-256.
|
||||||
|
const byteMaximum: number = 255;
|
||||||
|
const upper: number = Math.max(Math.min(max, byteMaximum), 0);
|
||||||
|
|
||||||
|
return getRandomInt(0, upper);
|
||||||
|
}
|
11
utils/helpers/getRandomInt.ts
Normal file
11
utils/helpers/getRandomInt.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
/**
|
||||||
|
* Gets a random integer bounded by the values passed in.
|
||||||
|
* @param min The minimum value in the range.
|
||||||
|
* @param max The maximum value in the range.
|
||||||
|
*/
|
||||||
|
export function getRandomInt(min: number, max: number) {
|
||||||
|
const lower: number = Math.min(min, max);
|
||||||
|
const upper: number = Math.max(min, max);
|
||||||
|
|
||||||
|
return Math.floor(Math.random() * (upper - lower + 1)) + lower;
|
||||||
|
}
|
17
utils/helpers/isPowerOfTwo.ts
Normal file
17
utils/helpers/isPowerOfTwo.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* Determines if the number is a power of 2
|
||||||
|
* @param n The number to check.
|
||||||
|
*/
|
||||||
|
export function isPowerOfTwo(n: number) {
|
||||||
|
if (isNaN(n)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n === 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disabiling the bitwise rule because it's honestly the most effecient way to check for this.
|
||||||
|
// tslint:disable-next-line:no-bitwise
|
||||||
|
return (n & (n - 1)) === 0;
|
||||||
|
}
|
7
utils/helpers/isString.ts
Normal file
7
utils/helpers/isString.ts
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
/**
|
||||||
|
* Checks whether the value passed in can be considered a string.
|
||||||
|
* @param value The value to check if it is a string.
|
||||||
|
*/
|
||||||
|
export function isString(value: any): boolean {
|
||||||
|
return (typeof value === "string" || value instanceof String);
|
||||||
|
}
|
12
utils/helpers/isValidIPAddress.ts
Normal file
12
utils/helpers/isValidIPAddress.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether a IP Address string is valid.
|
||||||
|
* @param ipaddress A string representing a potential IP Address
|
||||||
|
*/
|
||||||
|
export function isValidIPAddress(ipaddress: string) {
|
||||||
|
const byteRange: string = "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)";
|
||||||
|
const regexStr: string = `^${byteRange}\.${byteRange}\.${byteRange}\.${byteRange}$`;
|
||||||
|
const ipAddressRegex: RegExp = new RegExp(regexStr);
|
||||||
|
|
||||||
|
return ipAddressRegex.test(ipaddress);
|
||||||
|
}
|
9
utils/helpers/roundToTwo.ts
Normal file
9
utils/helpers/roundToTwo.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
/**
|
||||||
|
* Rounds a number to two decimal places.
|
||||||
|
* @param decimal A decimal value to trim to two places.
|
||||||
|
*/
|
||||||
|
export function roundToTwo(decimal: number) {
|
||||||
|
const leftShift: number = Math.round(parseInt(`${decimal}e+2`, 10));
|
||||||
|
|
||||||
|
return +(`${leftShift}e-2`);
|
||||||
|
}
|
12
utils/uiHelpers/appendLineBreaks.ts
Normal file
12
utils/uiHelpers/appendLineBreaks.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import { createElement } from "./createElement";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appends the specified number of breaks (as children) to the specified element
|
||||||
|
* @param el The element to add child break elements to.
|
||||||
|
* @param n The number of breaks to add.
|
||||||
|
*/
|
||||||
|
export function appendLineBreaks(el: HTMLElement, n: number) {
|
||||||
|
for (let i: number = 0; i < n; ++i) {
|
||||||
|
el.appendChild(createElement("br"));
|
||||||
|
}
|
||||||
|
}
|
23
utils/uiHelpers/clearEventListeners.ts
Normal file
23
utils/uiHelpers/clearEventListeners.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import { getElementById } from "./getElementById";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given an element by its ID, removes all event listeners from that element by cloning and
|
||||||
|
* replacing. Then returns the new cloned element.
|
||||||
|
* @param elemId The HTML ID to retrieve the element by.
|
||||||
|
*/
|
||||||
|
export function clearEventListeners(elemId: string) {
|
||||||
|
try {
|
||||||
|
const elem: HTMLElement = getElementById(elemId);
|
||||||
|
const newElem: HTMLElement = elem.cloneNode(true) as HTMLElement;
|
||||||
|
if (elem.parentNode !== null) {
|
||||||
|
elem.parentNode.replaceChild(newElem, elem);
|
||||||
|
}
|
||||||
|
|
||||||
|
return newElem;
|
||||||
|
} catch (e) {
|
||||||
|
// tslint:disable-next-line:no-console
|
||||||
|
console.error(e);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
9
utils/uiHelpers/clearSelector.ts
Normal file
9
utils/uiHelpers/clearSelector.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
/**
|
||||||
|
* Clears all <option> elements from a <select>.
|
||||||
|
* @param selector The <select> element
|
||||||
|
*/
|
||||||
|
export function clearSelector(selector: HTMLSelectElement) {
|
||||||
|
for (let i: number = selector.options.length - 1; i >= 0; i--) {
|
||||||
|
selector.remove(i);
|
||||||
|
}
|
||||||
|
}
|
51
utils/uiHelpers/createAccordionElement.ts
Normal file
51
utils/uiHelpers/createAccordionElement.ts
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
import { createElement } from "./createElement";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Possible configuration parameters when creating the accordion element.
|
||||||
|
*/
|
||||||
|
interface IAccordionConfigurationParameters {
|
||||||
|
/**
|
||||||
|
* The HTML to appear in the accordion header.
|
||||||
|
*/
|
||||||
|
hdrText?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A (hopefully) unique identifier for the accordion.
|
||||||
|
*/
|
||||||
|
id?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The HTML to appear in the expanded accordion.
|
||||||
|
*/
|
||||||
|
panelText?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates both the header and panel element of an accordion and sets the click handler
|
||||||
|
* @param params The creation parameters.
|
||||||
|
*/
|
||||||
|
export function createAccordionElement(params: IAccordionConfigurationParameters) {
|
||||||
|
const liElem: HTMLLIElement = createElement("li") as HTMLLIElement;
|
||||||
|
const header: HTMLButtonElement = createElement("button", {
|
||||||
|
clickListener() {
|
||||||
|
this.classList.toggle("active");
|
||||||
|
const pnl: CSSStyleDeclaration = (this.nextElementSibling as HTMLDivElement).style;
|
||||||
|
pnl.display = pnl.display === "block" ? "none" : "block";
|
||||||
|
},
|
||||||
|
id: params.id !== undefined ? `${params.id}-hdr` : undefined,
|
||||||
|
innerHTML: params.hdrText,
|
||||||
|
}) as HTMLButtonElement;
|
||||||
|
const panel: HTMLDivElement = createElement("div", {
|
||||||
|
id: params.id !== undefined ? `${params.id}-panel` : undefined,
|
||||||
|
innerHTML: params.panelText,
|
||||||
|
}) as HTMLDivElement;
|
||||||
|
|
||||||
|
liElem.appendChild(header);
|
||||||
|
liElem.appendChild(panel);
|
||||||
|
|
||||||
|
return [
|
||||||
|
liElem,
|
||||||
|
header,
|
||||||
|
panel,
|
||||||
|
];
|
||||||
|
}
|
250
utils/uiHelpers/createElement.ts
Normal file
250
utils/uiHelpers/createElement.ts
Normal file
@ -0,0 +1,250 @@
|
|||||||
|
/**
|
||||||
|
* Options specific to creating an anchor ("<a>") element.
|
||||||
|
*/
|
||||||
|
interface ICreateElementAnchorOptions {
|
||||||
|
href?: string;
|
||||||
|
target?: string;
|
||||||
|
text?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Options specific to creating an input ("<input>") element.
|
||||||
|
*/
|
||||||
|
interface ICreateElementInputOptions {
|
||||||
|
checked?: boolean;
|
||||||
|
maxLength?: number;
|
||||||
|
name?: string;
|
||||||
|
pattern?: string;
|
||||||
|
placeholder?: string;
|
||||||
|
type?: string;
|
||||||
|
value?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Options specific to creating a label ("<label>") element.
|
||||||
|
*/
|
||||||
|
interface ICreateElementLabelOptions {
|
||||||
|
for?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Options for setting up event listeners on the element.
|
||||||
|
*/
|
||||||
|
interface ICreateElementListenerOptions {
|
||||||
|
changeListener?(this: HTMLElement, ev: Event): any;
|
||||||
|
clickListener?(this: HTMLElement, ev: MouseEvent): any;
|
||||||
|
inputListener?(this: HTMLElement, ev: Event): any;
|
||||||
|
onfocus?(this: HTMLElement, ev: FocusEvent): any;
|
||||||
|
onkeyup?(this: HTMLElement, ev: KeyboardEvent): any;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Options for setting up the inline-styling of element.
|
||||||
|
* NOTE: Relying on CSS styling should be preferred over forcing the higher specificity via inline styles.
|
||||||
|
*/
|
||||||
|
interface ICreateElementStyleOptions {
|
||||||
|
backgroundColor?: string;
|
||||||
|
border?: string;
|
||||||
|
color?: string;
|
||||||
|
display?: string;
|
||||||
|
float?: string;
|
||||||
|
fontSize?: string;
|
||||||
|
margin?: string;
|
||||||
|
marginLeft?: string;
|
||||||
|
marginTop?: string;
|
||||||
|
padding?: string;
|
||||||
|
position?: string;
|
||||||
|
visibility?: string;
|
||||||
|
whiteSpace?: string;
|
||||||
|
width?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Options for adding an in-game tooltip to the element.
|
||||||
|
*/
|
||||||
|
interface ICreateElementTooltipOptions {
|
||||||
|
tooltip?: string;
|
||||||
|
tooltipleft?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All possible configuration options when creating an element.
|
||||||
|
*/
|
||||||
|
interface ICreateElementOptions extends
|
||||||
|
ICreateElementStyleOptions,
|
||||||
|
ICreateElementListenerOptions,
|
||||||
|
ICreateElementInputOptions,
|
||||||
|
ICreateElementAnchorOptions,
|
||||||
|
ICreateElementLabelOptions,
|
||||||
|
ICreateElementTooltipOptions {
|
||||||
|
/**
|
||||||
|
* CSS Class(es) to initially set.
|
||||||
|
*/
|
||||||
|
class?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A (hopefully) unique identifier for the element.
|
||||||
|
*/
|
||||||
|
id?: string;
|
||||||
|
|
||||||
|
innerHTML?: string;
|
||||||
|
innerText?: string;
|
||||||
|
tabIndex?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setElementAnchor(el: HTMLAnchorElement, params: ICreateElementAnchorOptions) {
|
||||||
|
if (params.text !== undefined) {
|
||||||
|
el.text = params.text;
|
||||||
|
}
|
||||||
|
if (params.href !== undefined) {
|
||||||
|
el.href = params.href;
|
||||||
|
}
|
||||||
|
if (params.target !== undefined) {
|
||||||
|
el.target = params.target;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setElementInput(el: HTMLInputElement, params: ICreateElementInputOptions) {
|
||||||
|
if (params.name !== undefined) {
|
||||||
|
el.name = params.name;
|
||||||
|
}
|
||||||
|
if (params.value !== undefined) {
|
||||||
|
el.value = params.value;
|
||||||
|
}
|
||||||
|
if (params.type !== undefined) {
|
||||||
|
el.type = params.type;
|
||||||
|
}
|
||||||
|
if (params.checked !== undefined) {
|
||||||
|
el.checked = params.checked;
|
||||||
|
}
|
||||||
|
if (params.pattern !== undefined) {
|
||||||
|
el.pattern = params.pattern;
|
||||||
|
}
|
||||||
|
if (params.maxLength !== undefined) {
|
||||||
|
el.maxLength = params.maxLength;
|
||||||
|
}
|
||||||
|
if (params.placeholder !== undefined) {
|
||||||
|
el.placeholder = params.placeholder;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setElementLabel(el: HTMLLabelElement, params: ICreateElementLabelOptions) {
|
||||||
|
if (params.for !== undefined) {
|
||||||
|
el.htmlFor = params.for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setElementListeners(el: HTMLElement, params: ICreateElementListenerOptions) {
|
||||||
|
// tslint:disable:no-unbound-method
|
||||||
|
if (params.clickListener !== undefined) {
|
||||||
|
el.addEventListener("click", params.clickListener);
|
||||||
|
}
|
||||||
|
if (params.inputListener !== undefined) {
|
||||||
|
el.addEventListener("input", params.inputListener);
|
||||||
|
}
|
||||||
|
if (params.changeListener !== undefined) {
|
||||||
|
el.addEventListener("change", params.changeListener);
|
||||||
|
}
|
||||||
|
if (params.onkeyup !== undefined) {
|
||||||
|
el.addEventListener("keyup", params.onkeyup);
|
||||||
|
}
|
||||||
|
if (params.onfocus !== undefined) {
|
||||||
|
el.addEventListener("focus", params.onfocus);
|
||||||
|
}
|
||||||
|
// tslint:enable:no-unbound-method
|
||||||
|
}
|
||||||
|
|
||||||
|
function setElementStyle(el: HTMLElement, params: ICreateElementStyleOptions) {
|
||||||
|
if (params.display !== undefined) {
|
||||||
|
el.style.display = params.display;
|
||||||
|
}
|
||||||
|
if (params.visibility !== undefined) {
|
||||||
|
el.style.visibility = params.visibility;
|
||||||
|
}
|
||||||
|
if (params.margin !== undefined) {
|
||||||
|
el.style.margin = params.margin;
|
||||||
|
}
|
||||||
|
if (params.marginLeft !== undefined) {
|
||||||
|
el.style.marginLeft = params.marginLeft;
|
||||||
|
}
|
||||||
|
if (params.marginTop !== undefined) {
|
||||||
|
el.style.marginTop = params.marginTop;
|
||||||
|
}
|
||||||
|
if (params.padding !== undefined) {
|
||||||
|
el.style.padding = params.padding;
|
||||||
|
}
|
||||||
|
if (params.color !== undefined) {
|
||||||
|
el.style.color = params.color;
|
||||||
|
}
|
||||||
|
if (params.border !== undefined) {
|
||||||
|
el.style.border = params.border;
|
||||||
|
}
|
||||||
|
if (params.float !== undefined) {
|
||||||
|
el.style.cssFloat = params.float;
|
||||||
|
}
|
||||||
|
if (params.fontSize !== undefined) {
|
||||||
|
el.style.fontSize = params.fontSize;
|
||||||
|
}
|
||||||
|
if (params.whiteSpace !== undefined) {
|
||||||
|
el.style.whiteSpace = params.whiteSpace;
|
||||||
|
}
|
||||||
|
if (params.width !== undefined) {
|
||||||
|
el.style.width = params.width;
|
||||||
|
}
|
||||||
|
if (params.backgroundColor !== undefined) {
|
||||||
|
el.style.backgroundColor = params.backgroundColor;
|
||||||
|
}
|
||||||
|
if (params.position !== undefined) {
|
||||||
|
el.style.position = params.position;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setElementTooltip(el: HTMLElement, params: ICreateElementTooltipOptions) {
|
||||||
|
if (params.tooltip !== undefined && params.tooltip !== "") {
|
||||||
|
el.className += " tooltip";
|
||||||
|
el.appendChild(createElement("span", {
|
||||||
|
class: "tooltiptext",
|
||||||
|
innerHTML: params.tooltip,
|
||||||
|
}));
|
||||||
|
} else if (params.tooltipleft !== undefined) {
|
||||||
|
el.className += " tooltip";
|
||||||
|
el.appendChild(createElement("span", {
|
||||||
|
class: "tooltiptextleft",
|
||||||
|
innerHTML: params.tooltipleft,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An all-in-one-call way of creating an element to be added to the DOM at some point.
|
||||||
|
* @param tagName The HTML tag/element name
|
||||||
|
* @param params Additional parameters to set on the element
|
||||||
|
*/
|
||||||
|
export function createElement(tagName: string, params: ICreateElementOptions = {}) {
|
||||||
|
const el: HTMLElement = document.createElement(tagName);
|
||||||
|
|
||||||
|
if (params.id !== undefined) {
|
||||||
|
el.id = params.id;
|
||||||
|
}
|
||||||
|
if (params.class !== undefined) {
|
||||||
|
el.className = params.class;
|
||||||
|
}
|
||||||
|
if (params.innerHTML !== undefined) {
|
||||||
|
el.innerHTML = params.innerHTML;
|
||||||
|
}
|
||||||
|
if (params.innerText !== undefined) {
|
||||||
|
el.innerText = params.innerText;
|
||||||
|
}
|
||||||
|
if (params.tabIndex !== undefined) {
|
||||||
|
el.tabIndex = params.tabIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
setElementAnchor(el as HTMLAnchorElement, params);
|
||||||
|
setElementInput(el as HTMLInputElement, params);
|
||||||
|
setElementLabel(el as HTMLLabelElement, params);
|
||||||
|
setElementListeners(el, params);
|
||||||
|
setElementStyle(el, params);
|
||||||
|
setElementTooltip(el, params);
|
||||||
|
|
||||||
|
return el;
|
||||||
|
}
|
28
utils/uiHelpers/createPopup.ts
Normal file
28
utils/uiHelpers/createPopup.ts
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import { createElement } from "./createElement";
|
||||||
|
import { getElementById } from "./getElementById";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the necessary DOM elements to present an in-game popup to the player.
|
||||||
|
* @param id The (hopefully) unique identifier for the popup container.
|
||||||
|
* @param elems The collection of HTML Elements to show within the popup.
|
||||||
|
*/
|
||||||
|
export function createPopup(id: string, elems: HTMLElement[]) {
|
||||||
|
const container: HTMLDivElement = createElement("div", {
|
||||||
|
class: "popup-box-container",
|
||||||
|
display: "block",
|
||||||
|
id,
|
||||||
|
}) as HTMLDivElement;
|
||||||
|
const content: HTMLElement = createElement("div", {
|
||||||
|
class: "popup-box-content",
|
||||||
|
id: `${id}-content`,
|
||||||
|
});
|
||||||
|
|
||||||
|
for (const elem of elems) {
|
||||||
|
content.appendChild(elem);
|
||||||
|
}
|
||||||
|
container.appendChild(content);
|
||||||
|
getElementById("entire-game-container")
|
||||||
|
.appendChild(container);
|
||||||
|
|
||||||
|
return container;
|
||||||
|
}
|
14
utils/uiHelpers/getElementById.ts
Normal file
14
utils/uiHelpers/getElementById.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Returns a reference to the first object with the specified value of the ID or NAME attribute,
|
||||||
|
* throwing an error if it is unable to find it.
|
||||||
|
* @param elementId The HTML ID to retrieve the element by.
|
||||||
|
* @throws {Error} When the 'elementId' cannot be found.
|
||||||
|
*/
|
||||||
|
export function getElementById(elementId: string) {
|
||||||
|
const el: HTMLElement | null = document.getElementById(elementId);
|
||||||
|
if (el === null) {
|
||||||
|
throw new Error(`Unable to find element with id '${elementId}'`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return el;
|
||||||
|
}
|
28
utils/uiHelpers/removeChildrenFromElement.ts
Normal file
28
utils/uiHelpers/removeChildrenFromElement.ts
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import { isString } from "../helpers/isString";
|
||||||
|
import { getElementById } from "./getElementById";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears out all children from the provided element.
|
||||||
|
* If a string is passed in, it will treat it as an ID and search for the element to delete all children from.
|
||||||
|
* @param el The element or ID of an element to remove all children from.
|
||||||
|
*/
|
||||||
|
export function removeChildrenFromElement(el: string | null | Element) {
|
||||||
|
if (el === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const elem: HTMLElement | Element = (isString(el) ? getElementById(el as string) : el as Element);
|
||||||
|
|
||||||
|
if (elem instanceof Element) {
|
||||||
|
while (elem.firstChild !== null) {
|
||||||
|
elem.removeChild(elem.firstChild);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
// tslint:disable-next-line:no-console
|
||||||
|
console.debug(e);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
26
utils/uiHelpers/removeElement.ts
Normal file
26
utils/uiHelpers/removeElement.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/**
|
||||||
|
* For a given element, this function removes it AND its children
|
||||||
|
* @param elem The element to remove.
|
||||||
|
*/
|
||||||
|
export function removeElement(elem: Element | null) {
|
||||||
|
if (elem === null) {
|
||||||
|
// tslint:disable-next-line:no-console
|
||||||
|
console.debug("The element passed into 'removeElement' was null.");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!(elem instanceof Element)) {
|
||||||
|
// tslint:disable-next-line:no-console
|
||||||
|
console.debug("The element passed into 'removeElement' was not an instance of an Element.");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (elem.firstChild !== null) {
|
||||||
|
elem.removeChild(elem.firstChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elem.parentNode !== null) {
|
||||||
|
elem.parentNode.removeChild(elem);
|
||||||
|
}
|
||||||
|
}
|
15
utils/uiHelpers/removeElementById.ts
Normal file
15
utils/uiHelpers/removeElementById.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import { getElementById } from "./getElementById";
|
||||||
|
import { removeElement } from "./removeElement";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given its id, this function removes an element AND its children
|
||||||
|
* @param id The HTML identifier to search for and remove.
|
||||||
|
*/
|
||||||
|
export function removeElementById(id: string) {
|
||||||
|
try {
|
||||||
|
const elem: HTMLElement = getElementById(id);
|
||||||
|
removeElement(elem);
|
||||||
|
} catch (e) {
|
||||||
|
// Probably should log this as we're trying to remove elements that don't exist.
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user