dev menu in mui

This commit is contained in:
Olivier Gagnon 2021-09-13 20:37:35 -04:00
parent 70cb4b215d
commit 05fd85002c
28 changed files with 1908 additions and 1602 deletions

@ -7,7 +7,7 @@ import * as React from "react";
import { Player } from "../../Player"; import { Player } from "../../Player";
import { Exploit, ExploitName } from "../../Exploits/Exploit"; import { Exploit, ExploitName } from "../../Exploits/Exploit";
import { BBAccordion } from "../../ui/React/Accordion"; import { BBAccordion } from "../../ui/React/BBAccordion";
export function SourceFileMinus1(): React.ReactElement { export function SourceFileMinus1(): React.ReactElement {
const exploits = Player.exploits; const exploits = Player.exploits;

File diff suppressed because it is too large Load Diff

@ -0,0 +1,60 @@
import React, { useState } from "react";
import AddIcon from "@material-ui/icons/Add";
import RemoveIcon from "@material-ui/icons/Remove";
import IconButton from "@material-ui/core/IconButton";
import ExposureZeroIcon from "@material-ui/icons/ExposureZero";
import DoubleArrowIcon from "@material-ui/icons/DoubleArrow";
import { TextField } from "../../ui/React/TextField";
interface IProps {
label: string;
placeholder: string;
add: (x: number) => void;
subtract: (x: number) => void;
tons: () => void;
reset: () => void;
}
export function Adjuster(props: IProps): React.ReactElement {
const [value, setValue] = useState<number | string>("");
function onChange(event: React.ChangeEvent<HTMLInputElement>): void {
if (event.target.value === "") setValue("");
else setValue(parseFloat(event.target.value));
}
const { label, placeholder, add, subtract, reset, tons } = props;
return (
<>
<TextField
label={label}
value={value}
onChange={onChange}
placeholder={placeholder}
type="number"
InputProps={{
startAdornment: (
<>
<IconButton color="primary" onClick={tons}>
<DoubleArrowIcon style={{ transform: "rotate(-90deg)" }} />
</IconButton>
<IconButton color="primary" onClick={() => add(typeof value !== "string" ? value : 0)}>
<AddIcon />
</IconButton>
</>
),
endAdornment: (
<>
<IconButton color="primary" onClick={() => subtract(typeof value !== "string" ? value : 0)}>
<RemoveIcon />
</IconButton>
<IconButton color="primary" onClick={reset}>
<ExposureZeroIcon />
</IconButton>
</>
),
}}
/>
</>
);
}

@ -0,0 +1,81 @@
import React, { useState } from "react";
import Accordion from "@material-ui/core/Accordion";
import AccordionSummary from "@material-ui/core/AccordionSummary";
import AccordionDetails from "@material-ui/core/AccordionDetails";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";
import { Button } from "../../ui/React/Button";
import { Select } from "../../ui/React/Select";
import { IPlayer } from "../../PersonObjects/IPlayer";
import { AugmentationNames } from "../../Augmentation/data/AugmentationNames";
import MenuItem from "@material-ui/core/MenuItem";
import IconButton from "@material-ui/core/IconButton";
import ReplyAllIcon from "@material-ui/icons/ReplyAll";
import ReplyIcon from "@material-ui/icons/Reply";
const bigNumber = 1e27;
interface IProps {
player: IPlayer;
}
export function Augmentations(props: IProps): React.ReactElement {
const [augmentation, setAugmentation] = useState("Augmented Targeting I");
function setAugmentationDropdown(event: React.ChangeEvent<{ value: unknown }>): void {
setAugmentation(event.target.value as string);
}
function queueAug(): void {
props.player.queueAugmentation(augmentation);
}
function queueAllAugs(): void {
for (const i in AugmentationNames) {
const augName = AugmentationNames[i];
props.player.queueAugmentation(augName);
}
}
return (
<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Augmentations</h2>
</AccordionSummary>
<AccordionDetails>
<table>
<tbody>
<tr>
<td>
<span className="text">Aug:</span>
</td>
<td>
<Select
id="dev-augs-dropdown"
className="dropdown"
onChange={setAugmentationDropdown}
value={augmentation}
startAdornment={
<>
<IconButton color="primary" onClick={queueAllAugs}>
<ReplyAllIcon />
</IconButton>
<IconButton color="primary" onClick={queueAug}>
<ReplyIcon />
</IconButton>
</>
}
>
{Object.values(AugmentationNames).map((aug) => (
<MenuItem key={aug} value={aug}>
{aug}
</MenuItem>
))}
</Select>
</td>
</tr>
</tbody>
</table>
</AccordionDetails>
</Accordion>
);
}

@ -0,0 +1,101 @@
import React from "react";
import Accordion from "@material-ui/core/Accordion";
import AccordionSummary from "@material-ui/core/AccordionSummary";
import AccordionDetails from "@material-ui/core/AccordionDetails";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";
import { Button } from "../../ui/React/Button";
import { Adjuster } from "./Adjuster";
import { IPlayer } from "../../PersonObjects/IPlayer";
const bigNumber = 1e27;
interface IProps {
player: IPlayer;
}
export function Bladeburner(props: IProps): React.ReactElement {
function modifyBladeburnerRank(modify: number): (x: number) => void {
return function (rank: number): void {
if (props.player.bladeburner) {
props.player.bladeburner.changeRank(props.player, rank * modify);
}
};
}
function resetBladeburnerRank(): void {
props.player.bladeburner.rank = 0;
props.player.bladeburner.maxRank = 0;
}
function addTonsBladeburnerRank(): void {
if (props.player.bladeburner) {
props.player.bladeburner.changeRank(props.player, bigNumber);
}
}
function modifyBladeburnerCycles(modify: number): (x: number) => void {
return function (cycles: number): void {
if (props.player.bladeburner) {
props.player.bladeburner.storedCycles += cycles * modify;
}
};
}
function resetBladeburnerCycles(): void {
if (props.player.bladeburner) {
props.player.bladeburner.storedCycles = 0;
}
}
function addTonsBladeburnerCycles(): void {
if (props.player.bladeburner) {
props.player.bladeburner.storedCycles += bigNumber;
}
}
return (
<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Bladeburner</h2>
</AccordionSummary>
<AccordionDetails>
<table>
<tbody>
<tr>
<td>
<span className="text">Rank:</span>
</td>
<td>
<Adjuster
label="rank"
placeholder="amt"
tons={addTonsBladeburnerRank}
add={modifyBladeburnerRank(1)}
subtract={modifyBladeburnerRank(-1)}
reset={resetBladeburnerRank}
/>
</td>
</tr>
<tr>
<td>
<span className="text">Cycles:</span>
</td>
<td>
<Adjuster
label="cycles"
placeholder="amt"
tons={addTonsBladeburnerCycles}
add={modifyBladeburnerCycles(1)}
subtract={modifyBladeburnerCycles(-1)}
reset={resetBladeburnerCycles}
/>
</td>
</tr>
</tbody>
</table>
</AccordionDetails>
</Accordion>
);
}

@ -0,0 +1,74 @@
import React, { useState } from "react";
import Accordion from "@material-ui/core/Accordion";
import AccordionSummary from "@material-ui/core/AccordionSummary";
import AccordionDetails from "@material-ui/core/AccordionDetails";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";
import { Button } from "../../ui/React/Button";
import { Select } from "../../ui/React/Select";
import { PlayerOwnedSourceFile } from "../../SourceFile/PlayerOwnedSourceFile";
import { IPlayer } from "../../PersonObjects/IPlayer";
import { generateContract, generateRandomContract, generateRandomContractOnHome } from "../../CodingContractGenerator";
import ButtonGroup from "@material-ui/core/ButtonGroup";
import MenuItem from "@material-ui/core/MenuItem";
import { CodingContractTypes } from "../../CodingContracts";
// Update as additional BitNodes get implemented
const validSFN = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
const bigNumber = 1e27;
interface IProps {
player: IPlayer;
}
export function CodingContracts(props: IProps): React.ReactElement {
const [codingcontract, setCodingcontract] = useState("Find Largest Prime Factor");
function setCodingcontractDropdown(event: React.ChangeEvent<{ value: unknown }>): void {
setCodingcontract(event.target.value as string);
}
function specificContract(): void {
generateContract({
problemType: codingcontract,
server: "home",
});
}
return (
<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Coding Contracts</h2>
</AccordionSummary>
<AccordionDetails>
<table>
<tbody>
<tr>
<td>
<Button onClick={generateRandomContract}>Generate Random Contract</Button>
<Button onClick={generateRandomContractOnHome}>Generate Random Contract on Home Comp</Button>
</td>
</tr>
<tr>
<td>
<Select
id="contract-types-dropdown"
className="dropdown"
onChange={setCodingcontractDropdown}
value={codingcontract}
>
{Object.values(CodingContractTypes).map((cc) => (
<MenuItem key={cc.name} value={cc.name}>
{cc.name}
</MenuItem>
))}
</Select>
<Button onClick={specificContract}>Generate Specified Contract Type on Home Comp</Button>
</td>
</tr>
</tbody>
</table>
</AccordionDetails>
</Accordion>
);
}

@ -0,0 +1,156 @@
import React, { useState } from "react";
import Accordion from "@material-ui/core/Accordion";
import AccordionSummary from "@material-ui/core/AccordionSummary";
import AccordionDetails from "@material-ui/core/AccordionDetails";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";
import { Button } from "../../ui/React/Button";
import { Select } from "../../ui/React/Select";
import { IPlayer } from "../../PersonObjects/IPlayer";
import { Companies as AllCompanies } from "../../Company/Companies";
import FormControl from "@material-ui/core/FormControl";
import MenuItem from "@material-ui/core/MenuItem";
import IconButton from "@material-ui/core/IconButton";
import ReplyAllIcon from "@material-ui/icons/ReplyAll";
import ReplyIcon from "@material-ui/icons/Reply";
import InputLabel from "@material-ui/core/InputLabel";
import { Adjuster } from "./Adjuster";
const bigNumber = 1e12;
interface IProps {
player: IPlayer;
}
export function Companies(props: IProps): React.ReactElement {
const [company, setCompany] = useState("ECorp");
function setCompanyDropdown(event: React.ChangeEvent<{ value: unknown }>): void {
setCompany(event.target.value as string);
}
function resetCompanyRep(): void {
AllCompanies[company].playerReputation = 0;
}
function modifyCompanyRep(modifier: number): (x: number) => void {
return function (reputation: number): void {
const c = AllCompanies[company];
if (c != null && !isNaN(reputation)) {
c.playerReputation += reputation * modifier;
}
};
}
function modifyCompanyFavor(modifier: number): (x: number) => void {
return function (favor: number): void {
const c = AllCompanies[company];
if (c != null && !isNaN(favor)) {
c.favor += favor * modifier;
}
};
}
function resetCompanyFavor(): void {
AllCompanies[company].favor = 0;
}
function tonsOfRepCompanies(): void {
for (const c in AllCompanies) {
AllCompanies[c].playerReputation = bigNumber;
}
}
function resetAllRepCompanies(): void {
for (const c in AllCompanies) {
AllCompanies[c].playerReputation = 0;
}
}
function tonsOfFavorCompanies(): void {
for (const c in AllCompanies) {
AllCompanies[c].favor = bigNumber;
}
}
function resetAllFavorCompanies(): void {
for (const c in AllCompanies) {
AllCompanies[c].favor = 0;
}
}
return (
<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Companies</h2>
</AccordionSummary>
<AccordionDetails>
<table>
<tbody>
<tr>
<td>
<span className="text">Company:</span>
</td>
<td colSpan={3}>
<Select id="dev-companies-dropdown" className="dropdown" onChange={setCompanyDropdown} value={company}>
{Object.values(AllCompanies).map((company) => (
<MenuItem key={company.name} value={company.name}>
{company.name}
</MenuItem>
))}
</Select>
</td>
</tr>
<tr>
<td>
<span className="text">Reputation:</span>
</td>
<td>
<Adjuster
label="reputation"
placeholder="amt"
tons={() => modifyCompanyRep(1)(bigNumber)}
add={modifyCompanyRep(1)}
subtract={modifyCompanyRep(-1)}
reset={resetCompanyRep}
/>
</td>
</tr>
<tr>
<td>
<span className="text">Favor:</span>
</td>
<td>
<Adjuster
label="favor"
placeholder="amt"
tons={() => modifyCompanyFavor(1)(2000)}
add={modifyCompanyFavor(1)}
subtract={modifyCompanyFavor(-1)}
reset={resetCompanyFavor}
/>
</td>
</tr>
<tr>
<td>
<span className="text">All Reputation:</span>
</td>
<td>
<Button onClick={tonsOfRepCompanies}>Tons</Button>
<Button onClick={resetAllRepCompanies}>Reset</Button>
</td>
</tr>
<tr>
<td>
<span className="text">All Favor:</span>
</td>
<td>
<Button onClick={tonsOfFavorCompanies}>Tons</Button>
<Button onClick={resetAllFavorCompanies}>Reset</Button>
</td>
</tr>
</tbody>
</table>
</AccordionDetails>
</Accordion>
);
}

@ -0,0 +1,113 @@
import React from "react";
import Accordion from "@material-ui/core/Accordion";
import AccordionSummary from "@material-ui/core/AccordionSummary";
import AccordionDetails from "@material-ui/core/AccordionDetails";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";
import { Button } from "../../ui/React/Button";
import { Adjuster } from "./Adjuster";
import { IPlayer } from "../../PersonObjects/IPlayer";
const bigNumber = 1e27;
interface IProps {
player: IPlayer;
}
export function Corporation(props: IProps): React.ReactElement {
function addTonsCorporationFunds(): void {
if (props.player.corporation) {
props.player.corporation.funds = props.player.corporation.funds.plus(1e99);
}
}
function resetCorporationFunds(): void {
if (props.player.corporation) {
props.player.corporation.funds = props.player.corporation.funds.minus(props.player.corporation.funds);
}
}
function addTonsCorporationCycles(): void {
if (props.player.corporation) {
props.player.corporation.storedCycles = bigNumber;
}
}
function modifyCorporationCycles(modify: number): (x: number) => void {
return function (cycles: number): void {
if (props.player.corporation) {
props.player.corporation.storedCycles += cycles * modify;
}
};
}
function resetCorporationCycles(): void {
if (props.player.corporation) {
props.player.corporation.storedCycles = 0;
}
}
function finishCorporationProducts(): void {
if (!props.player.corporation) return;
props.player.corporation.divisions.forEach((div) => {
Object.keys(div.products).forEach((prod) => {
const product = div.products[prod];
if (product === undefined) throw new Error("Impossible product undefined");
product.prog = 99.9;
});
});
}
function addCorporationResearch(): void {
if (!props.player.corporation) return;
props.player.corporation.divisions.forEach((div) => {
div.sciResearch.qty += 1e10;
});
}
return (
<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Corporation</h2>
</AccordionSummary>
<AccordionDetails>
<table>
<tbody>
<tr>
<td>
<Button onClick={addTonsCorporationFunds}>Tons of funds</Button>
<Button onClick={resetCorporationFunds}>Reset funds</Button>
</td>
</tr>
<tr>
<td>
<span className="text">Cycles:</span>
</td>
<td>
<Adjuster
label="cycles"
placeholder="amt"
tons={addTonsCorporationCycles}
add={modifyCorporationCycles(1)}
subtract={modifyCorporationCycles(-1)}
reset={resetCorporationCycles}
/>
</td>
</tr>
<tr>
<td>
<Button onClick={finishCorporationProducts}>Finish products</Button>
</td>
</tr>
<tr>
<td>
<Button onClick={addCorporationResearch}>Tons of research</Button>
</td>
</tr>
</tbody>
</table>
</AccordionDetails>
</Accordion>
);
}

193
src/DevMenu/ui/Factions.tsx Normal file

@ -0,0 +1,193 @@
import React, { useState } from "react";
import Accordion from "@material-ui/core/Accordion";
import AccordionSummary from "@material-ui/core/AccordionSummary";
import AccordionDetails from "@material-ui/core/AccordionDetails";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";
import { Button } from "../../ui/React/Button";
import { Select } from "../../ui/React/Select";
import { Adjuster } from "./Adjuster";
import { IPlayer } from "../../PersonObjects/IPlayer";
import { Factions as AllFaction } from "../../Faction/Factions";
import FormControl from "@material-ui/core/FormControl";
import MenuItem from "@material-ui/core/MenuItem";
import IconButton from "@material-ui/core/IconButton";
import ReplyAllIcon from "@material-ui/icons/ReplyAll";
import ReplyIcon from "@material-ui/icons/Reply";
import InputLabel from "@material-ui/core/InputLabel";
const bigNumber = 1e12;
interface IProps {
player: IPlayer;
}
export function Factions(props: IProps): React.ReactElement {
const [faction, setFaction] = useState("Illuminati");
function setFactionDropdown(event: React.ChangeEvent<{ value: unknown }>): void {
setFaction(event.target.value as string);
}
function receiveInvite(): void {
props.player.receiveInvite(faction);
}
function receiveAllInvites(): void {
for (const i in AllFaction) {
props.player.receiveInvite(AllFaction[i].name);
}
}
function modifyFactionRep(modifier: number): (x: number) => void {
return function (reputation: number): void {
const fac = AllFaction[faction];
if (fac != null && !isNaN(reputation)) {
fac.playerReputation += reputation * modifier;
}
};
}
function resetFactionRep(): void {
const fac = AllFaction[faction];
if (fac != null) {
fac.playerReputation = 0;
}
}
function modifyFactionFavor(modifier: number): (x: number) => void {
return function (favor: number): void {
const fac = AllFaction[faction];
if (fac != null && !isNaN(favor)) {
fac.favor += favor * modifier;
}
};
}
function resetFactionFavor(): void {
const fac = AllFaction[faction];
if (fac != null) {
fac.favor = 0;
}
}
function tonsOfRep(): void {
for (const i in AllFaction) {
AllFaction[i].playerReputation = bigNumber;
}
}
function resetAllRep(): void {
for (const i in AllFaction) {
AllFaction[i].playerReputation = 0;
}
}
function tonsOfFactionFavor(): void {
for (const i in AllFaction) {
AllFaction[i].favor = bigNumber;
}
}
function resetAllFactionFavor(): void {
for (const i in AllFaction) {
AllFaction[i].favor = 0;
}
}
return (
<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Factions</h2>
</AccordionSummary>
<AccordionDetails>
<table>
<tbody>
<tr>
<td>
<span className="text">Faction:</span>
</td>
<td>
<FormControl>
<InputLabel id="factions-select">Faction</InputLabel>
<Select
labelId="factions-select"
id="factions-dropdown"
className="dropdown exp-input"
onChange={setFactionDropdown}
value={faction}
startAdornment={
<>
<IconButton color="primary" onClick={receiveAllInvites}>
<ReplyAllIcon />
</IconButton>
<IconButton color="primary" onClick={receiveInvite}>
<ReplyIcon />
</IconButton>
</>
}
>
{Object.values(AllFaction).map((faction) => (
<MenuItem key={faction.name} value={faction.name}>
{faction.name}
</MenuItem>
))}
</Select>
</FormControl>
</td>
</tr>
<tr>
<td>
<span className="text">Reputation:</span>
</td>
<td>
<Adjuster
label="reputation"
placeholder="amt"
tons={() => modifyFactionRep(1)(bigNumber)}
add={modifyFactionRep(1)}
subtract={modifyFactionRep(-1)}
reset={resetFactionRep}
/>
</td>
</tr>
<tr>
<td>
<span className="text">Favor:</span>
</td>
<td>
<Adjuster
label="favor"
placeholder="amt"
tons={() => modifyFactionFavor(1)(2000)}
add={modifyFactionFavor(1)}
subtract={modifyFactionFavor(-1)}
reset={resetFactionFavor}
/>
</td>
</tr>
<tr>
<td>
<span className="text">All Reputation:</span>
</td>
<td>
<Button onClick={tonsOfRep}>Tons</Button>
<Button onClick={resetAllRep}>Reset</Button>
</td>
</tr>
<tr>
<td>
<span className="text">All Favor:</span>
</td>
<td>
<Button onClick={tonsOfFactionFavor}>Tons</Button>
<Button onClick={resetAllFactionFavor}>Reset</Button>
</td>
</tr>
</tbody>
</table>
</AccordionDetails>
</Accordion>
);
}

67
src/DevMenu/ui/Gang.tsx Normal file

@ -0,0 +1,67 @@
import React from "react";
import Accordion from "@material-ui/core/Accordion";
import AccordionSummary from "@material-ui/core/AccordionSummary";
import AccordionDetails from "@material-ui/core/AccordionDetails";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";
import { Button } from "../../ui/React/Button";
import { Adjuster } from "./Adjuster";
import { IPlayer } from "../../PersonObjects/IPlayer";
const bigNumber = 1e27;
interface IProps {
player: IPlayer;
}
export function Gang(props: IProps): React.ReactElement {
function addTonsGangCycles(): void {
if (props.player.gang) {
props.player.gang.storedCycles = bigNumber;
}
}
function modifyGangCycles(modify: number): (x: number) => void {
return function (cycles: number): void {
if (props.player.gang) {
props.player.gang.storedCycles += cycles * modify;
}
};
}
function resetGangCycles(): void {
if (props.player.gang) {
props.player.gang.storedCycles = 0;
}
}
return (
<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Gang</h2>
</AccordionSummary>
<AccordionDetails>
<table>
<tbody>
<tr>
<td>
<span className="text">Cycles:</span>
</td>
<td>
<Adjuster
label="cycles"
placeholder="amt"
tons={addTonsGangCycles}
add={modifyGangCycles(1)}
subtract={modifyGangCycles(-1)}
reset={resetGangCycles}
/>
</td>
</tr>
</tbody>
</table>
</AccordionDetails>
</Accordion>
);
}

@ -0,0 +1,87 @@
import React from "react";
import Accordion from "@material-ui/core/Accordion";
import AccordionSummary from "@material-ui/core/AccordionSummary";
import AccordionDetails from "@material-ui/core/AccordionDetails";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";
import { Button } from "../../ui/React/Button";
import { Money } from "../../ui/React/Money";
import { IPlayer } from "../../PersonObjects/IPlayer";
import { hackWorldDaemon } from "../../RedPill";
interface IProps {
player: IPlayer;
}
export function General(props: IProps): React.ReactElement {
function addMoney(n: number) {
return function () {
props.player.gainMoney(n);
};
}
function upgradeRam(): void {
props.player.getHomeComputer().maxRam *= 2;
}
function quickB1tFlum3(): void {
hackWorldDaemon(props.player.bitNodeN, true, true);
}
function b1tflum3(): void {
hackWorldDaemon(props.player.bitNodeN, true);
}
function quickHackW0r1dD43m0n(): void {
hackWorldDaemon(props.player.bitNodeN, false, true);
}
function hackW0r1dD43m0n(): void {
hackWorldDaemon(props.player.bitNodeN);
}
return (
<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>General</h2>
</AccordionSummary>
<AccordionDetails>
<div>
<Button onClick={addMoney(1e6)}>
<pre>
+ <Money money={1e6} />
</pre>
</Button>
<Button onClick={addMoney(1e9)}>
<pre>
+ <Money money={1e9} />
</pre>
</Button>
<Button onClick={addMoney(1e12)}>
<pre>
+ <Money money={1e12} />
</pre>
</Button>
<Button onClick={addMoney(1e15)}>
<pre>
+ <Money money={1000e12} />
</pre>
</Button>
<Button onClick={addMoney(Infinity)}>
<pre>
+ <Money money={Infinity} />
</pre>
</Button>
<Button onClick={upgradeRam}>+ RAM</Button>
</div>
<div>
<Button onClick={quickB1tFlum3}>Quick b1t_flum3.exe</Button>
<Button onClick={b1tflum3}>Run b1t_flum3.exe</Button>
<Button onClick={quickHackW0r1dD43m0n}>Quick w0rld_d34m0n</Button>
<Button onClick={hackW0r1dD43m0n}>Hack w0rld_d34m0n</Button>
</div>
</AccordionDetails>
</Accordion>
);
}

@ -0,0 +1,80 @@
import React, { useState } from "react";
import Accordion from "@material-ui/core/Accordion";
import AccordionSummary from "@material-ui/core/AccordionSummary";
import AccordionDetails from "@material-ui/core/AccordionDetails";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";
import { Button } from "../../ui/React/Button";
import { Select } from "../../ui/React/Select";
import { IPlayer } from "../../PersonObjects/IPlayer";
import { Programs as AllPrograms } from "../../Programs/Programs";
import FormControl from "@material-ui/core/FormControl";
import MenuItem from "@material-ui/core/MenuItem";
import IconButton from "@material-ui/core/IconButton";
import ReplyAllIcon from "@material-ui/icons/ReplyAll";
import ReplyIcon from "@material-ui/icons/Reply";
import InputLabel from "@material-ui/core/InputLabel";
const bigNumber = 1e12;
interface IProps {
player: IPlayer;
}
export function Programs(props: IProps): React.ReactElement {
const [program, setProgram] = useState("NUKE.exe");
function setProgramDropdown(event: React.ChangeEvent<{ value: unknown }>): void {
setProgram(event.target.value as string);
}
function addProgram(): void {
if (!props.player.hasProgram(program)) {
props.player.getHomeComputer().programs.push(program);
}
}
function addAllPrograms(): void {
for (const i in AllPrograms) {
if (!props.player.hasProgram(AllPrograms[i].name)) {
props.player.getHomeComputer().programs.push(AllPrograms[i].name);
}
}
}
return (
<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Programs</h2>
</AccordionSummary>
<AccordionDetails>
<table>
<tbody>
<tr>
<td>
<span className="text">Program:</span>
</td>
<td>
<Select onChange={setProgramDropdown} value={program}>
{Object.values(AllPrograms).map((program) => (
<MenuItem key={program.name} value={program.name}>
{program.name}
</MenuItem>
))}
</Select>
</td>
</tr>
<tr>
<td>
<span className="text">Add:</span>
</td>
<td>
<Button onClick={addProgram}>One</Button>
<Button onClick={addAllPrograms}>All</Button>
</td>
</tr>
</tbody>
</table>
</AccordionDetails>
</Accordion>
);
}

149
src/DevMenu/ui/Servers.tsx Normal file

@ -0,0 +1,149 @@
import React, { useState } from "react";
import Accordion from "@material-ui/core/Accordion";
import AccordionSummary from "@material-ui/core/AccordionSummary";
import AccordionDetails from "@material-ui/core/AccordionDetails";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";
import { Button } from "../../ui/React/Button";
import { Select } from "../../ui/React/Select";
import { IPlayer } from "../../PersonObjects/IPlayer";
import { AllServers } from "../../Server/AllServers";
import { HacknetServer } from "../../Hacknet/HacknetServer";
import { GetServerByHostname } from "../../Server/ServerHelpers";
import FormControl from "@material-ui/core/FormControl";
import MenuItem from "@material-ui/core/MenuItem";
import IconButton from "@material-ui/core/IconButton";
import ReplyAllIcon from "@material-ui/icons/ReplyAll";
import ReplyIcon from "@material-ui/icons/Reply";
import InputLabel from "@material-ui/core/InputLabel";
const bigNumber = 1e12;
interface IProps {
player: IPlayer;
}
export function Servers(props: IProps): React.ReactElement {
const [server, setServer] = useState("home");
function setServerDropdown(event: React.ChangeEvent<{ value: unknown }>): void {
setServer(event.target.value as string);
}
function rootServer(): void {
const s = GetServerByHostname(server);
if (s === null) return;
if (s instanceof HacknetServer) return;
s.hasAdminRights = true;
s.sshPortOpen = true;
s.ftpPortOpen = true;
s.smtpPortOpen = true;
s.httpPortOpen = true;
s.sqlPortOpen = true;
s.openPortCount = 5;
}
function rootAllServers(): void {
for (const i in AllServers) {
const s = AllServers[i];
if (s instanceof HacknetServer) return;
s.hasAdminRights = true;
s.sshPortOpen = true;
s.ftpPortOpen = true;
s.smtpPortOpen = true;
s.httpPortOpen = true;
s.sqlPortOpen = true;
s.openPortCount = 5;
}
}
function minSecurity(): void {
const s = GetServerByHostname(server);
if (s === null) return;
if (s instanceof HacknetServer) return;
s.hackDifficulty = s.minDifficulty;
}
function minAllSecurity(): void {
for (const i in AllServers) {
const server = AllServers[i];
if (server instanceof HacknetServer) continue;
server.hackDifficulty = server.minDifficulty;
}
}
function maxMoney(): void {
const s = GetServerByHostname(server);
if (s === null) return;
if (s instanceof HacknetServer) return;
s.moneyAvailable = s.moneyMax;
}
function maxAllMoney(): void {
for (const i in AllServers) {
const server = AllServers[i];
if (server instanceof HacknetServer) continue;
server.moneyAvailable = server.moneyMax;
}
}
return (
<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Servers</h2>
</AccordionSummary>
<AccordionDetails>
<table>
<tbody>
<tr>
<td>
<span className="text">Server:</span>
</td>
<td colSpan={2}>
<Select id="dev-servers-dropdown" className="dropdown" onChange={setServerDropdown} value={server}>
{Object.values(AllServers).map((server) => (
<MenuItem key={server.hostname} value={server.hostname}>
{server.hostname}
</MenuItem>
))}
</Select>
</td>
</tr>
<tr>
<td>
<span className="text">Root:</span>
</td>
<td>
<Button onClick={rootServer}>Root one</Button>
</td>
<td>
<Button onClick={rootAllServers}>Root all</Button>
</td>
</tr>
<tr>
<td>
<span className="text">Security:</span>
</td>
<td>
<Button onClick={minSecurity}>Min one</Button>
</td>
<td>
<Button onClick={minAllSecurity}>Min all</Button>
</td>
</tr>
<tr>
<td>
<span className="text">Money:</span>
</td>
<td>
<Button onClick={maxMoney}>Max one</Button>
</td>
<td>
<Button onClick={maxAllMoney}>Max all</Button>
</td>
</tr>
</tbody>
</table>
</AccordionDetails>
</Accordion>
);
}

@ -0,0 +1,81 @@
import React from "react";
import Accordion from "@material-ui/core/Accordion";
import AccordionSummary from "@material-ui/core/AccordionSummary";
import AccordionDetails from "@material-ui/core/AccordionDetails";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";
import { Button } from "../../ui/React/Button";
import { PlayerOwnedSourceFile } from "../../SourceFile/PlayerOwnedSourceFile";
import { IPlayer } from "../../PersonObjects/IPlayer";
import ButtonGroup from "@material-ui/core/ButtonGroup";
// Update as additional BitNodes get implemented
const validSFN = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
const bigNumber = 1e27;
interface IProps {
player: IPlayer;
}
export function Sleeves(props: IProps): React.ReactElement {
function sleeveMaxAllShock(): void {
for (let i = 0; i < props.player.sleeves.length; ++i) {
props.player.sleeves[i].shock = 0;
}
}
function sleeveClearAllShock(): void {
for (let i = 0; i < props.player.sleeves.length; ++i) {
props.player.sleeves[i].shock = 100;
}
}
function sleeveSyncMaxAll(): void {
for (let i = 0; i < props.player.sleeves.length; ++i) {
props.player.sleeves[i].sync = 100;
}
}
function sleeveSyncClearAll(): void {
for (let i = 0; i < props.player.sleeves.length; ++i) {
props.player.sleeves[i].sync = 0;
}
}
return (
<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Sleeves</h2>
</AccordionSummary>
<AccordionDetails>
<table>
<tbody>
<tr>
<td>
<span className="text">Shock:</span>
</td>
<td>
<Button onClick={sleeveMaxAllShock}>Max all</Button>
</td>
<td>
<Button onClick={sleeveClearAllShock}>Clear all</Button>
</td>
</tr>
<tr>
<td>
<span className="text">Sync:</span>
</td>
<td>
<Button onClick={sleeveSyncMaxAll}>Max all</Button>
</td>
<td>
<Button onClick={sleeveSyncClearAll}>Clear all</Button>
</td>
</tr>
</tbody>
</table>
</AccordionDetails>
</Accordion>
);
}

@ -0,0 +1,103 @@
import React from "react";
import Accordion from "@material-ui/core/Accordion";
import AccordionSummary from "@material-ui/core/AccordionSummary";
import AccordionDetails from "@material-ui/core/AccordionDetails";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";
import { Button } from "../../ui/React/Button";
import { PlayerOwnedSourceFile } from "../../SourceFile/PlayerOwnedSourceFile";
import { IPlayer } from "../../PersonObjects/IPlayer";
import ButtonGroup from "@material-ui/core/ButtonGroup";
// Update as additional BitNodes get implemented
const validSFN = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
const bigNumber = 1e27;
interface IProps {
player: IPlayer;
}
export function SourceFiles(props: IProps): React.ReactElement {
function setSF(sfN: number, sfLvl: number) {
return function () {
if (sfLvl === 0) {
props.player.sourceFiles = props.player.sourceFiles.filter((sf) => sf.n !== sfN);
return;
}
if (!props.player.sourceFiles.some((sf) => sf.n === sfN)) {
props.player.sourceFiles.push(new PlayerOwnedSourceFile(sfN, sfLvl));
return;
}
for (let i = 0; i < props.player.sourceFiles.length; i++) {
if (props.player.sourceFiles[i].n === sfN) {
props.player.sourceFiles[i].lvl = sfLvl;
}
}
};
}
function setAllSF(sfLvl: number) {
return () => {
for (let i = 0; i < validSFN.length; i++) {
setSF(validSFN[i], sfLvl)();
}
};
}
function clearExploits(): void {
props.player.exploits = [];
}
return (
<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Source-Files</h2>
</AccordionSummary>
<AccordionDetails>
<table>
<tbody>
<tr>
<td>
<span className="text">Exploits:</span>
</td>
<td>
<Button onClick={clearExploits}>Clear</Button>
</td>
</tr>
<tr key={"sf-all"}>
<td>
<span className="text">All:</span>
</td>
<td>
<ButtonGroup>
<Button onClick={setAllSF(0)}>0</Button>
<Button onClick={setAllSF(1)}>1</Button>
<Button onClick={setAllSF(2)}>2</Button>
<Button onClick={setAllSF(3)}>3</Button>
</ButtonGroup>
</td>
</tr>
{validSFN.map((i) => (
<tr key={"sf-" + i}>
<td>
<span className="text">SF-{i}:</span>
</td>
<td>
<ButtonGroup>
<Button onClick={setSF(i, 0)}>0</Button>
<Button onClick={setSF(i, 1)}>1</Button>
<Button onClick={setSF(i, 2)}>2</Button>
<Button onClick={setSF(i, 3)}>3</Button>
</ButtonGroup>
</td>
</tr>
))}
</tbody>
</table>
</AccordionDetails>
</Accordion>
);
}

286
src/DevMenu/ui/Stats.tsx Normal file

@ -0,0 +1,286 @@
import React from "react";
import Accordion from "@material-ui/core/Accordion";
import AccordionSummary from "@material-ui/core/AccordionSummary";
import AccordionDetails from "@material-ui/core/AccordionDetails";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";
import { Button } from "../../ui/React/Button";
import { Adjuster } from "./Adjuster";
import { IPlayer } from "../../PersonObjects/IPlayer";
const bigNumber = 1e27;
interface IProps {
player: IPlayer;
}
export function Stats(props: IProps): React.ReactElement {
function modifyExp(stat: string, modifier: number) {
return function (exp: number) {
switch (stat) {
case "hacking":
if (exp) {
props.player.gainHackingExp(exp * modifier);
}
break;
case "strength":
if (exp) {
props.player.gainStrengthExp(exp * modifier);
}
break;
case "defense":
if (exp) {
props.player.gainDefenseExp(exp * modifier);
}
break;
case "dexterity":
if (exp) {
props.player.gainDexterityExp(exp * modifier);
}
break;
case "agility":
if (exp) {
props.player.gainAgilityExp(exp * modifier);
}
break;
case "charisma":
if (exp) {
props.player.gainCharismaExp(exp * modifier);
}
break;
case "intelligence":
if (exp) {
props.player.gainIntelligenceExp(exp * modifier);
}
break;
}
props.player.updateSkillLevels();
};
}
function modifyKarma(modifier: number) {
return function (amt: number) {
props.player.karma += amt * modifier;
};
}
function tonsOfExp(): void {
props.player.gainHackingExp(bigNumber);
props.player.gainStrengthExp(bigNumber);
props.player.gainDefenseExp(bigNumber);
props.player.gainDexterityExp(bigNumber);
props.player.gainAgilityExp(bigNumber);
props.player.gainCharismaExp(bigNumber);
props.player.gainIntelligenceExp(bigNumber);
props.player.updateSkillLevels();
}
function resetAllExp(): void {
props.player.hacking_exp = 0;
props.player.strength_exp = 0;
props.player.defense_exp = 0;
props.player.dexterity_exp = 0;
props.player.agility_exp = 0;
props.player.charisma_exp = 0;
props.player.intelligence_exp = 0;
props.player.updateSkillLevels();
}
function resetExperience(stat: string): () => void {
return function () {
switch (stat) {
case "hacking":
props.player.hacking_exp = 0;
break;
case "strength":
props.player.strength_exp = 0;
break;
case "defense":
props.player.defense_exp = 0;
break;
case "dexterity":
props.player.dexterity_exp = 0;
break;
case "agility":
props.player.agility_exp = 0;
break;
case "charisma":
props.player.charisma_exp = 0;
break;
case "intelligence":
props.player.intelligence_exp = 0;
break;
}
props.player.updateSkillLevels();
};
}
function resetKarma(): () => void {
return function () {
props.player.karma = 0;
};
}
function enableIntelligence(): void {
if (props.player.intelligence === 0) {
props.player.intelligence = 1;
props.player.updateSkillLevels();
}
}
function disableIntelligence(): void {
props.player.intelligence_exp = 0;
props.player.intelligence = 0;
props.player.updateSkillLevels();
}
return (
<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Experience / Stats</h2>
</AccordionSummary>
<AccordionDetails>
<table>
<tbody>
<tr>
<td>
<span className="text text-center">All:</span>
</td>
<td>
<Button onClick={tonsOfExp}>Tons of exp</Button>
<Button onClick={resetAllExp}>Reset</Button>
</td>
</tr>
<tr>
<td>
<span className="text text-center">Hacking:</span>
</td>
<td>
<Adjuster
label="hacking"
placeholder="exp"
tons={() => modifyExp("hacking", 1)(bigNumber)}
add={modifyExp("hacking", 1)}
subtract={modifyExp("hacking", -1)}
reset={resetExperience("hacking")}
/>
</td>
</tr>
<tr>
<td>
<span className="text text-center">Strength:</span>
</td>
<td>
<Adjuster
label="strength"
placeholder="exp"
tons={() => modifyExp("strength", 1)(bigNumber)}
add={modifyExp("strength", 1)}
subtract={modifyExp("strength", -1)}
reset={resetExperience("strength")}
/>
</td>
</tr>
<tr>
<td>
<span className="text text-center">Defense:</span>
</td>
<td>
<Adjuster
label="defense"
placeholder="exp"
tons={() => modifyExp("defense", 1)(bigNumber)}
add={modifyExp("defense", 1)}
subtract={modifyExp("defense", -1)}
reset={resetExperience("defense")}
/>
</td>
</tr>
<tr>
<td>
<span className="text text-center">Dexterity:</span>
</td>
<td>
<Adjuster
label="dexterity"
placeholder="exp"
tons={() => modifyExp("dexterity", 1)(bigNumber)}
add={modifyExp("dexterity", 1)}
subtract={modifyExp("dexterity", -1)}
reset={resetExperience("dexterity")}
/>
</td>
</tr>
<tr>
<td>
<span className="text text-center">Agility:</span>
</td>
<td>
<Adjuster
label="agility"
placeholder="exp"
tons={() => modifyExp("agility", 1)(bigNumber)}
add={modifyExp("agility", 1)}
subtract={modifyExp("agility", -1)}
reset={resetExperience("agility")}
/>
</td>
</tr>
<tr>
<td>
<span className="text text-center">Charisma:</span>
</td>
<td>
<Adjuster
label="charisma"
placeholder="exp"
tons={() => modifyExp("charisma", 1)(bigNumber)}
add={modifyExp("charisma", 1)}
subtract={modifyExp("charisma", -1)}
reset={resetExperience("charisma")}
/>
</td>
</tr>
<tr>
<td>
<span className="text text-center">Intelligence:</span>
</td>
<td>
<Adjuster
label="intelligence"
placeholder="exp"
tons={() => modifyExp("intelligence", 1)(bigNumber)}
add={modifyExp("intelligence", 1)}
subtract={modifyExp("intelligence", -1)}
reset={resetExperience("intelligence")}
/>
</td>
<td>
<Button onClick={enableIntelligence}>Enable</Button>
</td>
<td>
<Button onClick={disableIntelligence}>Disable</Button>
</td>
</tr>
<tr>
<td>
<span className="text text-center">Karma:</span>
</td>
<td>
<Adjuster
label="karma"
placeholder="amt"
tons={() => modifyExp("intelligence", 1)(100000)}
add={modifyKarma(1)}
subtract={modifyKarma(-1)}
reset={resetKarma()}
/>
</td>
</tr>
</tbody>
</table>
</AccordionDetails>
</Accordion>
);
}

@ -0,0 +1,128 @@
import React, { useState } from "react";
import Accordion from "@material-ui/core/Accordion";
import AccordionSummary from "@material-ui/core/AccordionSummary";
import AccordionDetails from "@material-ui/core/AccordionDetails";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";
import { Button } from "../../ui/React/Button";
import { TextField } from "../../ui/React/TextField";
import { Money } from "../../ui/React/Money";
import { Adjuster } from "./Adjuster";
import { IPlayer } from "../../PersonObjects/IPlayer";
import { dialogBoxCreate } from "../../../utils/DialogBox";
import { StockMarket as SM } from "../../StockMarket/StockMarket";
import { Stock } from "../../StockMarket/Stock";
const bigNumber = 1e27;
interface IProps {
player: IPlayer;
}
export function StockMarket(props: IProps): React.ReactElement {
const [stockPrice, setStockPrice] = useState(0);
const [stockSymbol, setStockSymbol] = useState("");
function setStockPriceField(event: React.ChangeEvent<HTMLInputElement>): void {
setStockPrice(parseFloat(event.target.value));
}
function setStockSymbolField(event: React.ChangeEvent<HTMLInputElement>): void {
setStockSymbol(event.target.value);
}
function processStocks(sub: (arg0: Stock) => void): void {
const inputSymbols = stockSymbol.replace(/\s/g, "");
let match: (symbol: string) => boolean = (): boolean => {
return true;
};
if (inputSymbols !== "" && inputSymbols !== "all") {
match = function (symbol: string): boolean {
return inputSymbols.split(",").includes(symbol);
};
}
for (const name in SM) {
if (SM.hasOwnProperty(name)) {
const stock = SM[name];
if (stock instanceof Stock && match(stock.symbol)) {
sub(stock);
}
}
}
}
function doSetStockPrice(): void {
if (!isNaN(stockPrice)) {
processStocks((stock: Stock) => {
stock.price = stockPrice;
});
}
}
function viewStockCaps(): void {
const stocks: JSX.Element[] = [];
processStocks((stock: Stock) => {
stocks.push(
<tr key={stock.symbol}>
<td>{stock.symbol}</td>
<td style={{ textAlign: "right" }}>
<Money money={stock.cap} />
</td>
</tr>,
);
});
dialogBoxCreate(
<table>
<tbody>
<tr>
<th>Stock</th>
<th>Price cap</th>
</tr>
{stocks}
</tbody>
</table>,
);
}
return (
<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Stock Market</h2>
</AccordionSummary>
<AccordionDetails>
<table>
<tbody>
<tr>
<td>
<span className="text">Symbol:</span>
</td>
<td>
<TextField placeholder="symbol/'all'" onChange={setStockSymbolField} />
</td>
</tr>
<tr>
<td>
<span className="text">Price:</span>
</td>
<td>
<TextField placeholder="$$$" onChange={setStockPriceField} />
<Button onClick={doSetStockPrice}>Set</Button>
</td>
</tr>
<tr>
<td>
<span className="text">Caps:</span>
</td>
<td>
<Button onClick={viewStockCaps}>View stock caps</Button>
</td>
</tr>
</tbody>
</table>
</AccordionDetails>
</Accordion>
);
}

@ -0,0 +1,46 @@
import React from "react";
import Accordion from "@material-ui/core/Accordion";
import AccordionSummary from "@material-ui/core/AccordionSummary";
import AccordionDetails from "@material-ui/core/AccordionDetails";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";
import { Button } from "../../ui/React/Button";
import { PlayerOwnedSourceFile } from "../../SourceFile/PlayerOwnedSourceFile";
import { IPlayer } from "../../PersonObjects/IPlayer";
import ButtonGroup from "@material-ui/core/ButtonGroup";
import { saveObject } from "../../SaveObject";
import { IEngine } from "../../IEngine";
// Update as additional BitNodes get implemented
const validSFN = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
const bigNumber = 1e27;
interface IProps {
player: IPlayer;
engine: IEngine;
}
export function TimeSkip(props: IProps): React.ReactElement {
function timeskip(time: number) {
return () => {
props.player.lastUpdate -= time;
props.engine._lastUpdate -= time;
saveObject.saveGame(props.engine.indexedDb);
setTimeout(() => location.reload(), 1000);
};
}
return (
<Accordion>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<h2>Sleeves</h2>
</AccordionSummary>
<AccordionDetails>
<Button onClick={timeskip(60 * 1000)}>1 minute</Button>
<Button onClick={timeskip(60 * 60 * 1000)}>1 hour</Button>
<Button onClick={timeskip(24 * 60 * 60 * 1000)}>1 day</Button>
</AccordionDetails>
</Accordion>
);
}

@ -1,6 +1,6 @@
import React from "react"; import React from "react";
import { AllServers } from "../Server/AllServers"; import { AllServers } from "../Server/AllServers";
import { BBAccordion } from "../ui/React/Accordion"; import { BBAccordion } from "../ui/React/BBAccordion";
import { numeralWrapper } from "../ui/numeralFormat"; import { numeralWrapper } from "../ui/numeralFormat";
interface IServerProps { interface IServerProps {

@ -4,7 +4,7 @@
import React from "react"; import React from "react";
import { Gang } from "../Gang"; import { Gang } from "../Gang";
import { GangMember } from "../GangMember"; import { GangMember } from "../GangMember";
import { BBAccordion } from "../../ui/React/Accordion"; import { BBAccordion } from "../../ui/React/BBAccordion";
import { GangMemberAccordionContent } from "./GangMemberAccordionContent"; import { GangMemberAccordionContent } from "./GangMemberAccordionContent";
interface IProps { interface IProps {

@ -18,7 +18,7 @@ import { PositionTypes } from "../data/PositionTypes";
import { IPlayer } from "../../PersonObjects/IPlayer"; import { IPlayer } from "../../PersonObjects/IPlayer";
import { SourceFileFlags } from "../../SourceFile/SourceFileFlags"; import { SourceFileFlags } from "../../SourceFile/SourceFileFlags";
import { numeralWrapper } from "../../ui/numeralFormat"; import { numeralWrapper } from "../../ui/numeralFormat";
import { BBAccordion } from "../../ui/React/Accordion"; import { BBAccordion } from "../../ui/React/BBAccordion";
import { Money } from "../../ui/React/Money"; import { Money } from "../../ui/React/Money";
import { createPopup } from "../../ui/React/createPopup"; import { createPopup } from "../../ui/React/createPopup";

@ -4,7 +4,7 @@
*/ */
import * as React from "react"; import * as React from "react";
import { BBAccordion } from "../React/Accordion"; import { BBAccordion } from "../React/BBAccordion";
import { ServerAccordionContent } from "./ServerAccordionContent"; import { ServerAccordionContent } from "./ServerAccordionContent";
import { BaseServer } from "../../Server/BaseServer"; import { BaseServer } from "../../Server/BaseServer";

@ -6,7 +6,7 @@ import * as React from "react";
import { numeralWrapper } from "../numeralFormat"; import { numeralWrapper } from "../numeralFormat";
import { BBAccordion } from "../React/Accordion"; import { BBAccordion } from "../React/BBAccordion";
import { AccordionButton } from "../React/AccordionButton"; import { AccordionButton } from "../React/AccordionButton";
import { killWorkerScript } from "../../Netscript/killWorkerScript"; import { killWorkerScript } from "../../Netscript/killWorkerScript";

@ -6,7 +6,7 @@
*/ */
import * as React from "react"; import * as React from "react";
import { BBAccordion } from "./Accordion"; import { BBAccordion } from "./BBAccordion";
import { Augmentation } from "../../Augmentation/Augmentation"; import { Augmentation } from "../../Augmentation/Augmentation";
import { AugmentationNames } from "../../Augmentation/data/AugmentationNames"; import { AugmentationNames } from "../../Augmentation/data/AugmentationNames";

@ -6,7 +6,7 @@
*/ */
import * as React from "react"; import * as React from "react";
import { BBAccordion } from "./Accordion"; import { BBAccordion } from "./BBAccordion";
import { SourceFile } from "../../SourceFile/SourceFile"; import { SourceFile } from "../../SourceFile/SourceFile";

@ -7,48 +7,11 @@ import React from "react";
import { TextField as MuiTF, TextFieldProps, makeStyles } from "@material-ui/core"; import { TextField as MuiTF, TextFieldProps, makeStyles } from "@material-ui/core";
import { colors } from "./Theme"; import { colors } from "./Theme";
const useStyles = makeStyles({
// Tries to emulate StdButton in buttons.scss
root: {
backgroundColor: colors.well,
color: "white",
borderRadius: 0,
"& .MuiInputBase-input": {
color: colors.primarylight, // Text color
},
"& .MuiInputBase-input::placeholder::before": {
color: colors.primarydark,
userSelect: "none",
},
"& .MuiInput-underline:before": {
borderBottomColor: colors.primarydark,
},
"& .MuiInput-underline:hover:before": {
borderBottomColor: colors.primary,
},
"& .MuiInput-underline:after": {
borderBottomColor: colors.primarylight,
},
"& .MuiInputLabel-root::before": {
color: colors.primary,
},
"& .MuiInputLabel-root": {
// The little label on the top-right
color: colors.primary, // unfocused
userSelect: "none",
"&.Mui-focused": {
color: colors.primarylight, // focused
},
},
},
});
export const TextField: React.FC<TextFieldProps> = (props: TextFieldProps) => { export const TextField: React.FC<TextFieldProps> = (props: TextFieldProps) => {
return ( return (
<MuiTF <MuiTF
{...props} {...props}
classes={{ classes={{
...useStyles(),
...props.classes, ...props.classes,
}} }}
/> />

@ -27,6 +27,64 @@ export const theme = createMuiTheme({
root: { root: {
backgroundColor: colors.well, backgroundColor: colors.well,
}, },
input: {
color: colors.primary,
"&::placeholder": {
userSelect: "none",
color: colors.primarydark,
},
},
},
MuiInput: {
root: {
backgroundColor: colors.well,
borderBottomColor: "#fff",
},
underline: {
"&:hover:before": {
borderBottomColor: colors.primarydark,
},
"&:before": {
borderBottomColor: colors.primary,
},
"&:after": {
borderBottomColor: colors.primarylight,
},
},
},
MuiInputLabel: {
root: {
color: colors.primarydark, // why is this switched?
userSelect: "none",
"&:before": {
color: colors.primarylight,
},
},
},
MuiSelect: {
icon: {
color: colors.primary,
},
},
MuiMenu: {
list: {
backgroundColor: colors.well,
},
},
MuiMenuItem: {
root: {
color: colors.primary,
},
},
MuiAccordionSummary: {
root: {
backgroundColor: "#111",
},
},
MuiAccordionDetails: {
root: {
backgroundColor: "#000",
},
}, },
}, },
}); });