FEATURE: BitNode options (#1411)

This commit is contained in:
catloversg
2024-07-15 04:30:30 +07:00
committed by GitHub
parent 0e1e8a9862
commit 783120c886
71 changed files with 1315 additions and 308 deletions
+83 -3
View File
@@ -1,11 +1,15 @@
import React from "react";
import { Player } from "@player";
import { type BitNodeBooleanOptions } from "@nsdefs";
import { enterBitNode } from "../../RedPill";
import { BitNodes } from "../BitNode";
import { Modal } from "../../ui/React/Modal";
import Typography from "@mui/material/Typography";
import Button from "@mui/material/Button";
import { BitnodeMultiplierDescription } from "./BitnodeMultipliersDescription";
import { BitNodeAdvancedOptions } from "./BitNodeAdvancedOptions";
import { JSONMap } from "../../Types/Jsonable";
interface IProps {
open: boolean;
@@ -17,14 +21,77 @@ interface IProps {
}
export function PortalModal(props: IProps): React.ReactElement {
const [sourceFileOverrides, setSourceFileOverrides] = React.useState<JSONMap<number, number>>(new JSONMap());
const [intelligenceOverride, setIntelligenceOverride] = React.useState<number | undefined>();
const [bitNodeBooleanOptions, setBitNodeBooleanOptions] = React.useState<BitNodeBooleanOptions>({
restrictHomePCUpgrade: false,
disableGang: false,
disableCorporation: false,
disableBladeburner: false,
disable4SData: false,
disableHacknetServer: false,
disableSleeveExpAndAugmentation: false,
});
const bitNodeKey = "BitNode" + props.n;
const bitNode = BitNodes[bitNodeKey];
if (bitNode == null) throw new Error(`Could not find BitNode object for number: ${props.n}`);
const maxSourceFileLevel = props.n === 12 ? "∞" : "3";
const newLevel = Math.min(props.level + 1, props.n === 12 ? Number.MAX_VALUE : 3);
let currentSourceFiles = new Map(Player.sourceFiles);
if (!props.flume) {
const currentSourceFileLevel = Player.sourceFileLvl(props.destroyedBitNode);
if (currentSourceFileLevel < 3 || props.destroyedBitNode === 12) {
currentSourceFiles.set(props.destroyedBitNode, currentSourceFileLevel + 1);
}
}
currentSourceFiles = new Map([...currentSourceFiles].sort((a, b) => a[0] - b[0]));
const callbacks = {
setSfOverrides: (value: JSONMap<number, number>) => {
setSourceFileOverrides(value);
},
setSfActiveLevel: (sfNumber: number, sfLevel: number) => {
setSourceFileOverrides((old) => {
const newValue = new JSONMap(old);
newValue.set(sfNumber, sfLevel);
return newValue;
});
},
setIntelligenceOverride: (value: number | undefined) => {
setIntelligenceOverride(value);
},
setBooleanOption: (key: keyof BitNodeBooleanOptions, value: boolean) => {
if (!(key in bitNodeBooleanOptions)) {
throw new Error(`Invalid key of booleanOptions: ${key}`);
}
setBitNodeBooleanOptions((old) => {
return {
...old,
[key]: value,
};
});
},
};
function onClose() {
setSourceFileOverrides(new JSONMap());
setIntelligenceOverride(undefined);
setBitNodeBooleanOptions({
restrictHomePCUpgrade: false,
disableGang: false,
disableCorporation: false,
disableBladeburner: false,
disable4SData: false,
disableHacknetServer: false,
disableSleeveExpAndAugmentation: false,
});
props.onClose();
}
const newLevel = Math.min(props.level + 1, props.n === 12 ? Infinity : 3);
return (
<Modal open={props.open} onClose={props.onClose}>
<Modal open={props.open} onClose={onClose}>
<Typography variant="h4">
BitNode-{props.n}: {bitNode.name}
</Typography>
@@ -39,12 +106,25 @@ export function PortalModal(props: IProps): React.ReactElement {
<br />
<Typography component="div">{bitNode.info}</Typography>
<BitnodeMultiplierDescription n={props.n} level={newLevel} />
<BitNodeAdvancedOptions
targetBitNode={props.n}
currentSourceFiles={currentSourceFiles}
sourceFileOverrides={sourceFileOverrides}
intelligenceOverride={intelligenceOverride}
bitNodeBooleanOptions={bitNodeBooleanOptions}
callbacks={callbacks}
></BitNodeAdvancedOptions>
<br />
<Button
aria-label={`enter-bitnode-${bitNode.number.toString()}`}
autoFocus={true}
onClick={() => {
enterBitNode(props.flume, props.destroyedBitNode, props.n);
const bitNodeOptions = {
sourceFileOverrides,
intelligenceOverride,
...bitNodeBooleanOptions,
};
enterBitNode(props.flume, props.destroyedBitNode, props.n, bitNodeOptions);
props.onClose();
}}
>