(feat) optional threads argument to netscript functions hack, weaken, grow

This commit is contained in:
Mason Dechaineux 2019-05-03 18:01:43 +10:00 committed by danielyxie
parent 585e1ac7aa
commit 44c26165f4
3 changed files with 32 additions and 11 deletions

@ -155,6 +155,21 @@ export function makeRuntimeRejectMsg(workerScript, msg, exp=null) {
return "|"+workerScript.serverIp+"|"+workerScript.name+"|" + msg + lineNum; return "|"+workerScript.serverIp+"|"+workerScript.name+"|" + msg + lineNum;
} }
export function resolveNetscriptRequestedThreads(workerScript, functionName, requestedThreads) {
const threads = workerScript.scriptRef.threads;
if (!requestedThreads) {
return isNaN(threads) || threads < 1 ? 1 : threads;
}
const requestedThreadsAsInt = requestedThreads|0;
if (isNaN(requestedThreads) || requestedThreadsAsInt < 1) {
throw makeRuntimeRejectMsg(workerScript, `Invalid thread count passed to ${functionName}: ${requestedThreads}. Threads must be a positive number.`);
}
if (requestedThreads > threads) {
throw makeRuntimeRejectMsg(workerScript, `Too many threads requested by ${functionName}. Requested: ${requestedThreads}. Has: ${threads}.`);
}
return requestedThreadsAsInt;
}
//Run a script from inside a script using run() command //Run a script from inside a script using run() command
export function runScriptFromScript(server, scriptname, args, workerScript, threads=1) { export function runScriptFromScript(server, scriptname, args, workerScript, threads=1) {
//Check if the script is already running //Check if the script is already running

@ -113,7 +113,8 @@ import {
import { import {
makeRuntimeRejectMsg, makeRuntimeRejectMsg,
netscriptDelay, netscriptDelay,
runScriptFromScript resolveNetscriptRequestedThreads,
runScriptFromScript,
} from "./NetscriptEvaluator"; } from "./NetscriptEvaluator";
import { NetscriptPort } from "./NetscriptPort"; import { NetscriptPort } from "./NetscriptPort";
import { SleeveTaskType } from "./PersonObjects/Sleeve/SleeveTaskTypesEnum"; import { SleeveTaskType } from "./PersonObjects/Sleeve/SleeveTaskTypesEnum";
@ -467,7 +468,7 @@ function NetscriptFunctions(workerScript) {
} }
return out; return out;
}, },
hack : function(ip){ hack : function(ip, { threads: requestedThreads } = {}){
if (workerScript.checkingRam) { if (workerScript.checkingRam) {
return updateStaticRam("hack", CONSTANTS.ScriptHackRamCost); return updateStaticRam("hack", CONSTANTS.ScriptHackRamCost);
} }
@ -475,8 +476,7 @@ function NetscriptFunctions(workerScript) {
if (ip === undefined) { if (ip === undefined) {
throw makeRuntimeRejectMsg(workerScript, "Hack() call has incorrect number of arguments. Takes 1 argument"); throw makeRuntimeRejectMsg(workerScript, "Hack() call has incorrect number of arguments. Takes 1 argument");
} }
var threads = workerScript.scriptRef.threads; var threads = resolveNetscriptRequestedThreads(workerScript, "hack", requestedThreads);
if (isNaN(threads) || threads < 1) {threads = 1;}
var server = getServer(ip); var server = getServer(ip);
if (server == null) { if (server == null) {
workerScript.scriptRef.log("hack() error. Invalid IP or hostname passed in: " + ip + ". Stopping..."); workerScript.scriptRef.log("hack() error. Invalid IP or hostname passed in: " + ip + ". Stopping...");
@ -597,13 +597,12 @@ function NetscriptFunctions(workerScript) {
return Promise.resolve(true); return Promise.resolve(true);
}); });
}, },
grow : function(ip){ grow : function(ip, { threads: requestedThreads } = {}){
if (workerScript.checkingRam) { if (workerScript.checkingRam) {
return updateStaticRam("grow", CONSTANTS.ScriptGrowRamCost); return updateStaticRam("grow", CONSTANTS.ScriptGrowRamCost);
} }
updateDynamicRam("grow", CONSTANTS.ScriptGrowRamCost); updateDynamicRam("grow", CONSTANTS.ScriptGrowRamCost);
var threads = workerScript.scriptRef.threads; var threads = resolveNetscriptRequestedThreads(workerScript, "grow", requestedThreads);
if (isNaN(threads) || threads < 1) {threads = 1;}
if (ip === undefined) { if (ip === undefined) {
throw makeRuntimeRejectMsg(workerScript, "grow() call has incorrect number of arguments. Takes 1 argument"); throw makeRuntimeRejectMsg(workerScript, "grow() call has incorrect number of arguments. Takes 1 argument");
} }
@ -659,13 +658,12 @@ function NetscriptFunctions(workerScript) {
return numCycleForGrowth(server, Number(growth), Player); return numCycleForGrowth(server, Number(growth), Player);
}, },
weaken : function(ip) { weaken : function(ip, { threads: requestedThreads } = {}) {
if (workerScript.checkingRam) { if (workerScript.checkingRam) {
return updateStaticRam("weaken", CONSTANTS.ScriptWeakenRamCost); return updateStaticRam("weaken", CONSTANTS.ScriptWeakenRamCost);
} }
updateDynamicRam("weaken", CONSTANTS.ScriptWeakenRamCost); updateDynamicRam("weaken", CONSTANTS.ScriptWeakenRamCost);
var threads = workerScript.scriptRef.threads; var threads = resolveNetscriptRequestedThreads(workerScript, "weaken", requestedThreads)
if (isNaN(threads) || threads < 1) {threads = 1;}
if (ip === undefined) { if (ip === undefined) {
throw makeRuntimeRejectMsg(workerScript, "weaken() call has incorrect number of arguments. Takes 1 argument"); throw makeRuntimeRejectMsg(workerScript, "weaken() call has incorrect number of arguments. Takes 1 argument");
} }

@ -219,9 +219,17 @@ function startNetscript1Script(workerScript) {
name === "prompt" || name === "run" || name === "exec") { name === "prompt" || name === "run" || name === "exec") {
let tempWrapper = function() { let tempWrapper = function() {
let fnArgs = []; let fnArgs = [];
//All of the Object/array elements are in JSInterpreter format, so
//we have to convert them back to native format to pass them to these fns
for (let i = 0; i < arguments.length-1; ++i) { for (let i = 0; i < arguments.length-1; ++i) {
if (typeof arguments[i] === 'object' || arguments[i].constructor === Array) {
fnArgs.push(int.pseudoToNative(arguments[i]));
} else {
fnArgs.push(arguments[i]); fnArgs.push(arguments[i]);
} }
}
console.log(fnArgs);
let cb = arguments[arguments.length-1]; let cb = arguments[arguments.length-1];
let fnPromise = entry.apply(null, fnArgs); let fnPromise = entry.apply(null, fnArgs);
fnPromise.then(function(res) { fnPromise.then(function(res) {