2019-03-27 09:36:14 +01:00
|
|
|
/**
|
|
|
|
* Root React component for the popup that lets player purchase Duplicate
|
|
|
|
* Sleeves and Sleeve-related upgrades from The Covenant
|
|
|
|
*/
|
2021-09-05 01:09:30 +02:00
|
|
|
import React, { useState } from "react";
|
2019-03-27 09:36:14 +01:00
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
import { CovenantSleeveUpgrades } from "./CovenantSleeveUpgrades";
|
2019-03-27 09:36:14 +01:00
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
import { Sleeve } from "../Sleeve";
|
|
|
|
import {
|
|
|
|
BaseCostPerSleeve,
|
|
|
|
MaxSleevesFromCovenant,
|
|
|
|
PopupId,
|
|
|
|
} from "../SleeveCovenantPurchases";
|
|
|
|
import { IPlayer } from "../../IPlayer";
|
2019-03-27 09:36:14 +01:00
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
import { PopupCloseButton } from "../../../ui/React/PopupCloseButton";
|
|
|
|
import { StdButton } from "../../../ui/React/StdButton";
|
|
|
|
import { Money } from "../../../ui/React/Money";
|
2019-03-27 09:36:14 +01:00
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
import { dialogBoxCreate } from "../../../../utils/DialogBox";
|
2019-03-27 09:36:14 +01:00
|
|
|
|
|
|
|
interface IProps {
|
2021-09-05 01:09:30 +02:00
|
|
|
closeFn: () => void;
|
|
|
|
p: IPlayer;
|
2019-03-27 09:36:14 +01:00
|
|
|
}
|
|
|
|
|
2021-06-14 21:42:38 +02:00
|
|
|
export function CovenantPurchasesRoot(props: IProps): React.ReactElement {
|
2021-09-05 01:09:30 +02:00
|
|
|
const [update, setUpdate] = useState(0);
|
2019-03-27 09:36:14 +01:00
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
/**
|
|
|
|
* Get the cost to purchase a new Duplicate Sleeve
|
|
|
|
*/
|
|
|
|
function purchaseCost(): number {
|
|
|
|
return (props.p.sleevesFromCovenant + 1) * BaseCostPerSleeve;
|
|
|
|
}
|
2019-03-27 09:36:14 +01:00
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
/**
|
|
|
|
* Force a rerender by just changing an arbitrary state value
|
|
|
|
*/
|
|
|
|
function rerender(): void {
|
|
|
|
setUpdate(update + 1);
|
|
|
|
}
|
2019-03-27 09:36:14 +01:00
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
// Purchasing a new Duplicate Sleeve
|
|
|
|
let purchaseDisabled = false;
|
|
|
|
if (!props.p.canAfford(purchaseCost())) {
|
|
|
|
purchaseDisabled = true;
|
|
|
|
}
|
|
|
|
if (props.p.sleevesFromCovenant >= MaxSleevesFromCovenant) {
|
|
|
|
purchaseDisabled = true;
|
|
|
|
}
|
2019-03-27 09:36:14 +01:00
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
function purchaseOnClick(): void {
|
|
|
|
if (props.p.sleevesFromCovenant >= MaxSleevesFromCovenant) return;
|
2019-03-27 09:36:14 +01:00
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
if (props.p.canAfford(purchaseCost())) {
|
|
|
|
props.p.loseMoney(purchaseCost());
|
|
|
|
props.p.sleevesFromCovenant += 1;
|
|
|
|
props.p.sleeves.push(new Sleeve(props.p));
|
|
|
|
rerender();
|
|
|
|
} else {
|
|
|
|
dialogBoxCreate(
|
|
|
|
`You cannot afford to purchase a Duplicate Sleeve`,
|
|
|
|
false,
|
|
|
|
);
|
2019-03-27 09:36:14 +01:00
|
|
|
}
|
2021-09-05 01:09:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Purchasing Upgrades for Sleeves
|
|
|
|
const upgradePanels = [];
|
|
|
|
for (let i = 0; i < props.p.sleeves.length; ++i) {
|
|
|
|
const sleeve = props.p.sleeves[i];
|
|
|
|
upgradePanels.push(
|
|
|
|
<CovenantSleeveUpgrades
|
|
|
|
{...props}
|
|
|
|
sleeve={sleeve}
|
|
|
|
index={i}
|
|
|
|
rerender={rerender}
|
|
|
|
key={i}
|
|
|
|
/>,
|
|
|
|
);
|
|
|
|
}
|
2021-06-14 21:42:38 +02:00
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
return (
|
|
|
|
<div>
|
|
|
|
<PopupCloseButton popup={PopupId} text={"Close"} />
|
|
|
|
<p>
|
|
|
|
Would you like to purchase an additional Duplicate Sleeve from The
|
|
|
|
Covenant for <Money money={purchaseCost()} player={props.p} />?
|
|
|
|
</p>
|
|
|
|
<br />
|
|
|
|
<p>
|
|
|
|
These Duplicate Sleeves are permanent (they persist through BitNodes).
|
|
|
|
You can purchase a total of {MaxSleevesFromCovenant} from The Covenant.
|
|
|
|
</p>
|
|
|
|
<StdButton
|
|
|
|
disabled={purchaseDisabled}
|
|
|
|
onClick={purchaseOnClick}
|
|
|
|
text={"Purchase"}
|
|
|
|
/>
|
|
|
|
<br />
|
|
|
|
<br />
|
|
|
|
<p>
|
|
|
|
Here, you can also purchase upgrades for your Duplicate Sleeves. These
|
|
|
|
upgrades are also permanent, meaning they persist across BitNodes.
|
|
|
|
</p>
|
|
|
|
{upgradePanels}
|
|
|
|
</div>
|
|
|
|
);
|
2019-03-27 09:36:14 +01:00
|
|
|
}
|