diff --git a/src/IEngine.ts b/src/IEngine.ts index 01287cceb..a7938c696 100644 --- a/src/IEngine.ts +++ b/src/IEngine.ts @@ -30,4 +30,5 @@ export interface IEngine { loadMissionContent: () => void; loadResleevingContent: () => void; loadGameOptionsContent: () => void; + load: (save: string) => void; } diff --git a/src/Infiltration/ui/InfiltrationRoot.tsx b/src/Infiltration/ui/InfiltrationRoot.tsx index 5db306407..c706eb9e8 100644 --- a/src/Infiltration/ui/InfiltrationRoot.tsx +++ b/src/Infiltration/ui/InfiltrationRoot.tsx @@ -3,7 +3,6 @@ import React, { useState } from "react"; import { Intro } from "./Intro"; import { Game } from "./Game"; import { Location } from "../../Locations/Location"; -import { Locations } from "../../Locations/Locations"; import { use } from "../../ui/Context"; interface IProps { diff --git a/src/InteractiveTutorial.d.ts b/src/InteractiveTutorial.d.ts deleted file mode 100644 index 28b73deb8..000000000 --- a/src/InteractiveTutorial.d.ts +++ /dev/null @@ -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 }; diff --git a/src/InteractiveTutorial.js b/src/InteractiveTutorial.js deleted file mode 100644 index 18379f521..000000000 --- a/src/InteractiveTutorial.js +++ /dev/null @@ -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!

" + - "Getting Started Guide" + - "Documentation

" + - "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

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 }; diff --git a/src/InteractiveTutorial.ts b/src/InteractiveTutorial.ts new file mode 100644 index 000000000..be67f422c --- /dev/null +++ b/src/InteractiveTutorial.ts @@ -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!

" + + "Getting Started Guide" + + "Documentation

" + + "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

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 }; diff --git a/src/Locations/ui/GenericLocation.tsx b/src/Locations/ui/GenericLocation.tsx index b25d06638..a8d467968 100644 --- a/src/Locations/ui/GenericLocation.tsx +++ b/src/Locations/ui/GenericLocation.tsx @@ -18,9 +18,7 @@ import { CasinoLocation } from "./CasinoLocation"; import { Location } from "../Location"; import { LocationType } from "../LocationTypeEnum"; -import { CityName } from "../data/CityNames"; -import { IRouter } from "../../ui/Router"; import { Settings } from "../../Settings/Settings"; import { SpecialServerIps } from "../../Server/SpecialServerIps"; diff --git a/src/Locations/ui/SpecialLocation.tsx b/src/Locations/ui/SpecialLocation.tsx index 455da8dca..a6ab94feb 100644 --- a/src/Locations/ui/SpecialLocation.tsx +++ b/src/Locations/ui/SpecialLocation.tsx @@ -17,7 +17,6 @@ import { CreateCorporationPopup } from "../../Corporation/ui/CreateCorporationPo import { createPopup } from "../../ui/React/createPopup"; import { LocationName } from "../data/LocationNames"; -import { IPlayer } from "../../PersonObjects/IPlayer"; import { use } from "../../ui/Context"; import { AutoupdatingStdButton } from "../../ui/React/AutoupdatingStdButton"; @@ -29,14 +28,10 @@ type IProps = { loc: Location; }; -type IState = { - inBladeburner: boolean; -}; - export function SpecialLocation(props: IProps): React.ReactElement { const player = use.Player(); const router = use.Router(); - const [rerender, setRerender] = useState(false); + const setRerender = useState(false)[1]; const inBladeburner = player.inBladeburner(); /** * Click handler for "Create Corporation" button at Sector-12 City Hall diff --git a/src/NetscriptWorker.js b/src/NetscriptWorker.js index ab3224453..e65ba65df 100644 --- a/src/NetscriptWorker.js +++ b/src/NetscriptWorker.js @@ -9,7 +9,6 @@ import { WorkerScriptStartStopEventEmitter } from "./Netscript/WorkerScriptStart import { generateNextPid } from "./Netscript/Pid"; import { CONSTANTS } from "./Constants"; -import { Engine } from "./engine"; import { Interpreter } from "./JSInterpreter"; import { isScriptErrorMessage, makeRuntimeRejectMsg } from "./NetscriptEvaluator"; import { NetscriptFunctions } from "./NetscriptFunctions"; diff --git a/src/Terminal/Terminal.ts b/src/Terminal/Terminal.ts index 4ef407a75..7fe2d18d8 100644 --- a/src/Terminal/Terminal.ts +++ b/src/Terminal/Terminal.ts @@ -15,10 +15,7 @@ import { AllServers } from "../Server/AllServers"; import { removeLeadingSlash, isInRootDirectory, evaluateFilePath } from "./DirectoryHelpers"; import { checkIfConnectedToDarkweb } from "../DarkWeb/DarkWeb"; -import { logBoxCreate } from "../../utils/LogBox"; import { iTutorialNextStep, iTutorialSteps, ITutorial } from "../InteractiveTutorial"; -import { findRunningScript } from "../Script/ScriptHelpers"; -import { TerminalHelpText } from "./HelpText"; import { GetServerByHostname, getServer, getServerOnNetwork } from "../Server/ServerHelpers"; import { ParseCommand, ParseCommands } from "./Parser"; import { SpecialServerIps, SpecialServerNames } from "../Server/SpecialServerIps"; diff --git a/src/engine.d.ts b/src/engine.d.ts index ce2819933..46ed10fcd 100644 --- a/src/engine.d.ts +++ b/src/engine.d.ts @@ -1,2 +1,3 @@ export declare function load(cb: () => void): void; -export declare const Engine: any; + +export declare const Engine: IEngine; diff --git a/src/engine.jsx b/src/engine.jsx index e272dbc4f..544b8fc9f 100644 --- a/src/engine.jsx +++ b/src/engine.jsx @@ -13,8 +13,8 @@ import { Corporation } from "./Corporation/Corporation"; import { CONSTANTS } from "./Constants"; import { Factions, initFactions } from "./Faction/Factions"; import { processPassiveFactionRepGain, inviteToFaction } from "./Faction/FactionHelpers"; -import { GameRoot, Router } from "./ui/GameRoot"; -import { TTheme as Theme } from "./ui/React/Theme"; +import { Router } from "./ui/GameRoot"; + import { getHackingWorkRepGain, getFactionSecurityWorkRepGain, @@ -36,7 +36,6 @@ import { Terminal } from "./Terminal"; import { Sleeve } from "./PersonObjects/Sleeve/Sleeve"; import { Locations } from "./Locations/Locations"; import { LocationName } from "./Locations/data/LocationNames"; -import { LoadingScreen } from "./ui/LoadingScreen"; import { Money } from "./ui/React/Money"; import { Hashes } from "./ui/React/Hashes"; @@ -49,7 +48,6 @@ import "./Exploits/tampering"; import "./Exploits/unclickable"; import React from "react"; -import ReactDOM from "react-dom"; const Engine = { indexedDb: undefined, @@ -466,11 +464,4 @@ function load(cb) { var indexedDbRequest; -ReactDOM.render( - - - , - document.getElementById("mainmenu-container"), -); - export { Engine, load }; diff --git a/src/engineStyle.js b/src/engineStyle.ts similarity index 100% rename from src/engineStyle.js rename to src/engineStyle.ts diff --git a/src/index.tsx b/src/index.tsx new file mode 100644 index 000000000..9b1b87b19 --- /dev/null +++ b/src/index.tsx @@ -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( + + + , + document.getElementById("mainmenu-container"), +); diff --git a/src/ui/ActiveScripts/ActiveScriptsRoot.tsx b/src/ui/ActiveScripts/ActiveScriptsRoot.tsx index 001bee1f6..d4a93c3a1 100644 --- a/src/ui/ActiveScripts/ActiveScriptsRoot.tsx +++ b/src/ui/ActiveScripts/ActiveScriptsRoot.tsx @@ -10,7 +10,6 @@ import { ServerAccordions } from "./ServerAccordions"; import { WorkerScript } from "../../Netscript/WorkerScript"; import Typography from "@mui/material/Typography"; -import TextField from "@mui/material/TextField"; type IProps = { workerScripts: Map; @@ -35,7 +34,7 @@ export function ActiveScriptsRoot(props: IProps): React.ReactElement { on which they are running. - + ); diff --git a/src/ui/ActiveScripts/ScriptProduction.tsx b/src/ui/ActiveScripts/ScriptProduction.tsx index 13ee22f22..78ee774f7 100644 --- a/src/ui/ActiveScripts/ScriptProduction.tsx +++ b/src/ui/ActiveScripts/ScriptProduction.tsx @@ -4,13 +4,10 @@ */ import * as React from "react"; -import { WorkerScript } from "../../Netscript/WorkerScript"; -import { Money } from "../React/Money"; import { MoneyRate } from "../React/MoneyRate"; import { use } from "../Context"; import Typography from "@mui/material/Typography"; -import Box from "@mui/material/Box"; import { Theme } from "@mui/material/styles"; import makeStyles from "@mui/styles/makeStyles"; @@ -18,14 +15,8 @@ import createStyles from "@mui/styles/createStyles"; 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 TableHead from "@mui/material/TableHead"; import TableRow from "@mui/material/TableRow"; -type IProps = { - workerScripts: Map; -}; - const useStyles = makeStyles((theme: Theme) => createStyles({ 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 classes = useStyles(); 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 ( @@ -58,7 +44,7 @@ export function ScriptProduction(props: IProps): React.ReactElement { - + diff --git a/src/ui/ActiveScripts/ServerAccordionContent.tsx b/src/ui/ActiveScripts/ServerAccordionContent.tsx index 9fa3b4d9b..8deb63551 100644 --- a/src/ui/ActiveScripts/ServerAccordionContent.tsx +++ b/src/ui/ActiveScripts/ServerAccordionContent.tsx @@ -1,14 +1,10 @@ import React, { useState } from "react"; import { WorkerScript } from "../../Netscript/WorkerScript"; import { WorkerScriptAccordion } from "./WorkerScriptAccordion"; -import { AccordionButton } from "../React/AccordionButton"; -import Paper from "@mui/material/Paper"; import List from "@mui/material/List"; import TablePagination from "@mui/material/TablePagination"; import { TablePaginationActionsAll } from "../React/TablePaginationActionsAll"; -const pageSize = 20; - interface IProps { workerScripts: WorkerScript[]; } @@ -16,11 +12,11 @@ interface IProps { export function ServerAccordionContent(props: IProps): React.ReactElement { const [page, setPage] = useState(0); const [rowsPerPage, setRowsPerPage] = useState(10); - const handleChangePage = (event: unknown, newPage: number) => { + const handleChangePage = (event: unknown, newPage: number): void => { setPage(newPage); }; - const handleChangeRowsPerPage = (event: React.ChangeEvent) => { + const handleChangeRowsPerPage = (event: React.ChangeEvent): void => { setRowsPerPage(parseInt(event.target.value, 10)); setPage(0); }; diff --git a/src/ui/ActiveScripts/ServerAccordions.tsx b/src/ui/ActiveScripts/ServerAccordions.tsx index ef2afc554..c8dd3cf0b 100644 --- a/src/ui/ActiveScripts/ServerAccordions.tsx +++ b/src/ui/ActiveScripts/ServerAccordions.tsx @@ -7,9 +7,6 @@ import React, { useState, useEffect } from "react"; import { ServerAccordion } from "./ServerAccordion"; 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 TablePagination from "@mui/material/TablePagination"; import { WorkerScript } from "../../Netscript/WorkerScript"; @@ -33,12 +30,6 @@ type IProps = { workerScripts: Map; }; -type IState = { - rerenderFlag: boolean; -}; - -const subscriberId = "ActiveScriptsUI"; - export function ServerAccordions(props: IProps): React.ReactElement { const [filter, setFilter] = useState(""); const [page, setPage] = useState(0); @@ -52,11 +43,11 @@ export function ServerAccordions(props: IProps): React.ReactElement { return WorkerScriptStartStopEventEmitter.subscribe(rerender); }, []); - const handleChangePage = (event: unknown, newPage: number) => { + const handleChangePage = (event: unknown, newPage: number): void => { setPage(newPage); }; - const handleChangeRowsPerPage = (event: React.ChangeEvent) => { + const handleChangeRowsPerPage = (event: React.ChangeEvent): void => { setRowsPerPage(parseInt(event.target.value, 10)); setPage(0); }; diff --git a/src/ui/ActiveScripts/WorkerScriptAccordion.tsx b/src/ui/ActiveScripts/WorkerScriptAccordion.tsx index 68bf7f428..39d8b8285 100644 --- a/src/ui/ActiveScripts/WorkerScriptAccordion.tsx +++ b/src/ui/ActiveScripts/WorkerScriptAccordion.tsx @@ -14,21 +14,15 @@ import Button from "@mui/material/Button"; import Box from "@mui/material/Box"; import Paper from "@mui/material/Paper"; 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 DeleteIcon from "@mui/icons-material/Delete"; import ListItemButton from "@mui/material/ListItemButton"; import ListItemText from "@mui/material/ListItemText"; import makeStyles from "@mui/styles/makeStyles"; -import createStyles from "@mui/styles/createStyles"; import Collapse from "@mui/material/Collapse"; -import ExpandMore from "@mui/icons-material/ExpandMore"; import ExpandLess from "@mui/icons-material/ExpandLess"; +import ExpandMore from "@mui/icons-material/ExpandMore"; import { killWorkerScript } from "../../Netscript/killWorkerScript"; import { WorkerScript } from "../../Netscript/WorkerScript"; @@ -67,8 +61,6 @@ export function WorkerScriptAccordion(props: IProps): React.ReactElement { // Calculations for script stats const onlineMps = scriptRef.onlineMoneyMade / scriptRef.onlineRunningTime; const onlineEps = scriptRef.onlineExpGained / scriptRef.onlineRunningTime; - const offlineMps = scriptRef.offlineMoneyMade / scriptRef.offlineRunningTime; - const offlineEps = scriptRef.offlineExpGained / scriptRef.offlineRunningTime; return ( <> diff --git a/src/ui/CharacterStats.tsx b/src/ui/CharacterStats.tsx index 72f28cdae..92d3cfaa2 100644 --- a/src/ui/CharacterStats.tsx +++ b/src/ui/CharacterStats.tsx @@ -1,10 +1,6 @@ import React, { useState, useEffect } from "react"; 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 { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers"; import { SourceFileFlags } from "../SourceFile/SourceFileFlags"; @@ -13,6 +9,8 @@ import { HacknetServerConstants } from "../Hacknet/data/Constants"; import { StatsTable } from "./React/StatsTable"; import { Money } from "./React/Money"; import { use } from "./Context"; +import { MoneySourceTracker } from "../utils/MoneySourceTracker"; +import { BitNodes } from "../BitNode/BitNode"; import Typography from "@mui/material/Typography"; import Box from "@mui/material/Box"; diff --git a/src/ui/GameRoot.tsx b/src/ui/GameRoot.tsx index 98d5026fb..177ea480e 100644 --- a/src/ui/GameRoot.tsx +++ b/src/ui/GameRoot.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect, useRef } from "react"; +import React, { useState, useEffect } from "react"; import { IPlayer } from "../PersonObjects/IPlayer"; import { IEngine } from "../IEngine"; diff --git a/src/ui/InteractiveTutorial/InteractiveTutorialRoot.tsx b/src/ui/InteractiveTutorial/InteractiveTutorialRoot.tsx index 486d342d8..f424d8fc5 100644 --- a/src/ui/InteractiveTutorial/InteractiveTutorialRoot.tsx +++ b/src/ui/InteractiveTutorial/InteractiveTutorialRoot.tsx @@ -7,11 +7,9 @@ import Button from "@mui/material/Button"; import ArrowForwardIos from "@mui/icons-material/ArrowForwardIos"; import ArrowBackIos from "@mui/icons-material/ArrowBackIos"; import { ITutorialEvents } from "./ITutorialEvents"; -import { use } from "../Context"; import { CopyableText } from "../React/CopyableText"; import ListItem from "@mui/material/ListItem"; -import TextField from "@mui/material/TextField"; import EqualizerIcon from "@mui/icons-material/Equalizer"; import LastPageIcon from "@mui/icons-material/LastPage"; import HelpIcon from "@mui/icons-material/Help"; diff --git a/src/ui/LoadingScreen.tsx b/src/ui/LoadingScreen.tsx index bc9a70abd..63f555102 100644 --- a/src/ui/LoadingScreen.tsx +++ b/src/ui/LoadingScreen.tsx @@ -2,10 +2,6 @@ import React, { useState, useEffect } from "react"; import CircularProgress from "@mui/material/CircularProgress"; import Typography from "@mui/material/Typography"; 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 { Engine } from "../engine"; @@ -14,24 +10,47 @@ import { GameRoot } from "./GameRoot"; 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({ - center: { - position: "fixed", - top: "50%", - left: "50%", - }, - }), -); + /** + * DB is called bitburnerSave + * Object store is called savestring + * key for the Object store is called save + */ + const indexedDbRequest: IDBOpenDBRequest = window.indexedDB.open("bitburnerSave", 1); + + indexedDbRequest.onerror = function (this: IDBRequest, ev: Event) { + console.error("Error opening indexedDB: "); + console.error(ev); + Engine.load(""); // Try to load from localstorage + cb(); + }; + + indexedDbRequest.onsuccess = function (this: IDBRequest) { + Engine.indexedDb = this.result; + const transaction = Engine.indexedDb.transaction(["savestring"]); + const objectStore = transaction.objectStore("savestring"); + const request: IDBRequest = objectStore.get("save"); + request.onerror = function (this: IDBRequest, 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) { + Engine.load(this.result); + cb(); + }; + }; +} export function LoadingScreen(): React.ReactElement { - const classes = useStyles(); const [show, setShow] = useState(false); const [loaded, setLoaded] = useState(false); - console.log("renredering"); useEffect(() => { const id = setTimeout(() => { if (!loaded) setShow(true); diff --git a/src/ui/React/CharacterOverview.tsx b/src/ui/React/CharacterOverview.tsx index 8f0a331b7..f03e3c7b9 100644 --- a/src/ui/React/CharacterOverview.tsx +++ b/src/ui/React/CharacterOverview.tsx @@ -14,16 +14,11 @@ import Box from "@mui/material/Box"; import Typography from "@mui/material/Typography"; import Button from "@mui/material/Button"; 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 { colors } from "./Theme"; import { Settings } from "../../Settings/Settings"; import { use } from "../Context"; -import { Page } from "../Router"; -import { Overview } from "./Overview"; interface IProps { save: () => void; @@ -115,7 +110,6 @@ const useStyles = makeStyles({ export function CharacterOverview({ save }: IProps): React.ReactElement { const player = use.Player(); - const router = use.Router(); const setRerender = useState(false)[1]; diff --git a/src/ui/React/TablePaginationActionsAll.tsx b/src/ui/React/TablePaginationActionsAll.tsx index 8064d05a4..ee9f4293f 100644 --- a/src/ui/React/TablePaginationActionsAll.tsx +++ b/src/ui/React/TablePaginationActionsAll.tsx @@ -1,14 +1,6 @@ import * as React from "react"; import { useTheme } from "@mui/material/styles"; 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 FirstPageIcon from "@mui/icons-material/FirstPage"; import KeyboardArrowLeft from "@mui/icons-material/KeyboardArrowLeft"; @@ -22,23 +14,23 @@ interface TablePaginationActionsProps { onPageChange: (event: React.MouseEvent, newPage: number) => void; } -export function TablePaginationActionsAll(props: TablePaginationActionsProps) { +export function TablePaginationActionsAll(props: TablePaginationActionsProps): React.ReactElement { const theme = useTheme(); const { count, page, rowsPerPage, onPageChange } = props; - const handleFirstPageButtonClick = (event: React.MouseEvent) => { + const handleFirstPageButtonClick = (event: React.MouseEvent): void => { onPageChange(event, 0); }; - const handleBackButtonClick = (event: React.MouseEvent) => { + const handleBackButtonClick = (event: React.MouseEvent): void => { onPageChange(event, page - 1); }; - const handleNextButtonClick = (event: React.MouseEvent) => { + const handleNextButtonClick = (event: React.MouseEvent): void => { onPageChange(event, page + 1); }; - const handleLastPageButtonClick = (event: React.MouseEvent) => { + const handleLastPageButtonClick = (event: React.MouseEvent): void => { onPageChange(event, Math.max(0, Math.ceil(count / rowsPerPage) - 1)); }; diff --git a/webpack.config.js b/webpack.config.js index e472ea7ae..90a344b76 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -12,9 +12,7 @@ module.exports = (env, argv) => { const runInContainer = (env || {}).runInContainer === true; const isDevelopment = argv.mode === "development"; const outputDirectory = isDevServer ? "dist-dev" : "dist"; - const entries = {}; - entries[`${outputDirectory}/engine`] = "./src/engine.jsx"; - entries[`${outputDirectory}/engineStyle`] = "./src/engineStyle.js"; + const entry = "./src/index.tsx"; const statsConfig = { builtAt: true, @@ -134,7 +132,7 @@ module.exports = (env, argv) => { isDevelopment && new ReactRefreshWebpackPlugin(), ].filter(Boolean), target: "web", - entry: entries, + entry: entry, output: { path: path.resolve(__dirname, "./"), filename: "[name].bundle.js",