/* Script.js * Script object */ //Initialize the 'save and close' button on script editor page function scriptEditorInit() { var closeButton = document.getElementById("script-editor-save-and-close-button"); closeButton.addEventListener("click", function() { saveAndCloseScriptEditor(); return false; }); //Allow tabs (four spaces) in all textareas) var textareas = document.getElementsByTagName('textarea'); var count = textareas.length; for(var i=0;i CONSTANTS.MaxLogCapacity) { //Delete first element and add new log entry to the end. //TODO Eventually it might be better to replace this with circular array //to improve performance this.logs.shift(); } this.logs.push(txt); } Script.prototype.displayLog = function() { for (var i = 0; i < this.logs.length; ++i) { post(this.logs[i]); } } Script.prototype.toJSON = function() { return Generic_toJSON("Script", this); } Script.fromJSON = function(value) { return Generic_fromJSON(Script, value.data); } Reviver.constructors.Script = Script; //Called when the game is loaded. Loads all running scripts (from all servers) //into worker scripts so that they will start running loadAllRunningScripts = function() { var count = 0; for (var property in AllServers) { if (AllServers.hasOwnProperty(property)) { var server = AllServers[property]; //Reset each server's RAM usage to 0 server.ramUsed = 0; for (var j = 0; j < server.runningScripts.length; ++j) { count++; //runningScripts array contains only names, so find the actual script object var script = server.getScript(server.runningScripts[j]); if (script == null) {continue;} addWorkerScript(script, server); //Offline production scriptCalculateOfflineProduction(script); } } } console.log("Loaded " + count.toString() + " running scripts"); } scriptCalculateOfflineProduction = function(script) { //The Player object stores the last update time from when we were online var thisUpdate = new Date().getTime(); var lastUpdate = Player.lastUpdate; var timePassed = (thisUpdate - lastUpdate) / 1000; //Seconds console.log("Offline for " + timePassed + " seconds"); //Calculate the "confidence" rating of the script's true production. This is based //entirely off of time. We will arbitrarily say that if a script has been running for //4 hours (14400 sec) then we are completely confident in its ability var confidence = (script.onlineRunningTime) / 14400; if (confidence >= 1) {confidence = 1;} console.log("onlineRunningTime: " + script.onlineRunningTime); console.log("Confidence: " + confidence); var totalOfflineProduction = 0; for (var ip in script.moneyStolenMap) { if (script.moneyStolenMap.hasOwnProperty(ip)) { if (script.moneyStolenMap[ip] == 0 || script.moneyStolenMap[ip] == null) {continue;} var serv = AllServers[ip]; if (serv == null) {continue;} var production = 0.5 * script.moneyStolenMap[ip] / script.onlineRunningTime * timePassed; production *= confidence; if (production > serv.moneyAvailable) { production = serv.moneyAvailable; } totalOfflineProduction += production; Player.gainMoney(production); console.log(script.filename + " generated $" + production + " while offline by hacking " + serv.hostname); serv.moneyAvailable -= production; if (serv.moneyAvailable < 0) {serv.moneyAvailable = 0;} } } //A script's offline production will always be at most half of its online production. var expGain = (1/2) * (script.onlineExpGained / script.onlineRunningTime) * timePassed; expGain *= confidence; Player.gainHackingExp(expGain); //Update script stats script.offlineMoneyMade += totalOfflineProduction; script.offlineRunningTime += timePassed; script.offlineExpGained += expGain; //DEBUG var serverName = AllServers[script.server].hostname; console.log(script.filename + " from server " + serverName + " generated $" + totalOfflineProduction + " TOTAL while offline"); } //Creates a function that creates a map/dictionary with the IP of each existing server as //a key, and 0 as the value. This is used to keep track of how much money a script //hacks from that server function AllServersToMoneyMap() { for (var ip in AllServers) { if (AllServers.hasOwnProperty(ip)) { this[ip] = 0; } } } AllServersToMoneyMap.prototype.printConsole = function() { for (var ip in this) { if (this.hasOwnProperty(ip)) { var serv = AllServers[ip]; if (serv == null) { console.log("Warning null server encountered with ip: " + ip); continue; } } } }