mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-11-26 09:33:49 +01:00
rm some any
This commit is contained in:
parent
59e55de9ca
commit
5b8eea66d4
19
package-lock.json
generated
19
package-lock.json
generated
@ -18,8 +18,9 @@
|
|||||||
"@mui/material": "^5.0.3",
|
"@mui/material": "^5.0.3",
|
||||||
"@mui/styles": "^5.0.1",
|
"@mui/styles": "^5.0.1",
|
||||||
"@mui/system": "^5.0.3",
|
"@mui/system": "^5.0.3",
|
||||||
"acorn": "^8.4.1",
|
"@types/estree": "^1.0.0",
|
||||||
"acorn-walk": "^8.1.1",
|
"acorn": "^8.7.1",
|
||||||
|
"acorn-walk": "^8.2.0",
|
||||||
"arg": "^5.0.0",
|
"arg": "^5.0.0",
|
||||||
"bcryptjs": "^2.4.3",
|
"bcryptjs": "^2.4.3",
|
||||||
"better-react-mathjax": "^1.0.3",
|
"better-react-mathjax": "^1.0.3",
|
||||||
@ -4000,10 +4001,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/estree": {
|
"node_modules/@types/estree": {
|
||||||
"version": "0.0.50",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz",
|
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
|
||||||
"integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==",
|
"integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"node_modules/@types/file-saver": {
|
"node_modules/@types/file-saver": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
@ -25221,10 +25221,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@types/estree": {
|
"@types/estree": {
|
||||||
"version": "0.0.50",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz",
|
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz",
|
||||||
"integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==",
|
"integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"@types/file-saver": {
|
"@types/file-saver": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
|
@ -18,8 +18,9 @@
|
|||||||
"@mui/material": "^5.0.3",
|
"@mui/material": "^5.0.3",
|
||||||
"@mui/styles": "^5.0.1",
|
"@mui/styles": "^5.0.1",
|
||||||
"@mui/system": "^5.0.3",
|
"@mui/system": "^5.0.3",
|
||||||
"acorn": "^8.4.1",
|
"@types/estree": "^1.0.0",
|
||||||
"acorn-walk": "^8.1.1",
|
"acorn": "^8.7.1",
|
||||||
|
"acorn-walk": "^8.2.0",
|
||||||
"arg": "^5.0.0",
|
"arg": "^5.0.0",
|
||||||
"bcryptjs": "^2.4.3",
|
"bcryptjs": "^2.4.3",
|
||||||
"better-react-mathjax": "^1.0.3",
|
"better-react-mathjax": "^1.0.3",
|
||||||
|
@ -9,7 +9,7 @@ const style = {
|
|||||||
width: "1060px",
|
width: "1060px",
|
||||||
height: "800px",
|
height: "800px",
|
||||||
border: "0px",
|
border: "0px",
|
||||||
} as any;
|
};
|
||||||
|
|
||||||
export function BBCabinetRoot(): React.ReactElement {
|
export function BBCabinetRoot(): React.ReactElement {
|
||||||
const player = use.Player();
|
const player = use.Player();
|
||||||
|
@ -4,6 +4,7 @@ import { Factions } from "../Faction/Factions";
|
|||||||
import { Faction } from "../Faction/Faction";
|
import { Faction } from "../Faction/Faction";
|
||||||
import { GetServer } from "../Server/AllServers";
|
import { GetServer } from "../Server/AllServers";
|
||||||
import { FactionNames } from "../Faction/data/FactionNames";
|
import { FactionNames } from "../Faction/data/FactionNames";
|
||||||
|
import { Server } from "../Server/Server";
|
||||||
|
|
||||||
function allFactionAugs(p: IPlayer, f: Faction): boolean {
|
function allFactionAugs(p: IPlayer, f: Faction): boolean {
|
||||||
const factionAugs = f.augmentations.slice().filter((aug) => aug !== "NeuroFlux Governor");
|
const factionAugs = f.augmentations.slice().filter((aug) => aug !== "NeuroFlux Governor");
|
||||||
@ -24,7 +25,7 @@ export const Milestones: Milestone[] = [
|
|||||||
fulfilled: (): boolean => {
|
fulfilled: (): boolean => {
|
||||||
const server = GetServer("CSEC");
|
const server = GetServer("CSEC");
|
||||||
if (!server || !server.hasOwnProperty("hasAdminRights")) return false;
|
if (!server || !server.hasOwnProperty("hasAdminRights")) return false;
|
||||||
return (server as any).hasAdminRights;
|
return server instanceof Server && server.hasAdminRights;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -32,7 +33,7 @@ export const Milestones: Milestone[] = [
|
|||||||
fulfilled: (): boolean => {
|
fulfilled: (): boolean => {
|
||||||
const server = GetServer("CSEC");
|
const server = GetServer("CSEC");
|
||||||
if (!server || !server.hasOwnProperty("backdoorInstalled")) return false;
|
if (!server || !server.hasOwnProperty("backdoorInstalled")) return false;
|
||||||
return (server as any).backdoorInstalled;
|
return server instanceof Server && server.backdoorInstalled;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -12,6 +12,9 @@ import { Script } from "./Script/Script";
|
|||||||
import { areImportsEquals } from "./Terminal/DirectoryHelpers";
|
import { areImportsEquals } from "./Terminal/DirectoryHelpers";
|
||||||
import { IPlayer } from "./PersonObjects/IPlayer";
|
import { IPlayer } from "./PersonObjects/IPlayer";
|
||||||
|
|
||||||
|
// Acorn type def is straight up incomplete so we have to fill with our own.
|
||||||
|
export type Node = any;
|
||||||
|
|
||||||
// Makes a blob that contains the code of a given script.
|
// Makes a blob that contains the code of a given script.
|
||||||
function makeScriptBlob(code: string): Blob {
|
function makeScriptBlob(code: string): Blob {
|
||||||
return new Blob([code], { type: "text/javascript" });
|
return new Blob([code], { type: "text/javascript" });
|
||||||
@ -144,36 +147,39 @@ function _getScriptUrls(script: Script, scripts: Script[], seen: Script[]): Scri
|
|||||||
// Where the blob URL contains the script content.
|
// Where the blob URL contains the script content.
|
||||||
|
|
||||||
// Parse the code into an ast tree
|
// Parse the code into an ast tree
|
||||||
const ast: any = parse(script.code, { sourceType: "module", ecmaVersion: "latest", ranges: true });
|
const ast = parse(script.code, { sourceType: "module", ecmaVersion: "latest", ranges: true });
|
||||||
|
interface importNode {
|
||||||
const importNodes: Array<any> = [];
|
filename: string;
|
||||||
|
start: number;
|
||||||
|
end: number;
|
||||||
|
}
|
||||||
|
const importNodes: importNode[] = [];
|
||||||
// Walk the nodes of this tree and find any import declaration statements.
|
// Walk the nodes of this tree and find any import declaration statements.
|
||||||
walk.simple(ast, {
|
walk.simple(ast, {
|
||||||
ImportDeclaration(node: any) {
|
ImportDeclaration(node: Node) {
|
||||||
// Push this import onto the stack to replace
|
// Push this import onto the stack to replace
|
||||||
|
if (!node.source) return;
|
||||||
importNodes.push({
|
importNodes.push({
|
||||||
filename: node.source.value,
|
filename: node.source.value,
|
||||||
start: node.source.range[0] + 1,
|
start: node.source.range[0] + 1,
|
||||||
end: node.source.range[1] - 1,
|
end: node.source.range[1] - 1,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
ExportNamedDeclaration(node: any) {
|
ExportNamedDeclaration(node: Node) {
|
||||||
if (node.source) {
|
if (!node.source) return;
|
||||||
importNodes.push({
|
importNodes.push({
|
||||||
filename: node.source.value,
|
filename: node.source.value,
|
||||||
start: node.source.range[0] + 1,
|
start: node.source.range[0] + 1,
|
||||||
end: node.source.range[1] - 1,
|
end: node.source.range[1] - 1,
|
||||||
});
|
});
|
||||||
}
|
|
||||||
},
|
},
|
||||||
ExportAllDeclaration(node: any) {
|
ExportAllDeclaration(node: Node) {
|
||||||
if (node.source) {
|
if (!node.source) return;
|
||||||
importNodes.push({
|
importNodes.push({
|
||||||
filename: node.source.value,
|
filename: node.source.value,
|
||||||
start: node.source.range[0] + 1,
|
start: node.source.range[0] + 1,
|
||||||
end: node.source.range[1] - 1,
|
end: node.source.range[1] - 1,
|
||||||
});
|
});
|
||||||
}
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
// Sort the nodes from last start index to first. This replaces the last import with a blob first,
|
// Sort the nodes from last start index to first. This replaces the last import with a blob first,
|
||||||
|
@ -485,9 +485,6 @@ function processNetscript1Imports(code: string, workerScript: WorkerScript): any
|
|||||||
* Used to start a RunningScript (by creating and starting its
|
* Used to start a RunningScript (by creating and starting its
|
||||||
* corresponding WorkerScript), and add the RunningScript to the server on which
|
* corresponding WorkerScript), and add the RunningScript to the server on which
|
||||||
* it is active
|
* it is active
|
||||||
* @param {RunningScript} runningScriptObj - Script that's being run
|
|
||||||
* @param {Server} server - Server on which the script is to be run
|
|
||||||
* @returns {number} pid of started script
|
|
||||||
*/
|
*/
|
||||||
export function startWorkerScript(
|
export function startWorkerScript(
|
||||||
player: IPlayer,
|
player: IPlayer,
|
||||||
|
@ -7,6 +7,6 @@ export let Player = new PlayerObject();
|
|||||||
|
|
||||||
export function loadPlayer(saveString: string): void {
|
export function loadPlayer(saveString: string): void {
|
||||||
Player = JSON.parse(saveString, Reviver);
|
Player = JSON.parse(saveString, Reviver);
|
||||||
Player.money = parseFloat(Player.money as any);
|
Player.money = parseFloat(Player.money + "");
|
||||||
Player.exploits = sanitizeExploits(Player.exploits);
|
Player.exploits = sanitizeExploits(Player.exploits);
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@ import { Script } from "./Script";
|
|||||||
import { WorkerScript } from "../Netscript/WorkerScript";
|
import { WorkerScript } from "../Netscript/WorkerScript";
|
||||||
import { areImportsEquals } from "../Terminal/DirectoryHelpers";
|
import { areImportsEquals } from "../Terminal/DirectoryHelpers";
|
||||||
import { IPlayer } from "../PersonObjects/IPlayer";
|
import { IPlayer } from "../PersonObjects/IPlayer";
|
||||||
|
import { Node } from "../NetscriptJSEvaluator";
|
||||||
|
|
||||||
export interface RamUsageEntry {
|
export interface RamUsageEntry {
|
||||||
type: "ns" | "dom" | "fn" | "misc";
|
type: "ns" | "dom" | "fn" | "misc";
|
||||||
@ -282,11 +283,11 @@ export function checkInfiniteLoop(code: string): number {
|
|||||||
ast,
|
ast,
|
||||||
{},
|
{},
|
||||||
{
|
{
|
||||||
WhileStatement: (node: acorn.Node, st: unknown, walkDeeper: walk.WalkerCallback<any>) => {
|
WhileStatement: (node: Node, st: unknown, walkDeeper: walk.WalkerCallback<any>) => {
|
||||||
if (nodeHasTrueTest((node as any).test) && !hasAwait(node)) {
|
if (nodeHasTrueTest(node.test) && !hasAwait(node)) {
|
||||||
missingAwaitLine = (code.slice(0, node.start).match(/\n/g) || []).length + 1;
|
missingAwaitLine = (code.slice(0, node.start).match(/\n/g) || []).length + 1;
|
||||||
} else {
|
} else {
|
||||||
(node as any).body && walkDeeper((node as any).body, st);
|
node.body && walkDeeper(node.body, st);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -295,13 +296,20 @@ export function checkInfiniteLoop(code: string): number {
|
|||||||
return missingAwaitLine;
|
return missingAwaitLine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface ParseDepsResult {
|
||||||
|
dependencyMap: {
|
||||||
|
[key: string]: Set<string> | undefined;
|
||||||
|
};
|
||||||
|
additionalModules: string[];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper function that parses a single script. It returns a map of all dependencies,
|
* Helper function that parses a single script. It returns a map of all dependencies,
|
||||||
* which are items in the code's AST that potentially need to be evaluated
|
* which are items in the code's AST that potentially need to be evaluated
|
||||||
* for RAM usage calculations. It also returns an array of additional modules
|
* for RAM usage calculations. It also returns an array of additional modules
|
||||||
* that need to be parsed (i.e. are 'import'ed scripts).
|
* that need to be parsed (i.e. are 'import'ed scripts).
|
||||||
*/
|
*/
|
||||||
function parseOnlyCalculateDeps(code: string, currentModule: string): any {
|
function parseOnlyCalculateDeps(code: string, currentModule: string): ParseDepsResult {
|
||||||
const ast = parse(code, { sourceType: "module", ecmaVersion: "latest" });
|
const ast = parse(code, { sourceType: "module", ecmaVersion: "latest" });
|
||||||
// Everything from the global scope goes in ".". Everything else goes in ".function", where only
|
// Everything from the global scope goes in ".". Everything else goes in ".function", where only
|
||||||
// the outermost layer of functions counts.
|
// the outermost layer of functions counts.
|
||||||
@ -330,52 +338,56 @@ function parseOnlyCalculateDeps(code: string, currentModule: string): any {
|
|||||||
//A list of identifiers that resolve to "native Javascript code"
|
//A list of identifiers that resolve to "native Javascript code"
|
||||||
const objectPrototypeProperties = Object.getOwnPropertyNames(Object.prototype);
|
const objectPrototypeProperties = Object.getOwnPropertyNames(Object.prototype);
|
||||||
|
|
||||||
|
interface State {
|
||||||
|
key: string;
|
||||||
|
}
|
||||||
|
|
||||||
// If we discover a dependency identifier, state.key is the dependent identifier.
|
// If we discover a dependency identifier, state.key is the dependent identifier.
|
||||||
// walkDeeper is for doing recursive walks of expressions in composites that we handle.
|
// walkDeeper is for doing recursive walks of expressions in composites that we handle.
|
||||||
function commonVisitors(): any {
|
function commonVisitors(): walk.RecursiveVisitors<State> {
|
||||||
return {
|
return {
|
||||||
Identifier: (node: any, st: any) => {
|
Identifier: (node: Node, st: State) => {
|
||||||
if (objectPrototypeProperties.includes(node.name)) {
|
if (objectPrototypeProperties.includes(node.name)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
addRef(st.key, node.name);
|
addRef(st.key, node.name);
|
||||||
},
|
},
|
||||||
WhileStatement: (node: any, st: any, walkDeeper: any) => {
|
WhileStatement: (node: Node, st: State, walkDeeper: walk.WalkerCallback<State>) => {
|
||||||
addRef(st.key, specialReferenceWHILE);
|
addRef(st.key, specialReferenceWHILE);
|
||||||
node.test && walkDeeper(node.test, st);
|
node.test && walkDeeper(node.test, st);
|
||||||
node.body && walkDeeper(node.body, st);
|
node.body && walkDeeper(node.body, st);
|
||||||
},
|
},
|
||||||
DoWhileStatement: (node: any, st: any, walkDeeper: any) => {
|
DoWhileStatement: (node: Node, st: State, walkDeeper: walk.WalkerCallback<State>) => {
|
||||||
addRef(st.key, specialReferenceWHILE);
|
addRef(st.key, specialReferenceWHILE);
|
||||||
node.test && walkDeeper(node.test, st);
|
node.test && walkDeeper(node.test, st);
|
||||||
node.body && walkDeeper(node.body, st);
|
node.body && walkDeeper(node.body, st);
|
||||||
},
|
},
|
||||||
ForStatement: (node: any, st: any, walkDeeper: any) => {
|
ForStatement: (node: Node, st: State, walkDeeper: walk.WalkerCallback<State>) => {
|
||||||
addRef(st.key, specialReferenceFOR);
|
addRef(st.key, specialReferenceFOR);
|
||||||
node.init && walkDeeper(node.init, st);
|
node.init && walkDeeper(node.init, st);
|
||||||
node.test && walkDeeper(node.test, st);
|
node.test && walkDeeper(node.test, st);
|
||||||
node.update && walkDeeper(node.update, st);
|
node.update && walkDeeper(node.update, st);
|
||||||
node.body && walkDeeper(node.body, st);
|
node.body && walkDeeper(node.body, st);
|
||||||
},
|
},
|
||||||
IfStatement: (node: any, st: any, walkDeeper: any) => {
|
IfStatement: (node: Node, st: State, walkDeeper: walk.WalkerCallback<State>) => {
|
||||||
addRef(st.key, specialReferenceIF);
|
addRef(st.key, specialReferenceIF);
|
||||||
node.test && walkDeeper(node.test, st);
|
node.test && walkDeeper(node.test, st);
|
||||||
node.consequent && walkDeeper(node.consequent, st);
|
node.consequent && walkDeeper(node.consequent, st);
|
||||||
node.alternate && walkDeeper(node.alternate, st);
|
node.alternate && walkDeeper(node.alternate, st);
|
||||||
},
|
},
|
||||||
MemberExpression: (node: any, st: any, walkDeeper: any) => {
|
MemberExpression: (node: Node, st: State, walkDeeper: walk.WalkerCallback<State>) => {
|
||||||
node.object && walkDeeper(node.object, st);
|
node.object && walkDeeper(node.object, st);
|
||||||
node.property && walkDeeper(node.property, st);
|
node.property && walkDeeper(node.property, st);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
walk.recursive(
|
walk.recursive<State>(
|
||||||
ast,
|
ast,
|
||||||
{ key: globalKey },
|
{ key: globalKey },
|
||||||
Object.assign(
|
Object.assign(
|
||||||
{
|
{
|
||||||
ImportDeclaration: (node: any, st: any) => {
|
ImportDeclaration: (node: Node, st: State) => {
|
||||||
const importModuleName = node.source.value;
|
const importModuleName = node.source.value;
|
||||||
additionalModules.push(importModuleName);
|
additionalModules.push(importModuleName);
|
||||||
|
|
||||||
@ -398,7 +410,7 @@ function parseOnlyCalculateDeps(code: string, currentModule: string): any {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
FunctionDeclaration: (node: any) => {
|
FunctionDeclaration: (node: Node) => {
|
||||||
// node.id will be null when using 'export default'. Add a module name indicating the default export.
|
// node.id will be null when using 'export default'. Add a module name indicating the default export.
|
||||||
const key = currentModule + "." + (node.id === null ? "__SPECIAL_DEFAULT_EXPORT__" : node.id.name);
|
const key = currentModule + "." + (node.id === null ? "__SPECIAL_DEFAULT_EXPORT__" : node.id.name);
|
||||||
walk.recursive(node, { key: key }, commonVisitors());
|
walk.recursive(node, { key: key }, commonVisitors());
|
||||||
|
@ -157,11 +157,11 @@ export function SidebarRoot(props: IProps): React.ReactElement {
|
|||||||
|
|
||||||
const canOpenSleeves = props.player.sleeves.length > 0;
|
const canOpenSleeves = props.player.sleeves.length > 0;
|
||||||
|
|
||||||
const canCorporation = !!(props.player.corporation as any);
|
const canCorporation = !!props.player.corporation;
|
||||||
const canGang = !!(props.player.gang as any);
|
const canGang = !!props.player.gang;
|
||||||
const canJob = props.player.companyName !== "";
|
const canJob = props.player.companyName !== "";
|
||||||
const canStockMarket = props.player.hasWseAccount;
|
const canStockMarket = props.player.hasWseAccount;
|
||||||
const canBladeburner = !!(props.player.bladeburner as any);
|
const canBladeburner = !!props.player.bladeburner;
|
||||||
const canStaneksGift = props.player.augmentations.some((aug) => aug.name === AugmentationNames.StaneksGift1);
|
const canStaneksGift = props.player.augmentations.some((aug) => aug.name === AugmentationNames.StaneksGift1);
|
||||||
|
|
||||||
function clickTerminal(): void {
|
function clickTerminal(): void {
|
||||||
|
@ -518,7 +518,7 @@ export class Terminal implements ITerminal {
|
|||||||
const d = depthQueue.pop();
|
const d = depthQueue.pop();
|
||||||
if (d === undefined) continue;
|
if (d === undefined) continue;
|
||||||
const isHacknet = s instanceof HacknetServer;
|
const isHacknet = s instanceof HacknetServer;
|
||||||
if (!all && (s as any).purchasedByPlayer && s.hostname != "home") {
|
if (!all && s.purchasedByPlayer && s.hostname != "home") {
|
||||||
continue; // Purchased server
|
continue; // Purchased server
|
||||||
} else if (visited[s.hostname] || d > depth) {
|
} else if (visited[s.hostname] || d > depth) {
|
||||||
continue; // Already visited or out-of-depth
|
continue; // Already visited or out-of-depth
|
||||||
@ -548,12 +548,14 @@ export class Terminal implements ITerminal {
|
|||||||
if (s.hasAdminRights) {
|
if (s.hasAdminRights) {
|
||||||
c = "YES";
|
c = "YES";
|
||||||
}
|
}
|
||||||
this.print(
|
if (s instanceof Server) {
|
||||||
`${dashes}Root Access: ${c}${!isHacknet ? ", Required hacking skill: " + (s as any).requiredHackingSkill : ""}`,
|
this.print(
|
||||||
);
|
`${dashes}Root Access: ${c}${!isHacknet ? ", Required hacking skill: " + s.requiredHackingSkill : ""}`,
|
||||||
|
);
|
||||||
|
|
||||||
if (s.hasOwnProperty("numOpenPortsRequired")) {
|
if (s.hasOwnProperty("numOpenPortsRequired")) {
|
||||||
this.print(dashes + "Number of open ports required to NUKE: " + (s as any).numOpenPortsRequired);
|
this.print(dashes + "Number of open ports required to NUKE: " + s.numOpenPortsRequired);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this.print(dashes + "RAM: " + numeralWrapper.formatRAM(s.maxRam));
|
this.print(dashes + "RAM: " + numeralWrapper.formatRAM(s.maxRam));
|
||||||
this.print(" ");
|
this.print(" ");
|
||||||
|
Loading…
Reference in New Issue
Block a user