// Root React Component for the Corporation UI import React, { useState, useEffect } from "react"; import { Theme, useTheme } from "@mui/material/styles"; import makeStyles from "@mui/styles/makeStyles"; import createStyles from "@mui/styles/createStyles"; import { numeralWrapper } from "../numeralFormat"; import { Reputation } from "./Reputation"; import { KillScriptsModal } from "./KillScriptsModal"; import { convertTimeMsToTimeElapsedString } from "../../utils/StringHelperFunctions"; import Table from "@mui/material/Table"; import TableBody from "@mui/material/TableBody"; import TableCell from "@mui/material/TableCell"; import TableRow from "@mui/material/TableRow"; import Typography from "@mui/material/Typography"; import Button from "@mui/material/Button"; import IconButton from "@mui/material/IconButton"; import SaveIcon from "@mui/icons-material/Save"; import ClearAllIcon from "@mui/icons-material/ClearAll"; import { Settings } from "../../Settings/Settings"; import { use } from "../Context"; import { StatsProgressOverviewCell } from "./StatsProgressBar"; import { BitNodeMultipliers } from "../../BitNode/BitNodeMultipliers"; import { Box, Tooltip } from "@mui/material"; import { isClassWork } from "../../Work/ClassWork"; import { CONSTANTS } from "../../Constants"; import { isCreateProgramWork } from "../../Work/CreateProgramWork"; import { isGraftingWork } from "../../Work/GraftingWork"; import { isFactionWork } from "../../Work/FactionWork"; import { ReputationRate } from "./ReputationRate"; import { isCompanyWork } from "../../Work/CompanyWork"; import { isCrimeWork } from "../../Work/CrimeWork"; interface IProps { save: () => void; killScripts: () => void; } function Intelligence(): React.ReactElement { const theme = useTheme(); const player = use.Player(); const classes = useStyles(); if (player.skills.intelligence === 0) return <>; const progress = player.calculateSkillProgress(player.exp.intelligence); return ( <> Int  {numeralWrapper.formatSkill(player.skills.intelligence)} {/*Hook for player scripts*/} {!Settings.DisableOverviewProgressBars && ( )} ); } function Bladeburner(): React.ReactElement { const player = use.Player(); const classes = useStyles(); const bladeburner = player.bladeburner; if (bladeburner === null) return <>; const action = bladeburner.getTypeAndNameFromActionId(bladeburner.action); if (action.type === "Idle") return <>; return ( <> Bladeburner: {action.type}: {action.name} ); } interface WorkInProgressOverviewProps { tooltip: React.ReactNode; header: React.ReactNode; children: React.ReactNode; onClickFocus: () => void; } function WorkInProgressOverview({ tooltip, children, onClickFocus, header, }: WorkInProgressOverviewProps): React.ReactElement { const classes = useStyles(); return ( <> {tooltip}}> {header} {children} ); } function Work(): React.ReactElement { const player = use.Player(); const router = use.Router(); const onClickFocus = (): void => { player.startFocusing(); router.toWork(); }; if (player.currentWork === null || player.focus) return <>; let details = <>; let header = <>; let innerText = <>; if (isCrimeWork(player.currentWork)) { const crime = player.currentWork.getCrime(); const perc = (player.currentWork.unitCompleted / crime.time) * 100; details = <>{player.currentWork.crimeType}; header = <>You are attempting to {player.currentWork.crimeType}; innerText = <>{perc.toFixed(2)}%; } if (isClassWork(player.currentWork)) { details = <>{player.currentWork.getClass().youAreCurrently}; header = <>You are {player.currentWork.getClass().youAreCurrently}; innerText = <>{convertTimeMsToTimeElapsedString(player.currentWork.cyclesWorked * CONSTANTS._idleSpeed)}; } if (isCreateProgramWork(player.currentWork)) { const create = player.currentWork; details = <>Coding {create.programName}; header = <>Creating a program; innerText = ( <> {create.programName} {((create.unitCompleted / create.unitNeeded()) * 100).toFixed(2)}% ); } if (isGraftingWork(player.currentWork)) { const graft = player.currentWork; details = <>Grafting {graft.augmentation}; header = <>Grafting an Augmentation; innerText = ( <> {((graft.unitCompleted / graft.unitNeeded()) * 100).toFixed(2)}% done ); } if (isFactionWork(player.currentWork)) { const factionWork = player.currentWork; header = ( <> Working for {factionWork.factionName} ); innerText = ( <> rep
( ) ); } if (isCompanyWork(player.currentWork)) { const companyWork = player.currentWork; details = ( <> {player.jobs[companyWork.companyName]} at {companyWork.companyName} ); header = ( <> Working at {companyWork.companyName} ); innerText = ( <> rep
( ) ); } return ( {innerText} ); } const useStyles = makeStyles((theme: Theme) => createStyles({ workCell: { textAlign: "center", maxWidth: "200px", borderBottom: "none", padding: 0, margin: 0, }, workHeader: { fontSize: "0.9rem", }, workSubtitles: { fontSize: "0.8rem", }, cellNone: { borderBottom: "none", padding: 0, margin: 0, }, cell: { padding: 0, margin: 0, }, hp: { color: theme.colors.hp, }, money: { color: theme.colors.money, }, hack: { color: theme.colors.hack, }, combat: { color: theme.colors.combat, }, cha: { color: theme.colors.cha, }, int: { color: theme.colors.int, }, }), ); export { useStyles as characterOverviewStyles }; export function CharacterOverview({ save, killScripts }: IProps): React.ReactElement { const [killOpen, setKillOpen] = useState(false); const player = use.Player(); const setRerender = useState(false)[1]; useEffect(() => { const id = setInterval(() => setRerender((old) => !old), 600); return () => clearInterval(id); }, []); const classes = useStyles(); const theme = useTheme(); const hackingProgress = player.calculateSkillProgress( player.exp.hacking, player.mults.hacking * BitNodeMultipliers.HackingLevelMultiplier, ); const strengthProgress = player.calculateSkillProgress( player.exp.strength, player.mults.strength * BitNodeMultipliers.StrengthLevelMultiplier, ); const defenseProgress = player.calculateSkillProgress( player.exp.defense, player.mults.defense * BitNodeMultipliers.DefenseLevelMultiplier, ); const dexterityProgress = player.calculateSkillProgress( player.exp.dexterity, player.mults.dexterity * BitNodeMultipliers.DexterityLevelMultiplier, ); const agilityProgress = player.calculateSkillProgress( player.exp.agility, player.mults.agility * BitNodeMultipliers.AgilityLevelMultiplier, ); const charismaProgress = player.calculateSkillProgress( player.exp.charisma, player.mults.charisma * BitNodeMultipliers.CharismaLevelMultiplier, ); return ( <> HP  {numeralWrapper.formatHp(player.hp.current)} / {numeralWrapper.formatHp(player.hp.max)} {/*Hook for player scripts*/} Money  {numeralWrapper.formatMoney(player.money)} {/*Hook for player scripts*/} Hack  {numeralWrapper.formatSkill(player.skills.hacking)} {!Settings.DisableOverviewProgressBars && ( )} {/*Hook for player scripts*/} Str  {numeralWrapper.formatSkill(player.skills.strength)} {/*Hook for player scripts*/} {!Settings.DisableOverviewProgressBars && ( )} Def  {numeralWrapper.formatSkill(player.skills.defense)} {/*Hook for player scripts*/} {!Settings.DisableOverviewProgressBars && ( )} Dex  {numeralWrapper.formatSkill(player.skills.dexterity)} {/*Hook for player scripts*/} {!Settings.DisableOverviewProgressBars && ( )} Agi  {numeralWrapper.formatSkill(player.skills.agility)} {/*Hook for player scripts*/} {!Settings.DisableOverviewProgressBars && ( )} Cha  {numeralWrapper.formatSkill(player.skills.charisma)} {/*Hook for player scripts*/} {!Settings.DisableOverviewProgressBars && ( )} {/*Hook for player scripts*/} {/*Hook for player scripts*/} {/*Hook for player scripts*/}
setKillOpen(true)}> setKillOpen(false)} killScripts={killScripts} /> ); }