From 5af10c84068c0df30ce760d9e720b555dd6a8de0 Mon Sep 17 00:00:00 2001 From: Olivier Gagnon Date: Mon, 10 May 2021 20:11:03 -0400 Subject: [PATCH] Offline money gain is based off hacking exp / time since last aug instead --- src/DevMenu.jsx | 24 +++++++++++++ src/NetscriptWorker.js | 5 +-- src/Script/ScriptHelpers.js | 69 ++++++++----------------------------- src/engine.jsx | 48 +++++++++++++++++++++++--- 4 files changed, 83 insertions(+), 63 deletions(-) diff --git a/src/DevMenu.jsx b/src/DevMenu.jsx index fd19c44eb..cd0f3592f 100644 --- a/src/DevMenu.jsx +++ b/src/DevMenu.jsx @@ -15,6 +15,8 @@ import { GetServerByHostname } from "./Server/ServerHelpers"; import { hackWorldDaemon } from "./RedPill"; import { StockMarket } from "./StockMarket/StockMarket"; import { Stock } from "./StockMarket/Stock"; +import { Engine, indexedDb } from "./engine"; +import { saveObject } from "./SaveObject"; import { dialogBoxCreate } from "../utils/DialogBox"; import { createElement } from "../utils/uiHelpers/createElement"; @@ -641,6 +643,15 @@ class DevMenuComponent extends Component { } } + timeskip(time) { + return () => { + Player.lastUpdate -= time; + Engine._lastUpdate -= time; + saveObject.saveGame(indexedDb); + setTimeout(() => location.reload(), 1000); + }; + } + render() { let factions = []; for (const i in Factions) { @@ -1212,6 +1223,19 @@ class DevMenuComponent extends Component { +
+
+
+

Offline time skip:

+
+
+ + + +
+
+
+ ); } diff --git a/src/NetscriptWorker.js b/src/NetscriptWorker.js index d721b7716..cd38ea37e 100644 --- a/src/NetscriptWorker.js +++ b/src/NetscriptWorker.js @@ -564,7 +564,6 @@ export function updateOnlineScriptTimes(numCycles = 1) { * into worker scripts so that they will start running */ export function loadAllRunningScripts() { - var total = 0; let skipScriptLoad = (window.location.href.toLowerCase().indexOf("?noscripts") !== -1); if (skipScriptLoad) { console.info("Skipping the load of any scripts during startup"); } for (const property in AllServers) { @@ -587,13 +586,11 @@ export function loadAllRunningScripts() { createAndAddWorkerScript(server.runningScripts[j], server); // Offline production - total += scriptCalculateOfflineProduction(server.runningScripts[j]); + scriptCalculateOfflineProduction(server.runningScripts[j]); } } } } - - return total; } /** diff --git a/src/Script/ScriptHelpers.js b/src/Script/ScriptHelpers.js index 10cbcf257..9d6fde7b1 100644 --- a/src/Script/ScriptHelpers.js +++ b/src/Script/ScriptHelpers.js @@ -311,90 +311,51 @@ function saveAndCloseScriptEditor() { export function scriptCalculateOfflineProduction(runningScriptObj) { //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 + const thisUpdate = new Date().getTime(); + const lastUpdate = Player.lastUpdate; + const timePassed = (thisUpdate - lastUpdate) / 1000; //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 = (runningScriptObj.onlineRunningTime) / 14400; + let confidence = (runningScriptObj.onlineRunningTime) / 14400; if (confidence >= 1) {confidence = 1;} //Data map: [MoneyStolen, NumTimesHacked, NumTimesGrown, NumTimesWeaken] // Grow - for (var ip in runningScriptObj.dataMap) { + for (const ip in runningScriptObj.dataMap) { if (runningScriptObj.dataMap.hasOwnProperty(ip)) { if (runningScriptObj.dataMap[ip][2] == 0 || runningScriptObj.dataMap[ip][2] == null) {continue;} - var serv = AllServers[ip]; + const serv = AllServers[ip]; if (serv == null) {continue;} - var timesGrown = Math.round(0.5 * runningScriptObj.dataMap[ip][2] / runningScriptObj.onlineRunningTime * timePassed); - runningScriptObj.log("Called grow() on " + serv.hostname + " " + timesGrown + " times while offline"); - var growth = processSingleServerGrowth(serv, timesGrown, Player); - runningScriptObj.log(serv.hostname + " grown by " + numeralWrapper.format(growth * 100 - 100, '0.000000%') + " from grow() calls made while offline"); - } - } - - // Money from hacking - var totalOfflineProduction = 0; - for (var ip in runningScriptObj.dataMap) { - if (runningScriptObj.dataMap.hasOwnProperty(ip)) { - if (runningScriptObj.dataMap[ip][0] == 0 || runningScriptObj.dataMap[ip][0] == null) {continue;} - var serv = AllServers[ip]; - if (serv == null) {continue;} - var production = 0.5 * runningScriptObj.dataMap[ip][0] / runningScriptObj.onlineRunningTime * timePassed; - production *= confidence; - if (production > serv.moneyAvailable) { - production = serv.moneyAvailable; - } - totalOfflineProduction += production; - Player.gainMoney(production); - Player.recordMoneySource(production, "hacking"); - runningScriptObj.log(runningScriptObj.filename + " generated $" + production + " while offline by hacking " + serv.hostname); - serv.moneyAvailable -= production; - if (serv.moneyAvailable < 0) {serv.moneyAvailable = 0;} - if (isNaN(serv.moneyAvailable)) {serv.moneyAvailable = 0;} + const timesGrown = Math.round(0.5 * runningScriptObj.dataMap[ip][2] / runningScriptObj.onlineRunningTime * timePassed); + runningScriptObj.log(`Called on ${serv.hostname} ${timesGrown} times while offline`); + const growth = processSingleServerGrowth(serv, timesGrown, Player); + runningScriptObj.log(`'${serv.hostname}' grown by ${numeralWrapper.format(growth * 100 - 100, '0.000000%')} while offline`); } } // Offline EXP gain // A script's offline production will always be at most half of its online production. - var expGain = 0.5 * (runningScriptObj.onlineExpGained / runningScriptObj.onlineRunningTime) * timePassed; - expGain *= confidence; - + const expGain = confidence * (runningScriptObj.onlineExpGained / runningScriptObj.onlineRunningTime) * timePassed; Player.gainHackingExp(expGain); // Update script stats - runningScriptObj.offlineMoneyMade += totalOfflineProduction; runningScriptObj.offlineRunningTime += timePassed; runningScriptObj.offlineExpGained += expGain; - // Fortify a server's security based on how many times it was hacked - for (var ip in runningScriptObj.dataMap) { - if (runningScriptObj.dataMap.hasOwnProperty(ip)) { - if (runningScriptObj.dataMap[ip][1] == 0 || runningScriptObj.dataMap[ip][1] == null) {continue;} - var serv = AllServers[ip]; - if (serv == null) {continue;} - var timesHacked = Math.round(0.5 * runningScriptObj.dataMap[ip][1] / runningScriptObj.onlineRunningTime * timePassed); - runningScriptObj.log("Hacked " + serv.hostname + " " + timesHacked + " times while offline"); - serv.fortify(CONSTANTS.ServerFortifyAmount * timesHacked); - } - } - // Weaken - for (var ip in runningScriptObj.dataMap) { + for (const ip in runningScriptObj.dataMap) { if (runningScriptObj.dataMap.hasOwnProperty(ip)) { if (runningScriptObj.dataMap[ip][3] == 0 || runningScriptObj.dataMap[ip][3] == null) {continue;} - var serv = AllServers[ip]; + const serv = AllServers[ip]; if (serv == null) {continue;} - var timesWeakened = Math.round(0.5 * runningScriptObj.dataMap[ip][3] / runningScriptObj.onlineRunningTime * timePassed); - runningScriptObj.log("Called weaken() on " + serv.hostname + " " + timesWeakened + " times while offline"); + const timesWeakened = Math.round(0.5 * runningScriptObj.dataMap[ip][3] / runningScriptObj.onlineRunningTime * timePassed); + runningScriptObj.log(`Called weaken() on ${serv.hostname} ${timesWeakened} times while offline`); serv.weaken(CONSTANTS.ServerWeakenAmount * timesWeakened); } } - - return totalOfflineProduction; } //Returns a RunningScript object matching the filename and arguments on the diff --git a/src/engine.jsx b/src/engine.jsx index bfd4d761f..540328fa3 100644 --- a/src/engine.jsx +++ b/src/engine.jsx @@ -32,6 +32,11 @@ import { processPassiveFactionRepGain, inviteToFaction, } from "./Faction/FactionHelpers"; +import { + getHackingWorkRepGain, + getFactionSecurityWorkRepGain, + getFactionFieldWorkRepGain, +} from "./PersonObjects/formulas/reputation"; import { FconfSettings } from "./Fconf/FconfSettings"; import { hasHacknetServers, @@ -91,6 +96,7 @@ import { Page, routing } from "./ui/navigationTracking"; import { setSettingsLabels } from "./ui/setSettingsLabels"; import { Money } from "./ui/React/Money"; import { Hashes } from "./ui/React/Hashes"; +import { Reputation } from "./ui/React/Reputation"; import { ActiveScriptsRoot } from "./ui/ActiveScripts/Root"; import { initializeMainMenuHeaders } from "./ui/MainMenu/Headers"; @@ -1079,11 +1085,15 @@ const Engine = { // Calculate the number of cycles have elapsed while offline Engine._lastUpdate = new Date().getTime(); - var lastUpdate = Player.lastUpdate; - var numCyclesOffline = Math.floor((Engine._lastUpdate - lastUpdate) / Engine._idleSpeed); + const lastUpdate = Player.lastUpdate; + const timeOffline = Engine._lastUpdate - lastUpdate; + const numCyclesOffline = Math.floor(timeOffline / Engine._idleSpeed); + let offlineReputation = 0 + const offlineHackingIncome = Player.moneySourceA.hacking/(Player.playtimeSinceLastAug)*timeOffline*0.75; + Player.gainMoney(offlineHackingIncome); // Process offline progress - var offlineProductionFromScripts = loadAllRunningScripts(); // This also takes care of offline production for those scripts + loadAllRunningScripts(); // This also takes care of offline production for those scripts if (Player.isWorking) { if (Player.workType == CONSTANTS.WorkTypeFaction) { Player.workForFaction(numCyclesOffline); @@ -1098,6 +1108,31 @@ const Engine = { } else { Player.work(numCyclesOffline); } + } else { + + for(let i = 0; i < Player.factions.length; i++) { + const facName = Player.factions[i]; + if (!Factions.hasOwnProperty(facName)) continue; + const faction = Factions[facName]; + if (!faction.isMember) continue; + // No rep for special factions. + const info = faction.getInfo(); + if(!info.offersWork()) continue; + // No rep for gangs. + if(Player.getGangName() === facName) continue; + + + const hRep = getHackingWorkRepGain(Player, faction); + const sRep = getFactionSecurityWorkRepGain(Player, faction); + const fRep = getFactionFieldWorkRepGain(Player, faction); + // can be infinite, doesn't matter. + const reputationRate = Math.max(hRep, sRep, fRep) / Player.factions.length; + + const rep = reputationRate * + (numCyclesOffline); + faction.playerReputation += rep + offlineReputation += rep; + } } // Hacknet Nodes offline progress @@ -1157,7 +1192,10 @@ const Engine = { removeLoadingScreen(); const timeOfflineString = convertTimeMsToTimeElapsedString(time); dialogBoxCreate(<> - Offline for {timeOfflineString}. While you were offline, your scripts generated {Money(offlineProductionFromScripts)} and your Hacknet Nodes generated {hacknetProdInfo}. + Offline for {timeOfflineString}. While you were offline, your scripts + generated {Money(offlineHackingIncome)}, your Hacknet Nodes + generated {hacknetProdInfo} and you + gained {Reputation(offlineReputation)} divided amongst your factions. ); // Close main menu accordions for loaded game var visibleMenuTabs = [terminal, createScript, activeScripts, stats, @@ -1599,4 +1637,4 @@ window.onload = function() { } }; -export {Engine}; +export {Engine, indexedDb};