more work

This commit is contained in:
Olivier Gagnon
2021-09-17 21:30:02 -04:00
parent 45f2f85a30
commit 907314e76b
33 changed files with 234 additions and 325 deletions

@ -1,128 +0,0 @@
@import "theme";
.active-scripts-list {
list-style-type: none;
}
.active-scripts-container {
> p {
margin: 6px;
padding: 4px;
}
.accordion-header {
> pre {
color: white;
}
}
}
.active-scripts-server-header {
background-color: #444;
font-size: $defaultFontSize * 1.25;
color: #fff;
margin: 6px 6px 0 6px;
padding: 6px;
cursor: pointer;
width: 60%;
text-align: left;
border: none;
outline: none;
&:after {
content: "\02795"; /* "plus" sign (+) */
font-size: $defaultFontSize * 0.8125;
color: #fff;
float: right;
margin-left: 5px;
}
&.active,
&:hover {
background-color: #555;
}
}
.active-scripts-server-header.active {
&:after {
content: "\2796"; /* "minus" sign (-) */
font-size: $defaultFontSize * 0.8125;
color: #fff;
float: right;
margin-left: 5px;
}
&:hover {
background-color: #666;
}
}
.active-scripts-server-panel {
margin: 0 6px 6px 6px;
padding: 0 6px 6px 6px;
width: 55%;
margin-left: 5%;
display: none;
div,
ul,
ul > li {
background-color: #555;
}
}
.active-scripts-script-header {
background-color: #555;
border: none;
color: var(--my-font-color);
cursor: pointer;
display: block;
outline: none;
padding: 4px 25px 4px 10px;
position: relative;
text-align: left;
width: auto;
&:after {
content: "\02795"; /* "plus" sign (+) */
font-size: $defaultFontSize * 0.8125;
float: right;
margin-left: 5px;
color: transparent;
text-shadow: 0 0 0 var(--my-font-color);
position: absolute;
bottom: 4px;
}
&.active:after {
content: "\2796"; /* "minus" sign (-) */
}
&:hover,
&.active:hover {
background-color: #666;
}
&.active {
background-color: #555;
}
}
.active-scripts-script-panel {
background-color: #555;
display: none;
font-size: 14px;
margin-bottom: 6px;
padding: 0 18px;
width: auto;
pre,
h2,
ul,
li {
background-color: #555;
width: auto;
color: #fff;
margin-left: 5%;
}
}

@ -4,7 +4,6 @@ import { IEngine } from "./IEngine";
import { IRouter } from "./ui/Router"; import { IRouter } from "./ui/Router";
import React from "react"; import React from "react";
import { TTheme as Theme } from "./ui/React/Theme";
import { General } from "./DevMenu/ui/General"; import { General } from "./DevMenu/ui/General";
import { Stats } from "./DevMenu/ui/Stats"; import { Stats } from "./DevMenu/ui/Stats";
@ -30,7 +29,6 @@ interface IProps {
export function DevMenuRoot(props: IProps): React.ReactElement { export function DevMenuRoot(props: IProps): React.ReactElement {
return ( return (
<Theme>
<> <>
<h1>Development Menu - Only meant to be used for testing/debugging</h1> <h1>Development Menu - Only meant to be used for testing/debugging</h1>
<General player={props.player} router={props.router} /> <General player={props.player} router={props.router} />
@ -56,6 +54,5 @@ export function DevMenuRoot(props: IProps): React.ReactElement {
<TimeSkip player={props.player} engine={props.engine} /> <TimeSkip player={props.player} engine={props.engine} />
</> </>
</Theme>
); );
} }

@ -40,7 +40,7 @@ export function Augmentations(props: IProps): React.ReactElement {
} }
return ( return (
<Accordion> <Accordion TransitionProps={{ unmountOnExit: true }}>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Augmentations</h2> <h2>Augmentations</h2>
</AccordionSummary> </AccordionSummary>

@ -55,7 +55,7 @@ export function Bladeburner(props: IProps): React.ReactElement {
} }
return ( return (
<Accordion> <Accordion TransitionProps={{ unmountOnExit: true }}>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Bladeburner</h2> <h2>Bladeburner</h2>
</AccordionSummary> </AccordionSummary>

@ -25,7 +25,7 @@ export function CodingContracts(): React.ReactElement {
} }
return ( return (
<Accordion> <Accordion TransitionProps={{ unmountOnExit: true }}>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Coding Contracts</h2> <h2>Coding Contracts</h2>
</AccordionSummary> </AccordionSummary>

@ -69,7 +69,7 @@ export function Companies(): React.ReactElement {
} }
return ( return (
<Accordion> <Accordion TransitionProps={{ unmountOnExit: true }}>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Companies</h2> <h2>Companies</h2>
</AccordionSummary> </AccordionSummary>

@ -67,7 +67,7 @@ export function Corporation(props: IProps): React.ReactElement {
} }
return ( return (
<Accordion> <Accordion TransitionProps={{ unmountOnExit: true }}>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Corporation</h2> <h2>Corporation</h2>
</AccordionSummary> </AccordionSummary>

@ -97,7 +97,7 @@ export function Factions(props: IProps): React.ReactElement {
} }
return ( return (
<Accordion> <Accordion TransitionProps={{ unmountOnExit: true }}>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Factions</h2> <h2>Factions</h2>
</AccordionSummary> </AccordionSummary>

@ -36,7 +36,7 @@ export function Gang(props: IProps): React.ReactElement {
} }
return ( return (
<Accordion> <Accordion TransitionProps={{ unmountOnExit: true }}>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Gang</h2> <h2>Gang</h2>
</AccordionSummary> </AccordionSummary>

@ -43,7 +43,7 @@ export function General(props: IProps): React.ReactElement {
} }
return ( return (
<Accordion> <Accordion TransitionProps={{ unmountOnExit: true }}>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>General</h2> <h2>General</h2>
</AccordionSummary> </AccordionSummary>

@ -35,7 +35,7 @@ export function Programs(props: IProps): React.ReactElement {
} }
return ( return (
<Accordion> <Accordion TransitionProps={{ unmountOnExit: true }}>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Programs</h2> <h2>Programs</h2>
</AccordionSummary> </AccordionSummary>

@ -75,7 +75,7 @@ export function Servers(): React.ReactElement {
} }
return ( return (
<Accordion> <Accordion TransitionProps={{ unmountOnExit: true }}>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Servers</h2> <h2>Servers</h2>
</AccordionSummary> </AccordionSummary>

@ -38,7 +38,7 @@ export function Sleeves(props: IProps): React.ReactElement {
} }
return ( return (
<Accordion> <Accordion TransitionProps={{ unmountOnExit: true }}>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Sleeves</h2> <h2>Sleeves</h2>
</AccordionSummary> </AccordionSummary>

@ -51,7 +51,7 @@ export function SourceFiles(props: IProps): React.ReactElement {
} }
return ( return (
<Accordion> <Accordion TransitionProps={{ unmountOnExit: true }}>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Source-Files</h2> <h2>Source-Files</h2>
</AccordionSummary> </AccordionSummary>

@ -136,7 +136,7 @@ export function Stats(props: IProps): React.ReactElement {
} }
return ( return (
<Accordion> <Accordion TransitionProps={{ unmountOnExit: true }}>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Experience / Stats</h2> <h2>Experience / Stats</h2>
</AccordionSummary> </AccordionSummary>

@ -80,7 +80,7 @@ export function StockMarket(): React.ReactElement {
); );
} }
return ( return (
<Accordion> <Accordion TransitionProps={{ unmountOnExit: true }}>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Stock Market</h2> <h2>Stock Market</h2>
</AccordionSummary> </AccordionSummary>

@ -28,7 +28,7 @@ export function TimeSkip(props: IProps): React.ReactElement {
} }
return ( return (
<Accordion> <Accordion TransitionProps={{ unmountOnExit: true }}>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Time skip</h2> <h2>Time skip</h2>
</AccordionSummary> </AccordionSummary>

@ -55,7 +55,9 @@ export function GangStats(props: IProps): React.ReactElement {
</p> </p>
<br /> <br />
<div> <div>
<p style={{ display: "inline-block" }}>Money gain rate: {MoneyRate(5 * props.gang.moneyGainRate)}</p> <p style={{ display: "inline-block" }}>
Money gain rate: <MoneyRate money={5 * props.gang.moneyGainRate} />
</p>
</div> </div>
<br /> <br />
<p className="tooltip" style={{ display: "inline-block" }}> <p className="tooltip" style={{ display: "inline-block" }}>

@ -28,7 +28,7 @@ export function TaskSelector(props: IProps): React.ReactElement {
const tasks = props.gang.getAllTaskNames(); const tasks = props.gang.getAllTaskNames();
const data = [ const data = [
[`Money:`, MoneyRate(5 * props.member.calculateMoneyGain(props.gang))], [`Money:`, <MoneyRate money={5 * props.member.calculateMoneyGain(props.gang)} />],
[`Respect:`, `${numeralWrapper.formatRespect(5 * props.member.calculateRespectGain(props.gang))} / sec`], [`Respect:`, `${numeralWrapper.formatRespect(5 * props.member.calculateRespectGain(props.gang))} / sec`],
[`Wanted Level:`, `${numeralWrapper.formatWanted(5 * props.member.calculateWantedLevelGain(props.gang))} / sec`], [`Wanted Level:`, `${numeralWrapper.formatWanted(5 * props.member.calculateWantedLevelGain(props.gang))} / sec`],
[`Total Respect:`, `${numeralWrapper.formatRespect(props.member.earnedRespect)}`], [`Total Respect:`, `${numeralWrapper.formatRespect(props.member.earnedRespect)}`],

@ -144,7 +144,8 @@ export function HacknetNodeElem(props: IProps): React.ReactElement {
<div className={"row"}> <div className={"row"}>
<p>Production:</p> <p>Production:</p>
<span className={"text money-gold"}> <span className={"text money-gold"}>
<Money money={node.totalMoneyGenerated} player={props.player} /> ({MoneyRate(node.moneyGainRatePerSecond)}) <Money money={node.totalMoneyGenerated} player={props.player} /> (
<MoneyRate money={node.moneyGainRatePerSecond} />)
</span> </span>
</div> </div>
<div className={"row"}> <div className={"row"}>

@ -25,7 +25,7 @@ export function PlayerInfo(props: IProps): React.ReactElement {
if (hasServers) { if (hasServers) {
prod = HashRate(props.totalProduction); prod = HashRate(props.totalProduction);
} else { } else {
prod = MoneyRate(props.totalProduction); prod = <MoneyRate money={props.totalProduction} />;
} }
return ( return (

@ -175,7 +175,7 @@ export function SleeveElem(props: IProps): React.ReactElement {
// }); // });
} else { } else {
data = [ data = [
[`Money:`, MoneyRate(5 * props.sleeve.gainRatesForTask.money)], [`Money:`, <MoneyRate money={5 * props.sleeve.gainRatesForTask.money} />],
[`Hacking Exp:`, `${numeralWrapper.formatExp(5 * props.sleeve.gainRatesForTask.hack)} / s`], [`Hacking Exp:`, `${numeralWrapper.formatExp(5 * props.sleeve.gainRatesForTask.hack)} / s`],
[`Strength Exp:`, `${numeralWrapper.formatExp(5 * props.sleeve.gainRatesForTask.str)} / s`], [`Strength Exp:`, `${numeralWrapper.formatExp(5 * props.sleeve.gainRatesForTask.str)} / s`],
[`Defense Exp:`, `${numeralWrapper.formatExp(5 * props.sleeve.gainRatesForTask.def)} / s`], [`Defense Exp:`, `${numeralWrapper.formatExp(5 * props.sleeve.gainRatesForTask.def)} / s`],

@ -8,7 +8,6 @@ import "../css/mainmenu.scss";
import "../css/characteroverview.scss"; import "../css/characteroverview.scss";
import "../css/terminal.scss"; import "../css/terminal.scss";
import "../css/scripteditor.scss"; import "../css/scripteditor.scss";
import "../css/activescripts.scss";
import "../css/hacknetnodes.scss"; import "../css/hacknetnodes.scss";
import "../css/menupages.scss"; import "../css/menupages.scss";
import "../css/augmentations.scss"; import "../css/augmentations.scss";

@ -8,10 +8,10 @@ import { ScriptProduction } from "./ScriptProduction";
import { ServerAccordions } from "./ServerAccordions"; import { ServerAccordions } from "./ServerAccordions";
import { WorkerScript } from "../../Netscript/WorkerScript"; import { WorkerScript } from "../../Netscript/WorkerScript";
import { IPlayer } from "../../PersonObjects/IPlayer";
import Typography from "@mui/material/Typography";
type IProps = { type IProps = {
p: IPlayer;
workerScripts: Map<number, WorkerScript>; workerScripts: Map<number, WorkerScript>;
}; };
@ -27,15 +27,15 @@ export function ActiveScriptsRoot(props: IProps): React.ReactElement {
}, []); }, []);
return ( return (
<div className="active-scripts-container"> <>
<p> <Typography>
This page displays a list of all of your scripts that are currently running across every machine. It also This page displays a list of all of your scripts that are currently running across every machine. It also
provides information about each script's production. The scripts are categorized by the hostname of the servers provides information about each script's production. The scripts are categorized by the hostname of the servers
on which they are running. on which they are running.
</p> </Typography>
<ScriptProduction {...props} /> <ScriptProduction {...props} />
<ServerAccordions {...props} /> <ServerAccordions {...props} />
</div> </>
); );
} }

@ -5,16 +5,44 @@
import * as React from "react"; import * as React from "react";
import { WorkerScript } from "../../Netscript/WorkerScript"; import { WorkerScript } from "../../Netscript/WorkerScript";
import { IPlayer } from "../../PersonObjects/IPlayer";
import { Money } from "../React/Money"; import { Money } from "../React/Money";
import { MoneyRate } from "../React/MoneyRate";
import { use } from "../Context";
import Typography from "@mui/material/Typography";
import Box from "@mui/material/Box";
import { Theme } from "@mui/material/styles";
import makeStyles from "@mui/styles/makeStyles";
import createStyles from "@mui/styles/createStyles";
import Table from "@mui/material/Table";
import TableBody from "@mui/material/TableBody";
import TableCell from "@mui/material/TableCell";
import TableContainer from "@mui/material/TableContainer";
import TableHead from "@mui/material/TableHead";
import TableRow from "@mui/material/TableRow";
type IProps = { type IProps = {
p: IPlayer;
workerScripts: Map<number, WorkerScript>; workerScripts: Map<number, WorkerScript>;
}; };
const useStyles = makeStyles((theme: Theme) =>
createStyles({
cell: {
borderBottom: "none",
padding: theme.spacing(1),
margin: theme.spacing(1),
whiteSpace: "nowrap",
},
size: {
width: "1px",
},
}),
);
export function ScriptProduction(props: IProps): React.ReactElement { export function ScriptProduction(props: IProps): React.ReactElement {
const prodRateSinceLastAug = props.p.scriptProdSinceLastAug / (props.p.playtimeSinceLastAug / 1000); const player = use.Player();
const classes = useStyles();
const prodRateSinceLastAug = player.scriptProdSinceLastAug / (player.playtimeSinceLastAug / 1000);
let onlineProduction = 0; let onlineProduction = 0;
for (const ws of props.workerScripts.values()) { for (const ws of props.workerScripts.values()) {
@ -22,27 +50,29 @@ export function ScriptProduction(props: IProps): React.ReactElement {
} }
return ( return (
<p id="active-scripts-total-prod"> <Table size="small" classes={{ root: classes.size }}>
Total online production of Active scripts:&nbsp; <TableBody>
<span className="money-gold"> <TableRow>
<span id="active-scripts-total-production-active"> <TableCell component="th" scope="row" classes={{ root: classes.cell }}>
<Money money={onlineProduction} /> <Typography variant="body2">Total online production of Active scripts:</Typography>
</span>{" "} </TableCell>
/ sec <TableCell align="left" classes={{ root: classes.cell }}>
</span> <Typography variant="body2">
<br /> <Money money={player.scriptProdSinceLastAug} />
Total online production since last Aug installation:&nbsp; </Typography>
<span id="active-scripts-total-prod-aug-total" className="money-gold"> </TableCell>
<Money money={props.p.scriptProdSinceLastAug} /> </TableRow>
</span> <TableRow style={{ width: "1px" }}>
&nbsp;( <TableCell component="th" scope="row" classes={{ root: classes.cell }}>
<span className="money-gold"> <Typography variant="body2">Total online production since last Aug installation:</Typography>
<span id="active-scripts-total-prod-aug-avg" className="money-gold"> </TableCell>
<Money money={prodRateSinceLastAug} /> <TableCell align="left" classes={{ root: classes.cell }}>
</span>{" "} <Typography variant="body2">
/ sec (<MoneyRate money={prodRateSinceLastAug} />)
</span> </Typography>
) </TableCell>
</p> </TableRow>
</TableBody>
</Table>
); );
} }

@ -4,7 +4,11 @@
*/ */
import * as React from "react"; import * as React from "react";
import { BBAccordion } from "../React/BBAccordion"; import Typography from "@mui/material/Typography";
import Accordion from "@mui/material/Accordion";
import AccordionSummary from "@mui/material/AccordionSummary";
import AccordionDetails from "@mui/material/AccordionDetails";
import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
import { ServerAccordionContent } from "./ServerAccordionContent"; import { ServerAccordionContent } from "./ServerAccordionContent";
import { BaseServer } from "../../Server/BaseServer"; import { BaseServer } from "../../Server/BaseServer";
@ -34,9 +38,15 @@ export function ServerAccordion(props: IProps): React.ReactElement {
const headerTxt = `${paddedName} ${createProgressBarText(barOptions)}`; const headerTxt = `${paddedName} ${createProgressBarText(barOptions)}`;
return ( return (
<BBAccordion <Accordion TransitionProps={{ unmountOnExit: true }}>
headerContent={<pre>{headerTxt}</pre>} <AccordionSummary expandIcon={<ExpandMoreIcon />}>
panelContent={<ServerAccordionContent workerScripts={props.workerScripts} />} <Typography style={{ whiteSpace: "pre-wrap" }} color="primary">
/> {headerTxt}
</Typography>
</AccordionSummary>
<AccordionDetails>
<ServerAccordionContent workerScripts={props.workerScripts} />
</AccordionDetails>
</Accordion>
); );
} }

@ -14,11 +14,13 @@ export function ServerAccordionContent(props: IProps): React.ReactElement {
return <ServerAccordionContentPaginated workerScripts={props.workerScripts} />; return <ServerAccordionContentPaginated workerScripts={props.workerScripts} />;
} }
const scripts = props.workerScripts.map((ws) => { return (
<ul>
{props.workerScripts.map((ws) => {
return <WorkerScriptAccordion key={`${ws.name}_${ws.args}`} workerScript={ws} />; return <WorkerScriptAccordion key={`${ws.name}_${ws.args}`} workerScript={ws} />;
}); })}
</ul>
return <ul>{scripts}</ul>; );
} }
export function ServerAccordionContentPaginated(props: IProps): React.ReactElement { export function ServerAccordionContentPaginated(props: IProps): React.ReactElement {

@ -2,7 +2,7 @@
* React Component for rendering the Accordion elements for all servers * React Component for rendering the Accordion elements for all servers
* on which scripts are running * on which scripts are running
*/ */
import * as React from "react"; import React, { useState, useEffect } from "react";
import { ServerAccordion } from "./ServerAccordion"; import { ServerAccordion } from "./ServerAccordion";
@ -18,7 +18,7 @@ interface IServerData {
} }
interface IServerToScriptsMap { interface IServerToScriptsMap {
[key: string]: IServerData; [key: string]: IServerData | undefined;
} }
type IProps = { type IProps = {
@ -31,72 +31,47 @@ type IState = {
const subscriberId = "ActiveScriptsUI"; const subscriberId = "ActiveScriptsUI";
export class ServerAccordions extends React.Component<IProps, IState> { export function ServerAccordions(props: IProps): React.ReactElement {
serverToScriptMap: IServerToScriptsMap = {}; const setRerender = useState(false)[1];
function rerender(): void {
constructor(props: IProps) { setRerender((old) => !old);
super(props);
this.state = {
rerenderFlag: false,
};
this.updateServerToScriptsMap();
this.rerender = this.rerender.bind(this);
} }
componentDidMount(): void { useEffect(() => {
WorkerScriptStartStopEventEmitter.addSubscriber({ WorkerScriptStartStopEventEmitter.addSubscriber({
cb: this.rerender, cb: rerender,
id: subscriberId, id: subscriberId,
}); });
} return () => WorkerScriptStartStopEventEmitter.removeSubscriber(subscriberId);
}, []);
componentWillUnmount(): void { const serverToScriptMap: IServerToScriptsMap = {};
WorkerScriptStartStopEventEmitter.removeSubscriber(subscriberId); for (const ws of props.workerScripts.values()) {
}
updateServerToScriptsMap(): void {
const map: IServerToScriptsMap = {};
for (const ws of this.props.workerScripts.values()) {
const server = getServer(ws.serverIp); const server = getServer(ws.serverIp);
if (server == null) { if (server == null) {
console.warn(`WorkerScript has invalid IP address: ${ws.serverIp}`); console.warn(`WorkerScript has invalid IP address: ${ws.serverIp}`);
continue; continue;
} }
if (map[server.hostname] == null) { let data = serverToScriptMap[server.hostname];
map[server.hostname] = {
if (data === undefined) {
serverToScriptMap[server.hostname] = {
server: server, server: server,
workerScripts: [], workerScripts: [],
}; };
data = serverToScriptMap[server.hostname];
} }
if (data !== undefined) data.workerScripts.push(ws);
map[server.hostname].workerScripts.push(ws);
} }
this.serverToScriptMap = map;
}
rerender(): void {
this.updateServerToScriptsMap();
this.setState((prevState) => {
return { rerenderFlag: !prevState.rerenderFlag };
});
}
render(): React.ReactNode {
const elems = Object.keys(this.serverToScriptMap).map((serverName) => {
const data = this.serverToScriptMap[serverName];
return <ServerAccordion key={serverName} server={data.server} workerScripts={data.workerScripts} />;
});
return ( return (
<ul className="active-scripts-list" id="active-scripts-list"> <ul className="active-scripts-list" id="active-scripts-list">
{elems} {Object.values(serverToScriptMap).map((data) => {
return (
data && <ServerAccordion key={data.server.hostname} server={data.server} workerScripts={data.workerScripts} />
);
})}
</ul> </ul>
); );
} }
}

@ -6,8 +6,15 @@ import * as React from "react";
import { numeralWrapper } from "../numeralFormat"; import { numeralWrapper } from "../numeralFormat";
import { BBAccordion } from "../React/BBAccordion"; import Button from "@mui/material/Button";
import Typography from "@mui/material/Typography";
import Accordion from "@mui/material/Accordion";
import AccordionSummary from "@mui/material/AccordionSummary";
import AccordionDetails from "@mui/material/AccordionDetails";
import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
import { AccordionButton } from "../React/AccordionButton"; import { AccordionButton } from "../React/AccordionButton";
import IconButton from "@mui/material/IconButton";
import DeleteIcon from "@mui/icons-material/Delete";
import { killWorkerScript } from "../../Netscript/killWorkerScript"; import { killWorkerScript } from "../../Netscript/killWorkerScript";
import { WorkerScript } from "../../Netscript/WorkerScript"; import { WorkerScript } from "../../Netscript/WorkerScript";
@ -41,12 +48,11 @@ export function WorkerScriptAccordion(props: IProps): React.ReactElement {
const offlineEps = scriptRef.offlineExpGained / scriptRef.offlineRunningTime; const offlineEps = scriptRef.offlineExpGained / scriptRef.offlineRunningTime;
return ( return (
<BBAccordion <Accordion TransitionProps={{ unmountOnExit: true }}>
headerClass="active-scripts-script-header" <AccordionSummary expandIcon={<ExpandMoreIcon />}>
headerContent={<>{props.workerScript.name}</>} <Typography color="primary">{props.workerScript.name}</Typography>
panelClass="active-scripts-script-panel" </AccordionSummary>
panelContent={ <AccordionDetails>
<>
<pre>Threads: {numeralWrapper.formatThreads(props.workerScript.scriptRef.threads)}</pre> <pre>Threads: {numeralWrapper.formatThreads(props.workerScript.scriptRef.threads)}</pre>
<pre>Args: {arrayToString(props.workerScript.args)}</pre> <pre>Args: {arrayToString(props.workerScript.args)}</pre>
<pre>Online Time: {convertTimeMsToTimeElapsedString(scriptRef.onlineRunningTime * 1e3)}</pre> <pre>Online Time: {convertTimeMsToTimeElapsedString(scriptRef.onlineRunningTime * 1e3)}</pre>
@ -68,10 +74,13 @@ export function WorkerScriptAccordion(props: IProps): React.ReactElement {
</pre> </pre>
<pre>{Array(26).join(" ") + numeralWrapper.formatExp(offlineEps) + " hacking exp / second"}</pre> <pre>{Array(26).join(" ") + numeralWrapper.formatExp(offlineEps) + " hacking exp / second"}</pre>
<AccordionButton onClick={logClickHandler} text="Log" /> <Button onClick={logClickHandler}>
<AccordionButton onClick={killScriptClickHandler} text="Kill Script" /> <Typography>Log</Typography>
</> </Button>
} <IconButton onClick={killScriptClickHandler}>
/> <DeleteIcon color="error" />
</IconButton>
</AccordionDetails>
</Accordion>
); );
} }

@ -278,7 +278,7 @@ export function GameRoot({ player, engine, terminal }: IProps): React.ReactEleme
) : page === Page.CreateScript ? ( ) : page === Page.CreateScript ? (
<ScriptEditorRoot filename={filename} code={code} player={player} router={Router} /> <ScriptEditorRoot filename={filename} code={code} player={player} router={Router} />
) : page === Page.ActiveScripts ? ( ) : page === Page.ActiveScripts ? (
<ActiveScriptsRoot p={player} workerScripts={workerScripts} /> <ActiveScriptsRoot workerScripts={workerScripts} />
) : page === Page.Hacknet ? ( ) : page === Page.Hacknet ? (
<HacknetRoot player={player} /> <HacknetRoot player={player} />
) : page === Page.CreateProgram ? ( ) : page === Page.CreateProgram ? (

@ -2,6 +2,6 @@ import React from "react";
import { numeralWrapper } from "../../ui/numeralFormat"; import { numeralWrapper } from "../../ui/numeralFormat";
import { Money } from "../../ui/React/Money"; import { Money } from "../../ui/React/Money";
export function MoneyRate(money: number): JSX.Element { export function MoneyRate({ money }: { money: number }): JSX.Element {
return <Money money={`${numeralWrapper.formatMoney(money)} / sec`} />; return <Money money={`${numeralWrapper.formatMoney(money)} / sec`} />;
} }

@ -19,6 +19,10 @@ export const colors = {
secondary: "#888", secondary: "#888",
secondarydark: "#666", secondarydark: "#666",
warninglight: "#ff0",
warning: "#cc0",
warningdark: "#990",
welllight: "#444", welllight: "#444",
well: "#222", well: "#222",
white: "#fff", white: "#fff",
@ -49,6 +53,11 @@ export const theme = createTheme({
main: colors.error, main: colors.error,
dark: colors.errordark, dark: colors.errordark,
}, },
warning: {
light: colors.warninglight,
main: colors.warning,
dark: colors.warningdark,
},
background: { background: {
paper: colors.well, paper: colors.well,
}, },
@ -66,7 +75,6 @@ export const theme = createTheme({
backgroundColor: colors.well, backgroundColor: colors.well,
}, },
input: { input: {
color: colors.primary,
"&::placeholder": { "&::placeholder": {
userSelect: "none", userSelect: "none",
color: colors.primarydark, color: colors.primarydark,
@ -106,22 +114,22 @@ export const theme = createTheme({
}, },
}, },
}, },
MuiButton: { // MuiButton: {
styleOverrides: { // styleOverrides: {
root: { // root: {
backgroundColor: "#333", // backgroundColor: "#333",
border: "1px solid " + colors.well, // border: "1px solid " + colors.well,
// color: colors.primary, // // color: colors.primary,
margin: "5px", // margin: "5px",
padding: "3px 5px", // padding: "3px 5px",
"&:hover": { // "&:hover": {
backgroundColor: colors.black, // backgroundColor: colors.black,
}, // },
borderRadius: 0, // borderRadius: 0,
}, // },
}, // },
}, // },
MuiSelect: { MuiSelect: {
styleOverrides: { styleOverrides: {
icon: { icon: {

@ -47,7 +47,8 @@ export function WorkInProgressRoot(): React.ReactElement {
<br /> <br />
You have earned: <br /> You have earned: <br />
<br /> <br />
<Money money={player.workMoneyGained} /> ({MoneyRate(player.workMoneyGainRate * CYCLES_PER_SEC)}) <br /> <Money money={player.workMoneyGained} /> (<MoneyRate money={player.workMoneyGainRate * CYCLES_PER_SEC} />){" "}
<br />
<br /> <br />
{Reputation(player.workRepGained)} ({ReputationRate(player.workRepGainRate * CYCLES_PER_SEC)}) reputation for {Reputation(player.workRepGained)} ({ReputationRate(player.workRepGainRate * CYCLES_PER_SEC)}) reputation for
this faction <br /> this faction <br />
@ -112,7 +113,8 @@ export function WorkInProgressRoot(): React.ReactElement {
<br /> <br />
<br /> <br />
This has cost you: <br /> This has cost you: <br />
<Money money={-player.workMoneyGained} /> ({MoneyRate(player.workMoneyLossRate * CYCLES_PER_SEC)}) <br /> <Money money={-player.workMoneyGained} /> (<MoneyRate money={player.workMoneyLossRate * CYCLES_PER_SEC} />){" "}
<br />
<br /> <br />
You have gained: <br /> You have gained: <br />
{numeralWrapper.formatExp(player.workHackExpGained)} ( {numeralWrapper.formatExp(player.workHackExpGained)} (
@ -173,7 +175,8 @@ export function WorkInProgressRoot(): React.ReactElement {
<br /> <br />
You have earned: <br /> You have earned: <br />
<br /> <br />
<Money money={player.workMoneyGained} /> ({MoneyRate(player.workMoneyGainRate * CYCLES_PER_SEC)}) <br /> <Money money={player.workMoneyGained} /> (<MoneyRate money={player.workMoneyGainRate * CYCLES_PER_SEC} />){" "}
<br />
<br /> <br />
{Reputation(player.workRepGained)} ({ReputationRate(player.workRepGainRate * CYCLES_PER_SEC)}) reputation for {Reputation(player.workRepGained)} ({ReputationRate(player.workRepGainRate * CYCLES_PER_SEC)}) reputation for
this company <br /> this company <br />
@ -241,7 +244,8 @@ export function WorkInProgressRoot(): React.ReactElement {
<br /> <br />
You have earned: <br /> You have earned: <br />
<br /> <br />
<Money money={player.workMoneyGained} /> ({MoneyRate(player.workMoneyGainRate * CYCLES_PER_SEC)}) <br /> <Money money={player.workMoneyGained} /> (<MoneyRate money={player.workMoneyGainRate * CYCLES_PER_SEC} />){" "}
<br />
<br /> <br />
{Reputation(player.workRepGained)} ( {Reputation(player.workRepGained)} (
{Reputation(`${numeralWrapper.formatExp(player.workRepGainRate * CYCLES_PER_SEC)} / sec`)} {Reputation(`${numeralWrapper.formatExp(player.workRepGainRate * CYCLES_PER_SEC)} / sec`)}