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

88 lines
3.7 KiB
TypeScript
Raw Normal View History

2021-08-10 17:25:21 +02:00
import React, { useState } from "react";
2021-06-18 09:38:17 +02:00
import {
formatNumber,
convertTimeMsToTimeElapsedString,
} from "../../../utils/StringHelperFunctions";
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-06-18 09:38:17 +02:00
interface IProps {
bladeburner: IBladeburner;
2021-08-16 07:35:05 +02:00
player: IPlayer;
2021-06-18 09:38:17 +02:00
action: any;
}
export function BlackOpElem(props: IProps): React.ReactElement {
2021-08-10 17:25:21 +02:00
const setRerender = useState(false)[1];
2021-06-18 09:38:17 +02:00
const isCompleted = (props.bladeburner.blackops[props.action.name] != null);
if(isCompleted) {
return (
<h2 style={{display: 'block'}}>{props.action.name} (COMPLETED)</h2>);
}
const isActive = props.bladeburner.action.type === ActionTypes["BlackOperation"] && props.action.name === props.bladeburner.action.name;
2021-08-21 20:00:28 +02:00
const estimatedSuccessChance = props.action.getEstSuccessChance(props.bladeburner);
2021-06-18 09:38:17 +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-08-19 07:45:26 +02:00
function onStart(): void {
2021-06-18 09:38:17 +02:00
props.bladeburner.action.type = ActionTypes.BlackOperation;
props.bladeburner.action.name = props.action.name;
props.bladeburner.startAction(props.player, props.bladeburner.action);
2021-08-10 17:25:21 +02:00
setRerender(old => !old);
2021-06-18 09:38:17 +02:00
}
2021-08-19 07:45:26 +02:00
function onTeam(): void {
2021-08-16 03:49:08 +02:00
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
}
return (<>
<h2 style={{display: 'inline-block'}}>
{isActive ?
<>{props.action.name} (IN PROGRESS - {formatNumber(computedActionTimeCurrent, 0)} / {formatNumber(props.bladeburner.actionTimeToComplete, 0)})</> :
<>{props.action.name}</>
}
</h2>
{isActive ?
<p style={{display: 'block'}}>{createProgressBarText({progress: computedActionTimeCurrent / props.bladeburner.actionTimeToComplete})}</p> :
<>
<a
className={hasReqdRank ? "a-link-button" : "a-link-button-inactive"}
style={{margin:"3px", padding:"3px"}}
onClick={onStart}
>Start</a>
<a
onClick={onTeam}
style={{margin:"3px", padding:"3px"}}
className="a-link-button">
Set Team Size (Curr Size: {formatNumber(props.action.teamCount, 0)})
</a>
</>}
<br />
<br />
<p style={{display:"inline-block"}} dangerouslySetInnerHTML={{__html: props.action.desc}} />
<br />
<br />
<p style={{display:"block", color:hasReqdRank ? "white" : "red"}}>
Required Rank: {formatNumber(props.action.reqdRank, 0)}
</p>
<br />
2021-08-21 20:00:28 +02:00
<pre style={{display:"inline-block"}}>
Estimated Success Chance: <SuccessChance chance={estimatedSuccessChance} /> {props.action.isStealth?stealthIcon:<></>}{props.action.isKill?killIcon:<></>}
2021-06-18 09:38:17 +02:00
<br />
Time Required: {convertTimeMsToTimeElapsedString(actionTime*1000)}
2021-08-21 20:00:28 +02:00
</pre>
2021-06-18 09:38:17 +02:00
</>);
}