import { AugmentationNames } from "./Augmentation/data/AugmentationNames"; import { CodingContractTypes } from "./CodingContracts"; import { generateContract, generateRandomContract, generateRandomContractOnHome } from "./CodingContractGenerator"; import { Companies } from "./Company/Companies"; import { Company } from "./Company/Company"; import { Programs } from "./Programs/Programs"; import { Factions } from "./Faction/Factions"; import { Player } from "./Player"; import { PlayerOwnedSourceFile } from "./SourceFile/PlayerOwnedSourceFile"; import { AllServers } from "./Server/AllServers"; import { GetServerByHostname } from "./Server/ServerHelpers"; import { hackWorldDaemon } from "./RedPill"; import { StockMarket, SymbolToStockMap } from "./StockMarket/StockMarket"; import { Stock } from "./StockMarket/Stock"; import { Terminal } from "./Terminal"; import { numeralWrapper } from "./ui/numeralFormat"; import { dialogBoxCreate } from "../utils/DialogBox"; import { exceptionAlert } from "../utils/helpers/exceptionAlert"; import { createElement } from "../utils/uiHelpers/createElement"; import { createOptionElement } from "../utils/uiHelpers/createOptionElement"; import { getSelectText } from "../utils/uiHelpers/getSelectData"; import { removeElementById } from "../utils/uiHelpers/removeElementById"; import React from "react"; import ReactDOM from "react-dom"; const Component = React.Component; const validSFN = [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12]; class ValueAdjusterComponent extends Component { constructor(props) { super(props); this.state = { value: '' }; this.setValue = this.setValue.bind(this); } setValue(event) { this.setState({ value: event.target.value }); } render() { const { title, add, subtract, reset } = this.props; const { value } = this.state; return ( <> ); } } class DevMenuComponent extends Component { constructor(props) { super(props); this.state = { company: 'ECorp', faction: 'Illuminati', program: 'NUKE.exe', server: 'home', augmentation: 'Augmented Targeting I', codingcontract: 'Find Largest Prime Factor', } this.setSF = this.setSF.bind(this); this.setAllSF = this.setAllSF.bind(this); this.processStocks = this.processStocks.bind(this); this.setStockPrice = this.setStockPrice.bind(this); this.viewStockCaps = this.viewStockCaps.bind(this); this.setFactionDropdown = this.setFactionDropdown.bind(this); this.setCompanyDropdown = this.setCompanyDropdown.bind(this); this.setProgramDropdown = this.setProgramDropdown.bind(this); this.setServerDropdown = this.setServerDropdown.bind(this); this.setAugmentationDropdown = this.setAugmentationDropdown.bind(this); this.setCodingcontractDropdown = this.setCodingcontractDropdown.bind(this); this.receiveInvite = this.receiveInvite.bind(this); this.modifyFactionRep = this.modifyFactionRep.bind(this); this.resetFactionRep = this.resetFactionRep.bind(this); this.modifyFactionFavor = this.modifyFactionFavor.bind(this); this.resetFactionFavor = this.resetFactionFavor.bind(this); this.queueAug = this.queueAug.bind(this); this.addProgram = this.addProgram.bind(this); this.rootServer = this.rootServer.bind(this); this.minSecurity = this.minSecurity.bind(this); this.maxMoney = this.maxMoney.bind(this); this.modifyCompanyRep = this.modifyCompanyRep.bind(this); this.resetCompanyRep = this.resetCompanyRep.bind(this); this.modifyCompanyFavor = this.modifyCompanyFavor.bind(this); this.resetCompanyFavor = this.resetCompanyFavor.bind(this); this.specificContract = this.specificContract.bind(this); } setFactionDropdown(event) { this.setState({ faction: event.target.value }); } setCompanyDropdown(event) { this.setState({ company: event.target.value }); } setProgramDropdown(event) { this.setState({ program: event.target.value }); } setServerDropdown(event) { this.setState({ server: event.target.value }); } setAugmentationDropdown(event) { this.setState({ augmentation: event.target.value }); } setCodingcontractDropdown(event) { this.setState({ codingcontract: event.target.value }); } addMoney(n) { return function() { Player.gainMoney(n); } } upgradeRam() { Player.getHomeComputer().maxRam *= 2; } b1tflum3() { hackWorldDaemon(Player.bitNodeN, true); } hackW0r1dD43m0n() { hackWorldDaemon(Player.bitNodeN); } modifyExp(stat, modifier) { return function(exp) { 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(); } } tonsOfExp() { Player.gainHackingExp(1e27); Player.gainStrengthExp(1e27); Player.gainDefenseExp(1e27); Player.gainDexterityExp(1e27); Player.gainAgilityExp(1e27); Player.gainCharismaExp(1e27); Player.gainIntelligenceExp(1e27); Player.updateSkillLevels(); } 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(); } resetExperience(stat) { 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(); } } enableIntelligence() { if(Player.intelligence === 0) { Player.intelligence = 1; Player.updateSkillLevels(); } } disableIntelligence() { Player.intelligence_exp = 0; Player.intelligence = 0; Player.updateSkillLevels(); } receiveInvite() { Player.receiveInvite(this.state.faction); } receiveAllInvites() { for (const i in Factions) { Player.receiveInvite(Factions[i].name); } } modifyFactionRep(modifier) { const component = this; return function(reputation) { const fac = Factions[component.state.faction]; if (fac != null && !isNaN(reputation)) { fac.playerReputation += reputation*modifier; } } } resetFactionRep() { const fac = Factions[this.state.faction]; if (fac != null) { fac.playerReputation = 0; } } modifyFactionFavor(modifier) { const component = this; return function(favor) { const fac = Factions[component.state.faction]; if (fac != null && !isNaN(favor)) { fac.favor += favor*modifier; } } } resetFactionFavor() { const fac = Factions[this.state.faction]; if (fac != null) { fac.favor = 0; } } tonsOfRep() { for (const i in Factions) { Factions[i].playerReputation = 1e27; } } resetAllRep() { for (const i in Factions) { Factions[i].playerReputation = 0; } } tonsOfFactionFavor() { for (const i in Factions) { Factions[i].favor = 1e27; } } resetAllFactionFavor() { for (const i in Factions) { Factions[i].favor = 0; } } queueAug() { Player.queueAugmentation(this.state.augmentation); } queueAllAugs() { for (const i in AugmentationNames) { const augName = AugmentationNames[i]; Player.queueAugmentation(augName); } } setSF(sfN, sfLvl) { 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; } } } } setAllSF(sfLvl) { const component = this; return function(){ for (let i = 0; i < validSFN.length; i++) { component.setSF(validSFN[i], sfLvl)(); } } } addProgram() { const program = this.state.program; if(!Player.hasProgram(program)) { Player.getHomeComputer().programs.push(program); } } addAllPrograms() { for (const i in Programs) { if(!Player.hasProgram(Programs[i].name)) { Player.getHomeComputer().programs.push(Programs[i].name); } } } rootServer() { const serverName = this.state.server; const server = GetServerByHostname(serverName); server.hasAdminRights = true; server.sshPortOpen = true; server.ftpPortOpen = true; server.smtpPortOpen = true; server.httpPortOpen = true; server.sqlPortOpen = true; server.openPortCount = 5; } rootAllServers() { for (const i in AllServers) { AllServers[i].hasAdminRights = true; AllServers[i].sshPortOpen = true; AllServers[i].ftpPortOpen = true; AllServers[i].smtpPortOpen = true; AllServers[i].httpPortOpen = true; AllServers[i].sqlPortOpen = true; AllServers[i].openPortCount = 5; } } minSecurity() { const serverName = this.state.server; const server = GetServerByHostname(serverName); server.hackDifficulty = server.minDifficulty; } minAllSecurity() { for (const i in AllServers) { AllServers[i].hackDifficulty = AllServers[i].minDifficulty; } } maxMoney() { const serverName = this.state.server; const server = GetServerByHostname(serverName); server.moneyAvailable = server.moneyMax; } maxAllMoney() { for (const i in AllServers) { AllServers[i].moneyAvailable = AllServers[i].moneyMax; } } modifyCompanyRep(modifier) { const component = this; return function(reputation) { const company = Companies[component.state.company]; if (company != null && !isNaN(reputation)) { company.playerReputation += reputation*modifier; } } } resetCompanyRep() { const company = Companies[this.state.company]; company.playerReputation = 0; } modifyCompanyFavor(modifier) { const component = this; return function(favor) { const company = Companies[component.state.company]; if (company != null && !isNaN(favor)) { company.favor += favor*modifier; } } } resetCompanyFavor() { const company = Companies[this.state.company]; company.favor = 0; } tonsOfRepCompanies() { for (const c in Companies) { Companies[c].playerReputation = 1e12; } } resetAllRepCompanies() { for (const c in Companies) { Companies[c].playerReputation = 0; } } tonsOfFavorCompanies() { for (const c in Companies) { Companies[c].favor = 1e12; } } resetAllFavorCompanies() { for (const c in Companies) { Companies[c].favor = 0; } } modifyBladeburnerRank(modify) { return function(rank) { if (!!Player.bladeburner) { Player.bladeburner.changeRank(rank*modify); } } } resetBladeburnerRank() { Player.bladeburner.rank = 0; Player.bladeburner.maxRank = 0; } addTonsBladeburnerRank() { if (!!Player.bladeburner) { Player.bladeburner.changeRank(1e12); } } modifyBladeburnerCycles(modify) { return function(cycles) { if (!!Player.bladeburner) { Player.bladeburner.storedCycles += cycles*modify; } } } resetBladeburnerCycles() { if (!!Player.bladeburner) { Player.bladeburner.storedCycles = 0; } } addTonsBladeburnerCycles() { if (!!Player.bladeburner) { Player.bladeburner.storedCycles += 1e12; } } addTonsGangCycles() { if (!!Player.gang) { Player.gang.storedCycles = 1e12; } } modifyGangCycles(modify) { return function(cycles) { if (!!Player.gang) { Player.gang.storedCycles += cycles*modify; } } } resetGangCycles() { if (!!Player.gang) { Player.gang.storedCycles = 0; } } addTonsCorporationCycles() { if (!!Player.corporation) { Player.corporation.storedCycles = 1e12; } } modifyCorporationCycles(modify) { return function(cycles) { if (!!Player.corporation) { Player.corporation.storedCycles += cycles*modify; } } } resetCorporationCycles() { if (!!Player.corporation) { Player.corporation.storedCycles = 0; } } specificContract() { generateContract({ problemType: this.state.codingcontract, server: "home", }); } processStocks(cb) { const inputSymbols = document.getElementById('dev-stock-symbol').value.toString().replace(/\s/g, ''); let match = function(symbol) { return true; } if (inputSymbols !== '' && inputSymbols !== 'all') { match = function(symbol) { 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)) { cb(stock); } } } } setStockPrice() { const price = parseFloat(document.getElementById('dev-stock-price').value); if (!isNaN(price)) { this.processStocks((stock) => { stock.price = price; }); } } viewStockCaps() { let text = ""; this.processStocks((stock) => { text += ``; }); text += "
StockPrice cap
${stock.symbol}${numeralWrapper.format(stock.cap, '$0.000a')}
"; dialogBoxCreate(text); } sleeveMaxAllShock() { for (let i = 0; i < Player.sleeves.length; ++i) { Player.sleeves[i].shock = 0; } } sleeveClearAllShock() { for (let i = 0; i < Player.sleeves.length; ++i) { Player.sleeves[i].shock = 100; } } sleeveMaxAllSync() { for (let i = 0; i < Player.sleeves.length; ++i) { Player.sleeves[i].sync = 100; } } sleeveClearAllSync() { for (let i = 0; i < Player.sleeves.length; ++i) { Player.sleeves[i].sync = 0; } } render() { 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 sourceFiles = []; validSFN.forEach( i => sourceFiles.push( SF-{i}: )); 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:

Factions

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

Augmentations

Aug:
Queue:

Source-Files

{sourceFiles}
All:

Programs

Program:
Add:

Servers

Server:
Root:
Security:
Money:

Companies

Company:
Reputation:
Favor:
All Reputation:
All Favor:

Bladeburner

Rank:
Cycles:

Gang

Cycles:

Corporation

Cycles:

Coding Contracts

Stock Market

Symbol:
Price:
Caps:

Sleeves

Shock:
Sync:
); } } const devMenuContainerId = "dev-menu-container"; export function createDevMenu() { if (process.env.NODE_ENV !== "development") { throw new Error("Cannot create Dev Menu because you are not in a dev build"); } // Add everything to container, then append to main menu const devMenuContainer = createElement("div", { class: "generic-menupage-container", id: devMenuContainerId, }); const entireGameContainer = document.getElementById("entire-game-container"); if (entireGameContainer == null) { throw new Error("Could not find entire-game-container DOM element"); } entireGameContainer.appendChild(devMenuContainer); ReactDOM.render(, devMenuContainer); } export function closeDevMenu() { removeElementById(devMenuContainerId); }