2021-06-18 09:38:17 +02:00
|
|
|
import React, { useState } from "react";
|
|
|
|
import { ActionTypes } from "../data/ActionTypes";
|
|
|
|
import { createProgressBarText } from "../../../utils/helpers/createProgressBarText";
|
2021-09-09 05:47:34 +02:00
|
|
|
import { formatNumber, convertTimeMsToTimeElapsedString } from "../../../utils/StringHelperFunctions";
|
2021-08-16 04:35:43 +02:00
|
|
|
import { IBladeburner } from "../IBladeburner";
|
2021-08-16 07:35:05 +02:00
|
|
|
import { IPlayer } from "../../PersonObjects/IPlayer";
|
2021-08-23 17:42:14 +02:00
|
|
|
import { CopyableText } from "../../ui/React/CopyableText";
|
2021-08-16 07:35:05 +02:00
|
|
|
|
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 GeneralActionElem(props: IProps): React.ReactElement {
|
2021-09-05 01:09:30 +02:00
|
|
|
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);
|
2021-06-18 09:38:17 +02:00
|
|
|
}
|
2021-09-05 01:09:30 +02:00
|
|
|
return -1; // dead code
|
|
|
|
})();
|
|
|
|
const successChance =
|
|
|
|
props.action.name === "Recruitment"
|
2021-09-09 05:47:34 +02:00
|
|
|
? Math.max(0, Math.min(props.bladeburner.getRecruitmentSuccessChance(props.player), 1))
|
2021-09-05 01:09:30 +02:00
|
|
|
: -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);
|
|
|
|
}
|
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
|
|
|
})}
|
|
|
|
</p>
|
|
|
|
) : (
|
2021-06-18 09:38:17 +02:00
|
|
|
<>
|
2021-09-09 05:47:34 +02:00
|
|
|
<a onClick={onStart} className="a-link-button" style={{ margin: "3px", padding: "3px" }}>
|
2021-09-05 01:09:30 +02:00
|
|
|
Start
|
|
|
|
</a>
|
|
|
|
</>
|
|
|
|
)}
|
|
|
|
<br />
|
|
|
|
<br />
|
2021-09-09 05:47:34 +02:00
|
|
|
<pre style={{ display: "inline-block" }} dangerouslySetInnerHTML={{ __html: props.action.desc }}></pre>
|
2021-09-05 01:09:30 +02:00
|
|
|
<br />
|
|
|
|
<br />
|
|
|
|
<pre style={{ display: "inline-block" }}>
|
|
|
|
Time Required: {convertTimeMsToTimeElapsedString(actionTime * 1000)}
|
|
|
|
{successChance !== -1 && (
|
|
|
|
<>
|
|
|
|
<br />
|
|
|
|
Estimated success chance: {formatNumber(successChance * 100, 1)}%
|
|
|
|
</>
|
|
|
|
)}
|
|
|
|
</pre>
|
|
|
|
</>
|
|
|
|
);
|
|
|
|
}
|