bitburner-src/src/Faction/ui/FactionsRoot.tsx

134 lines
4.9 KiB
TypeScript
Raw Normal View History

import React, { useEffect, useState } from "react";
2022-03-23 17:17:03 +01:00
import { Box, Button, Container, Paper, TableBody, TableRow, Typography } from "@mui/material";
import { IPlayer } from "../../PersonObjects/IPlayer";
import { Table, TableCell } from "../../ui/React/Table";
import { IRouter } from "../../ui/Router";
import { Faction } from "../Faction";
import { joinFaction, getFactionAugmentationsFiltered } from "../FactionHelpers";
import { Factions } from "../Factions";
2022-03-21 14:23:34 +01:00
import { FactionNames } from "../data/FactionNames";
2021-09-20 07:18:20 +02:00
2021-10-23 21:22:58 +02:00
export const InvitationsSeen: string[] = [];
interface IProps {
2021-09-05 01:09:30 +02:00
player: IPlayer;
2021-09-17 08:04:44 +02:00
router: IRouter;
}
2021-09-17 08:04:44 +02:00
export function FactionsRoot(props: IProps): React.ReactElement {
2021-09-05 01:09:30 +02:00
const setRerender = useState(false)[1];
2021-09-20 23:26:47 +02:00
function rerender(): void {
setRerender((old) => !old);
}
useEffect(() => {
2021-09-25 19:31:42 +02:00
const id = setInterval(rerender, 200);
2021-09-20 23:26:47 +02:00
return () => clearInterval(id);
}, []);
2021-10-23 21:22:58 +02:00
useEffect(() => {
props.player.factionInvitations.forEach((faction) => {
if (InvitationsSeen.includes(faction)) return;
InvitationsSeen.push(faction);
});
}, []);
2021-09-17 08:04:44 +02:00
function openFaction(faction: Faction): void {
props.router.toFaction(faction);
2021-09-05 01:09:30 +02:00
}
2022-03-11 01:39:54 +01:00
function openFactionAugPage(faction: Faction): void {
props.router.toFaction(faction, true);
}
2021-09-20 07:18:20 +02:00
function acceptInvitation(event: React.MouseEvent<HTMLButtonElement, MouseEvent>, faction: string): void {
2021-09-05 01:09:30 +02:00
if (!event.isTrusted) return;
joinFaction(Factions[faction]);
setRerender((x) => !x);
}
const getAugsLeft = (faction: Faction, player: IPlayer): number => {
const augs = getFactionAugmentationsFiltered(player, faction);
2022-03-23 17:17:03 +01:00
return augs.filter((augmentation: string) => !player.hasAugmentation(augmentation)).length;
};
2022-03-23 17:17:03 +01:00
const allFactions = Object.values(FactionNames).map((faction) => faction as string);
2022-03-21 16:11:04 +01:00
const allJoinedFactions = props.player.factions.slice(0);
2022-03-23 17:17:03 +01:00
allJoinedFactions.sort((a, b) => allFactions.indexOf(a) - allFactions.indexOf(b));
2021-09-05 01:09:30 +02:00
return (
<Container disableGutters maxWidth="md" sx={{ mx: 0, mb: 10 }}>
2021-09-25 09:09:27 +02:00
<Typography variant="h4">Factions</Typography>
<Typography mb={4}>
Throughout the game you may receive invitations from factions. There are many different factions, and each
faction has different criteria for determining its potential members. Joining a faction and furthering its cause
is crucial to progressing in the game and unlocking endgame content.
</Typography>
<Typography variant="h5" color="primary" mt={2} mb={1}>
Factions you have joined:
</Typography>
{(allJoinedFactions.length > 0 && (
2022-01-21 23:55:10 +01:00
<Paper sx={{ my: 1, p: 1, pb: 0, display: "inline-block" }}>
2022-03-11 01:39:54 +01:00
<Table padding="none" style={{ width: "fit-content" }}>
2021-09-20 07:18:20 +02:00
<TableBody>
{allJoinedFactions.map((faction: string) => (
2021-09-20 07:18:20 +02:00
<TableRow key={faction}>
<TableCell>
2022-01-21 23:55:10 +01:00
<Typography noWrap mb={1}>
{faction}
</Typography>
2021-09-20 07:18:20 +02:00
</TableCell>
<TableCell align="right">
2022-01-21 23:55:10 +01:00
<Box ml={1} mb={1}>
<Button onClick={() => openFaction(Factions[faction])}>Details</Button>
</Box>
</TableCell>
<TableCell align="right">
2022-03-11 01:39:54 +01:00
<Box ml={1} mb={1}>
2022-03-23 17:17:03 +01:00
<Button sx={{ width: "100%" }} onClick={() => openFactionAugPage(Factions[faction])}>
Augmentations Left: {getAugsLeft(Factions[faction], props.player)}
2022-03-11 01:39:54 +01:00
</Button>
</Box>
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</Paper>
)) || <Typography>You haven't joined any factions.</Typography>}
<Typography variant="h5" color="primary" mt={4} mb={1}>
Outstanding Faction Invitations
</Typography>
<Typography mb={1}>
Factions you have been invited to. You can accept these faction invitations at any time:
</Typography>
{(props.player.factionInvitations.length > 0 && (
2022-01-21 23:55:10 +01:00
<Paper sx={{ my: 1, mb: 4, p: 1, pb: 0, display: "inline-block" }}>
<Table padding="none">
<TableBody>
{props.player.factionInvitations.map((faction: string) => (
<TableRow key={faction}>
<TableCell>
<Typography noWrap mb={1}>
{faction}
</Typography>
</TableCell>
<TableCell align="right">
<Box ml={1} mb={1}>
<Button onClick={(e) => acceptInvitation(e, faction)}>Join!</Button>
</Box>
2021-09-20 07:18:20 +02:00
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</Paper>
)) || <Typography>You have no outstanding faction invites.</Typography>}
</Container>
2021-09-05 01:09:30 +02:00
);
}