import React, { useState, useEffect, useRef } from "react"; import { IPlayer } from "../PersonObjects/IPlayer"; import { IEngine } from "../IEngine"; import { ITerminal } from "../Terminal/ITerminal"; import { installAugmentations } from "../Augmentation/AugmentationHelpers"; import { saveObject } from "../SaveObject"; import { onExport } from "../ExportBonus"; import { LocationName } from "../Locations/data/LocationNames"; import { CityName } from "../Locations/data/CityNames"; import { Faction } from "../Faction/Faction"; import { prestigeAugmentation } from "../Prestige"; import { dialogBoxCreate } from "../../utils/DialogBox"; import { AllServers } from "../Server/AllServers"; import { buyStock, sellStock, shortStock, sellShort } from "../StockMarket/BuyingAndSelling"; import { cancelOrder, eventEmitterForUiReset, initStockMarketFnForReact, placeOrder, StockMarket, } from "../StockMarket/StockMarket"; import { Theme } from "@mui/material/styles"; import makeStyles from "@mui/styles/makeStyles"; import createStyles from "@mui/styles/createStyles"; import Box from "@mui/material/Box"; import Typography from "@mui/material/Typography"; import { Page, IRouter } from "./Router"; import { SidebarRoot } from "../Sidebar/ui/SidebarRoot"; import { AugmentationsRoot } from "../Augmentation/ui/Root"; import { DevMenuRoot } from "../DevMenu"; import { Root as BladeburnerRoot } from "../Bladeburner/ui/Root"; import { Root as GangRoot } from "../Gang/ui/Root"; import { CorporationRoot } from "../Corporation/ui/CorporationRoot"; import { ResleeveRoot } from "../PersonObjects/Resleeving/ui/ResleeveRoot"; import { GameOptionsRoot } from "../ui/React/GameOptionsRoot"; import { SleeveRoot } from "../PersonObjects/Sleeve/ui/SleeveRoot"; import { HacknetRoot } from "../Hacknet/ui/HacknetRoot"; import { LocationRoot } from "../Locations/ui/Root"; import { ProgramsRoot } from "../Programs/ui/ProgramsRoot"; import { Root as ScriptEditorRoot } from "../ScriptEditor/ui/Root"; import { MilestonesRoot } from "../Milestones/ui/MilestonesRoot"; import { TerminalRoot } from "../Terminal/ui/TerminalRoot"; import { TutorialRoot } from "../Tutorial/ui/TutorialRoot"; import { ActiveScriptsRoot } from "../ui/ActiveScripts/Root"; import { FactionsRoot } from "../Faction/ui/FactionsRoot"; import { FactionRoot } from "../Faction/ui/FactionRoot"; import { CharacterInfo } from "./CharacterInfo"; import { TravelAgencyRoot } from "../Locations/ui/TravelAgencyRoot"; import { StockMarketRoot } from "../StockMarket/ui/StockMarketRoot"; import { workerScripts } from "../Netscript/WorkerScripts"; import { startHackingMission } from "../Faction/FactionHelpers"; interface IProps { terminal: ITerminal; player: IPlayer; engine: IEngine; } const useStyles = makeStyles((theme: Theme) => createStyles({ root: { "-ms-overflow-style": "none" /* for Internet Explorer, Edge */, "scrollbar-width": "none" /* for Firefox */, }, }), ); let filename = ""; let code = ""; export function GameRoot({ player, engine, terminal }: IProps): React.ReactElement { const contentRef = useRef(null); const [faction, setFaction] = useState(null); const [page, setPage] = useState(Page.Terminal); const classes = useStyles(); const router = { toActiveScripts: () => setPage(Page.ActiveScripts), toAugmentations: () => setPage(Page.Augmentations), toBladeburner: () => setPage(Page.Bladeburner), toCharacterInfo: () => setPage(Page.Stats), toCorporation: () => setPage(Page.Corporation), toCreateProgram: () => setPage(Page.CreateProgram), toDevMenu: () => setPage(Page.DevMenu), toFaction: (faction: Faction) => { setPage(Page.Faction); setFaction(faction); }, toFactions: () => setPage(Page.Factions), toGameOptions: () => setPage(Page.Options), toGang: () => setPage(Page.Gang), toHacknetNodes: () => setPage(Page.Hacknet), toMilestones: () => setPage(Page.Milestones), toResleeves: () => setPage(Page.Resleeves), toScriptEditor: (fn: string, c: string) => { filename = fn; code = c; setPage(Page.CreateScript); }, toSleeves: () => setPage(Page.Sleeves), toStockMarket: () => setPage(Page.StockMarket), toTerminal: () => setPage(Page.Terminal), toTutorial: () => setPage(Page.Tutorial), toJob: () => { player.gotoLocation(player.companyName as LocationName); setPage(Page.Job); }, toCity: () => { // TODO This is bad. player.gotoLocation(player.city as unknown as LocationName); setPage(Page.City); }, toTravel: () => { player.gotoLocation(LocationName.TravelAgency); setPage(Page.Travel); }, }; useEffect(() => { filename = ""; code = ""; }); return ( <> {page === Page.Terminal ? ( ) : page === Page.Sleeves ? ( ) : page === Page.Stats ? ( ) : page === Page.CreateScript ? ( ) : page === Page.ActiveScripts ? ( ) : page === Page.Hacknet ? ( ) : page === Page.CreateProgram ? ( ) : page === Page.Factions ? ( ) : page === Page.Faction ? ( ) : page === Page.Milestones ? ( ) : page === Page.Tutorial ? ( ) : page === Page.DevMenu ? ( ) : page === Page.Gang ? ( ) : page === Page.Corporation ? ( ) : page === Page.Bladeburner ? ( ) : page === Page.Resleeves ? ( ) : page === Page.Travel ? ( ) : page === Page.StockMarket ? ( ) : page === Page.City ? ( ) : page === Page.Job ? ( ) : page === Page.Options ? ( saveObject.saveGame(engine.indexedDb)} delete={() => saveObject.deleteGame(engine.indexedDb)} export={() => saveObject.exportGame()} import={() => saveObject.importGame()} forceKill={() => { for (const hostname of Object.keys(AllServers)) { AllServers[hostname].runningScripts = []; } dialogBoxCreate("Forcefully deleted all running scripts. Please save and refresh page."); }} softReset={() => { dialogBoxCreate("Soft Reset!"); prestigeAugmentation(); }} /> ) : page === Page.Augmentations ? ( { saveObject.exportGame(); onExport(player); }} installAugmentationsFn={installAugmentations} /> ) : ( <> Cannot load )} ); }