diff --git a/src/NetscriptFunctions.ts b/src/NetscriptFunctions.ts index bb2d24c49..047e340dd 100644 --- a/src/NetscriptFunctions.ts +++ b/src/NetscriptFunctions.ts @@ -174,7 +174,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { throw makeRuntimeRejectMsg( workerScript, `Invalid scriptArgs argument passed into getRunningScript() from ${callingFnName}(). ` + - `This is probably a bug. Please report to game developer`, + `This is probably a bug. Please report to game developer`, ); } @@ -425,19 +425,21 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { const helper = { updateDynamicRam: updateDynamicRam, makeRuntimeErrorMsg: makeRuntimeErrorMsg, - string: (funcName: string, argName: string, v: any): string => { + string: (funcName: string, argName: string, v: unknown): string => { if (typeof v === "string") return v; if (typeof v === "number") return v + ""; // cast to string; throw makeRuntimeErrorMsg(funcName, `${argName} should be a string`); }, - number: (funcName: string, argName: string, v: any): number => { - if (!isNaN(v)) { - if (typeof v === "number") return v; - if (!isNaN(parseFloat(v))) return parseFloat(v); + number: (funcName: string, argName: string, v: unknown): number => { + if (typeof v === "string") { + const x = parseFloat(v); + if (!isNaN(x)) return x; // otherwise it wasn't even a string representing a number. + } else if (typeof v === "number") { + return v; } throw makeRuntimeErrorMsg(funcName, `${argName} should be a number`); }, - boolean: (v: any): boolean => { + boolean: (v: unknown): boolean => { return !!v; // Just convert it to boolean. }, getServer: safeGetServer, @@ -467,7 +469,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { const gang = NetscriptGang(Player, workerScript, helper); const sleeve = NetscriptSleeve(Player, workerScript, helper); - const extra = NetscriptExtra(Player, workerScript); + const extra = NetscriptExtra(Player, workerScript, helper); const hacknet = NetscriptHacknet(Player, workerScript, helper); const stanek = NetscriptStanek(Player, workerScript, helper); const bladeburner = NetscriptBladeburner(Player, workerScript, helper); @@ -696,7 +698,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { workerScript.log( "weaken", () => - `'${server.hostname}' security level weakened to ${server.hackDifficulty + `'${server.hostname}' security level weakened to ${ + server.hackDifficulty }. Gained ${numeralWrapper.formatExp(expGain)} hacking exp (t=${numeralWrapper.formatThreads(threads)})`, ); workerScript.scriptRef.onlineExpGained += expGain; @@ -1665,7 +1668,10 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { const cost = getPurchaseServerCost(ram); if (cost === Infinity) { if (ram > getPurchaseServerMaxRam()) { - workerScript.log("purchaseServer", () => `Invalid argument: ram='${ram}' must not be greater than getPurchaseServerMaxRam`); + workerScript.log( + "purchaseServer", + () => `Invalid argument: ram='${ram}' must not be greater than getPurchaseServerMaxRam`, + ); } else { workerScript.log("purchaseServer", () => `Invalid argument: ram='${ram}' must be a positive power of 2`); } @@ -2312,7 +2318,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS { if (typeof f !== "function") { throw makeRuntimeErrorMsg("atExit", "argument should be function"); } - workerScript.atExit = () => { f(); }; // Wrap the user function to prevent WorkerScript leaking as 'this' + workerScript.atExit = () => { + f(); + }; // Wrap the user function to prevent WorkerScript leaking as 'this' }, mv: function (host: string, source: string, destination: string): void { updateDynamicRam("mv", getRamCost(Player, "mv")); diff --git a/src/NetscriptFunctions/Extra.ts b/src/NetscriptFunctions/Extra.ts index 9c1dd3d81..018c2b41f 100644 --- a/src/NetscriptFunctions/Extra.ts +++ b/src/NetscriptFunctions/Extra.ts @@ -2,6 +2,7 @@ import { WorkerScript } from "../Netscript/WorkerScript"; import { IPlayer } from "../PersonObjects/IPlayer"; import { Exploit } from "../Exploits/Exploit"; import * as bcrypt from "bcryptjs"; +import { INetscriptHelper } from "./INetscriptHelper"; export interface INetscriptExtra { heart: { @@ -13,7 +14,7 @@ export interface INetscriptExtra { rainbow(guess: string): void; } -export function NetscriptExtra(player: IPlayer, workerScript: WorkerScript): INetscriptExtra { +export function NetscriptExtra(player: IPlayer, workerScript: WorkerScript, helper: INetscriptHelper): INetscriptExtra { return { heart: { // Easter egg function @@ -24,17 +25,18 @@ export function NetscriptExtra(player: IPlayer, workerScript: WorkerScript): INe exploit: function (): void { player.giveExploit(Exploit.UndocumentedFunctionCall); }, - bypass: function (doc: any): void { + bypass: function (doc: unknown): void { // reset both fields first - doc.completely_unused_field = undefined; + const d = doc as any; + d.completely_unused_field = undefined; const real_document: any = document; real_document.completely_unused_field = undefined; // set one to true and check that it affected the other. real_document.completely_unused_field = true; - if (doc.completely_unused_field && workerScript.ramUsage === 1.6) { + if (d.completely_unused_field && workerScript.ramUsage === 1.6) { player.giveExploit(Exploit.Bypass); } - doc.completely_unused_field = undefined; + d.completely_unused_field = undefined; real_document.completely_unused_field = undefined; }, alterReality: function (): void { @@ -55,7 +57,7 @@ export function NetscriptExtra(player: IPlayer, workerScript: WorkerScript): INe rainbow: function (guess: unknown): void { async function tryGuess(): Promise { const verified = await bcrypt.compare( - guess + "", + helper.string("rainbow", "guess", guess), "$2a$10$aertxDEkgor8baVtQDZsLuMwwGYmkRM/ohcA6FjmmzIHQeTCsrCcO", ); if (verified) { diff --git a/src/NetscriptFunctions/Formulas.ts b/src/NetscriptFunctions/Formulas.ts index bcb3d881f..dbfdba566 100644 --- a/src/NetscriptFunctions/Formulas.ts +++ b/src/NetscriptFunctions/Formulas.ts @@ -38,40 +38,6 @@ import { calculateAscensionPointsGain, } from "../Gang/formulas/formulas"; -export interface INetscriptFormulas { - skills: { - calculateSkill(exp: any, mult?: any): any; - calculateExp(skill: any, mult?: any): any; - }; - hacking: { - hackChance(server: any, player: any): any; - hackExp(server: any, player: any): any; - hackPercent(server: any, player: any): any; - growPercent(server: any, threads: any, player: any, cores?: any): any; - hackTime(server: any, player: any): any; - growTime(server: any, player: any): any; - weakenTime(server: any, player: any): any; - }; - hacknetNodes: { - moneyGainRate(level: any, ram: any, cores: any, mult?: any): any; - levelUpgradeCost(startingLevel: any, extraLevels?: any, costMult?: any): any; - ramUpgradeCost(startingRam: any, extraLevels?: any, costMult?: any): any; - coreUpgradeCost(startingCore: any, extraCores?: any, costMult?: any): any; - hacknetNodeCost(n: any, mult: any): any; - constants(): any; - }; - hacknetServers: { - hashGainRate(level: any, ramUsed: any, maxRam: any, cores: any, mult?: any): any; - levelUpgradeCost(startingLevel: any, extraLevels?: any, costMult?: any): any; - ramUpgradeCost(startingRam: any, extraLevels?: any, costMult?: any): any; - coreUpgradeCost(startingCore: any, extraCores?: any, costMult?: any): any; - cacheUpgradeCost(startingCache: any, extraCache?: any): any; - hashUpgradeCost(upgName: any, level: any): any; - hacknetServerCost(n: any, mult: any): any; - constants(): any; - }; -} - export function NetscriptFormulas(player: IPlayer, workerScript: WorkerScript, helper: INetscriptHelper): IFormulas { const checkFormulasAccess = function (func: string): void { if (!player.hasProgram(Programs.Formulas.name)) { @@ -80,63 +46,84 @@ export function NetscriptFormulas(player: IPlayer, workerScript: WorkerScript, h }; return { skills: { - calculateSkill: function (exp: any, mult: any = 1): any { + calculateSkill: function (_exp: unknown, _mult: unknown = 1): number { + const exp = helper.number("calculateSkill", "exp", _exp); + const mult = helper.number("calculateSkill", "mult", _mult); checkFormulasAccess("skills.calculateSkill"); return calculateSkill(exp, mult); }, - calculateExp: function (skill: any, mult: any = 1): any { + calculateExp: function (_skill: unknown, _mult: unknown = 1): number { + const skill = helper.number("calculateExp", "skill", _skill); + const mult = helper.number("calculateExp", "mult", _mult); checkFormulasAccess("skills.calculateExp"); return calculateExp(skill, mult); }, }, hacking: { - hackChance: function (server: any, player: any): any { + hackChance: function (server: any, player: any): number { checkFormulasAccess("hacking.hackChance"); return calculateHackingChance(server, player); }, - hackExp: function (server: any, player: any): any { + hackExp: function (server: any, player: any): number { checkFormulasAccess("hacking.hackExp"); return calculateHackingExpGain(server, player); }, - hackPercent: function (server: any, player: any): any { + hackPercent: function (server: any, player: any): number { checkFormulasAccess("hacking.hackPercent"); return calculatePercentMoneyHacked(server, player); }, - growPercent: function (server: any, threads: any, player: any, cores: any = 1): any { + growPercent: function (server: any, _threads: unknown, player: any, _cores: unknown = 1): number { + const threads = helper.number("growPercent", "threads", _threads); + const cores = helper.number("growPercent", "cores", _cores); checkFormulasAccess("hacking.growPercent"); return calculateServerGrowth(server, threads, player, cores); }, - hackTime: function (server: any, player: any): any { + hackTime: function (server: any, player: any): number { checkFormulasAccess("hacking.hackTime"); return calculateHackingTime(server, player) * 1000; }, - growTime: function (server: any, player: any): any { + growTime: function (server: any, player: any): number { checkFormulasAccess("hacking.growTime"); return calculateGrowTime(server, player) * 1000; }, - weakenTime: function (server: any, player: any): any { + weakenTime: function (server: any, player: any): number { checkFormulasAccess("hacking.weakenTime"); return calculateWeakenTime(server, player) * 1000; }, }, hacknetNodes: { - moneyGainRate: function (level: any, ram: any, cores: any, mult: any = 1): any { + moneyGainRate: function (_level: unknown, _ram: unknown, _cores: unknown, _mult: unknown = 1): number { + const level = helper.number("moneyGainRate", "level", _level); + const ram = helper.number("moneyGainRate", "ram", _ram); + const cores = helper.number("moneyGainRate", "cores", _cores); + const mult = helper.number("moneyGainRate", "mult", _mult); checkFormulasAccess("hacknetNodes.moneyGainRate"); return calculateMoneyGainRate(level, ram, cores, mult); }, - levelUpgradeCost: function (startingLevel: any, extraLevels: any = 1, costMult: any = 1): any { + levelUpgradeCost: function (_startingLevel: unknown, _extraLevels: unknown = 1, _costMult: unknown = 1): number { + const startingLevel = helper.number("levelUpgradeCost", "startingLevel", _startingLevel); + const extraLevels = helper.number("levelUpgradeCost", "extraLevels", _extraLevels); + const costMult = helper.number("levelUpgradeCost", "costMult", _costMult); checkFormulasAccess("hacknetNodes.levelUpgradeCost"); return calculateLevelUpgradeCost(startingLevel, extraLevels, costMult); }, - ramUpgradeCost: function (startingRam: any, extraLevels: any = 1, costMult: any = 1): any { + ramUpgradeCost: function (_startingRam: unknown, _extraLevels: unknown = 1, _costMult: unknown = 1): number { + const startingRam = helper.number("ramUpgradeCost", "startingRam", _startingRam); + const extraLevels = helper.number("ramUpgradeCost", "extraLevels", _extraLevels); + const costMult = helper.number("ramUpgradeCost", "costMult", _costMult); checkFormulasAccess("hacknetNodes.ramUpgradeCost"); return calculateRamUpgradeCost(startingRam, extraLevels, costMult); }, - coreUpgradeCost: function (startingCore: any, extraCores: any = 1, costMult: any = 1): any { + coreUpgradeCost: function (_startingCore: unknown, _extraCores: unknown = 1, _costMult: unknown = 1): number { + const startingCore = helper.number("coreUpgradeCost", "startingCore", _startingCore); + const extraCores = helper.number("coreUpgradeCost", "extraCores", _extraCores); + const costMult = helper.number("coreUpgradeCost", "costMult", _costMult); checkFormulasAccess("hacknetNodes.coreUpgradeCost"); return calculateCoreUpgradeCost(startingCore, extraCores, costMult); }, - hacknetNodeCost: function (n: any, mult: any): any { + hacknetNodeCost: function (_n: unknown, _mult: unknown): number { + const n = helper.number("hacknetNodeCost", "n", _n); + const mult = helper.number("hacknetNodeCost", "mult", _mult); checkFormulasAccess("hacknetNodes.hacknetNodeCost"); return calculateNodeCost(n, mult); }, @@ -146,27 +133,51 @@ export function NetscriptFormulas(player: IPlayer, workerScript: WorkerScript, h }, }, hacknetServers: { - hashGainRate: function (level: any, ramUsed: any, maxRam: any, cores: any, mult: any = 1): any { + hashGainRate: function ( + _level: unknown, + _ramUsed: unknown, + _maxRam: unknown, + _cores: unknown, + _mult: unknown = 1, + ): number { + const level = helper.number("hashGainRate", "level", _level); + const ramUsed = helper.number("hashGainRate", "ramUsed", _ramUsed); + const maxRam = helper.number("hashGainRate", "maxRam", _maxRam); + const cores = helper.number("hashGainRate", "cores", _cores); + const mult = helper.number("hashGainRate", "mult", _mult); checkFormulasAccess("hacknetServers.hashGainRate"); return HScalculateHashGainRate(level, ramUsed, maxRam, cores, mult); }, - levelUpgradeCost: function (startingLevel: any, extraLevels: any = 1, costMult: any = 1): any { + levelUpgradeCost: function (_startingLevel: unknown, _extraLevels: unknown = 1, _costMult: unknown = 1): number { + const startingLevel = helper.number("levelUpgradeCost", "startingLevel", _startingLevel); + const extraLevels = helper.number("levelUpgradeCost", "extraLevels", _extraLevels); + const costMult = helper.number("levelUpgradeCost", "costMult", _costMult); checkFormulasAccess("hacknetServers.levelUpgradeCost"); return HScalculateLevelUpgradeCost(startingLevel, extraLevels, costMult); }, - ramUpgradeCost: function (startingRam: any, extraLevels: any = 1, costMult: any = 1): any { + ramUpgradeCost: function (_startingRam: unknown, _extraLevels: unknown = 1, _costMult: unknown = 1): number { + const startingRam = helper.number("ramUpgradeCost", "startingRam", _startingRam); + const extraLevels = helper.number("ramUpgradeCost", "extraLevels", _extraLevels); + const costMult = helper.number("ramUpgradeCost", "costMult", _costMult); checkFormulasAccess("hacknetServers.ramUpgradeCost"); return HScalculateRamUpgradeCost(startingRam, extraLevels, costMult); }, - coreUpgradeCost: function (startingCore: any, extraCores: any = 1, costMult: any = 1): any { + coreUpgradeCost: function (_startingCore: unknown, _extraCores: unknown = 1, _costMult: unknown = 1): number { + const startingCore = helper.number("coreUpgradeCost", "startingCore", _startingCore); + const extraCores = helper.number("coreUpgradeCost", "extraCores", _extraCores); + const costMult = helper.number("coreUpgradeCost", "costMult", _costMult); checkFormulasAccess("hacknetServers.coreUpgradeCost"); return HScalculateCoreUpgradeCost(startingCore, extraCores, costMult); }, - cacheUpgradeCost: function (startingCache: any, extraCache: any = 1): any { + cacheUpgradeCost: function (_startingCache: unknown, _extraCache: unknown = 1): number { + const startingCache = helper.number("cacheUpgradeCost", "startingCache", _startingCache); + const extraCache = helper.number("cacheUpgradeCost", "extraCache", _extraCache); checkFormulasAccess("hacknetServers.cacheUpgradeCost"); return HScalculateCacheUpgradeCost(startingCache, extraCache); }, - hashUpgradeCost: function (upgName: any, level: any): any { + hashUpgradeCost: function (_upgName: unknown, _level: unknown): number { + const upgName = helper.string("hashUpgradeCost", "upgName", _upgName); + const level = helper.number("hashUpgradeCost", "level", _level); checkFormulasAccess("hacknetServers.hashUpgradeCost"); const upg = player.hashManager.getUpgrade(upgName); if (!upg) { @@ -177,7 +188,9 @@ export function NetscriptFormulas(player: IPlayer, workerScript: WorkerScript, h } return upg.getCost(level); }, - hacknetServerCost: function (n: any, mult: any = 1): any { + hacknetServerCost: function (_n: unknown, _mult: unknown = 1): number { + const n = helper.number("hacknetServerCost", "n", _n); + const mult = helper.number("hacknetServerCost", "mult", _mult); checkFormulasAccess("hacknetServers.hacknetServerCost"); return HScalculateServerCost(n, mult); }, @@ -203,11 +216,13 @@ export function NetscriptFormulas(player: IPlayer, workerScript: WorkerScript, h checkFormulasAccess("gang.moneyGain"); return calculateMoneyGain(gang, member, task); }, - ascensionPointsGain: function (exp: any): number { + ascensionPointsGain: function (_exp: unknown): number { + const exp = helper.number("ascensionPointsGain", "exp", _exp); checkFormulasAccess("gang.ascensionPointsGain"); return calculateAscensionPointsGain(exp); }, - ascensionMultiplier: function (points: any): number { + ascensionMultiplier: function (_points: unknown): number { + const points = helper.number("ascensionMultiplier", "points", _points); checkFormulasAccess("gang.ascensionMultiplier"); return calculateAscensionMult(points); }, diff --git a/src/NetscriptFunctions/INetscriptHelper.ts b/src/NetscriptFunctions/INetscriptHelper.ts index c7bf42368..72102f047 100644 --- a/src/NetscriptFunctions/INetscriptHelper.ts +++ b/src/NetscriptFunctions/INetscriptHelper.ts @@ -3,9 +3,9 @@ import { BaseServer } from "../Server/BaseServer"; export interface INetscriptHelper { updateDynamicRam(functionName: string, ram: number): void; makeRuntimeErrorMsg(functionName: string, message: string): void; - string(funcName: string, argName: string, v: any): string; - number(funcName: string, argName: string, v: any): number; - boolean(v: any): boolean; + string(funcName: string, argName: string, v: unknown): string; + number(funcName: string, argName: string, v: unknown): number; + boolean(v: unknown): boolean; getServer(ip: any, fn: any): BaseServer; checkSingularityAccess(func: string): void; hack(hostname: string, manual: boolean): Promise;