/** * Root React Component for displaying a faction's "Purchase Augmentations" page */ import React, { useState } from "react"; import { PurchaseableAugmentation } from "./PurchaseableAugmentation"; import { Augmentations } from "../../Augmentation/Augmentations"; import { AugmentationNames } from "../../Augmentation/data/AugmentationNames"; import { Faction } from "../Faction"; import { PurchaseAugmentationsOrderSetting } from "../../Settings/SettingEnums"; import { Settings } from "../../Settings/Settings"; import { hasAugmentationPrereqs } from "../FactionHelpers"; import { use } from "../../ui/Context"; import { Reputation } from "../../ui/React/Reputation"; import { Favor } from "../../ui/React/Favor"; import { numeralWrapper } from "../../ui/numeralFormat"; import Box from "@mui/material/Box"; import Button from "@mui/material/Button"; import Typography from "@mui/material/Typography"; import Tooltip from "@mui/material/Tooltip"; import TableBody from "@mui/material/TableBody"; import Table from "@mui/material/Table"; import { CONSTANTS } from "../../Constants"; type IProps = { faction: Faction; routeToMainPage: () => void; }; export function AugmentationsPage(props: IProps): React.ReactElement { const player = use.Player(); // Flag for whether the player has a gang with this faction const isPlayersGang = player.inGang() && player.getGangName() === props.faction.name; const setRerender = useState(false)[1]; function rerender(): void { setRerender((old) => !old); } function getAugs(): string[] { if (isPlayersGang) { let augs = Object.values(Augmentations); // Remove blacklisted augs. const blacklist = [AugmentationNames.NeuroFluxGovernor, AugmentationNames.TheRedPill]; augs = augs.filter((a) => !blacklist.includes(a.name)); // Remove special augs. augs = augs.filter((a) => !a.isSpecial); // Remove faction-unique augs outside BN2. (But keep the one for this faction.) if (player.bitNodeN !== 2) { augs = augs.filter((a) => a.factions.length > 1 || props.faction.augmentations.includes(a.name)); } return augs.map((a) => a.name); } else { return props.faction.augmentations.slice(); } } function getAugsSorted(): string[] { switch (Settings.PurchaseAugmentationsOrder) { case PurchaseAugmentationsOrderSetting.Cost: { return getAugsSortedByCost(); } case PurchaseAugmentationsOrderSetting.Reputation: { return getAugsSortedByReputation(); } case PurchaseAugmentationsOrderSetting.Purchasable: { return getAugsSortedByPurchasable(); } default: return getAugsSortedByDefault(); } } function getAugsSortedByCost(): string[] { const augs = getAugs(); augs.sort((augName1, augName2) => { const aug1 = Augmentations[augName1], aug2 = Augmentations[augName2]; if (aug1 == null || aug2 == null) { throw new Error("Invalid Augmentation Names"); } return aug1.baseCost - aug2.baseCost; }); return augs; } function getAugsSortedByPurchasable(): string[] { const augs = getAugs(); function canBuy(augName: string): boolean { const aug = Augmentations[augName]; const repCost = aug.baseRepRequirement * props.faction.getInfo().augmentationRepRequirementMult; const hasReq = props.faction.playerReputation >= repCost; const hasRep = hasAugmentationPrereqs(aug); const hasCost = aug.baseCost !== 0 && player.money > aug.baseCost * props.faction.getInfo().augmentationPriceMult; return hasCost && hasReq && hasRep; } const buy = augs.filter(canBuy).sort((augName1, augName2) => { const aug1 = Augmentations[augName1], aug2 = Augmentations[augName2]; if (aug1 == null || aug2 == null) { throw new Error("Invalid Augmentation Names"); } return aug1.baseCost - aug2.baseCost; }); const cantBuy = augs .filter((aug) => !canBuy(aug)) .sort((augName1, augName2) => { const aug1 = Augmentations[augName1], aug2 = Augmentations[augName2]; if (aug1 == null || aug2 == null) { throw new Error("Invalid Augmentation Names"); } return aug1.baseRepRequirement - aug2.baseRepRequirement; }); return buy.concat(cantBuy); } function getAugsSortedByReputation(): string[] { const augs = getAugs(); augs.sort((augName1, augName2) => { const aug1 = Augmentations[augName1], aug2 = Augmentations[augName2]; if (aug1 == null || aug2 == null) { throw new Error("Invalid Augmentation Names"); } return aug1.baseRepRequirement - aug2.baseRepRequirement; }); return augs; } function getAugsSortedByDefault(): string[] { return getAugs(); } function switchSortOrder(newOrder: PurchaseAugmentationsOrderSetting): void { Settings.PurchaseAugmentationsOrder = newOrder; rerender(); } const augs = getAugsSorted(); const purchasable = augs.filter( (aug: string) => aug === AugmentationNames.NeuroFluxGovernor || (!player.augmentations.some((a) => a.name === aug) && !player.queuedAugmentations.some((a) => a.name === aug)), ); const purchaseableAugmentation = (aug: string, owned = false): React.ReactNode => { return ( ); }; const augListElems = purchasable.map((aug) => purchaseableAugmentation(aug)); let ownedElem = <>; const owned = augs.filter((aug: string) => !purchasable.includes(aug)); if (owned.length !== 0) { ownedElem = ( <>
Purchased Augmentations This faction also offers these augmentations but you already own them. {owned.map((aug) => purchaseableAugmentation(aug, true))} ); } const mult = Math.pow( CONSTANTS.MultipleAugMultiplier * [1, 0.96, 0.94, 0.93][player.sourceFileLvl(11)], player.queuedAugmentations.length, ); return ( <> Faction Augmentations These are all of the Augmentations that are available to purchase from {props.faction.name}. Augmentations are powerful upgrades that will enhance your abilities.
Reputation: Favor:{" "}
The price of every Augmentation increases for every queued Augmentation and it is reset when you install them. } > Price multiplier: x {numeralWrapper.formatMultiplier(mult)}
{augListElems}
{ownedElem}
); }