diff --git a/src/Augmentation/ui/PlayerMultipliers.tsx b/src/Augmentation/ui/PlayerMultipliers.tsx index 24a2286c1..35652c70e 100644 --- a/src/Augmentation/ui/PlayerMultipliers.tsx +++ b/src/Augmentation/ui/PlayerMultipliers.tsx @@ -45,13 +45,13 @@ function BitNodeModifiedStats(props: IBitNodeModifiedStatsProps): React.ReactEle ); } -type MultiplierListItemData = [ - multiplier: string, - currentValue: number, - augmentedValue: number, - bitNodeMultiplier: number, - color: string, -]; +interface MultiplierListItemData { + mult: string; + current: number; + augmented: number; + bnMult?: number; + color?: string; +} interface IMultiplierListProps { rows: MultiplierListItemData[]; @@ -60,23 +60,23 @@ interface IMultiplierListProps { function MultiplierList(props: IMultiplierListProps): React.ReactElement { const listItems = props.rows .map((data) => { - const [multiplier, currentValue, augmentedValue, bitNodeMultiplier, color] = data; + const { mult, current, augmented, bnMult = 1, color = Settings.theme.primary } = data; - if (!isNaN(augmentedValue)) { + if (!isNaN(augmented)) { return ( - + - {multiplier} + {mult} } secondary={ - + - + } disableTypography @@ -94,177 +94,205 @@ function MultiplierList(props: IMultiplierListProps): React.ReactElement { export function PlayerMultipliers(): React.ReactElement { const mults = calculateAugmentedStats(); - // Column data is a bit janky, so it's set up here to allow for - // easier logic in setting up the layout const leftColData: MultiplierListItemData[] = [ ...[ - ["Hacking Chance ", Player.hacking_chance_mult, Player.hacking_chance_mult * mults.hacking_chance_mult, 1], - ["Hacking Speed ", Player.hacking_speed_mult, Player.hacking_speed_mult * mults.hacking_speed_mult, 1], - ["Hacking Money ", Player.hacking_money_mult, Player.hacking_money_mult * mults.hacking_money_mult, 1], - ["Hacking Growth ", Player.hacking_grow_mult, Player.hacking_grow_mult * mults.hacking_grow_mult, 1], - [ - "Hacking Level ", - Player.hacking_mult, - Player.hacking_mult * mults.hacking_mult, - BitNodeMultipliers.HackingLevelMultiplier, - ], - [ - "Hacking Experience ", - Player.hacking_exp_mult, - Player.hacking_exp_mult * mults.hacking_exp_mult, - BitNodeMultipliers.HackExpGain, - ], - ].map((data): MultiplierListItemData => (data as any).concat([Settings.theme.hack])), + { + mult: "Hacking Chance", + current: Player.hacking_chance_mult, + augmented: Player.hacking_chance_mult * mults.hacking_chance_mult, + }, + { + mult: "Hacking Speed", + current: Player.hacking_speed_mult, + augmented: Player.hacking_speed_mult * mults.hacking_speed_mult, + }, + { + mult: "Hacking Money", + current: Player.hacking_money_mult, + augmented: Player.hacking_money_mult * mults.hacking_money_mult, + bnMult: BitNodeMultipliers.ScriptHackMoney, + }, + { + mult: "Hacking Growth", + current: Player.hacking_grow_mult, + augmented: Player.hacking_grow_mult * mults.hacking_grow_mult, + }, + { + mult: "Hacking Level", + current: Player.hacking_mult, + augmented: Player.hacking_mult * mults.hacking_mult, + bnMult: BitNodeMultipliers.HackingLevelMultiplier, + }, + { + mult: "Hacking Experience", + current: Player.hacking_exp_mult, + augmented: Player.hacking_exp_mult * mults.hacking_exp_mult, + bnMult: BitNodeMultipliers.HackExpGain, + }, + ].map((data: MultiplierListItemData) => + Object.defineProperty(data, "color", { + value: Settings.theme.hack, + }), + ), ...[ - [ - "Strength Level ", - Player.strength_mult, - Player.strength_mult * mults.strength_mult, - BitNodeMultipliers.StrengthLevelMultiplier, - ], - ["Strength Experience ", Player.strength_exp_mult, Player.strength_exp_mult * mults.strength_exp_mult, 1], - [ - "Defense Level ", - Player.defense_mult, - Player.defense_mult * mults.defense_mult, - BitNodeMultipliers.DefenseLevelMultiplier, - ], - ["Defense Experience ", Player.defense_exp_mult, Player.defense_exp_mult * mults.defense_exp_mult, 1], - [ - "Dexterity Level ", - Player.dexterity_mult, - Player.dexterity_mult * mults.dexterity_mult, - BitNodeMultipliers.DexterityLevelMultiplier, - ], - ["Dexterity Experience ", Player.dexterity_exp_mult, Player.dexterity_exp_mult * mults.dexterity_exp_mult, 1], - [ - "Agility Level ", - Player.agility_mult, - Player.agility_mult * mults.agility_mult, - BitNodeMultipliers.AgilityLevelMultiplier, - ], - ["Agility Experience ", Player.agility_exp_mult, Player.agility_exp_mult * mults.agility_exp_mult, 1], - ].map((data): MultiplierListItemData => (data as any).concat([Settings.theme.combat])), - [ - "Charisma Level ", - Player.charisma_mult, - Player.charisma_mult * mults.charisma_mult, - BitNodeMultipliers.CharismaLevelMultiplier, - Settings.theme.cha, - ], - [ - "Charisma Experience ", - Player.charisma_exp_mult, - Player.charisma_exp_mult * mults.charisma_exp_mult, - 1, - Settings.theme.cha, - ], + { + mult: "Strength Level", + current: Player.strength_mult, + augmented: Player.strength_mult * mults.strength_mult, + bnMult: BitNodeMultipliers.StrengthLevelMultiplier, + }, + { + mult: "Strength Experience", + current: Player.strength_exp_mult, + augmented: Player.strength_exp_mult * mults.strength_exp_mult, + }, + { + mult: "Defense Level", + current: Player.defense_mult, + augmented: Player.defense_mult * mults.defense_mult, + bnMult: BitNodeMultipliers.DefenseLevelMultiplier, + }, + { + mult: "Defense Experience", + current: Player.defense_exp_mult, + augmented: Player.defense_exp_mult * mults.defense_exp_mult, + }, + { + mult: "Dexterity Level", + current: Player.dexterity_mult, + augmented: Player.dexterity_mult * mults.dexterity_mult, + bnMult: BitNodeMultipliers.DexterityLevelMultiplier, + }, + { + mult: "Dexterity Experience", + current: Player.dexterity_exp_mult, + augmented: Player.dexterity_exp_mult * mults.dexterity_exp_mult, + }, + { + mult: "Agility Level", + current: Player.agility_mult, + augmented: Player.agility_mult * mults.agility_mult, + bnMult: BitNodeMultipliers.AgilityLevelMultiplier, + }, + { + mult: "Agility Experience", + current: Player.agility_exp_mult, + augmented: Player.agility_exp_mult * mults.agility_exp_mult, + }, + ].map((data: MultiplierListItemData) => + Object.defineProperty(data, "color", { + value: Settings.theme.combat, + }), + ), + { + mult: "Charisma Level", + current: Player.charisma_mult, + augmented: Player.charisma_mult * mults.charisma_mult, + bnMult: BitNodeMultipliers.CharismaLevelMultiplier, + color: Settings.theme.cha, + }, + { + mult: "Charisma Experience", + current: Player.charisma_exp_mult, + augmented: Player.charisma_exp_mult * mults.charisma_exp_mult, + color: Settings.theme.cha, + }, ]; const rightColData: MultiplierListItemData[] = [ - ...[ - [ - "Hacknet Node production ", - Player.hacknet_node_money_mult, - Player.hacknet_node_money_mult * mults.hacknet_node_money_mult, - BitNodeMultipliers.HacknetNodeMoney, - ], - [ - "Hacknet Node purchase cost ", - Player.hacknet_node_purchase_cost_mult, - Player.hacknet_node_purchase_cost_mult * mults.hacknet_node_purchase_cost_mult, - 1, - ], - [ - "Hacknet Node RAM upgrade cost ", - Player.hacknet_node_ram_cost_mult, - Player.hacknet_node_ram_cost_mult * mults.hacknet_node_ram_cost_mult, - 1, - ], - [ - "Hacknet Node Core purchase cost ", - Player.hacknet_node_core_cost_mult, - Player.hacknet_node_core_cost_mult * mults.hacknet_node_core_cost_mult, - 1, - ], - [ - "Hacknet Node level upgrade cost ", - Player.hacknet_node_level_cost_mult, - Player.hacknet_node_level_cost_mult * mults.hacknet_node_level_cost_mult, - 1, - ], - ["Company reputation gain ", Player.company_rep_mult, Player.company_rep_mult * mults.company_rep_mult, 1], - [ - "Faction reputation gain ", - Player.faction_rep_mult, - Player.faction_rep_mult * mults.faction_rep_mult, - BitNodeMultipliers.FactionWorkRepGain, - ], - ].map((data): MultiplierListItemData => (data as any).concat([Settings.theme.primary])), - [ - "Salary ", - Player.work_money_mult, - Player.work_money_mult * mults.work_money_mult, - BitNodeMultipliers.CompanyWorkMoney, - Settings.theme.money, - ], - [ - "Crime success ", - Player.crime_success_mult, - Player.crime_success_mult * mults.crime_success_mult, - 1, - Settings.theme.combat, - ], - [ - "Crime money ", - Player.crime_money_mult, - Player.crime_money_mult * mults.crime_money_mult, - BitNodeMultipliers.CrimeMoney, - Settings.theme.money, - ], + { + mult: "Hacknet Node Production", + current: Player.hacknet_node_money_mult, + augmented: Player.hacknet_node_money_mult * mults.hacknet_node_money_mult, + bnMult: BitNodeMultipliers.HacknetNodeMoney, + }, + { + mult: "Hacknet Node Purchase Cost", + current: Player.hacknet_node_purchase_cost_mult, + augmented: Player.hacknet_node_purchase_cost_mult * mults.hacknet_node_purchase_cost_mult, + }, + { + mult: "Hacknet Node RAM Upgrade Cost", + current: Player.hacknet_node_ram_cost_mult, + augmented: Player.hacknet_node_ram_cost_mult * mults.hacknet_node_ram_cost_mult, + }, + { + mult: "Hacknet Node Core Purchase Cost", + current: Player.hacknet_node_core_cost_mult, + augmented: Player.hacknet_node_core_cost_mult * mults.hacknet_node_core_cost_mult, + }, + { + mult: "Hacknet Node Level Upgrade Cost", + current: Player.hacknet_node_level_cost_mult, + augmented: Player.hacknet_node_level_cost_mult * mults.hacknet_node_level_cost_mult, + }, + { + mult: "Company Reputation Gain", + current: Player.company_rep_mult, + augmented: Player.company_rep_mult * mults.company_rep_mult, + }, + { + mult: "Faction Reputation Gain", + current: Player.faction_rep_mult, + augmented: Player.faction_rep_mult * mults.faction_rep_mult, + bnMult: BitNodeMultipliers.FactionWorkRepGain, + }, + { + mult: "Salary", + current: Player.work_money_mult, + augmented: Player.work_money_mult * mults.work_money_mult, + bnMult: BitNodeMultipliers.CompanyWorkMoney, + color: Settings.theme.money, + }, + { + mult: "Crime Success Chance", + current: Player.crime_success_mult, + augmented: Player.crime_success_mult * mults.crime_success_mult, + color: Settings.theme.combat, + }, + { + mult: "Crime Money", + current: Player.crime_money_mult, + augmented: Player.crime_money_mult * mults.crime_money_mult, + bnMult: BitNodeMultipliers.CrimeMoney, + color: Settings.theme.money, + }, ]; if (Player.canAccessBladeburner()) { rightColData.push( - ...[ - [ - "Bladeburner Success Chance", - Player.bladeburner_success_chance_mult, - Player.bladeburner_success_chance_mult * mults.bladeburner_success_chance_mult, - 1, - ], - [ - "Bladeburner Max Stamina", - Player.bladeburner_max_stamina_mult, - Player.bladeburner_max_stamina_mult * mults.bladeburner_max_stamina_mult, - 1, - ], - [ - "Bladeburner Stamina Gain", - Player.bladeburner_stamina_gain_mult, - Player.bladeburner_stamina_gain_mult * mults.bladeburner_stamina_gain_mult, - 1, - ], - [ - "Bladeburner Field Analysis", - Player.bladeburner_analysis_mult, - Player.bladeburner_analysis_mult * mults.bladeburner_analysis_mult, - 1, - ], - ].map((data): MultiplierListItemData => (data as any).concat([Settings.theme.primary])), + { + mult: "Bladeburner Success Chance", + current: Player.bladeburner_success_chance_mult, + augmented: Player.bladeburner_success_chance_mult * mults.bladeburner_success_chance_mult, + }, + { + mult: "Bladeburner Max Stamina", + current: Player.bladeburner_max_stamina_mult, + augmented: Player.bladeburner_max_stamina_mult * mults.bladeburner_max_stamina_mult, + }, + { + mult: "Bladeburner Stamina Gain", + current: Player.bladeburner_stamina_gain_mult, + augmented: Player.bladeburner_stamina_gain_mult * mults.bladeburner_stamina_gain_mult, + }, + { + mult: "Bladeburner Field Analysis", + current: Player.bladeburner_analysis_mult, + augmented: Player.bladeburner_analysis_mult * mults.bladeburner_analysis_mult, + }, ); } - const hasLeftImprovements = +!!(leftColData.filter((item) => item[2] !== 0).length > 0), - hasRightImprovements = +!!(rightColData.filter((item) => item[2] !== 0).length > 0); - return ( diff --git a/src/BitNode/BitNode.tsx b/src/BitNode/BitNode.tsx index 3aeea62f9..9173256d6 100644 --- a/src/BitNode/BitNode.tsx +++ b/src/BitNode/BitNode.tsx @@ -504,6 +504,8 @@ export const defaultMultipliers: IBitNodeMultipliers = { WorldDaemonDifficulty: 1, }; +Object.freeze(defaultMultipliers); + export function getBitNodeMultipliers(n: number, lvl: number): IBitNodeMultipliers { const mults = Object.assign({}, defaultMultipliers); switch (n) { diff --git a/src/BitNode/BitNodeMultipliers.ts b/src/BitNode/BitNodeMultipliers.ts index 3cf7ebaee..566d0f14d 100644 --- a/src/BitNode/BitNodeMultipliers.ts +++ b/src/BitNode/BitNodeMultipliers.ts @@ -252,4 +252,4 @@ export interface IBitNodeMultipliers { * The multipliers that are influenced by current Bitnode progression. */ // tslint:disable-next-line:variable-name -export const BitNodeMultipliers = defaultMultipliers; +export const BitNodeMultipliers = Object.assign({}, defaultMultipliers); diff --git a/src/BitNode/ui/BitnodeMultipliersDescription.tsx b/src/BitNode/ui/BitnodeMultipliersDescription.tsx index 2f787a4be..c5777351c 100644 --- a/src/BitNode/ui/BitnodeMultipliersDescription.tsx +++ b/src/BitNode/ui/BitnodeMultipliersDescription.tsx @@ -1,554 +1,331 @@ -import ExpandMore from "@mui/icons-material/ExpandMore"; import ExpandLess from "@mui/icons-material/ExpandLess"; -import { Box, Collapse, ListItemButton, ListItemText, Paper, Typography } from "@mui/material"; +import ExpandMore from "@mui/icons-material/ExpandMore"; +import { Box, Collapse, ListItemButton, ListItemText, Paper, Table, TableBody, Typography } from "@mui/material"; +import { uniqueId } from "lodash"; import React from "react"; +import { SpecialServers } from "../../Server/data/SpecialServers"; +import { Settings } from "../../Settings/Settings"; import { use } from "../../ui/Context"; +import { StatsRow } from "../../ui/React/StatsRow"; import { defaultMultipliers, getBitNodeMultipliers } from "../BitNode"; import { IBitNodeMultipliers } from "../BitNodeMultipliers"; -import { SpecialServers } from "../../Server/data/SpecialServers"; interface IProps { n: number; + level?: number; } -export function BitnodeMultiplierDescription({ n }: IProps): React.ReactElement { - const player = use.Player(); +export function BitnodeMultiplierDescription({ n, level }: IProps): React.ReactElement { const [open, setOpen] = React.useState(false); - const mults = getBitNodeMultipliers(n, player.sourceFileLvl(n)); if (n === 1) return <>; return ( - <> -
- - setOpen((old) => !old)}> - Bitnode multipliers:} /> - {open ? : } - - - - - - - - - - - - - - - - - -
-
-
-
- + + setOpen((old) => !old)}> + Bitnode Multipliers} /> + {open ? : } + + + + + ); } +export const BitNodeMultipliersDisplay = ({ n, level }: IProps): React.ReactElement => { + const player = use.Player(); + // If a level argument has been provided, use that as the multiplier level + // If not, then we have to assume that we want the next level up from the + // current node's source file, so we get the min of that, the SF's max level, + // or if it's BN12, ∞ + const maxSfLevel = n === 12 ? Infinity : 3; + const mults = getBitNodeMultipliers(n, level ?? Math.min(player.sourceFileLvl(n) + 1, maxSfLevel)); + + return ( + + + + + + + + + + + + + + + + + ); +}; + +interface IBNMultRows { + [mult: string]: { + name: string; + content?: string; + color?: string; + }; +} + +interface IBNMultTableProps { + sectionName: string; + rowData: IBNMultRows; + mults: IBitNodeMultipliers; +} + +const BNMultTable = (props: IBNMultTableProps): React.ReactElement => { + const rowsArray = Object.entries(props.rowData) + .filter(([key, _value]) => props.mults[key] !== defaultMultipliers[key]) + .map(([key, value]) => ( + + )); + + return rowsArray.length > 0 ? ( + + {props.sectionName} + + {rowsArray} +
+
+ ) : ( + <> + ); +}; + interface IMultsProps { n: number; mults: IBitNodeMultipliers; } function GeneralMults({ mults }: IMultsProps): React.ReactElement { - // is it empty check - if ( - mults.ClassGymExpGain === defaultMultipliers.ClassGymExpGain && - mults.CodingContractMoney === defaultMultipliers.CodingContractMoney && - mults.DaedalusAugsRequirement === defaultMultipliers.DaedalusAugsRequirement && - mults.WorldDaemonDifficulty === defaultMultipliers.WorldDaemonDifficulty && - mults.HacknetNodeMoney === defaultMultipliers.HacknetNodeMoney - ) - return <>; - return ( - <> -
- General: - - {mults.WorldDaemonDifficulty !== defaultMultipliers.WorldDaemonDifficulty ? ( - - {SpecialServers.WorldDaemon} difficulty: x{mults.WorldDaemonDifficulty.toFixed(3)} - - ) : ( - <> - )} - {mults.DaedalusAugsRequirement !== defaultMultipliers.DaedalusAugsRequirement ? ( - Daedalus aug req.: {mults.DaedalusAugsRequirement} - ) : ( - <> - )} - {mults.HacknetNodeMoney !== defaultMultipliers.HacknetNodeMoney ? ( - Hacknet production: x{mults.HacknetNodeMoney.toFixed(3)} - ) : ( - <> - )} - {mults.CodingContractMoney !== defaultMultipliers.CodingContractMoney ? ( - Coding contract reward: x{mults.CodingContractMoney.toFixed(3)} - ) : ( - <> - )} - {mults.ClassGymExpGain !== defaultMultipliers.ClassGymExpGain ? ( - Class/Gym exp: x{mults.ClassGymExpGain.toFixed(3)} - ) : ( - <> - )} - - - ); + const rows: IBNMultRows = { + WorldDaemonDifficulty: { name: `${SpecialServers.WorldDaemon} Difficulty` }, + DaedalusAugsRequirement: { + name: "Daedalus Augs Requirement", + content: String(mults.DaedalusAugsRequirement), + }, + HacknetNodeMoney: { name: "Hacknet Production" }, + CodingContractMoney: { name: "Coding Contract Reward" }, + ClassGymExpGain: { name: "Class/Gym Exp" }, + }; + + return ; } function AugmentationMults({ mults }: IMultsProps): React.ReactElement { - // is it empty check - if ( - mults.AugmentationMoneyCost === defaultMultipliers.AugmentationMoneyCost && - mults.AugmentationRepCost === defaultMultipliers.AugmentationRepCost - ) - return <>; - return ( - <> -
- Augmentations: - - {mults.AugmentationMoneyCost !== defaultMultipliers.AugmentationMoneyCost ? ( - Cost: x{mults.AugmentationMoneyCost.toFixed(3)} - ) : ( - <> - )} - {mults.AugmentationRepCost !== defaultMultipliers.AugmentationRepCost ? ( - Reputation: x{mults.AugmentationRepCost.toFixed(3)} - ) : ( - <> - )} - - - ); + const rows: IBNMultRows = { + AugmentationMoneyCost: { name: "Money Cost" }, + AugmentationRepCost: { + name: "Reputation Cost", + color: Settings.theme.rep, + }, + }; + + return ; } function CompanyMults({ mults }: IMultsProps): React.ReactElement { - // is it empty check - if ( - mults.CompanyWorkExpGain === defaultMultipliers.CompanyWorkExpGain && - mults.CompanyWorkMoney === defaultMultipliers.CompanyWorkMoney - ) - return <>; - return ( - <> -
- Company: - - {mults.CompanyWorkMoney !== defaultMultipliers.CompanyWorkMoney ? ( - Money: x{mults.CompanyWorkMoney.toFixed(3)} - ) : ( - <> - )} - {mults.CompanyWorkExpGain !== defaultMultipliers.CompanyWorkExpGain ? ( - Exp: x{mults.CompanyWorkExpGain.toFixed(3)} - ) : ( - <> - )} - - - ); + const rows: IBNMultRows = { + CompanyWorkMoney: { + name: "Work Money", + color: Settings.theme.money, + }, + CompanyWorkExpGain: { name: "Work Exp" }, + }; + + return ; } function StockMults({ mults }: IMultsProps): React.ReactElement { - // is it empty check - if ( - mults.FourSigmaMarketDataApiCost === defaultMultipliers.FourSigmaMarketDataApiCost && - mults.FourSigmaMarketDataCost === defaultMultipliers.FourSigmaMarketDataCost - ) - return <>; - return ( - <> -
- Stock market: - - {mults.FourSigmaMarketDataCost !== defaultMultipliers.FourSigmaMarketDataCost ? ( - Market data cost: x{mults.FourSigmaMarketDataCost.toFixed(3)} - ) : ( - <> - )} - {mults.FourSigmaMarketDataApiCost !== defaultMultipliers.FourSigmaMarketDataApiCost ? ( - Market data API cost: x{mults.FourSigmaMarketDataApiCost.toFixed(3)} - ) : ( - <> - )} - - - ); + const rows: IBNMultRows = { + FourSigmaMarketDataCost: { name: "Market Data Cost" }, + FourSigmaMarketDataApiCost: { name: "Market Data API Cost" }, + }; + + return ; } function FactionMults({ mults }: IMultsProps): React.ReactElement { - // is it empty check - if ( - mults.FactionPassiveRepGain === defaultMultipliers.FactionPassiveRepGain && - mults.FactionWorkExpGain === defaultMultipliers.FactionWorkExpGain && - mults.FactionWorkRepGain === defaultMultipliers.FactionWorkRepGain && - mults.RepToDonateToFaction === defaultMultipliers.RepToDonateToFaction - ) - return <>; - return ( - <> -
- Faction: - - {mults.RepToDonateToFaction !== defaultMultipliers.RepToDonateToFaction ? ( - Favor to donate: x{mults.RepToDonateToFaction.toFixed(3)} - ) : ( - <> - )} - {mults.FactionWorkRepGain !== defaultMultipliers.FactionWorkRepGain ? ( - Work rep: x{mults.FactionWorkRepGain.toFixed(3)} - ) : ( - <> - )} - {mults.FactionWorkExpGain !== defaultMultipliers.FactionWorkExpGain ? ( - Work exp: x{mults.FactionWorkExpGain.toFixed(3)} - ) : ( - <> - )} - {mults.FactionPassiveRepGain !== defaultMultipliers.FactionPassiveRepGain ? ( - Passive rep: x{mults.FactionPassiveRepGain.toFixed(3)} - ) : ( - <> - )} - - - ); + const rows: IBNMultRows = { + RepToDonateToFaction: { name: "Favor to Donate" }, + FactionWorkRepGain: { + name: "Work Reputation", + color: Settings.theme.rep, + }, + FactionWorkExpGain: { name: "Work Exp" }, + FactionPassiveRepGain: { + name: "Passive Rep", + color: Settings.theme.rep, + }, + }; + + return ; } function CrimeMults({ mults }: IMultsProps): React.ReactElement { - // is it empty check - if (mults.CrimeExpGain === defaultMultipliers.CrimeExpGain && mults.CrimeMoney === defaultMultipliers.CrimeMoney) - return <>; - return ( - <> -
- Crime: - - {mults.CrimeExpGain !== defaultMultipliers.CrimeExpGain ? ( - Exp: x{mults.CrimeExpGain.toFixed(3)} - ) : ( - <> - )} - {mults.CrimeMoney !== defaultMultipliers.CrimeMoney ? ( - Money: x{mults.CrimeMoney.toFixed(3)} - ) : ( - <> - )} - - - ); + const rows: IBNMultRows = { + CrimeExpGain: { + name: "Crime Exp", + color: Settings.theme.combat, + }, + CrimeMoney: { + name: "Crime Money", + color: Settings.theme.combat, + }, + }; + + return ; } function SkillMults({ mults }: IMultsProps): React.ReactElement { - // is it empty check - if ( - mults.HackingLevelMultiplier === defaultMultipliers.HackingLevelMultiplier && - mults.AgilityLevelMultiplier === defaultMultipliers.AgilityLevelMultiplier && - mults.DefenseLevelMultiplier === defaultMultipliers.DefenseLevelMultiplier && - mults.DexterityLevelMultiplier === defaultMultipliers.DexterityLevelMultiplier && - mults.StrengthLevelMultiplier === defaultMultipliers.StrengthLevelMultiplier && - mults.CharismaLevelMultiplier === defaultMultipliers.CharismaLevelMultiplier - ) - return <>; - return ( - <> -
- Skills: - - {mults.HackingLevelMultiplier !== defaultMultipliers.HackingLevelMultiplier ? ( - Hacking: x{mults.HackingLevelMultiplier.toFixed(3)} - ) : ( - <> - )} - {mults.AgilityLevelMultiplier !== defaultMultipliers.AgilityLevelMultiplier ? ( - Agility: x{mults.AgilityLevelMultiplier.toFixed(3)} - ) : ( - <> - )} - {mults.DefenseLevelMultiplier !== defaultMultipliers.DefenseLevelMultiplier ? ( - Defense: x{mults.DefenseLevelMultiplier.toFixed(3)} - ) : ( - <> - )} - {mults.DexterityLevelMultiplier !== defaultMultipliers.DexterityLevelMultiplier ? ( - Dexterity: x{mults.DexterityLevelMultiplier.toFixed(3)} - ) : ( - <> - )} - {mults.StrengthLevelMultiplier !== defaultMultipliers.StrengthLevelMultiplier ? ( - Strength: x{mults.StrengthLevelMultiplier.toFixed(3)} - ) : ( - <> - )} - {mults.CharismaLevelMultiplier !== defaultMultipliers.CharismaLevelMultiplier ? ( - Charisma: x{mults.CharismaLevelMultiplier.toFixed(3)} - ) : ( - <> - )} - - - ); + const rows: IBNMultRows = { + HackingLevelMultiplier: { + name: "Hacking Level", + color: Settings.theme.hack, + }, + StrengthLevelMultiplier: { + name: "Strength Level", + color: Settings.theme.combat, + }, + DefenseLevelMultiplier: { + name: "Defense Level", + color: Settings.theme.combat, + }, + DexterityLevelMultiplier: { + name: "Dexterity Level", + color: Settings.theme.combat, + }, + CharismaLevelMultiplier: { + name: "Charisma Level", + color: Settings.theme.cha, + }, + }; + + return ; } function HackingMults({ mults }: IMultsProps): React.ReactElement { - // is it empty check - if ( - mults.ServerGrowthRate === defaultMultipliers.ServerGrowthRate && - mults.ServerMaxMoney === defaultMultipliers.ServerMaxMoney && - mults.ServerStartingMoney === defaultMultipliers.ServerStartingMoney && - mults.ServerStartingSecurity === defaultMultipliers.ServerStartingSecurity && - mults.ServerWeakenRate === defaultMultipliers.ServerWeakenRate && - mults.ManualHackMoney === defaultMultipliers.ManualHackMoney && - mults.ScriptHackMoney === defaultMultipliers.ScriptHackMoney && - mults.ScriptHackMoneyGain === defaultMultipliers.ScriptHackMoneyGain && - mults.HackExpGain === defaultMultipliers.HackExpGain - ) - return <>; + const rows: IBNMultRows = { + HackExpGain: { + name: "Hacking Exp", + color: Settings.theme.hack, + }, + ServerGrowthRate: { name: "Server Growth Rate" }, + ServerMaxMoney: { name: "Server Max Money" }, + ServerStartingMoney: { name: "Server Starting Money" }, + ServerStartingSecurity: { name: "Server Starting Security" }, + ServerWeakenRate: { name: "Server Weaken Rate" }, + ManualHackMoney: { + name: "Manual Hack Money", + color: Settings.theme.money, + }, + ScriptHackMoney: { + name: "Script Hack Money", + color: Settings.theme.money, + }, + ScriptHackMoneyGain: { + name: "Money Gained From Hack", + color: Settings.theme.money, + }, + }; - return ( - <> -
- Hacking: - - {mults.HackExpGain !== defaultMultipliers.HackExpGain ? ( - Exp: x{mults.HackExpGain.toFixed(3)} - ) : ( - <> - )} - {mults.ServerGrowthRate !== defaultMultipliers.ServerGrowthRate ? ( - Growth rate: x{mults.ServerGrowthRate.toFixed(3)} - ) : ( - <> - )} - {mults.ServerMaxMoney !== defaultMultipliers.ServerMaxMoney ? ( - Max money: x{mults.ServerMaxMoney.toFixed(3)} - ) : ( - <> - )} - {mults.ServerStartingMoney !== defaultMultipliers.ServerStartingMoney ? ( - Starting money: x{mults.ServerStartingMoney.toFixed(3)} - ) : ( - <> - )} - {mults.ServerStartingSecurity !== defaultMultipliers.ServerStartingSecurity ? ( - Starting security: x{mults.ServerStartingSecurity.toFixed(3)} - ) : ( - <> - )} - {mults.ServerWeakenRate !== defaultMultipliers.ServerWeakenRate ? ( - Weaken rate: x{mults.ServerWeakenRate.toFixed(3)} - ) : ( - <> - )} - {mults.ManualHackMoney !== defaultMultipliers.ManualHackMoney ? ( - Manual hack money: x{mults.ManualHackMoney.toFixed(3)} - ) : ( - <> - )} - {mults.ScriptHackMoney !== defaultMultipliers.ScriptHackMoney ? ( - Hack money stolen: x{mults.ScriptHackMoney.toFixed(3)} - ) : ( - <> - )} - {mults.ScriptHackMoneyGain !== defaultMultipliers.ScriptHackMoneyGain ? ( - Money gained from hack: x{mults.ScriptHackMoneyGain.toFixed(3)} - ) : ( - <> - )} - - - ); + return ; } function PurchasedServersMults({ mults }: IMultsProps): React.ReactElement { - // is it empty check - if ( - mults.PurchasedServerCost === defaultMultipliers.PurchasedServerCost && - mults.PurchasedServerSoftcap === defaultMultipliers.PurchasedServerSoftcap && - mults.PurchasedServerLimit === defaultMultipliers.PurchasedServerLimit && - mults.PurchasedServerMaxRam === defaultMultipliers.PurchasedServerMaxRam && - mults.HomeComputerRamCost === defaultMultipliers.HomeComputerRamCost - ) - return <>; - return ( - <> -
- Purchased servers: - - {mults.PurchasedServerCost !== defaultMultipliers.PurchasedServerCost ? ( - Base cost: {mults.PurchasedServerCost.toFixed(3)} - ) : ( - <> - )} - {mults.PurchasedServerSoftcap !== defaultMultipliers.PurchasedServerSoftcap ? ( - Softcap cost: {mults.PurchasedServerSoftcap.toFixed(3)} - ) : ( - <> - )} - {mults.PurchasedServerLimit !== defaultMultipliers.PurchasedServerLimit ? ( - Limit: x{mults.PurchasedServerLimit.toFixed(3)} - ) : ( - <> - )} - {mults.PurchasedServerMaxRam !== defaultMultipliers.PurchasedServerMaxRam ? ( - Max ram: x{mults.PurchasedServerMaxRam.toFixed(3)} - ) : ( - <> - )} - {mults.HomeComputerRamCost !== defaultMultipliers.HomeComputerRamCost ? ( - Home ram cost: x{mults.HomeComputerRamCost.toFixed(3)} - ) : ( - <> - )} - - - ); + const rows: IBNMultRows = { + PurchasedServerCost: { + name: "Base Cost", + content: mults.PurchasedServerCost.toFixed(3), + }, + PurchasedServerSoftcap: { + name: "Softcap Cost", + content: mults.PurchasedServerSoftcap.toFixed(3), + }, + PurchasedServerLimit: { name: "Server Limit" }, + PurchasedServerMaxRam: { name: "Max RAM" }, + HomeComputerRamCost: { name: "Home RAM Cost" }, + }; + + return ; } function InfiltrationMults({ mults }: IMultsProps): React.ReactElement { - // is it empty check - if ( - mults.InfiltrationMoney === defaultMultipliers.InfiltrationMoney && - mults.InfiltrationRep === defaultMultipliers.InfiltrationRep - ) - return <>; - return ( - <> -
- Infiltration: - - {mults.InfiltrationMoney !== defaultMultipliers.InfiltrationMoney ? ( - Money: {mults.InfiltrationMoney.toFixed(3)} - ) : ( - <> - )} - {mults.InfiltrationRep !== defaultMultipliers.InfiltrationRep ? ( - Reputation: x{mults.InfiltrationRep.toFixed(3)} - ) : ( - <> - )} - - - ); + const rows: IBNMultRows = { + InfiltrationMoney: { + name: "Infiltration Money", + color: Settings.theme.money, + }, + InfiltrationRep: { + name: "Infiltration Reputation", + color: Settings.theme.rep, + }, + }; + + return ; } -function BladeburnerMults({ n, mults }: IMultsProps): React.ReactElement { +function BladeburnerMults({ mults }: IMultsProps): React.ReactElement { const player = use.Player(); - // access check - if (n !== 6 && n !== 7 && player.sourceFileLvl(6) === 0) return <>; - //default mults check - if (mults.BladeburnerRank === 1 && mults.BladeburnerSkillCost === 1) return <>; - return ( - <> -
- Bladeburner: - - {mults.BladeburnerRank !== 1 ? Rank gain: x{mults.BladeburnerRank.toFixed(3)} : <>} - {mults.BladeburnerSkillCost !== 1 ? ( - Skill cost: x{mults.BladeburnerSkillCost.toFixed(3)} - ) : ( - <> - )} - - - ); + if (!player.canAccessBladeburner()) return <>; + + const rows: IBNMultRows = { + BladeburnerRank: { name: "Rank Gain" }, + BladeburnerSkillCost: { name: "Skill Cost" }, + }; + + return ; } -function StanekMults({ n, mults }: IMultsProps): React.ReactElement { +function StanekMults({ mults }: IMultsProps): React.ReactElement { const player = use.Player(); - // access check - if (n !== 13 && player.sourceFileLvl(13) === 0) return <>; - //default mults check - if ( - mults.StaneksGiftExtraSize === defaultMultipliers.StaneksGiftExtraSize && - mults.StaneksGiftPowerMultiplier === defaultMultipliers.StaneksGiftPowerMultiplier - ) - return <>; + if (!player.canAccessCotMG()) return <>; - const s = mults.StaneksGiftExtraSize; - return ( - <> -
- Stanek's Gift: - - {mults.StaneksGiftPowerMultiplier !== defaultMultipliers.StaneksGiftPowerMultiplier ? ( - Gift power: x{mults.StaneksGiftPowerMultiplier.toFixed(3)} - ) : ( - <> - )} - {s !== defaultMultipliers.StaneksGiftExtraSize ? ( - Base size modifier: {s > defaultMultipliers.StaneksGiftExtraSize ? `+${s}` : s} - ) : ( - <> - )} - - - ); + const extraSize = mults.StaneksGiftExtraSize.toFixed(3); + const rows: IBNMultRows = { + StnakesGiftPowerMultiplier: { name: "Gift Power" }, + StaneksGiftExtraSize: { + name: "Base Size Modifier", + content: `${mults.StaneksGiftExtraSize > defaultMultipliers.StaneksGiftExtraSize ? `+${extraSize}` : extraSize}`, + }, + }; + + return ; } -function GangMults({ n, mults }: IMultsProps): React.ReactElement { +function GangMults({ mults }: IMultsProps): React.ReactElement { const player = use.Player(); - // access check - if (n !== 2 && player.sourceFileLvl(2) === 0) return <>; - // is it empty check - if ( - mults.GangSoftcap === defaultMultipliers.GangSoftcap && - mults.GangUniqueAugs === defaultMultipliers.GangUniqueAugs - ) - return <>; - return ( - <> -
- Gang: - - {mults.GangSoftcap !== defaultMultipliers.GangSoftcap ? ( - Softcap: {mults.GangSoftcap.toFixed(3)} - ) : ( - <> - )} - {mults.GangUniqueAugs !== defaultMultipliers.GangUniqueAugs ? ( - Unique augs: x{mults.GangUniqueAugs.toFixed(3)} - ) : ( - <> - )} - - - ); + if (player.bitNodeN !== 2 && player.sourceFileLvl(2) <= 0) return <>; + + const rows: IBNMultRows = { + GangSoftcap: { + name: "Gang Softcap", + content: mults.GangSoftcap.toFixed(3), + }, + GangUniqueAugs: { name: "Unique Augmentations" }, + }; + + return ; } -function CorporationMults({ n, mults }: IMultsProps): React.ReactElement { +function CorporationMults({ mults }: IMultsProps): React.ReactElement { const player = use.Player(); - // access check - if (n !== 3 && player.sourceFileLvl(3) === 0) return <>; - // is it empty check - if ( - mults.CorporationSoftcap === defaultMultipliers.CorporationSoftcap && - mults.CorporationValuation === defaultMultipliers.CorporationValuation - ) - return <>; + if (!player.canAccessCorporation()) return <>; - return ( - <> -
- Corporation: - - {mults.CorporationSoftcap !== defaultMultipliers.CorporationSoftcap ? ( - Softcap: {mults.CorporationSoftcap.toFixed(3)} - ) : ( - <> - )} - {mults.CorporationValuation !== defaultMultipliers.CorporationValuation ? ( - Valuation: x{mults.CorporationValuation.toFixed(3)} - ) : ( - <> - )} - - - ); + const rows: IBNMultRows = { + CorporationSoftcap: { + name: "Corporation Softcap", + content: mults.CorporationSoftcap.toFixed(3), + }, + CorporationValuation: { name: "Valuation" }, + }; + + return ; } diff --git a/src/BitNode/ui/PortalModal.tsx b/src/BitNode/ui/PortalModal.tsx index b3791fe83..9b5cd560a 100644 --- a/src/BitNode/ui/PortalModal.tsx +++ b/src/BitNode/ui/PortalModal.tsx @@ -41,7 +41,7 @@ export function PortalModal(props: IProps): React.ReactElement {

{bitNode.info} - +