bitburner-src/src/Locations/ui/SpecialLocation.tsx

198 lines
4.9 KiB
TypeScript
Raw Normal View History

/**
* React Subcomponent for displaying a location's UI, when that location has special
* actions/options/properties
*
* Examples:
* - Bladeburner @ NSA
* - Re-sleeving @ VitaLife
* - Create Corporation @ City Hall
*
* This subcomponent creates all of the buttons for interacting with those special
* properties
*/
import * as React from "react";
2021-09-05 01:09:30 +02:00
import { Location } from "../Location";
import { createStartCorporationPopup } from "../LocationsHelpers";
import { LocationName } from "../data/LocationNames";
2021-09-05 01:09:30 +02:00
import { IEngine } from "../../IEngine";
import { IPlayer } from "../../PersonObjects/IPlayer";
2021-09-05 01:09:30 +02:00
import { AutoupdatingStdButton } from "../../ui/React/AutoupdatingStdButton";
import { StdButton } from "../../ui/React/StdButton";
2021-09-05 01:09:30 +02:00
import { dialogBoxCreate } from "../../../utils/DialogBox";
type IProps = {
2021-09-05 01:09:30 +02:00
engine: IEngine;
loc: Location;
p: IPlayer;
};
type IState = {
2021-09-05 01:09:30 +02:00
inBladeburner: boolean;
};
export class SpecialLocation extends React.Component<IProps, IState> {
2021-09-05 01:09:30 +02:00
/**
* Stores button styling that sets them all to block display
*/
btnStyle: any;
constructor(props: IProps) {
super(props);
this.btnStyle = { display: "block" };
this.renderNoodleBar = this.renderNoodleBar.bind(this);
this.createCorporationPopup = this.createCorporationPopup.bind(this);
this.handleBladeburner = this.handleBladeburner.bind(this);
this.handleResleeving = this.handleResleeving.bind(this);
this.state = {
inBladeburner: this.props.p.inBladeburner(),
};
}
/**
* Click handler for "Create Corporation" button at Sector-12 City Hall
*/
createCorporationPopup(): void {
createStartCorporationPopup(this.props.p);
}
/**
* Click handler for Bladeburner button at Sector-12 NSA
*/
handleBladeburner(): void {
const p = this.props.p;
if (p.inBladeburner()) {
// Enter Bladeburner division
this.props.engine.loadBladeburnerContent();
} else {
// Apply for Bladeburner division
if (
p.strength >= 100 &&
p.defense >= 100 &&
p.dexterity >= 100 &&
p.agility >= 100
) {
p.startBladeburner({ new: true });
dialogBoxCreate(
"You have been accepted into the Bladeburner division!",
);
this.setState({
inBladeburner: true,
});
const worldHeader = document.getElementById("world-menu-header");
if (worldHeader instanceof HTMLElement) {
worldHeader.click();
worldHeader.click();
}
2021-09-05 01:09:30 +02:00
} else {
dialogBoxCreate(
"Rejected! Please apply again when you have 100 of each combat stat (str, def, dex, agi)",
);
}
}
2021-09-05 01:09:30 +02:00
}
/**
* Click handler for Resleeving button at New Tokyo VitaLife
*/
handleResleeving(): void {
this.props.engine.loadResleevingContent();
}
renderBladeburner(): React.ReactNode {
if (!this.props.p.canAccessBladeburner()) {
return null;
}
2021-09-05 01:09:30 +02:00
const text = this.state.inBladeburner
? "Enter Bladeburner Headquarters"
: "Apply to Bladeburner Division";
return (
<StdButton
onClick={this.handleBladeburner}
style={this.btnStyle}
text={text}
/>
);
}
renderNoodleBar(): React.ReactNode {
function EatNoodles(): void {
dialogBoxCreate(<>You ate some delicious noodles and feel refreshed.</>);
}
2021-09-05 01:09:30 +02:00
return (
<StdButton
onClick={EatNoodles}
style={this.btnStyle}
text={"Eat noodles"}
/>
);
}
renderCreateCorporation(): React.ReactNode {
if (!this.props.p.canAccessCorporation()) {
return (
<>
<p>
<i>
A business man is yelling at a clerk. You should come back later.
</i>
</p>
</>
);
2021-08-19 22:37:59 +02:00
}
2021-09-05 01:09:30 +02:00
return (
<AutoupdatingStdButton
disabled={
!this.props.p.canAccessCorporation() || this.props.p.hasCorporation()
}
2021-09-05 01:09:30 +02:00
onClick={this.createCorporationPopup}
style={this.btnStyle}
text={"Create a Corporation"}
/>
);
}
renderResleeving(): React.ReactNode {
if (!this.props.p.canAccessResleeving()) {
return null;
}
2021-09-05 01:09:30 +02:00
return (
<StdButton
onClick={this.handleResleeving}
style={this.btnStyle}
text={"Re-Sleeve"}
/>
);
}
render(): React.ReactNode {
switch (this.props.loc.name) {
case LocationName.NewTokyoVitaLife: {
return this.renderResleeving();
}
case LocationName.Sector12CityHall: {
return this.renderCreateCorporation();
}
case LocationName.Sector12NSA: {
return this.renderBladeburner();
}
case LocationName.NewTokyoNoodleBar: {
return this.renderNoodleBar();
}
default:
console.error(
`Location ${this.props.loc.name} doesn't have any special properties`,
);
break;
}
2021-09-05 01:09:30 +02:00
}
}