merge dev

This commit is contained in:
phyzical 2022-03-30 19:11:34 +08:00
commit be24562d34
17 changed files with 705 additions and 445 deletions

@ -2024,29 +2024,11 @@ export const churchOfTheMachineGodAugmentations = [
hacknet_node_core_cost_mult: 1 / 1.05, hacknet_node_core_cost_mult: 1 / 1.05,
hacknet_node_level_cost_mult: 1 / 1.05, hacknet_node_level_cost_mult: 1 / 1.05,
work_money_mult: 1 / 0.95, work_money_mult: 1 / 0.95,
stats: <>Staneks Gift has no penalty.</>, stats: <>Stanek's Gift has no penalty.</>,
factions: [FactionNames.ChurchOfTheMachineGod], factions: [FactionNames.ChurchOfTheMachineGod],
}), }),
]; ];
export function getNextNeuroFluxLevel(): number {
// Get current Neuroflux level based on Player's augmentations
let currLevel = 0;
for (let i = 0; i < Player.augmentations.length; ++i) {
if (Player.augmentations[i].name === AugmentationNames.NeuroFluxGovernor) {
currLevel = Player.augmentations[i].level;
}
}
// Account for purchased but uninstalled Augmentations
for (let i = 0; i < Player.queuedAugmentations.length; ++i) {
if (Player.queuedAugmentations[i].name == AugmentationNames.NeuroFluxGovernor) {
++currLevel;
}
}
return currLevel + 1;
}
export function initNeuroFluxGovernor(): Augmentation { export function initNeuroFluxGovernor(): Augmentation {
return new Augmentation({ return new Augmentation({
name: AugmentationNames.NeuroFluxGovernor, name: AugmentationNames.NeuroFluxGovernor,

@ -11,18 +11,36 @@ import { SourceFileFlags } from "../SourceFile/SourceFileFlags";
import { dialogBoxCreate } from "../ui/React/DialogBox"; import { dialogBoxCreate } from "../ui/React/DialogBox";
import { clearObject } from "../utils/helpers/clearObject"; import { clearObject } from "../utils/helpers/clearObject";
import { FactionNames } from "../Faction/data/FactionNames"; import { FactionNames } from "../Faction/data/FactionNames";
import { import {
bladeburnerAugmentations, bladeburnerAugmentations,
churchOfTheMachineGodAugmentations, churchOfTheMachineGodAugmentations,
generalAugmentations, generalAugmentations,
getNextNeuroFluxLevel,
infiltratorsAugmentations, infiltratorsAugmentations,
initNeuroFluxGovernor, initNeuroFluxGovernor,
initUnstableCircadianModulator, initUnstableCircadianModulator,
} from "./AugmentationCreator"; } from "./AugmentationCreator";
import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers"; import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers";
export function getNextNeuroFluxLevel(): number {
// Get current Neuroflux level based on Player's augmentations
let currLevel = 0;
for (let i = 0; i < Player.augmentations.length; ++i) {
if (Player.augmentations[i].name === AugmentationNames.NeuroFluxGovernor) {
currLevel = Player.augmentations[i].level;
}
}
// Account for purchased but uninstalled Augmentations
for (let i = 0; i < Player.queuedAugmentations.length; ++i) {
if (Player.queuedAugmentations[i].name == AugmentationNames.NeuroFluxGovernor) {
++currLevel;
}
}
return currLevel + 1;
}
export function AddToAugmentations(aug: Augmentation): void { export function AddToAugmentations(aug: Augmentation): void {
const name = aug.name; const name = aug.name;
Augmentations[name] = aug; Augmentations[name] = aug;

@ -232,6 +232,11 @@ interface IBitNodeMultipliers {
*/ */
WorldDaemonDifficulty: number; WorldDaemonDifficulty: number;
/**
* Influences corporation dividends.
*/
CorporationSoftCap: number;
// Index signature // Index signature
[key: string]: number; [key: string]: number;
} }

@ -35,6 +35,7 @@ import { joinFaction } from "../Faction/FactionHelpers";
import { WorkerScript } from "../Netscript/WorkerScript"; import { WorkerScript } from "../Netscript/WorkerScript";
import { FactionNames } from "../Faction/data/FactionNames"; import { FactionNames } from "../Faction/data/FactionNames";
import { BlackOperationNames } from "./data/BlackOperationNames"; import { BlackOperationNames } from "./data/BlackOperationNames";
import { KEY } from "../utils/helpers/keyCodes";
interface BlackOpsAttempt { interface BlackOpsAttempt {
error?: string; error?: string;
@ -793,7 +794,7 @@ export class Bladeburner implements IBladeburner {
if (c === '"') { if (c === '"') {
// Double quotes // Double quotes
const endQuote = command.indexOf('"', i + 1); const endQuote = command.indexOf('"', i + 1);
if (endQuote !== -1 && (endQuote === command.length - 1 || command.charAt(endQuote + 1) === " ")) { if (endQuote !== -1 && (endQuote === command.length - 1 || command.charAt(endQuote + 1) === KEY.SPACE)) {
args.push(command.substr(i + 1, endQuote - i - 1)); args.push(command.substr(i + 1, endQuote - i - 1));
if (endQuote === command.length - 1) { if (endQuote === command.length - 1) {
start = i = endQuote + 1; start = i = endQuote + 1;
@ -805,7 +806,7 @@ export class Bladeburner implements IBladeburner {
} else if (c === "'") { } else if (c === "'") {
// Single quotes, same thing as above // Single quotes, same thing as above
const endQuote = command.indexOf("'", i + 1); const endQuote = command.indexOf("'", i + 1);
if (endQuote !== -1 && (endQuote === command.length - 1 || command.charAt(endQuote + 1) === " ")) { if (endQuote !== -1 && (endQuote === command.length - 1 || command.charAt(endQuote + 1) === KEY.SPACE)) {
args.push(command.substr(i + 1, endQuote - i - 1)); args.push(command.substr(i + 1, endQuote - i - 1));
if (endQuote === command.length - 1) { if (endQuote === command.length - 1) {
start = i = endQuote + 1; start = i = endQuote + 1;
@ -814,7 +815,7 @@ export class Bladeburner implements IBladeburner {
} }
continue; continue;
} }
} else if (c === " ") { } else if (c === KEY.SPACE) {
args.push(command.substr(start, i - start)); args.push(command.substr(start, i - start));
start = i + 1; start = i + 1;
} }

@ -43,6 +43,7 @@ export function AugmentationsPage(props: IProps): React.ReactElement {
function getAugs(): string[] { function getAugs(): string[] {
if (isPlayersGang) { if (isPlayersGang) {
// TODO: this code is duplicated in getAugmentationsFromFaction DRY
let augs = Object.values(Augmentations); let augs = Object.values(Augmentations);
// Remove special augs. // Remove special augs.
@ -53,7 +54,9 @@ export function AugmentationsPage(props: IProps): React.ReactElement {
augs = augs.filter((a) => a.factions.length > 1 || props.faction.augmentations.includes(a.name)); augs = augs.filter((a) => a.factions.length > 1 || props.faction.augmentations.includes(a.name));
// Remove blacklisted augs. // Remove blacklisted augs.
const blacklist = [AugmentationNames.NeuroFluxGovernor, AugmentationNames.TheRedPill]; const blacklist = [AugmentationNames.NeuroFluxGovernor, AugmentationNames.TheRedPill].map(
(augmentation) => augmentation as string,
);
augs = augs.filter((a) => !blacklist.includes(a.name)); augs = augs.filter((a) => !blacklist.includes(a.name));
} }
@ -184,6 +187,7 @@ export function AugmentationsPage(props: IProps): React.ReactElement {
</> </>
); );
} }
return ( return (
<> <>
<Button onClick={props.routeToMainPage}>Back</Button> <Button onClick={props.routeToMainPage}>Back</Button>

@ -82,6 +82,13 @@ import {
Stanek as IStanek, Stanek as IStanek,
Infiltration as IInfiltration, Infiltration as IInfiltration,
SourceFileLvl, SourceFileLvl,
BasicHGWOptions,
ProcessInfo,
HackingMultipliers,
HacknetMultipliers,
BitNodeMultipliers as IBNMults,
Server as IServerDef,
RunningScript as IRunningScriptDef,
} from "./ScriptEditor/NetscriptDefinitions"; } from "./ScriptEditor/NetscriptDefinitions";
import { NetscriptSingularity } from "./NetscriptFunctions/Singularity"; import { NetscriptSingularity } from "./NetscriptFunctions/Singularity";
@ -165,9 +172,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
* is not specified. * is not specified.
*/ */
const getRunningScript = function ( const getRunningScript = function (
fn: any, fn: string,
hostname: any, hostname: string,
callingFnName: any, callingFnName: string,
scriptArgs: any, scriptArgs: any,
): RunningScript | null { ): RunningScript | null {
if (typeof callingFnName !== "string" || callingFnName === "") { if (typeof callingFnName !== "string" || callingFnName === "") {
@ -196,7 +203,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return workerScript.scriptRef; return workerScript.scriptRef;
}; };
const getRunningScriptByPid = function (pid: any, callingFnName: any): RunningScript | null { const getRunningScriptByPid = function (pid: number, callingFnName: string): RunningScript | null {
if (typeof callingFnName !== "string" || callingFnName === "") { if (typeof callingFnName !== "string" || callingFnName === "") {
callingFnName = "getRunningScriptgetRunningScriptByPid"; callingFnName = "getRunningScriptgetRunningScriptByPid";
} }
@ -216,7 +223,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
* @param {any[]} scriptArgs - Running script's arguments * @param {any[]} scriptArgs - Running script's arguments
* @returns {string} Error message to print to logs * @returns {string} Error message to print to logs
*/ */
const getCannotFindRunningScriptErrorMessage = function (fn: any, hostname: any, scriptArgs: any): string { const getCannotFindRunningScriptErrorMessage = function (fn: string, hostname: string, scriptArgs: any): string {
if (!Array.isArray(scriptArgs)) { if (!Array.isArray(scriptArgs)) {
scriptArgs = []; scriptArgs = [];
} }
@ -231,7 +238,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
* @param {string} callingFn - Name of calling function. For logging purposes * @param {string} callingFn - Name of calling function. For logging purposes
* @returns {boolean} True if the server is a Hacknet Server, false otherwise * @returns {boolean} True if the server is a Hacknet Server, false otherwise
*/ */
const failOnHacknetServer = function (server: any, callingFn: any = ""): boolean { const failOnHacknetServer = function (server: BaseServer, callingFn = ""): boolean {
if (server instanceof HacknetServer) { if (server instanceof HacknetServer) {
workerScript.log(callingFn, () => `Does not work on Hacknet Servers`); workerScript.log(callingFn, () => `Does not work on Hacknet Servers`);
return true; return true;
@ -319,7 +326,11 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
} }
}; };
const hack = function (hostname: any, manual: any, { threads: requestedThreads, stock }: any = {}): Promise<number> { const hack = function (
hostname: string,
manual: boolean,
{ threads: requestedThreads, stock }: any = {},
): Promise<number> {
if (hostname === undefined) { if (hostname === undefined) {
throw makeRuntimeErrorMsg("hack", "Takes 1 argument."); throw makeRuntimeErrorMsg("hack", "Takes 1 argument.");
} }
@ -450,7 +461,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
getServer: safeGetServer, getServer: safeGetServer,
checkSingularityAccess: checkSingularityAccess, checkSingularityAccess: checkSingularityAccess,
hack: hack, hack: hack,
getValidPort: (funcName: string, port: any): IPort => { getValidPort: (funcName: string, port: number): IPort => {
if (isNaN(port)) { if (isNaN(port)) {
throw makeRuntimeErrorMsg( throw makeRuntimeErrorMsg(
funcName, funcName,
@ -506,7 +517,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
hacknet: hacknet, hacknet: hacknet,
sprintf: sprintf, sprintf: sprintf,
vsprintf: vsprintf, vsprintf: vsprintf,
scan: function (hostname: any = workerScript.hostname): any { scan: function (_hostname: unknown = workerScript.hostname): string[] {
const hostname = helper.string("scan", "hostname", _hostname);
updateDynamicRam("scan", getRamCost(Player, "scan")); updateDynamicRam("scan", getRamCost(Player, "scan"));
const server = safeGetServer(hostname, "scan"); const server = safeGetServer(hostname, "scan");
const out = []; const out = [];
@ -520,11 +532,14 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
workerScript.log("scan", () => `returned ${server.serversOnNetwork.length} connections for ${server.hostname}`); workerScript.log("scan", () => `returned ${server.serversOnNetwork.length} connections for ${server.hostname}`);
return out; return out;
}, },
hack: function (hostname: any, { threads: requestedThreads, stock }: any = {}): any { hack: function (_hostname: unknown, { threads: requestedThreads, stock }: BasicHGWOptions = {}): Promise<number> {
const hostname = helper.string("hack", "hostname", _hostname);
updateDynamicRam("hack", getRamCost(Player, "hack")); updateDynamicRam("hack", getRamCost(Player, "hack"));
return hack(hostname, false, { threads: requestedThreads, stock: stock }); return hack(hostname, false, { threads: requestedThreads, stock: stock });
}, },
hackAnalyzeThreads: function (hostname: any, hackAmount: any): any { hackAnalyzeThreads: function (_hostname: unknown, _hackAmount: unknown): number {
const hostname = helper.string("hackAnalyzeThreads", "hostname", _hostname);
const hackAmount = helper.number("hackAnalyzeThreads", "hackAmount", _hackAmount);
updateDynamicRam("hackAnalyzeThreads", getRamCost(Player, "hackAnalyzeThreads")); updateDynamicRam("hackAnalyzeThreads", getRamCost(Player, "hackAnalyzeThreads"));
// Check argument validity // Check argument validity
@ -554,43 +569,48 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return hackAmount / Math.floor(server.moneyAvailable * percentHacked); return hackAmount / Math.floor(server.moneyAvailable * percentHacked);
}, },
hackAnalyze: function (hostname: any): any { hackAnalyze: function (_hostname: unknown): number {
const hostname = helper.string("hackAnalyze", "hostname", _hostname);
updateDynamicRam("hackAnalyze", getRamCost(Player, "hackAnalyze")); updateDynamicRam("hackAnalyze", getRamCost(Player, "hackAnalyze"));
const server = safeGetServer(hostname, "hackAnalyze"); const server = safeGetServer(hostname, "hackAnalyze");
if (!(server instanceof Server)) { if (!(server instanceof Server)) {
workerScript.log("hackAnalyze", () => "Cannot be executed on this server."); workerScript.log("hackAnalyze", () => "Cannot be executed on this server.");
return false; return 0;
} }
return calculatePercentMoneyHacked(server, Player); return calculatePercentMoneyHacked(server, Player);
}, },
hackAnalyzeSecurity: function (threads: any): number { hackAnalyzeSecurity: function (_threads: unknown): number {
const threads = helper.number("hackAnalyzeSecurity", "threads", _threads);
updateDynamicRam("hackAnalyzeSecurity", getRamCost(Player, "hackAnalyzeSecurity")); updateDynamicRam("hackAnalyzeSecurity", getRamCost(Player, "hackAnalyzeSecurity"));
return CONSTANTS.ServerFortifyAmount * threads; return CONSTANTS.ServerFortifyAmount * threads;
}, },
hackAnalyzeChance: function (hostname: any): any { hackAnalyzeChance: function (_hostname: unknown): number {
const hostname = helper.string("hackAnalyzeChance", "hostname", _hostname);
updateDynamicRam("hackAnalyzeChance", getRamCost(Player, "hackAnalyzeChance")); updateDynamicRam("hackAnalyzeChance", getRamCost(Player, "hackAnalyzeChance"));
const server = safeGetServer(hostname, "hackAnalyzeChance"); const server = safeGetServer(hostname, "hackAnalyzeChance");
if (!(server instanceof Server)) { if (!(server instanceof Server)) {
workerScript.log("hackAnalyzeChance", () => "Cannot be executed on this server."); workerScript.log("hackAnalyzeChance", () => "Cannot be executed on this server.");
return false; return 0;
} }
return calculateHackingChance(server, Player); return calculateHackingChance(server, Player);
}, },
sleep: function (time: any): any { sleep: async function (_time: unknown = 0): Promise<void> {
const time = helper.number("sleep", "time", _time);
updateDynamicRam("sleep", getRamCost(Player, "sleep")); updateDynamicRam("sleep", getRamCost(Player, "sleep"));
if (time === undefined) { if (time === undefined) {
throw makeRuntimeErrorMsg("sleep", "Takes 1 argument."); throw makeRuntimeErrorMsg("sleep", "Takes 1 argument.");
} }
workerScript.log("sleep", () => `Sleeping for ${time} milliseconds`); workerScript.log("sleep", () => `Sleeping for ${time} milliseconds`);
return netscriptDelay(time, workerScript).then(function () { return netscriptDelay(time, workerScript).then(function () {
return Promise.resolve(true); return Promise.resolve();
}); });
}, },
asleep: function (time: any): any { asleep: function (_time: unknown = 0): Promise<void> {
const time = helper.number("asleep", "time", _time);
updateDynamicRam("asleep", getRamCost(Player, "asleep")); updateDynamicRam("asleep", getRamCost(Player, "asleep"));
if (time === undefined) { if (time === undefined) {
throw makeRuntimeErrorMsg("asleep", "Takes 1 argument."); throw makeRuntimeErrorMsg("asleep", "Takes 1 argument.");
@ -598,16 +618,24 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
workerScript.log("asleep", () => `Sleeping for ${time} milliseconds`); workerScript.log("asleep", () => `Sleeping for ${time} milliseconds`);
return new Promise((resolve) => setTimeout(resolve, time)); return new Promise((resolve) => setTimeout(resolve, time));
}, },
grow: function (hostname: any, { threads: requestedThreads, stock }: any = {}): any { grow: async function (
_hostname: unknown,
{ threads: requestedThreads, stock }: BasicHGWOptions = {},
): Promise<number> {
const hostname = helper.string("grow", "hostname", _hostname);
updateDynamicRam("grow", getRamCost(Player, "grow")); updateDynamicRam("grow", getRamCost(Player, "grow"));
const threads = resolveNetscriptRequestedThreads(workerScript, "grow", requestedThreads); const threads = resolveNetscriptRequestedThreads(
workerScript,
"grow",
requestedThreads ?? workerScript.scriptRef.threads,
);
if (hostname === undefined) { if (hostname === undefined) {
throw makeRuntimeErrorMsg("grow", "Takes 1 argument."); throw makeRuntimeErrorMsg("grow", "Takes 1 argument.");
} }
const server = safeGetServer(hostname, "grow"); const server = safeGetServer(hostname, "grow");
if (!(server instanceof Server)) { if (!(server instanceof Server)) {
workerScript.log("grow", () => "Cannot be executed on this server."); workerScript.log("grow", () => "Cannot be executed on this server.");
return false; return Promise.resolve(0);
} }
const host = GetServer(workerScript.hostname); const host = GetServer(workerScript.hostname);
@ -653,14 +681,17 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return Promise.resolve(moneyAfter / moneyBefore); return Promise.resolve(moneyAfter / moneyBefore);
}); });
}, },
growthAnalyze: function (hostname: any, growth: any, cores: any = 1): any { growthAnalyze: function (_hostname: unknown, _growth: unknown, _cores: unknown = 1): number {
const hostname = helper.string("growthAnalyze", "hostname", _hostname);
const growth = helper.number("growthAnalyze", "growth", _growth);
const cores = helper.number("growthAnalyze", "cores", _cores);
updateDynamicRam("growthAnalyze", getRamCost(Player, "growthAnalyze")); updateDynamicRam("growthAnalyze", getRamCost(Player, "growthAnalyze"));
// Check argument validity // Check argument validity
const server = safeGetServer(hostname, "growthAnalyze"); const server = safeGetServer(hostname, "growthAnalyze");
if (!(server instanceof Server)) { if (!(server instanceof Server)) {
workerScript.log("growthAnalyze", () => "Cannot be executed on this server."); workerScript.log("growthAnalyze", () => "Cannot be executed on this server.");
return false; return 0;
} }
if (typeof growth !== "number" || isNaN(growth) || growth < 1 || !isFinite(growth)) { if (typeof growth !== "number" || isNaN(growth) || growth < 1 || !isFinite(growth)) {
throw makeRuntimeErrorMsg("growthAnalyze", `Invalid argument: growth must be numeric and >= 1, is ${growth}.`); throw makeRuntimeErrorMsg("growthAnalyze", `Invalid argument: growth must be numeric and >= 1, is ${growth}.`);
@ -668,20 +699,26 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return numCycleForGrowth(server, Number(growth), Player, cores); return numCycleForGrowth(server, Number(growth), Player, cores);
}, },
growthAnalyzeSecurity: function (threads: any): number { growthAnalyzeSecurity: function (_threads: unknown): number {
const threads = helper.number("growthAnalyzeSecurity", "threads", _threads);
updateDynamicRam("growthAnalyzeSecurity", getRamCost(Player, "growthAnalyzeSecurity")); updateDynamicRam("growthAnalyzeSecurity", getRamCost(Player, "growthAnalyzeSecurity"));
return 2 * CONSTANTS.ServerFortifyAmount * threads; return 2 * CONSTANTS.ServerFortifyAmount * threads;
}, },
weaken: function (hostname: any, { threads: requestedThreads }: any = {}): any { weaken: async function (_hostname: unknown, { threads: requestedThreads }: BasicHGWOptions = {}): Promise<number> {
const hostname = helper.string("weaken", "hostname", _hostname);
updateDynamicRam("weaken", getRamCost(Player, "weaken")); updateDynamicRam("weaken", getRamCost(Player, "weaken"));
const threads = resolveNetscriptRequestedThreads(workerScript, "weaken", requestedThreads); const threads = resolveNetscriptRequestedThreads(
workerScript,
"weaken",
requestedThreads ?? workerScript.scriptRef.threads,
);
if (hostname === undefined) { if (hostname === undefined) {
throw makeRuntimeErrorMsg("weaken", "Takes 1 argument."); throw makeRuntimeErrorMsg("weaken", "Takes 1 argument.");
} }
const server = safeGetServer(hostname, "weaken"); const server = safeGetServer(hostname, "weaken");
if (!(server instanceof Server)) { if (!(server instanceof Server)) {
workerScript.log("weaken", () => "Cannot be executed on this server."); workerScript.log("weaken", () => "Cannot be executed on this server.");
return false; return Promise.resolve(0);
} }
// No root access or skill level too low // No root access or skill level too low
@ -721,12 +758,14 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return Promise.resolve(CONSTANTS.ServerWeakenAmount * threads * coreBonus); return Promise.resolve(CONSTANTS.ServerWeakenAmount * threads * coreBonus);
}); });
}, },
weakenAnalyze: function (threads: any, cores: any = 1): number { weakenAnalyze: function (_threads: unknown, _cores: unknown = 1): number {
const threads = helper.number("weakenAnalyze", "threads", _threads);
const cores = helper.number("weakenAnalyze", "cores", _cores);
updateDynamicRam("weakenAnalyze", getRamCost(Player, "weakenAnalyze")); updateDynamicRam("weakenAnalyze", getRamCost(Player, "weakenAnalyze"));
const coreBonus = 1 + (cores - 1) / 16; const coreBonus = 1 + (cores - 1) / 16;
return CONSTANTS.ServerWeakenAmount * threads * coreBonus * BitNodeMultipliers.ServerWeakenRate; return CONSTANTS.ServerWeakenAmount * threads * coreBonus * BitNodeMultipliers.ServerWeakenRate;
}, },
share: function (): Promise<void> { share: async function (): Promise<void> {
updateDynamicRam("share", getRamCost(Player, "share")); updateDynamicRam("share", getRamCost(Player, "share"));
workerScript.log("share", () => "Sharing this computer."); workerScript.log("share", () => "Sharing this computer.");
const end = StartSharing(workerScript.scriptRef.threads * calculateIntelligenceBonus(Player.intelligence, 2)); const end = StartSharing(workerScript.scriptRef.threads * calculateIntelligenceBonus(Player.intelligence, 2));
@ -746,7 +785,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
} }
workerScript.print(argsToString(args)); workerScript.print(argsToString(args));
}, },
printf: function (format: string, ...args: any[]): void { printf: function (_format: unknown, ...args: any[]): void {
const format = helper.string("printf", "format", _format);
updateDynamicRam("printf", getRamCost(Player, "printf")); updateDynamicRam("printf", getRamCost(Player, "printf"));
if (typeof format !== "string") { if (typeof format !== "string") {
throw makeRuntimeErrorMsg("printf", "First argument must be string for the format."); throw makeRuntimeErrorMsg("printf", "First argument must be string for the format.");
@ -777,7 +817,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
} }
Terminal.print(`${workerScript.scriptRef.filename}: ${str}`); Terminal.print(`${workerScript.scriptRef.filename}: ${str}`);
}, },
tprintf: function (format: any, ...args: any): any { tprintf: function (_format: unknown, ...args: any[]): void {
const format = helper.string("printf", "format", _format);
updateDynamicRam("tprintf", getRamCost(Player, "tprintf")); updateDynamicRam("tprintf", getRamCost(Player, "tprintf"));
if (typeof format !== "string") { if (typeof format !== "string") {
throw makeRuntimeErrorMsg("tprintf", "First argument must be string for the format."); throw makeRuntimeErrorMsg("tprintf", "First argument must be string for the format.");
@ -802,14 +843,15 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
} }
Terminal.print(`${str}`); Terminal.print(`${str}`);
}, },
clearLog: function (): any { clearLog: function (): void {
updateDynamicRam("clearLog", getRamCost(Player, "clearLog")); updateDynamicRam("clearLog", getRamCost(Player, "clearLog"));
workerScript.scriptRef.clearLog(); workerScript.scriptRef.clearLog();
}, },
disableLog: function (fn: any): any { disableLog: function (_fn: unknown): void {
const fn = helper.string("disableLog", "fn", _fn);
updateDynamicRam("disableLog", getRamCost(Player, "disableLog")); updateDynamicRam("disableLog", getRamCost(Player, "disableLog"));
if (fn === "ALL") { if (fn === "ALL") {
for (fn of Object.keys(possibleLogs)) { for (const fn of Object.keys(possibleLogs)) {
workerScript.disableLogs[fn] = true; workerScript.disableLogs[fn] = true;
} }
workerScript.log("disableLog", () => `Disabled logging for all functions`); workerScript.log("disableLog", () => `Disabled logging for all functions`);
@ -820,10 +862,11 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
workerScript.log("disableLog", () => `Disabled logging for ${fn}`); workerScript.log("disableLog", () => `Disabled logging for ${fn}`);
} }
}, },
enableLog: function (fn: any): any { enableLog: function (_fn: unknown): void {
const fn = helper.string("enableLog", "fn", _fn);
updateDynamicRam("enableLog", getRamCost(Player, "enableLog")); updateDynamicRam("enableLog", getRamCost(Player, "enableLog"));
if (fn === "ALL") { if (fn === "ALL") {
for (fn of Object.keys(possibleLogs)) { for (const fn of Object.keys(possibleLogs)) {
delete workerScript.disableLogs[fn]; delete workerScript.disableLogs[fn];
} }
workerScript.log("enableLog", () => `Enabled logging for all functions`); workerScript.log("enableLog", () => `Enabled logging for all functions`);
@ -833,24 +876,29 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
delete workerScript.disableLogs[fn]; delete workerScript.disableLogs[fn];
workerScript.log("enableLog", () => `Enabled logging for ${fn}`); workerScript.log("enableLog", () => `Enabled logging for ${fn}`);
}, },
isLogEnabled: function (fn: any): any { isLogEnabled: function (_fn: unknown): boolean {
const fn = helper.string("isLogEnabled", "fn", _fn);
updateDynamicRam("isLogEnabled", getRamCost(Player, "isLogEnabled")); updateDynamicRam("isLogEnabled", getRamCost(Player, "isLogEnabled"));
if (possibleLogs[fn] === undefined) { if (possibleLogs[fn] === undefined) {
throw makeRuntimeErrorMsg("isLogEnabled", `Invalid argument: ${fn}.`); throw makeRuntimeErrorMsg("isLogEnabled", `Invalid argument: ${fn}.`);
} }
return !workerScript.disableLogs[fn]; return !workerScript.disableLogs[fn];
}, },
getScriptLogs: function (fn: any, hostname: any, ...scriptArgs: any): any { getScriptLogs: function (_fn: unknown, _hostname: unknown, ...scriptArgs: any[]): string[] {
const fn = helper.string("getScriptLogs", "fn", _fn);
const hostname = helper.string("getScriptLogs", "hostname", _hostname);
updateDynamicRam("getScriptLogs", getRamCost(Player, "getScriptLogs")); updateDynamicRam("getScriptLogs", getRamCost(Player, "getScriptLogs"));
const runningScriptObj = getRunningScript(fn, hostname, "getScriptLogs", scriptArgs); const runningScriptObj = getRunningScript(fn, hostname, "getScriptLogs", scriptArgs);
if (runningScriptObj == null) { if (runningScriptObj == null) {
workerScript.log("getScriptLogs", () => getCannotFindRunningScriptErrorMessage(fn, hostname, scriptArgs)); workerScript.log("getScriptLogs", () => getCannotFindRunningScriptErrorMessage(fn, hostname, scriptArgs));
return ""; return [];
} }
return runningScriptObj.logs.slice(); return runningScriptObj.logs.slice();
}, },
tail: function (fn: any, hostname: any = workerScript.hostname, ...scriptArgs: any): any { tail: function (_fn: unknown, _hostname: unknown = workerScript.hostname, ...scriptArgs: any[]): void {
const fn = helper.string("tail", "fn", _fn);
const hostname = helper.string("tail", "hostname", _hostname);
updateDynamicRam("tail", getRamCost(Player, "tail")); updateDynamicRam("tail", getRamCost(Player, "tail"));
let runningScriptObj; let runningScriptObj;
if (arguments.length === 0) { if (arguments.length === 0) {
@ -867,7 +915,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
LogBoxEvents.emit(runningScriptObj); LogBoxEvents.emit(runningScriptObj);
}, },
nuke: function (hostname: any): boolean { nuke: function (_hostname: unknown): boolean {
const hostname = helper.string("tail", "hostname", _hostname);
updateDynamicRam("nuke", getRamCost(Player, "nuke")); updateDynamicRam("nuke", getRamCost(Player, "nuke"));
if (hostname === undefined) { if (hostname === undefined) {
throw makeRuntimeErrorMsg("nuke", "Takes 1 argument."); throw makeRuntimeErrorMsg("nuke", "Takes 1 argument.");
@ -891,7 +940,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
workerScript.log("nuke", () => `Executed NUKE.exe virus on '${server.hostname}' to gain root access.`); workerScript.log("nuke", () => `Executed NUKE.exe virus on '${server.hostname}' to gain root access.`);
return true; return true;
}, },
brutessh: function (hostname: any): boolean { brutessh: function (_hostname: unknown): boolean {
const hostname = helper.string("brutessh", "hostname", _hostname);
updateDynamicRam("brutessh", getRamCost(Player, "brutessh")); updateDynamicRam("brutessh", getRamCost(Player, "brutessh"));
if (hostname === undefined) { if (hostname === undefined) {
throw makeRuntimeErrorMsg("brutessh", "Takes 1 argument."); throw makeRuntimeErrorMsg("brutessh", "Takes 1 argument.");
@ -913,7 +963,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
} }
return true; return true;
}, },
ftpcrack: function (hostname: any): boolean { ftpcrack: function (_hostname: unknown): boolean {
const hostname = helper.string("ftpcrack", "hostname", _hostname);
updateDynamicRam("ftpcrack", getRamCost(Player, "ftpcrack")); updateDynamicRam("ftpcrack", getRamCost(Player, "ftpcrack"));
if (hostname === undefined) { if (hostname === undefined) {
throw makeRuntimeErrorMsg("ftpcrack", "Takes 1 argument."); throw makeRuntimeErrorMsg("ftpcrack", "Takes 1 argument.");
@ -935,7 +986,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
} }
return true; return true;
}, },
relaysmtp: function (hostname: any): boolean { relaysmtp: function (_hostname: unknown): boolean {
const hostname = helper.string("relaysmtp", "hostname", _hostname);
updateDynamicRam("relaysmtp", getRamCost(Player, "relaysmtp")); updateDynamicRam("relaysmtp", getRamCost(Player, "relaysmtp"));
if (hostname === undefined) { if (hostname === undefined) {
throw makeRuntimeErrorMsg("relaysmtp", "Takes 1 argument."); throw makeRuntimeErrorMsg("relaysmtp", "Takes 1 argument.");
@ -957,7 +1009,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
} }
return true; return true;
}, },
httpworm: function (hostname: any): boolean { httpworm: function (_hostname: unknown): boolean {
const hostname = helper.string("httpworm", "hostname", _hostname);
updateDynamicRam("httpworm", getRamCost(Player, "httpworm")); updateDynamicRam("httpworm", getRamCost(Player, "httpworm"));
if (hostname === undefined) { if (hostname === undefined) {
throw makeRuntimeErrorMsg("httpworm", "Takes 1 argument"); throw makeRuntimeErrorMsg("httpworm", "Takes 1 argument");
@ -979,7 +1032,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
} }
return true; return true;
}, },
sqlinject: function (hostname: any): boolean { sqlinject: function (_hostname: unknown): boolean {
const hostname = helper.string("sqlinject", "hostname", _hostname);
updateDynamicRam("sqlinject", getRamCost(Player, "sqlinject")); updateDynamicRam("sqlinject", getRamCost(Player, "sqlinject"));
if (hostname === undefined) { if (hostname === undefined) {
throw makeRuntimeErrorMsg("sqlinject", "Takes 1 argument."); throw makeRuntimeErrorMsg("sqlinject", "Takes 1 argument.");
@ -1001,7 +1055,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
} }
return true; return true;
}, },
run: function (scriptname: any, threads: any = 1, ...args: any[]): any { run: function (_scriptname: unknown, _threads: unknown = 1, ...args: any[]): number {
const scriptname = helper.string("run", "scriptname", _scriptname);
const threads = helper.number("run", "threads", _threads);
updateDynamicRam("run", getRamCost(Player, "run")); updateDynamicRam("run", getRamCost(Player, "run"));
if (scriptname === undefined) { if (scriptname === undefined) {
throw makeRuntimeErrorMsg("run", "Usage: run(scriptname, [numThreads], [arg1], [arg2]...)"); throw makeRuntimeErrorMsg("run", "Usage: run(scriptname, [numThreads], [arg1], [arg2]...)");
@ -1016,7 +1072,10 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return runScriptFromScript(Player, "run", scriptServer, scriptname, args, workerScript, threads); return runScriptFromScript(Player, "run", scriptServer, scriptname, args, workerScript, threads);
}, },
exec: function (scriptname: any, hostname: any, threads: any = 1, ...args: any[]): any { exec: function (_scriptname: unknown, _hostname: unknown, _threads: unknown = 1, ...args: any[]): number {
const scriptname = helper.string("exec", "scriptname", _scriptname);
const hostname = helper.string("exec", "hostname", _hostname);
const threads = helper.number("exec", "threads", _threads);
updateDynamicRam("exec", getRamCost(Player, "exec")); updateDynamicRam("exec", getRamCost(Player, "exec"));
if (scriptname === undefined || hostname === undefined) { if (scriptname === undefined || hostname === undefined) {
throw makeRuntimeErrorMsg("exec", "Usage: exec(scriptname, server, [numThreads], [arg1], [arg2]...)"); throw makeRuntimeErrorMsg("exec", "Usage: exec(scriptname, server, [numThreads], [arg1], [arg2]...)");
@ -1027,7 +1086,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
const server = safeGetServer(hostname, "exec"); const server = safeGetServer(hostname, "exec");
return runScriptFromScript(Player, "exec", server, scriptname, args, workerScript, threads); return runScriptFromScript(Player, "exec", server, scriptname, args, workerScript, threads);
}, },
spawn: function (scriptname: any, threads: any = 1, ...args: any[]): any { spawn: function (_scriptname: unknown, _threads: unknown = 1, ...args: any[]): void {
const scriptname = helper.string("spawn", "scriptname", _scriptname);
const threads = helper.number("spawn", "threads", _threads);
updateDynamicRam("spawn", getRamCost(Player, "spawn")); updateDynamicRam("spawn", getRamCost(Player, "spawn"));
if (!scriptname || !threads) { if (!scriptname || !threads) {
throw makeRuntimeErrorMsg("spawn", "Usage: spawn(scriptname, threads)"); throw makeRuntimeErrorMsg("spawn", "Usage: spawn(scriptname, threads)");
@ -1053,7 +1114,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
workerScript.log("spawn", () => "Exiting..."); workerScript.log("spawn", () => "Exiting...");
} }
}, },
kill: function (filename: any, hostname?: any, ...scriptArgs: any): any { kill: function (_filename: unknown, _hostname?: unknown, ...scriptArgs: any[]): boolean {
const filename = helper.string("kill", "filename", _filename);
const hostname = helper.string("kill", "hostname", _hostname);
updateDynamicRam("kill", getRamCost(Player, "kill")); updateDynamicRam("kill", getRamCost(Player, "kill"));
let res; let res;
@ -1099,7 +1162,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return false; return false;
} }
}, },
killall: function (hostname: any = workerScript.hostname): any { killall: function (_hostname: unknown = workerScript.hostname): boolean {
const hostname = helper.string("killall", "hostname", _hostname);
updateDynamicRam("killall", getRamCost(Player, "killall")); updateDynamicRam("killall", getRamCost(Player, "killall"));
if (hostname === undefined) { if (hostname === undefined) {
throw makeRuntimeErrorMsg("killall", "Takes 1 argument"); throw makeRuntimeErrorMsg("killall", "Takes 1 argument");
@ -1117,7 +1181,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return scriptsRunning; return scriptsRunning;
}, },
exit: function (): any { exit: function (): void {
updateDynamicRam("exit", getRamCost(Player, "exit")); updateDynamicRam("exit", getRamCost(Player, "exit"));
workerScript.running = false; // Prevent workerScript from "finishing execution naturally" workerScript.running = false; // Prevent workerScript from "finishing execution naturally"
if (killWorkerScript(workerScript)) { if (killWorkerScript(workerScript)) {
@ -1126,7 +1190,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
workerScript.log("exit", () => "Failed. This is a bug. Report to dev."); workerScript.log("exit", () => "Failed. This is a bug. Report to dev.");
} }
}, },
scp: async function (scriptname: any, hostname1: any, hostname2?: any): Promise<boolean> { scp: async function (scriptname: any, _hostname1: unknown, hostname2?: any): Promise<boolean> {
const hostname1 = helper.string("scp", "hostname1", _hostname1);
updateDynamicRam("scp", getRamCost(Player, "scp")); updateDynamicRam("scp", getRamCost(Player, "scp"));
if (arguments.length !== 2 && arguments.length !== 3) { if (arguments.length !== 2 && arguments.length !== 3) {
throw makeRuntimeErrorMsg("scp", "Takes 2 or 3 arguments"); throw makeRuntimeErrorMsg("scp", "Takes 2 or 3 arguments");
@ -1283,7 +1348,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
newScript.updateRamUsage(Player, destServer.scripts).then(() => resolve(true)); newScript.updateRamUsage(Player, destServer.scripts).then(() => resolve(true));
}); });
}, },
ls: function (hostname: any, grep: any): any { ls: function (_hostname: unknown, _grep: unknown = ""): string[] {
const hostname = helper.string("ls", "hostname", _hostname);
const grep = helper.string("ls", "grep", _grep);
updateDynamicRam("ls", getRamCost(Player, "ls")); updateDynamicRam("ls", getRamCost(Player, "ls"));
if (hostname === undefined) { if (hostname === undefined) {
throw makeRuntimeErrorMsg("ls", "Usage: ls(hostname/ip, [grep filter])"); throw makeRuntimeErrorMsg("ls", "Usage: ls(hostname/ip, [grep filter])");
@ -1350,7 +1417,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
allFiles.sort(); allFiles.sort();
return allFiles; return allFiles;
}, },
ps: function (hostname: any = workerScript.hostname): any { ps: function (_hostname: unknown = workerScript.hostname): ProcessInfo[] {
const hostname = helper.string("ps", "hostname", _hostname);
updateDynamicRam("ps", getRamCost(Player, "ps")); updateDynamicRam("ps", getRamCost(Player, "ps"));
const server = safeGetServer(hostname, "ps"); const server = safeGetServer(hostname, "ps");
const processes = []; const processes = [];
@ -1364,7 +1432,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
} }
return processes; return processes;
}, },
hasRootAccess: function (hostname: any): any { hasRootAccess: function (_hostname: unknown): boolean {
const hostname = helper.string("hasRootAccess", "hostname", _hostname);
updateDynamicRam("hasRootAccess", getRamCost(Player, "hasRootAccess")); updateDynamicRam("hasRootAccess", getRamCost(Player, "hasRootAccess"));
if (hostname === undefined) { if (hostname === undefined) {
throw makeRuntimeErrorMsg("hasRootAccess", "Takes 1 argument"); throw makeRuntimeErrorMsg("hasRootAccess", "Takes 1 argument");
@ -1372,7 +1441,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
const server = safeGetServer(hostname, "hasRootAccess"); const server = safeGetServer(hostname, "hasRootAccess");
return server.hasAdminRights; return server.hasAdminRights;
}, },
getHostname: function (): any { getHostname: function (): string {
updateDynamicRam("getHostname", getRamCost(Player, "getHostname")); updateDynamicRam("getHostname", getRamCost(Player, "getHostname"));
const scriptServer = GetServer(workerScript.hostname); const scriptServer = GetServer(workerScript.hostname);
if (scriptServer == null) { if (scriptServer == null) {
@ -1380,13 +1449,13 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
} }
return scriptServer.hostname; return scriptServer.hostname;
}, },
getHackingLevel: function (): any { getHackingLevel: function (): number {
updateDynamicRam("getHackingLevel", getRamCost(Player, "getHackingLevel")); updateDynamicRam("getHackingLevel", getRamCost(Player, "getHackingLevel"));
Player.updateSkillLevels(); Player.updateSkillLevels();
workerScript.log("getHackingLevel", () => `returned ${Player.hacking}`); workerScript.log("getHackingLevel", () => `returned ${Player.hacking}`);
return Player.hacking; return Player.hacking;
}, },
getHackingMultipliers: function (): any { getHackingMultipliers: function (): HackingMultipliers {
updateDynamicRam("getHackingMultipliers", getRamCost(Player, "getHackingMultipliers")); updateDynamicRam("getHackingMultipliers", getRamCost(Player, "getHackingMultipliers"));
return { return {
chance: Player.hacking_chance_mult, chance: Player.hacking_chance_mult,
@ -1395,7 +1464,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
growth: Player.hacking_grow_mult, growth: Player.hacking_grow_mult,
}; };
}, },
getHacknetMultipliers: function (): any { getHacknetMultipliers: function (): HacknetMultipliers {
updateDynamicRam("getHacknetMultipliers", getRamCost(Player, "getHacknetMultipliers")); updateDynamicRam("getHacknetMultipliers", getRamCost(Player, "getHacknetMultipliers"));
return { return {
production: Player.hacknet_node_money_mult, production: Player.hacknet_node_money_mult,
@ -1405,7 +1474,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
levelCost: Player.hacknet_node_level_cost_mult, levelCost: Player.hacknet_node_level_cost_mult,
}; };
}, },
getBitNodeMultipliers: function (): any { getBitNodeMultipliers: function (): IBNMults {
updateDynamicRam("getBitNodeMultipliers", getRamCost(Player, "getBitNodeMultipliers")); updateDynamicRam("getBitNodeMultipliers", getRamCost(Player, "getBitNodeMultipliers"));
if (SourceFileFlags[5] <= 0 && Player.bitNodeN !== 5) { if (SourceFileFlags[5] <= 0 && Player.bitNodeN !== 5) {
throw makeRuntimeErrorMsg("getBitNodeMultipliers", "Requires Source-File 5 to run."); throw makeRuntimeErrorMsg("getBitNodeMultipliers", "Requires Source-File 5 to run.");
@ -1413,7 +1482,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
const copy = Object.assign({}, BitNodeMultipliers); const copy = Object.assign({}, BitNodeMultipliers);
return copy; return copy;
}, },
getServer: function (hostname: any = workerScript.hostname): any { getServer: function (_hostname: unknown = workerScript.hostname): IServerDef {
const hostname = helper.string("getServer", "hostname", _hostname);
updateDynamicRam("getServer", getRamCost(Player, "getServer")); updateDynamicRam("getServer", getRamCost(Player, "getServer"));
const server = safeGetServer(hostname, "getServer"); const server = safeGetServer(hostname, "getServer");
const copy = Object.assign({}, server) as any; const copy = Object.assign({}, server) as any;
@ -1436,7 +1506,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
if (!copy.serverGrowth) copy.serverGrowth = 0; if (!copy.serverGrowth) copy.serverGrowth = 0;
return copy; return copy;
}, },
getServerMoneyAvailable: function (hostname: any): any { getServerMoneyAvailable: function (_hostname: unknown): number {
const hostname = helper.string("getServerMoneyAvailable", "hostname", _hostname);
updateDynamicRam("getServerMoneyAvailable", getRamCost(Player, "getServerMoneyAvailable")); updateDynamicRam("getServerMoneyAvailable", getRamCost(Player, "getServerMoneyAvailable"));
const server = safeGetServer(hostname, "getServerMoneyAvailable"); const server = safeGetServer(hostname, "getServerMoneyAvailable");
if (!(server instanceof Server)) { if (!(server instanceof Server)) {
@ -1460,7 +1531,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
); );
return server.moneyAvailable; return server.moneyAvailable;
}, },
getServerSecurityLevel: function (hostname: any): any { getServerSecurityLevel: function (_hostname: unknown): number {
const hostname = helper.string("getServerSecurityLevel", "hostname", _hostname);
updateDynamicRam("getServerSecurityLevel", getRamCost(Player, "getServerSecurityLevel")); updateDynamicRam("getServerSecurityLevel", getRamCost(Player, "getServerSecurityLevel"));
const server = safeGetServer(hostname, "getServerSecurityLevel"); const server = safeGetServer(hostname, "getServerSecurityLevel");
if (!(server instanceof Server)) { if (!(server instanceof Server)) {
@ -1476,7 +1548,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
); );
return server.hackDifficulty; return server.hackDifficulty;
}, },
getServerBaseSecurityLevel: function (hostname: any): any { getServerBaseSecurityLevel: function (_hostname: unknown): number {
const hostname = helper.string("getServerBaseSecurityLevel", "hostname", _hostname);
updateDynamicRam("getServerBaseSecurityLevel", getRamCost(Player, "getServerBaseSecurityLevel")); updateDynamicRam("getServerBaseSecurityLevel", getRamCost(Player, "getServerBaseSecurityLevel"));
workerScript.log( workerScript.log(
"getServerBaseSecurityLevel", "getServerBaseSecurityLevel",
@ -1496,7 +1569,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
); );
return server.baseDifficulty; return server.baseDifficulty;
}, },
getServerMinSecurityLevel: function (hostname: any): any { getServerMinSecurityLevel: function (_hostname: unknown): number {
const hostname = helper.string("getServerMinSecurityLevel", "hostname", _hostname);
updateDynamicRam("getServerMinSecurityLevel", getRamCost(Player, "getServerMinSecurityLevel")); updateDynamicRam("getServerMinSecurityLevel", getRamCost(Player, "getServerMinSecurityLevel"));
const server = safeGetServer(hostname, "getServerMinSecurityLevel"); const server = safeGetServer(hostname, "getServerMinSecurityLevel");
if (!(server instanceof Server)) { if (!(server instanceof Server)) {
@ -1512,7 +1586,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
); );
return server.minDifficulty; return server.minDifficulty;
}, },
getServerRequiredHackingLevel: function (hostname: any): any { getServerRequiredHackingLevel: function (_hostname: unknown): number {
const hostname = helper.string("getServerRequiredHackingLevel", "hostname", _hostname);
updateDynamicRam("getServerRequiredHackingLevel", getRamCost(Player, "getServerRequiredHackingLevel")); updateDynamicRam("getServerRequiredHackingLevel", getRamCost(Player, "getServerRequiredHackingLevel"));
const server = safeGetServer(hostname, "getServerRequiredHackingLevel"); const server = safeGetServer(hostname, "getServerRequiredHackingLevel");
if (!(server instanceof Server)) { if (!(server instanceof Server)) {
@ -1528,7 +1603,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
); );
return server.requiredHackingSkill; return server.requiredHackingSkill;
}, },
getServerMaxMoney: function (hostname: any): any { getServerMaxMoney: function (_hostname: unknown): number {
const hostname = helper.string("getServerMaxMoney", "hostname", _hostname);
updateDynamicRam("getServerMaxMoney", getRamCost(Player, "getServerMaxMoney")); updateDynamicRam("getServerMaxMoney", getRamCost(Player, "getServerMaxMoney"));
const server = safeGetServer(hostname, "getServerMaxMoney"); const server = safeGetServer(hostname, "getServerMaxMoney");
if (!(server instanceof Server)) { if (!(server instanceof Server)) {
@ -1544,7 +1620,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
); );
return server.moneyMax; return server.moneyMax;
}, },
getServerGrowth: function (hostname: any): any { getServerGrowth: function (_hostname: unknown): number {
const hostname = helper.string("getServerGrowth", "hostname", _hostname);
updateDynamicRam("getServerGrowth", getRamCost(Player, "getServerGrowth")); updateDynamicRam("getServerGrowth", getRamCost(Player, "getServerGrowth"));
const server = safeGetServer(hostname, "getServerGrowth"); const server = safeGetServer(hostname, "getServerGrowth");
if (!(server instanceof Server)) { if (!(server instanceof Server)) {
@ -1557,7 +1634,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
workerScript.log("getServerGrowth", () => `returned ${server.serverGrowth} for '${server.hostname}'`); workerScript.log("getServerGrowth", () => `returned ${server.serverGrowth} for '${server.hostname}'`);
return server.serverGrowth; return server.serverGrowth;
}, },
getServerNumPortsRequired: function (hostname: any): any { getServerNumPortsRequired: function (_hostname: unknown): number {
const hostname = helper.string("getServerNumPortsRequired", "hostname", _hostname);
updateDynamicRam("getServerNumPortsRequired", getRamCost(Player, "getServerNumPortsRequired")); updateDynamicRam("getServerNumPortsRequired", getRamCost(Player, "getServerNumPortsRequired"));
const server = safeGetServer(hostname, "getServerNumPortsRequired"); const server = safeGetServer(hostname, "getServerNumPortsRequired");
if (!(server instanceof Server)) { if (!(server instanceof Server)) {
@ -1573,7 +1651,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
); );
return server.numOpenPortsRequired; return server.numOpenPortsRequired;
}, },
getServerRam: function (hostname: any): any { getServerRam: function (_hostname: unknown): [number, number] {
const hostname = helper.string("getServerRam", "hostname", _hostname);
updateDynamicRam("getServerRam", getRamCost(Player, "getServerRam")); updateDynamicRam("getServerRam", getRamCost(Player, "getServerRam"));
workerScript.log( workerScript.log(
"getServerRam", "getServerRam",
@ -1586,23 +1665,28 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
); );
return [server.maxRam, server.ramUsed]; return [server.maxRam, server.ramUsed];
}, },
getServerMaxRam: function (hostname: any): any { getServerMaxRam: function (_hostname: unknown): number {
const hostname = helper.string("getServerMaxRam", "hostname", _hostname);
updateDynamicRam("getServerMaxRam", getRamCost(Player, "getServerMaxRam")); updateDynamicRam("getServerMaxRam", getRamCost(Player, "getServerMaxRam"));
const server = safeGetServer(hostname, "getServerMaxRam"); const server = safeGetServer(hostname, "getServerMaxRam");
workerScript.log("getServerMaxRam", () => `returned ${numeralWrapper.formatRAM(server.maxRam)}`); workerScript.log("getServerMaxRam", () => `returned ${numeralWrapper.formatRAM(server.maxRam)}`);
return server.maxRam; return server.maxRam;
}, },
getServerUsedRam: function (hostname: any): any { getServerUsedRam: function (_hostname: unknown): number {
const hostname = helper.string("getServerUsedRam", "hostname", _hostname);
updateDynamicRam("getServerUsedRam", getRamCost(Player, "getServerUsedRam")); updateDynamicRam("getServerUsedRam", getRamCost(Player, "getServerUsedRam"));
const server = safeGetServer(hostname, "getServerUsedRam"); const server = safeGetServer(hostname, "getServerUsedRam");
workerScript.log("getServerUsedRam", () => `returned ${numeralWrapper.formatRAM(server.ramUsed)}`); workerScript.log("getServerUsedRam", () => `returned ${numeralWrapper.formatRAM(server.ramUsed)}`);
return server.ramUsed; return server.ramUsed;
}, },
serverExists: function (hostname: any): any { serverExists: function (_hostname: unknown): boolean {
const hostname = helper.string("serverExists", "hostname", _hostname);
updateDynamicRam("serverExists", getRamCost(Player, "serverExists")); updateDynamicRam("serverExists", getRamCost(Player, "serverExists"));
return GetServer(hostname) !== null; return GetServer(hostname) !== null;
}, },
fileExists: function (filename: any, hostname: any = workerScript.hostname): any { fileExists: function (_filename: unknown, _hostname: unknown = workerScript.hostname): boolean {
const filename = helper.string("fileExists", "filename", _filename);
const hostname = helper.string("fileExists", "hostname", _hostname);
updateDynamicRam("fileExists", getRamCost(Player, "fileExists")); updateDynamicRam("fileExists", getRamCost(Player, "fileExists"));
if (filename === undefined) { if (filename === undefined) {
throw makeRuntimeErrorMsg("fileExists", "Usage: fileExists(scriptname, [server])"); throw makeRuntimeErrorMsg("fileExists", "Usage: fileExists(scriptname, [server])");
@ -1626,7 +1710,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
const txtFile = getTextFile(filename, server); const txtFile = getTextFile(filename, server);
return txtFile != null; return txtFile != null;
}, },
isRunning: function (fn: any, hostname: any = workerScript.hostname, ...scriptArgs: any): any { isRunning: function (_fn: unknown, _hostname: unknown = workerScript.hostname, ...scriptArgs: any[]): boolean {
const fn = helper.string("isRunning", "fn", _fn);
const hostname = helper.string("isRunning", "hostname", _hostname);
updateDynamicRam("isRunning", getRamCost(Player, "isRunning")); updateDynamicRam("isRunning", getRamCost(Player, "isRunning"));
if (fn === undefined || hostname === undefined) { if (fn === undefined || hostname === undefined) {
throw makeRuntimeErrorMsg("isRunning", "Usage: isRunning(scriptname, server, [arg1], [arg2]...)"); throw makeRuntimeErrorMsg("isRunning", "Usage: isRunning(scriptname, server, [arg1], [arg2]...)");
@ -1637,17 +1723,18 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return getRunningScript(fn, hostname, "isRunning", scriptArgs) != null; return getRunningScript(fn, hostname, "isRunning", scriptArgs) != null;
} }
}, },
getPurchasedServerLimit: function (): any { getPurchasedServerLimit: function (): number {
updateDynamicRam("getPurchasedServerLimit", getRamCost(Player, "getPurchasedServerLimit")); updateDynamicRam("getPurchasedServerLimit", getRamCost(Player, "getPurchasedServerLimit"));
return getPurchaseServerLimit(); return getPurchaseServerLimit();
}, },
getPurchasedServerMaxRam: function (): any { getPurchasedServerMaxRam: function (): number {
updateDynamicRam("getPurchasedServerMaxRam", getRamCost(Player, "getPurchasedServerMaxRam")); updateDynamicRam("getPurchasedServerMaxRam", getRamCost(Player, "getPurchasedServerMaxRam"));
return getPurchaseServerMaxRam(); return getPurchaseServerMaxRam();
}, },
getPurchasedServerCost: function (ram: any): any { getPurchasedServerCost: function (_ram: unknown): number {
const ram = helper.number("getPurchasedServerCost", "ram", _ram);
updateDynamicRam("getPurchasedServerCost", getRamCost(Player, "getPurchasedServerCost")); updateDynamicRam("getPurchasedServerCost", getRamCost(Player, "getPurchasedServerCost"));
const cost = getPurchaseServerCost(ram); const cost = getPurchaseServerCost(ram);
@ -1658,10 +1745,10 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return cost; return cost;
}, },
purchaseServer: function (aname: any, aram: any): any { purchaseServer: function (_name: unknown, _ram: unknown): string {
const name = helper.string("purchaseServer", "name", _name);
const ram = helper.number("purchaseServer", "ram", _ram);
if (arguments.length !== 2) throw makeRuntimeErrorMsg("purchaseServer", "Takes 2 arguments"); if (arguments.length !== 2) throw makeRuntimeErrorMsg("purchaseServer", "Takes 2 arguments");
const name = helper.string("purchaseServer", "name", aname);
const ram = helper.number("purchaseServer", "ram", aram);
updateDynamicRam("purchaseServer", getRamCost(Player, "purchaseServer")); updateDynamicRam("purchaseServer", getRamCost(Player, "purchaseServer"));
let hostnameStr = String(name); let hostnameStr = String(name);
hostnameStr = hostnameStr.replace(/\s+/g, ""); hostnameStr = hostnameStr.replace(/\s+/g, "");
@ -1722,7 +1809,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
); );
return newServ.hostname; return newServ.hostname;
}, },
deleteServer: function (name: any): any { deleteServer: function (_name: unknown): boolean {
const name = helper.string("purchaseServer", "name", _name);
updateDynamicRam("deleteServer", getRamCost(Player, "deleteServer")); updateDynamicRam("deleteServer", getRamCost(Player, "deleteServer"));
let hostnameStr = String(name); let hostnameStr = String(name);
hostnameStr = hostnameStr.replace(/\s\s+/g, ""); hostnameStr = hostnameStr.replace(/\s\s+/g, "");
@ -1798,7 +1886,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
); );
return false; return false;
}, },
getPurchasedServers: function (): any { getPurchasedServers: function (): string[] {
updateDynamicRam("getPurchasedServers", getRamCost(Player, "getPurchasedServers")); updateDynamicRam("getPurchasedServers", getRamCost(Player, "getPurchasedServers"));
const res: string[] = []; const res: string[] = [];
Player.purchasedServers.forEach(function (hostname) { Player.purchasedServers.forEach(function (hostname) {
@ -1806,7 +1894,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
}); });
return res; return res;
}, },
writePort: function (port: any, data: any = ""): any { writePort: function (_port: unknown, data: any = ""): Promise<any> {
const port = helper.number("writePort", "port", _port);
updateDynamicRam("writePort", getRamCost(Player, "writePort")); updateDynamicRam("writePort", getRamCost(Player, "writePort"));
if (typeof data !== "string" && typeof data !== "number") { if (typeof data !== "string" && typeof data !== "number") {
throw makeRuntimeErrorMsg( throw makeRuntimeErrorMsg(
@ -1817,7 +1906,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
const iport = helper.getValidPort("writePort", port); const iport = helper.getValidPort("writePort", port);
return Promise.resolve(iport.write(data)); return Promise.resolve(iport.write(data));
}, },
write: function (port: any, data: any = "", mode: any = "a"): any { write: function (_port: unknown, data: any = "", _mode: unknown = "a"): Promise<void> {
const port = helper.string("write", "port", _port);
const mode = helper.string("write", "mode", _mode);
updateDynamicRam("write", getRamCost(Player, "write")); updateDynamicRam("write", getRamCost(Player, "write"));
if (isString(port)) { if (isString(port)) {
// Write to script or text file // Write to script or text file
@ -1870,7 +1961,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
throw makeRuntimeErrorMsg("write", `Invalid argument: ${port}`); throw makeRuntimeErrorMsg("write", `Invalid argument: ${port}`);
} }
}, },
tryWritePort: function (port: any, data: any = ""): any { tryWritePort: function (_port: unknown, data: any = ""): Promise<any> {
let port = helper.number("tryWritePort", "port", _port);
updateDynamicRam("tryWritePort", getRamCost(Player, "tryWritePort")); updateDynamicRam("tryWritePort", getRamCost(Player, "tryWritePort"));
if (typeof data !== "string" && typeof data !== "number") { if (typeof data !== "string" && typeof data !== "number") {
throw makeRuntimeErrorMsg( throw makeRuntimeErrorMsg(
@ -1895,14 +1987,16 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
throw makeRuntimeErrorMsg("tryWritePort", `Invalid argument: ${port}`); throw makeRuntimeErrorMsg("tryWritePort", `Invalid argument: ${port}`);
} }
}, },
readPort: function (port: any): any { readPort: function (_port: unknown): any {
const port = helper.number("readPort", "port", _port);
updateDynamicRam("readPort", getRamCost(Player, "readPort")); updateDynamicRam("readPort", getRamCost(Player, "readPort"));
// Read from port // Read from port
const iport = helper.getValidPort("readPort", port); const iport = helper.getValidPort("readPort", port);
const x = iport.read(); const x = iport.read();
return x; return x;
}, },
read: function (port: any): any { read: function (_port: unknown): string {
const port = helper.string("read", "port", _port);
updateDynamicRam("read", getRamCost(Player, "read")); updateDynamicRam("read", getRamCost(Player, "read"));
if (isString(port)) { if (isString(port)) {
// Read from script or text file // Read from script or text file
@ -1931,13 +2025,15 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
throw makeRuntimeErrorMsg("read", `Invalid argument: ${port}`); throw makeRuntimeErrorMsg("read", `Invalid argument: ${port}`);
} }
}, },
peek: function (port: any): any { peek: function (_port: unknown): any {
const port = helper.number("peek", "port", _port);
updateDynamicRam("peek", getRamCost(Player, "peek")); updateDynamicRam("peek", getRamCost(Player, "peek"));
const iport = helper.getValidPort("peek", port); const iport = helper.getValidPort("peek", port);
const x = iport.peek(); const x = iport.peek();
return x; return x;
}, },
clear: function (file: any): any { clear: function (_file: unknown): void {
const file = helper.string("peek", "file", _file);
updateDynamicRam("clear", getRamCost(Player, "clear")); updateDynamicRam("clear", getRamCost(Player, "clear"));
if (isString(file)) { if (isString(file)) {
// Clear text file // Clear text file
@ -1953,20 +2049,23 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
} else { } else {
throw makeRuntimeErrorMsg("clear", `Invalid argument: ${file}`); throw makeRuntimeErrorMsg("clear", `Invalid argument: ${file}`);
} }
return 0;
}, },
clearPort: function (port: any): any { clearPort: function (_port: unknown): void {
const port = helper.number("clearPort", "port", _port);
updateDynamicRam("clearPort", getRamCost(Player, "clearPort")); updateDynamicRam("clearPort", getRamCost(Player, "clearPort"));
// Clear port // Clear port
const iport = helper.getValidPort("clearPort", port); const iport = helper.getValidPort("clearPort", port);
return iport.clear(); iport.clear();
}, },
getPortHandle: function (port: any): IPort { getPortHandle: function (_port: unknown): IPort {
const port = helper.number("getPortHandle", "port", _port);
updateDynamicRam("getPortHandle", getRamCost(Player, "getPortHandle")); updateDynamicRam("getPortHandle", getRamCost(Player, "getPortHandle"));
const iport = helper.getValidPort("getPortHandle", port); const iport = helper.getValidPort("getPortHandle", port);
return iport; return iport;
}, },
rm: function (fn: any, hostname: any): any { rm: function (_fn: unknown, _hostname: unknown): boolean {
const fn = helper.string("rm", "fn", _fn);
let hostname = helper.string("rm", "hostname", _hostname);
updateDynamicRam("rm", getRamCost(Player, "rm")); updateDynamicRam("rm", getRamCost(Player, "rm"));
if (hostname == null || hostname === "") { if (hostname == null || hostname === "") {
@ -1981,7 +2080,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return status.res; return status.res;
}, },
scriptRunning: function (scriptname: any, hostname: any): any { scriptRunning: function (_scriptname: unknown, _hostname: unknown): boolean {
const scriptname = helper.string("scriptRunning", "scriptname", _scriptname);
const hostname = helper.string("scriptRunning", "hostname", _hostname);
updateDynamicRam("scriptRunning", getRamCost(Player, "scriptRunning")); updateDynamicRam("scriptRunning", getRamCost(Player, "scriptRunning"));
const server = safeGetServer(hostname, "scriptRunning"); const server = safeGetServer(hostname, "scriptRunning");
for (let i = 0; i < server.runningScripts.length; ++i) { for (let i = 0; i < server.runningScripts.length; ++i) {
@ -1991,7 +2092,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
} }
return false; return false;
}, },
scriptKill: function (scriptname: any, hostname: any): any { scriptKill: function (_scriptname: unknown, _hostname: unknown): boolean {
const scriptname = helper.string("scriptKill", "scriptname", _scriptname);
const hostname = helper.string("scriptKill", "hostname", _hostname);
updateDynamicRam("scriptKill", getRamCost(Player, "scriptKill")); updateDynamicRam("scriptKill", getRamCost(Player, "scriptKill"));
const server = safeGetServer(hostname, "scriptKill"); const server = safeGetServer(hostname, "scriptKill");
let suc = false; let suc = false;
@ -2004,11 +2107,13 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
} }
return suc; return suc;
}, },
getScriptName: function (): any { getScriptName: function (): string {
updateDynamicRam("getScriptName", getRamCost(Player, "getScriptName")); updateDynamicRam("getScriptName", getRamCost(Player, "getScriptName"));
return workerScript.name; return workerScript.name;
}, },
getScriptRam: function (scriptname: any, hostname: any = workerScript.hostname): any { getScriptRam: function (_scriptname: unknown, _hostname: unknown = workerScript.hostname): number {
const scriptname = helper.string("getScriptRam", "scriptname", _scriptname);
const hostname = helper.string("getScriptRam", "hostname", _hostname);
updateDynamicRam("getScriptRam", getRamCost(Player, "getScriptRam")); updateDynamicRam("getScriptRam", getRamCost(Player, "getScriptRam"));
const server = safeGetServer(hostname, "getScriptRam"); const server = safeGetServer(hostname, "getScriptRam");
for (let i = 0; i < server.scripts.length; ++i) { for (let i = 0; i < server.scripts.length; ++i) {
@ -2018,7 +2123,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
} }
return 0; return 0;
}, },
getRunningScript: function (fn: any, hostname: any, ...args: any[]): any { getRunningScript: function (_fn: unknown, _hostname: unknown, ...args: any[]): IRunningScriptDef | null {
const fn = helper.string("getRunningScript", "fn", _fn);
const hostname = helper.string("getRunningScript", "hostname", _hostname);
updateDynamicRam("getRunningScript", getRamCost(Player, "getRunningScript")); updateDynamicRam("getRunningScript", getRamCost(Player, "getRunningScript"));
let runningScript; let runningScript;
@ -2046,7 +2153,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
threads: runningScript.threads, threads: runningScript.threads,
}; };
}, },
getHackTime: function (hostname: any): any { getHackTime: function (_hostname: unknown = workerScript.hostname): number {
const hostname = helper.string("getHackTime", "hostname", _hostname);
updateDynamicRam("getHackTime", getRamCost(Player, "getHackTime")); updateDynamicRam("getHackTime", getRamCost(Player, "getHackTime"));
const server = safeGetServer(hostname, "getHackTime"); const server = safeGetServer(hostname, "getHackTime");
if (!(server instanceof Server)) { if (!(server instanceof Server)) {
@ -2059,7 +2167,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return calculateHackingTime(server, Player) * 1000; return calculateHackingTime(server, Player) * 1000;
}, },
getGrowTime: function (hostname: any): any { getGrowTime: function (_hostname: unknown = workerScript.hostname): number {
const hostname = helper.string("getGrowTime", "hostname", _hostname);
updateDynamicRam("getGrowTime", getRamCost(Player, "getGrowTime")); updateDynamicRam("getGrowTime", getRamCost(Player, "getGrowTime"));
const server = safeGetServer(hostname, "getGrowTime"); const server = safeGetServer(hostname, "getGrowTime");
if (!(server instanceof Server)) { if (!(server instanceof Server)) {
@ -2072,7 +2181,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return calculateGrowTime(server, Player) * 1000; return calculateGrowTime(server, Player) * 1000;
}, },
getWeakenTime: function (hostname: any = workerScript.hostname): any { getWeakenTime: function (_hostname: unknown = workerScript.hostname): number {
const hostname = helper.string("getWeakenTime", "hostname", _hostname);
updateDynamicRam("getWeakenTime", getRamCost(Player, "getWeakenTime")); updateDynamicRam("getWeakenTime", getRamCost(Player, "getWeakenTime"));
const server = safeGetServer(hostname, "getWeakenTime"); const server = safeGetServer(hostname, "getWeakenTime");
if (!(server instanceof Server)) { if (!(server instanceof Server)) {
@ -2114,7 +2224,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return runningScriptObj.onlineMoneyMade / runningScriptObj.onlineRunningTime; return runningScriptObj.onlineMoneyMade / runningScriptObj.onlineRunningTime;
} }
}, },
getScriptExpGain: function (scriptname?: any, hostname?: any, ...args: any[]): any { getScriptExpGain: function (scriptname?: any, hostname?: any, ...args: any[]): number {
updateDynamicRam("getScriptExpGain", getRamCost(Player, "getScriptExpGain")); updateDynamicRam("getScriptExpGain", getRamCost(Player, "getScriptExpGain"));
if (arguments.length === 0) { if (arguments.length === 0) {
let total = 0; let total = 0;
@ -2136,40 +2246,43 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return runningScriptObj.onlineExpGained / runningScriptObj.onlineRunningTime; return runningScriptObj.onlineExpGained / runningScriptObj.onlineRunningTime;
} }
}, },
nFormat: function (n: any, format: any): any { nFormat: function (_n: unknown, _format: unknown): string {
const n = helper.number("nFormat", "n", _n);
const format = helper.string("nFormat", "format", _format);
updateDynamicRam("nFormat", getRamCost(Player, "nFormat")); updateDynamicRam("nFormat", getRamCost(Player, "nFormat"));
if (isNaN(n) || isNaN(parseFloat(n)) || typeof format !== "string") { if (isNaN(n)) {
return ""; return "";
} }
return numeralWrapper.format(parseFloat(n), format); return numeralWrapper.format(n, format);
}, },
tFormat: function (milliseconds: any, milliPrecision: any = false): any { tFormat: function (_milliseconds: unknown, _milliPrecision: unknown = false): string {
const milliseconds = helper.number("tFormat", "milliseconds", _milliseconds);
const milliPrecision = helper.boolean(_milliPrecision);
updateDynamicRam("tFormat", getRamCost(Player, "tFormat")); updateDynamicRam("tFormat", getRamCost(Player, "tFormat"));
return convertTimeMsToTimeElapsedString(milliseconds, milliPrecision); return convertTimeMsToTimeElapsedString(milliseconds, milliPrecision);
}, },
getTimeSinceLastAug: function (): any { getTimeSinceLastAug: function (): number {
updateDynamicRam("getTimeSinceLastAug", getRamCost(Player, "getTimeSinceLastAug")); updateDynamicRam("getTimeSinceLastAug", getRamCost(Player, "getTimeSinceLastAug"));
return Player.playtimeSinceLastAug; return Player.playtimeSinceLastAug;
}, },
alert: function (message: any): void { alert: function (_message: unknown): void {
const message = helper.string("alert", "message", _message);
updateDynamicRam("alert", getRamCost(Player, "alert")); updateDynamicRam("alert", getRamCost(Player, "alert"));
message = argsToString([message]);
dialogBoxCreate(message); dialogBoxCreate(message);
}, },
toast: function (message: any, variant: any = "success", duration: any = 2000): void { toast: function (_message: unknown, _variant: unknown = "success", _duration: unknown = 2000): void {
const message = helper.string("toast", "message", _message);
const variant = helper.string("toast", "variant", _variant);
const duration = helper.number("toast", "duration", _duration);
updateDynamicRam("toast", getRamCost(Player, "toast")); updateDynamicRam("toast", getRamCost(Player, "toast"));
if (!["success", "info", "warning", "error"].includes(variant)) if (!["success", "info", "warning", "error"].includes(variant))
throw new Error(`variant must be one of "success", "info", "warning", or "error"`); throw new Error(`variant must be one of "success", "info", "warning", or "error"`);
SnackbarEvents.emit(message, variant as any, duration);
message = argsToString([message]);
SnackbarEvents.emit(message, variant, duration);
}, },
prompt: function (txt: any, options?: { type?: string; options?: string[] }): any { prompt: function (_txt: unknown, options?: { type?: string; options?: string[] }): Promise<boolean | string> {
const txt = helper.string("toast", "txt", _txt);
updateDynamicRam("prompt", getRamCost(Player, "prompt")); updateDynamicRam("prompt", getRamCost(Player, "prompt"));
if (!isString(txt)) {
txt = JSON.stringify(txt);
}
return new Promise(function (resolve) { return new Promise(function (resolve) {
PromptEvent.emit({ PromptEvent.emit({
@ -2179,7 +2292,14 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
}); });
}); });
}, },
wget: async function (url: any, target: any, hostname: any = workerScript.hostname): Promise<boolean> { wget: async function (
_url: unknown,
_target: unknown,
_hostname: unknown = workerScript.hostname,
): Promise<boolean> {
const url = helper.string("wget", "url", _url);
const target = helper.string("wget", "target", _target);
const hostname = helper.string("wget", "hostname", _hostname);
updateDynamicRam("wget", getRamCost(Player, "wget")); updateDynamicRam("wget", getRamCost(Player, "wget"));
if (!isScriptFilename(target) && !target.endsWith(".txt")) { if (!isScriptFilename(target) && !target.endsWith(".txt")) {
workerScript.log("wget", () => `Invalid target file: '${target}'. Must be a script or text file.`); workerScript.log("wget", () => `Invalid target file: '${target}'. Must be a script or text file.`);
@ -2217,7 +2337,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
}); });
}); });
}, },
getFavorToDonate: function (): any { getFavorToDonate: function (): number {
updateDynamicRam("getFavorToDonate", getRamCost(Player, "getFavorToDonate")); updateDynamicRam("getFavorToDonate", getRamCost(Player, "getFavorToDonate"));
return Math.floor(CONSTANTS.BaseFavorToDonate * BitNodeMultipliers.RepToDonateToFaction); return Math.floor(CONSTANTS.BaseFavorToDonate * BitNodeMultipliers.RepToDonateToFaction);
}, },
@ -2344,11 +2464,12 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
f(); f();
}; // Wrap the user function to prevent WorkerScript leaking as 'this' }; // Wrap the user function to prevent WorkerScript leaking as 'this'
}, },
mv: function (host: string, source: string, destination: string): void { mv: function (_host: unknown, _source: unknown, _destination: unknown): void {
const host = helper.string("mv", "host", _host);
const source = helper.string("mv", "source", _source);
const destination = helper.string("mv", "destination", _destination);
updateDynamicRam("mv", getRamCost(Player, "mv")); updateDynamicRam("mv", getRamCost(Player, "mv"));
if (arguments.length != 3) throw makeRuntimeErrorMsg("mv", "Takes 3 argument.");
if (!isValidFilePath(source)) throw makeRuntimeErrorMsg("mv", `Invalid filename: '${source}'`); if (!isValidFilePath(source)) throw makeRuntimeErrorMsg("mv", `Invalid filename: '${source}'`);
if (!isValidFilePath(destination)) throw makeRuntimeErrorMsg("mv", `Invalid filename: '${destination}'`); if (!isValidFilePath(destination)) throw makeRuntimeErrorMsg("mv", `Invalid filename: '${destination}'`);

@ -5,13 +5,14 @@ import { Bladeburner } from "../Bladeburner/Bladeburner";
import { getRamCost } from "../Netscript/RamCostGenerator"; import { getRamCost } from "../Netscript/RamCostGenerator";
import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers"; import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers";
import { Bladeburner as INetscriptBladeburner, BladeburnerCurAction } from "../ScriptEditor/NetscriptDefinitions"; import { Bladeburner as INetscriptBladeburner, BladeburnerCurAction } from "../ScriptEditor/NetscriptDefinitions";
import { IAction } from "src/Bladeburner/IAction";
export function NetscriptBladeburner( export function NetscriptBladeburner(
player: IPlayer, player: IPlayer,
workerScript: WorkerScript, workerScript: WorkerScript,
helper: INetscriptHelper, helper: INetscriptHelper,
): INetscriptBladeburner { ): INetscriptBladeburner {
const checkBladeburnerAccess = function (func: any, skipjoined: any = false): void { const checkBladeburnerAccess = function (func: string, skipjoined = false): void {
const bladeburner = player.bladeburner; const bladeburner = player.bladeburner;
if (bladeburner === null) throw new Error("Must have joined bladeburner"); if (bladeburner === null) throw new Error("Must have joined bladeburner");
const apiAccess = const apiAccess =
@ -32,7 +33,7 @@ export function NetscriptBladeburner(
} }
}; };
const checkBladeburnerCity = function (func: any, city: any): void { const checkBladeburnerCity = function (func: string, city: string): void {
const bladeburner = player.bladeburner; const bladeburner = player.bladeburner;
if (bladeburner === null) throw new Error("Must have joined bladeburner"); if (bladeburner === null) throw new Error("Must have joined bladeburner");
if (!bladeburner.cities.hasOwnProperty(city)) { if (!bladeburner.cities.hasOwnProperty(city)) {
@ -40,7 +41,7 @@ export function NetscriptBladeburner(
} }
}; };
const getBladeburnerActionObject = function (func: any, type: any, name: any): any { const getBladeburnerActionObject = function (func: string, type: string, name: string): IAction {
const bladeburner = player.bladeburner; const bladeburner = player.bladeburner;
if (bladeburner === null) throw new Error("Must have joined bladeburner"); if (bladeburner === null) throw new Error("Must have joined bladeburner");
const actionId = bladeburner.getActionIdFromTypeAndName(type, name); const actionId = bladeburner.getActionIdFromTypeAndName(type, name);
@ -77,10 +78,11 @@ export function NetscriptBladeburner(
if (bladeburner === null) throw new Error("Should not be called without Bladeburner"); if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return bladeburner.getBlackOpNamesNetscriptFn(); return bladeburner.getBlackOpNamesNetscriptFn();
}, },
getBlackOpRank: function (name: any = ""): number { getBlackOpRank: function (_blackOpName: unknown): number {
const blackOpName = helper.string("getBlackOpRank", "blackOpName", _blackOpName);
helper.updateDynamicRam("getBlackOpRank", getRamCost(player, "bladeburner", "getBlackOpRank")); helper.updateDynamicRam("getBlackOpRank", getRamCost(player, "bladeburner", "getBlackOpRank"));
checkBladeburnerAccess("getBlackOpRank"); checkBladeburnerAccess("getBlackOpRank");
const action: any = getBladeburnerActionObject("getBlackOpRank", "blackops", name); const action: any = getBladeburnerActionObject("getBlackOpRank", "blackops", blackOpName);
return action.reqdRank; return action.reqdRank;
}, },
getGeneralActionNames: function (): string[] { getGeneralActionNames: function (): string[] {
@ -97,7 +99,9 @@ export function NetscriptBladeburner(
if (bladeburner === null) throw new Error("Should not be called without Bladeburner"); if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return bladeburner.getSkillNamesNetscriptFn(); return bladeburner.getSkillNamesNetscriptFn();
}, },
startAction: function (type: any = "", name: any = ""): boolean { startAction: function (_type: unknown, _name: unknown): boolean {
const type = helper.string("startAction", "type", _type);
const name = helper.string("startAction", "name", _name);
helper.updateDynamicRam("startAction", getRamCost(player, "bladeburner", "startAction")); helper.updateDynamicRam("startAction", getRamCost(player, "bladeburner", "startAction"));
checkBladeburnerAccess("startAction"); checkBladeburnerAccess("startAction");
const bladeburner = player.bladeburner; const bladeburner = player.bladeburner;
@ -122,7 +126,9 @@ export function NetscriptBladeburner(
if (bladeburner === null) throw new Error("Should not be called without Bladeburner"); if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return bladeburner.getTypeAndNameFromActionId(bladeburner.action); return bladeburner.getTypeAndNameFromActionId(bladeburner.action);
}, },
getActionTime: function (type: any = "", name: any = ""): number { getActionTime: function (_type: unknown, _name: unknown): number {
const type = helper.string("getActionTime", "type", _type);
const name = helper.string("getActionTime", "name", _name);
helper.updateDynamicRam("getActionTime", getRamCost(player, "bladeburner", "getActionTime")); helper.updateDynamicRam("getActionTime", getRamCost(player, "bladeburner", "getActionTime"));
checkBladeburnerAccess("getActionTime"); checkBladeburnerAccess("getActionTime");
const bladeburner = player.bladeburner; const bladeburner = player.bladeburner;
@ -133,7 +139,9 @@ export function NetscriptBladeburner(
throw helper.makeRuntimeErrorMsg("bladeburner.getActionTime", e); throw helper.makeRuntimeErrorMsg("bladeburner.getActionTime", e);
} }
}, },
getActionEstimatedSuccessChance: function (type: any = "", name: any = ""): [number, number] { getActionEstimatedSuccessChance: function (_type: unknown, _name: unknown): [number, number] {
const type = helper.string("getActionEstimatedSuccessChance", "type", _type);
const name = helper.string("getActionEstimatedSuccessChance", "name", _name);
helper.updateDynamicRam( helper.updateDynamicRam(
"getActionEstimatedSuccessChance", "getActionEstimatedSuccessChance",
getRamCost(player, "bladeburner", "getActionEstimatedSuccessChance"), getRamCost(player, "bladeburner", "getActionEstimatedSuccessChance"),
@ -147,7 +155,10 @@ export function NetscriptBladeburner(
throw helper.makeRuntimeErrorMsg("bladeburner.getActionEstimatedSuccessChance", e); throw helper.makeRuntimeErrorMsg("bladeburner.getActionEstimatedSuccessChance", e);
} }
}, },
getActionRepGain: function (type: any = "", name: any = "", level: any): number { getActionRepGain: function (_type: unknown, _name: unknown, _level: unknown): number {
const type = helper.string("getActionRepGain", "type", _type);
const name = helper.string("getActionRepGain", "name", _name);
const level = helper.number("getActionRepGain", "level", _level);
helper.updateDynamicRam("getActionRepGain", getRamCost(player, "bladeburner", "getActionRepGain")); helper.updateDynamicRam("getActionRepGain", getRamCost(player, "bladeburner", "getActionRepGain"));
checkBladeburnerAccess("getActionRepGain"); checkBladeburnerAccess("getActionRepGain");
const action = getBladeburnerActionObject("getActionRepGain", type, name); const action = getBladeburnerActionObject("getActionRepGain", type, name);
@ -160,7 +171,9 @@ export function NetscriptBladeburner(
return action.rankGain * rewardMultiplier * BitNodeMultipliers.BladeburnerRank; return action.rankGain * rewardMultiplier * BitNodeMultipliers.BladeburnerRank;
}, },
getActionCountRemaining: function (type: any = "", name: any = ""): number { getActionCountRemaining: function (_type: unknown, _name: unknown): number {
const type = helper.string("getActionCountRemaining", "type", _type);
const name = helper.string("getActionCountRemaining", "name", _name);
helper.updateDynamicRam("getActionCountRemaining", getRamCost(player, "bladeburner", "getActionCountRemaining")); helper.updateDynamicRam("getActionCountRemaining", getRamCost(player, "bladeburner", "getActionCountRemaining"));
checkBladeburnerAccess("getActionCountRemaining"); checkBladeburnerAccess("getActionCountRemaining");
const bladeburner = player.bladeburner; const bladeburner = player.bladeburner;
@ -171,31 +184,43 @@ export function NetscriptBladeburner(
throw helper.makeRuntimeErrorMsg("bladeburner.getActionCountRemaining", e); throw helper.makeRuntimeErrorMsg("bladeburner.getActionCountRemaining", e);
} }
}, },
getActionMaxLevel: function (type: any = "", name: any = ""): number { getActionMaxLevel: function (_type: unknown, _name: unknown): number {
const type = helper.string("getActionMaxLevel", "type", _type);
const name = helper.string("getActionMaxLevel", "name", _name);
helper.updateDynamicRam("getActionMaxLevel", getRamCost(player, "bladeburner", "getActionMaxLevel")); helper.updateDynamicRam("getActionMaxLevel", getRamCost(player, "bladeburner", "getActionMaxLevel"));
checkBladeburnerAccess("getActionMaxLevel"); checkBladeburnerAccess("getActionMaxLevel");
const action = getBladeburnerActionObject("getActionMaxLevel", type, name); const action = getBladeburnerActionObject("getActionMaxLevel", type, name);
return action.maxLevel; return action.maxLevel;
}, },
getActionCurrentLevel: function (type: any = "", name: any = ""): number { getActionCurrentLevel: function (_type: unknown, _name: unknown): number {
const type = helper.string("getActionCurrentLevel", "type", _type);
const name = helper.string("getActionCurrentLevel", "name", _name);
helper.updateDynamicRam("getActionCurrentLevel", getRamCost(player, "bladeburner", "getActionCurrentLevel")); helper.updateDynamicRam("getActionCurrentLevel", getRamCost(player, "bladeburner", "getActionCurrentLevel"));
checkBladeburnerAccess("getActionCurrentLevel"); checkBladeburnerAccess("getActionCurrentLevel");
const action = getBladeburnerActionObject("getActionCurrentLevel", type, name); const action = getBladeburnerActionObject("getActionCurrentLevel", type, name);
return action.level; return action.level;
}, },
getActionAutolevel: function (type: any = "", name: any = ""): boolean { getActionAutolevel: function (_type: unknown, _name: unknown): boolean {
const type = helper.string("getActionAutolevel", "type", _type);
const name = helper.string("getActionAutolevel", "name", _name);
helper.updateDynamicRam("getActionAutolevel", getRamCost(player, "bladeburner", "getActionAutolevel")); helper.updateDynamicRam("getActionAutolevel", getRamCost(player, "bladeburner", "getActionAutolevel"));
checkBladeburnerAccess("getActionAutolevel"); checkBladeburnerAccess("getActionAutolevel");
const action = getBladeburnerActionObject("getActionCurrentLevel", type, name); const action = getBladeburnerActionObject("getActionCurrentLevel", type, name);
return action.autoLevel; return action.autoLevel;
}, },
setActionAutolevel: function (type: any = "", name: any = "", autoLevel: any = true): void { setActionAutolevel: function (_type: unknown, _name: unknown, _autoLevel: unknown = true): void {
const type = helper.string("setActionAutolevel", "type", _type);
const name = helper.string("setActionAutolevel", "name", _name);
const autoLevel = helper.boolean(_autoLevel);
helper.updateDynamicRam("setActionAutolevel", getRamCost(player, "bladeburner", "setActionAutolevel")); helper.updateDynamicRam("setActionAutolevel", getRamCost(player, "bladeburner", "setActionAutolevel"));
checkBladeburnerAccess("setActionAutolevel"); checkBladeburnerAccess("setActionAutolevel");
const action = getBladeburnerActionObject("setActionAutolevel", type, name); const action = getBladeburnerActionObject("setActionAutolevel", type, name);
action.autoLevel = autoLevel; action.autoLevel = autoLevel;
}, },
setActionLevel: function (type: any = "", name: any = "", level: any = 1): void { setActionLevel: function (_type: unknown, _name: unknown, _level: unknown = 1): void {
const type = helper.string("setActionLevel", "type", _type);
const name = helper.string("setActionLevel", "name", _name);
const level = helper.number("setActionLevel", "level", _level);
helper.updateDynamicRam("setActionLevel", getRamCost(player, "bladeburner", "setActionLevel")); helper.updateDynamicRam("setActionLevel", getRamCost(player, "bladeburner", "setActionLevel"));
checkBladeburnerAccess("setActionLevel"); checkBladeburnerAccess("setActionLevel");
const action = getBladeburnerActionObject("setActionLevel", type, name); const action = getBladeburnerActionObject("setActionLevel", type, name);
@ -221,7 +246,8 @@ export function NetscriptBladeburner(
if (bladeburner === null) throw new Error("Should not be called without Bladeburner"); if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return bladeburner.skillPoints; return bladeburner.skillPoints;
}, },
getSkillLevel: function (skillName: any = ""): number { getSkillLevel: function (_skillName: unknown): number {
const skillName = helper.string("getSkillLevel", "skillName", _skillName);
helper.updateDynamicRam("getSkillLevel", getRamCost(player, "bladeburner", "getSkillLevel")); helper.updateDynamicRam("getSkillLevel", getRamCost(player, "bladeburner", "getSkillLevel"));
checkBladeburnerAccess("getSkillLevel"); checkBladeburnerAccess("getSkillLevel");
const bladeburner = player.bladeburner; const bladeburner = player.bladeburner;
@ -232,7 +258,8 @@ export function NetscriptBladeburner(
throw helper.makeRuntimeErrorMsg("bladeburner.getSkillLevel", e); throw helper.makeRuntimeErrorMsg("bladeburner.getSkillLevel", e);
} }
}, },
getSkillUpgradeCost: function (skillName: any = ""): number { getSkillUpgradeCost: function (_skillName: unknown): number {
const skillName = helper.string("getSkillUpgradeCost", "skillName", _skillName);
helper.updateDynamicRam("getSkillUpgradeCost", getRamCost(player, "bladeburner", "getSkillUpgradeCost")); helper.updateDynamicRam("getSkillUpgradeCost", getRamCost(player, "bladeburner", "getSkillUpgradeCost"));
checkBladeburnerAccess("getSkillUpgradeCost"); checkBladeburnerAccess("getSkillUpgradeCost");
const bladeburner = player.bladeburner; const bladeburner = player.bladeburner;
@ -243,7 +270,8 @@ export function NetscriptBladeburner(
throw helper.makeRuntimeErrorMsg("bladeburner.getSkillUpgradeCost", e); throw helper.makeRuntimeErrorMsg("bladeburner.getSkillUpgradeCost", e);
} }
}, },
upgradeSkill: function (skillName: any): boolean { upgradeSkill: function (_skillName: unknown): boolean {
const skillName = helper.string("upgradeSkill", "skillName", _skillName);
helper.updateDynamicRam("upgradeSkill", getRamCost(player, "bladeburner", "upgradeSkill")); helper.updateDynamicRam("upgradeSkill", getRamCost(player, "bladeburner", "upgradeSkill"));
checkBladeburnerAccess("upgradeSkill"); checkBladeburnerAccess("upgradeSkill");
const bladeburner = player.bladeburner; const bladeburner = player.bladeburner;
@ -254,7 +282,9 @@ export function NetscriptBladeburner(
throw helper.makeRuntimeErrorMsg("bladeburner.upgradeSkill", e); throw helper.makeRuntimeErrorMsg("bladeburner.upgradeSkill", e);
} }
}, },
getTeamSize: function (type: any = "", name: any = ""): number { getTeamSize: function (_type: unknown, _name: unknown): number {
const type = helper.string("getTeamSize", "type", _type);
const name = helper.string("getTeamSize", "name", _name);
helper.updateDynamicRam("getTeamSize", getRamCost(player, "bladeburner", "getTeamSize")); helper.updateDynamicRam("getTeamSize", getRamCost(player, "bladeburner", "getTeamSize"));
checkBladeburnerAccess("getTeamSize"); checkBladeburnerAccess("getTeamSize");
const bladeburner = player.bladeburner; const bladeburner = player.bladeburner;
@ -265,7 +295,10 @@ export function NetscriptBladeburner(
throw helper.makeRuntimeErrorMsg("bladeburner.getTeamSize", e); throw helper.makeRuntimeErrorMsg("bladeburner.getTeamSize", e);
} }
}, },
setTeamSize: function (type: any = "", name: any = "", size: any): number { setTeamSize: function (_type: unknown, _name: unknown, _size: unknown): number {
const type = helper.string("setTeamSize", "type", _type);
const name = helper.string("setTeamSize", "name", _name);
const size = helper.number("setTeamSize", "size", _size);
helper.updateDynamicRam("setTeamSize", getRamCost(player, "bladeburner", "setTeamSize")); helper.updateDynamicRam("setTeamSize", getRamCost(player, "bladeburner", "setTeamSize"));
checkBladeburnerAccess("setTeamSize"); checkBladeburnerAccess("setTeamSize");
const bladeburner = player.bladeburner; const bladeburner = player.bladeburner;
@ -276,7 +309,8 @@ export function NetscriptBladeburner(
throw helper.makeRuntimeErrorMsg("bladeburner.setTeamSize", e); throw helper.makeRuntimeErrorMsg("bladeburner.setTeamSize", e);
} }
}, },
getCityEstimatedPopulation: function (cityName: any): number { getCityEstimatedPopulation: function (_cityName: unknown): number {
const cityName = helper.string("getCityEstimatedPopulation", "cityName", _cityName);
helper.updateDynamicRam( helper.updateDynamicRam(
"getCityEstimatedPopulation", "getCityEstimatedPopulation",
getRamCost(player, "bladeburner", "getCityEstimatedPopulation"), getRamCost(player, "bladeburner", "getCityEstimatedPopulation"),
@ -287,7 +321,8 @@ export function NetscriptBladeburner(
if (bladeburner === null) throw new Error("Should not be called without Bladeburner"); if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return bladeburner.cities[cityName].popEst; return bladeburner.cities[cityName].popEst;
}, },
getCityCommunities: function (cityName: any): number { getCityCommunities: function (_cityName: unknown): number {
const cityName = helper.string("getCityCommunities", "cityName", _cityName);
helper.updateDynamicRam("getCityCommunities", getRamCost(player, "bladeburner", "getCityCommunities")); helper.updateDynamicRam("getCityCommunities", getRamCost(player, "bladeburner", "getCityCommunities"));
checkBladeburnerAccess("getCityCommunities"); checkBladeburnerAccess("getCityCommunities");
checkBladeburnerCity("getCityCommunities", cityName); checkBladeburnerCity("getCityCommunities", cityName);
@ -295,7 +330,8 @@ export function NetscriptBladeburner(
if (bladeburner === null) throw new Error("Should not be called without Bladeburner"); if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return bladeburner.cities[cityName].comms; return bladeburner.cities[cityName].comms;
}, },
getCityChaos: function (cityName: any): number { getCityChaos: function (_cityName: unknown): number {
const cityName = helper.string("getCityChaos", "cityName", _cityName);
helper.updateDynamicRam("getCityChaos", getRamCost(player, "bladeburner", "getCityChaos")); helper.updateDynamicRam("getCityChaos", getRamCost(player, "bladeburner", "getCityChaos"));
checkBladeburnerAccess("getCityChaos"); checkBladeburnerAccess("getCityChaos");
checkBladeburnerCity("getCityChaos", cityName); checkBladeburnerCity("getCityChaos", cityName);
@ -310,13 +346,14 @@ export function NetscriptBladeburner(
if (bladeburner === null) throw new Error("Should not be called without Bladeburner"); if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return bladeburner.city; return bladeburner.city;
}, },
switchCity: function (cityName: any): boolean { switchCity: function (_cityName: unknown): boolean {
const cityName = helper.string("switchCity", "cityName", _cityName);
helper.updateDynamicRam("switchCity", getRamCost(player, "bladeburner", "switchCity")); helper.updateDynamicRam("switchCity", getRamCost(player, "bladeburner", "switchCity"));
checkBladeburnerAccess("switchCity"); checkBladeburnerAccess("switchCity");
checkBladeburnerCity("switchCity", cityName); checkBladeburnerCity("switchCity", cityName);
const bladeburner = player.bladeburner; const bladeburner = player.bladeburner;
if (bladeburner === null) throw new Error("Should not be called without Bladeburner"); if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return (bladeburner.city = cityName); return bladeburner.city === cityName;
}, },
getStamina: function (): [number, number] { getStamina: function (): [number, number] {
helper.updateDynamicRam("getStamina", getRamCost(player, "bladeburner", "getStamina")); helper.updateDynamicRam("getStamina", getRamCost(player, "bladeburner", "getStamina"));
@ -365,7 +402,7 @@ export function NetscriptBladeburner(
checkBladeburnerAccess("getBonusTime"); checkBladeburnerAccess("getBonusTime");
const bladeburner = player.bladeburner; const bladeburner = player.bladeburner;
if (bladeburner === null) throw new Error("Should not be called without Bladeburner"); if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return (Math.round(bladeburner.storedCycles / 5))*1000; return Math.round(bladeburner.storedCycles / 5) * 1000;
}, },
}; };
} }

@ -4,14 +4,14 @@ import { IPlayer } from "../PersonObjects/IPlayer";
import { getRamCost } from "../Netscript/RamCostGenerator"; import { getRamCost } from "../Netscript/RamCostGenerator";
import { is2DArray } from "../utils/helpers/is2DArray"; import { is2DArray } from "../utils/helpers/is2DArray";
import { CodingContract } from "../CodingContracts"; import { CodingContract } from "../CodingContracts";
import { CodingContract as ICodingContract } from "../ScriptEditor/NetscriptDefinitions"; import { CodingAttemptOptions, CodingContract as ICodingContract } from "../ScriptEditor/NetscriptDefinitions";
export function NetscriptCodingContract( export function NetscriptCodingContract(
player: IPlayer, player: IPlayer,
workerScript: WorkerScript, workerScript: WorkerScript,
helper: INetscriptHelper, helper: INetscriptHelper,
): ICodingContract { ): ICodingContract {
const getCodingContract = function (func: any, hostname: any, filename: any): CodingContract { const getCodingContract = function (func: string, hostname: string, filename: string): CodingContract {
const server = helper.getServer(hostname, func); const server = helper.getServer(hostname, func);
const contract = server.getContract(filename); const contract = server.getContract(filename);
if (contract == null) { if (contract == null) {
@ -27,10 +27,12 @@ export function NetscriptCodingContract(
return { return {
attempt: function ( attempt: function (
answer: any, answer: any,
filename: any, _filename: unknown,
hostname: any = workerScript.hostname, _hostname: unknown = workerScript.hostname,
{ returnReward }: any = {}, { returnReward }: CodingAttemptOptions = { returnReward: false },
): boolean | string { ): boolean | string {
const filename = helper.string("attempt", "filename", _filename);
const hostname = helper.string("attempt", "hostname", _hostname);
helper.updateDynamicRam("attempt", getRamCost(player, "codingcontract", "attempt")); helper.updateDynamicRam("attempt", getRamCost(player, "codingcontract", "attempt"));
const contract = getCodingContract("attempt", hostname, filename); const contract = getCodingContract("attempt", hostname, filename);
@ -53,7 +55,10 @@ export function NetscriptCodingContract(
const serv = helper.getServer(hostname, "codingcontract.attempt"); const serv = helper.getServer(hostname, "codingcontract.attempt");
if (contract.isSolution(answer)) { if (contract.isSolution(answer)) {
const reward = player.gainCodingContractReward(creward, contract.getDifficulty()); const reward = player.gainCodingContractReward(creward, contract.getDifficulty());
workerScript.log("codingcontract.attempt", () => `Successfully completed Coding Contract '${filename}'. Reward: ${reward}`); workerScript.log(
"codingcontract.attempt",
() => `Successfully completed Coding Contract '${filename}'. Reward: ${reward}`,
);
serv.removeContract(filename); serv.removeContract(filename);
return returnReward ? reward : true; return returnReward ? reward : true;
} else { } else {
@ -68,7 +73,8 @@ export function NetscriptCodingContract(
workerScript.log( workerScript.log(
"codingcontract.attempt", "codingcontract.attempt",
() => () =>
`Coding Contract attempt '${filename}' failed. ${contract.getMaxNumTries() - contract.tries `Coding Contract attempt '${filename}' failed. ${
contract.getMaxNumTries() - contract.tries
} attempts remaining.`, } attempts remaining.`,
); );
} }
@ -76,12 +82,16 @@ export function NetscriptCodingContract(
return returnReward ? "" : false; return returnReward ? "" : false;
} }
}, },
getContractType: function (filename: any, hostname: any = workerScript.hostname): string { getContractType: function (_filename: unknown, _hostname: unknown = workerScript.hostname): string {
const filename = helper.string("getContractType", "filename", _filename);
const hostname = helper.string("getContractType", "hostname", _hostname);
helper.updateDynamicRam("getContractType", getRamCost(player, "codingcontract", "getContractType")); helper.updateDynamicRam("getContractType", getRamCost(player, "codingcontract", "getContractType"));
const contract = getCodingContract("getContractType", hostname, filename); const contract = getCodingContract("getContractType", hostname, filename);
return contract.getType(); return contract.getType();
}, },
getData: function (filename: any, hostname: any = workerScript.hostname): any { getData: function (_filename: unknown, _hostname: unknown = workerScript.hostname): any {
const filename = helper.string("getContractType", "filename", _filename);
const hostname = helper.string("getContractType", "hostname", _hostname);
helper.updateDynamicRam("getData", getRamCost(player, "codingcontract", "getData")); helper.updateDynamicRam("getData", getRamCost(player, "codingcontract", "getData"));
const contract = getCodingContract("getData", hostname, filename); const contract = getCodingContract("getData", hostname, filename);
const data = contract.getData(); const data = contract.getData();
@ -101,12 +111,16 @@ export function NetscriptCodingContract(
return data; return data;
} }
}, },
getDescription: function (filename: any, hostname: any = workerScript.hostname): string { getDescription: function (_filename: unknown, _hostname: unknown = workerScript.hostname): string {
const filename = helper.string("getDescription", "filename", _filename);
const hostname = helper.string("getDescription", "hostname", _hostname);
helper.updateDynamicRam("getDescription", getRamCost(player, "codingcontract", "getDescription")); helper.updateDynamicRam("getDescription", getRamCost(player, "codingcontract", "getDescription"));
const contract = getCodingContract("getDescription", hostname, filename); const contract = getCodingContract("getDescription", hostname, filename);
return contract.getDescription(); return contract.getDescription();
}, },
getNumTriesRemaining: function (filename: any, hostname: any = workerScript.hostname): number { getNumTriesRemaining: function (_filename: unknown, _hostname: unknown = workerScript.hostname): number {
const filename = helper.string("getNumTriesRemaining", "filename", _filename);
const hostname = helper.string("getNumTriesRemaining", "hostname", _hostname);
helper.updateDynamicRam("getNumTriesRemaining", getRamCost(player, "codingcontract", "getNumTriesRemaining")); helper.updateDynamicRam("getNumTriesRemaining", getRamCost(player, "codingcontract", "getNumTriesRemaining"));
const contract = getCodingContract("getNumTriesRemaining", hostname, filename); const contract = getCodingContract("getNumTriesRemaining", hostname, filename);
return contract.getMaxNumTries() - contract.tries; return contract.getMaxNumTries() - contract.tries;

@ -21,7 +21,7 @@ import {
Division as NSDivision, Division as NSDivision,
WarehouseAPI, WarehouseAPI,
OfficeAPI, OfficeAPI,
InvestmentOffer InvestmentOffer,
} from "../ScriptEditor/NetscriptDefinitions"; } from "../ScriptEditor/NetscriptDefinitions";
import { import {
@ -100,8 +100,8 @@ export function NetscriptCorporation(
return upgrade[1]; return upgrade[1];
} }
function getUpgradeLevel(aupgradeName: string): number { function getUpgradeLevel(_upgradeName: string): number {
const upgradeName = helper.string("levelUpgrade", "upgradeName", aupgradeName); const upgradeName = helper.string("levelUpgrade", "upgradeName", _upgradeName);
const corporation = getCorporation(); const corporation = getCorporation();
const upgrade = Object.values(CorporationUpgrades).find((upgrade) => upgrade[4] === upgradeName); const upgrade = Object.values(CorporationUpgrades).find((upgrade) => upgrade[4] === upgradeName);
if (upgrade === undefined) throw new Error(`No upgrade named '${upgradeName}'`); if (upgrade === undefined) throw new Error(`No upgrade named '${upgradeName}'`);
@ -109,8 +109,8 @@ export function NetscriptCorporation(
return corporation.upgrades[upgN]; return corporation.upgrades[upgN];
} }
function getUpgradeLevelCost(aupgradeName: string): number { function getUpgradeLevelCost(_upgradeName: string): number {
const upgradeName = helper.string("levelUpgrade", "upgradeName", aupgradeName); const upgradeName = helper.string("levelUpgrade", "upgradeName", _upgradeName);
const corporation = getCorporation(); const corporation = getCorporation();
const upgrade = Object.values(CorporationUpgrades).find((upgrade) => upgrade[4] === upgradeName); const upgrade = Object.values(CorporationUpgrades).find((upgrade) => upgrade[4] === upgradeName);
if (upgrade === undefined) throw new Error(`No upgrade named '${upgradeName}'`); if (upgrade === undefined) throw new Error(`No upgrade named '${upgradeName}'`);
@ -135,11 +135,15 @@ export function NetscriptCorporation(
function getInvestmentOffer(): InvestmentOffer { function getInvestmentOffer(): InvestmentOffer {
const corporation = getCorporation(); const corporation = getCorporation();
if (corporation.fundingRound >= CorporationConstants.FundingRoundShares.length || corporation.fundingRound >= CorporationConstants.FundingRoundMultiplier.length || corporation.public) if (
corporation.fundingRound >= CorporationConstants.FundingRoundShares.length ||
corporation.fundingRound >= CorporationConstants.FundingRoundMultiplier.length ||
corporation.public
)
return { return {
funds: 0, funds: 0,
shares: 0, shares: 0,
round: corporation.fundingRound + 1 // Make more readable round: corporation.fundingRound + 1, // Make more readable
}; // Don't throw an error here, no reason to have a second function to check if you can get investment. }; // Don't throw an error here, no reason to have a second function to check if you can get investment.
const val = corporation.determineValuation(); const val = corporation.determineValuation();
const percShares = CorporationConstants.FundingRoundShares[corporation.fundingRound]; const percShares = CorporationConstants.FundingRoundShares[corporation.fundingRound];
@ -149,13 +153,18 @@ export function NetscriptCorporation(
return { return {
funds: funding, funds: funding,
shares: investShares, shares: investShares,
round: corporation.fundingRound + 1 // Make more readable round: corporation.fundingRound + 1, // Make more readable
}; };
} }
function acceptInvestmentOffer(): boolean { function acceptInvestmentOffer(): boolean {
const corporation = getCorporation(); const corporation = getCorporation();
if (corporation.fundingRound >= CorporationConstants.FundingRoundShares.length || corporation.fundingRound >= CorporationConstants.FundingRoundMultiplier.length || corporation.public) return false; if (
corporation.fundingRound >= CorporationConstants.FundingRoundShares.length ||
corporation.fundingRound >= CorporationConstants.FundingRoundMultiplier.length ||
corporation.public
)
return false;
const val = corporation.determineValuation(); const val = corporation.determineValuation();
const percShares = CorporationConstants.FundingRoundShares[corporation.fundingRound]; const percShares = CorporationConstants.FundingRoundShares[corporation.fundingRound];
const roundMultiplier = CorporationConstants.FundingRoundMultiplier[corporation.fundingRound]; const roundMultiplier = CorporationConstants.FundingRoundMultiplier[corporation.fundingRound];
@ -181,7 +190,6 @@ export function NetscriptCorporation(
return true; return true;
} }
function getResearchCost(division: IIndustry, researchName: string): number { function getResearchCost(division: IIndustry, researchName: string): number {
const researchTree = IndustryResearchTrees[division.type]; const researchTree = IndustryResearchTrees[division.type];
if (researchTree === undefined) throw new Error(`No research tree for industry '${division.type}'`); if (researchTree === undefined) throw new Error(`No research tree for industry '${division.type}'`);
@ -192,17 +200,18 @@ export function NetscriptCorporation(
} }
function hasResearched(division: IIndustry, researchName: string): boolean { function hasResearched(division: IIndustry, researchName: string): boolean {
return division.researched[researchName] === undefined ? false : division.researched[researchName] as boolean; return division.researched[researchName] === undefined ? false : (division.researched[researchName] as boolean);
} }
function bribe(factionName: string, amountCash: number, amountShares: number): boolean { function bribe(factionName: string, amountCash: number, amountShares: number): boolean {
if (!player.factions.includes(factionName)) throw new Error("Invalid faction name"); if (!player.factions.includes(factionName)) throw new Error("Invalid faction name");
if (isNaN(amountCash) || amountCash < 0 || isNaN(amountShares) || amountShares < 0) throw new Error("Invalid value for amount field! Must be numeric, grater than 0."); if (isNaN(amountCash) || amountCash < 0 || isNaN(amountShares) || amountShares < 0)
throw new Error("Invalid value for amount field! Must be numeric, grater than 0.");
const corporation = getCorporation(); const corporation = getCorporation();
if (corporation.funds < amountCash) return false; if (corporation.funds < amountCash) return false;
if (corporation.numShares < amountShares) return false; if (corporation.numShares < amountShares) return false;
const faction = Factions[factionName] const faction = Factions[factionName];
const info = faction.getInfo(); const info = faction.getInfo();
if (!info.offersWork()) return false; if (!info.offersWork()) return false;
if (player.hasGangWith(factionName)) return false; if (player.hasGangWith(factionName)) return false;
@ -302,40 +311,40 @@ export function NetscriptCorporation(
checkAccess("getPurchaseWarehouseCost", 7); checkAccess("getPurchaseWarehouseCost", 7);
return CorporationConstants.WarehouseInitialCost; return CorporationConstants.WarehouseInitialCost;
}, },
getUpgradeWarehouseCost: function (adivisionName: any, acityName: any): number { getUpgradeWarehouseCost: function (_divisionName: unknown, _cityName: unknown): number {
checkAccess("upgradeWarehouse", 7); checkAccess("upgradeWarehouse", 7);
const divisionName = helper.string("getUpgradeWarehouseCost", "divisionName", adivisionName); const divisionName = helper.string("getUpgradeWarehouseCost", "divisionName", _divisionName);
const cityName = helper.string("getUpgradeWarehouseCost", "cityName", acityName); const cityName = helper.string("getUpgradeWarehouseCost", "cityName", _cityName);
const warehouse = getWarehouse(divisionName, cityName); const warehouse = getWarehouse(divisionName, cityName);
return CorporationConstants.WarehouseUpgradeBaseCost * Math.pow(1.07, warehouse.level + 1); return CorporationConstants.WarehouseUpgradeBaseCost * Math.pow(1.07, warehouse.level + 1);
}, },
hasWarehouse: function (adivisionName: any, acityName: any): boolean { hasWarehouse: function (_divisionName: unknown, _cityName: unknown): boolean {
checkAccess("hasWarehouse", 7); checkAccess("hasWarehouse", 7);
const divisionName = helper.string("getWarehouse", "divisionName", adivisionName); const divisionName = helper.string("getWarehouse", "divisionName", _divisionName);
const cityName = helper.string("getWarehouse", "cityName", acityName); const cityName = helper.string("getWarehouse", "cityName", _cityName);
const division = getDivision(divisionName); const division = getDivision(divisionName);
if (!(cityName in division.warehouses)) throw new Error(`Invalid city name '${cityName}'`); if (!(cityName in division.warehouses)) throw new Error(`Invalid city name '${cityName}'`);
const warehouse = division.warehouses[cityName]; const warehouse = division.warehouses[cityName];
return warehouse !== 0; return warehouse !== 0;
}, },
getWarehouse: function (adivisionName: any, acityName: any): NSWarehouse { getWarehouse: function (_divisionName: unknown, _cityName: unknown): NSWarehouse {
checkAccess("getWarehouse", 7); checkAccess("getWarehouse", 7);
const divisionName = helper.string("getWarehouse", "divisionName", adivisionName); const divisionName = helper.string("getWarehouse", "divisionName", _divisionName);
const cityName = helper.string("getWarehouse", "cityName", acityName); const cityName = helper.string("getWarehouse", "cityName", _cityName);
const warehouse = getWarehouse(divisionName, cityName); const warehouse = getWarehouse(divisionName, cityName);
return { return {
level: warehouse.level, level: warehouse.level,
loc: warehouse.loc, loc: warehouse.loc,
size: warehouse.size, size: warehouse.size,
sizeUsed: warehouse.sizeUsed, sizeUsed: warehouse.sizeUsed,
smartSupplyEnabled: warehouse.smartSupplyEnabled smartSupplyEnabled: warehouse.smartSupplyEnabled,
}; };
}, },
getMaterial: function (adivisionName: any, acityName: any, amaterialName: any): NSMaterial { getMaterial: function (_divisionName: unknown, _cityName: unknown, _materialName: unknown): NSMaterial {
checkAccess("getMaterial", 7); checkAccess("getMaterial", 7);
const divisionName = helper.string("getMaterial", "divisionName", adivisionName); const divisionName = helper.string("getMaterial", "divisionName", _divisionName);
const cityName = helper.string("getMaterial", "cityName", acityName); const cityName = helper.string("getMaterial", "cityName", _cityName);
const materialName = helper.string("getMaterial", "materialName", amaterialName); const materialName = helper.string("getMaterial", "materialName", _materialName);
const material = getMaterial(divisionName, cityName, materialName); const material = getMaterial(divisionName, cityName, materialName);
return { return {
name: material.name, name: material.name,
@ -345,10 +354,10 @@ export function NetscriptCorporation(
sell: material.sll, sell: material.sll,
}; };
}, },
getProduct: function (adivisionName: any, aproductName: any): NSProduct { getProduct: function (_divisionName: unknown, _productName: unknown): NSProduct {
checkAccess("getProduct", 7); checkAccess("getProduct", 7);
const divisionName = helper.string("getProduct", "divisionName", adivisionName); const divisionName = helper.string("getProduct", "divisionName", _divisionName);
const productName = helper.string("getProduct", "productName", aproductName); const productName = helper.string("getProduct", "productName", _productName);
const product = getProduct(divisionName, productName); const product = getProduct(divisionName, productName);
return { return {
name: product.name, name: product.name,
@ -360,220 +369,271 @@ export function NetscriptCorporation(
developmentProgress: product.prog, developmentProgress: product.prog,
}; };
}, },
purchaseWarehouse: function (adivisionName: any, acityName: any): void { purchaseWarehouse: function (_divisionName: unknown, _cityName: unknown): void {
checkAccess("purchaseWarehouse", 7); checkAccess("purchaseWarehouse", 7);
const divisionName = helper.string("purchaseWarehouse", "divisionName", adivisionName); const divisionName = helper.string("purchaseWarehouse", "divisionName", _divisionName);
const cityName = helper.string("purchaseWarehouse", "cityName", acityName); const cityName = helper.string("purchaseWarehouse", "cityName", _cityName);
const corporation = getCorporation(); const corporation = getCorporation();
PurchaseWarehouse(corporation, getDivision(divisionName), cityName); PurchaseWarehouse(corporation, getDivision(divisionName), cityName);
}, },
upgradeWarehouse: function (adivisionName: any, acityName: any): void { upgradeWarehouse: function (_divisionName: unknown, _cityName: unknown): void {
checkAccess("upgradeWarehouse", 7); checkAccess("upgradeWarehouse", 7);
const divisionName = helper.string("upgradeWarehouse", "divisionName", adivisionName); const divisionName = helper.string("upgradeWarehouse", "divisionName", _divisionName);
const cityName = helper.string("upgradeWarehouse", "cityName", acityName); const cityName = helper.string("upgradeWarehouse", "cityName", _cityName);
const corporation = getCorporation(); const corporation = getCorporation();
UpgradeWarehouse(corporation, getDivision(divisionName), getWarehouse(divisionName, cityName)); UpgradeWarehouse(corporation, getDivision(divisionName), getWarehouse(divisionName, cityName));
}, },
sellMaterial: function (adivisionName: any, acityName: any, amaterialName: any, aamt: any, aprice: any): void { sellMaterial: function (
_divisionName: unknown,
_cityName: unknown,
_materialName: unknown,
_amt: unknown,
_price: unknown,
): void {
checkAccess("sellMaterial", 7); checkAccess("sellMaterial", 7);
const divisionName = helper.string("sellMaterial", "divisionName", adivisionName); const divisionName = helper.string("sellMaterial", "divisionName", _divisionName);
const cityName = helper.string("sellMaterial", "cityName", acityName); const cityName = helper.string("sellMaterial", "cityName", _cityName);
const materialName = helper.string("sellMaterial", "materialName", amaterialName); const materialName = helper.string("sellMaterial", "materialName", _materialName);
const amt = helper.string("sellMaterial", "amt", aamt); const amt = helper.string("sellMaterial", "amt", _amt);
const price = helper.string("sellMaterial", "price", aprice); const price = helper.string("sellMaterial", "price", _price);
const material = getMaterial(divisionName, cityName, materialName); const material = getMaterial(divisionName, cityName, materialName);
SellMaterial(material, amt, price); SellMaterial(material, amt, price);
}, },
sellProduct: function ( sellProduct: function (
adivisionName: any, _divisionName: unknown,
acityName: any, _cityName: unknown,
aproductName: any, _productName: unknown,
aamt: any, _amt: unknown,
aprice: any, _price: unknown,
aall: any, _all: unknown,
): void { ): void {
checkAccess("sellProduct", 7); checkAccess("sellProduct", 7);
const divisionName = helper.string("sellProduct", "divisionName", adivisionName); const divisionName = helper.string("sellProduct", "divisionName", _divisionName);
const cityName = helper.string("sellProduct", "cityName", acityName); const cityName = helper.string("sellProduct", "cityName", _cityName);
const productName = helper.string("sellProduct", "productName", aproductName); const productName = helper.string("sellProduct", "productName", _productName);
const amt = helper.string("sellProduct", "amt", aamt); const amt = helper.string("sellProduct", "amt", _amt);
const price = helper.string("sellProduct", "price", aprice); const price = helper.string("sellProduct", "price", _price);
const all = helper.boolean(aall); const all = helper.boolean(_all);
const product = getProduct(divisionName, productName); const product = getProduct(divisionName, productName);
SellProduct(product, cityName, amt, price, all); SellProduct(product, cityName, amt, price, all);
}, },
discontinueProduct: function (adivisionName: any, aproductName: any): void { discontinueProduct: function (_divisionName: unknown, _productName: unknown): void {
checkAccess("discontinueProduct", 7); checkAccess("discontinueProduct", 7);
const divisionName = helper.string("discontinueProduct", "divisionName", adivisionName); const divisionName = helper.string("discontinueProduct", "divisionName", _divisionName);
const productName = helper.string("discontinueProduct", "productName", aproductName); const productName = helper.string("discontinueProduct", "productName", _productName);
getDivision(divisionName).discontinueProduct(getProduct(divisionName, productName)); getDivision(divisionName).discontinueProduct(getProduct(divisionName, productName));
}, },
setSmartSupply: function (adivisionName: any, acityName: any, aenabled: any): void { setSmartSupply: function (_divisionName: unknown, _cityName: unknown, _enabled: unknown): void {
checkAccess("setSmartSupply", 7); checkAccess("setSmartSupply", 7);
const divisionName = helper.string("setSmartSupply", "divisionName", adivisionName); const divisionName = helper.string("setSmartSupply", "divisionName", _divisionName);
const cityName = helper.string("sellProduct", "cityName", acityName); const cityName = helper.string("sellProduct", "cityName", _cityName);
const enabled = helper.boolean(aenabled); const enabled = helper.boolean(_enabled);
const warehouse = getWarehouse(divisionName, cityName); const warehouse = getWarehouse(divisionName, cityName);
if (!hasUnlockUpgrade("Smart Supply")) if (!hasUnlockUpgrade("Smart Supply"))
throw helper.makeRuntimeErrorMsg(`corporation.setSmartSupply`, `You have not purchased the Smart Supply upgrade!`); throw helper.makeRuntimeErrorMsg(
`corporation.setSmartSupply`,
`You have not purchased the Smart Supply upgrade!`,
);
SetSmartSupply(warehouse, enabled); SetSmartSupply(warehouse, enabled);
}, },
setSmartSupplyUseLeftovers: function (adivisionName: any, acityName: any, amaterialName: any, aenabled: any): void { setSmartSupplyUseLeftovers: function (
_divisionName: unknown,
_cityName: unknown,
_materialName: unknown,
_enabled: unknown,
): void {
checkAccess("setSmartSupplyUseLeftovers", 7); checkAccess("setSmartSupplyUseLeftovers", 7);
const divisionName = helper.string("setSmartSupply", "divisionName", adivisionName); const divisionName = helper.string("setSmartSupply", "divisionName", _divisionName);
const cityName = helper.string("sellProduct", "cityName", acityName); const cityName = helper.string("sellProduct", "cityName", _cityName);
const materialName = helper.string("sellProduct", "materialName", amaterialName); const materialName = helper.string("sellProduct", "materialName", _materialName);
const enabled = helper.boolean(aenabled); const enabled = helper.boolean(_enabled);
const warehouse = getWarehouse(divisionName, cityName); const warehouse = getWarehouse(divisionName, cityName);
const material = getMaterial(divisionName, cityName, materialName); const material = getMaterial(divisionName, cityName, materialName);
if (!hasUnlockUpgrade("Smart Supply")) if (!hasUnlockUpgrade("Smart Supply"))
throw helper.makeRuntimeErrorMsg(`corporation.setSmartSupply`, `You have not purchased the Smart Supply upgrade!`); throw helper.makeRuntimeErrorMsg(
`corporation.setSmartSupply`,
`You have not purchased the Smart Supply upgrade!`,
);
SetSmartSupplyUseLeftovers(warehouse, material, enabled); SetSmartSupplyUseLeftovers(warehouse, material, enabled);
}, },
buyMaterial: function (adivisionName: any, acityName: any, amaterialName: any, aamt: any): void { buyMaterial: function (_divisionName: unknown, _cityName: unknown, _materialName: unknown, _amt: unknown): void {
checkAccess("buyMaterial", 7); checkAccess("buyMaterial", 7);
const divisionName = helper.string("buyMaterial", "divisionName", adivisionName); const divisionName = helper.string("buyMaterial", "divisionName", _divisionName);
const cityName = helper.string("buyMaterial", "cityName", acityName); const cityName = helper.string("buyMaterial", "cityName", _cityName);
const materialName = helper.string("buyMaterial", "materialName", amaterialName); const materialName = helper.string("buyMaterial", "materialName", _materialName);
const amt = helper.number("buyMaterial", "amt", aamt); const amt = helper.number("buyMaterial", "amt", _amt);
if (amt < 0) throw new Error("Invalid value for amount field! Must be numeric and greater than 0"); if (amt < 0) throw new Error("Invalid value for amount field! Must be numeric and greater than 0");
const material = getMaterial(divisionName, cityName, materialName); const material = getMaterial(divisionName, cityName, materialName);
BuyMaterial(material, amt); BuyMaterial(material, amt);
}, },
bulkPurchase: function (adivisionName: any, acityName: any, amaterialName: any, aamt: any): void { bulkPurchase: function (_divisionName: unknown, _cityName: unknown, _materialName: unknown, _amt: unknown): void {
checkAccess("bulkPurchase", 7); checkAccess("bulkPurchase", 7);
const divisionName = helper.string("bulkPurchase", "divisionName", adivisionName); const divisionName = helper.string("bulkPurchase", "divisionName", _divisionName);
if (!hasResearched(getDivision(adivisionName), "Bulk Purchasing")) throw new Error(`You have not researched Bulk Purchasing in ${divisionName}`) if (!hasResearched(getDivision(_divisionName), "Bulk Purchasing"))
throw new Error(`You have not researched Bulk Purchasing in ${divisionName}`);
const corporation = getCorporation(); const corporation = getCorporation();
const cityName = helper.string("bulkPurchase", "cityName", acityName); const cityName = helper.string("bulkPurchase", "cityName", _cityName);
const materialName = helper.string("bulkPurchase", "materialName", amaterialName); const materialName = helper.string("bulkPurchase", "materialName", _materialName);
const amt = helper.number("bulkPurchase", "amt", aamt); const amt = helper.number("bulkPurchase", "amt", _amt);
const warehouse = getWarehouse(divisionName, cityName) const warehouse = getWarehouse(divisionName, cityName);
const material = getMaterial(divisionName, cityName, materialName); const material = getMaterial(divisionName, cityName, materialName);
BulkPurchase(corporation, warehouse, material, amt); BulkPurchase(corporation, warehouse, material, amt);
}, },
makeProduct: function ( makeProduct: function (
adivisionName: any, _divisionName: unknown,
acityName: any, _cityName: unknown,
aproductName: any, _productName: unknown,
adesignInvest: any, _designInvest: unknown,
amarketingInvest: any, _marketingInvest: unknown,
): void { ): void {
checkAccess("makeProduct", 7); checkAccess("makeProduct", 7);
const divisionName = helper.string("makeProduct", "divisionName", adivisionName); const divisionName = helper.string("makeProduct", "divisionName", _divisionName);
const cityName = helper.string("makeProduct", "cityName", acityName); const cityName = helper.string("makeProduct", "cityName", _cityName);
const productName = helper.string("makeProduct", "productName", aproductName); const productName = helper.string("makeProduct", "productName", _productName);
const designInvest = helper.number("makeProduct", "designInvest", adesignInvest); const designInvest = helper.number("makeProduct", "designInvest", _designInvest);
const marketingInvest = helper.number("makeProduct", "marketingInvest", amarketingInvest); const marketingInvest = helper.number("makeProduct", "marketingInvest", _marketingInvest);
const corporation = getCorporation(); const corporation = getCorporation();
MakeProduct(corporation, getDivision(divisionName), cityName, productName, designInvest, marketingInvest); MakeProduct(corporation, getDivision(divisionName), cityName, productName, designInvest, marketingInvest);
}, },
exportMaterial: function ( exportMaterial: function (
asourceDivision: any, _sourceDivision: unknown,
asourceCity: any, _sourceCity: unknown,
atargetDivision: any, _targetDivision: unknown,
atargetCity: any, _targetCity: unknown,
amaterialName: any, _materialName: unknown,
aamt: any, _amt: unknown,
): void { ): void {
checkAccess("exportMaterial", 7); checkAccess("exportMaterial", 7);
const sourceDivision = helper.string("exportMaterial", "sourceDivision", asourceDivision); const sourceDivision = helper.string("exportMaterial", "sourceDivision", _sourceDivision);
const sourceCity = helper.string("exportMaterial", "sourceCity", asourceCity); const sourceCity = helper.string("exportMaterial", "sourceCity", _sourceCity);
const targetDivision = helper.string("exportMaterial", "targetDivision", atargetDivision); const targetDivision = helper.string("exportMaterial", "targetDivision", _targetDivision);
const targetCity = helper.string("exportMaterial", "targetCity", atargetCity); const targetCity = helper.string("exportMaterial", "targetCity", _targetCity);
const materialName = helper.string("exportMaterial", "materialName", amaterialName); const materialName = helper.string("exportMaterial", "materialName", _materialName);
const amt = helper.string("exportMaterial", "amt", aamt); const amt = helper.string("exportMaterial", "amt", _amt);
ExportMaterial(targetDivision, targetCity, getMaterial(sourceDivision, sourceCity, materialName), amt + "", getDivision(targetDivision)); ExportMaterial(
targetDivision,
targetCity,
getMaterial(sourceDivision, sourceCity, materialName),
amt + "",
getDivision(targetDivision),
);
}, },
cancelExportMaterial: function ( cancelExportMaterial: function (
asourceDivision: any, _sourceDivision: unknown,
asourceCity: any, _sourceCity: unknown,
atargetDivision: any, _targetDivision: unknown,
atargetCity: any, _targetCity: unknown,
amaterialName: any, _materialName: unknown,
aamt: any, _amt: unknown,
): void { ): void {
checkAccess("cancelExportMaterial", 7); checkAccess("cancelExportMaterial", 7);
const sourceDivision = helper.string("cancelExportMaterial", "sourceDivision", asourceDivision); const sourceDivision = helper.string("cancelExportMaterial", "sourceDivision", _sourceDivision);
const sourceCity = helper.string("cancelExportMaterial", "sourceCity", asourceCity); const sourceCity = helper.string("cancelExportMaterial", "sourceCity", _sourceCity);
const targetDivision = helper.string("cancelExportMaterial", "targetDivision", atargetDivision); const targetDivision = helper.string("cancelExportMaterial", "targetDivision", _targetDivision);
const targetCity = helper.string("cancelExportMaterial", "targetCity", atargetCity); const targetCity = helper.string("cancelExportMaterial", "targetCity", _targetCity);
const materialName = helper.string("cancelExportMaterial", "materialName", amaterialName); const materialName = helper.string("cancelExportMaterial", "materialName", _materialName);
const amt = helper.string("cancelExportMaterial", "amt", aamt); const amt = helper.string("cancelExportMaterial", "amt", _amt);
CancelExportMaterial(targetDivision, targetCity, getMaterial(sourceDivision, sourceCity, materialName), amt + ""); CancelExportMaterial(targetDivision, targetCity, getMaterial(sourceDivision, sourceCity, materialName), amt + "");
}, },
setMaterialMarketTA1: function (adivisionName: any, acityName: any, amaterialName: any, aon: any): void { setMaterialMarketTA1: function (
_divisionName: unknown,
_cityName: unknown,
_materialName: unknown,
_on: unknown,
): void {
checkAccess("setMaterialMarketTA1", 7); checkAccess("setMaterialMarketTA1", 7);
const divisionName = helper.string("setMaterialMarketTA1", "divisionName", adivisionName); const divisionName = helper.string("setMaterialMarketTA1", "divisionName", _divisionName);
const cityName = helper.string("setMaterialMarketTA1", "cityName", acityName); const cityName = helper.string("setMaterialMarketTA1", "cityName", _cityName);
const materialName = helper.string("setMaterialMarketTA1", "materialName", amaterialName); const materialName = helper.string("setMaterialMarketTA1", "materialName", _materialName);
const on = helper.boolean(aon); const on = helper.boolean(_on);
if (!getDivision(divisionName).hasResearch("Market-TA.I")) if (!getDivision(divisionName).hasResearch("Market-TA.I"))
throw helper.makeRuntimeErrorMsg(`corporation.setMaterialMarketTA1`, `You have not researched MarketTA.I for division: ${divisionName}`); throw helper.makeRuntimeErrorMsg(
`corporation.setMaterialMarketTA1`,
`You have not researched MarketTA.I for division: ${divisionName}`,
);
SetMaterialMarketTA1(getMaterial(divisionName, cityName, materialName), on); SetMaterialMarketTA1(getMaterial(divisionName, cityName, materialName), on);
}, },
setMaterialMarketTA2: function (adivisionName: any, acityName: any, amaterialName: any, aon: any): void { setMaterialMarketTA2: function (
_divisionName: unknown,
_cityName: unknown,
_materialName: unknown,
_on: unknown,
): void {
checkAccess("setMaterialMarketTA2", 7); checkAccess("setMaterialMarketTA2", 7);
const divisionName = helper.string("setMaterialMarketTA2", "divisionName", adivisionName); const divisionName = helper.string("setMaterialMarketTA2", "divisionName", _divisionName);
const cityName = helper.string("setMaterialMarketTA2", "cityName", acityName); const cityName = helper.string("setMaterialMarketTA2", "cityName", _cityName);
const materialName = helper.string("setMaterialMarketTA2", "materialName", amaterialName); const materialName = helper.string("setMaterialMarketTA2", "materialName", _materialName);
const on = helper.boolean(aon); const on = helper.boolean(_on);
if (!getDivision(divisionName).hasResearch("Market-TA.II")) if (!getDivision(divisionName).hasResearch("Market-TA.II"))
throw helper.makeRuntimeErrorMsg(`corporation.setMaterialMarketTA2`, `You have not researched MarketTA.II for division: ${divisionName}`); throw helper.makeRuntimeErrorMsg(
`corporation.setMaterialMarketTA2`,
`You have not researched MarketTA.II for division: ${divisionName}`,
);
SetMaterialMarketTA2(getMaterial(divisionName, cityName, materialName), on); SetMaterialMarketTA2(getMaterial(divisionName, cityName, materialName), on);
}, },
setProductMarketTA1: function (adivisionName: any, aproductName: any, aon: any): void { setProductMarketTA1: function (_divisionName: unknown, _productName: unknown, _on: unknown): void {
checkAccess("setProductMarketTA1", 7); checkAccess("setProductMarketTA1", 7);
const divisionName = helper.string("setProductMarketTA1", "divisionName", adivisionName); const divisionName = helper.string("setProductMarketTA1", "divisionName", _divisionName);
const productName = helper.string("setProductMarketTA1", "productName", aproductName); const productName = helper.string("setProductMarketTA1", "productName", _productName);
const on = helper.boolean(aon); const on = helper.boolean(_on);
if (!getDivision(divisionName).hasResearch("Market-TA.I")) if (!getDivision(divisionName).hasResearch("Market-TA.I"))
throw helper.makeRuntimeErrorMsg(`corporation.setProductMarketTA1`, `You have not researched MarketTA.I for division: ${divisionName}`); throw helper.makeRuntimeErrorMsg(
`corporation.setProductMarketTA1`,
`You have not researched MarketTA.I for division: ${divisionName}`,
);
SetProductMarketTA1(getProduct(divisionName, productName), on); SetProductMarketTA1(getProduct(divisionName, productName), on);
}, },
setProductMarketTA2: function (adivisionName: any, aproductName: any, aon: any): void { setProductMarketTA2: function (_divisionName: unknown, _productName: unknown, _on: unknown): void {
checkAccess("setProductMarketTA2", 7); checkAccess("setProductMarketTA2", 7);
const divisionName = helper.string("setProductMarketTA2", "divisionName", adivisionName); const divisionName = helper.string("setProductMarketTA2", "divisionName", _divisionName);
const productName = helper.string("setProductMarketTA2", "productName", aproductName); const productName = helper.string("setProductMarketTA2", "productName", _productName);
const on = helper.boolean(aon); const on = helper.boolean(_on);
if (!getDivision(divisionName).hasResearch("Market-TA.II")) if (!getDivision(divisionName).hasResearch("Market-TA.II"))
throw helper.makeRuntimeErrorMsg(`corporation.setProductMarketTA2`, `You have not researched MarketTA.II for division: ${divisionName}`); throw helper.makeRuntimeErrorMsg(
`corporation.setProductMarketTA2`,
`You have not researched MarketTA.II for division: ${divisionName}`,
);
SetProductMarketTA2(getProduct(divisionName, productName), on); SetProductMarketTA2(getProduct(divisionName, productName), on);
}, },
}; };
const officeAPI: OfficeAPI = { const officeAPI: OfficeAPI = {
getHireAdVertCost: function (adivisionName: any): number { getHireAdVertCost: function (_divisionName: unknown): number {
checkAccess("getHireAdVertCost", 8); checkAccess("getHireAdVertCost", 8);
const divisionName = helper.string("getHireAdVertCost", "divisionName", adivisionName); const divisionName = helper.string("getHireAdVertCost", "divisionName", _divisionName);
const division = getDivision(divisionName); const division = getDivision(divisionName);
const upgrade = IndustryUpgrades[1]; const upgrade = IndustryUpgrades[1];
return upgrade[1] * Math.pow(upgrade[2], division.upgrades[1]); return upgrade[1] * Math.pow(upgrade[2], division.upgrades[1]);
}, },
getHireAdVertCount: function (adivisionName: any): number { getHireAdVertCount: function (_divisionName: unknown): number {
checkAccess("getHireAdVertCount", 8); checkAccess("getHireAdVertCount", 8);
const divisionName = helper.string("getHireAdVertCount", "divisionName", adivisionName); const divisionName = helper.string("getHireAdVertCount", "divisionName", _divisionName);
const division = getDivision(divisionName); const division = getDivision(divisionName);
return division.upgrades[1] return division.upgrades[1];
}, },
getResearchCost: function (adivisionName: any, aresearchName: any): number { getResearchCost: function (_divisionName: unknown, _researchName: unknown): number {
checkAccess("getResearchCost", 8); checkAccess("getResearchCost", 8);
const divisionName = helper.string("getResearchCost", "divisionName", adivisionName); const divisionName = helper.string("getResearchCost", "divisionName", _divisionName);
const researchName = helper.string("getResearchCost", "researchName", aresearchName); const researchName = helper.string("getResearchCost", "researchName", _researchName);
return getResearchCost(getDivision(divisionName), researchName); return getResearchCost(getDivision(divisionName), researchName);
}, },
hasResearched: function (adivisionName: any, aresearchName: any): boolean { hasResearched: function (_divisionName: unknown, _researchName: unknown): boolean {
checkAccess("hasResearched", 8); checkAccess("hasResearched", 8);
const divisionName = helper.string("hasResearched", "divisionName", adivisionName); const divisionName = helper.string("hasResearched", "divisionName", _divisionName);
const researchName = helper.string("hasResearched", "researchName", aresearchName); const researchName = helper.string("hasResearched", "researchName", _researchName);
return hasResearched(getDivision(divisionName), researchName); return hasResearched(getDivision(divisionName), researchName);
}, },
setAutoJobAssignment: function (adivisionName: any, acityName: any, ajob: any, aamount: any): Promise<boolean> { setAutoJobAssignment: function (
_divisionName: unknown,
_cityName: unknown,
_job: unknown,
_amount: unknown,
): Promise<boolean> {
checkAccess("setAutoJobAssignment", 8); checkAccess("setAutoJobAssignment", 8);
const divisionName = helper.string("setAutoJobAssignment", "divisionName", adivisionName); const divisionName = helper.string("setAutoJobAssignment", "divisionName", _divisionName);
const cityName = helper.string("setAutoJobAssignment", "cityName", acityName); const cityName = helper.string("setAutoJobAssignment", "cityName", _cityName);
const amount = helper.number("setAutoJobAssignment", "amount", aamount); const amount = helper.number("setAutoJobAssignment", "amount", _amount);
const job = helper.string("setAutoJobAssignment", "job", ajob); const job = helper.string("setAutoJobAssignment", "job", _job);
const office = getOffice(divisionName, cityName); const office = getOffice(divisionName, cityName);
if (!Object.values(EmployeePositions).includes(job)) throw new Error(`'${job}' is not a valid job.`); if (!Object.values(EmployeePositions).includes(job)) throw new Error(`'${job}' is not a valid job.`);
return netscriptDelay(1000, workerScript).then(function () { return netscriptDelay(1000, workerScript).then(function () {
@ -583,11 +643,11 @@ export function NetscriptCorporation(
return Promise.resolve(office.setEmployeeToJob(job, amount)); return Promise.resolve(office.setEmployeeToJob(job, amount));
}); });
}, },
getOfficeSizeUpgradeCost: function (adivisionName: any, acityName: any, asize: any): number { getOfficeSizeUpgradeCost: function (_divisionName: unknown, _cityName: unknown, _size: unknown): number {
checkAccess("getOfficeSizeUpgradeCost", 8); checkAccess("getOfficeSizeUpgradeCost", 8);
const divisionName = helper.string("getOfficeSizeUpgradeCost", "divisionName", adivisionName); const divisionName = helper.string("getOfficeSizeUpgradeCost", "divisionName", _divisionName);
const cityName = helper.string("getOfficeSizeUpgradeCost", "cityName", acityName); const cityName = helper.string("getOfficeSizeUpgradeCost", "cityName", _cityName);
const size = helper.number("getOfficeSizeUpgradeCost", "size", asize); const size = helper.number("getOfficeSizeUpgradeCost", "size", _size);
if (size < 0) throw new Error("Invalid value for size field! Must be numeric and greater than 0"); if (size < 0) throw new Error("Invalid value for size field! Must be numeric and greater than 0");
const office = getOffice(divisionName, cityName); const office = getOffice(divisionName, cityName);
const initialPriceMult = Math.round(office.size / CorporationConstants.OfficeInitialSize); const initialPriceMult = Math.round(office.size / CorporationConstants.OfficeInitialSize);
@ -598,40 +658,46 @@ export function NetscriptCorporation(
} }
return CorporationConstants.OfficeInitialCost * mult; return CorporationConstants.OfficeInitialCost * mult;
}, },
assignJob: function (adivisionName: any, acityName: any, aemployeeName: any, ajob: any): Promise<void> { assignJob: function (
_divisionName: unknown,
_cityName: unknown,
_employeeName: unknown,
_job: unknown,
): Promise<void> {
checkAccess("assignJob", 8); checkAccess("assignJob", 8);
const divisionName = helper.string("assignJob", "divisionName", adivisionName); const divisionName = helper.string("assignJob", "divisionName", _divisionName);
const cityName = helper.string("assignJob", "cityName", acityName); const cityName = helper.string("assignJob", "cityName", _cityName);
const employeeName = helper.string("assignJob", "employeeName", aemployeeName); const employeeName = helper.string("assignJob", "employeeName", _employeeName);
const job = helper.string("assignJob", "job", ajob); const job = helper.string("assignJob", "job", _job);
const employee = getEmployee(divisionName, cityName, employeeName); const employee = getEmployee(divisionName, cityName, employeeName);
return netscriptDelay(1000, workerScript).then(function () { return netscriptDelay(1000, workerScript).then(function () {
return Promise.resolve(AssignJob(employee, job)); return Promise.resolve(AssignJob(employee, job));
}); });
}, },
hireEmployee: function (adivisionName: any, acityName: any): any { hireEmployee: function (_divisionName: unknown, _cityName: unknown): any {
checkAccess("hireEmployee", 8); checkAccess("hireEmployee", 8);
const divisionName = helper.string("hireEmployee", "divisionName", adivisionName); const divisionName = helper.string("hireEmployee", "divisionName", _divisionName);
const cityName = helper.string("hireEmployee", "cityName", acityName); const cityName = helper.string("hireEmployee", "cityName", _cityName);
const office = getOffice(divisionName, cityName); const office = getOffice(divisionName, cityName);
return office.hireRandomEmployee(); return office.hireRandomEmployee();
}, },
upgradeOfficeSize: function (adivisionName: any, acityName: any, asize: any): void { upgradeOfficeSize: function (_divisionName: unknown, _cityName: unknown, _size: unknown): void {
checkAccess("upgradeOfficeSize", 8); checkAccess("upgradeOfficeSize", 8);
const divisionName = helper.string("upgradeOfficeSize", "divisionName", adivisionName); const divisionName = helper.string("upgradeOfficeSize", "divisionName", _divisionName);
const cityName = helper.string("upgradeOfficeSize", "cityName", acityName); const cityName = helper.string("upgradeOfficeSize", "cityName", _cityName);
const size = helper.number("upgradeOfficeSize", "size", asize); const size = helper.number("upgradeOfficeSize", "size", _size);
if (size < 0) throw new Error("Invalid value for size field! Must be numeric and greater than 0"); if (size < 0) throw new Error("Invalid value for size field! Must be numeric and greater than 0");
const office = getOffice(divisionName, cityName); const office = getOffice(divisionName, cityName);
const corporation = getCorporation(); const corporation = getCorporation();
UpgradeOfficeSize(corporation, office, size); UpgradeOfficeSize(corporation, office, size);
}, },
throwParty: function (adivisionName: any, acityName: any, acostPerEmployee: any): Promise<number> { throwParty: function (_divisionName: unknown, _cityName: unknown, _costPerEmployee: unknown): Promise<number> {
checkAccess("throwParty", 8); checkAccess("throwParty", 8);
const divisionName = helper.string("throwParty", "divisionName", adivisionName); const divisionName = helper.string("throwParty", "divisionName", _divisionName);
const cityName = helper.string("throwParty", "cityName", acityName); const cityName = helper.string("throwParty", "cityName", _cityName);
const costPerEmployee = helper.number("throwParty", "costPerEmployee", acostPerEmployee); const costPerEmployee = helper.number("throwParty", "costPerEmployee", _costPerEmployee);
if (costPerEmployee < 0) throw new Error("Invalid value for Cost Per Employee field! Must be numeric and greater than 0"); if (costPerEmployee < 0)
throw new Error("Invalid value for Cost Per Employee field! Must be numeric and greater than 0");
const office = getOffice(divisionName, cityName); const office = getOffice(divisionName, cityName);
const corporation = getCorporation(); const corporation = getCorporation();
return netscriptDelay( return netscriptDelay(
@ -641,10 +707,10 @@ export function NetscriptCorporation(
return Promise.resolve(ThrowParty(corporation, office, costPerEmployee)); return Promise.resolve(ThrowParty(corporation, office, costPerEmployee));
}); });
}, },
buyCoffee: function (adivisionName: any, acityName: any): Promise<void> { buyCoffee: function (_divisionName: unknown, _cityName: unknown): Promise<void> {
checkAccess("buyCoffee", 8); checkAccess("buyCoffee", 8);
const divisionName = helper.string("buyCoffee", "divisionName", adivisionName); const divisionName = helper.string("buyCoffee", "divisionName", _divisionName);
const cityName = helper.string("buyCoffee", "cityName", acityName); const cityName = helper.string("buyCoffee", "cityName", _cityName);
const corporation = getCorporation(); const corporation = getCorporation();
return netscriptDelay( return netscriptDelay(
(60 * 1000) / (player.hacking_speed_mult * calculateIntelligenceBonus(player.intelligence, 1)), (60 * 1000) / (player.hacking_speed_mult * calculateIntelligenceBonus(player.intelligence, 1)),
@ -653,22 +719,22 @@ export function NetscriptCorporation(
return Promise.resolve(BuyCoffee(corporation, getDivision(divisionName), getOffice(divisionName, cityName))); return Promise.resolve(BuyCoffee(corporation, getDivision(divisionName), getOffice(divisionName, cityName)));
}); });
}, },
hireAdVert: function (adivisionName: any): void { hireAdVert: function (_divisionName: unknown): void {
checkAccess("hireAdVert", 8); checkAccess("hireAdVert", 8);
const divisionName = helper.string("hireAdVert", "divisionName", adivisionName); const divisionName = helper.string("hireAdVert", "divisionName", _divisionName);
const corporation = getCorporation(); const corporation = getCorporation();
HireAdVert(corporation, getDivision(divisionName), getOffice(divisionName, "Sector-12")); HireAdVert(corporation, getDivision(divisionName), getOffice(divisionName, "Sector-12"));
}, },
research: function (adivisionName: any, aresearchName: any): void { research: function (_divisionName: unknown, _researchName: unknown): void {
checkAccess("research", 8); checkAccess("research", 8);
const divisionName = helper.string("research", "divisionName", adivisionName); const divisionName = helper.string("research", "divisionName", _divisionName);
const researchName = helper.string("research", "researchName", aresearchName); const researchName = helper.string("research", "researchName", _researchName);
Research(getDivision(divisionName), researchName); Research(getDivision(divisionName), researchName);
}, },
getOffice: function (adivisionName: any, acityName: any): any { getOffice: function (_divisionName: unknown, _cityName: unknown): any {
checkAccess("getOffice", 8); checkAccess("getOffice", 8);
const divisionName = helper.string("getOffice", "divisionName", adivisionName); const divisionName = helper.string("getOffice", "divisionName", _divisionName);
const cityName = helper.string("getOffice", "cityName", acityName); const cityName = helper.string("getOffice", "cityName", _cityName);
const office = getOffice(divisionName, cityName); const office = getOffice(divisionName, cityName);
return { return {
loc: office.loc, loc: office.loc,
@ -689,11 +755,11 @@ export function NetscriptCorporation(
}, },
}; };
}, },
getEmployee: function (adivisionName: any, acityName: any, aemployeeName: any): NSEmployee { getEmployee: function (_divisionName: unknown, _cityName: unknown, _employeeName: unknown): NSEmployee {
checkAccess("getEmployee", 8); checkAccess("getEmployee", 8);
const divisionName = helper.string("getEmployee", "divisionName", adivisionName); const divisionName = helper.string("getEmployee", "divisionName", _divisionName);
const cityName = helper.string("getEmployee", "cityName", acityName); const cityName = helper.string("getEmployee", "cityName", _cityName);
const employeeName = helper.string("getEmployee", "employeeName", aemployeeName); const employeeName = helper.string("getEmployee", "employeeName", _employeeName);
const employee = getEmployee(divisionName, cityName, employeeName); const employee = getEmployee(divisionName, cityName, employeeName);
return { return {
name: employee.name, name: employee.name,
@ -715,42 +781,43 @@ export function NetscriptCorporation(
return { return {
...warehouseAPI, ...warehouseAPI,
...officeAPI, ...officeAPI,
expandIndustry: function (aindustryName: any, adivisionName: any): void { expandIndustry: function (_industryName: unknown, _divisionName: unknown): void {
checkAccess("expandIndustry"); checkAccess("expandIndustry");
const industryName = helper.string("expandIndustry", "industryName", aindustryName); const industryName = helper.string("expandIndustry", "industryName", _industryName);
const divisionName = helper.string("expandIndustry", "divisionName", adivisionName); const divisionName = helper.string("expandIndustry", "divisionName", _divisionName);
const corporation = getCorporation(); const corporation = getCorporation();
NewIndustry(corporation, industryName, divisionName); NewIndustry(corporation, industryName, divisionName);
}, },
expandCity: function (adivisionName: any, acityName: any): void { expandCity: function (_divisionName: unknown, _cityName: unknown): void {
checkAccess("expandCity"); checkAccess("expandCity");
const divisionName = helper.string("expandCity", "divisionName", adivisionName); const divisionName = helper.string("expandCity", "divisionName", _divisionName);
const cityName = helper.string("expandCity", "cityName", acityName); const cityName = helper.string("expandCity", "cityName", _cityName);
if (!CorporationConstants.Cities.includes(cityName)) throw new Error("Invalid city name"); if (!CorporationConstants.Cities.includes(cityName)) throw new Error("Invalid city name");
const corporation = getCorporation(); const corporation = getCorporation();
const division = getDivision(divisionName); const division = getDivision(divisionName);
NewCity(corporation, division, cityName); NewCity(corporation, division, cityName);
}, },
unlockUpgrade: function (aupgradeName: any): void { unlockUpgrade: function (_upgradeName: unknown): void {
checkAccess("unlockUpgrade"); checkAccess("unlockUpgrade");
const upgradeName = helper.string("unlockUpgrade", "upgradeName", aupgradeName); const upgradeName = helper.string("unlockUpgrade", "upgradeName", _upgradeName);
const corporation = getCorporation(); const corporation = getCorporation();
const upgrade = Object.values(CorporationUnlockUpgrades).find((upgrade) => upgrade[2] === upgradeName); const upgrade = Object.values(CorporationUnlockUpgrades).find((upgrade) => upgrade[2] === upgradeName);
if (upgrade === undefined) throw new Error(`No upgrade named '${upgradeName}'`); if (upgrade === undefined) throw new Error(`No upgrade named '${upgradeName}'`);
UnlockUpgrade(corporation, upgrade); UnlockUpgrade(corporation, upgrade);
}, },
levelUpgrade: function (aupgradeName: any): void { levelUpgrade: function (_upgradeName: unknown): void {
checkAccess("levelUpgrade"); checkAccess("levelUpgrade");
const upgradeName = helper.string("levelUpgrade", "upgradeName", aupgradeName); const upgradeName = helper.string("levelUpgrade", "upgradeName", _upgradeName);
const corporation = getCorporation(); const corporation = getCorporation();
const upgrade = Object.values(CorporationUpgrades).find((upgrade) => upgrade[4] === upgradeName); const upgrade = Object.values(CorporationUpgrades).find((upgrade) => upgrade[4] === upgradeName);
if (upgrade === undefined) throw new Error(`No upgrade named '${upgradeName}'`); if (upgrade === undefined) throw new Error(`No upgrade named '${upgradeName}'`);
LevelUpgrade(corporation, upgrade); LevelUpgrade(corporation, upgrade);
}, },
issueDividends: function (apercent: any): void { issueDividends: function (_percent: unknown): void {
checkAccess("issueDividends"); checkAccess("issueDividends");
const percent = helper.number("issueDividends", "percent", apercent); const percent = helper.number("issueDividends", "percent", _percent);
if (percent < 0 || percent > 100) throw new Error("Invalid value for percent field! Must be numeric, greater than 0, and less than 100"); if (percent < 0 || percent > 100)
throw new Error("Invalid value for percent field! Must be numeric, greater than 0, and less than 100");
const corporation = getCorporation(); const corporation = getCorporation();
if (!corporation.public) if (!corporation.public)
throw helper.makeRuntimeErrorMsg(`corporation.issueDividends`, `Your company has not gone public!`); throw helper.makeRuntimeErrorMsg(`corporation.issueDividends`, `Your company has not gone public!`);
@ -759,9 +826,9 @@ export function NetscriptCorporation(
// If you modify these objects you will affect them for real, it's not // If you modify these objects you will affect them for real, it's not
// copies. // copies.
getDivision: function (adivisionName: any): NSDivision { getDivision: function (_divisionName: unknown): NSDivision {
checkAccess("getDivision"); checkAccess("getDivision");
const divisionName = helper.string("getDivision", "divisionName", adivisionName); const divisionName = helper.string("getDivision", "divisionName", _divisionName);
const division = getDivision(divisionName); const division = getDivision(divisionName);
return getSafeDivision(division); return getSafeDivision(division);
}, },
@ -783,33 +850,34 @@ export function NetscriptCorporation(
divisions: corporation.divisions.map((division): NSDivision => getSafeDivision(division)), divisions: corporation.divisions.map((division): NSDivision => getSafeDivision(division)),
}; };
}, },
createCorporation: function (acorporationName: string, selfFund = true): boolean { createCorporation: function (_corporationName: unknown, _selfFund: unknown = true): boolean {
const corporationName = helper.string("createCorporation", "corporationName", acorporationName); const corporationName = helper.string("createCorporation", "corporationName", _corporationName);
const selfFund = helper.boolean(_selfFund);
return createCorporation(corporationName, selfFund); return createCorporation(corporationName, selfFund);
}, },
hasUnlockUpgrade: function (aupgradeName: any): boolean { hasUnlockUpgrade: function (_upgradeName: unknown): boolean {
checkAccess("hasUnlockUpgrade"); checkAccess("hasUnlockUpgrade");
const upgradeName = helper.string("hasUnlockUpgrade", "upgradeName", aupgradeName); const upgradeName = helper.string("hasUnlockUpgrade", "upgradeName", _upgradeName);
return hasUnlockUpgrade(upgradeName); return hasUnlockUpgrade(upgradeName);
}, },
getUnlockUpgradeCost: function (aupgradeName: any): number { getUnlockUpgradeCost: function (_upgradeName: unknown): number {
checkAccess("getUnlockUpgradeCost"); checkAccess("getUnlockUpgradeCost");
const upgradeName = helper.string("getUnlockUpgradeCost", "upgradeName", aupgradeName); const upgradeName = helper.string("getUnlockUpgradeCost", "upgradeName", _upgradeName);
return getUnlockUpgradeCost(upgradeName); return getUnlockUpgradeCost(upgradeName);
}, },
getUpgradeLevel: function (aupgradeName: any): number { getUpgradeLevel: function (_upgradeName: unknown): number {
checkAccess("hasUnlockUpgrade"); checkAccess("hasUnlockUpgrade");
const upgradeName = helper.string("getUpgradeLevel", "upgradeName", aupgradeName); const upgradeName = helper.string("getUpgradeLevel", "upgradeName", _upgradeName);
return getUpgradeLevel(upgradeName); return getUpgradeLevel(upgradeName);
}, },
getUpgradeLevelCost: function (aupgradeName: any): number { getUpgradeLevelCost: function (_upgradeName: unknown): number {
checkAccess("getUpgradeLevelCost"); checkAccess("getUpgradeLevelCost");
const upgradeName = helper.string("getUpgradeLevelCost", "upgradeName", aupgradeName); const upgradeName = helper.string("getUpgradeLevelCost", "upgradeName", _upgradeName);
return getUpgradeLevelCost(upgradeName); return getUpgradeLevelCost(upgradeName);
}, },
getExpandIndustryCost: function (aindustryName: any): number { getExpandIndustryCost: function (_industryName: unknown): number {
checkAccess("getExpandIndustryCost"); checkAccess("getExpandIndustryCost");
const industryName = helper.string("getExpandIndustryCost", "industryName", aindustryName); const industryName = helper.string("getExpandIndustryCost", "industryName", _industryName);
return getExpandIndustryCost(industryName); return getExpandIndustryCost(industryName);
}, },
getExpandCityCost: function (): number { getExpandCityCost: function (): number {
@ -824,31 +892,31 @@ export function NetscriptCorporation(
checkAccess("acceptInvestmentOffer"); checkAccess("acceptInvestmentOffer");
return acceptInvestmentOffer(); return acceptInvestmentOffer();
}, },
goPublic: function (anumShares: any): boolean { goPublic: function (_numShares: unknown): boolean {
checkAccess("acceptInvestmentOffer"); checkAccess("acceptInvestmentOffer");
const numShares = helper.number("goPublic", "numShares", anumShares); const numShares = helper.number("goPublic", "numShares", _numShares);
return goPublic(numShares); return goPublic(numShares);
}, },
sellShares: function (anumShares: any): number { sellShares: function (_numShares: unknown): number {
checkAccess("acceptInvestmentOffer"); checkAccess("acceptInvestmentOffer");
const numShares = helper.number("sellStock", "numShares", anumShares); const numShares = helper.number("sellStock", "numShares", _numShares);
return SellShares(getCorporation(), player, numShares); return SellShares(getCorporation(), player, numShares);
}, },
buyBackShares: function (anumShares: any): boolean { buyBackShares: function (_numShares: unknown): boolean {
checkAccess("acceptInvestmentOffer"); checkAccess("acceptInvestmentOffer");
const numShares = helper.number("buyStock", "numShares", anumShares); const numShares = helper.number("buyStock", "numShares", _numShares);
return BuyBackShares(getCorporation(), player, numShares); return BuyBackShares(getCorporation(), player, numShares);
}, },
bribe: function (afactionName: string, aamountCash: any, aamountShares: any): boolean { bribe: function (_factionName: unknown, _amountCash: unknown, _amountShares: unknown): boolean {
checkAccess("bribe"); checkAccess("bribe");
const factionName = helper.string("bribe", "factionName", afactionName); const factionName = helper.string("bribe", "factionName", _factionName);
const amountCash = helper.number("bribe", "amountCash", aamountCash); const amountCash = helper.number("bribe", "amountCash", _amountCash);
const amountShares = helper.number("bribe", "amountShares", aamountShares); const amountShares = helper.number("bribe", "amountShares", _amountShares);
return bribe(factionName, amountCash, amountShares); return bribe(factionName, amountCash, amountShares);
}, },
getBonusTime: function (): number { getBonusTime: function (): number {
checkAccess("getBonusTime"); checkAccess("getBonusTime");
return Math.round(getCorporation().storedCycles / 5) * 1000; return Math.round(getCorporation().storedCycles / 5) * 1000;
} },
}; };
} }

@ -130,7 +130,9 @@ export function NetscriptSingularity(
augs = augs.filter((a) => a.factions.length > 1 || Factions[facName].augmentations.includes(a.name)); augs = augs.filter((a) => a.factions.length > 1 || Factions[facName].augmentations.includes(a.name));
// Remove blacklisted augs. // Remove blacklisted augs.
const blacklist = [AugmentationNames.NeuroFluxGovernor, AugmentationNames.TheRedPill]; const blacklist = [AugmentationNames.NeuroFluxGovernor, AugmentationNames.TheRedPill].map(
(augmentation) => augmentation as string,
);
augs = augs.filter((a) => !blacklist.includes(a.name)); augs = augs.filter((a) => !blacklist.includes(a.name));
} }

@ -2086,15 +2086,16 @@ export function reapplyAllAugmentations(this: IPlayer, resetMultipliers = true):
this.augmentations[i].name = "Hacknet Node NIC Architecture Neural-Upload"; this.augmentations[i].name = "Hacknet Node NIC Architecture Neural-Upload";
} }
const augName = this.augmentations[i].name; const playerAug = this.augmentations[i];
const augName = playerAug.name;
const aug = Augmentations[augName]; const aug = Augmentations[augName];
if (aug == null) { if (aug == null) {
console.warn(`Invalid augmentation name in Player.reapplyAllAugmentations(). Aug ${augName} will be skipped`); console.warn(`Invalid augmentation name in Player.reapplyAllAugmentations(). Aug ${augName} will be skipped`);
continue; continue;
} }
aug.owned = true; aug.owned = true;
if (aug.name == AugmentationNames.NeuroFluxGovernor) { if (augName == AugmentationNames.NeuroFluxGovernor) {
for (let j = 0; j < aug.level; ++j) { for (let j = 0; j < playerAug.level; ++j) {
applyAugmentation(this.augmentations[i], true); applyAugmentation(this.augmentations[i], true);
} }
continue; continue;

@ -586,7 +586,7 @@ export interface BitNodeMultipliers {
/** Influences the maximum allowed RAM for a purchased server */ /** Influences the maximum allowed RAM for a purchased server */
PurchasedServerMaxRam: number; PurchasedServerMaxRam: number;
/** Influences cost of any purchased server at or above 128GB */ /** Influences cost of any purchased server at or above 128GB */
PurchasedServerSoftCap: number; PurchasedServerSoftcap: number;
/** Influences the minimum favor the player must have with a faction before they can donate to gain rep. */ /** Influences the minimum favor the player must have with a faction before they can donate to gain rep. */
RepToDonateToFaction: number; RepToDonateToFaction: number;
/** Influences how much the money on a server can be reduced when a script performs a hack against it. */ /** Influences how much the money on a server can be reduced when a script performs a hack against it. */
@ -5709,7 +5709,7 @@ export interface NS extends Singularity {
* @param args - Arguments to identify the script * @param args - Arguments to identify the script
* @returns The info about the running script if found, and null otherwise. * @returns The info about the running script if found, and null otherwise.
*/ */
getRunningScript(filename?: FilenameOrPID, hostname?: string, ...args: (string | number)[]): RunningScript; getRunningScript(filename?: FilenameOrPID, hostname?: string, ...args: (string | number)[]): RunningScript | null;
/** /**
* Get cost of purchasing a server. * Get cost of purchasing a server.

@ -163,7 +163,7 @@ export class BaseServer {
return false; return false;
} }
removeContract(contract: CodingContract): void { removeContract(contract: CodingContract | string): void {
if (contract instanceof CodingContract) { if (contract instanceof CodingContract) {
this.contracts = this.contracts.filter((c) => { this.contracts = this.contracts.filter((c) => {
return c.fn !== contract.fn; return c.fn !== contract.fn;

@ -276,7 +276,7 @@ export function SidebarRoot(props: IProps): React.ReactElement {
function handleShortcuts(this: Document, event: KeyboardEvent): any { function handleShortcuts(this: Document, event: KeyboardEvent): any {
if (Settings.DisableHotkeys) return; if (Settings.DisableHotkeys) return;
if ((props.player.isWorking && props.player.focus) || redPillFlag) return; if ((props.player.isWorking && props.player.focus) || redPillFlag) return;
if (event.key === "t" && event.altKey) { if (event.key === KEY.T && event.altKey) {
event.preventDefault(); event.preventDefault();
clickTerminal(); clickTerminal();
} else if (event.key === KEY.C && event.altKey) { } else if (event.key === KEY.C && event.altKey) {
@ -522,7 +522,9 @@ export function SidebarRoot(props: IProps): React.ReactElement {
<ListItemIcon> <ListItemIcon>
<Badge badgeContent={invitationsCount !== 0 ? invitationsCount : undefined} color="error"> <Badge badgeContent={invitationsCount !== 0 ? invitationsCount : undefined} color="error">
<Tooltip title={!open ? "Factions" : ""}> <Tooltip title={!open ? "Factions" : ""}>
<ContactsIcon color={![Page.Factions, Page.Faction].includes(props.page) ? "secondary" : "primary"} /> <ContactsIcon
color={![Page.Factions, Page.Faction].includes(props.page) ? "secondary" : "primary"}
/>
</Tooltip> </Tooltip>
</Badge> </Badge>
</ListItemIcon> </ListItemIcon>
@ -570,7 +572,9 @@ export function SidebarRoot(props: IProps): React.ReactElement {
> >
<ListItemIcon> <ListItemIcon>
<Tooltip title={!open ? "Hacknet" : ""}> <Tooltip title={!open ? "Hacknet" : ""}>
<AccountTreeIcon color={flashHacknet ? "error" : props.page !== Page.Hacknet ? "secondary" : "primary"} /> <AccountTreeIcon
color={flashHacknet ? "error" : props.page !== Page.Hacknet ? "secondary" : "primary"}
/>
</Tooltip> </Tooltip>
</ListItemIcon> </ListItemIcon>
<ListItemText> <ListItemText>

@ -1,3 +1,4 @@
import { KEY } from "../utils/helpers/keyCodes";
import { substituteAliases } from "../Alias"; import { substituteAliases } from "../Alias";
// Helper function that checks if an argument (which is a string) is a valid number // Helper function that checks if an argument (which is a string) is a valid number
function isNumber(str: string): boolean { function isNumber(str: string): boolean {
@ -55,11 +56,11 @@ export function ParseCommand(command: string): (string | number | boolean)[] {
} }
const c = command.charAt(i); const c = command.charAt(i);
if (c === '"') { if (c === KEY.DOUBLE_QUOTE) {
// Double quotes // Double quotes
if (!escaped && prevChar === " ") { if (!escaped && prevChar === KEY.SPACE) {
const endQuote = command.indexOf('"', i + 1); const endQuote = command.indexOf(KEY.DOUBLE_QUOTE, i + 1);
if (endQuote !== -1 && (endQuote === command.length - 1 || command.charAt(endQuote + 1) === " ")) { if (endQuote !== -1 && (endQuote === command.length - 1 || command.charAt(endQuote + 1) === KEY.SPACE)) {
args.push(command.substr(i + 1, endQuote - i - 1)); args.push(command.substr(i + 1, endQuote - i - 1));
if (endQuote === command.length - 1) { if (endQuote === command.length - 1) {
start = i = endQuote + 1; start = i = endQuote + 1;
@ -69,15 +70,15 @@ export function ParseCommand(command: string): (string | number | boolean)[] {
continue; continue;
} }
} else if (inQuote === ``) { } else if (inQuote === ``) {
inQuote = `"`; inQuote = KEY.DOUBLE_QUOTE;
} else if (inQuote === `"`) { } else if (inQuote === KEY.DOUBLE_QUOTE) {
inQuote = ``; inQuote = ``;
} }
} else if (c === "'") { } else if (c === KEY.QUOTE) {
// Single quotes, same thing as above // Single quotes, same thing as above
if (!escaped && prevChar === " ") { if (!escaped && prevChar === KEY.SPACE) {
const endQuote = command.indexOf("'", i + 1); const endQuote = command.indexOf(KEY.QUOTE, i + 1);
if (endQuote !== -1 && (endQuote === command.length - 1 || command.charAt(endQuote + 1) === " ")) { if (endQuote !== -1 && (endQuote === command.length - 1 || command.charAt(endQuote + 1) === KEY.SPACE)) {
args.push(command.substr(i + 1, endQuote - i - 1)); args.push(command.substr(i + 1, endQuote - i - 1));
if (endQuote === command.length - 1) { if (endQuote === command.length - 1) {
start = i = endQuote + 1; start = i = endQuote + 1;
@ -87,11 +88,11 @@ export function ParseCommand(command: string): (string | number | boolean)[] {
continue; continue;
} }
} else if (inQuote === ``) { } else if (inQuote === ``) {
inQuote = `'`; inQuote = KEY.QUOTE;
} else if (inQuote === `'`) { } else if (inQuote === KEY.QUOTE) {
inQuote = ``; inQuote = ``;
} }
} else if (c === " " && inQuote === ``) { } else if (c === KEY.SPACE && inQuote === ``) {
const arg = command.substr(start, i - start); const arg = command.substr(start, i - start);
// If this is a number, convert it from a string to number // If this is a number, convert it from a string to number

@ -97,7 +97,7 @@ export function TerminalInput({ terminal, router, player }: IProps): React.React
break; break;
case "deletewordbefore": // Delete rest of word before the cursor case "deletewordbefore": // Delete rest of word before the cursor
for (let delStart = start - 1; delStart > -2; --delStart) { for (let delStart = start - 1; delStart > -2; --delStart) {
if ((inputText.charAt(delStart) === " " || delStart === -1) && delStart !== start - 1) { if ((inputText.charAt(delStart) === KEY.SPACE || delStart === -1) && delStart !== start - 1) {
saveValue(inputText.substr(0, delStart + 1) + inputText.substr(start), () => { saveValue(inputText.substr(0, delStart + 1) + inputText.substr(start), () => {
// Move cursor to correct location // Move cursor to correct location
// foo bar |baz bum --> foo |baz bum // foo bar |baz bum --> foo |baz bum
@ -110,7 +110,7 @@ export function TerminalInput({ terminal, router, player }: IProps): React.React
break; break;
case "deletewordafter": // Delete rest of word after the cursor, including trailing space case "deletewordafter": // Delete rest of word after the cursor, including trailing space
for (let delStart = start + 1; delStart <= value.length + 1; ++delStart) { for (let delStart = start + 1; delStart <= value.length + 1; ++delStart) {
if (inputText.charAt(delStart) === " " || delStart === value.length + 1) { if (inputText.charAt(delStart) === KEY.SPACE || delStart === value.length + 1) {
saveValue(inputText.substr(0, start) + inputText.substr(delStart + 1), () => { saveValue(inputText.substr(0, start) + inputText.substr(delStart + 1), () => {
// Move cursor to correct location // Move cursor to correct location
// foo bar |baz bum --> foo bar |bum // foo bar |baz bum --> foo bar |bum
@ -151,7 +151,7 @@ export function TerminalInput({ terminal, router, player }: IProps): React.React
break; break;
case "prevword": case "prevword":
for (let i = start - 2; i >= 0; --i) { for (let i = start - 2; i >= 0; --i) {
if (ref.value.charAt(i) === " ") { if (ref.value.charAt(i) === KEY.SPACE) {
ref.setSelectionRange(i + 1, i + 1); ref.setSelectionRange(i + 1, i + 1);
return; return;
} }
@ -163,7 +163,7 @@ export function TerminalInput({ terminal, router, player }: IProps): React.React
break; break;
case "nextword": case "nextword":
for (let i = start + 1; i <= inputLength; ++i) { for (let i = start + 1; i <= inputLength; ++i) {
if (ref.value.charAt(i) === " ") { if (ref.value.charAt(i) === KEY.SPACE) {
ref.setSelectionRange(i, i); ref.setSelectionRange(i, i);
return; return;
} }

@ -15,6 +15,8 @@ export enum KEY {
LEFT_ARROW = "ArrowLeft", LEFT_ARROW = "ArrowLeft",
RIGHT_ARROW = "ArrowRight", RIGHT_ARROW = "ArrowRight",
QUOTE = "'",
DOUBLE_QUOTE = '"',
OPEN_BRACKET = "[", OPEN_BRACKET = "[",
CLOSE_BRACKET = "]", CLOSE_BRACKET = "]",
LESS_THAN = "<", LESS_THAN = "<",