import React, { useEffect, useState } from "react"; import { Accordion, AccordionSummary, AccordionDetails, Button, MenuItem, Select, SelectChangeEvent, TextField, Typography, } from "@mui/material"; import ExpandMoreIcon from "@mui/icons-material/ExpandMore"; import { Player } from "@player"; import { FactionName } from "@enums"; import { useRerender } from "../../ui/React/hooks"; import { Money } from "../../ui/React/Money"; import { NumberInput } from "../../ui/React/NumberInput"; import { Hashes } from "../../ui/React/Hashes"; import { Router } from "../../ui/GameRoot"; import { Page } from "../../ui/Router"; import { Bladeburner } from "../../Bladeburner/Bladeburner"; import { GangConstants } from "../../Gang/data/Constants"; import { checkForMessagesToSend } from "../../Message/MessageHelpers"; import { ThemeEvents } from "../../Themes/ui/Theme"; import { getEnumHelper } from "../../utils/EnumHelper"; import { formatRam } from "../../ui/formatNumber"; export function General(): React.ReactElement { const rerender = useRerender(400); const [error, setError] = useState(false); const [corporationName, setCorporationName] = useState(""); const [gangFaction, setGangFaction] = useState(FactionName.SlumSnakes); const [devMoney, setDevMoney] = useState(0); const [hash, setHash] = useState(Player.hashManager.hashes); // Money functions const addCustomMoney = () => !Number.isNaN(devMoney) && Player.gainMoney(devMoney, "other"); const addMoney = (n: number) => () => n && Player.gainMoney(n, "other"); const setMoney = (n: number) => () => { if (!isNaN(n)) Player.money = n; }; const addHashes = () => hash && Player.hashManager.storeHashes(hash); const homeComputer = Player.getHomeComputer(); // Ram functions const doubleRam = () => { homeComputer.maxRam *= 2; rerender(); }; const ramSetter = (gb: number) => () => { homeComputer.maxRam = gb; rerender(); }; // Node-clearing functions const quickB1tFlum3 = () => Router.toPage(Page.BitVerse, { flume: true, quick: true }); const b1tflum3 = () => Router.toPage(Page.BitVerse, { flume: true, quick: false }); const quickHackW0r1dD43m0n = () => Router.toPage(Page.BitVerse, { flume: false, quick: true }); const hackW0r1dD43m0n = () => Router.toPage(Page.BitVerse, { flume: false, quick: false }); // Corp functions const createCorporation = () => { Player.startCorporation(corporationName, false); // Rerender so the corp menu option will show up immediately on the devmenu page selection ThemeEvents.emit(); }; const destroyCorporation = () => { Player.corporation = null; // Rerender so the corp menu option will be removed immediately on the devmenu page selection ThemeEvents.emit(); }; // Blade functions const joinBladeburner = () => { Player.bladeburner = new Bladeburner(); // Rerender so the blade menu option will show up immediately on the devmenu page selection ThemeEvents.emit(); }; const leaveBladeburner = () => { Player.bladeburner = null; // Rerender so the blade menu option will be removed immediately on the devmenu page selection ThemeEvents.emit(); }; // Gang functions const startGang = () => { const isHacking = gangFaction === FactionName.NiteSec || gangFaction === FactionName.TheBlackHand; Player.startGang(gangFaction, isHacking); // Rerender so the gang menu option will show up immediately on the devmenu page selection ThemeEvents.emit(); }; const stopGang = () => { Player.gang = null; // Rerender so the gang menu option will be removed immediately on the devmenu page selection ThemeEvents.emit(); }; const setGangFactionDropdown = (event: SelectChangeEvent) => { // Todo: Make this a more specific check when a GangName enumlike is added if (!getEnumHelper("FactionName").isMember(event.target.value)) return; setGangFaction(event.target.value); }; // Misc functions const checkMessages = () => checkForMessagesToSend(); useEffect(() => { if (error) throw new ReferenceError("Manually thrown error"); }, [error]); const moneyValues = [1e6, 1e9, 1e12, 1e15, Infinity]; const ramValues = [8, 64, 1024, 1048576, 1073741824]; return ( }> General Money (current: ) {moneyValues.map((value) => ( ))}
{Player.hashManager.capacity > 0 && ( <>

Hashes (current: ) )}

Max Home RAM (current: {formatRam(homeComputer.maxRam)}) {ramValues.map((gb) => ( ))}

Corporation: {Player.corporation ? ( ) : ( <> setCorporationName(x.target.value)} /> )}

Gang: {Player.gang ? ( ) : ( <> )}

Bladeburner: {Player.bladeburner ? ( ) : ( )}

Misc:

); }