import MoreHorizIcon from "@mui/icons-material/MoreHoriz"; import { Paper, Table, TableBody } from "@mui/material"; import Box from "@mui/material/Box"; import IconButton from "@mui/material/IconButton"; import Typography from "@mui/material/Typography"; import React, { useEffect, useState } from "react"; import { BitNodes } from "../BitNode/BitNode"; import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers"; import { HacknetServerConstants } from "../Hacknet/data/Constants"; import { getPurchaseServerLimit } from "../Server/ServerPurchases"; import { Settings } from "../Settings/Settings"; import { SourceFileFlags } from "../SourceFile/SourceFileFlags"; import { MoneySourceTracker } from "../utils/MoneySourceTracker"; import { convertTimeMsToTimeElapsedString } from "../utils/StringHelperFunctions"; import { use } from "./Context"; import { numeralWrapper } from "./numeralFormat"; import { Modal } from "./React/Modal"; import { Money } from "./React/Money"; import { StatsRow } from "./React/StatsRow"; import { StatsTable } from "./React/StatsTable"; interface EmployersModalProps { open: boolean; onClose: () => void; } const EmployersModal = ({ open, onClose }: EmployersModalProps): React.ReactElement => { const player = use.Player(); return ( <> All Employers ); }; interface MultTableProps { rows: (string | number)[][]; color: string; } function MultiplierTable(props: MultTableProps): React.ReactElement { return ( {props.rows.map((data) => { const mult = data[0] as string, value = data[1] as number, modded = data[2] as number | null; if (modded && modded !== value && SourceFileFlags[5] > 0) { return ( <> {numeralWrapper.formatPercentage(value)}{" "} {numeralWrapper.formatPercentage(modded)} ); } return ( ); })}
); } function BladeburnerMults(): React.ReactElement { const player = use.Player(); if (!player.canAccessBladeburner()) return <>; return ( ); } function CurrentBitNode(): React.ReactElement { const player = use.Player(); if (player.sourceFiles.length > 0) { const index = "BitNode" + player.bitNodeN; const currentSourceFile = player.sourceFiles.find((sourceFile) => sourceFile.n == player.bitNodeN); const lvl = currentSourceFile ? currentSourceFile.lvl : 0; return ( BitNode {player.bitNodeN}: {BitNodes[index].name} (Level {lvl}) {BitNodes[index].info} ); } return <>; } interface IMoneyModalProps { open: boolean; onClose: () => void; } function MoneyModal({ open, onClose }: IMoneyModalProps): React.ReactElement { const player = use.Player(); function convertMoneySourceTrackerToString(src: MoneySourceTracker): React.ReactElement { const parts: any[][] = [[`Total:`, ]]; if (src.augmentations) { parts.push([`Augmentations:`, ]); } if (src.bladeburner) { parts.push([`Bladeburner:`, ]); } if (src.casino) { parts.push([`Casino:`, ]); } if (src.codingcontract) { parts.push([`Coding Contracts:`, ]); } if (src.work) { parts.push([`Company Work:`, ]); } if (src.class) { parts.push([`Class:`, ]); } if (src.corporation) { parts.push([`Corporation:`, ]); } if (src.crime) { parts.push([`Crimes:`, ]); } if (src.gang) { parts.push([`Gang:`, ]); } if (src.hacking) { parts.push([`Hacking:`, ]); } if (src.hacknet) { parts.push([`Hacknet Nodes:`, ]); } if (src.hacknet_expenses) { parts.push([`Hacknet Nodes Expenses:`, ]); } if (src.hospitalization) { parts.push([`Hospitalization:`, ]); } if (src.infiltration) { parts.push([`Infiltration:`, ]); } if (src.servers) { parts.push([`Servers:`, ]); } if (src.stock) { parts.push([`Stock Market:`, ]); } if (src.sleeves) { parts.push([`Sleeves:`, ]); } if (src.other) { parts.push([`Other:`, ]); } return ; } let content = ( <> Money earned since you last installed Augmentations
{convertMoneySourceTrackerToString(player.moneySourceA)} ); if (player.sourceFiles.length !== 0) { content = ( <> {content}

Money earned in this BitNode
{convertMoneySourceTrackerToString(player.moneySourceB)} ); } return ( {content} ); } export function CharacterStats(): React.ReactElement { const player = use.Player(); const [moneyOpen, setMoneyOpen] = useState(false); const [employersOpen, setEmployersOpen] = useState(false); const setRerender = useState(false)[1]; function rerender(): void { setRerender((old) => !old); } useEffect(() => { const id = setInterval(rerender, 200); return () => clearInterval(id); }, []); const timeRows = [ ["Since last Augmentation installation", convertTimeMsToTimeElapsedString(player.playtimeSinceLastAug)], ]; if (player.sourceFiles.length > 0) { timeRows.push(["Since last Bitnode destroyed", convertTimeMsToTimeElapsedString(player.playtimeSinceLastBitnode)]); } timeRows.push(["Total", convertTimeMsToTimeElapsedString(player.totalPlaytime)]); return ( <> General <> setMoneyOpen(true)} sx={{ p: 0 }}> {player.companyName && ( <> )} {player.jobs && Object.keys(player.jobs).length !== 0 && ( <> {Object.keys(player.jobs).length} total setEmployersOpen(true)} sx={{ p: 0 }}> )} 0 ? "Servers" : "Nodes"} owned`} color={Settings.theme.primary} data={{ content: `${player.hacknetNodes.length}${ player.bitNodeN === 9 || SourceFileFlags[9] > 0 ? ` / ${HacknetServerConstants.MaxServers}` : "" }`, }} />
Skills {player.intelligence > 0 && (player.bitNodeN === 5 || SourceFileFlags[5] > 0) && ( )}
Multipliers









Time Played {timeRows.map(([name, content]) => ( ))}
setMoneyOpen(false)} /> setEmployersOpen(false)} /> ); }