bitburner-src/src/Bladeburner/ui/GeneralActionElem.tsx
2021-09-04 19:09:30 -04:00

108 lines
3.1 KiB
TypeScript

import React, { useState } from "react";
import { ActionTypes } from "../data/ActionTypes";
import { createProgressBarText } from "../../../utils/helpers/createProgressBarText";
import {
formatNumber,
convertTimeMsToTimeElapsedString,
} from "../../../utils/StringHelperFunctions";
import { IBladeburner } from "../IBladeburner";
import { IPlayer } from "../../PersonObjects/IPlayer";
import { CopyableText } from "../../ui/React/CopyableText";
interface IProps {
bladeburner: IBladeburner;
player: IPlayer;
action: any;
}
export function GeneralActionElem(props: IProps): React.ReactElement {
const setRerender = useState(false)[1];
const isActive = props.action.name === props.bladeburner.action.name;
const computedActionTimeCurrent = Math.min(
props.bladeburner.actionTimeCurrent + props.bladeburner.actionTimeOverflow,
props.bladeburner.actionTimeToComplete,
);
const actionTime = (function (): number {
switch (props.action.name) {
case "Training":
case "Field Analysis":
return 30;
case "Diplomacy":
case "Hyperbolic Regeneration Chamber":
return 60;
case "Recruitment":
return props.bladeburner.getRecruitmentTime(props.player);
}
return -1; // dead code
})();
const successChance =
props.action.name === "Recruitment"
? Math.max(
0,
Math.min(
props.bladeburner.getRecruitmentSuccessChance(props.player),
1,
),
)
: -1;
function onStart(): void {
props.bladeburner.action.type = ActionTypes[props.action.name as string];
props.bladeburner.action.name = props.action.name;
props.bladeburner.startAction(props.player, props.bladeburner.action);
setRerender((old) => !old);
}
return (
<>
<h2 style={{ display: "inline-block" }}>
{isActive ? (
<>
<CopyableText value={props.action.name} /> (IN PROGRESS -{" "}
{formatNumber(computedActionTimeCurrent, 0)} /{" "}
{formatNumber(props.bladeburner.actionTimeToComplete, 0)})
</>
) : (
<CopyableText value={props.action.name} />
)}
</h2>
{isActive ? (
<p style={{ display: "block" }}>
{createProgressBarText({
progress:
computedActionTimeCurrent /
props.bladeburner.actionTimeToComplete,
})}
</p>
) : (
<>
<a
onClick={onStart}
className="a-link-button"
style={{ margin: "3px", padding: "3px" }}
>
Start
</a>
</>
)}
<br />
<br />
<pre
style={{ display: "inline-block" }}
dangerouslySetInnerHTML={{ __html: props.action.desc }}
></pre>
<br />
<br />
<pre style={{ display: "inline-block" }}>
Time Required: {convertTimeMsToTimeElapsedString(actionTime * 1000)}
{successChance !== -1 && (
<>
<br />
Estimated success chance: {formatNumber(successChance * 100, 1)}%
</>
)}
</pre>
</>
);
}