This commit is contained in:
Olivier Gagnon 2021-09-19 23:29:02 -04:00
parent 4a3201cba3
commit fb37f6b94d
25 changed files with 242 additions and 242 deletions

@ -30,4 +30,5 @@ export interface IEngine {
loadMissionContent: () => void; loadMissionContent: () => void;
loadResleevingContent: () => void; loadResleevingContent: () => void;
loadGameOptionsContent: () => void; loadGameOptionsContent: () => void;
load: (save: string) => void;
} }

@ -3,7 +3,6 @@ import React, { useState } from "react";
import { Intro } from "./Intro"; import { Intro } from "./Intro";
import { Game } from "./Game"; import { Game } from "./Game";
import { Location } from "../../Locations/Location"; import { Location } from "../../Locations/Location";
import { Locations } from "../../Locations/Locations";
import { use } from "../../ui/Context"; import { use } from "../../ui/Context";
interface IProps { interface IProps {

@ -1,5 +0,0 @@
export declare function iTutorialNextStep(): void;
export declare function iTutorialPrevStep(): void;
export declare function iTutorialEnd(): void;
export declare const ITutorial: { isRunning: boolean; currStep: number };
export declare const iTutorialSteps: { [key: string]: number | undefined };

@ -1,122 +0,0 @@
import { Engine } from "./engine";
import { Player } from "./Player";
import { Settings } from "./Settings/Settings";
import { LiteratureNames } from "./Literature/data/LiteratureNames";
import { ITutorialEvents } from "./ui/InteractiveTutorial/ITutorialEvents";
import { clearEventListeners } from "../utils/uiHelpers/clearEventListeners";
import { createElement } from "../utils/uiHelpers/createElement";
import { createPopup } from "../utils/uiHelpers/createPopup";
import { removeElementById } from "../utils/uiHelpers/removeElementById";
// Ordered array of keys to Interactive Tutorial Steps
const orderedITutorialSteps = [
"Start",
"GoToCharacterPage", // Click on 'Stats' page
"CharacterPage", // Introduction to 'Stats' page
"CharacterGoToTerminalPage", // Go back to Terminal
"TerminalIntro", // Introduction to Terminal
"TerminalHelp", // Using 'help' Terminal command
"TerminalLs", // Using 'ls' Terminal command
"TerminalScan", // Using 'scan' Terminal command
"TerminalScanAnalyze1", // Using 'scan-analyze' Terminal command
"TerminalScanAnalyze2", // Using 'scan-analyze 3' Terminal command
"TerminalConnect", // Connecting to n00dles
"TerminalAnalyze", // Analyzing n00dles
"TerminalNuke", // NUKE n00dles
"TerminalManualHack", // Hack n00dles
"TerminalHackingMechanics", // Explanation of hacking mechanics
"TerminalGoHome", // Go home before creating a script.
"TerminalCreateScript", // Create a script using 'nano'
"TerminalTypeScript", // Script Editor page - Type script and then save & close
"TerminalFree", // Using 'Free' Terminal command
"TerminalRunScript", // Running script using 'run' Terminal command
"TerminalGoToActiveScriptsPage",
"ActiveScriptsPage",
"ActiveScriptsToTerminal",
"TerminalTailScript",
"GoToHacknetNodesPage",
"HacknetNodesIntroduction",
"HacknetNodesGoToWorldPage",
"WorldDescription",
"TutorialPageInfo",
"End",
];
// Create an 'enum' for the Steps
const iTutorialSteps = {};
for (let i = 0; i < orderedITutorialSteps.length; ++i) {
iTutorialSteps[orderedITutorialSteps[i]] = i;
}
const ITutorial = {
currStep: 0, // iTutorialSteps.Start
isRunning: false,
// Keeps track of whether each step has been done
stepIsDone: {},
};
function iTutorialStart() {
// Initialize Interactive Tutorial state by settings 'done' for each state to false
ITutorial.stepIsDone = {};
for (let i = 0; i < orderedITutorialSteps.length; ++i) {
ITutorial.stepIsDone[i] = false;
}
// Don't autosave during this interactive tutorial
Engine.Counters.autoSaveCounter = Infinity;
ITutorial.currStep = 0;
ITutorial.isRunning = true;
}
// Go to the next step and evaluate it
function iTutorialNextStep() {
ITutorial.stepIsDone[ITutorial.currStep] = true;
if (ITutorial.currStep < iTutorialSteps.End) {
ITutorial.currStep += 1;
}
if (ITutorial.currStep === iTutorialSteps.End) iTutorialEnd();
ITutorialEvents.emit();
}
// Go to previous step and evaluate
function iTutorialPrevStep() {
if (ITutorial.currStep > iTutorialSteps.Start) {
ITutorial.currStep -= 1;
}
ITutorialEvents.emit();
}
function iTutorialEnd() {
ITutorial.isRunning = false;
// Create a popup with final introductory stuff
const popupId = "interactive-tutorial-ending-popup";
const txt = createElement("p", {
innerHTML:
"If you are new to the game, the following links may be useful for you!<br><br>" +
"<a class='a-link-button' href='https://bitburner.readthedocs.io/en/latest/guidesandtips/gettingstartedguideforbeginnerprogrammers.html' target='_blank'>Getting Started Guide</a>" +
"<a class='a-link-button' href='https://bitburner.readthedocs.io/en/latest/' target='_blank'>Documentation</a><br><br>" +
"The Beginner's Guide to Hacking was added to your home computer! It contains some tips/pointers for starting out with the game. " +
"To read it, go to Terminal and enter<br><br>cat " +
LiteratureNames.HackersStartingHandbook,
});
const gotitBtn = createElement("a", {
class: "a-link-button",
float: "right",
padding: "6px",
innerText: "Got it!",
clickListener: () => {
removeElementById(popupId);
},
});
createPopup(popupId, [txt, gotitBtn]);
Player.getHomeComputer().messages.push(LiteratureNames.HackersStartingHandbook);
ITutorialEvents.emit();
}
export { iTutorialSteps, iTutorialEnd, iTutorialStart, iTutorialNextStep, ITutorial, iTutorialPrevStep };

170
src/InteractiveTutorial.ts Normal file

@ -0,0 +1,170 @@
import { Player } from "./Player";
import { LiteratureNames } from "./Literature/data/LiteratureNames";
import { ITutorialEvents } from "./ui/InteractiveTutorial/ITutorialEvents";
import { createElement } from "../utils/uiHelpers/createElement";
import { createPopup } from "../utils/uiHelpers/createPopup";
import { removeElementById } from "../utils/uiHelpers/removeElementById";
// Ordered array of keys to Interactive Tutorial Steps
enum iTutorialSteps {
Start,
GoToCharacterPage, // Click on 'Stats' page
CharacterPage, // Introduction to 'Stats' page
CharacterGoToTerminalPage, // Go back to Terminal
TerminalIntro, // Introduction to Terminal
TerminalHelp, // Using 'help' Terminal command
TerminalLs, // Using 'ls' Terminal command
TerminalScan, // Using 'scan' Terminal command
TerminalScanAnalyze1, // Using 'scan-analyze' Terminal command
TerminalScanAnalyze2, // Using 'scan-analyze 3' Terminal command
TerminalConnect, // Connecting to n00dles
TerminalAnalyze, // Analyzing n00dles
TerminalNuke, // NUKE n00dles
TerminalManualHack, // Hack n00dles
TerminalHackingMechanics, // Explanation of hacking mechanics
TerminalGoHome, // Go home before creating a script.
TerminalCreateScript, // Create a script using 'nano'
TerminalTypeScript, // Script Editor page - Type script and then save & close
TerminalFree, // Using 'Free' Terminal command
TerminalRunScript, // Running script using 'run' Terminal command
TerminalGoToActiveScriptsPage,
ActiveScriptsPage,
ActiveScriptsToTerminal,
TerminalTailScript,
GoToHacknetNodesPage,
HacknetNodesIntroduction,
HacknetNodesGoToWorldPage,
WorldDescription,
TutorialPageInfo,
End,
}
const ITutorial: {
currStep: iTutorialSteps;
isRunning: boolean;
stepIsDone: {
[iTutorialSteps.Start]: boolean;
[iTutorialSteps.GoToCharacterPage]: boolean;
[iTutorialSteps.CharacterPage]: boolean;
[iTutorialSteps.CharacterGoToTerminalPage]: boolean;
[iTutorialSteps.TerminalIntro]: boolean;
[iTutorialSteps.TerminalHelp]: boolean;
[iTutorialSteps.TerminalLs]: boolean;
[iTutorialSteps.TerminalScan]: boolean;
[iTutorialSteps.TerminalScanAnalyze1]: boolean;
[iTutorialSteps.TerminalScanAnalyze2]: boolean;
[iTutorialSteps.TerminalConnect]: boolean;
[iTutorialSteps.TerminalAnalyze]: boolean;
[iTutorialSteps.TerminalNuke]: boolean;
[iTutorialSteps.TerminalManualHack]: boolean;
[iTutorialSteps.TerminalHackingMechanics]: boolean;
[iTutorialSteps.TerminalGoHome]: boolean;
[iTutorialSteps.TerminalCreateScript]: boolean;
[iTutorialSteps.TerminalTypeScript]: boolean;
[iTutorialSteps.TerminalFree]: boolean;
[iTutorialSteps.TerminalRunScript]: boolean;
[iTutorialSteps.TerminalGoToActiveScriptsPage]: boolean;
[iTutorialSteps.ActiveScriptsPage]: boolean;
[iTutorialSteps.ActiveScriptsToTerminal]: boolean;
[iTutorialSteps.TerminalTailScript]: boolean;
[iTutorialSteps.GoToHacknetNodesPage]: boolean;
[iTutorialSteps.HacknetNodesIntroduction]: boolean;
[iTutorialSteps.HacknetNodesGoToWorldPage]: boolean;
[iTutorialSteps.WorldDescription]: boolean;
[iTutorialSteps.TutorialPageInfo]: boolean;
[iTutorialSteps.End]: boolean;
};
} = {
currStep: iTutorialSteps.Start,
isRunning: false,
// Keeps track of whether each step has been done
stepIsDone: {
[iTutorialSteps.Start]: false,
[iTutorialSteps.GoToCharacterPage]: false,
[iTutorialSteps.CharacterPage]: false,
[iTutorialSteps.CharacterGoToTerminalPage]: false,
[iTutorialSteps.TerminalIntro]: false,
[iTutorialSteps.TerminalHelp]: false,
[iTutorialSteps.TerminalLs]: false,
[iTutorialSteps.TerminalScan]: false,
[iTutorialSteps.TerminalScanAnalyze1]: false,
[iTutorialSteps.TerminalScanAnalyze2]: false,
[iTutorialSteps.TerminalConnect]: false,
[iTutorialSteps.TerminalAnalyze]: false,
[iTutorialSteps.TerminalNuke]: false,
[iTutorialSteps.TerminalManualHack]: false,
[iTutorialSteps.TerminalHackingMechanics]: false,
[iTutorialSteps.TerminalGoHome]: false,
[iTutorialSteps.TerminalCreateScript]: false,
[iTutorialSteps.TerminalTypeScript]: false,
[iTutorialSteps.TerminalFree]: false,
[iTutorialSteps.TerminalRunScript]: false,
[iTutorialSteps.TerminalGoToActiveScriptsPage]: false,
[iTutorialSteps.ActiveScriptsPage]: false,
[iTutorialSteps.ActiveScriptsToTerminal]: false,
[iTutorialSteps.TerminalTailScript]: false,
[iTutorialSteps.GoToHacknetNodesPage]: false,
[iTutorialSteps.HacknetNodesIntroduction]: false,
[iTutorialSteps.HacknetNodesGoToWorldPage]: false,
[iTutorialSteps.WorldDescription]: false,
[iTutorialSteps.TutorialPageInfo]: false,
[iTutorialSteps.End]: false,
},
};
function iTutorialStart(): void {
ITutorial.isRunning = true;
}
// Go to the next step and evaluate it
function iTutorialNextStep(): void {
ITutorial.stepIsDone[ITutorial.currStep] = true;
if (ITutorial.currStep < iTutorialSteps.End) {
ITutorial.currStep += 1;
}
if (ITutorial.currStep === iTutorialSteps.End) iTutorialEnd();
ITutorialEvents.emit();
}
// Go to previous step and evaluate
function iTutorialPrevStep(): void {
if (ITutorial.currStep > iTutorialSteps.Start) {
ITutorial.currStep -= 1;
}
ITutorialEvents.emit();
}
function iTutorialEnd(): void {
ITutorial.isRunning = false;
// Create a popup with final introductory stuff
const popupId = "interactive-tutorial-ending-popup";
const txt = createElement("p", {
innerHTML:
"If you are new to the game, the following links may be useful for you!<br><br>" +
"<a class='a-link-button' href='https://bitburner.readthedocs.io/en/latest/guidesandtips/gettingstartedguideforbeginnerprogrammers.html' target='_blank'>Getting Started Guide</a>" +
"<a class='a-link-button' href='https://bitburner.readthedocs.io/en/latest/' target='_blank'>Documentation</a><br><br>" +
"The Beginner's Guide to Hacking was added to your home computer! It contains some tips/pointers for starting out with the game. " +
"To read it, go to Terminal and enter<br><br>cat " +
LiteratureNames.HackersStartingHandbook,
});
const gotitBtn = createElement("a", {
class: "a-link-button",
float: "right",
padding: "6px",
innerText: "Got it!",
clickListener: () => {
removeElementById(popupId);
},
});
createPopup(popupId, [txt, gotitBtn]);
Player.getHomeComputer().messages.push(LiteratureNames.HackersStartingHandbook);
ITutorialEvents.emit();
}
export { iTutorialSteps, iTutorialEnd, iTutorialStart, iTutorialNextStep, ITutorial, iTutorialPrevStep };

@ -18,9 +18,7 @@ import { CasinoLocation } from "./CasinoLocation";
import { Location } from "../Location"; import { Location } from "../Location";
import { LocationType } from "../LocationTypeEnum"; import { LocationType } from "../LocationTypeEnum";
import { CityName } from "../data/CityNames";
import { IRouter } from "../../ui/Router";
import { Settings } from "../../Settings/Settings"; import { Settings } from "../../Settings/Settings";
import { SpecialServerIps } from "../../Server/SpecialServerIps"; import { SpecialServerIps } from "../../Server/SpecialServerIps";

@ -17,7 +17,6 @@ import { CreateCorporationPopup } from "../../Corporation/ui/CreateCorporationPo
import { createPopup } from "../../ui/React/createPopup"; import { createPopup } from "../../ui/React/createPopup";
import { LocationName } from "../data/LocationNames"; import { LocationName } from "../data/LocationNames";
import { IPlayer } from "../../PersonObjects/IPlayer";
import { use } from "../../ui/Context"; import { use } from "../../ui/Context";
import { AutoupdatingStdButton } from "../../ui/React/AutoupdatingStdButton"; import { AutoupdatingStdButton } from "../../ui/React/AutoupdatingStdButton";
@ -29,14 +28,10 @@ type IProps = {
loc: Location; loc: Location;
}; };
type IState = {
inBladeburner: boolean;
};
export function SpecialLocation(props: IProps): React.ReactElement { export function SpecialLocation(props: IProps): React.ReactElement {
const player = use.Player(); const player = use.Player();
const router = use.Router(); const router = use.Router();
const [rerender, setRerender] = useState(false); const setRerender = useState(false)[1];
const inBladeburner = player.inBladeburner(); const inBladeburner = player.inBladeburner();
/** /**
* Click handler for "Create Corporation" button at Sector-12 City Hall * Click handler for "Create Corporation" button at Sector-12 City Hall

@ -9,7 +9,6 @@ import { WorkerScriptStartStopEventEmitter } from "./Netscript/WorkerScriptStart
import { generateNextPid } from "./Netscript/Pid"; import { generateNextPid } from "./Netscript/Pid";
import { CONSTANTS } from "./Constants"; import { CONSTANTS } from "./Constants";
import { Engine } from "./engine";
import { Interpreter } from "./JSInterpreter"; import { Interpreter } from "./JSInterpreter";
import { isScriptErrorMessage, makeRuntimeRejectMsg } from "./NetscriptEvaluator"; import { isScriptErrorMessage, makeRuntimeRejectMsg } from "./NetscriptEvaluator";
import { NetscriptFunctions } from "./NetscriptFunctions"; import { NetscriptFunctions } from "./NetscriptFunctions";

@ -15,10 +15,7 @@ import { AllServers } from "../Server/AllServers";
import { removeLeadingSlash, isInRootDirectory, evaluateFilePath } from "./DirectoryHelpers"; import { removeLeadingSlash, isInRootDirectory, evaluateFilePath } from "./DirectoryHelpers";
import { checkIfConnectedToDarkweb } from "../DarkWeb/DarkWeb"; import { checkIfConnectedToDarkweb } from "../DarkWeb/DarkWeb";
import { logBoxCreate } from "../../utils/LogBox";
import { iTutorialNextStep, iTutorialSteps, ITutorial } from "../InteractiveTutorial"; import { iTutorialNextStep, iTutorialSteps, ITutorial } from "../InteractiveTutorial";
import { findRunningScript } from "../Script/ScriptHelpers";
import { TerminalHelpText } from "./HelpText";
import { GetServerByHostname, getServer, getServerOnNetwork } from "../Server/ServerHelpers"; import { GetServerByHostname, getServer, getServerOnNetwork } from "../Server/ServerHelpers";
import { ParseCommand, ParseCommands } from "./Parser"; import { ParseCommand, ParseCommands } from "./Parser";
import { SpecialServerIps, SpecialServerNames } from "../Server/SpecialServerIps"; import { SpecialServerIps, SpecialServerNames } from "../Server/SpecialServerIps";

3
src/engine.d.ts vendored

@ -1,2 +1,3 @@
export declare function load(cb: () => void): void; export declare function load(cb: () => void): void;
export declare const Engine: any;
export declare const Engine: IEngine;

@ -13,8 +13,8 @@ import { Corporation } from "./Corporation/Corporation";
import { CONSTANTS } from "./Constants"; import { CONSTANTS } from "./Constants";
import { Factions, initFactions } from "./Faction/Factions"; import { Factions, initFactions } from "./Faction/Factions";
import { processPassiveFactionRepGain, inviteToFaction } from "./Faction/FactionHelpers"; import { processPassiveFactionRepGain, inviteToFaction } from "./Faction/FactionHelpers";
import { GameRoot, Router } from "./ui/GameRoot"; import { Router } from "./ui/GameRoot";
import { TTheme as Theme } from "./ui/React/Theme";
import { import {
getHackingWorkRepGain, getHackingWorkRepGain,
getFactionSecurityWorkRepGain, getFactionSecurityWorkRepGain,
@ -36,7 +36,6 @@ import { Terminal } from "./Terminal";
import { Sleeve } from "./PersonObjects/Sleeve/Sleeve"; import { Sleeve } from "./PersonObjects/Sleeve/Sleeve";
import { Locations } from "./Locations/Locations"; import { Locations } from "./Locations/Locations";
import { LocationName } from "./Locations/data/LocationNames"; import { LocationName } from "./Locations/data/LocationNames";
import { LoadingScreen } from "./ui/LoadingScreen";
import { Money } from "./ui/React/Money"; import { Money } from "./ui/React/Money";
import { Hashes } from "./ui/React/Hashes"; import { Hashes } from "./ui/React/Hashes";
@ -49,7 +48,6 @@ import "./Exploits/tampering";
import "./Exploits/unclickable"; import "./Exploits/unclickable";
import React from "react"; import React from "react";
import ReactDOM from "react-dom";
const Engine = { const Engine = {
indexedDb: undefined, indexedDb: undefined,
@ -466,11 +464,4 @@ function load(cb) {
var indexedDbRequest; var indexedDbRequest;
ReactDOM.render(
<Theme>
<LoadingScreen />
</Theme>,
document.getElementById("mainmenu-container"),
);
export { Engine, load }; export { Engine, load };

13
src/index.tsx Normal file

@ -0,0 +1,13 @@
import React from "react";
import ReactDOM from "react-dom";
import { TTheme as Theme } from "./ui/React/Theme";
import { LoadingScreen } from "./ui/LoadingScreen";
import "./engineStyle";
ReactDOM.render(
<Theme>
<LoadingScreen />
</Theme>,
document.getElementById("mainmenu-container"),
);

@ -10,7 +10,6 @@ import { ServerAccordions } from "./ServerAccordions";
import { WorkerScript } from "../../Netscript/WorkerScript"; import { WorkerScript } from "../../Netscript/WorkerScript";
import Typography from "@mui/material/Typography"; import Typography from "@mui/material/Typography";
import TextField from "@mui/material/TextField";
type IProps = { type IProps = {
workerScripts: Map<number, WorkerScript>; workerScripts: Map<number, WorkerScript>;
@ -35,7 +34,7 @@ export function ActiveScriptsRoot(props: IProps): React.ReactElement {
on which they are running. on which they are running.
</Typography> </Typography>
<ScriptProduction {...props} /> <ScriptProduction />
<ServerAccordions {...props} /> <ServerAccordions {...props} />
</> </>
); );

@ -4,13 +4,10 @@
*/ */
import * as React from "react"; import * as React from "react";
import { WorkerScript } from "../../Netscript/WorkerScript";
import { Money } from "../React/Money";
import { MoneyRate } from "../React/MoneyRate"; import { MoneyRate } from "../React/MoneyRate";
import { use } from "../Context"; import { use } from "../Context";
import Typography from "@mui/material/Typography"; import Typography from "@mui/material/Typography";
import Box from "@mui/material/Box";
import { Theme } from "@mui/material/styles"; import { Theme } from "@mui/material/styles";
import makeStyles from "@mui/styles/makeStyles"; import makeStyles from "@mui/styles/makeStyles";
@ -18,14 +15,8 @@ import createStyles from "@mui/styles/createStyles";
import Table from "@mui/material/Table"; import Table from "@mui/material/Table";
import TableBody from "@mui/material/TableBody"; import TableBody from "@mui/material/TableBody";
import TableCell from "@mui/material/TableCell"; import TableCell from "@mui/material/TableCell";
import TableContainer from "@mui/material/TableContainer";
import TableHead from "@mui/material/TableHead";
import TableRow from "@mui/material/TableRow"; import TableRow from "@mui/material/TableRow";
type IProps = {
workerScripts: Map<number, WorkerScript>;
};
const useStyles = makeStyles((theme: Theme) => const useStyles = makeStyles((theme: Theme) =>
createStyles({ createStyles({
cell: { cell: {
@ -39,16 +30,11 @@ const useStyles = makeStyles((theme: Theme) =>
}, },
}), }),
); );
export function ScriptProduction(props: IProps): React.ReactElement { export function ScriptProduction(): React.ReactElement {
const player = use.Player(); const player = use.Player();
const classes = useStyles(); const classes = useStyles();
const prodRateSinceLastAug = player.scriptProdSinceLastAug / (player.playtimeSinceLastAug / 1000); const prodRateSinceLastAug = player.scriptProdSinceLastAug / (player.playtimeSinceLastAug / 1000);
let onlineProduction = 0;
for (const ws of props.workerScripts.values()) {
onlineProduction += ws.scriptRef.onlineMoneyMade / ws.scriptRef.onlineRunningTime;
}
return ( return (
<Table size="small" classes={{ root: classes.size }}> <Table size="small" classes={{ root: classes.size }}>
<TableBody> <TableBody>
@ -58,7 +44,7 @@ export function ScriptProduction(props: IProps): React.ReactElement {
</TableCell> </TableCell>
<TableCell align="left" classes={{ root: classes.cell }}> <TableCell align="left" classes={{ root: classes.cell }}>
<Typography variant="body2"> <Typography variant="body2">
<Money money={player.scriptProdSinceLastAug} /> <MoneyRate money={player.scriptProdSinceLastAug} />
</Typography> </Typography>
</TableCell> </TableCell>
</TableRow> </TableRow>

@ -1,14 +1,10 @@
import React, { useState } from "react"; import React, { useState } from "react";
import { WorkerScript } from "../../Netscript/WorkerScript"; import { WorkerScript } from "../../Netscript/WorkerScript";
import { WorkerScriptAccordion } from "./WorkerScriptAccordion"; import { WorkerScriptAccordion } from "./WorkerScriptAccordion";
import { AccordionButton } from "../React/AccordionButton";
import Paper from "@mui/material/Paper";
import List from "@mui/material/List"; import List from "@mui/material/List";
import TablePagination from "@mui/material/TablePagination"; import TablePagination from "@mui/material/TablePagination";
import { TablePaginationActionsAll } from "../React/TablePaginationActionsAll"; import { TablePaginationActionsAll } from "../React/TablePaginationActionsAll";
const pageSize = 20;
interface IProps { interface IProps {
workerScripts: WorkerScript[]; workerScripts: WorkerScript[];
} }
@ -16,11 +12,11 @@ interface IProps {
export function ServerAccordionContent(props: IProps): React.ReactElement { export function ServerAccordionContent(props: IProps): React.ReactElement {
const [page, setPage] = useState(0); const [page, setPage] = useState(0);
const [rowsPerPage, setRowsPerPage] = useState(10); const [rowsPerPage, setRowsPerPage] = useState(10);
const handleChangePage = (event: unknown, newPage: number) => { const handleChangePage = (event: unknown, newPage: number): void => {
setPage(newPage); setPage(newPage);
}; };
const handleChangeRowsPerPage = (event: React.ChangeEvent<HTMLInputElement>) => { const handleChangeRowsPerPage = (event: React.ChangeEvent<HTMLInputElement>): void => {
setRowsPerPage(parseInt(event.target.value, 10)); setRowsPerPage(parseInt(event.target.value, 10));
setPage(0); setPage(0);
}; };

@ -7,9 +7,6 @@ import React, { useState, useEffect } from "react";
import { ServerAccordion } from "./ServerAccordion"; import { ServerAccordion } from "./ServerAccordion";
import TextField from "@mui/material/TextField"; import TextField from "@mui/material/TextField";
import Typography from "@mui/material/Typography";
import Paper from "@mui/material/Paper";
import Box from "@mui/material/Box";
import List from "@mui/material/List"; import List from "@mui/material/List";
import TablePagination from "@mui/material/TablePagination"; import TablePagination from "@mui/material/TablePagination";
import { WorkerScript } from "../../Netscript/WorkerScript"; import { WorkerScript } from "../../Netscript/WorkerScript";
@ -33,12 +30,6 @@ type IProps = {
workerScripts: Map<number, WorkerScript>; workerScripts: Map<number, WorkerScript>;
}; };
type IState = {
rerenderFlag: boolean;
};
const subscriberId = "ActiveScriptsUI";
export function ServerAccordions(props: IProps): React.ReactElement { export function ServerAccordions(props: IProps): React.ReactElement {
const [filter, setFilter] = useState(""); const [filter, setFilter] = useState("");
const [page, setPage] = useState(0); const [page, setPage] = useState(0);
@ -52,11 +43,11 @@ export function ServerAccordions(props: IProps): React.ReactElement {
return WorkerScriptStartStopEventEmitter.subscribe(rerender); return WorkerScriptStartStopEventEmitter.subscribe(rerender);
}, []); }, []);
const handleChangePage = (event: unknown, newPage: number) => { const handleChangePage = (event: unknown, newPage: number): void => {
setPage(newPage); setPage(newPage);
}; };
const handleChangeRowsPerPage = (event: React.ChangeEvent<HTMLInputElement>) => { const handleChangeRowsPerPage = (event: React.ChangeEvent<HTMLInputElement>): void => {
setRowsPerPage(parseInt(event.target.value, 10)); setRowsPerPage(parseInt(event.target.value, 10));
setPage(0); setPage(0);
}; };

@ -14,21 +14,15 @@ import Button from "@mui/material/Button";
import Box from "@mui/material/Box"; import Box from "@mui/material/Box";
import Paper from "@mui/material/Paper"; import Paper from "@mui/material/Paper";
import Typography from "@mui/material/Typography"; import Typography from "@mui/material/Typography";
import Accordion from "@mui/material/Accordion";
import AccordionSummary from "@mui/material/AccordionSummary";
import AccordionDetails from "@mui/material/AccordionDetails";
import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
import { AccordionButton } from "../React/AccordionButton";
import IconButton from "@mui/material/IconButton"; import IconButton from "@mui/material/IconButton";
import DeleteIcon from "@mui/icons-material/Delete"; import DeleteIcon from "@mui/icons-material/Delete";
import ListItemButton from "@mui/material/ListItemButton"; import ListItemButton from "@mui/material/ListItemButton";
import ListItemText from "@mui/material/ListItemText"; import ListItemText from "@mui/material/ListItemText";
import makeStyles from "@mui/styles/makeStyles"; import makeStyles from "@mui/styles/makeStyles";
import createStyles from "@mui/styles/createStyles";
import Collapse from "@mui/material/Collapse"; import Collapse from "@mui/material/Collapse";
import ExpandMore from "@mui/icons-material/ExpandMore";
import ExpandLess from "@mui/icons-material/ExpandLess"; import ExpandLess from "@mui/icons-material/ExpandLess";
import ExpandMore from "@mui/icons-material/ExpandMore";
import { killWorkerScript } from "../../Netscript/killWorkerScript"; import { killWorkerScript } from "../../Netscript/killWorkerScript";
import { WorkerScript } from "../../Netscript/WorkerScript"; import { WorkerScript } from "../../Netscript/WorkerScript";
@ -67,8 +61,6 @@ export function WorkerScriptAccordion(props: IProps): React.ReactElement {
// Calculations for script stats // Calculations for script stats
const onlineMps = scriptRef.onlineMoneyMade / scriptRef.onlineRunningTime; const onlineMps = scriptRef.onlineMoneyMade / scriptRef.onlineRunningTime;
const onlineEps = scriptRef.onlineExpGained / scriptRef.onlineRunningTime; const onlineEps = scriptRef.onlineExpGained / scriptRef.onlineRunningTime;
const offlineMps = scriptRef.offlineMoneyMade / scriptRef.offlineRunningTime;
const offlineEps = scriptRef.offlineExpGained / scriptRef.offlineRunningTime;
return ( return (
<> <>

@ -1,10 +1,6 @@
import React, { useState, useEffect } from "react"; import React, { useState, useEffect } from "react";
import { numeralWrapper } from "../ui/numeralFormat"; import { numeralWrapper } from "../ui/numeralFormat";
import { BitNodes } from "../BitNode/BitNode";
import { IPlayer } from "../PersonObjects/IPlayer";
import { MoneySourceTracker } from "../utils/MoneySourceTracker";
import { dialogBoxCreate } from "../../utils/DialogBox";
import { convertTimeMsToTimeElapsedString } from "../../utils/StringHelperFunctions"; import { convertTimeMsToTimeElapsedString } from "../../utils/StringHelperFunctions";
import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers"; import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers";
import { SourceFileFlags } from "../SourceFile/SourceFileFlags"; import { SourceFileFlags } from "../SourceFile/SourceFileFlags";
@ -13,6 +9,8 @@ import { HacknetServerConstants } from "../Hacknet/data/Constants";
import { StatsTable } from "./React/StatsTable"; import { StatsTable } from "./React/StatsTable";
import { Money } from "./React/Money"; import { Money } from "./React/Money";
import { use } from "./Context"; import { use } from "./Context";
import { MoneySourceTracker } from "../utils/MoneySourceTracker";
import { BitNodes } from "../BitNode/BitNode";
import Typography from "@mui/material/Typography"; import Typography from "@mui/material/Typography";
import Box from "@mui/material/Box"; import Box from "@mui/material/Box";

@ -1,4 +1,4 @@
import React, { useState, useEffect, useRef } from "react"; import React, { useState, useEffect } from "react";
import { IPlayer } from "../PersonObjects/IPlayer"; import { IPlayer } from "../PersonObjects/IPlayer";
import { IEngine } from "../IEngine"; import { IEngine } from "../IEngine";

@ -7,11 +7,9 @@ import Button from "@mui/material/Button";
import ArrowForwardIos from "@mui/icons-material/ArrowForwardIos"; import ArrowForwardIos from "@mui/icons-material/ArrowForwardIos";
import ArrowBackIos from "@mui/icons-material/ArrowBackIos"; import ArrowBackIos from "@mui/icons-material/ArrowBackIos";
import { ITutorialEvents } from "./ITutorialEvents"; import { ITutorialEvents } from "./ITutorialEvents";
import { use } from "../Context";
import { CopyableText } from "../React/CopyableText"; import { CopyableText } from "../React/CopyableText";
import ListItem from "@mui/material/ListItem"; import ListItem from "@mui/material/ListItem";
import TextField from "@mui/material/TextField";
import EqualizerIcon from "@mui/icons-material/Equalizer"; import EqualizerIcon from "@mui/icons-material/Equalizer";
import LastPageIcon from "@mui/icons-material/LastPage"; import LastPageIcon from "@mui/icons-material/LastPage";
import HelpIcon from "@mui/icons-material/Help"; import HelpIcon from "@mui/icons-material/Help";

@ -2,10 +2,6 @@ import React, { useState, useEffect } from "react";
import CircularProgress from "@mui/material/CircularProgress"; import CircularProgress from "@mui/material/CircularProgress";
import Typography from "@mui/material/Typography"; import Typography from "@mui/material/Typography";
import Grid from "@mui/material/Grid"; import Grid from "@mui/material/Grid";
import Paper from "@mui/material/Paper";
import { Theme } from "@mui/material";
import makeStyles from "@mui/styles/makeStyles";
import createStyles from "@mui/styles/createStyles";
import { Terminal } from "../Terminal"; import { Terminal } from "../Terminal";
import { Engine } from "../engine"; import { Engine } from "../engine";
@ -14,24 +10,47 @@ import { GameRoot } from "./GameRoot";
import { CONSTANTS } from "../Constants"; import { CONSTANTS } from "../Constants";
import { load } from "../engine"; function load(cb: () => void): void {
if (!window.indexedDB) {
return Engine.load(""); // Will try to load from localstorage
}
const useStyles = makeStyles((theme: Theme) => /**
createStyles({ * DB is called bitburnerSave
center: { * Object store is called savestring
position: "fixed", * key for the Object store is called save
top: "50%", */
left: "50%", const indexedDbRequest: IDBOpenDBRequest = window.indexedDB.open("bitburnerSave", 1);
},
}), indexedDbRequest.onerror = function (this: IDBRequest<IDBDatabase>, ev: Event) {
); console.error("Error opening indexedDB: ");
console.error(ev);
Engine.load(""); // Try to load from localstorage
cb();
};
indexedDbRequest.onsuccess = function (this: IDBRequest<IDBDatabase>) {
Engine.indexedDb = this.result;
const transaction = Engine.indexedDb.transaction(["savestring"]);
const objectStore = transaction.objectStore("savestring");
const request: IDBRequest<string> = objectStore.get("save");
request.onerror = function (this: IDBRequest<string>, ev: Event) {
console.error("Error in Database request to get savestring: " + ev);
Engine.load(""); // Try to load from localstorage
cb();
};
request.onsuccess = function (this: IDBRequest<string>) {
Engine.load(this.result);
cb();
};
};
}
export function LoadingScreen(): React.ReactElement { export function LoadingScreen(): React.ReactElement {
const classes = useStyles();
const [show, setShow] = useState(false); const [show, setShow] = useState(false);
const [loaded, setLoaded] = useState(false); const [loaded, setLoaded] = useState(false);
console.log("renredering");
useEffect(() => { useEffect(() => {
const id = setTimeout(() => { const id = setTimeout(() => {
if (!loaded) setShow(true); if (!loaded) setShow(true);

@ -14,16 +14,11 @@ import Box from "@mui/material/Box";
import Typography from "@mui/material/Typography"; import Typography from "@mui/material/Typography";
import Button from "@mui/material/Button"; import Button from "@mui/material/Button";
import IconButton from "@mui/material/IconButton"; import IconButton from "@mui/material/IconButton";
import Collapse from "@mui/material/Collapse";
import Fab from "@mui/material/Fab";
import VisibilityOffIcon from "@mui/icons-material/VisibilityOff";
import SaveIcon from "@mui/icons-material/Save"; import SaveIcon from "@mui/icons-material/Save";
import { colors } from "./Theme"; import { colors } from "./Theme";
import { Settings } from "../../Settings/Settings"; import { Settings } from "../../Settings/Settings";
import { use } from "../Context"; import { use } from "../Context";
import { Page } from "../Router";
import { Overview } from "./Overview";
interface IProps { interface IProps {
save: () => void; save: () => void;
@ -115,7 +110,6 @@ const useStyles = makeStyles({
export function CharacterOverview({ save }: IProps): React.ReactElement { export function CharacterOverview({ save }: IProps): React.ReactElement {
const player = use.Player(); const player = use.Player();
const router = use.Router();
const setRerender = useState(false)[1]; const setRerender = useState(false)[1];

@ -1,14 +1,6 @@
import * as React from "react"; import * as React from "react";
import { useTheme } from "@mui/material/styles"; import { useTheme } from "@mui/material/styles";
import Box from "@mui/material/Box"; import Box from "@mui/material/Box";
import Table from "@mui/material/Table";
import TableBody from "@mui/material/TableBody";
import TableCell from "@mui/material/TableCell";
import TableContainer from "@mui/material/TableContainer";
import TableFooter from "@mui/material/TableFooter";
import TablePagination from "@mui/material/TablePagination";
import TableRow from "@mui/material/TableRow";
import Paper from "@mui/material/Paper";
import IconButton from "@mui/material/IconButton"; import IconButton from "@mui/material/IconButton";
import FirstPageIcon from "@mui/icons-material/FirstPage"; import FirstPageIcon from "@mui/icons-material/FirstPage";
import KeyboardArrowLeft from "@mui/icons-material/KeyboardArrowLeft"; import KeyboardArrowLeft from "@mui/icons-material/KeyboardArrowLeft";
@ -22,23 +14,23 @@ interface TablePaginationActionsProps {
onPageChange: (event: React.MouseEvent<HTMLButtonElement>, newPage: number) => void; onPageChange: (event: React.MouseEvent<HTMLButtonElement>, newPage: number) => void;
} }
export function TablePaginationActionsAll(props: TablePaginationActionsProps) { export function TablePaginationActionsAll(props: TablePaginationActionsProps): React.ReactElement {
const theme = useTheme(); const theme = useTheme();
const { count, page, rowsPerPage, onPageChange } = props; const { count, page, rowsPerPage, onPageChange } = props;
const handleFirstPageButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => { const handleFirstPageButtonClick = (event: React.MouseEvent<HTMLButtonElement>): void => {
onPageChange(event, 0); onPageChange(event, 0);
}; };
const handleBackButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => { const handleBackButtonClick = (event: React.MouseEvent<HTMLButtonElement>): void => {
onPageChange(event, page - 1); onPageChange(event, page - 1);
}; };
const handleNextButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => { const handleNextButtonClick = (event: React.MouseEvent<HTMLButtonElement>): void => {
onPageChange(event, page + 1); onPageChange(event, page + 1);
}; };
const handleLastPageButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => { const handleLastPageButtonClick = (event: React.MouseEvent<HTMLButtonElement>): void => {
onPageChange(event, Math.max(0, Math.ceil(count / rowsPerPage) - 1)); onPageChange(event, Math.max(0, Math.ceil(count / rowsPerPage) - 1));
}; };

@ -12,9 +12,7 @@ module.exports = (env, argv) => {
const runInContainer = (env || {}).runInContainer === true; const runInContainer = (env || {}).runInContainer === true;
const isDevelopment = argv.mode === "development"; const isDevelopment = argv.mode === "development";
const outputDirectory = isDevServer ? "dist-dev" : "dist"; const outputDirectory = isDevServer ? "dist-dev" : "dist";
const entries = {}; const entry = "./src/index.tsx";
entries[`${outputDirectory}/engine`] = "./src/engine.jsx";
entries[`${outputDirectory}/engineStyle`] = "./src/engineStyle.js";
const statsConfig = { const statsConfig = {
builtAt: true, builtAt: true,
@ -134,7 +132,7 @@ module.exports = (env, argv) => {
isDevelopment && new ReactRefreshWebpackPlugin(), isDevelopment && new ReactRefreshWebpackPlugin(),
].filter(Boolean), ].filter(Boolean),
target: "web", target: "web",
entry: entries, entry: entry,
output: { output: {
path: path.resolve(__dirname, "./"), path: path.resolve(__dirname, "./"),
filename: "[name].bundle.js", filename: "[name].bundle.js",