import { AugmentationNames } from "./Augmentation/data/AugmentationNames"; import { CodingContractTypes } from "./CodingContracts"; import { generateContract, generateRandomContract, generateRandomContractOnHome } from "./CodingContractGenerator"; import { Companies } from "./Company/Companies"; import { Programs } from "./Programs/Programs"; import { Factions } from "./Faction/Factions"; import { IPlayer } from "./PersonObjects/IPlayer"; import { PlayerOwnedSourceFile } from "./SourceFile/PlayerOwnedSourceFile"; import { AllServers } from "./Server/AllServers"; import { HacknetServer } from "./Hacknet/HacknetServer"; import { GetServerByHostname } from "./Server/ServerHelpers"; import { hackWorldDaemon } from "./RedPill"; import { StockMarket } from "./StockMarket/StockMarket"; import { Bladeburner } from "./Bladeburner/Bladeburner"; import { Stock } from "./StockMarket/Stock"; import { IEngine } from "./IEngine"; import { saveObject } from "./SaveObject"; import { dialogBoxCreate } from "../utils/DialogBox"; import { Money } from "./ui/React/Money"; import { TextField } from "./ui/React/TextField"; import { Button } from "./ui/React/Button"; import { Select } from "./ui/React/Select"; import React, { useState } from "react"; import AddIcon from "@material-ui/icons/Add"; import RemoveIcon from "@material-ui/icons/Remove"; import IconButton from "@material-ui/core/IconButton"; import ExposureZeroIcon from "@material-ui/icons/ExposureZero"; import ButtonGroup from "@material-ui/core/ButtonGroup"; import DoubleArrowIcon from "@material-ui/icons/DoubleArrow"; import ReplyAllIcon from "@material-ui/icons/ReplyAll"; import ReplyIcon from "@material-ui/icons/Reply"; import { Theme } from "./ui/React/Theme"; // Update as additional BitNodes get implemented const validSFN = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; // Some dev menu buttons just add a lot of something for convenience const tonsPP = 1e27; const tonsP = 1e12; interface IValueAdjusterProps { label: string; placeholder: string; add: (x: number) => void; subtract: (x: number) => void; reset: () => void; } function ValueAdjusterComponent(props: IValueAdjusterProps): React.ReactElement { const [value, setValue] = useState(""); function onChange(event: React.ChangeEvent): void { if (event.target.value === "") setValue(""); else setValue(parseFloat(event.target.value)); } const { label, placeholder, add, subtract, reset } = props; return ( <> add(typeof value !== "string" ? value : 0)}> ), endAdornment: ( <> subtract(typeof value !== "string" ? value : 0)}> ), }} /> ); } interface IProps { player: IPlayer; engine: IEngine; } export function DevMenuRoot(props: IProps): React.ReactElement { const [company, setCompany] = useState("ECorp"); const [faction, setFaction] = useState("Illuminati"); const [program, setProgram] = useState("NUKE.exe"); const [server, setServer] = useState("home"); const [augmentation, setAugmentation] = useState("Augmented Targeting I"); const [codingcontract, setCodingcontract] = useState("Find Largest Prime Factor"); const [stockPrice, setStockPrice] = useState(0); const [stockSymbol, setStockSymbol] = useState(""); function setFactionDropdown(event: React.ChangeEvent<{ value: unknown }>): void { setFaction(event.target.value as string); } function setCompanyDropdown(event: React.ChangeEvent<{ value: unknown }>): void { setCompany(event.target.value as string); } function setProgramDropdown(event: React.ChangeEvent<{ value: unknown }>): void { setProgram(event.target.value as string); } function setServerDropdown(event: React.ChangeEvent<{ value: unknown }>): void { setServer(event.target.value as string); } function setAugmentationDropdown(event: React.ChangeEvent<{ value: unknown }>): void { setAugmentation(event.target.value as string); } function setCodingcontractDropdown(event: React.ChangeEvent<{ value: unknown }>): void { setCodingcontract(event.target.value as string); } function setStockPriceField(event: React.ChangeEvent): void { setStockPrice(parseFloat(event.target.value)); } function setStockSymbolField(event: React.ChangeEvent): void { setStockSymbol(event.target.value); } function addMoney(n: number) { return function () { props.player.gainMoney(n); }; } function upgradeRam(): void { props.player.getHomeComputer().maxRam *= 2; } function quickB1tFlum3(): void { hackWorldDaemon(props.player.bitNodeN, true, true); } function b1tflum3(): void { hackWorldDaemon(props.player.bitNodeN, true); } function quickHackW0r1dD43m0n(): void { hackWorldDaemon(props.player.bitNodeN, false, true); } function hackW0r1dD43m0n(): void { hackWorldDaemon(props.player.bitNodeN); } function modifyExp(stat: string, modifier: number) { return function (exp: number) { switch (stat) { case "hacking": if (exp) { props.player.gainHackingExp(exp * modifier); } break; case "strength": if (exp) { props.player.gainStrengthExp(exp * modifier); } break; case "defense": if (exp) { props.player.gainDefenseExp(exp * modifier); } break; case "dexterity": if (exp) { props.player.gainDexterityExp(exp * modifier); } break; case "agility": if (exp) { props.player.gainAgilityExp(exp * modifier); } break; case "charisma": if (exp) { props.player.gainCharismaExp(exp * modifier); } break; case "intelligence": if (exp) { props.player.gainIntelligenceExp(exp * modifier); } break; } props.player.updateSkillLevels(); }; } function modifyKarma(modifier: number) { return function (amt: number) { props.player.karma += amt * modifier; }; } function tonsOfExp(): void { props.player.gainHackingExp(tonsPP); props.player.gainStrengthExp(tonsPP); props.player.gainDefenseExp(tonsPP); props.player.gainDexterityExp(tonsPP); props.player.gainAgilityExp(tonsPP); props.player.gainCharismaExp(tonsPP); props.player.gainIntelligenceExp(tonsPP); props.player.updateSkillLevels(); } function resetAllExp(): void { props.player.hacking_exp = 0; props.player.strength_exp = 0; props.player.defense_exp = 0; props.player.dexterity_exp = 0; props.player.agility_exp = 0; props.player.charisma_exp = 0; props.player.intelligence_exp = 0; props.player.updateSkillLevels(); } function resetExperience(stat: string): () => void { return function () { switch (stat) { case "hacking": props.player.hacking_exp = 0; break; case "strength": props.player.strength_exp = 0; break; case "defense": props.player.defense_exp = 0; break; case "dexterity": props.player.dexterity_exp = 0; break; case "agility": props.player.agility_exp = 0; break; case "charisma": props.player.charisma_exp = 0; break; case "intelligence": props.player.intelligence_exp = 0; break; } props.player.updateSkillLevels(); }; } function resetKarma(): () => void { return function () { props.player.karma = 0; }; } function enableIntelligence(): void { if (props.player.intelligence === 0) { props.player.intelligence = 1; props.player.updateSkillLevels(); } } function disableIntelligence(): void { props.player.intelligence_exp = 0; props.player.intelligence = 0; props.player.updateSkillLevels(); } function receiveInvite(): void { props.player.receiveInvite(faction); } function receiveAllInvites(): void { for (const i in Factions) { props.player.receiveInvite(Factions[i].name); } } function modifyFactionRep(modifier: number): (x: number) => void { return function (reputation: number): void { const fac = Factions[faction]; if (fac != null && !isNaN(reputation)) { fac.playerReputation += reputation * modifier; } }; } function resetFactionRep(): void { const fac = Factions[faction]; if (fac != null) { fac.playerReputation = 0; } } function modifyFactionFavor(modifier: number): (x: number) => void { return function (favor: number): void { const fac = Factions[faction]; if (fac != null && !isNaN(favor)) { fac.favor += favor * modifier; } }; } function resetFactionFavor(): void { const fac = Factions[faction]; if (fac != null) { fac.favor = 0; } } function tonsOfRep(): void { for (const i in Factions) { Factions[i].playerReputation = tonsPP; } } function resetAllRep(): void { for (const i in Factions) { Factions[i].playerReputation = 0; } } function tonsOfFactionFavor(): void { for (const i in Factions) { Factions[i].favor = tonsPP; } } function resetAllFactionFavor(): void { for (const i in Factions) { Factions[i].favor = 0; } } function queueAug(): void { props.player.queueAugmentation(augmentation); } function queueAllAugs(): void { for (const i in AugmentationNames) { const augName = AugmentationNames[i]; props.player.queueAugmentation(augName); } } function setSF(sfN: number, sfLvl: number) { return function () { if (sfLvl === 0) { props.player.sourceFiles = props.player.sourceFiles.filter((sf) => sf.n !== sfN); return; } if (!props.player.sourceFiles.some((sf) => sf.n === sfN)) { props.player.sourceFiles.push(new PlayerOwnedSourceFile(sfN, sfLvl)); return; } for (let i = 0; i < props.player.sourceFiles.length; i++) { if (props.player.sourceFiles[i].n === sfN) { props.player.sourceFiles[i].lvl = sfLvl; } } }; } function setAllSF(sfLvl: number) { return () => { for (let i = 0; i < validSFN.length; i++) { setSF(validSFN[i], sfLvl)(); } }; } function clearExploits(): void { props.player.exploits = []; } function addProgram(): void { if (!props.player.hasProgram(program)) { props.player.getHomeComputer().programs.push(program); } } function addAllPrograms(): void { for (const i in Programs) { if (!props.player.hasProgram(Programs[i].name)) { props.player.getHomeComputer().programs.push(Programs[i].name); } } } function rootServer(): void { const s = GetServerByHostname(server); if (s === null) return; if (s instanceof HacknetServer) return; s.hasAdminRights = true; s.sshPortOpen = true; s.ftpPortOpen = true; s.smtpPortOpen = true; s.httpPortOpen = true; s.sqlPortOpen = true; s.openPortCount = 5; } function rootAllServers(): void { for (const i in AllServers) { const s = AllServers[i]; if (s instanceof HacknetServer) return; s.hasAdminRights = true; s.sshPortOpen = true; s.ftpPortOpen = true; s.smtpPortOpen = true; s.httpPortOpen = true; s.sqlPortOpen = true; s.openPortCount = 5; } } function minSecurity(): void { const s = GetServerByHostname(server); if (s === null) return; if (s instanceof HacknetServer) return; s.hackDifficulty = s.minDifficulty; } function minAllSecurity(): void { for (const i in AllServers) { const server = AllServers[i]; if (server instanceof HacknetServer) continue; server.hackDifficulty = server.minDifficulty; } } function maxMoney(): void { const s = GetServerByHostname(server); if (s === null) return; if (s instanceof HacknetServer) return; s.moneyAvailable = s.moneyMax; } function maxAllMoney(): void { for (const i in AllServers) { const server = AllServers[i]; if (server instanceof HacknetServer) continue; server.moneyAvailable = server.moneyMax; } } function modifyCompanyRep(modifier: number): (x: number) => void { return function (reputation: number): void { const c = Companies[company]; if (c != null && !isNaN(reputation)) { c.playerReputation += reputation * modifier; } }; } function resetCompanyRep(): void { Companies[company].playerReputation = 0; } function modifyCompanyFavor(modifier: number): (x: number) => void { return function (favor: number): void { const c = Companies[company]; if (c != null && !isNaN(favor)) { c.favor += favor * modifier; } }; } function resetCompanyFavor(): void { Companies[company].favor = 0; } function tonsOfRepCompanies(): void { for (const c in Companies) { Companies[c].playerReputation = tonsP; } } function resetAllRepCompanies(): void { for (const c in Companies) { Companies[c].playerReputation = 0; } } function tonsOfFavorCompanies(): void { for (const c in Companies) { Companies[c].favor = tonsP; } } function resetAllFavorCompanies(): void { for (const c in Companies) { Companies[c].favor = 0; } } function modifyBladeburnerRank(modify: number): (x: number) => void { return function (rank: number): void { if (props.player.bladeburner) { props.player.bladeburner.changeRank(props.player, rank * modify); } }; } function resetBladeburnerRank(): void { props.player.bladeburner.rank = 0; props.player.bladeburner.maxRank = 0; } function addTonsBladeburnerRank(): void { if (props.player.bladeburner) { props.player.bladeburner.changeRank(props.player, tonsP); } } function modifyBladeburnerCycles(modify: number): (x: number) => void { return function (cycles: number): void { if (props.player.bladeburner) { props.player.bladeburner.storedCycles += cycles * modify; } }; } function resetBladeburnerCycles(): void { if (props.player.bladeburner) { props.player.bladeburner.storedCycles = 0; } } function addTonsBladeburnerCycles(): void { if (props.player.bladeburner) { props.player.bladeburner.storedCycles += tonsP; } } function addTonsGangCycles(): void { if (props.player.gang) { props.player.gang.storedCycles = tonsP; } } function modifyGangCycles(modify: number): (x: number) => void { return function (cycles: number): void { if (props.player.gang) { props.player.gang.storedCycles += cycles * modify; } }; } function resetGangCycles(): void { if (props.player.gang) { props.player.gang.storedCycles = 0; } } function addTonsCorporationFunds(): void { if (props.player.corporation) { props.player.corporation.funds = props.player.corporation.funds.plus(1e99); } } function resetCorporationFunds(): void { if (props.player.corporation) { props.player.corporation.funds = props.player.corporation.funds.minus(props.player.corporation.funds); } } function addTonsCorporationCycles(): void { if (props.player.corporation) { props.player.corporation.storedCycles = tonsP; } } function modifyCorporationCycles(modify: number): (x: number) => void { return function (cycles: number): void { if (props.player.corporation) { props.player.corporation.storedCycles += cycles * modify; } }; } function resetCorporationCycles(): void { if (props.player.corporation) { props.player.corporation.storedCycles = 0; } } function finishCorporationProducts(): void { if (!props.player.corporation) return; props.player.corporation.divisions.forEach((div) => { Object.keys(div.products).forEach((prod) => { const product = div.products[prod]; if (product === undefined) throw new Error("Impossible product undefined"); product.prog = 99.9; }); }); } function addCorporationResearch(): void { if (!props.player.corporation) return; props.player.corporation.divisions.forEach((div) => { div.sciResearch.qty += 1e10; }); } function specificContract(): void { generateContract({ problemType: codingcontract, server: "home", }); } function processStocks(sub: (arg0: Stock) => void): void { const inputSymbols = stockSymbol.replace(/\s/g, ""); let match: (symbol: string) => boolean = (): boolean => { return true; }; if (inputSymbols !== "" && inputSymbols !== "all") { match = function (symbol: string): boolean { return inputSymbols.split(",").includes(symbol); }; } for (const name in StockMarket) { if (StockMarket.hasOwnProperty(name)) { const stock = StockMarket[name]; if (stock instanceof Stock && match(stock.symbol)) { sub(stock); } } } } function doSetStockPrice(): void { if (!isNaN(stockPrice)) { processStocks((stock: Stock) => { stock.price = stockPrice; }); } } function viewStockCaps(): void { const stocks: JSX.Element[] = []; processStocks((stock: Stock) => { stocks.push( {stock.symbol} , ); }); dialogBoxCreate( {stocks}
Stock Price cap
, ); } function sleeveMaxAllShock(): void { for (let i = 0; i < props.player.sleeves.length; ++i) { props.player.sleeves[i].shock = 0; } } function sleeveClearAllShock(): void { for (let i = 0; i < props.player.sleeves.length; ++i) { props.player.sleeves[i].shock = 100; } } function sleeveSyncMaxAll(): void { for (let i = 0; i < props.player.sleeves.length; ++i) { props.player.sleeves[i].sync = 100; } } function sleeveSyncClearAll(): void { for (let i = 0; i < props.player.sleeves.length; ++i) { props.player.sleeves[i].sync = 0; } } function timeskip(time: number) { return () => { props.player.lastUpdate -= time; props.engine._lastUpdate -= time; saveObject.saveGame(props.engine.indexedDb); setTimeout(() => location.reload(), 1000); }; } const factions = []; for (const i in Factions) { factions.push( , ); } const augs = []; for (const i in AugmentationNames) { augs.push( , ); } const programs = []; for (const i in Programs) { programs.push( , ); } const servers = []; for (const i in AllServers) { const hn = AllServers[i].hostname; servers.push( , ); } const companies = []; for (const c in Companies) { const name = Companies[c].name; companies.push( , ); } const contractTypes = []; const contractTypeNames = Object.keys(CodingContractTypes); for (let i = 0; i < contractTypeNames.length; i++) { const name = contractTypeNames[i]; contractTypes.push( , ); } return (

Development Menu - Only meant to be used for testing/debugging

Generic

Experience / Stats

All:
Hacking:
Strength:
Defense:
Dexterity:
Agility:
Charisma:
Intelligence:
Karma:

Factions

Faction:
Reputation:
Favor:
All Reputation:
All Favor:

Augmentations

Aug:
Queue:

Source-Files

{validSFN.map((i) => ( ))}
Exploits:
All:
SF-{i}:

Programs

Program:
Add:

Servers

Server:
Root:
Security:
Money:

Companies

Company:
Reputation:
Favor:
All Reputation:
All Favor:
{props.player.bladeburner instanceof Bladeburner && (

Bladeburner

Rank:
Cycles:
)} {props.player.inGang() && (

Gang

Cycles:
)} {props.player.hasCorporation() && (

Corporation

Cycles:
)}

Coding Contracts

{props.player.hasWseAccount && (

Stock Market

Symbol:
Price:
Caps:
)} {props.player.sleeves.length > 0 && (

Sleeves

Shock:
Sync:
)}

Offline time skip:

); }