diff --git a/src/Augmentation/Augmentation.tsx b/src/Augmentation/Augmentation.tsx index a7174c8ca..acc2f4f48 100644 --- a/src/Augmentation/Augmentation.tsx +++ b/src/Augmentation/Augmentation.tsx @@ -9,6 +9,18 @@ import { Money } from "../ui/React/Money"; import { Generic_fromJSON, Generic_toJSON, Reviver } from "../utils/JSONReviver"; import { FactionNames } from "../Faction/data/FactionNames"; +import { IPlayer } from "../PersonObjects/IPlayer"; +import { AugmentationNames } from "./data/AugmentationNames"; +import { CONSTANTS } from "../Constants"; +import { StaticAugmentations } from "./StaticAugmentations"; +import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers"; +import { getBaseAugmentationPriceMultiplier, getGenericAugmentationPriceMultiplier } from "./AugmentationHelpers"; +import { initSoAAugmentations } from "./data/AugmentationCreator"; + +export interface AugmentationCosts { + moneyCost: number; + repCost: number; +} export interface IConstructorParams { info: string | JSX.Element; @@ -410,10 +422,10 @@ function generateStatsDescription(mults: IMap, programs?: string[], star } export class Augmentation { - // How much money this costs to buy + // How much money this costs to buy before multipliers baseCost = 0; - // How much faction reputation is required to unlock this + // How much faction reputation is required to unlock this before multipliers baseRepRequirement = 0; // Description of what this Aug is and what it does @@ -425,9 +437,6 @@ export class Augmentation { // Any Augmentation not immediately available in BitNode-1 is special (e.g. Bladeburner augs) isSpecial = false; - // Augmentation level - for repeatable Augs like NeuroFlux Governor - level = 0; - // Name of Augmentation name = ""; @@ -438,12 +447,6 @@ export class Augmentation { // The Player/Person classes mults: IMap = {}; - // Initial cost. Doesn't change when you purchase multiple Augmentation - startingCost = 0; - - // Initial rep requirement. Doesn't change when you purchase multiple Augmentation - startingRepRequirement = 0; - // Factions that offer this aug. factions: string[] = []; @@ -461,17 +464,15 @@ export class Augmentation { this.prereqs = params.prereqs ? params.prereqs : []; this.baseRepRequirement = params.repCost; + Object.freeze(this.baseRepRequirement); this.baseCost = params.moneyCost; - this.startingCost = this.baseCost; - this.startingRepRequirement = this.baseRepRequirement; + Object.freeze(this.baseCost); this.factions = params.factions; if (params.isSpecial) { this.isSpecial = true; } - this.level = 0; - // Set multipliers if (params.hacking_mult) { this.mults.hacking_mult = params.hacking_mult; @@ -600,6 +601,61 @@ export class Augmentation { } } + getCost(player: IPlayer): AugmentationCosts { + const augmentationReference = StaticAugmentations[this.name]; + let moneyCost = augmentationReference.baseCost; + let repCost = augmentationReference.baseRepRequirement; + + if (augmentationReference.name === AugmentationNames.NeuroFluxGovernor) { + let nextLevel = this.getLevel(player); + --nextLevel; + const multiplier = Math.pow(CONSTANTS.NeuroFluxGovernorLevelMult, nextLevel); + repCost = augmentationReference.baseRepRequirement * multiplier * BitNodeMultipliers.AugmentationRepCost; + moneyCost = augmentationReference.baseCost * multiplier * BitNodeMultipliers.AugmentationMoneyCost; + + for (let i = 0; i < player.queuedAugmentations.length; ++i) { + moneyCost *= getBaseAugmentationPriceMultiplier(); + } + } else if (augmentationReference.factions.includes(FactionNames.ShadowsOfAnarchy)) { + const soaAugmentationNames = initSoAAugmentations().map((augmentation) => augmentation.name); + const soaMultiplier = Math.pow( + CONSTANTS.SoACostMult, + soaAugmentationNames.filter((augmentationName) => player.hasAugmentation(augmentationName)).length, + ); + moneyCost = augmentationReference.baseCost * soaMultiplier; + if (soaAugmentationNames.find((augmentationName) => augmentationName === augmentationReference.name)) { + repCost = augmentationReference.baseRepRequirement * soaMultiplier; + } + } else { + moneyCost = + augmentationReference.baseCost * + getGenericAugmentationPriceMultiplier() * + BitNodeMultipliers.AugmentationMoneyCost; + } + return { moneyCost, repCost }; + } + + getLevel(player: IPlayer): number { + // Get current Neuroflux level based on Player's augmentations + if (this.name === AugmentationNames.NeuroFluxGovernor) { + let currLevel = 0; + for (let i = 0; i < player.augmentations.length; ++i) { + if (player.augmentations[i].name === AugmentationNames.NeuroFluxGovernor) { + currLevel = player.augmentations[i].level; + } + } + + // Account for purchased but uninstalled Augmentations + for (let i = 0; i < player.queuedAugmentations.length; ++i) { + if (player.queuedAugmentations[i].name == AugmentationNames.NeuroFluxGovernor) { + ++currLevel; + } + } + return currLevel + 1; + } + return 0; + } + // Adds this Augmentation to all Factions addToAllFactions(): void { for (const fac of Object.keys(Factions)) { diff --git a/src/Augmentation/AugmentationHelpers.tsx b/src/Augmentation/AugmentationHelpers.tsx index 9bd25a6e0..dd5b106e5 100644 --- a/src/Augmentation/AugmentationHelpers.tsx +++ b/src/Augmentation/AugmentationHelpers.tsx @@ -1,5 +1,5 @@ import { Augmentation } from "./Augmentation"; -import { Augmentations } from "./Augmentations"; +import { StaticAugmentations } from "./StaticAugmentations"; import { PlayerOwnedAugmentation, IPlayerOwnedAugmentation } from "./PlayerOwnedAugmentation"; import { AugmentationNames } from "./data/AugmentationNames"; @@ -20,30 +20,11 @@ import { initNeuroFluxGovernor, initUnstableCircadianModulator, } from "./data/AugmentationCreator"; -import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers"; import { Router } from "../ui/GameRoot"; -export function AddToAugmentations(aug: Augmentation): void { +export function AddToStaticAugmentations(aug: Augmentation): void { const name = aug.name; - Augmentations[name] = aug; -} - -export function getNextNeuroFluxLevel(): number { - // Get current Neuroflux level based on Player's augmentations - let currLevel = 0; - for (let i = 0; i < Player.augmentations.length; ++i) { - if (Player.augmentations[i].name === AugmentationNames.NeuroFluxGovernor) { - currLevel = Player.augmentations[i].level; - } - } - - // Account for purchased but uninstalled Augmentations - for (let i = 0; i < Player.queuedAugmentations.length; ++i) { - if (Player.queuedAugmentations[i].name == AugmentationNames.NeuroFluxGovernor) { - ++currLevel; - } - } - return currLevel + 1; + StaticAugmentations[name] = aug; } function createAugmentations(): void { @@ -67,96 +48,37 @@ function resetFactionAugmentations(): void { function initAugmentations(): void { resetFactionAugmentations(); - clearObject(Augmentations); + clearObject(StaticAugmentations); createAugmentations(); - updateAugmentationCosts(); Player.reapplyAllAugmentations(); } -function getBaseAugmentationPriceMultiplier(): number { +export function getBaseAugmentationPriceMultiplier(): number { return CONSTANTS.MultipleAugMultiplier * [1, 0.96, 0.94, 0.93][Player.sourceFileLvl(11)]; } export function getGenericAugmentationPriceMultiplier(): number { return Math.pow(getBaseAugmentationPriceMultiplier(), Player.queuedAugmentations.length); } -function updateNeuroFluxGovernorCosts(neuroFluxGovernorAugmentation: Augmentation): void { - let nextLevel = getNextNeuroFluxLevel(); - --nextLevel; - const multiplier = Math.pow(CONSTANTS.NeuroFluxGovernorLevelMult, nextLevel); - neuroFluxGovernorAugmentation.baseRepRequirement = - neuroFluxGovernorAugmentation.startingRepRequirement * multiplier * BitNodeMultipliers.AugmentationRepCost; - neuroFluxGovernorAugmentation.baseCost = - neuroFluxGovernorAugmentation.startingCost * multiplier * BitNodeMultipliers.AugmentationMoneyCost; - - for (let i = 0; i < Player.queuedAugmentations.length; ++i) { - neuroFluxGovernorAugmentation.baseCost *= getBaseAugmentationPriceMultiplier(); - } -} - -function updateSoACosts(soaAugmentation: Augmentation): void { - const soaAugmentationNames = initSoAAugmentations().map((augmentation) => augmentation.name); - const soaAugCount = soaAugmentationNames.filter((augmentationName) => - Player.hasAugmentation(augmentationName), - ).length; - soaAugmentation.baseCost = soaAugmentation.startingCost * Math.pow(CONSTANTS.SoACostMult, soaAugCount); - if (soaAugmentationNames.find((augmentationName) => augmentationName === soaAugmentation.name)) { - soaAugmentation.baseRepRequirement = - soaAugmentation.startingRepRequirement * Math.pow(CONSTANTS.SoARepMult, soaAugCount); - } -} - -export function updateAugmentationCosts(): void { - for (const name of Object.keys(Augmentations)) { - if (Augmentations.hasOwnProperty(name)) { - const augmentationToUpdate = Augmentations[name]; - if (augmentationToUpdate.name === AugmentationNames.NeuroFluxGovernor) { - updateNeuroFluxGovernorCosts(augmentationToUpdate); - } else if (augmentationToUpdate.factions.includes(FactionNames.ShadowsOfAnarchy)) { - updateSoACosts(augmentationToUpdate); - } else { - augmentationToUpdate.baseCost = - augmentationToUpdate.startingCost * - getGenericAugmentationPriceMultiplier() * - BitNodeMultipliers.AugmentationMoneyCost; - } - } - } -} - //Resets an Augmentation during (re-initizliation) function resetAugmentation(aug: Augmentation): void { aug.addToFactions(aug.factions); const name = aug.name; if (augmentationExists(name)) { - delete Augmentations[name]; + delete StaticAugmentations[name]; } - AddToAugmentations(aug); + AddToStaticAugmentations(aug); } function applyAugmentation(aug: IPlayerOwnedAugmentation, reapply = false): void { - const augObj = Augmentations[aug.name]; + const staticAugmentation = StaticAugmentations[aug.name]; // Apply multipliers - for (const mult of Object.keys(augObj.mults)) { - const v = Player.getMult(mult) * augObj.mults[mult]; + for (const mult of Object.keys(staticAugmentation.mults)) { + const v = Player.getMult(mult) * staticAugmentation.mults[mult]; Player.setMult(mult, v); } - // Special logic for NeuroFlux Governor - if (aug.name === AugmentationNames.NeuroFluxGovernor) { - if (!reapply) { - Augmentations[aug.name].level = aug.level; - for (let i = 0; i < Player.augmentations.length; ++i) { - if (Player.augmentations[i].name == AugmentationNames.NeuroFluxGovernor) { - Player.augmentations[i].level = aug.level; - return; - // break; - } - } - } - } - // Special logic for Congruity Implant if (aug.name === AugmentationNames.CongruityImplant && !reapply) { Player.entropy = 0; @@ -185,7 +107,7 @@ function installAugmentations(force?: boolean): boolean { } for (let i = 0; i < Player.queuedAugmentations.length; ++i) { const ownedAug = Player.queuedAugmentations[i]; - const aug = Augmentations[ownedAug.name]; + const aug = StaticAugmentations[ownedAug.name]; if (aug == null) { console.error(`Invalid augmentation: ${ownedAug.name}`); continue; @@ -215,7 +137,7 @@ function installAugmentations(force?: boolean): boolean { } function augmentationExists(name: string): boolean { - return Augmentations.hasOwnProperty(name); + return StaticAugmentations.hasOwnProperty(name); } export function isRepeatableAug(aug: Augmentation): boolean { diff --git a/src/Augmentation/Augmentations.ts b/src/Augmentation/StaticAugmentations.ts similarity index 57% rename from src/Augmentation/Augmentations.ts rename to src/Augmentation/StaticAugmentations.ts index ed2eab639..768e52770 100644 --- a/src/Augmentation/Augmentations.ts +++ b/src/Augmentation/StaticAugmentations.ts @@ -1,4 +1,4 @@ import { Augmentation } from "./Augmentation"; import { IMap } from "../types"; -export const Augmentations: IMap = {}; +export const StaticAugmentations: IMap = {}; diff --git a/src/Augmentation/ui/AugmentationsRoot.tsx b/src/Augmentation/ui/AugmentationsRoot.tsx index 0ba8cc629..6a2454c22 100644 --- a/src/Augmentation/ui/AugmentationsRoot.tsx +++ b/src/Augmentation/ui/AugmentationsRoot.tsx @@ -22,7 +22,7 @@ import { Settings } from "../../Settings/Settings"; import { ConfirmationModal } from "../../ui/React/ConfirmationModal"; import { IPlayer } from "../../PersonObjects/IPlayer"; import { AugmentationNames } from "../data/AugmentationNames"; -import { Augmentations } from "../Augmentations"; +import { StaticAugmentations } from "../StaticAugmentations"; import { CONSTANTS } from "../../Constants"; import { formatNumber } from "../../utils/StringHelperFunctions"; import { Info } from "@mui/icons-material"; @@ -39,7 +39,9 @@ const NeuroFluxDisplay = ({ player }: NFGDisplayProps): React.ReactElement => { NeuroFlux Governor - Level {level} - {Augmentations[AugmentationNames.NeuroFluxGovernor].stats} + + {StaticAugmentations[AugmentationNames.NeuroFluxGovernor].stats} + ) : ( <> diff --git a/src/Augmentation/ui/InstalledAugmentations.tsx b/src/Augmentation/ui/InstalledAugmentations.tsx index d200ebfa6..1ec34391f 100644 --- a/src/Augmentation/ui/InstalledAugmentations.tsx +++ b/src/Augmentation/ui/InstalledAugmentations.tsx @@ -13,7 +13,7 @@ import React, { useState } from "react"; import { OwnedAugmentationsOrderSetting } from "../../Settings/SettingEnums"; import { Settings } from "../../Settings/Settings"; import { use } from "../../ui/Context"; -import { Augmentations } from "../Augmentations"; +import { StaticAugmentations } from "../StaticAugmentations"; import { AugmentationNames } from "../data/AugmentationNames"; export function InstalledAugmentations(): React.ReactElement { @@ -77,7 +77,7 @@ export function InstalledAugmentations(): React.ReactElement { {(() => { - const aug = Augmentations[selectedAug.name]; + const aug = StaticAugmentations[selectedAug.name]; const info = typeof aug.info === "string" ? {aug.info} : aug.info; const tooltip = ( diff --git a/src/Augmentation/ui/PlayerMultipliers.tsx b/src/Augmentation/ui/PlayerMultipliers.tsx index c8cadc341..24a2286c1 100644 --- a/src/Augmentation/ui/PlayerMultipliers.tsx +++ b/src/Augmentation/ui/PlayerMultipliers.tsx @@ -8,7 +8,7 @@ import { BitNodeMultipliers } from "../../BitNode/BitNodeMultipliers"; import { Player } from "../../Player"; import { Settings } from "../../Settings/Settings"; import { numeralWrapper } from "../../ui/numeralFormat"; -import { Augmentations } from "../Augmentations"; +import { StaticAugmentations } from "../StaticAugmentations"; interface IAugmentedStats { [index: string]: number; @@ -17,7 +17,7 @@ interface IAugmentedStats { function calculateAugmentedStats(): IAugmentedStats { const augP: IAugmentedStats = {}; for (const aug of Player.queuedAugmentations) { - const augObj = Augmentations[aug.name]; + const augObj = StaticAugmentations[aug.name]; for (const mult of Object.keys(augObj.mults)) { const v = augP[mult] ? augP[mult] : 1; augP[mult] = v * augObj.mults[mult]; diff --git a/src/Augmentation/ui/PurchasableAugmentations.tsx b/src/Augmentation/ui/PurchasableAugmentations.tsx index 488327f4b..cb90ad644 100644 --- a/src/Augmentation/ui/PurchasableAugmentations.tsx +++ b/src/Augmentation/ui/PurchasableAugmentations.tsx @@ -5,15 +5,14 @@ import { CheckBox, CheckBoxOutlineBlank, CheckCircle, Info, NewReleases, Report } from "@mui/icons-material"; import { Box, Button, Container, Paper, Tooltip, Typography } from "@mui/material"; import React, { useState } from "react"; -import { getNextNeuroFluxLevel } from "../AugmentationHelpers"; import { Faction } from "../../Faction/Faction"; import { IPlayer } from "../../PersonObjects/IPlayer"; import { Settings } from "../../Settings/Settings"; import { numeralWrapper } from "../../ui/numeralFormat"; import { Augmentation } from "../Augmentation"; -import { Augmentations } from "../Augmentations"; import { AugmentationNames } from "../data/AugmentationNames"; import { PurchaseAugmentationModal } from "./PurchaseAugmentationModal"; +import { StaticAugmentations } from "../StaticAugmentations"; interface IPreReqsProps { player: IPlayer; @@ -160,10 +159,10 @@ interface IPurchasableAugProps { export function PurchasableAugmentation(props: IPurchasableAugProps): React.ReactElement { const [open, setOpen] = useState(false); - const aug = Augmentations[props.augName]; - - const cost = props.parent.sleeveAugs ? aug.startingCost : aug.baseCost; - + const aug = StaticAugmentations[props.augName]; + const augCosts = aug.getCost(props.parent.player); + const cost = props.parent.sleeveAugs ? aug.baseCost : augCosts.moneyCost; + const repCost = augCosts.repCost; const info = typeof aug.info === "string" ? {aug.info} : aug.info; const description = ( <> @@ -205,7 +204,8 @@ export function PurchasableAugmentation(props: IPurchasableAugProps): React.Reac <> {props.augName} - {props.augName === AugmentationNames.NeuroFluxGovernor && ` - Level ${getNextNeuroFluxLevel()}`} + {props.augName === AugmentationNames.NeuroFluxGovernor && + ` - Level ${aug.getLevel(props.parent.player)}`} {description} @@ -222,7 +222,7 @@ export function PurchasableAugmentation(props: IPurchasableAugProps): React.Reac }} > {aug.name} - {aug.name === AugmentationNames.NeuroFluxGovernor && ` - Level ${getNextNeuroFluxLevel()}`} + {aug.name === AugmentationNames.NeuroFluxGovernor && ` - Level ${aug.getLevel(props.parent.player)}`} {aug.factions.length === 1 && !props.parent.sleeveAugs && ( @@ -236,14 +236,14 @@ export function PurchasableAugmentation(props: IPurchasableAugProps): React.Reac {props.owned || ( cost} + fulfilled={cost === 0 || props.parent.player.money > cost} value={numeralWrapper.formatMoney(cost)} color={Settings.theme.money} /> {props.parent.rep !== undefined && ( = aug.baseRepRequirement} - value={`${numeralWrapper.formatReputation(aug.baseRepRequirement)} rep`} + fulfilled={props.parent.rep >= repCost} + value={`${numeralWrapper.formatReputation(repCost)} rep`} color={Settings.theme.rep} /> )} diff --git a/src/Augmentation/ui/PurchaseAugmentationModal.tsx b/src/Augmentation/ui/PurchaseAugmentationModal.tsx index 0a6c2e938..05bd9d4ec 100644 --- a/src/Augmentation/ui/PurchaseAugmentationModal.tsx +++ b/src/Augmentation/ui/PurchaseAugmentationModal.tsx @@ -44,7 +44,7 @@ export function PurchaseAugmentationModal(props: IProps): React.ReactElement {

Would you like to purchase the {props.aug.name} Augmentation for  - ? + ?

diff --git a/src/Augmentation/ui/PurchasedAugmentations.tsx b/src/Augmentation/ui/PurchasedAugmentations.tsx index f3982f035..d86c9d4f6 100644 --- a/src/Augmentation/ui/PurchasedAugmentations.tsx +++ b/src/Augmentation/ui/PurchasedAugmentations.tsx @@ -5,7 +5,7 @@ import { List, ListItemText, Paper, Tooltip, Typography } from "@mui/material"; import * as React from "react"; import { Player } from "../../Player"; -import { Augmentations } from "../Augmentations"; +import { StaticAugmentations } from "../StaticAugmentations"; import { AugmentationNames } from "../data/AugmentationNames"; export function PurchasedAugmentations(): React.ReactElement { @@ -23,7 +23,7 @@ export function PurchasedAugmentations(): React.ReactElement { let displayName = ownedAug.name; if (ownedAug.name === AugmentationNames.NeuroFluxGovernor && i !== nfgIndex) continue; - const aug = Augmentations[ownedAug.name]; + const aug = StaticAugmentations[ownedAug.name]; let level = null; if (ownedAug.name === AugmentationNames.NeuroFluxGovernor) { diff --git a/src/Faction/FactionHelpers.tsx b/src/Faction/FactionHelpers.tsx index 6faa12434..d91c5cad7 100644 --- a/src/Faction/FactionHelpers.tsx +++ b/src/Faction/FactionHelpers.tsx @@ -1,4 +1,4 @@ -import { Augmentations } from "../Augmentation/Augmentations"; +import { StaticAugmentations } from "../Augmentation/StaticAugmentations"; import { Augmentation } from "../Augmentation/Augmentation"; import { PlayerOwnedAugmentation } from "../Augmentation/PlayerOwnedAugmentation"; import { AugmentationNames } from "../Augmentation/data/AugmentationNames"; @@ -18,7 +18,6 @@ import { import { dialogBoxCreate } from "../ui/React/DialogBox"; import { InvitationEvent } from "./ui/InvitationModal"; import { FactionNames } from "./data/FactionNames"; -import { updateAugmentationCosts, getNextNeuroFluxLevel } from "../Augmentation/AugmentationHelpers"; import { SFC32RNG } from "../Casino/RNG"; export function inviteToFaction(faction: Faction): void { @@ -59,6 +58,7 @@ export function hasAugmentationPrereqs(aug: Augmentation): boolean { export function purchaseAugmentation(aug: Augmentation, fac: Faction, sing = false): string { const hasPrereqs = hasAugmentationPrereqs(aug); + const augCosts = aug.getCost(Player); if (!hasPrereqs) { const txt = `You must first purchase or install ${aug.prereqs .filter((req) => !Player.hasAugmentation(req)) @@ -68,28 +68,26 @@ export function purchaseAugmentation(aug: Augmentation, fac: Faction, sing = fal } else { dialogBoxCreate(txt); } - } else if (aug.baseCost !== 0 && Player.money < aug.baseCost) { + } else if (augCosts.moneyCost !== 0 && Player.money < augCosts.moneyCost) { const txt = "You don't have enough money to purchase " + aug.name; if (sing) { return txt; } dialogBoxCreate(txt); - } else if (fac.playerReputation < aug.baseRepRequirement) { + } else if (fac.playerReputation < augCosts.repCost) { const txt = "You don't have enough faction reputation to purchase " + aug.name; if (sing) { return txt; } dialogBoxCreate(txt); - } else if (aug.baseCost === 0 || Player.money >= aug.baseCost) { + } else if (augCosts.moneyCost === 0 || Player.money >= augCosts.moneyCost) { const queuedAugmentation = new PlayerOwnedAugmentation(aug.name); if (aug.name == AugmentationNames.NeuroFluxGovernor) { - queuedAugmentation.level = getNextNeuroFluxLevel(); + queuedAugmentation.level = aug.getLevel(Player); } Player.queuedAugmentations.push(queuedAugmentation); - Player.loseMoney(aug.baseCost, "augmentations"); - - updateAugmentationCosts(); + Player.loseMoney(augCosts.moneyCost, "augmentations"); if (sing) { return "You purchased " + aug.name; @@ -141,14 +139,14 @@ export function processPassiveFactionRepGain(numCycles: number): void { export const getFactionAugmentationsFiltered = (player: IPlayer, faction: Faction): string[] => { // If player has a gang with this faction, return (almost) all augmentations if (player.hasGangWith(faction.name)) { - let augs = Object.values(Augmentations); + let augs = Object.values(StaticAugmentations); // Remove special augs augs = augs.filter((a) => !a.isSpecial && a.name !== AugmentationNames.CongruityImplant); if (player.bitNodeN === 2) { // TRP is not available outside of BN2 for Gangs - augs.push(Augmentations[AugmentationNames.TheRedPill]); + augs.push(StaticAugmentations[AugmentationNames.TheRedPill]); } const rng = SFC32RNG(`BN${player.bitNodeN}.${player.sourceFileLvl(player.bitNodeN)}`); diff --git a/src/Faction/ui/AugmentationsPage.tsx b/src/Faction/ui/AugmentationsPage.tsx index c169520fd..cfa9a7ed7 100644 --- a/src/Faction/ui/AugmentationsPage.tsx +++ b/src/Faction/ui/AugmentationsPage.tsx @@ -3,8 +3,9 @@ */ import { Box, Button, Tooltip, Typography, Paper, Container } from "@mui/material"; import React, { useState } from "react"; + +import { StaticAugmentations } from "../../Augmentation/StaticAugmentations"; import { getGenericAugmentationPriceMultiplier } from "../../Augmentation/AugmentationHelpers"; -import { Augmentations } from "../../Augmentation/Augmentations"; import { AugmentationNames } from "../../Augmentation/data/AugmentationNames"; import { PurchasableAugmentations } from "../../Augmentation/ui/PurchasableAugmentations"; import { PurchaseAugmentationsOrderSetting } from "../../Settings/SettingEnums"; @@ -54,13 +55,13 @@ export function AugmentationsPage(props: IProps): React.ReactElement { function getAugsSortedByCost(): string[] { const augs = getAugs(); augs.sort((augName1, augName2) => { - const aug1 = Augmentations[augName1], - aug2 = Augmentations[augName2]; + const aug1 = StaticAugmentations[augName1], + aug2 = StaticAugmentations[augName2]; if (aug1 == null || aug2 == null) { throw new Error("Invalid Augmentation Names"); } - return aug1.baseCost - aug2.baseCost; + return aug1.getCost(player).moneyCost - aug2.getCost(player).moneyCost; }); return augs; @@ -69,31 +70,32 @@ export function AugmentationsPage(props: IProps): React.ReactElement { function getAugsSortedByPurchasable(): string[] { const augs = getAugs(); function canBuy(augName: string): boolean { - const aug = Augmentations[augName]; - const repCost = aug.baseRepRequirement; + const aug = StaticAugmentations[augName]; + const augCosts = aug.getCost(player); + const repCost = augCosts.repCost; const hasReq = props.faction.playerReputation >= repCost; const hasRep = hasAugmentationPrereqs(aug); - const hasCost = aug.baseCost !== 0 && player.money > aug.baseCost; + const hasCost = augCosts.moneyCost !== 0 && player.money > augCosts.moneyCost; return hasCost && hasReq && hasRep; } const buy = augs.filter(canBuy).sort((augName1, augName2) => { - const aug1 = Augmentations[augName1], - aug2 = Augmentations[augName2]; + const aug1 = StaticAugmentations[augName1], + aug2 = StaticAugmentations[augName2]; if (aug1 == null || aug2 == null) { throw new Error("Invalid Augmentation Names"); } - return aug1.baseCost - aug2.baseCost; + return aug1.getCost(player).moneyCost - aug2.getCost(player).moneyCost; }); const cantBuy = augs .filter((aug) => !canBuy(aug)) .sort((augName1, augName2) => { - const aug1 = Augmentations[augName1], - aug2 = Augmentations[augName2]; + const aug1 = StaticAugmentations[augName1], + aug2 = StaticAugmentations[augName2]; if (aug1 == null || aug2 == null) { throw new Error("Invalid Augmentation Names"); } - return aug1.baseRepRequirement - aug2.baseRepRequirement; + return aug1.getCost(player).repCost - aug2.getCost(player).repCost; }); return buy.concat(cantBuy); @@ -102,12 +104,12 @@ export function AugmentationsPage(props: IProps): React.ReactElement { function getAugsSortedByReputation(): string[] { const augs = getAugs(); augs.sort((augName1, augName2) => { - const aug1 = Augmentations[augName1], - aug2 = Augmentations[augName2]; + const aug1 = StaticAugmentations[augName1], + aug2 = StaticAugmentations[augName2]; if (aug1 == null || aug2 == null) { throw new Error("Invalid Augmentation Names"); } - return aug1.baseRepRequirement - aug2.baseRepRequirement; + return aug1.getCost(player).repCost - aug2.getCost(player).repCost; }); return augs; @@ -195,10 +197,11 @@ export function AugmentationsPage(props: IProps): React.ReactElement { ownedAugNames={owned} player={player} canPurchase={(player, aug) => { + const augCost = aug.getCost(player).moneyCost; return ( hasAugmentationPrereqs(aug) && props.faction.playerReputation >= aug.baseRepRequirement && - (aug.baseCost === 0 || player.money > aug.baseCost) + (augCost === 0 || player.money > augCost) ); }} purchaseAugmentation={(player, aug, showModal) => { diff --git a/src/Faction/ui/FactionRoot.tsx b/src/Faction/ui/FactionRoot.tsx index 4410e5bdb..bcb37a563 100644 --- a/src/Faction/ui/FactionRoot.tsx +++ b/src/Faction/ui/FactionRoot.tsx @@ -16,12 +16,10 @@ import { BitNodeMultipliers } from "../../BitNode/BitNodeMultipliers"; import { Faction } from "../Faction"; import { use } from "../../ui/Context"; -import { CreateGangModal } from "./CreateGangModal"; -import { Box, Paper, Typography, Button, Tooltip } from "@mui/material"; +import { Typography, Button } from "@mui/material"; import { CovenantPurchasesRoot } from "../../PersonObjects/Sleeve/ui/CovenantPurchasesRoot"; import { FactionNames } from "../data/FactionNames"; -import { GangConstants } from "../../Gang/data/Constants"; import { GangButton } from "./GangButton"; type IProps = { @@ -30,7 +28,6 @@ type IProps = { }; // Info text for all options on the UI -const gangInfo = "Create and manage a gang for this Faction. Gangs will earn you money and faction reputation"; const hackingContractsInfo = "Complete hacking contracts for your faction. " + "Your effectiveness, which determines how much " + diff --git a/src/Faction/ui/PurchaseableAugmentation.tsx b/src/Faction/ui/PurchaseableAugmentation.tsx new file mode 100644 index 000000000..749679d79 --- /dev/null +++ b/src/Faction/ui/PurchaseableAugmentation.tsx @@ -0,0 +1,166 @@ +/** + * React component for displaying a single augmentation for purchase through + * the faction UI + */ +import React, { useState } from "react"; + +import { hasAugmentationPrereqs, purchaseAugmentation } from "../FactionHelpers"; + +import { StaticAugmentations } from "../../Augmentation/StaticAugmentations"; +import { AugmentationNames } from "../../Augmentation/data/AugmentationNames"; +import { Faction } from "../Faction"; +import { IPlayer } from "../../PersonObjects/IPlayer"; +import { Settings } from "../../Settings/Settings"; +import { Money } from "../../ui/React/Money"; +import { Reputation } from "../../ui/React/Reputation"; + +import { Augmentation as AugFormat } from "../../ui/React/Augmentation"; +import Button from "@mui/material/Button"; +import Typography from "@mui/material/Typography"; +import Tooltip from "@mui/material/Tooltip"; +import Box from "@mui/material/Box"; +import { TableCell } from "../../ui/React/Table"; +import TableRow from "@mui/material/TableRow"; +import { use } from "../../ui/Context"; +import { PurchaseAugmentationModal } from "../../Augmentation/ui/PurchaseAugmentationModal"; + +interface IReqProps { + augName: string; + p: IPlayer; + hasReq: boolean; + rep: number; + hasRep: boolean; + cost: number; + hasCost: boolean; +} + +function Requirements(props: IReqProps): React.ReactElement { + const aug = StaticAugmentations[props.augName]; + if (!props.hasReq) { + return ( + + + Requires{" "} + {aug.prereqs.map((aug, i) => ( + + ))} + + + ); + } + + return ( + + + + + + + + + Requires faction reputation + + + + ); +} + +interface IProps { + augName: string; + faction: Faction; + p: IPlayer; + rerender: () => void; + owned?: boolean; +} + +export function PurchaseableAugmentation(props: IProps): React.ReactElement { + const player = use.Player(); + const [open, setOpen] = useState(false); + const aug = StaticAugmentations[props.augName]; + if (aug == null) throw new Error(`aug ${props.augName} does not exists`); + + if (aug == null) { + console.error( + `Invalid Augmentation when trying to create PurchaseableAugmentation display element: ${props.augName}`, + ); + return <>; + } + + const repCosts = aug.getCost(player); + const moneyCost = repCosts.moneyCost; + const repCost = repCosts.repCost; + const hasReq = hasAugmentationPrereqs(aug); + const hasRep = props.faction.playerReputation >= repCost; + const hasCost = moneyCost === 0 || props.p.money > moneyCost; + + // Determine UI properties + const color: "error" | "primary" = !hasReq || !hasRep || !hasCost ? "error" : "primary"; + + // Determine button txt + let btnTxt = aug.name; + if (aug.name === AugmentationNames.NeuroFluxGovernor) { + btnTxt += ` - Level ${aug.getLevel(player)}`; + } + + let tooltip = <>; + if (typeof aug.info === "string") { + tooltip = ( + <> + {aug.info} +
+
+ {aug.stats} + + ); + } else + tooltip = ( + <> + {aug.info} +
+
+ {aug.stats} + + ); + + function handleClick(): void { + if (color === "error") return; + if (!Settings.SuppressBuyAugmentationConfirmation) { + setOpen(true); + } else { + purchaseAugmentation(aug, props.faction); + props.rerender(); + } + } + + return ( + + {!props.owned && ( + + + setOpen(false)} aug={aug} faction={props.faction} /> + + )} + + + {tooltip}} placement="top"> + {btnTxt} + + + + {!props.owned && ( + + )} + + ); +} diff --git a/src/NetscriptFunctions/Grafting.ts b/src/NetscriptFunctions/Grafting.ts index 9951fbeff..0837eee5f 100644 --- a/src/NetscriptFunctions/Grafting.ts +++ b/src/NetscriptFunctions/Grafting.ts @@ -1,4 +1,4 @@ -import { Augmentations } from "../Augmentation/Augmentations"; +import { StaticAugmentations } from "../Augmentation/StaticAugmentations"; import { hasAugmentationPrereqs } from "../Faction/FactionHelpers"; import { CityName } from "../Locations/data/CityNames"; import { getRamCost } from "../Netscript/RamCostGenerator"; @@ -28,10 +28,10 @@ export function NetscriptGrafting(player: IPlayer, workerScript: WorkerScript, h updateRam("getAugmentationGraftPrice"); const augName = helper.string("getAugmentationGraftPrice", "augName", _augName); checkGraftingAPIAccess("getAugmentationGraftPrice"); - if (!getGraftingAvailableAugs(player).includes(augName) || !Augmentations.hasOwnProperty(augName)) { + if (!getGraftingAvailableAugs(player).includes(augName) || !StaticAugmentations.hasOwnProperty(augName)) { throw helper.makeRuntimeErrorMsg("grafting.getAugmentationGraftPrice", `Invalid aug: ${augName}`); } - const graftableAug = new GraftableAugmentation(Augmentations[augName]); + const graftableAug = new GraftableAugmentation(StaticAugmentations[augName]); return graftableAug.cost; }, @@ -39,10 +39,10 @@ export function NetscriptGrafting(player: IPlayer, workerScript: WorkerScript, h updateRam("getAugmentationGraftTime"); const augName = helper.string("getAugmentationGraftTime", "augName", _augName); checkGraftingAPIAccess("getAugmentationGraftTime"); - if (!getGraftingAvailableAugs(player).includes(augName) || !Augmentations.hasOwnProperty(augName)) { + if (!getGraftingAvailableAugs(player).includes(augName) || !StaticAugmentations.hasOwnProperty(augName)) { throw helper.makeRuntimeErrorMsg("grafting.getAugmentationGraftTime", `Invalid aug: ${augName}`); } - const graftableAug = new GraftableAugmentation(Augmentations[augName]); + const graftableAug = new GraftableAugmentation(StaticAugmentations[augName]); return calculateGraftingTimeWithBonus(player, graftableAug); }, @@ -64,7 +64,7 @@ export function NetscriptGrafting(player: IPlayer, workerScript: WorkerScript, h "You must be in New Tokyo to begin grafting an Augmentation.", ); } - if (!getGraftingAvailableAugs(player).includes(augName) || !Augmentations.hasOwnProperty(augName)) { + if (!getGraftingAvailableAugs(player).includes(augName) || !StaticAugmentations.hasOwnProperty(augName)) { workerScript.log("grafting.graftAugmentation", () => `Invalid aug: ${augName}`); return false; } @@ -75,7 +75,7 @@ export function NetscriptGrafting(player: IPlayer, workerScript: WorkerScript, h workerScript.log("graftAugmentation", () => txt); } - const craftableAug = new GraftableAugmentation(Augmentations[augName]); + const craftableAug = new GraftableAugmentation(StaticAugmentations[augName]); if (player.money < craftableAug.cost) { workerScript.log("grafting.graftAugmentation", () => `You don't have enough money to craft ${augName}`); return false; diff --git a/src/NetscriptFunctions/Singularity.ts b/src/NetscriptFunctions/Singularity.ts index c4d4241ec..05ec1c8e2 100644 --- a/src/NetscriptFunctions/Singularity.ts +++ b/src/NetscriptFunctions/Singularity.ts @@ -3,7 +3,7 @@ import { IPlayer } from "../PersonObjects/IPlayer"; import { purchaseAugmentation, joinFaction, getFactionAugmentationsFiltered } from "../Faction/FactionHelpers"; import { startWorkerScript } from "../NetscriptWorker"; import { Augmentation } from "../Augmentation/Augmentation"; -import { Augmentations } from "../Augmentation/Augmentations"; +import { StaticAugmentations } from "../Augmentation/StaticAugmentations"; import { augmentationExists, installAugmentations } from "../Augmentation/AugmentationHelpers"; import { AugmentationNames } from "../Augmentation/data/AugmentationNames"; import { killWorkerScript } from "../Netscript/killWorkerScript"; @@ -56,7 +56,7 @@ export function NetscriptSingularity(player: IPlayer, workerScript: WorkerScript throw _ctx.helper.makeRuntimeErrorMsg(`Invalid augmentation: '${name}'`); } - return Augmentations[name]; + return StaticAugmentations[name]; }; const getFaction = function (_ctx: NetscriptContext, name: string): Faction { @@ -122,7 +122,7 @@ export function NetscriptSingularity(player: IPlayer, workerScript: WorkerScript _ctx.helper.checkSingularityAccess(); const augName = _ctx.helper.string("augName", _augName); const aug = getAugmentation(_ctx, augName); - return [aug.baseRepRequirement, aug.baseCost]; + return [aug.getCost(player).moneyCost, aug.getCost(player).repCost]; }, getAugmentationPrereq: (_ctx: NetscriptContext) => function (_augName: unknown): string[] { @@ -136,14 +136,14 @@ export function NetscriptSingularity(player: IPlayer, workerScript: WorkerScript _ctx.helper.checkSingularityAccess(); const augName = _ctx.helper.string("augName", _augName); const aug = getAugmentation(_ctx, augName); - return aug.baseCost; + return aug.getCost(player).moneyCost; }, getAugmentationRepReq: (_ctx: NetscriptContext) => function (_augName: unknown): number { _ctx.helper.checkSingularityAccess(); const augName = _ctx.helper.string("augName", _augName); const aug = getAugmentation(_ctx, augName); - return aug.baseRepRequirement; + return aug.getCost(player).repCost; }, getAugmentationStats: (_ctx: NetscriptContext) => function (_augName: unknown): AugmentationStats { @@ -183,7 +183,7 @@ export function NetscriptSingularity(player: IPlayer, workerScript: WorkerScript } } - if (fac.playerReputation < aug.baseRepRequirement) { + if (fac.playerReputation < aug.getCost(player).repCost) { _ctx.log(() => `You do not have enough reputation with '${fac.name}'.`); return false; } @@ -1085,7 +1085,6 @@ export function NetscriptSingularity(player: IPlayer, workerScript: WorkerScript _ctx.log(() => `Invalid work type: '${type}`); return false; } - return true; }, getFactionRep: (_ctx: NetscriptContext) => function (_facName: unknown): number { diff --git a/src/NetscriptFunctions/Sleeve.ts b/src/NetscriptFunctions/Sleeve.ts index ed58bbfdc..771c588dc 100644 --- a/src/NetscriptFunctions/Sleeve.ts +++ b/src/NetscriptFunctions/Sleeve.ts @@ -5,7 +5,7 @@ import { FactionWorkType } from "../Faction/FactionWorkTypeEnum"; import { SleeveTaskType } from "../PersonObjects/Sleeve/SleeveTaskTypesEnum"; import { WorkerScript } from "../Netscript/WorkerScript"; import { findSleevePurchasableAugs } from "../PersonObjects/Sleeve/SleeveHelpers"; -import { Augmentations } from "../Augmentation/Augmentations"; +import { StaticAugmentations } from "../Augmentation/StaticAugmentations"; import { CityName } from "../Locations/data/CityNames"; import { findCrime } from "../Crime/CrimeHelpers"; @@ -286,7 +286,7 @@ export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, hel const aug = purchasableAugs[i]; augs.push({ name: aug.name, - cost: aug.startingCost, + cost: aug.baseCost, }); } @@ -303,7 +303,7 @@ export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, hel throw helper.makeRuntimeErrorMsg("sleeve.purchaseSleeveAug", `Sleeve shock too high: Sleeve ${sleeveNumber}`); } - const aug = Augmentations[augName]; + const aug = StaticAugmentations[augName]; if (!aug) { throw helper.makeRuntimeErrorMsg("sleeve.purchaseSleeveAug", `Invalid aug: ${augName}`); } diff --git a/src/PersonObjects/Grafting/GraftableAugmentation.ts b/src/PersonObjects/Grafting/GraftableAugmentation.ts index dbace889d..6875bbfc4 100644 --- a/src/PersonObjects/Grafting/GraftableAugmentation.ts +++ b/src/PersonObjects/Grafting/GraftableAugmentation.ts @@ -18,7 +18,7 @@ export class GraftableAugmentation { } get cost(): number { - return this.augmentation.startingCost * CONSTANTS.AugmentationGraftingCostMult; + return this.augmentation.baseCost * CONSTANTS.AugmentationGraftingCostMult; } get time(): number { diff --git a/src/PersonObjects/Grafting/GraftingHelpers.ts b/src/PersonObjects/Grafting/GraftingHelpers.ts index 62d3b72f4..5b9276e0e 100644 --- a/src/PersonObjects/Grafting/GraftingHelpers.ts +++ b/src/PersonObjects/Grafting/GraftingHelpers.ts @@ -1,11 +1,11 @@ -import { Augmentations } from "../../Augmentation/Augmentations"; +import { StaticAugmentations } from "../../Augmentation/StaticAugmentations"; import { GraftableAugmentation } from "./GraftableAugmentation"; import { IPlayer } from "../IPlayer"; export const getGraftingAvailableAugs = (player: IPlayer): string[] => { const augs: string[] = []; - for (const [augName, aug] of Object.entries(Augmentations)) { + for (const [augName, aug] of Object.entries(StaticAugmentations)) { if (aug.isSpecial) continue; augs.push(augName); } diff --git a/src/PersonObjects/Grafting/ui/GraftingRoot.tsx b/src/PersonObjects/Grafting/ui/GraftingRoot.tsx index 3e7ddfd28..3b9ff5738 100644 --- a/src/PersonObjects/Grafting/ui/GraftingRoot.tsx +++ b/src/PersonObjects/Grafting/ui/GraftingRoot.tsx @@ -2,7 +2,7 @@ import { Construction, CheckBox, CheckBoxOutlineBlank } from "@mui/icons-materia import { Box, Button, Container, List, ListItemButton, Paper, Typography } from "@mui/material"; import React, { useState, useEffect } from "react"; import { Augmentation } from "../../../Augmentation/Augmentation"; -import { Augmentations } from "../../../Augmentation/Augmentations"; +import { StaticAugmentations } from "../../../Augmentation/StaticAugmentations"; import { AugmentationNames } from "../../../Augmentation/data/AugmentationNames"; import { CONSTANTS } from "../../../Constants"; import { hasAugmentationPrereqs } from "../../../Faction/FactionHelpers"; @@ -54,7 +54,7 @@ export const GraftingRoot = (): React.ReactElement => { const player = use.Player(); const router = use.Router(); - for (const aug of Object.values(Augmentations)) { + for (const aug of Object.values(StaticAugmentations)) { const name = aug.name; const graftableAug = new GraftableAugmentation(aug); GraftableAugmentations[name] = graftableAug; @@ -62,6 +62,7 @@ export const GraftingRoot = (): React.ReactElement => { const [selectedAug, setSelectedAug] = useState(getGraftingAvailableAugs(player)[0]); const [graftOpen, setGraftOpen] = useState(false); + const selectedAugmentation = StaticAugmentations[selectedAug]; const setRerender = useState(false)[1]; function rerender(): void { @@ -148,22 +149,26 @@ export const GraftingRoot = (): React.ReactElement => { {/* Use formula so the displayed creation time is accurate to player bonus */} - {Augmentations[selectedAug].prereqs.length > 0 && ( - + {selectedAugmentation.prereqs.length > 0 && ( + )} +
{(() => { - const aug = Augmentations[selectedAug]; - - const info = typeof aug.info === "string" ? {aug.info} : aug.info; + const info = + typeof selectedAugmentation.info === "string" ? ( + {selectedAugmentation.info} + ) : ( + selectedAugmentation.info + ); const tooltip = ( <> {info}

- {aug.stats} + {selectedAugmentation.stats} ); return tooltip; diff --git a/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx b/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx index 07c995502..a2c7619c7 100644 --- a/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx +++ b/src/PersonObjects/Player/PlayerObjectGeneralMethods.tsx @@ -1,6 +1,5 @@ import { IPlayer } from "../IPlayer"; import { PlayerObject } from "./PlayerObject"; -import { Augmentations } from "../../Augmentation/Augmentations"; import { applyAugmentation } from "../../Augmentation/AugmentationHelpers"; import { PlayerOwnedAugmentation } from "../../Augmentation/PlayerOwnedAugmentation"; import { AugmentationNames } from "../../Augmentation/data/AugmentationNames"; @@ -1367,7 +1366,7 @@ export function craftAugmentationWork(this: IPlayer, numCycles: number): boolean export function finishGraftAugmentationWork(this: IPlayer, cancelled: boolean, singularity = false): string { const augName = this.graftAugmentationName; if (cancelled === false) { - applyAugmentation(Augmentations[augName]); + applyAugmentation({ name: augName, level: 1 }); if (!this.hasAugmentation(AugmentationNames.CongruityImplant)) { this.entropy += 1; diff --git a/src/PersonObjects/Sleeve/Sleeve.ts b/src/PersonObjects/Sleeve/Sleeve.ts index ffeb03dad..fff9b991d 100644 --- a/src/PersonObjects/Sleeve/Sleeve.ts +++ b/src/PersonObjects/Sleeve/Sleeve.ts @@ -686,7 +686,7 @@ export class Sleeve extends Person { } tryBuyAugmentation(p: IPlayer, aug: Augmentation): boolean { - if (!p.canAfford(aug.startingCost)) { + if (!p.canAfford(aug.baseCost)) { return false; } @@ -695,7 +695,7 @@ export class Sleeve extends Person { return false; } - p.loseMoney(aug.startingCost, "sleeves"); + p.loseMoney(aug.baseCost, "sleeves"); this.installAugmentation(aug); return true; } diff --git a/src/PersonObjects/Sleeve/SleeveHelpers.ts b/src/PersonObjects/Sleeve/SleeveHelpers.ts index 324cd9aa6..0796027e3 100644 --- a/src/PersonObjects/Sleeve/SleeveHelpers.ts +++ b/src/PersonObjects/Sleeve/SleeveHelpers.ts @@ -4,7 +4,7 @@ import { Sleeve } from "./Sleeve"; import { IPlayer } from "../IPlayer"; import { Augmentation } from "../../Augmentation/Augmentation"; -import { Augmentations } from "../../Augmentation/Augmentations"; +import { StaticAugmentations } from "../../Augmentation/StaticAugmentations"; import { Faction } from "../../Faction/Faction"; import { Factions } from "../../Faction/Factions"; @@ -64,13 +64,13 @@ export function findSleevePurchasableAugs(sleeve: Sleeve, p: IPlayer): Augmentat if (p.inGang()) { const fac = p.getGangFaction(); - for (const augName of Object.keys(Augmentations)) { - const aug = Augmentations[augName]; + for (const augName of Object.keys(StaticAugmentations)) { + const aug = StaticAugmentations[augName]; if (!isAvailableForSleeve(aug)) { continue; } - if (fac.playerReputation > aug.baseRepRequirement) { + if (fac.playerReputation > aug.getCost(p).repCost) { availableAugs.push(aug); } } @@ -89,12 +89,12 @@ export function findSleevePurchasableAugs(sleeve: Sleeve, p: IPlayer): Augmentat } for (const augName of fac.augmentations) { - const aug: Augmentation = Augmentations[augName]; + const aug: Augmentation = StaticAugmentations[augName]; if (!isAvailableForSleeve(aug)) { continue; } - if (fac.playerReputation > aug.baseRepRequirement) { + if (fac.playerReputation > aug.getCost(p).repCost) { availableAugs.push(aug); } } diff --git a/src/PersonObjects/Sleeve/ui/SleeveAugmentationsModal.tsx b/src/PersonObjects/Sleeve/ui/SleeveAugmentationsModal.tsx index 71eaf08a4..ab512125b 100644 --- a/src/PersonObjects/Sleeve/ui/SleeveAugmentationsModal.tsx +++ b/src/PersonObjects/Sleeve/ui/SleeveAugmentationsModal.tsx @@ -52,7 +52,7 @@ export function SleeveAugmentationsModal(props: IProps): React.ReactElement { ownedAugNames={ownedAugNames} player={player} canPurchase={(player, aug) => { - return player.money > aug.startingCost; + return player.money > aug.baseCost; }} purchaseAugmentation={(player, aug, _showModal) => { props.sleeve.tryBuyAugmentation(player, aug); diff --git a/src/Prestige.ts b/src/Prestige.ts index fec16b409..a643018af 100755 --- a/src/Prestige.ts +++ b/src/Prestige.ts @@ -1,6 +1,6 @@ import { FactionNames } from "./Faction/data/FactionNames"; import { CityName } from "./Locations/data/CityNames"; -import { Augmentations } from "./Augmentation/Augmentations"; +import { StaticAugmentations } from "./Augmentation/StaticAugmentations"; import { augmentationExists, initAugmentations } from "./Augmentation/AugmentationHelpers"; import { AugmentationNames } from "./Augmentation/data/AugmentationNames"; import { initBitNodeMultipliers } from "./BitNode/BitNode"; @@ -225,9 +225,9 @@ export function prestigeSourceFile(flume: boolean): void { } // Delete all Augmentations - for (const name of Object.keys(Augmentations)) { - if (Augmentations.hasOwnProperty(name)) { - delete Augmentations[name]; + for (const name of Object.keys(StaticAugmentations)) { + if (StaticAugmentations.hasOwnProperty(name)) { + delete StaticAugmentations[name]; } } diff --git a/src/index.tsx b/src/index.tsx index 38aba9a58..db30c785c 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -4,7 +4,6 @@ import ReactDOM from "react-dom"; import { TTheme as Theme, ThemeEvents, refreshTheme } from "./Themes/ui/Theme"; import { LoadingScreen } from "./ui/LoadingScreen"; import { initElectron } from "./Electron"; -import { AlertEvents } from "./ui/React/AlertManager"; initElectron(); globalThis["React"] = React; globalThis["ReactDOM"] = ReactDOM;