import { Box, Container, Paper, Table, TableBody, Tooltip } from "@mui/material"; import Button from "@mui/material/Button"; import Typography from "@mui/material/Typography"; import { uniqueId } from "lodash"; import React, { useEffect, useState } from "react"; import { Companies } from "../Company/Companies"; import { Company } from "../Company/Company"; import { CONSTANTS } from "../Constants"; import { Factions } from "../Faction/Factions"; import { LocationName } from "../Locations/data/LocationNames"; import { Locations } from "../Locations/Locations"; import { Settings } from "../Settings/Settings"; import { convertTimeMsToTimeElapsedString } from "../utils/StringHelperFunctions"; import { use } from "./Context"; import { numeralWrapper } from "./numeralFormat"; import { Money } from "./React/Money"; import { MoneyRate } from "./React/MoneyRate"; import { ProgressBar } from "./React/Progress"; import { Reputation } from "./React/Reputation"; import { ReputationRate } from "./React/ReputationRate"; import { StatsRow } from "./React/StatsRow"; const CYCLES_PER_SEC = 1000 / CONSTANTS.MilliPerCycle; interface IWorkInfo { buttons: { cancel: () => void; unfocus?: () => void; }; title: string | React.ReactElement; description?: string | React.ReactElement; gains?: (string | React.ReactElement)[]; progress?: { elapsed?: number; remaining?: number; percentage?: number; }; stopText: string; stopTooltip?: string | React.ReactElement; } export function WorkInProgressRoot(): React.ReactElement { const setRerender = useState(false)[1]; function rerender(): void { setRerender((old) => !old); } useEffect(() => { const id = setInterval(rerender, CONSTANTS.MilliPerCycle); return () => clearInterval(id); }, []); const player = use.Player(); const router = use.Router(); const expGains = [ player.workHackExpGained > 0 ? ( ) : ( <> ), player.workStrExpGained > 0 ? ( ) : ( <> ), player.workDefExpGained > 0 ? ( ) : ( <> ), player.workDexExpGained > 0 ? ( ) : ( <> ), player.workAgiExpGained > 0 ? ( ) : ( <> ), player.workChaExpGained > 0 ? ( ) : ( <> ), ]; let workInfo: IWorkInfo | null; if (player.workType == CONSTANTS.WorkTypeFaction) { const faction = Factions[player.currentWorkFactionName]; if (!faction) { workInfo = { buttons: { cancel: () => router.toFactions(), }, title: `You have not joined ${player.currentWorkFactionName || "(Faction not found)"} at this time,` + " please try again if you think this should have worked", stopText: "Back to Factions", }; } function cancel(): void { router.toFaction(faction); player.finishFactionWork(true); } function unfocus(): void { router.toFaction(faction); player.stopFocusing(); } workInfo = { buttons: { cancel: cancel, unfocus: unfocus, }, title: ( <> You are currently {player.currentWorkFactionDescription} for your faction {faction.name} ), description: ( <> Current Faction Reputation: ), gains: [ () , ( ) , ...expGains, ], progress: { elapsed: player.timeWorked, }, stopText: "Stop Faction work", }; } else if (player.className !== "") { const className = player.className; function cancel(): void { player.finishClass(true); router.toCity(); } function unfocus(): void { router.toCity(); player.stopFocusing(); } let stopText = ""; if ( className == CONSTANTS.ClassGymStrength || className == CONSTANTS.ClassGymDefense || className == CONSTANTS.ClassGymDexterity || className == CONSTANTS.ClassGymAgility ) { stopText = "Stop training at gym"; } else { stopText = "Stop taking course"; } workInfo = { buttons: { cancel: cancel, unfocus: unfocus, }, title: ( <> You are currently {className} ), gains: [ () , ...expGains, ], progress: { elapsed: player.timeWorked, }, stopText: stopText, }; } else if (player.workType == CONSTANTS.WorkTypeCompany) { const comp = Companies[player.companyName]; if (comp == null || !(comp instanceof Company)) { workInfo = { buttons: { cancel: () => router.toTerminal(), }, title: `You cannot work for ${player.companyName || "(Company not found)"} at this time,` + " please try again if you think this should have worked", stopText: "Back to Terminal", }; } const companyRep = comp.playerReputation; function cancel(): void { player.finishWork(true); router.toJob(); } function unfocus(): void { player.stopFocusing(); router.toJob(); } const position = player.jobs[player.companyName]; const penalty = player.cancelationPenalty(); const penaltyString = penalty === 0.5 ? "half" : "three-quarters"; workInfo = { buttons: { cancel: cancel, unfocus: unfocus, }, title: ( <> You are currently working as a {position} at {player.companyName} ), description: ( <> Current Company Reputation: ), gains: [ () , ( ) , ...expGains, ], progress: { elapsed: player.timeWorked, }, stopText: "Stop working", stopTooltip: "You will automatically finish after working for 8 hours. You can cancel earlier if you wish" + ` but you will only gain ${penaltyString} of the reputation you've earned so far.`, }; } else if (player.workType == CONSTANTS.WorkTypeCompanyPartTime) { function cancel(): void { player.finishWorkPartTime(true); router.toJob(); } function unfocus(): void { player.stopFocusing(); router.toJob(); } const comp = Companies[player.companyName]; let companyRep = 0; if (comp == null || !(comp instanceof Company)) { throw new Error(`Could not find Company: ${player.companyName}`); } companyRep = comp.playerReputation; const position = player.jobs[player.companyName]; workInfo = { buttons: { cancel: cancel, unfocus: unfocus, }, title: ( <> You are currently working as a {position} at {player.companyName} ), description: ( <> Current Company Reputation: ), gains: [ () , ( ) , ...expGains, ], progress: { elapsed: player.timeWorked, }, stopText: "Stop working", stopTooltip: "You will automatically finish after working for 8 hours. You can cancel earlier if you wish" + " and there will be no penalty because this is a part-time job.", }; } else if (player.crimeType !== "") { const completion = Math.round((player.timeWorked / player.timeNeededToCompleteWork) * 100); workInfo = { buttons: { cancel: () => { router.toLocation(Locations[LocationName.Slums]); player.finishCrime(true); }, }, title: `You are attempting to ${player.crimeType}`, progress: { elapsed: player.timeWorked, remaining: player.timeNeededToCompleteWork - player.timeWorked, percentage: completion, }, stopText: "Cancel crime", }; } else if (player.createProgramName !== "") { function cancel(): void { player.finishCreateProgramWork(true); router.toTerminal(); } function unfocus(): void { router.toTerminal(); player.stopFocusing(); } const completion = (player.timeWorkedCreateProgram / player.timeNeededToCompleteWork) * 100; workInfo = { buttons: { cancel: cancel, unfocus: unfocus, }, title: ( <> You are currently working on coding {player.createProgramName} ), progress: { elapsed: player.timeWorked, percentage: completion, }, stopText: "Stop creating program", stopTooltip: "Your work will be saved and you can return to complete the program later.", }; } else if (player.graftAugmentationName !== "") { function cancel(): void { player.finishGraftAugmentationWork(true); router.toTerminal(); } function unfocus(): void { router.toTerminal(); player.stopFocusing(); } const completion = (player.timeWorkedGraftAugmentation / player.timeNeededToCompleteWork) * 100; workInfo = { buttons: { cancel: cancel, unfocus: unfocus, }, title: ( <> You are currently working on grafting {player.graftAugmentationName} ), progress: { elapsed: player.timeWorked, percentage: completion, }, stopText: "Stop grafting", stopTooltip: ( <> If you cancel, you work will not be saved, and the money you spent will not be returned ), }; } else if (!player.workType) { router.toTerminal(); workInfo = null; } else { workInfo = null; } if (workInfo === null) { return <>; } const tooltipInfo = typeof workInfo?.stopTooltip === "string" ? ( {workInfo.stopTooltip} ) : ( workInfo.stopTooltip || <> ); return ( {workInfo.title} {workInfo.description} {workInfo.gains && ( {workInfo.gains.map((row) => ( {row} ))}
)}
{workInfo.progress !== undefined && ( {workInfo.progress.elapsed !== undefined && ( {convertTimeMsToTimeElapsedString(workInfo.progress.elapsed)} elapsed )} {workInfo.progress.remaining !== undefined && ( {convertTimeMsToTimeElapsedString(workInfo.progress.remaining)} remaining )} {workInfo.progress.percentage !== undefined && ( {workInfo.progress.percentage.toFixed(2)}% done )} {workInfo.progress.percentage !== undefined && ( )} )} {workInfo.stopTooltip ? ( ) : ( )} {workInfo.buttons.unfocus && ( )}
); }