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

142 lines
3.8 KiB
TypeScript
Raw Normal View History

/**
* React Subcomponent for displaying a location's UI, when that location is a university
*
* This subcomponent renders all of the buttons for studying/taking courses
*/
import * as React from "react";
2021-09-05 01:09:30 +02:00
import { Location } from "../Location";
2021-09-05 01:09:30 +02:00
import { CONSTANTS } from "../../Constants";
import { getServer } from "../../Server/ServerHelpers";
import { Server } from "../../Server/Server";
import { SpecialServerIps } from "../../Server/SpecialServerIps";
2021-09-05 01:09:30 +02:00
import { StdButton } from "../../ui/React/StdButton";
import { Money } from "../../ui/React/Money";
2021-09-18 01:43:08 +02:00
import { use } from "../../ui/Context";
type IProps = {
2021-09-05 01:09:30 +02:00
loc: Location;
};
2021-09-18 01:43:08 +02:00
export function UniversityLocation(props: IProps): React.ReactElement {
const player = use.Player();
const router = use.Router();
2021-09-05 01:09:30 +02:00
2021-09-18 01:43:08 +02:00
function calculateCost(): number {
const ip = SpecialServerIps.getIp(props.loc.name);
2021-09-05 01:09:30 +02:00
const server = getServer(ip);
2021-09-18 01:43:08 +02:00
if (server == null || !server.hasOwnProperty("backdoorInstalled")) return props.loc.costMult;
2021-09-05 01:09:30 +02:00
const discount = (server as Server).backdoorInstalled ? 0.9 : 1;
2021-09-18 01:43:08 +02:00
return props.loc.costMult * discount;
2021-09-05 01:09:30 +02:00
}
2021-09-18 01:43:08 +02:00
function take(stat: string): void {
const loc = props.loc;
player.startClass(calculateCost(), loc.expMult, stat);
router.toWork();
2021-09-05 01:09:30 +02:00
}
2021-09-18 01:43:08 +02:00
function study(): void {
take(CONSTANTS.ClassStudyComputerScience);
2021-09-05 01:09:30 +02:00
}
2021-09-18 01:43:08 +02:00
function dataStructures(): void {
take(CONSTANTS.ClassDataStructures);
2021-09-05 01:09:30 +02:00
}
2021-09-18 01:43:08 +02:00
function networks(): void {
take(CONSTANTS.ClassNetworks);
2021-09-05 01:09:30 +02:00
}
2021-09-18 01:43:08 +02:00
function algorithms(): void {
take(CONSTANTS.ClassAlgorithms);
2021-09-05 01:09:30 +02:00
}
2021-09-18 01:43:08 +02:00
function management(): void {
take(CONSTANTS.ClassManagement);
2021-09-05 01:09:30 +02:00
}
2021-09-18 01:43:08 +02:00
function leadership(): void {
take(CONSTANTS.ClassLeadership);
2021-09-05 01:09:30 +02:00
}
2021-09-18 01:43:08 +02:00
const costMult: number = calculateCost();
const dataStructuresCost = CONSTANTS.ClassDataStructuresBaseCost * costMult;
const networksCost = CONSTANTS.ClassNetworksBaseCost * costMult;
const algorithmsCost = CONSTANTS.ClassAlgorithmsBaseCost * costMult;
const managementCost = CONSTANTS.ClassManagementBaseCost * costMult;
const leadershipCost = CONSTANTS.ClassLeadershipBaseCost * costMult;
const earnHackingExpTooltip = `Gain hacking experience!`;
const earnCharismaExpTooltip = `Gain charisma experience!`;
return (
<div>
<StdButton
onClick={study}
style={{ display: "block" }}
text={`Study Computer Science (free)`}
tooltip={earnHackingExpTooltip}
/>
<StdButton
onClick={dataStructures}
style={{ display: "block" }}
text={
<>
Take Data Structures course (
<Money money={dataStructuresCost} player={player} /> / sec)
</>
}
tooltip={earnHackingExpTooltip}
/>
<StdButton
onClick={networks}
style={{ display: "block" }}
text={
<>
Take Networks course (
<Money money={networksCost} player={player} /> / sec)
</>
}
tooltip={earnHackingExpTooltip}
/>
<StdButton
onClick={algorithms}
style={{ display: "block" }}
text={
<>
Take Algorithms course (
<Money money={algorithmsCost} player={player} /> / sec)
</>
}
tooltip={earnHackingExpTooltip}
/>
<StdButton
onClick={management}
style={{ display: "block" }}
text={
<>
Take Management course (
<Money money={managementCost} player={player} /> / sec)
</>
}
tooltip={earnCharismaExpTooltip}
/>
<StdButton
onClick={leadership}
style={{ display: "block" }}
text={
<>
Take Leadership course (
<Money money={leadershipCost} player={player} /> / sec)
</>
}
tooltip={earnCharismaExpTooltip}
/>
</div>
);
}