bitburner-src/src/DevMenu/ui/Achievements.tsx

114 lines
3.9 KiB
TypeScript
Raw Normal View History

2022-01-08 11:45:00 +01:00
import React, { useState } from "react";
import Accordion from "@mui/material/Accordion";
import AccordionSummary from "@mui/material/AccordionSummary";
import AccordionDetails from "@mui/material/AccordionDetails";
import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
import Typography from "@mui/material/Typography";
import Button from "@mui/material/Button";
import ButtonGroup from "@mui/material/ButtonGroup";
import { Tooltip } from "@mui/material";
2022-04-07 01:30:08 +02:00
import LockIcon from "@mui/icons-material/Lock";
import LockOpenIcon from "@mui/icons-material/LockOpen";
2022-01-08 11:45:00 +01:00
import { Player } from "@player";
2022-01-08 11:45:00 +01:00
import { achievements } from "../../Achievements/Achievements";
2022-09-06 15:07:12 +02:00
import { Engine } from "../../engine";
2022-01-08 11:45:00 +01:00
2022-09-06 15:07:12 +02:00
export function Achievements(): React.ReactElement {
const [playerAchievement, setPlayerAchievements] = useState(Player.achievements.map((m) => m.ID));
2022-01-08 11:45:00 +01:00
function grantAchievement(id: string): void {
2022-09-06 15:07:12 +02:00
Player.giveAchievement(id);
setPlayerAchievements(Player.achievements.map((m) => m.ID));
2022-01-08 11:45:00 +01:00
}
function grantAllAchievements(): void {
2022-09-06 15:07:12 +02:00
Object.values(achievements).forEach((a) => Player.giveAchievement(a.ID));
setPlayerAchievements(Player.achievements.map((m) => m.ID));
2022-01-08 11:45:00 +01:00
}
function removeAchievement(id: string): void {
2022-09-06 15:07:12 +02:00
Player.achievements = Player.achievements.filter((a) => a.ID !== id);
setPlayerAchievements(Player.achievements.map((m) => m.ID));
2022-01-08 11:45:00 +01:00
}
function clearAchievements(): void {
2022-09-06 15:07:12 +02:00
Player.achievements = [];
setPlayerAchievements(Player.achievements.map((m) => m.ID));
2022-01-08 11:45:00 +01:00
}
function disableEngine(): void {
2022-09-06 15:07:12 +02:00
Engine.Counters.achievementsCounter = Number.MAX_VALUE;
2022-01-08 11:45:00 +01:00
}
function enableEngine(): void {
2022-09-06 15:07:12 +02:00
Engine.Counters.achievementsCounter = 0;
2022-01-08 11:45:00 +01:00
}
return (
<Accordion TransitionProps={{ unmountOnExit: true }}>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography>Achievements</Typography>
</AccordionSummary>
<AccordionDetails>
<table>
<tbody>
<tr>
2022-04-07 01:30:08 +02:00
<td></td>
2022-01-08 11:45:00 +01:00
<td>
<Typography>Achievements:</Typography>
</td>
<td>
<ButtonGroup>
<Button onClick={grantAllAchievements}>Grant All</Button>
<Button onClick={clearAchievements}>Clear</Button>
<Button onClick={disableEngine}>Disable Engine</Button>
<Button onClick={enableEngine}>Enable Engine</Button>
</ButtonGroup>
</td>
</tr>
{Object.values(achievements).map((i) => {
const achieved = playerAchievement.includes(i.ID);
2022-04-07 01:30:08 +02:00
return (
<tr key={"ach-" + i.ID}>
<td>
{achieved ? (
<Tooltip title="Achieved">
<LockOpenIcon color="primary" />
</Tooltip>
) : (
<Tooltip title="Locked">
<LockIcon color="secondary" />
</Tooltip>
)}
</td>
<td>
<Tooltip
title={
<>
{i.ID}
<br />
{i.Description}
</>
}
>
<Typography color={achieved ? "primary" : "secondary"}>{i.Name}:</Typography>
2022-01-08 11:45:00 +01:00
</Tooltip>
2022-04-07 01:30:08 +02:00
</td>
<td>
<ButtonGroup>
<Button onClick={() => grantAchievement(i.ID)}>Grant</Button>
<Button onClick={() => removeAchievement(i.ID)}>Clear</Button>
</ButtonGroup>
</td>
</tr>
);
2022-01-08 11:45:00 +01:00
})}
</tbody>
</table>
</AccordionDetails>
</Accordion>
);
}