Merge branch 'dev' of github.com:danielyxie/bitburner into dev

This commit is contained in:
Olivier Gagnon 2022-05-24 16:57:39 -04:00
commit 79e7c47b4d
13 changed files with 104 additions and 64 deletions

@ -105,7 +105,7 @@ export const initSoAAugmentations = (): Augmentation[] => [
"injects *Γ-based cells that provides general enhancement to the body.", "injects *Γ-based cells that provides general enhancement to the body.",
stats: ( stats: (
<> <>
This augmentation makes many aspect of infiltration easier and more productive. Such as increased timer, This augmentation makes many aspects of infiltration easier and more productive. Such as increased timer,
rewards, reduced damage taken, etc. rewards, reduced damage taken, etc.
</> </>
), ),
@ -117,10 +117,10 @@ export const initSoAAugmentations = (): Augmentation[] => [
repCost: 1e4, repCost: 1e4,
moneyCost: 1e6, moneyCost: 1e6,
info: info:
"Extra-occular neurons taken from old martial art master. Injecting the user the ability to " + "Extra-occular neurons taken from old martial art master. Injecting them gives the user the ability to " +
"predict enemy attack before they even know it themself.", "predict the enemy's attack before they even know it themself.",
stats: ( stats: (
<>This augmentation makes the Slash minigame easier by showing you via an indictor when the slash in coming.</> <>This augmentation makes the Slash minigame easier by showing you via an indicator when the slash in coming.</>
), ),
isSpecial: true, isSpecial: true,
factions: [FactionNames.ShadowsOfAnarchy], factions: [FactionNames.ShadowsOfAnarchy],
@ -129,7 +129,7 @@ export const initSoAAugmentations = (): Augmentation[] => [
name: AugmentationNames.WisdomOfAthena, name: AugmentationNames.WisdomOfAthena,
repCost: 1e4, repCost: 1e4,
moneyCost: 1e6, moneyCost: 1e6,
info: "A connective brain implant to SASHA that focuses in pattern recognition and predictive templating.", info: "A connective brain implant to SASHA that focuses on pattern recognition and predictive templating.",
stats: <>This augmentation makes the Bracket minigame easier by removing all '[' ']'.</>, stats: <>This augmentation makes the Bracket minigame easier by removing all '[' ']'.</>,
isSpecial: true, isSpecial: true,
factions: [FactionNames.ShadowsOfAnarchy], factions: [FactionNames.ShadowsOfAnarchy],
@ -138,7 +138,7 @@ export const initSoAAugmentations = (): Augmentation[] => [
name: AugmentationNames.ChaosOfDionysus, name: AugmentationNames.ChaosOfDionysus,
repCost: 1e4, repCost: 1e4,
moneyCost: 1e6, moneyCost: 1e6,
info: "Opto-occipito implant to process visual signal before brain interpretation.", info: "Opto-occipito implant to process visual signals before brain interpretation.",
stats: <>This augmentation makes the Backwards minigame easier by flipping the words.</>, stats: <>This augmentation makes the Backwards minigame easier by flipping the words.</>,
isSpecial: true, isSpecial: true,
factions: [FactionNames.ShadowsOfAnarchy], factions: [FactionNames.ShadowsOfAnarchy],
@ -176,7 +176,7 @@ export const initSoAAugmentations = (): Augmentation[] => [
name: AugmentationNames.HuntOfArtemis, name: AugmentationNames.HuntOfArtemis,
repCost: 1e4, repCost: 1e4,
moneyCost: 1e6, moneyCost: 1e6,
info: "magneto-turboencabulator based on technology by Micha Eike Siemon, increases the users electro-magnetic sensitivity.", info: "magneto-turboencabulator based on technology by Micha Eike Siemon, increases the user's electro-magnetic sensitivity.",
stats: ( stats: (
<> <>
This augmentation makes the Minesweeper minigame easier by showing the location of all mines and keeping their This augmentation makes the Minesweeper minigame easier by showing the location of all mines and keeping their
@ -190,7 +190,7 @@ export const initSoAAugmentations = (): Augmentation[] => [
name: AugmentationNames.KnowledgeOfApollo, name: AugmentationNames.KnowledgeOfApollo,
repCost: 1e4, repCost: 1e4,
moneyCost: 1e6, moneyCost: 1e6,
info: "Neodynic retention fjengeln spoofer using -φ karmions, net positive effect on implantees delta wave.", info: "Neodynic retention fjengeln spoofer using -φ karmions, net positive effect on implantee's delta wave.",
stats: <>This augmentation makes the Wire Cutting minigame easier by indicating the incorrect wires.</>, stats: <>This augmentation makes the Wire Cutting minigame easier by indicating the incorrect wires.</>,
isSpecial: true, isSpecial: true,
factions: [FactionNames.ShadowsOfAnarchy], factions: [FactionNames.ShadowsOfAnarchy],
@ -515,7 +515,7 @@ export const initGeneralAugmentations = (): Augmentation[] => [
info: info:
"TITN is a series of viruses that targets and alters the sequences of human DNA in genes that " + "TITN is a series of viruses that targets and alters the sequences of human DNA in genes that " +
"control personality. The TITN-41 strain alters these genes so that the subject becomes more " + "control personality. The TITN-41 strain alters these genes so that the subject becomes more " +
"outgoing and socialable.", "outgoing and sociable.",
charisma_mult: 1.15, charisma_mult: 1.15,
charisma_exp_mult: 1.15, charisma_exp_mult: 1.15,
factions: [FactionNames.Silhouette], factions: [FactionNames.Silhouette],
@ -526,9 +526,9 @@ export const initGeneralAugmentations = (): Augmentation[] => [
moneyCost: 1.375e9, moneyCost: 1.375e9,
info: info:
"A cranial implant that greatly assists in the user's ability to analyze social situations " + "A cranial implant that greatly assists in the user's ability to analyze social situations " +
"and interactions. The system uses a wide variety of factors such as facial expressions, body " + "and interactions. The system uses a wide variety of factors such as facial expression, body " +
"language, and the voice tone, and inflection to determine the best course of action during social" + "language, voice tone, and inflection to determine the best course of action during social " +
"situations. The implant also uses deep learning software to continuously learn new behavior" + "situations. The implant also uses deep learning software to continuously learn new behavior " +
"patterns and how to best respond.", "patterns and how to best respond.",
charisma_mult: 1.6, charisma_mult: 1.6,
charisma_exp_mult: 1.6, charisma_exp_mult: 1.6,
@ -988,7 +988,7 @@ export const initGeneralAugmentations = (): Augmentation[] => [
info: info:
"This is an additional installation that upgrades the functionality of the " + "This is an additional installation that upgrades the functionality of the " +
"PC Direct-Neural Interface augmentation. When connected to a computer, " + "PC Direct-Neural Interface augmentation. When connected to a computer, " +
"The Neural Network upgrade allows the user to use their own brain's " + "the Neural Network upgrade allows the user to use their own brain's " +
"processing power to aid the computer in computational tasks.", "processing power to aid the computer in computational tasks.",
prereqs: [AugmentationNames.PCDNI], prereqs: [AugmentationNames.PCDNI],
company_rep_mult: 2, company_rep_mult: 2,
@ -1172,7 +1172,7 @@ export const initGeneralAugmentations = (): Augmentation[] => [
info: info:
"A skin implant that reinforces the skin with highly-advanced synthetic cells. These " + "A skin implant that reinforces the skin with highly-advanced synthetic cells. These " +
"cells, when powered, have a negative refractive index. As a result, they bend light " + "cells, when powered, have a negative refractive index. As a result, they bend light " +
"around the skin, making the user much harder to see to the naked eye.", "around the skin, making the user much harder to see with the naked eye.",
agility_mult: 1.05, agility_mult: 1.05,
crime_money_mult: 1.1, crime_money_mult: 1.1,
factions: [FactionNames.SlumSnakes, FactionNames.Tetrads], factions: [FactionNames.SlumSnakes, FactionNames.Tetrads],
@ -1734,7 +1734,7 @@ export const initBladeburnerAugmentations = (): Augmentation[] => [
info: info:
"An improved version of Vangelis, a synthetic symbiotic virus that is " + "An improved version of Vangelis, a synthetic symbiotic virus that is " +
"injected into human brain tissue. On top of the benefits of the original " + "injected into human brain tissue. On top of the benefits of the original " +
"virus, this also grants an accelerated healing factor and enhanced " + "virus, this also grants accelerated healing and enhanced " +
"reflexes.", "reflexes.",
prereqs: [AugmentationNames.VangelisVirus], prereqs: [AugmentationNames.VangelisVirus],
defense_exp_mult: 1.1, defense_exp_mult: 1.1,
@ -1930,7 +1930,7 @@ export const initChurchOfTheMachineGodAugmentations = (): Augmentation[] => [
info: info:
"The next evolution is near, a coming together of man and machine. A synthesis greater than the birth of the human " + "The next evolution is near, a coming together of man and machine. A synthesis greater than the birth of the human " +
"organism. Time spent with the gift has allowed for acclimatization of the invasive augment and the toll it takes upon " + "organism. Time spent with the gift has allowed for acclimatization of the invasive augment and the toll it takes upon " +
"your frame granting lesser penalty of 5% to all stats.", "your frame granting a 5% reduced penalty to all stats.",
prereqs: [AugmentationNames.StaneksGift1], prereqs: [AugmentationNames.StaneksGift1],
isSpecial: true, isSpecial: true,
hacking_chance_mult: 0.95 / 0.9, hacking_chance_mult: 0.95 / 0.9,
@ -1969,7 +1969,7 @@ export const initChurchOfTheMachineGodAugmentations = (): Augmentation[] => [
info: info:
"The synthesis of human and machine is nothing to fear. It is our destiny. " + "The synthesis of human and machine is nothing to fear. It is our destiny. " +
"You will become greater than the sum of our parts. As One. Embrace your gift " + "You will become greater than the sum of our parts. As One. Embrace your gift " +
"fully and wholly free of it's accursed toll. Serenity brings tranquility the form " + "fully and wholly free of it's accursed toll. Serenity brings tranquility in the form " +
"of no longer suffering a stat penalty. ", "of no longer suffering a stat penalty. ",
prereqs: [AugmentationNames.StaneksGift2, AugmentationNames.StaneksGift1], prereqs: [AugmentationNames.StaneksGift2, AugmentationNames.StaneksGift1],
isSpecial: true, isSpecial: true,

@ -2,7 +2,7 @@
* React component for displaying a single augmentation for purchase through * React component for displaying a single augmentation for purchase through
* the faction UI * the faction UI
*/ */
import { CheckBox, CheckBoxOutlineBlank, CheckCircle, Info, NewReleases, Report } from "@mui/icons-material"; import { CheckBox, CheckBoxOutlineBlank, CheckCircle, NewReleases, Report } from "@mui/icons-material";
import { Box, Button, Container, Paper, Tooltip, Typography } from "@mui/material"; import { Box, Button, Container, Paper, Tooltip, Typography } from "@mui/material";
import React, { useState } from "react"; import React, { useState } from "react";
import { Faction } from "../../Faction/Faction"; import { Faction } from "../../Faction/Faction";
@ -11,8 +11,8 @@ import { Settings } from "../../Settings/Settings";
import { numeralWrapper } from "../../ui/numeralFormat"; import { numeralWrapper } from "../../ui/numeralFormat";
import { Augmentation } from "../Augmentation"; import { Augmentation } from "../Augmentation";
import { AugmentationNames } from "../data/AugmentationNames"; import { AugmentationNames } from "../data/AugmentationNames";
import { PurchaseAugmentationModal } from "./PurchaseAugmentationModal";
import { StaticAugmentations } from "../StaticAugmentations"; import { StaticAugmentations } from "../StaticAugmentations";
import { PurchaseAugmentationModal } from "./PurchaseAugmentationModal";
interface IPreReqsProps { interface IPreReqsProps {
player: IPlayer; player: IPlayer;
@ -42,11 +42,13 @@ const PreReqs = (props: IPreReqsProps): React.ReactElement => {
} }
> >
<Typography <Typography
variant="body2"
sx={{ sx={{
ml: 1,
fontSize: "0.9rem",
display: "flex", display: "flex",
alignItems: "center", alignItems: "center",
color: hasPreReqs ? Settings.theme.successlight : Settings.theme.error, color: hasPreReqs ? Settings.theme.successlight : Settings.theme.error,
gridArea: "prereqs",
}} }}
> >
{hasPreReqs ? ( {hasPreReqs ? (
@ -100,7 +102,10 @@ const Exclusive = (props: IExclusiveProps): React.ReactElement => {
</> </>
} }
> >
<NewReleases sx={{ ml: 1, color: Settings.theme.money, transform: "rotate(180deg)" }} /> <NewReleases
fontSize="small"
sx={{ ml: 1, color: Settings.theme.money, transform: "rotate(180deg)", gridArea: "exclusive" }}
/>
</Tooltip> </Tooltip>
); );
}; };
@ -113,7 +118,9 @@ interface IReqProps {
const Requirement = (props: IReqProps): React.ReactElement => { const Requirement = (props: IReqProps): React.ReactElement => {
return ( return (
<Typography sx={{ display: "flex", alignItems: "center", color: props.color }}> <Typography
sx={{ display: "flex", alignItems: "center", color: props.fulfilled ? props.color : Settings.theme.error }}
>
{props.fulfilled ? <CheckBox sx={{ mr: 1 }} /> : <CheckBoxOutlineBlank sx={{ mr: 1 }} />} {props.fulfilled ? <CheckBox sx={{ mr: 1 }} /> : <CheckBoxOutlineBlank sx={{ mr: 1 }} />}
{props.value} {props.value}
</Typography> </Typography>
@ -138,7 +145,7 @@ export const PurchasableAugmentations = (props: IPurchasableAugsProps): React.Re
<Container <Container
maxWidth="lg" maxWidth="lg"
disableGutters disableGutters
sx={{ mx: 0, display: "grid", gridTemplateColumns: "repeat(1, 1fr)", gap: 1 }} sx={{ mx: 0, display: "grid", gridTemplateColumns: "repeat(1, 1fr)", gap: 0.75 }}
> >
{props.augNames.map((augName: string) => ( {props.augNames.map((augName: string) => (
<PurchasableAugmentation key={augName} parent={props} augName={augName} owned={false} /> <PurchasableAugmentation key={augName} parent={props} augName={augName} owned={false} />
@ -176,11 +183,12 @@ export function PurchasableAugmentation(props: IPurchasableAugProps): React.Reac
return ( return (
<Paper <Paper
sx={{ sx={{
p: 1, p: 0.5,
display: "grid", display: "grid",
gridTemplateColumns: "minmax(0, 4fr) 1fr", gridTemplateColumns: "minmax(0, 4fr) 1.4fr",
gap: 1, gap: 1,
opacity: props.owned ? 0.75 : 1, opacity: props.owned ? 0.75 : 1,
minWidth: "1100px",
}} }}
> >
<> <>
@ -192,13 +200,13 @@ export function PurchasableAugmentation(props: IPurchasableAugProps): React.Reac
}) })
} }
disabled={!props.parent.canPurchase(props.parent.player, aug) || props.owned} disabled={!props.parent.canPurchase(props.parent.player, aug) || props.owned}
sx={{ width: "48px", height: "48px", float: "left", clear: "none", mr: 1 }} sx={{ width: "48px", height: "36px", float: "left", clear: "none", mr: 1 }}
> >
{props.owned ? "Owned" : "Buy"} {props.owned ? "Owned" : "Buy"}
</Button> </Button>
<Box sx={{ maxWidth: props.owned ? "100%" : "85%" }}> <Box sx={{ maxWidth: props.owned ? "100%" : "85%" }}>
<Box sx={{ display: "flex", alignItems: "center" }}> <Box sx={{ display: "grid", alignItems: "center", gridTemplateAreas: `"title exclusive prereqs"` }}>
<Tooltip <Tooltip
title={ title={
<> <>
@ -211,11 +219,9 @@ export function PurchasableAugmentation(props: IPurchasableAugProps): React.Reac
</> </>
} }
> >
<Info sx={{ mr: 1 }} color="info" />
</Tooltip>
<Typography <Typography
variant="h6"
sx={{ sx={{
gridArea: "title",
textOverflow: "ellipsis", textOverflow: "ellipsis",
whiteSpace: "nowrap", whiteSpace: "nowrap",
overflow: "hidden", overflow: "hidden",
@ -228,17 +234,18 @@ export function PurchasableAugmentation(props: IPurchasableAugProps): React.Reac
{aug.name} {aug.name}
{aug.name === AugmentationNames.NeuroFluxGovernor && ` - Level ${aug.getLevel(props.parent.player)}`} {aug.name === AugmentationNames.NeuroFluxGovernor && ` - Level ${aug.getLevel(props.parent.player)}`}
</Typography> </Typography>
</Tooltip>
{aug.factions.length === 1 && !props.parent.sleeveAugs && ( {aug.factions.length === 1 && !props.parent.sleeveAugs && (
<Exclusive player={props.parent.player} aug={aug} /> <Exclusive player={props.parent.player} aug={aug} />
)} )}
</Box>
{aug.prereqs.length > 0 && !props.parent.sleeveAugs && <PreReqs player={props.parent.player} aug={aug} />} {aug.prereqs.length > 0 && !props.parent.sleeveAugs && <PreReqs player={props.parent.player} aug={aug} />}
</Box> </Box>
</Box> </Box>
</Box>
{props.owned || ( {props.owned || (
<Box sx={{ display: "grid", alignItems: "center", justifyItems: "left" }}> <Box sx={{ display: "grid", alignItems: "center", gridTemplateColumns: "1fr 1fr" }}>
<Requirement <Requirement
fulfilled={cost === 0 || props.parent.player.money > cost} fulfilled={cost === 0 || props.parent.player.money > cost}
value={numeralWrapper.formatMoney(cost)} value={numeralWrapper.formatMoney(cost)}

@ -287,6 +287,8 @@ export class Bladeburner implements IBladeburner {
resetAction(): void { resetAction(): void {
this.action = new ActionIdentifier({ type: ActionTypes.Idle }); this.action = new ActionIdentifier({ type: ActionTypes.Idle });
this.actionTimeCurrent = 0;
this.actionTimeToComplete = 0;
} }
clearConsole(): void { clearConsole(): void {

@ -155,7 +155,7 @@ function getRandomReward(): ICodingContractReward {
} }
function getRandomServer(): BaseServer { function getRandomServer(): BaseServer {
const servers = GetAllServers(); const servers = GetAllServers().filter((server: BaseServer) => server.serversOnNetwork.length !== 0);
let randIndex = getRandomInt(0, servers.length - 1); let randIndex = getRandomInt(0, servers.length - 1);
let randServer = servers[randIndex]; let randServer = servers[randIndex];

@ -60,6 +60,7 @@ export function Overview({ rerender }: IProps): React.ReactElement {
["Total Funds:", <Money money={corp.funds} />], ["Total Funds:", <Money money={corp.funds} />],
["Total Revenue:", <MoneyRate money={corp.revenue} />], ["Total Revenue:", <MoneyRate money={corp.revenue} />],
["Total Expenses:", <MoneyRate money={corp.expenses} />], ["Total Expenses:", <MoneyRate money={corp.expenses} />],
["Total Profit:", <MoneyRate money={corp.revenue - corp.expenses} />],
["Publicly Traded:", corp.public ? "Yes" : "No"], ["Publicly Traded:", corp.public ? "Yes" : "No"],
["Owned Stock Shares:", numeralWrapper.format(corp.numShares, "0.000a")], ["Owned Stock Shares:", numeralWrapper.format(corp.numShares, "0.000a")],
["Stock Price:", corp.public ? <Money money={corp.sharePrice} /> : "N/A"], ["Stock Price:", corp.public ? <Money money={corp.sharePrice} /> : "N/A"],

@ -44,8 +44,8 @@ export function Victory(props: IProps): React.ReactElement {
} }
function trade(): void { function trade(): void {
handleInfiltrators();
if (faction === "none") return; if (faction === "none") return;
handleInfiltrators();
Factions[faction].playerReputation += repGain; Factions[faction].playerReputation += repGain;
quitInfiltration(); quitInfiltration();
} }

@ -226,6 +226,7 @@ const bladeburner: IMap<any> = {
stopBladeburnerAction: RamCostConstants.ScriptBladeburnerApiBaseRamCost / 2, stopBladeburnerAction: RamCostConstants.ScriptBladeburnerApiBaseRamCost / 2,
getCurrentAction: RamCostConstants.ScriptBladeburnerApiBaseRamCost / 4, getCurrentAction: RamCostConstants.ScriptBladeburnerApiBaseRamCost / 4,
getActionTime: RamCostConstants.ScriptBladeburnerApiBaseRamCost, getActionTime: RamCostConstants.ScriptBladeburnerApiBaseRamCost,
getActionCurrentTime: RamCostConstants.ScriptBladeburnerApiBaseRamCost,
getActionEstimatedSuccessChance: RamCostConstants.ScriptBladeburnerApiBaseRamCost, getActionEstimatedSuccessChance: RamCostConstants.ScriptBladeburnerApiBaseRamCost,
getActionRepGain: RamCostConstants.ScriptBladeburnerApiBaseRamCost, getActionRepGain: RamCostConstants.ScriptBladeburnerApiBaseRamCost,
getActionCountRemaining: RamCostConstants.ScriptBladeburnerApiBaseRamCost, getActionCountRemaining: RamCostConstants.ScriptBladeburnerApiBaseRamCost,
@ -356,6 +357,7 @@ export const RamCosts: IMap<any> = {
print: 0, print: 0,
printf: 0, printf: 0,
tprint: 0, tprint: 0,
tprintf: 0,
clearLog: 0, clearLog: 0,
disableLog: 0, disableLog: 0,
enableLog: 0, enableLog: 0,

@ -137,6 +137,19 @@ export function NetscriptBladeburner(player: IPlayer, workerScript: WorkerScript
throw ctx.makeRuntimeErrorMsg(e); throw ctx.makeRuntimeErrorMsg(e);
} }
}, },
getActionCurrentTime: (ctx: NetscriptContext) => (): number => {
checkBladeburnerAccess(ctx);
const bladeburner = player.bladeburner;
if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
try {
const timecomputed =
Math.min(bladeburner.actionTimeCurrent + bladeburner.actionTimeOverflow, bladeburner.actionTimeToComplete) *
1000;
return timecomputed;
} catch (e: any) {
throw ctx.makeRuntimeErrorMsg(e);
}
},
getActionEstimatedSuccessChance: getActionEstimatedSuccessChance:
(ctx: NetscriptContext) => (ctx: NetscriptContext) =>
(_type: unknown, _name: unknown): [number, number] => { (_type: unknown, _name: unknown): [number, number] => {

@ -190,6 +190,7 @@ export function NetscriptSleeve(player: IPlayer): InternalAPI<ISleeve> {
location: sl.currentTaskLocation, location: sl.currentTaskLocation,
gymStatType: sl.gymStatType, gymStatType: sl.gymStatType,
factionWorkType: FactionWorkType[sl.factionWorkType], factionWorkType: FactionWorkType[sl.factionWorkType],
className: sl.className,
}; };
}, },
getInformation: getInformation:

@ -1110,6 +1110,8 @@ export interface SleeveTask {
gymStatType: string; gymStatType: string;
/** Faction work type being performed, if any */ /** Faction work type being performed, if any */
factionWorkType: string; factionWorkType: string;
/** Class being taken at university, if any */
className: string;
} }
/** /**
@ -2884,7 +2886,7 @@ export interface Bladeburner {
* @remarks * @remarks
* RAM cost: 4 GB * RAM cost: 4 GB
* *
* Returns the number of seconds it takes to complete the specified action * Returns the number of milliseconds it takes to complete the specified action
* *
* @param type - Type of action. * @param type - Type of action.
* @param name - Name of action. Must be an exact match. * @param name - Name of action. Must be an exact match.
@ -2892,6 +2894,17 @@ export interface Bladeburner {
*/ */
getActionTime(type: string, name: string): number; getActionTime(type: string, name: string): number;
/**
* Get the time elapsed on current action.
* @remarks
* RAM cost: 4 GB
*
* Returns the number of milliseconds already spent on the current action.
*
* @returns Number of milliseconds already spent on the current action.
*/
getActionCurrentTime(): number;
/** /**
* Get estimate success chance of an action. * Get estimate success chance of an action.
* @remarks * @remarks

@ -73,6 +73,7 @@ import { weaken } from "./commands/weaken";
import { wget } from "./commands/wget"; import { wget } from "./commands/wget";
import { hash } from "../hash/hash"; import { hash } from "../hash/hash";
import { apr1 } from "./commands/apr1"; import { apr1 } from "./commands/apr1";
import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers";
export class Terminal implements ITerminal { export class Terminal implements ITerminal {
// Flags to determine whether the player is currently running a hack or an analyze // Flags to determine whether the player is currently running a hack or an analyze
@ -204,7 +205,7 @@ export class Terminal implements ITerminal {
router.toBitVerse(false, false); router.toBitVerse(false, false);
return; return;
} }
let moneyGained = calculatePercentMoneyHacked(server, player); let moneyGained = calculatePercentMoneyHacked(server, player) * BitNodeMultipliers.ManualHackMoney;
moneyGained = Math.floor(server.moneyAvailable * moneyGained); moneyGained = Math.floor(server.moneyAvailable * moneyGained);
if (moneyGained <= 0) { if (moneyGained <= 0) {

@ -272,20 +272,19 @@ const Engine: {
const numCyclesOffline = Math.floor(timeOffline / CONSTANTS._idleSpeed); const numCyclesOffline = Math.floor(timeOffline / CONSTANTS._idleSpeed);
// Generate coding contracts // Generate coding contracts
// let numContracts = 0; let numContracts = 0;
// if (numCyclesOffline < 3000 * 100) { if (numCyclesOffline < 3000 * 100) {
// // if we have less than 100 rolls, just roll them exactly. // if we have less than 100 rolls, just roll them exactly.
// for (let i = 0; i < numCyclesOffline / 3000; i++) { for (let i = 0; i < numCyclesOffline / 3000; i++) {
// if (Math.random() < 0.25) numContracts++; if (Math.random() < 0.25) numContracts++;
// } }
// } else { } else {
// // just average it. // just average it.
// numContracts = (numCyclesOffline / 3000) * 0.25; numContracts = (numCyclesOffline / 3000) * 0.25;
// } }
// console.log(`${numCyclesOffline} ${numContracts}`); for (let i = 0; i < numContracts; i++) {
// for (let i = 0; i < numContracts; i++) { generateRandomContract();
// generateRandomContract(); }
// }
let offlineReputation = 0; let offlineReputation = 0;
const offlineHackingIncome = (Player.moneySourceA.hacking / Player.playtimeSinceLastAug) * timeOffline * 0.75; const offlineHackingIncome = (Player.moneySourceA.hacking / Player.playtimeSinceLastAug) * timeOffline * 0.75;

@ -103,6 +103,7 @@ const useStyles = makeStyles((_theme: Theme) =>
scrollbarWidth: "auto", scrollbarWidth: "auto",
flexDirection: "column-reverse", flexDirection: "column-reverse",
whiteSpace: "pre-wrap", whiteSpace: "pre-wrap",
wordWrap: "break-word",
}, },
titleButton: { titleButton: {
padding: "1px 0", padding: "1px 0",