// 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 { CONSTANTS } from "../../Constants";
interface IProps {
save: () => void;
killScripts: () => void;
}
function Intelligence(): React.ReactElement {
const theme = useTheme();
const player = use.Player();
const classes = useStyles();
if (player.intelligence === 0) return <>>;
const progress = player.calculateSkillProgress(player.intelligence_exp);
return (
<>
Int
{numeralWrapper.formatSkill(player.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}
Focus
>
);
}
function Work(): React.ReactElement {
const player = use.Player();
const router = use.Router();
const onClickFocus = (): void => {
player.startFocusing();
router.toWork();
};
if (!player.isWorking || player.focus) return <>>;
let details = <>>;
let header = <>>;
let innerText = <>>;
if (player.workType === CONSTANTS.WorkTypeCompanyPartTime || player.workType === CONSTANTS.WorkTypeCompany) {
details = (
<>
{player.jobs[player.companyName]} at {player.companyName}
>
);
header = (
<>
Working at {player.companyName}
>
);
innerText = (
<>
+ rep
>
);
} else if (player.workType === CONSTANTS.WorkTypeFaction) {
details = (
<>
{player.factionWorkType} for {player.currentWorkFactionName}
>
);
header = (
<>
Working for {player.currentWorkFactionName}
>
);
innerText = (
<>
+ rep
>
);
} else if (player.workType === CONSTANTS.WorkTypeStudyClass) {
details = <>{player.workType}>;
header = <>You are {player.className}>;
innerText = <>{convertTimeMsToTimeElapsedString(player.timeWorked)}>;
} else if (player.workType === CONSTANTS.WorkTypeCreateProgram) {
details = <>Coding {player.createProgramName}>;
header = <>Creating a program>;
innerText = (
<>
{player.createProgramName}{" "}
{((player.timeWorkedCreateProgram / player.timeNeededToCompleteWork) * 100).toFixed(2)}%
>
);
}
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.hacking_exp,
player.hacking_mult * BitNodeMultipliers.HackingLevelMultiplier,
);
const strengthProgress = player.calculateSkillProgress(
player.strength_exp,
player.strength_mult * BitNodeMultipliers.StrengthLevelMultiplier,
);
const defenseProgress = player.calculateSkillProgress(
player.defense_exp,
player.defense_mult * BitNodeMultipliers.DefenseLevelMultiplier,
);
const dexterityProgress = player.calculateSkillProgress(
player.dexterity_exp,
player.dexterity_mult * BitNodeMultipliers.DexterityLevelMultiplier,
);
const agilityProgress = player.calculateSkillProgress(
player.agility_exp,
player.agility_mult * BitNodeMultipliers.AgilityLevelMultiplier,
);
const charismaProgress = player.calculateSkillProgress(
player.charisma_exp,
player.charisma_mult * BitNodeMultipliers.CharismaLevelMultiplier,
);
return (
<>
HP
{numeralWrapper.formatHp(player.hp)} / {numeralWrapper.formatHp(player.max_hp)}
{/*Hook for player scripts*/}
Money
{numeralWrapper.formatMoney(player.money)}
{/*Hook for player scripts*/}
Hack
{numeralWrapper.formatSkill(player.hacking)}
{!Settings.DisableOverviewProgressBars && (
)}
{/*Hook for player scripts*/}
Str
{numeralWrapper.formatSkill(player.strength)}
{/*Hook for player scripts*/}
{!Settings.DisableOverviewProgressBars && (
)}
Def
{numeralWrapper.formatSkill(player.defense)}
{/*Hook for player scripts*/}
{!Settings.DisableOverviewProgressBars && (
)}
Dex
{numeralWrapper.formatSkill(player.dexterity)}
{/*Hook for player scripts*/}
{!Settings.DisableOverviewProgressBars && (
)}
Agi
{numeralWrapper.formatSkill(player.agility)}
{/*Hook for player scripts*/}
{!Settings.DisableOverviewProgressBars && (
)}
Cha
{numeralWrapper.formatSkill(player.charisma)}
{/*Hook for player scripts*/}
{!Settings.DisableOverviewProgressBars && (
)}
setKillOpen(true)}>
setKillOpen(false)} killScripts={killScripts} />
>
);
}