2021-09-10 21:08:51 +02:00
|
|
|
import React, { useState, useEffect } from "react";
|
2021-03-07 21:58:52 +01:00
|
|
|
|
|
|
|
import { numeralWrapper } from "../ui/numeralFormat";
|
|
|
|
import { BitNodes } from "../BitNode/BitNode";
|
|
|
|
import { IPlayer } from "../PersonObjects/IPlayer";
|
|
|
|
import { MoneySourceTracker } from "../utils/MoneySourceTracker";
|
|
|
|
import { dialogBoxCreate } from "../../utils/DialogBox";
|
|
|
|
import { convertTimeMsToTimeElapsedString } from "../../utils/StringHelperFunctions";
|
|
|
|
import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers";
|
|
|
|
import { SourceFileFlags } from "../SourceFile/SourceFileFlags";
|
|
|
|
import { getPurchaseServerLimit } from "../Server/ServerPurchases";
|
2021-03-31 06:45:21 +02:00
|
|
|
import { HacknetServerConstants } from "../Hacknet/data/Constants";
|
|
|
|
import { StatsTable } from "./React/StatsTable";
|
|
|
|
import { Money } from "./React/Money";
|
2021-03-07 21:58:52 +01:00
|
|
|
|
2021-09-10 21:08:51 +02:00
|
|
|
interface IProps {
|
|
|
|
player: IPlayer;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function CharacterInfo(props: IProps): React.ReactElement {
|
|
|
|
const setRerender = useState(false)[1];
|
|
|
|
function rerender(): void {
|
|
|
|
setRerender((old) => !old);
|
|
|
|
}
|
|
|
|
const [divisionName, setDivisionName] = useState("Overview");
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
const id = setInterval(rerender, 20);
|
|
|
|
return () => clearInterval(id);
|
|
|
|
}, []);
|
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
function LastEmployer(): React.ReactElement {
|
2021-09-10 21:08:51 +02:00
|
|
|
if (props.player.companyName) {
|
2021-09-05 01:09:30 +02:00
|
|
|
return (
|
|
|
|
<>
|
2021-09-10 21:08:51 +02:00
|
|
|
<span>Employer at which you last worked: {props.player.companyName}</span>
|
2021-09-05 01:09:30 +02:00
|
|
|
<br />
|
|
|
|
</>
|
|
|
|
);
|
2021-03-07 21:58:52 +01:00
|
|
|
}
|
2021-09-05 01:09:30 +02:00
|
|
|
return <></>;
|
|
|
|
}
|
|
|
|
function LastJob(): React.ReactElement {
|
2021-09-10 21:08:51 +02:00
|
|
|
if (props.player.companyName !== "") {
|
2021-09-05 01:09:30 +02:00
|
|
|
return (
|
|
|
|
<>
|
2021-09-10 21:08:51 +02:00
|
|
|
<span>Job you last worked: {props.player.jobs[props.player.companyName]}</span>
|
2021-09-05 01:09:30 +02:00
|
|
|
<br />
|
|
|
|
</>
|
|
|
|
);
|
2021-03-07 21:58:52 +01:00
|
|
|
}
|
2021-09-05 01:09:30 +02:00
|
|
|
return <></>;
|
|
|
|
}
|
|
|
|
function Employers(): React.ReactElement {
|
2021-09-10 21:08:51 +02:00
|
|
|
if (props.player.jobs && Object.keys(props.player.jobs).length !== 0)
|
2021-09-05 01:09:30 +02:00
|
|
|
return (
|
|
|
|
<>
|
|
|
|
<span>All Employers:</span>
|
|
|
|
<br />
|
|
|
|
<ul>
|
2021-09-10 21:08:51 +02:00
|
|
|
{Object.keys(props.player.jobs).map((j) => (
|
2021-09-05 01:09:30 +02:00
|
|
|
<li key={j}> * {j}</li>
|
|
|
|
))}
|
|
|
|
</ul>
|
|
|
|
<br />
|
|
|
|
<br />
|
|
|
|
</>
|
|
|
|
);
|
|
|
|
return <></>;
|
|
|
|
}
|
2021-03-07 21:58:52 +01:00
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
function Hacknet(): React.ReactElement {
|
|
|
|
// Can't import HacknetHelpers for some reason.
|
2021-09-10 21:08:51 +02:00
|
|
|
if (!(props.player.bitNodeN === 9 || SourceFileFlags[9] > 0)) {
|
2021-09-05 01:09:30 +02:00
|
|
|
return (
|
|
|
|
<>
|
2021-09-10 21:08:51 +02:00
|
|
|
<span>{`Hacknet Nodes owned: ${props.player.hacknetNodes.length}`}</span>
|
2021-09-05 01:09:30 +02:00
|
|
|
<br />
|
|
|
|
</>
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
return (
|
|
|
|
<>
|
2021-09-10 21:08:51 +02:00
|
|
|
<span>{`Hacknet Servers owned: ${props.player.hacknetNodes.length} / ${HacknetServerConstants.MaxServers}`}</span>
|
2021-09-05 01:09:30 +02:00
|
|
|
<br />
|
|
|
|
</>
|
|
|
|
);
|
2021-03-31 06:45:21 +02:00
|
|
|
}
|
2021-09-05 01:09:30 +02:00
|
|
|
}
|
2021-03-31 06:45:21 +02:00
|
|
|
|
2021-09-09 05:47:34 +02:00
|
|
|
function convertMoneySourceTrackerToString(src: MoneySourceTracker): React.ReactElement {
|
2021-09-05 01:09:30 +02:00
|
|
|
const parts: any[][] = [[`Total:`, <Money money={src.total} />]];
|
|
|
|
if (src.bladeburner) {
|
|
|
|
parts.push([`Bladeburner:`, <Money money={src.bladeburner} />]);
|
2021-03-07 21:58:52 +01:00
|
|
|
}
|
2021-09-05 01:09:30 +02:00
|
|
|
if (src.codingcontract) {
|
|
|
|
parts.push([`Coding Contracts:`, <Money money={src.codingcontract} />]);
|
2021-03-07 21:58:52 +01:00
|
|
|
}
|
2021-09-05 01:09:30 +02:00
|
|
|
if (src.work) {
|
|
|
|
parts.push([`Company Work:`, <Money money={src.work} />]);
|
|
|
|
}
|
|
|
|
if (src.class) {
|
|
|
|
parts.push([`Class:`, <Money money={src.class} />]);
|
|
|
|
}
|
|
|
|
if (src.corporation) {
|
|
|
|
parts.push([`Corporation:`, <Money money={src.corporation} />]);
|
|
|
|
}
|
|
|
|
if (src.crime) {
|
|
|
|
parts.push([`Crimes:`, <Money money={src.crime} />]);
|
|
|
|
}
|
|
|
|
if (src.gang) {
|
|
|
|
parts.push([`Gang:`, <Money money={src.gang} />]);
|
|
|
|
}
|
|
|
|
if (src.hacking) {
|
|
|
|
parts.push([`Hacking:`, <Money money={src.hacking} />]);
|
|
|
|
}
|
|
|
|
if (src.hacknetnode) {
|
|
|
|
parts.push([`Hacknet Nodes:`, <Money money={src.hacknetnode} />]);
|
|
|
|
}
|
|
|
|
if (src.hospitalization) {
|
|
|
|
parts.push([`Hospitalization:`, <Money money={src.hospitalization} />]);
|
|
|
|
}
|
|
|
|
if (src.infiltration) {
|
|
|
|
parts.push([`Infiltration:`, <Money money={src.infiltration} />]);
|
|
|
|
}
|
|
|
|
if (src.stock) {
|
|
|
|
parts.push([`Stock Market:`, <Money money={src.stock} />]);
|
|
|
|
}
|
|
|
|
if (src.casino) {
|
|
|
|
parts.push([`Casino:`, <Money money={src.casino} />]);
|
|
|
|
}
|
|
|
|
if (src.sleeves) {
|
|
|
|
parts.push([`Sleeves:`, <Money money={src.sleeves} />]);
|
2021-03-07 21:58:52 +01:00
|
|
|
}
|
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
return StatsTable(parts);
|
|
|
|
}
|
|
|
|
|
|
|
|
function openMoneyModal(): void {
|
|
|
|
let content = (
|
|
|
|
<>
|
|
|
|
<u>Money earned since you last installed Augmentations:</u>
|
|
|
|
<br />
|
2021-09-10 21:08:51 +02:00
|
|
|
{convertMoneySourceTrackerToString(props.player.moneySourceA)}
|
2021-09-05 01:09:30 +02:00
|
|
|
</>
|
|
|
|
);
|
2021-09-10 21:08:51 +02:00
|
|
|
if (props.player.sourceFiles.length !== 0) {
|
2021-09-05 01:09:30 +02:00
|
|
|
content = (
|
|
|
|
<>
|
|
|
|
{content}
|
|
|
|
<br />
|
|
|
|
<br />
|
|
|
|
<u>Money earned in this BitNode:</u>
|
|
|
|
<br />
|
2021-09-10 21:08:51 +02:00
|
|
|
{convertMoneySourceTrackerToString(props.player.moneySourceB)}
|
2021-03-07 21:58:52 +01:00
|
|
|
</>
|
2021-09-05 01:09:30 +02:00
|
|
|
);
|
2021-03-07 21:58:52 +01:00
|
|
|
}
|
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
dialogBoxCreate(content, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
function Intelligence(): React.ReactElement {
|
2021-09-10 21:08:51 +02:00
|
|
|
if (props.player.intelligence > 0 && (props.player.bitNodeN === 5 || SourceFileFlags[5] > 0)) {
|
2021-09-05 01:09:30 +02:00
|
|
|
return (
|
|
|
|
<tr key="5">
|
|
|
|
<td>Intelligence:</td>
|
2021-09-10 21:08:51 +02:00
|
|
|
<td style={{ textAlign: "right" }}>{numeralWrapper.formatSkill(props.player.intelligence)}</td>
|
2021-09-05 01:09:30 +02:00
|
|
|
</tr>
|
|
|
|
);
|
2021-05-08 03:24:16 +02:00
|
|
|
}
|
2021-09-05 01:09:30 +02:00
|
|
|
return <></>;
|
|
|
|
}
|
2021-05-08 03:24:16 +02:00
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
function MultiplierTable(props: any): React.ReactElement {
|
|
|
|
function bn5Stat(r: any): JSX.Element {
|
|
|
|
if (SourceFileFlags[5] > 0 && r.length > 2 && r[1] != r[2]) {
|
|
|
|
return (
|
|
|
|
<td key="2" style={{ textAlign: "right" }}>
|
|
|
|
{" "}
|
|
|
|
({numeralWrapper.formatPercentage(r[2])})
|
|
|
|
</td>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return <></>;
|
|
|
|
}
|
|
|
|
return (
|
|
|
|
<>
|
|
|
|
<table>
|
|
|
|
<tbody>
|
|
|
|
{props.rows.map((r: any) => (
|
|
|
|
<tr key={r[0]}>
|
|
|
|
<td key="0">{`${r[0]} multiplier:`}</td>
|
|
|
|
<td key="1" style={{ textAlign: "right", paddingLeft: "5px" }}>
|
|
|
|
{numeralWrapper.formatPercentage(r[1])}
|
|
|
|
</td>
|
|
|
|
{bn5Stat(r)}
|
|
|
|
</tr>
|
|
|
|
))}
|
|
|
|
</tbody>
|
|
|
|
</table>
|
|
|
|
</>
|
|
|
|
);
|
|
|
|
}
|
2021-03-07 21:58:52 +01:00
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
function BladeburnerMults(): React.ReactElement {
|
2021-09-10 21:08:51 +02:00
|
|
|
if (!props.player.canAccessBladeburner()) return <></>;
|
2021-09-05 01:09:30 +02:00
|
|
|
return (
|
|
|
|
<>
|
|
|
|
<MultiplierTable
|
|
|
|
rows={[
|
2021-09-10 21:08:51 +02:00
|
|
|
["Bladeburner Success Chance", props.player.bladeburner_max_stamina_mult],
|
|
|
|
["Bladeburner Max Stamina", props.player.bladeburner_stamina_gain_mult],
|
|
|
|
["Bladeburner Stamina Gain", props.player.bladeburner_analysis_mult],
|
|
|
|
["Bladeburner Field Analysis", props.player.bladeburner_success_chance_mult],
|
2021-09-05 01:09:30 +02:00
|
|
|
]}
|
|
|
|
/>
|
|
|
|
<br />
|
|
|
|
</>
|
|
|
|
);
|
|
|
|
}
|
2021-03-07 21:58:52 +01:00
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
function CurrentBitNode(): React.ReactElement {
|
2021-09-10 21:08:51 +02:00
|
|
|
if (props.player.sourceFiles.length > 0) {
|
|
|
|
const index = "BitNode" + props.player.bitNodeN;
|
2021-09-05 01:09:30 +02:00
|
|
|
return (
|
|
|
|
<>
|
|
|
|
<span>
|
2021-09-10 21:08:51 +02:00
|
|
|
Current BitNode: {props.player.bitNodeN} ({BitNodes[index].name})
|
2021-09-05 01:09:30 +02:00
|
|
|
</span>
|
|
|
|
<br />
|
|
|
|
<br />
|
|
|
|
<div style={{ width: "60%", fontSize: "13px", marginLeft: "4%" }}>
|
|
|
|
{BitNodes[index].info.split("<br>").map((t, i) => (
|
|
|
|
<div key={i}>
|
2021-09-09 05:47:34 +02:00
|
|
|
<span style={{ whiteSpace: "pre-wrap", overflowWrap: "break-word" }}>{t}</span>
|
2021-09-05 01:09:30 +02:00
|
|
|
<br />
|
|
|
|
</div>
|
|
|
|
))}
|
|
|
|
</div>
|
|
|
|
</>
|
|
|
|
);
|
2021-03-07 21:58:52 +01:00
|
|
|
}
|
|
|
|
|
2021-09-05 01:09:30 +02:00
|
|
|
return <></>;
|
|
|
|
}
|
2021-03-31 06:45:21 +02:00
|
|
|
|
2021-09-10 21:08:51 +02:00
|
|
|
const timeRows = [
|
|
|
|
["Time played since last Augmentation:", convertTimeMsToTimeElapsedString(props.player.playtimeSinceLastAug)],
|
|
|
|
];
|
|
|
|
if (props.player.sourceFiles.length > 0) {
|
2021-09-05 01:09:30 +02:00
|
|
|
timeRows.push([
|
|
|
|
"Time played since last Bitnode destroyed:",
|
2021-09-10 21:08:51 +02:00
|
|
|
convertTimeMsToTimeElapsedString(props.player.playtimeSinceLastBitnode),
|
2021-09-05 01:09:30 +02:00
|
|
|
]);
|
|
|
|
}
|
2021-09-10 21:08:51 +02:00
|
|
|
timeRows.push(["Total Time played:", convertTimeMsToTimeElapsedString(props.player.totalPlaytime)]);
|
2021-09-05 01:09:30 +02:00
|
|
|
|
|
|
|
return (
|
2021-09-10 23:29:07 +02:00
|
|
|
<div id="character-container">
|
|
|
|
<pre>
|
|
|
|
<b>General</b>
|
|
|
|
<br />
|
|
|
|
<br />
|
|
|
|
<span>Current City: {props.player.city}</span>
|
|
|
|
<br />
|
|
|
|
<LastEmployer />
|
|
|
|
<LastJob />
|
|
|
|
<Employers />
|
|
|
|
<span>
|
|
|
|
Money: <Money money={props.player.money.toNumber()} />
|
|
|
|
</span>
|
|
|
|
<button
|
|
|
|
className="popup-box-button"
|
|
|
|
style={{ display: "inline-block", float: "none" }}
|
|
|
|
onClick={openMoneyModal}
|
|
|
|
>
|
|
|
|
Money Statistics & Breakdown
|
|
|
|
</button>
|
|
|
|
<br />
|
|
|
|
<br />
|
|
|
|
<b>Stats</b>
|
|
|
|
<table>
|
|
|
|
<tbody>
|
|
|
|
<tr key="0">
|
|
|
|
<td key="0">Hacking:</td>
|
|
|
|
<td key="1" style={{ textAlign: "right" }}>
|
|
|
|
{numeralWrapper.formatSkill(props.player.hacking_skill)}
|
|
|
|
</td>
|
|
|
|
<td key="2" style={{ textAlign: "right" }}>
|
|
|
|
({numeralWrapper.formatExp(props.player.hacking_exp)} exp)
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr key="1">
|
|
|
|
<td key="0">Strength:</td>
|
|
|
|
<td key="1" style={{ textAlign: "right" }}>
|
|
|
|
{numeralWrapper.formatSkill(props.player.strength)}
|
|
|
|
</td>
|
|
|
|
<td key="2" style={{ textAlign: "right" }}>
|
|
|
|
({numeralWrapper.formatExp(props.player.strength_exp)} exp)
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr key="2">
|
|
|
|
<td key="0">Defense:</td>
|
|
|
|
<td key="1" style={{ textAlign: "right" }}>
|
|
|
|
{numeralWrapper.formatSkill(props.player.defense)}
|
|
|
|
</td>
|
|
|
|
<td key="2" style={{ textAlign: "right" }}>
|
|
|
|
({numeralWrapper.formatExp(props.player.defense_exp)} exp)
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr key="3">
|
|
|
|
<td key="0">Dexterity:</td>
|
|
|
|
<td key="1" style={{ textAlign: "right" }}>
|
|
|
|
{numeralWrapper.formatSkill(props.player.dexterity)}
|
|
|
|
</td>
|
|
|
|
<td key="2" style={{ textAlign: "right" }}>
|
|
|
|
({numeralWrapper.formatExp(props.player.dexterity_exp)} exp)
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr key="4">
|
|
|
|
<td key="0">Agility:</td>
|
|
|
|
<td key="1" style={{ textAlign: "right" }}>
|
|
|
|
{numeralWrapper.formatSkill(props.player.agility)}
|
|
|
|
</td>
|
|
|
|
<td key="2" style={{ textAlign: "right" }}>
|
|
|
|
({numeralWrapper.formatExp(props.player.agility_exp)} exp)
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr key="5">
|
|
|
|
<td key="0">Charisma:</td>
|
|
|
|
<td key="1" style={{ textAlign: "right" }}>
|
|
|
|
{numeralWrapper.formatSkill(props.player.charisma)}
|
|
|
|
</td>
|
|
|
|
<td key="2" style={{ textAlign: "right" }}>
|
|
|
|
({numeralWrapper.formatExp(props.player.charisma_exp)} exp)
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<Intelligence />
|
|
|
|
</tbody>
|
|
|
|
</table>
|
|
|
|
<br />
|
|
|
|
<MultiplierTable
|
|
|
|
rows={[
|
|
|
|
["Hacking Chance", props.player.hacking_chance_mult],
|
|
|
|
["Hacking Speed", props.player.hacking_speed_mult],
|
|
|
|
[
|
|
|
|
"Hacking Money",
|
|
|
|
props.player.hacking_money_mult,
|
|
|
|
props.player.hacking_money_mult * BitNodeMultipliers.ScriptHackMoney,
|
|
|
|
],
|
|
|
|
[
|
|
|
|
"Hacking Growth",
|
|
|
|
props.player.hacking_grow_mult,
|
|
|
|
props.player.hacking_grow_mult * BitNodeMultipliers.ServerGrowthRate,
|
|
|
|
],
|
|
|
|
]}
|
|
|
|
/>
|
|
|
|
<br />
|
|
|
|
<MultiplierTable
|
|
|
|
rows={[
|
|
|
|
[
|
|
|
|
"Hacking Level",
|
|
|
|
props.player.hacking_mult,
|
|
|
|
props.player.hacking_mult * BitNodeMultipliers.HackingLevelMultiplier,
|
|
|
|
],
|
|
|
|
[
|
|
|
|
"Hacking Experience",
|
|
|
|
props.player.hacking_exp_mult,
|
|
|
|
props.player.hacking_exp_mult * BitNodeMultipliers.HackExpGain,
|
|
|
|
],
|
|
|
|
]}
|
|
|
|
/>
|
|
|
|
<br />
|
2021-03-07 21:58:52 +01:00
|
|
|
|
2021-09-10 23:29:07 +02:00
|
|
|
<MultiplierTable
|
|
|
|
rows={[
|
|
|
|
[
|
|
|
|
"Strength Level",
|
|
|
|
props.player.strength_mult,
|
|
|
|
props.player.strength_mult * BitNodeMultipliers.StrengthLevelMultiplier,
|
|
|
|
],
|
|
|
|
["Strength Experience", props.player.strength_exp_mult],
|
|
|
|
]}
|
|
|
|
/>
|
|
|
|
<br />
|
2021-03-07 21:58:52 +01:00
|
|
|
|
2021-09-10 23:29:07 +02:00
|
|
|
<MultiplierTable
|
|
|
|
rows={[
|
|
|
|
[
|
|
|
|
"Defense Level",
|
|
|
|
props.player.defense_mult,
|
|
|
|
props.player.defense_mult * BitNodeMultipliers.DefenseLevelMultiplier,
|
|
|
|
],
|
|
|
|
["Defense Experience", props.player.defense_exp_mult],
|
|
|
|
]}
|
|
|
|
/>
|
|
|
|
<br />
|
2021-03-07 21:58:52 +01:00
|
|
|
|
2021-09-10 23:29:07 +02:00
|
|
|
<MultiplierTable
|
|
|
|
rows={[
|
|
|
|
[
|
|
|
|
"Dexterity Level",
|
|
|
|
props.player.dexterity_mult,
|
|
|
|
props.player.dexterity_mult * BitNodeMultipliers.DexterityLevelMultiplier,
|
|
|
|
],
|
|
|
|
["Dexterity Experience", props.player.dexterity_exp_mult],
|
|
|
|
]}
|
|
|
|
/>
|
|
|
|
<br />
|
2021-03-07 21:58:52 +01:00
|
|
|
|
2021-09-10 23:29:07 +02:00
|
|
|
<MultiplierTable
|
|
|
|
rows={[
|
|
|
|
[
|
|
|
|
"Agility Level",
|
|
|
|
props.player.agility_mult,
|
|
|
|
props.player.agility_mult * BitNodeMultipliers.AgilityLevelMultiplier,
|
|
|
|
],
|
|
|
|
["Agility Experience", props.player.agility_exp_mult],
|
|
|
|
]}
|
|
|
|
/>
|
|
|
|
<br />
|
2021-03-07 21:58:52 +01:00
|
|
|
|
2021-09-10 23:29:07 +02:00
|
|
|
<MultiplierTable
|
|
|
|
rows={[
|
|
|
|
[
|
|
|
|
"Charisma Level",
|
|
|
|
props.player.charisma_mult,
|
|
|
|
props.player.charisma_mult * BitNodeMultipliers.CharismaLevelMultiplier,
|
|
|
|
],
|
|
|
|
["Charisma Experience", props.player.charisma_exp_mult],
|
|
|
|
]}
|
|
|
|
/>
|
|
|
|
<br />
|
2021-03-07 21:58:52 +01:00
|
|
|
|
2021-09-10 23:29:07 +02:00
|
|
|
<MultiplierTable
|
|
|
|
rows={[
|
|
|
|
[
|
|
|
|
"Hacknet Node production",
|
|
|
|
props.player.hacknet_node_money_mult,
|
|
|
|
props.player.hacknet_node_money_mult * BitNodeMultipliers.HacknetNodeMoney,
|
|
|
|
],
|
|
|
|
["Hacknet Node purchase cost", props.player.hacknet_node_purchase_cost_mult],
|
|
|
|
["Hacknet Node RAM upgrade cost", props.player.hacknet_node_ram_cost_mult],
|
|
|
|
["Hacknet Node Core purchase cost", props.player.hacknet_node_core_cost_mult],
|
|
|
|
["Hacknet Node level upgrade cost", props.player.hacknet_node_level_cost_mult],
|
|
|
|
]}
|
|
|
|
/>
|
|
|
|
<br />
|
2021-03-07 21:58:52 +01:00
|
|
|
|
2021-09-10 23:29:07 +02:00
|
|
|
<MultiplierTable
|
|
|
|
rows={[
|
|
|
|
["Company reputation gain", props.player.company_rep_mult],
|
|
|
|
[
|
|
|
|
"Faction reputation gain",
|
|
|
|
props.player.faction_rep_mult,
|
|
|
|
props.player.faction_rep_mult * BitNodeMultipliers.FactionWorkRepGain,
|
|
|
|
],
|
|
|
|
[
|
|
|
|
"Salary",
|
|
|
|
props.player.work_money_mult,
|
|
|
|
props.player.work_money_mult * BitNodeMultipliers.CompanyWorkMoney,
|
|
|
|
],
|
|
|
|
]}
|
|
|
|
/>
|
|
|
|
<br />
|
2021-03-07 21:58:52 +01:00
|
|
|
|
2021-09-10 23:29:07 +02:00
|
|
|
<MultiplierTable
|
|
|
|
rows={[
|
|
|
|
["Crime success", props.player.crime_success_mult],
|
|
|
|
[
|
|
|
|
"Crime money",
|
|
|
|
props.player.crime_money_mult,
|
|
|
|
props.player.crime_money_mult * BitNodeMultipliers.CrimeMoney,
|
|
|
|
],
|
|
|
|
]}
|
|
|
|
/>
|
|
|
|
<br />
|
2021-05-08 03:24:16 +02:00
|
|
|
|
2021-09-10 23:29:07 +02:00
|
|
|
<BladeburnerMults />
|
|
|
|
<br />
|
2021-03-07 21:58:52 +01:00
|
|
|
|
2021-09-10 23:29:07 +02:00
|
|
|
<b>Misc.</b>
|
|
|
|
<br />
|
|
|
|
<br />
|
|
|
|
<span>{`Servers owned: ${props.player.purchasedServers.length} / ${getPurchaseServerLimit()}`}</span>
|
|
|
|
<br />
|
|
|
|
<Hacknet />
|
|
|
|
<span>{`Augmentations installed: ${props.player.augmentations.length}`}</span>
|
|
|
|
<br />
|
|
|
|
<br />
|
|
|
|
{StatsTable(timeRows)}
|
|
|
|
<br />
|
|
|
|
<CurrentBitNode />
|
|
|
|
</pre>
|
|
|
|
</div>
|
2021-09-05 01:09:30 +02:00
|
|
|
);
|
|
|
|
}
|