/** * React Component for the Hacknet Node UI. * This Component displays the panel for a single Hacknet Node */ import React from "react"; import { HacknetServerConstants } from "../data/Constants"; import { getMaxNumberLevelUpgrades, getMaxNumberRamUpgrades, getMaxNumberCoreUpgrades, getMaxNumberCacheUpgrades, purchaseLevelUpgrade, purchaseRamUpgrade, purchaseCoreUpgrade, purchaseCacheUpgrade, updateHashManagerCapacity, } from "../HacknetHelpers"; import { Player } from "@player"; import { HacknetServer } from "../HacknetServer"; import { Money } from "../../ui/React/Money"; import { Hashes } from "../../ui/React/Hashes"; import { HashRate } from "../../ui/React/HashRate"; import Typography from "@mui/material/Typography"; import Grid from "@mui/material/Grid"; import Paper from "@mui/material/Paper"; import Button from "@mui/material/Button"; import { TableCell } from "../../ui/React/Table"; import TableBody from "@mui/material/TableBody"; import Table from "@mui/material/Table"; import TableRow from "@mui/material/TableRow"; import { formatRam } from "../../ui/formatNumber"; import { calculateHashGainRate } from "../formulas/HacknetServers"; import Tooltip from "@mui/material/Tooltip"; interface IProps { node: HacknetServer; purchaseMultiplier: number | string; rerender: () => void; } export function HacknetServerElem(props: IProps): React.ReactElement { const node = props.node; const purchaseMult = props.purchaseMultiplier; const rerender = props.rerender; // Upgrade Level Button let upgradeLevelButton; if (node.level >= HacknetServerConstants.MaxLevel) { upgradeLevelButton = ; } else { let multiplier = 0; if (purchaseMult === "MAX") { multiplier = getMaxNumberLevelUpgrades(node, HacknetServerConstants.MaxLevel); } else { const levelsToMax = HacknetServerConstants.MaxLevel - node.level; multiplier = Math.min(levelsToMax, purchaseMult as number); } const base_increase = calculateHashGainRate(node.level + multiplier, 0, node.maxRam, node.cores, Player.mults.hacknet_node_money) - calculateHashGainRate(node.level, 0, node.maxRam, node.cores, Player.mults.hacknet_node_money); const modded_increase = (base_increase * (node.maxRam - node.ramUsed)) / node.maxRam; const upgradeLevelCost = node.calculateLevelUpgradeCost(multiplier, Player.mults.hacknet_node_level_cost); upgradeLevelButton = ( + (effective increase, taking current RAM usage into account)
+ {" "} (base increase, attained when no script is running) } >
); } function upgradeLevelOnClick(): void { let numUpgrades = purchaseMult; if (purchaseMult === "MAX") { numUpgrades = getMaxNumberLevelUpgrades(node, HacknetServerConstants.MaxLevel); } purchaseLevelUpgrade(node, numUpgrades as number); rerender(); } function upgradeRamOnClick(): void { let numUpgrades = purchaseMult; if (purchaseMult === "MAX") { numUpgrades = getMaxNumberRamUpgrades(node, HacknetServerConstants.MaxRam); } purchaseRamUpgrade(node, numUpgrades as number); rerender(); } // Upgrade RAM Button let upgradeRamButton; if (node.maxRam >= HacknetServerConstants.MaxRam) { upgradeRamButton = ; } else { let multiplier = 0; if (purchaseMult === "MAX") { multiplier = getMaxNumberRamUpgrades(node, HacknetServerConstants.MaxRam); } else { const levelsToMax = Math.round(Math.log2(HacknetServerConstants.MaxRam / node.maxRam)); multiplier = Math.min(levelsToMax, purchaseMult as number); } const base_increase = calculateHashGainRate( node.level, 0, node.maxRam * Math.pow(2, multiplier), node.cores, Player.mults.hacknet_node_money, ) - calculateHashGainRate(node.level, 0, node.maxRam, node.cores, Player.mults.hacknet_node_money); const modded_increase = calculateHashGainRate( node.level, node.ramUsed, node.maxRam * Math.pow(2, multiplier), node.cores, Player.mults.hacknet_node_money, ) - calculateHashGainRate(node.level, node.ramUsed, node.maxRam, node.cores, Player.mults.hacknet_node_money); const upgradeRamCost = node.calculateRamUpgradeCost(multiplier, Player.mults.hacknet_node_ram_cost); upgradeRamButton = ( + (effective increase, taking current RAM usage into account)
+ {" "} (base increase, attained when no script is running) } >
); } function upgradeCoresOnClick(): void { let numUpgrades = purchaseMult; if (purchaseMult === "MAX") { numUpgrades = getMaxNumberCoreUpgrades(node, HacknetServerConstants.MaxCores); } purchaseCoreUpgrade(node, numUpgrades as number); rerender(); } // Upgrade Cores Button let upgradeCoresButton; if (node.cores >= HacknetServerConstants.MaxCores) { upgradeCoresButton = ; } else { let multiplier = 0; if (purchaseMult === "MAX") { multiplier = getMaxNumberCoreUpgrades(node, HacknetServerConstants.MaxCores); } else { const levelsToMax = HacknetServerConstants.MaxCores - node.cores; multiplier = Math.min(levelsToMax, purchaseMult as number); } const base_increase = calculateHashGainRate(node.level, 0, node.maxRam, node.cores + multiplier, Player.mults.hacknet_node_money) - calculateHashGainRate(node.level, 0, node.maxRam, node.cores, Player.mults.hacknet_node_money); const modded_increase = (base_increase * (node.maxRam - node.ramUsed)) / node.maxRam; const upgradeCoreCost = node.calculateCoreUpgradeCost(multiplier, Player.mults.hacknet_node_core_cost); upgradeCoresButton = ( + (effective increase, taking current RAM usage into account)
+ {" "} (base increase, attained when no script is running) } >
); } // Upgrade Cache button let upgradeCacheButton; if (node.cache >= HacknetServerConstants.MaxCache) { upgradeCacheButton = ; } else { let multiplier = 0; if (purchaseMult === "MAX") { multiplier = getMaxNumberCacheUpgrades(node, HacknetServerConstants.MaxCache); } else { const levelsToMax = HacknetServerConstants.MaxCache - node.cache; multiplier = Math.min(levelsToMax, purchaseMult as number); } const increase = 32 * Math.pow(2, node.cache + multiplier) - node.hashCapacity; const upgradeCacheCost = node.calculateCacheUpgradeCost(multiplier); upgradeCacheButton = ( + hashes } > ); } function upgradeCacheOnClick(): void { let numUpgrades = purchaseMult; if (purchaseMult === "MAX") { numUpgrades = getMaxNumberCacheUpgrades(node, HacknetServerConstants.MaxCache); } purchaseCacheUpgrade(node, numUpgrades as number); rerender(); updateHashManagerCapacity(); } return ( {node.hostname} Production: hashes produced by this server since last augment installation.
current production rate.
{" "} max production rate. (achieved when 100% RAM is allocated to it)
{formatRam(node.ramUsed)} / {formatRam(node.maxRam)} ( {Math.round((100 * node.ramUsed) / node.maxRam)}%) RAM allocated to script.
{formatRam(node.maxRam - node.ramUsed)} / {formatRam(node.maxRam)} ( {Math.round((100 * (node.maxRam - node.ramUsed)) / node.maxRam)}%) RAM allocated to hash production. } > ()
Hash Capacity: Level: {node.level} {upgradeLevelButton} RAM: {formatRam(node.maxRam)} {upgradeRamButton} Cores: {node.cores} {upgradeCoresButton} Cache Level: {node.cache} {upgradeCacheButton}
); }