bitburner-src/src/PersonObjects/Sleeve/ui/CovenantSleeveMemoryUpgrade.tsx

128 lines
3.1 KiB
TypeScript
Raw Normal View History

/**
* React component for a panel that lets you purchase upgrades for a Duplicate
* Sleeve's Memory (through The Covenant)
*/
import * as React from "react";
import { Sleeve } from "../Sleeve";
import { IPlayer } from "../../IPlayer";
import { numeralWrapper } from "../../../ui/numeralFormat";
import { StdButton } from "../../../ui/React/StdButton";
import { Money } from "../../../ui/React/Money";
interface IProps {
2021-09-05 01:09:30 +02:00
index: number;
p: IPlayer;
rerender: () => void;
sleeve: Sleeve;
}
interface IState {
2021-09-05 01:09:30 +02:00
amt: number;
}
2021-09-05 01:09:30 +02:00
export class CovenantSleeveMemoryUpgrade extends React.Component<
IProps,
IState
> {
constructor(props: IProps) {
super(props);
2021-09-05 01:09:30 +02:00
this.state = {
amt: 1,
};
2021-09-05 01:09:30 +02:00
this.changePurchaseAmount = this.changePurchaseAmount.bind(this);
this.purchaseMemory = this.purchaseMemory.bind(this);
}
changePurchaseAmount(e: React.ChangeEvent<HTMLInputElement>): void {
let n: number = parseInt(e.target.value);
2021-09-05 01:09:30 +02:00
if (isNaN(n)) n = 1;
const maxMemory = 100 - this.props.sleeve.memory;
if (n > maxMemory) n = maxMemory;
2021-09-05 01:09:30 +02:00
this.setState({
amt: n,
});
}
2021-09-05 01:09:30 +02:00
getPurchaseCost(): number {
if (isNaN(this.state.amt)) {
return Infinity;
}
2021-09-05 01:09:30 +02:00
const maxMemory = 100 - this.props.sleeve.memory;
if (this.state.amt > maxMemory) {
return Infinity;
}
2021-09-05 01:09:30 +02:00
return this.props.sleeve.getMemoryUpgradeCost(this.state.amt);
}
2021-09-05 01:09:30 +02:00
purchaseMemory(): void {
const cost = this.getPurchaseCost();
if (this.props.p.canAfford(cost)) {
this.props.sleeve.upgradeMemory(this.state.amt);
this.props.p.loseMoney(cost);
this.props.rerender();
}
2021-09-05 01:09:30 +02:00
}
render(): React.ReactNode {
const inputId = `sleeve-${this.props.index}-memory-upgrade-input`;
// Memory cannot go above 100
const maxMemory = 100 - this.props.sleeve.memory;
// Purchase button props
const cost = this.getPurchaseCost();
const purchaseBtnDisabled = !this.props.p.canAfford(cost);
let purchaseBtnContent;
if (isNaN(this.state.amt)) {
purchaseBtnContent = <>Invalid value</>;
} else if (this.state.amt > maxMemory) {
purchaseBtnContent = <>Memory cannot exceed 100?</>;
} else {
purchaseBtnContent = (
<>
Purchase {this.state.amt} memory -{" "}
<Money money={cost} player={this.props.p} />?
</>
);
}
2021-09-05 01:09:30 +02:00
return (
<div>
<h2>
<u>Upgrade Memory</u>
</h2>
<p>
Purchase a memory upgrade for your sleeve. Note that a sleeve's max
memory is 100 (current:{" "}
{numeralWrapper.formatSleeveMemory(this.props.sleeve.memory)})
</p>
<label htmlFor={inputId}>
Amount of memory to purchase (must be an integer):
</label>
<input
className="text-input"
id={inputId}
onChange={this.changePurchaseAmount}
type={"number"}
value={this.state.amt}
/>
<br />
<StdButton
disabled={purchaseBtnDisabled}
onClick={this.purchaseMemory}
text={purchaseBtnContent}
/>
</div>
);
}
}