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 { Player } from "./Player"; 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 { createElement } from "../utils/uiHelpers/createElement"; import { removeElementById } from "../utils/uiHelpers/removeElementById"; import { Money } from "./ui/React/Money"; import React, { useState } from "react"; import ReactDOM from "react-dom"; const Component = React.Component; // 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 { title: string; add: (x: number) => void; subtract: (x: number) => void; reset: () => void; } function ValueAdjusterComponent(props: IValueAdjusterProps) { const [value, setValue] = useState(0); function onChange(event: React.ChangeEvent): void { setValue(parseFloat(event.target.value)); } const { title, add, subtract, reset } = props; return ( <> ); } 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): void { setFaction(event.target.value); } function setCompanyDropdown(event: React.ChangeEvent): void { setCompany(event.target.value); } function setProgramDropdown(event: React.ChangeEvent): void { setProgram(event.target.value); } function setServerDropdown(event: React.ChangeEvent): void { setServer(event.target.value); } function setAugmentationDropdown(event: React.ChangeEvent): void { setAugmentation(event.target.value); } function setCodingcontractDropdown(event: React.ChangeEvent): void { setCodingcontract(event.target.value); } 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 () { Player.gainMoney(n); }; } function upgradeRam() { Player.getHomeComputer().maxRam *= 2; } function quickB1tFlum3() { hackWorldDaemon(Player.bitNodeN, true, true); } function b1tflum3() { hackWorldDaemon(Player.bitNodeN, true); } function quickHackW0r1dD43m0n() { hackWorldDaemon(Player.bitNodeN, false, true); } function hackW0r1dD43m0n() { hackWorldDaemon(Player.bitNodeN); } function modifyExp(stat: string, modifier: number) { return function (exp: number) { switch (stat) { case "hacking": if (exp) { Player.gainHackingExp(exp * modifier); } break; case "strength": if (exp) { Player.gainStrengthExp(exp * modifier); } break; case "defense": if (exp) { Player.gainDefenseExp(exp * modifier); } break; case "dexterity": if (exp) { Player.gainDexterityExp(exp * modifier); } break; case "agility": if (exp) { Player.gainAgilityExp(exp * modifier); } break; case "charisma": if (exp) { Player.gainCharismaExp(exp * modifier); } break; case "intelligence": if (exp) { Player.gainIntelligenceExp(exp * modifier); } break; } Player.updateSkillLevels(); }; } function modifyKarma(modifier: number) { return function (amt: number) { Player.karma += amt * modifier; }; } function tonsOfExp() { Player.gainHackingExp(tonsPP); Player.gainStrengthExp(tonsPP); Player.gainDefenseExp(tonsPP); Player.gainDexterityExp(tonsPP); Player.gainAgilityExp(tonsPP); Player.gainCharismaExp(tonsPP); Player.gainIntelligenceExp(tonsPP); Player.updateSkillLevels(); } function resetAllExp() { Player.hacking_exp = 0; Player.strength_exp = 0; Player.defense_exp = 0; Player.dexterity_exp = 0; Player.agility_exp = 0; Player.charisma_exp = 0; Player.intelligence_exp = 0; Player.updateSkillLevels(); } function resetExperience(stat: string): () => void { return function () { switch (stat) { case "hacking": Player.hacking_exp = 0; break; case "strength": Player.strength_exp = 0; break; case "defense": Player.defense_exp = 0; break; case "dexterity": Player.dexterity_exp = 0; break; case "agility": Player.agility_exp = 0; break; case "charisma": Player.charisma_exp = 0; break; case "intelligence": Player.intelligence_exp = 0; break; } Player.updateSkillLevels(); }; } function resetKarma() { return function () { Player.karma = 0; }; } function enableIntelligence() { if (Player.intelligence === 0) { Player.intelligence = 1; Player.updateSkillLevels(); } } function disableIntelligence() { Player.intelligence_exp = 0; Player.intelligence = 0; Player.updateSkillLevels(); } function receiveInvite() { Player.receiveInvite(faction); } function receiveAllInvites() { for (const i in Factions) { 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() { 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() { const fac = Factions[faction]; if (fac != null) { fac.favor = 0; } } function tonsOfRep() { for (const i in Factions) { Factions[i].playerReputation = tonsPP; } } function resetAllRep() { for (const i in Factions) { Factions[i].playerReputation = 0; } } function tonsOfFactionFavor() { for (const i in Factions) { Factions[i].favor = tonsPP; } } function resetAllFactionFavor() { for (const i in Factions) { Factions[i].favor = 0; } } function queueAug() { Player.queueAugmentation(augmentation); } function queueAllAugs() { for (const i in AugmentationNames) { const augName = AugmentationNames[i]; Player.queueAugmentation(augName); } } function setSF(sfN: number, sfLvl: number) { return function () { if (sfLvl === 0) { Player.sourceFiles = Player.sourceFiles.filter((sf) => sf.n !== sfN); return; } if (!Player.sourceFiles.some((sf) => sf.n === sfN)) { Player.sourceFiles.push(new PlayerOwnedSourceFile(sfN, sfLvl)); return; } for (let i = 0; i < Player.sourceFiles.length; i++) { if (Player.sourceFiles[i].n === sfN) { Player.sourceFiles[i].lvl = sfLvl; } } }; } function setAllSF(sfLvl: number) { return () => { for (let i = 0; i < validSFN.length; i++) { setSF(validSFN[i], sfLvl)(); } }; } function clearExploits() { Player.exploits = []; } function addProgram() { if (!Player.hasProgram(program)) { Player.getHomeComputer().programs.push(program); } } function addAllPrograms() { for (const i in Programs) { if (!Player.hasProgram(Programs[i].name)) { Player.getHomeComputer().programs.push(Programs[i].name); } } } function rootServer() { 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() { 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() { const s = GetServerByHostname(server); if (s === null) return; if (s instanceof HacknetServer) return; s.hackDifficulty = s.minDifficulty; } function minAllSecurity() { for (const i in AllServers) { const server = AllServers[i]; if (server instanceof HacknetServer) continue; server.hackDifficulty = server.minDifficulty; } } function maxMoney() { const s = GetServerByHostname(server); if (s === null) return; if (s instanceof HacknetServer) return; s.moneyAvailable = s.moneyMax; } function maxAllMoney() { 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 (Player.bladeburner) { Player.bladeburner.changeRank(Player, rank * modify); } }; } function resetBladeburnerRank(): void { Player.bladeburner.rank = 0; Player.bladeburner.maxRank = 0; } function addTonsBladeburnerRank(): void { if (Player.bladeburner) { Player.bladeburner.changeRank(Player, tonsP); } } function modifyBladeburnerCycles(modify: number): (x: number) => void { return function (cycles: number): void { if (Player.bladeburner) { Player.bladeburner.storedCycles += cycles * modify; } }; } function resetBladeburnerCycles(): void { if (Player.bladeburner) { Player.bladeburner.storedCycles = 0; } } function addTonsBladeburnerCycles(): void { if (Player.bladeburner) { Player.bladeburner.storedCycles += tonsP; } } function addTonsGangCycles(): void { if (Player.gang) { Player.gang.storedCycles = tonsP; } } function modifyGangCycles(modify: number): (x: number) => void { return function (cycles: number): void { if (Player.gang) { Player.gang.storedCycles += cycles * modify; } }; } function resetGangCycles(): void { if (Player.gang) { Player.gang.storedCycles = 0; } } function addTonsCorporationFunds(): void { if (Player.corporation) { Player.corporation.funds = Player.corporation.funds.plus(1e99); } } function resetCorporationFunds(): void { if (Player.corporation) { Player.corporation.funds = Player.corporation.funds.minus(Player.corporation.funds); } } function addTonsCorporationCycles() { if (Player.corporation) { Player.corporation.storedCycles = tonsP; } } function modifyCorporationCycles(modify: number): (x: number) => void { return function (cycles: number): void { if (Player.corporation) { Player.corporation.storedCycles += cycles * modify; } }; } function resetCorporationCycles() { if (Player.corporation) { Player.corporation.storedCycles = 0; } } function finishCorporationProducts() { if (!Player.corporation) return; 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() { if (!Player.corporation) return; Player.corporation.divisions.forEach((div) => { div.sciResearch.qty += 1e10; }); } function specificContract() { generateContract({ problemType: codingcontract, server: "home", }); } function processStocks(sub: (arg0: Stock) => void) { const inputSymbols = stockSymbol.replace(/\s/g, ""); let match = function (symbol: string) { return true; }; if (inputSymbols !== "" && inputSymbols !== "all") { match = function (symbol: string) { 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() { if (!isNaN(stockPrice)) { processStocks((stock: Stock) => { stock.price = stockPrice; }); } } function viewStockCaps() { let stocks: JSX.Element[] = []; processStocks((stock: Stock) => { stocks.push( {stock.symbol} , ); }); dialogBoxCreate( {stocks}
Stock Price cap
, ); } function sleeveMaxAllShock() { for (let i = 0; i < Player.sleeves.length; ++i) { Player.sleeves[i].shock = 0; } } function sleeveClearAllShock() { for (let i = 0; i < Player.sleeves.length; ++i) { Player.sleeves[i].shock = 100; } } function sleeveSyncMaxAll() { for (let i = 0; i < Player.sleeves.length; ++i) { Player.sleeves[i].sync = 100; } } function sleeveSyncClearAll() { for (let i = 0; i < Player.sleeves.length; ++i) { Player.sleeves[i].sync = 0; } } function timeskip(time: number) { return () => { Player.lastUpdate -= time; props.engine._lastUpdate -= time; saveObject.saveGame(props.engine.indexedDb); setTimeout(() => location.reload(), 1000); }; } let factions = []; for (const i in Factions) { factions.push( , ); } let augs = []; for (const i in AugmentationNames) { augs.push( , ); } let programs = []; for (const i in Programs) { programs.push( , ); } let servers = []; for (const i in AllServers) { const hn = AllServers[i].hostname; servers.push( , ); } let 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:
Invites:
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:
{Player.bladeburner instanceof Bladeburner && (

Bladeburner

Rank:
Cycles:
)} {Player.inGang() && (

Gang

Cycles:
)} {Player.hasCorporation() && (

Corporation

Cycles:
)}

Coding Contracts

{Player.hasWseAccount && (

Stock Market

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

Sleeves

Shock:
Sync:
)}

Offline time skip:

); }