diff --git a/src/BitNode/BitNode.ts b/src/BitNode/BitNode.ts index 5ea5e01f1..e90ed9157 100644 --- a/src/BitNode/BitNode.ts +++ b/src/BitNode/BitNode.ts @@ -176,7 +176,21 @@ export function initBitNodes() { BitNodes["BitNode9"] = new BitNode(9, "Hacktocracy", "Hacknet Unleashed", "When Fulcrum Technologies released their open-source Linux distro Chapeau, it quickly " + "became the OS of choice for the underground hacking community. Chapeau became especially notorious for " + - "powering the Hacknet, "); + "powering the Hacknet, a global, decentralized network used for nefarious purposes. Fulcrum quickly " + + "abandoned the project and dissociated themselves from it.

" + + "This BitNode unlocks the Hacknet Server, an upgraded version of the Hacknet Node. Hacknet Servers generate " + + "hashes, which can be spent on a variety of different upgrades.

" + + "In this BitNode:

" + + "Your stats are significantly decreased
" + + "You cannnot purchase additional servers
" + + "Hacking is significantly less profitable

" + + "Destroying this BitNode will give you Source-File 9, or if you already have this Source-File it will " + + "upgrade its level up to a maximum of 3. This Source-File grants the following benefits:

" + + "Level 1: Permanently unlocks the Hacknet Server in other BitNodes
" + + "Level 2: You start with 128GB of RAM on your home computer when entering a new BitNode
" + + "Level 3: Grants a highly-upgraded Hacknet Server when entering a new BitNode

" + + "(Note that the Level 3 effect of this Source-File only applies when entering a new BitNode, NOT " + + "when installing Augmentations)"); BitNodes["BitNode10"] = new BitNode(10, "Digital Carbon", "Your body is not who you are", "In 2084, VitaLife unveiled to the world the Persona Core, a technology that allowed people " + "to digitize their consciousness. Their consciousness could then be transferred into Synthoids " + @@ -186,7 +200,7 @@ export function initBitNodes() { "1. Re-sleeve: Purchase and transfer your consciousness into a new body
" + "2. Duplicate Sleeves: Duplicate your consciousness into Synthoids, allowing you to perform different tasks synchronously

" + "In this BitNode:

" + - "Your stats are significantly decreased.
" + + "Your stats are significantly decreased
" + "All methods of gaining money are half as profitable (except Stock Market)
" + "Purchased servers are more expensive, have less max RAM, and a lower maximum limit
" + "Augmentations are 5x as expensive and require twice as much reputation

" + @@ -360,13 +374,15 @@ export function initBitNodeMultipliers(p: IPlayer) { BitNodeMultipliers.HomeComputerRamCost = 5; BitNodeMultipliers.CrimeMoney = 0.5; BitNodeMultipliers.ScriptHackMoney = 0.1; - BitNodeMultipliers.HackExpGain = 0.1; + BitNodeMultipliers.HackExpGain = 0.05; BitNodeMultipliers.ServerStartingMoney = 0.1; BitNodeMultipliers.ServerMaxMoney = 0.1; BitNodeMultipliers.ServerStartingSecurity = 2.5; BitNodeMultipliers.CorporationValuation = 0.5; BitNodeMultipliers.FourSigmaMarketDataCost = 5; BitNodeMultipliers.FourSigmaMarketDataApiCost = 4; + BitNodeMultipliers.BladeburnerRank = 0.9; + BitNodeMultipliers.BladeburnerSkillCost = 1.2; break; case 10: // Digital Carbon BitNodeMultipliers.HackingLevelMultiplier = 0.2; diff --git a/src/Hacknet/HacknetHelpers.jsx b/src/Hacknet/HacknetHelpers.jsx index 9a24e3afc..29f85a8a1 100644 --- a/src/Hacknet/HacknetHelpers.jsx +++ b/src/Hacknet/HacknetHelpers.jsx @@ -45,6 +45,25 @@ export function hasHacknetServers() { return (Player.bitNodeN === 9 || SourceFileFlags[9] > 0); } +export function createHacknetServer() { + const numOwned = Player.hacknetNodes.length; + const name = `hacknet-node-${numOwned}`; + const server = new HacknetServer({ + adminRights: true, + hostname: name, + player: Player, + }); + Player.hacknetNodes.push(server.ip); + + // Configure the HacknetServer to actually act as a Server + AddToAllServers(server); + const homeComputer = Player.getHomeComputer(); + homeComputer.serversOnNetwork.push(server.ip); + server.serversOnNetwork.push(homeComputer.ip); + + return server; +} + export function purchaseHacknet() { /* INTERACTIVE TUTORIAL */ if (ITutorial.isRunning) { @@ -63,24 +82,8 @@ export function purchaseHacknet() { } if (!Player.canAfford(cost)) { return -1; } - - // Auto generate a hostname for this Server - const numOwned = Player.hacknetNodes.length; - const name = `hacknet-node-${numOwned}`; - const server = new HacknetServer({ - adminRights: true, - hostname: name, - player: Player, - }); - Player.loseMoney(cost); - Player.hacknetNodes.push(server.ip); - - // Configure the HacknetServer to actually act as a Server - AddToAllServers(server); - const homeComputer = Player.getHomeComputer(); - homeComputer.serversOnNetwork.push(server.ip); - server.serversOnNetwork.push(homeComputer.ip); + const server = createHacknetServer(); return numOwned; } else { diff --git a/src/NetscriptFunctions.js b/src/NetscriptFunctions.js index b6d5fa3da..afed96696 100644 --- a/src/NetscriptFunctions.js +++ b/src/NetscriptFunctions.js @@ -32,10 +32,11 @@ import { FactionWorkType } from "./Faction/FactionWorkT import { netscriptCanGrow, netscriptCanHack, netscriptCanWeaken } from "./Hacking/netscriptCanHack"; + import { getCostOfNextHacknetNode, getCostOfNextHacknetServer, hasHacknetServers, - purchaseHacknet } from "./Hacknet/HacknetNode"; + purchaseHacknet } from "./Hacknet/HacknetHelpers"; import {Locations} from "./Locations"; import { Message } from "./Message/Message"; import { Messages } from "./Message/MessageHelpers"; @@ -318,7 +319,11 @@ function NetscriptFunctions(workerScript) { upgradeCache : function(i, n) { if (!hasHacknetServers()) { return false; } const node = getHacknetNode(i); - return node.purchaseCacheUpgrade(n, Player); + const res = node.purchaseCacheUpgrade(n, Player); + if (res) { + Player.hashManager.updateCapacity(Player); + } + return res; }, getLevelUpgradeCost : function(i, n) { const node = getHacknetNode(i); diff --git a/src/Player.js b/src/Player.js index 6ad8978d2..96920e193 100644 --- a/src/Player.js +++ b/src/Player.js @@ -420,20 +420,21 @@ PlayerObject.prototype.prestigeSourceFile = function() { this.lastUpdate = new Date().getTime(); + // Hacknet Nodes this.hacknetNodes.length = 0; this.hashManager.prestige(this); - //Gang + // Gang this.gang = null; resetGangs(); - //Reset Stock market + // Reset Stock market this.hasWseAccount = false; this.hasTixApiAccess = false; this.has4SData = false; this.has4SDataTixApi = false; - //BitNode 3: Corporatocracy + // Corporation this.corporation = 0; // Statistics trackers diff --git a/src/Prestige.js b/src/Prestige.js index c764c5a37..4ee7cb9ad 100755 --- a/src/Prestige.js +++ b/src/Prestige.js @@ -14,6 +14,7 @@ import { Faction } from "./Faction/Faction"; import { Factions, initFactions } from "./Faction/Factions"; import { joinFaction } from "./Faction/FactionHelpers"; +import { createHacknetServer } from "./Hacknet/HacknetHelpers"; import {deleteGangDisplayContent} from "./Gang"; import {Locations} from "./Location"; import { Message } from "./Message/Message"; @@ -30,7 +31,8 @@ import { AllServers, prestigeAllServers } from "./Server/AllServers"; import { Server } from "./Server/Server" import { prestigeHomeComputer } from "./Server/ServerHelpers"; -import { updateSourceFileFlags } from "./SourceFile/SourceFileFlags"; +import { SourceFileFlags, + updateSourceFileFlags } from "./SourceFile/SourceFileFlags"; import { SpecialServerIps, SpecialServerIpsMap, prestigeSpecialServerIps, @@ -201,49 +203,45 @@ function prestigeSourceFile() { //Re-create foreign servers initForeignServers(Player.getHomeComputer()); - var srcFile1Owned = false; - for (var i = 0; i < Player.sourceFiles.length; ++i) { - if (Player.sourceFiles[i].n == 1) { - srcFile1Owned = true; - } - } - if (srcFile1Owned) { + if (SourceFileFlags[9] >= 2) { + homeComp.setMaxRam(128); + } else if (SourceFileFlags[1] > 0) { homeComp.setMaxRam(32); } else { homeComp.setMaxRam(8); } homeComp.cpuCores = 1; - //Reset favor for Companies + // Reset favor for Companies for (var member in Companies) { if (Companies.hasOwnProperty(member)) { Companies[member].favor = 0; } } - //Reset favor for factions + // Reset favor for factions for (var member in Factions) { if (Factions.hasOwnProperty(member)) { Factions[member].favor = 0; } } - //Stop a Terminal action if there is one + // Stop a Terminal action if there is one if (Engine._actionInProgress) { Engine._actionInProgress = false; Terminal.finishAction(true); } - //Delete all Augmentations + // Delete all Augmentations for (var name in Augmentations) { if (Augmentations.hasOwnProperty(name)) { delete Augmentations[name]; } } - //Re-initialize things - This will update any changes - initFactions(); //Factions must be initialized before augmentations - initAugmentations(); //Calls reapplyAllAugmentations() and resets Player multipliers + // Re-initialize things - This will update any changes + initFactions(); // Factions must be initialized before augmentations + initAugmentations(); // Calls reapplyAllAugmentations() and resets Player multipliers Player.reapplyAllSourceFiles(); initCompanies(); @@ -325,7 +323,7 @@ function prestigeSourceFile() { dialogBoxCreate("Visit VitaLife in New Tokyo if you'd like to purchase a new sleeve!"); } - //Reset Stock market, gang, and corporation + // Reset Stock market, gang, and corporation if (Player.hasWseAccount) { initStockMarket(); initSymbolToStockMap(); @@ -341,6 +339,16 @@ function prestigeSourceFile() { Player.corporation = null; resetIndustryResearchTrees(); Player.bladeburner = null; + // Source-File 9 (level 3) effect + if (SourceFileFlags[9] >= 3) { + const hserver = createHacknetServer(); + hserver.level = 100; + hserver.cores = 10; + hserver.cache = 5; + hserver.updateHashRate(Player); + hserver.updateHashCapacity(); + Player.hashManager.updateCapacity(Player); + } // Refresh Main Menu (the 'World' menu, specifically) document.getElementById("world-menu-header").click(); diff --git a/src/ScriptEditor/AceNetscriptMode.js b/src/ScriptEditor/AceNetscriptMode.js index 15873e07c..9061f45f1 100644 --- a/src/ScriptEditor/AceNetscriptMode.js +++ b/src/ScriptEditor/AceNetscriptMode.js @@ -101,8 +101,8 @@ let NetscriptFunctions = // Hacknet Node API "hacknet|numNodes|purchaseNode|getPurchaseNodeCost|getNodeStats|" + - "upgradeLevel|upgradeRam|upgradeCore|getLevelUpgradeCost|" + - "getRamUpgradeCost|getCoreUpgradeCost|" + + "upgradeLevel|upgradeRam|upgradeCore|upgradeCache|getLevelUpgradeCost|" + + "getRamUpgradeCost|getCoreUpgradeCost|getCacheUpgradeCost|" + // Gang API "gang|" + diff --git a/src/ScriptEditor/CodeMirrorNetscriptMode.js b/src/ScriptEditor/CodeMirrorNetscriptMode.js index fed212ac8..a240edf1e 100644 --- a/src/ScriptEditor/CodeMirrorNetscriptMode.js +++ b/src/ScriptEditor/CodeMirrorNetscriptMode.js @@ -177,9 +177,11 @@ CodeMirror.defineMode("netscript", function(config, parserConfig) { "upgradeLevel": atom, "upgradeRam": atom, "upgradeCore": atom, + "upgradeCache": atom, "getLevelUpgradeCost": atom, "getRamUpgradeCost": atom, "getCoreUpgradeCost": atom, + "getCacheUpgradeCost": atom, // Netscript Gang API "gang": atom, diff --git a/src/SourceFile.js b/src/SourceFile.js index 63a9f0a02..168087800 100644 --- a/src/SourceFile.js +++ b/src/SourceFile.js @@ -62,7 +62,12 @@ function initSourceFiles() { "Level 3: Ability to use limit/stop orders in other BitNodes

" + "This Source-File also increases your hacking growth multipliers by: " + "
Level 1: 12%
Level 2: 18%
Level 3: 21%"); - SourceFiles["SourceFile9"] = new SourceFile(9); + SourceFiles["SourceFile9"] = new SourceFile(9, "This Source-File grants the following benefits:

" + + "Level 1: Permanently unlocks the Hacknet Server in other BitNodes
" + + "Level 2: You start with 128GB of RAM on your home computer when entering a new BitNode
" + + "Level 3: Grants a highly-upgraded Hacknet Server when entering a new BitNode

" + + "(Note that the Level 3 effect of this Source-File only applies when entering a new BitNode, NOT " + + "when installing Augmentations)"); SourceFiles["SourceFile10"] = new SourceFile(10, "This Source-File unlocks Sleeve technology in other BitNodes. Each level of this " + "Source-File also grants you a Duplicate Sleeve"); SourceFiles["SourceFile11"] = new SourceFile(11, "This Source-File makes it so that company favor increases BOTH the player's salary and reputation gain rate " + @@ -119,7 +124,7 @@ function applySourceFile(srcFile) { Player.hacknet_node_level_cost_mult *= decMult; Player.work_money_mult *= incMult; break; - case 2: //Rise of the Underworld + case 2: // Rise of the Underworld var mult = 0; for (var i = 0; i < srcFile.lvl; ++i) { mult += (24 / (Math.pow(2, i))); @@ -129,7 +134,7 @@ function applySourceFile(srcFile) { Player.crime_success_mult *= incMult; Player.charisma_mult *= incMult; break; - case 3: //Corporatocracy + case 3: // Corporatocracy var mult = 0; for (var i = 0; i < srcFile.lvl; ++i) { mult += (8 / (Math.pow(2, i))); @@ -138,10 +143,10 @@ function applySourceFile(srcFile) { Player.charisma_mult *= incMult; Player.work_money_mult *= incMult; break; - case 4: //The Singularity - //No effects, just gives access to Singularity functions + case 4: // The Singularity + // No effects, just gives access to Singularity functions break; - case 5: //Artificial Intelligence + case 5: // Artificial Intelligence var mult = 0; for (var i = 0; i < srcFile.lvl; ++i) { mult += (8 / (Math.pow(2, i))); @@ -154,7 +159,7 @@ function applySourceFile(srcFile) { Player.hacking_mult *= incMult; Player.hacking_exp_mult *= incMult; break; - case 6: //Bladeburner + case 6: // Bladeburner var mult = 0; for (var i = 0; i < srcFile.lvl; ++i) { mult += (8 / (Math.pow(2, i))); @@ -169,7 +174,7 @@ function applySourceFile(srcFile) { Player.dexterity_mult *= incMult; Player.agility_mult *= incMult; break; - case 7: //Bladeburner 2079 + case 7: // Bladeburner 2079 var mult = 0; for (var i = 0; i < srcFile.lvl; ++i) { mult += (8 / (Math.pow(2, i))); @@ -180,7 +185,7 @@ function applySourceFile(srcFile) { Player.bladeburner_analysis_mult *= incMult; Player.bladeburner_success_chance_mult *= incMult; break; - case 8: //Ghost of Wall Street + case 8: // Ghost of Wall Street var mult = 0; for (var i = 0; i < srcFile.lvl; ++i) { mult += (12 / (Math.pow(2, i))); @@ -188,10 +193,13 @@ function applySourceFile(srcFile) { var incMult = 1 + (mult / 100); Player.hacking_grow_mult *= incMult; break; + case 9: // Hacktocracy + // This has non-multiplier effects + break; case 10: // Digital Carbon // No effects, just grants sleeves break; - case 11: //The Big Crash + case 11: // The Big Crash var mult = 0; for (var i = 0; i < srcFile.lvl; ++i) { mult += (32 / (Math.pow(2, i))); @@ -200,7 +208,7 @@ function applySourceFile(srcFile) { Player.work_money_mult *= incMult; Player.company_rep_mult *= incMult; break; - case 12: //The Recursion + case 12: // The Recursion var inc = Math.pow(1.01, srcFile.lvl); var dec = Math.pow(0.99, srcFile.lvl);