diff --git a/src/BitNode/BitNode.tsx b/src/BitNode/BitNode.tsx index 07c63137e..6b3365a4a 100644 --- a/src/BitNode/BitNode.tsx +++ b/src/BitNode/BitNode.tsx @@ -73,15 +73,6 @@ BitNodes["BitNode2"] = new BitNode( savagery. The organized crime factions quickly rose to the top of the modern world.

- In this BitNode: -
-
- Your hacking level is reduced by 20% -
- The growth rate and maximum amount of money available on servers are significantly decreased -
- The amount of money gained from crimes and Infiltration is tripled -
Certain Factions ({FactionNames.SlumSnakes}, {FactionNames.Tetrads}, {FactionNames.TheSyndicate},{" "} {FactionNames.TheDarkArmy}, {FactionNames.SpeakersForTheDead}, {FactionNames.NiteSec}, {FactionNames.TheBlackHand} ) give the player the ability to form and manage their own gangs. These gangs will earn the player money and @@ -89,10 +80,6 @@ BitNodes["BitNode2"] = new BitNode(
Every Augmentation in the game will be available through the Factions listed above
- For every Faction NOT listed above, reputation gains are halved -
- You will no longer gain passive reputation with Factions -

Destroying this BitNode will give you Source-File 2, or if you already have this Source-File it will upgrade its level up to a maximum of 3. This Source-File allows you to form gangs in other BitNodes once your karma decreases @@ -123,15 +110,7 @@ BitNodes["BitNode3"] = new BitNode(

In this BitNode you can create and manage your own corporation. Running a successful corporation has the potential - of generating massive profits. All other forms of income are reduced by 75%. Furthermore:
-
- The price and reputation cost of all Augmentations is tripled -
- The starting and maximum amount of money on servers is reduced by 75% -
- Server growth rate is reduced by 80% -
- You now only need 75 favour with a faction in order to donate to it, rather than 150 + of generating massive profits.

Destroying this BitNode will give you Source-File 3, or if you already have this Source-File it will upgrade its @@ -157,9 +136,6 @@ BitNodes["BitNode4"] = new BitNode( The Singularity has arrived. The human race is gone, replaced by artificially superintelligent beings that are more machine than man.

- In this BitNode, progressing is significantly harder. Experience gain rates for all stats are reduced. Most - methods of earning money will now give significantly less. -

In this BitNode you will gain access to a new set of Netscript Functions known as Singularity Functions. These functions allow you to control most aspects of the game through scripts, including working for factions/companies, @@ -184,24 +160,6 @@ BitNodes["BitNode5"] = new BitNode( couldn't be modeled by 1's and 0's. They were wrong.

- In this BitNode: -
-
- The base security level of servers is doubled -
- The starting money on servers is halved, but the maximum money remains the same -
- Most methods of earning money now give significantly less -
- Infiltration gives 50% more reputation and money -
- Corporations have 50% lower valuations and are therefore less profitable -
- Augmentations are more expensive -
- Hacking experience gain rates are reduced -
-
Destroying this BitNode will give you Source-File 5, or if you already have this Source-File it will upgrade its level up to a maximum of 3. This Source-File grants you a special new stat called Intelligence. Intelligence is unique because it is permanent and persistent (it never gets reset back to 1). However gaining Intelligence @@ -235,20 +193,7 @@ BitNodes["BitNode6"] = new BitNode(

In this BitNode you will be able to access the {FactionNames.Bladeburners} Division at the NSA, which provides a - new mechanic for progression. Furthermore: -
-
- Hacking and Hacknet Nodes will be less profitable -
- Your hacking level is reduced by 65% -
- Hacking experience gain from scripts is reduced by 75% -
- Corporations have 80% lower valuations and are therefore less profitable -
- Working for companies is 50% less profitable -
- Crimes and Infiltration are 25% less profitable + new mechanic for progression.

Destroying this BitNode will give you Source-File 6, or if you already have this Source-File it will upgrade its @@ -281,25 +226,7 @@ BitNodes["BitNode7"] = new BitNode(
In this BitNode you will be able to access the {FactionNames.Bladeburners} API, which allows you to access{" "} {FactionNames.Bladeburners} - functionality through Netscript. Furthermore:
-
- The rank you gain from {FactionNames.Bladeburners} contracts/operations is reduced by 40% -
- {FactionNames.Bladeburners} skills cost twice as many skill points -
- Augmentations are 3x more expensive -
- Hacking and Hacknet Nodes will be significantly less profitable -
- Your hacking level is reduced by 65% -
- Hacking experience gain from scripts is reduced by 75% -
- Corporations have 80% lower valuations and are therefore less profitable -
- Working for companies is 50% less profitable -
- Crimes and Infiltration are 25% less profitable + functionality through Netscript.

Destroying this BitNode will give you Source-File 7, or if you already have this Source-File it will upgrade its @@ -331,14 +258,10 @@ BitNodes["BitNode8"] = new BitNode(
You start with $250 million
- The only way to earn money is by trading on the stock market -
You start with a WSE membership and access to the TIX API
You are able to short stocks and place different types of orders (limit/stop)
- You can immediately donate to factions to gain reputation -

Destroying this BitNode will give you Source-File 8, or if you already have this Source-File it will upgrade its level up to a maximum of 3. This Source-File grants the following benefits: @@ -378,16 +301,6 @@ BitNodes["BitNode9"] = new BitNode( which can be spent on a variety of different upgrades.

- In this BitNode: -
-
- Your stats are significantly decreased -
- You cannnot purchase additional servers -
- Hacking is significantly less profitable -
-
Destroying this BitNode will give you Source-File 9, or if you already have this Source-File it will upgrade its level up to a maximum of 3. This Source-File grants the following benefits:
@@ -432,19 +345,7 @@ BitNodes["BitNode10"] = new BitNode( 1. Grafting: Visit VitaLife in New Tokyo to be able to obtain Augmentations without needing to install
2. Duplicate Sleeves: Duplicate your consciousness into Synthoids, allowing you to perform different tasks - synchronously -
-
- In this BitNode: -
-
- Your stats are significantly decreased -
- All methods of gaining money are half as profitable (except Stock Market) -
- Purchased servers are more expensive, have less max RAM, and a lower maximum limit -
- Augmentations are 5x as expensive and require twice as much reputation + synchronously.

Destroying this BitNode will give you Source-File 10, or if you already have this Source-File it will upgrade its @@ -472,28 +373,6 @@ BitNodes["BitNode11"] = new BitNode( world is slowly crumbling in the middle of the biggest economic crisis of all time.

- In this BitNode: -
-
- Your hacking stat and experience gain are halved -
- The starting and maximum amount of money available on servers is significantly decreased -
- The growth rate of servers is significantly reduced -
- Weakening a server is twice as effective -
- Company wages are decreased by 50% -
- Corporation valuations are 90% lower and are therefore significantly less profitable -
- Hacknet Node production is significantly decreased -
- Crime and Infiltration are more lucrative -
- Augmentations are twice as expensive -
-
Destroying this BitNode will give you Source-File 11, or if you already have this Source-File it will upgrade its level up to a maximum of 3. This Source-File makes it so that company favor increases BOTH the player's salary and reputation gain rate at that company by 1% per favor (rather than just the reputation gain). This Source-File also @@ -550,14 +429,6 @@ BitNodes["BitNode13"] = new BitNode( other. Find her in {CityName.Chongqing} and gain her trust.

- In this BitNode: -
-
- Every stat is significantly reduced -
- Stanek's Gift power is significantly increased. -
-
Destroying this BitNode will give you Source-File 13, or if you already have this Source-File it will upgrade its level up to a maximum of 3. This Source-File lets the {FactionNames.ChurchOfTheMachineGod} appear in other BitNodes. @@ -733,7 +604,7 @@ export function getBitNodeMultipliers(n: number, lvl: number): IBitNodeMultiplie CorporationValuation: 0.2, HacknetNodeMoney: 0.2, HackExpGain: 0.25, - DaedalusAugsRequirement: 1.166, // Results in 35 Augs neede, + DaedalusAugsRequirement: 35, PurchasedServerSoftcap: 2, StaneksGiftPowerMultiplier: 0.5, StaneksGiftExtraSize: 2, @@ -761,7 +632,7 @@ export function getBitNodeMultipliers(n: number, lvl: number): IBitNodeMultiplie HackExpGain: 0.25, FourSigmaMarketDataCost: 2, FourSigmaMarketDataApiCost: 2, - DaedalusAugsRequirement: 1.166, // Results in 35 Augs neede, + DaedalusAugsRequirement: 35, PurchasedServerSoftcap: 2, StaneksGiftPowerMultiplier: 0.9, StaneksGiftExtraSize: -1, @@ -880,9 +751,7 @@ export function getBitNodeMultipliers(n: number, lvl: number): IBitNodeMultiplie const dec = 1 / inc; return Object.assign(mults, { - // Multiplier for number of augs needed for Daedalus increases - // up to a maximum of 1.34, which results in 40 Augs required - DaedalusAugsRequirement: Math.min(inc, 1.34), + DaedalusAugsRequirement: Math.floor(Math.min(mults.DaedalusAugsRequirement + inc, 40)), HackingLevelMultiplier: dec, StrengthLevelMultiplier: dec, diff --git a/src/BitNode/ui/BitnodeMultipliersDescription.tsx b/src/BitNode/ui/BitnodeMultipliersDescription.tsx new file mode 100644 index 000000000..384cd094f --- /dev/null +++ b/src/BitNode/ui/BitnodeMultipliersDescription.tsx @@ -0,0 +1,554 @@ +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 React from "react"; +import { use } from "../../ui/Context"; +import { defaultMultipliers, getBitNodeMultipliers } from "../BitNode"; +import { IBitNodeMultipliers } from "../BitNodeMultipliers"; +import { SpecialServers } from "../../Server/data/SpecialServers"; + +interface IProps { + n: number; +} + +export function BitnodeMultiplierDescription({ n }: IProps): React.ReactElement { + const player = use.Player(); + const [open, setOpen] = React.useState(false); + const mults = getBitNodeMultipliers(n, player.sourceFileLvl(n)); + if (n === 1) return <>; + + return ( + <> +
+ + setOpen((old) => !old)}> + Bitnode multipliers:} /> + {open ? : } + + + + + + + + + + + + + + + + + +
+
+
+
+ + ); +} + +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)} + ) : ( + <> + )} + + + ); +} + +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)} + ) : ( + <> + )} + + + ); +} + +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)} + ) : ( + <> + )} + + + ); +} + +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)} + ) : ( + <> + )} + + + ); +} + +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)} + ) : ( + <> + )} + + + ); +} + +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)} + ) : ( + <> + )} + + + ); +} + +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)} + ) : ( + <> + )} + + + ); +} + +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 <>; + + 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)} + ) : ( + <> + )} + + + ); +} + +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)} + ) : ( + <> + )} + + + ); +} + +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)} + ) : ( + <> + )} + + + ); +} + +function BladeburnerMults({ n, 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)} + ) : ( + <> + )} + + + ); +} + +function StanekMults({ n, 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 <>; + + 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} + ) : ( + <> + )} + + + ); +} + +function GangMults({ n, 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)} + ) : ( + <> + )} + + + ); +} + +function CorporationMults({ n, 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 <>; + + return ( + <> +
+ Corporation: + + {mults.CorporationSoftCap !== defaultMultipliers.CorporationSoftCap ? ( + Softcap: {mults.CorporationSoftCap.toFixed(3)} + ) : ( + <> + )} + {mults.CorporationValuation !== defaultMultipliers.CorporationValuation ? ( + Valuation: x{mults.CorporationValuation.toFixed(3)} + ) : ( + <> + )} + + + ); +} diff --git a/src/BitNode/ui/PortalModal.tsx b/src/BitNode/ui/PortalModal.tsx index d90460b89..b3791fe83 100644 --- a/src/BitNode/ui/PortalModal.tsx +++ b/src/BitNode/ui/PortalModal.tsx @@ -6,6 +6,7 @@ import { use } from "../../ui/Context"; import { Modal } from "../../ui/React/Modal"; import Typography from "@mui/material/Typography"; import Button from "@mui/material/Button"; +import { BitnodeMultiplierDescription } from "./BitnodeMultipliersDescription"; interface IProps { open: boolean; @@ -40,6 +41,7 @@ export function PortalModal(props: IProps): React.ReactElement {

{bitNode.info} +