bitburner-src/src/Script/RunningScript.ts

147 lines
3.9 KiB
TypeScript
Raw Normal View History

/**
* Class representing a Script instance that is actively running.
* A Script can have multiple active instances
*/
import { Script } from "./Script";
import { FconfSettings } from "../Fconf/FconfSettings";
import { Settings } from "../Settings/Settings";
import { IMap } from "../types";
import { post } from "../ui/postToTerminal";
import {
2021-09-05 01:09:30 +02:00
Generic_fromJSON,
Generic_toJSON,
Reviver,
} from "../../utils/JSONReviver";
import { getTimestamp } from "../../utils/helpers/getTimestamp";
2019-03-03 04:15:10 +01:00
export class RunningScript {
2021-09-05 01:09:30 +02:00
// Script arguments
args: any[] = [];
2019-03-03 04:15:10 +01:00
2021-09-05 01:09:30 +02:00
// Map of [key: server ip] -> Hacking data. Used for offline progress calculations.
// Hacking data format: [MoneyStolen, NumTimesHacked, NumTimesGrown, NumTimesWeaken]
dataMap: IMap<number[]> = {};
2019-03-03 04:15:10 +01:00
2021-09-05 01:09:30 +02:00
// Script filename
filename = "";
2019-03-03 04:15:10 +01:00
2021-09-05 01:09:30 +02:00
// This script's logs. An array of log entries
logs: string[] = [];
2019-03-03 04:15:10 +01:00
2021-09-05 01:09:30 +02:00
// Flag indicating whether the logs have been updated since
// the last time the UI was updated
logUpd = false;
2019-03-03 04:15:10 +01:00
2021-09-05 01:09:30 +02:00
// Total amount of hacking experience earned from this script when offline
offlineExpGained = 0;
2019-03-03 04:15:10 +01:00
2021-09-05 01:09:30 +02:00
// Total amount of money made by this script when offline
offlineMoneyMade = 0;
2019-03-03 04:15:10 +01:00
2021-09-05 01:09:30 +02:00
// Number of seconds that the script has been running offline
offlineRunningTime = 0.01;
2019-03-03 04:15:10 +01:00
2021-09-05 01:09:30 +02:00
// Total amount of hacking experience earned from this script when online
onlineExpGained = 0;
2019-03-03 04:15:10 +01:00
2021-09-05 01:09:30 +02:00
// Total amount of money made by this script when online
onlineMoneyMade = 0;
2019-03-03 04:15:10 +01:00
2021-09-05 01:09:30 +02:00
// Number of seconds that this script has been running online
onlineRunningTime = 0.01;
2019-03-03 04:15:10 +01:00
2021-09-05 01:09:30 +02:00
// Process ID. Must be an integer and equals the PID of corresponding WorkerScript
pid = -1;
2019-03-03 04:15:10 +01:00
2021-09-05 01:09:30 +02:00
// How much RAM this script uses for ONE thread
ramUsage = 0;
2021-09-05 01:09:30 +02:00
// IP of the server on which this script is running
server = "";
2019-03-03 04:15:10 +01:00
2021-09-05 01:09:30 +02:00
// Number of threads that this script is running with
threads = 1;
2019-03-03 04:15:10 +01:00
2021-09-05 01:09:30 +02:00
constructor(script: Script | null = null, args: any[] = []) {
if (script == null) {
return;
2019-03-03 04:15:10 +01:00
}
2021-09-05 01:09:30 +02:00
this.filename = script.filename;
this.args = args;
this.server = script.server;
this.ramUsage = script.ramUsage;
}
log(txt: string): void {
if (this.logs.length > Settings.MaxLogCapacity) {
this.logs.shift();
2019-03-03 04:15:10 +01:00
}
2021-09-05 01:09:30 +02:00
let logEntry = txt;
if (FconfSettings.ENABLE_TIMESTAMPS) {
logEntry = "[" + getTimestamp() + "] " + logEntry;
2019-03-03 04:15:10 +01:00
}
2021-09-05 01:09:30 +02:00
this.logs.push(logEntry);
this.logUpd = true;
}
2019-03-03 04:15:10 +01:00
2021-09-05 01:09:30 +02:00
displayLog(): void {
for (let i = 0; i < this.logs.length; ++i) {
post(this.logs[i]);
2019-03-03 04:15:10 +01:00
}
2021-09-05 01:09:30 +02:00
}
clearLog(): void {
this.logs.length = 0;
}
// Update the moneyStolen and numTimesHack maps when hacking
recordHack(serverIp: string, moneyGained: number, n = 1): void {
if (
this.dataMap[serverIp] == null ||
this.dataMap[serverIp].constructor !== Array
) {
this.dataMap[serverIp] = [0, 0, 0, 0];
2019-03-03 04:15:10 +01:00
}
2021-09-05 01:09:30 +02:00
this.dataMap[serverIp][0] += moneyGained;
this.dataMap[serverIp][1] += n;
}
// Update the grow map when calling grow()
recordGrow(serverIp: string, n = 1): void {
if (
this.dataMap[serverIp] == null ||
this.dataMap[serverIp].constructor !== Array
) {
this.dataMap[serverIp] = [0, 0, 0, 0];
2019-03-03 04:15:10 +01:00
}
2021-09-05 01:09:30 +02:00
this.dataMap[serverIp][2] += n;
}
// Update the weaken map when calling weaken() {
recordWeaken(serverIp: string, n = 1): void {
if (
this.dataMap[serverIp] == null ||
this.dataMap[serverIp].constructor !== Array
) {
this.dataMap[serverIp] = [0, 0, 0, 0];
2021-05-01 09:17:31 +02:00
}
2021-09-05 01:09:30 +02:00
this.dataMap[serverIp][3] += n;
}
// Serialize the current object to a JSON save state
toJSON(): any {
return Generic_toJSON("RunningScript", this);
}
// Initializes a RunningScript Object from a JSON save state
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
static fromJSON(value: any): RunningScript {
return Generic_fromJSON(RunningScript, value.data);
}
2019-03-03 04:15:10 +01:00
}
Reviver.constructors.RunningScript = RunningScript;