bitburner-src/src/Bladeburner/ui/BlackOpElem.tsx

104 lines
3.7 KiB
TypeScript
Raw Normal View History

2021-08-10 17:25:21 +02:00
import React, { useState } from "react";
2021-09-09 05:47:34 +02:00
import { formatNumber, convertTimeMsToTimeElapsedString } from "../../../utils/StringHelperFunctions";
2021-06-18 09:38:17 +02:00
import { ActionTypes } from "../data/ActionTypes";
import { createProgressBarText } from "../../../utils/helpers/createProgressBarText";
import { stealthIcon, killIcon } from "../data/Icons";
2021-08-16 03:49:08 +02:00
import { createPopup } from "../../ui/React/createPopup";
import { TeamSizePopup } from "./TeamSizePopup";
import { IBladeburner } from "../IBladeburner";
2021-08-16 07:35:05 +02:00
import { IPlayer } from "../../PersonObjects/IPlayer";
2021-08-21 20:00:28 +02:00
import { SuccessChance } from "./SuccessChance";
2021-08-23 17:42:14 +02:00
import { CopyableText } from "../../ui/React/CopyableText";
2021-06-18 09:38:17 +02:00
interface IProps {
2021-09-05 01:09:30 +02:00
bladeburner: IBladeburner;
player: IPlayer;
action: any;
2021-06-18 09:38:17 +02:00
}
export function BlackOpElem(props: IProps): React.ReactElement {
2021-09-05 01:09:30 +02:00
const setRerender = useState(false)[1];
const isCompleted = props.bladeburner.blackops[props.action.name] != null;
if (isCompleted) {
2021-09-09 05:47:34 +02:00
return <h2 style={{ display: "block" }}>{props.action.name} (COMPLETED)</h2>;
2021-09-05 01:09:30 +02:00
}
2021-06-18 09:38:17 +02:00
2021-09-05 01:09:30 +02:00
const isActive =
props.bladeburner.action.type === ActionTypes["BlackOperation"] &&
props.action.name === props.bladeburner.action.name;
2021-09-09 05:47:34 +02:00
const estimatedSuccessChance = props.action.getEstSuccessChance(props.bladeburner);
2021-09-05 01:09:30 +02:00
const actionTime = props.action.getActionTime(props.bladeburner);
const hasReqdRank = props.bladeburner.rank >= props.action.reqdRank;
const computedActionTimeCurrent = Math.min(
props.bladeburner.actionTimeCurrent + props.bladeburner.actionTimeOverflow,
props.bladeburner.actionTimeToComplete,
);
2021-06-18 09:38:17 +02:00
2021-09-05 01:09:30 +02:00
function onStart(): void {
props.bladeburner.action.type = ActionTypes.BlackOperation;
props.bladeburner.action.name = props.action.name;
props.bladeburner.startAction(props.player, props.bladeburner.action);
setRerender((old) => !old);
}
2021-06-18 09:38:17 +02:00
2021-09-05 01:09:30 +02:00
function onTeam(): void {
const popupId = "bladeburner-operation-set-team-size-popup";
createPopup(popupId, TeamSizePopup, {
bladeburner: props.bladeburner,
action: props.action,
popupId: popupId,
});
}
2021-06-18 09:38:17 +02:00
2021-09-05 01:09:30 +02:00
return (
<>
<h2 style={{ display: "inline-block" }}>
{isActive ? (
<>
2021-09-09 05:47:34 +02:00
<CopyableText value={props.action.name} /> (IN PROGRESS - {formatNumber(computedActionTimeCurrent, 0)} /{" "}
2021-09-05 01:09:30 +02:00
{formatNumber(props.bladeburner.actionTimeToComplete, 0)})
</>
) : (
<CopyableText value={props.action.name} />
)}
</h2>
{isActive ? (
<p style={{ display: "block" }}>
{createProgressBarText({
2021-09-09 05:47:34 +02:00
progress: computedActionTimeCurrent / props.bladeburner.actionTimeToComplete,
2021-09-05 01:09:30 +02:00
})}
2021-06-18 09:38:17 +02:00
</p>
2021-09-05 01:09:30 +02:00
) : (
<>
<a
className={hasReqdRank ? "a-link-button" : "a-link-button-inactive"}
style={{ margin: "3px", padding: "3px" }}
onClick={onStart}
>
Start
</a>
2021-09-09 05:47:34 +02:00
<a onClick={onTeam} style={{ margin: "3px", padding: "3px" }} className="a-link-button">
2021-09-05 01:09:30 +02:00
Set Team Size (Curr Size: {formatNumber(props.action.teamCount, 0)})
</a>
</>
)}
<br />
<br />
2021-09-09 05:47:34 +02:00
<p style={{ display: "inline-block" }} dangerouslySetInnerHTML={{ __html: props.action.desc }} />
2021-09-05 01:09:30 +02:00
<br />
<br />
<p style={{ display: "block", color: hasReqdRank ? "white" : "red" }}>
Required Rank: {formatNumber(props.action.reqdRank, 0)}
</p>
<br />
<pre style={{ display: "inline-block" }}>
2021-09-09 05:47:34 +02:00
Estimated Success Chance: <SuccessChance chance={estimatedSuccessChance} />{" "}
2021-09-05 01:09:30 +02:00
{props.action.isStealth ? stealthIcon : <></>}
{props.action.isKill ? killIcon : <></>}
2021-06-18 09:38:17 +02:00
<br />
2021-09-05 01:09:30 +02:00
Time Required: {convertTimeMsToTimeElapsedString(actionTime * 1000)}
</pre>
</>
);
}