diff --git a/doc/source/basicgameplay/factions.rst b/doc/source/basicgameplay/factions.rst index 67992aa6d..4cecc34c1 100644 --- a/doc/source/basicgameplay/factions.rst +++ b/doc/source/basicgameplay/factions.rst @@ -146,7 +146,7 @@ List of Factions and their Requirements | | | * -90 Karma | | | | | * Not working for CIA or NSA | | +---------------------+----------------+-----------------------------------------+-------------------------------+ -| Endgame | The Covenant | * 30 Augmentations | | +| Endgame | The Covenant | * 20 Augmentations | | | Factions | | * $75b | | | | | * Hacking Level of 850 | | | | | * All Combat Stats of 850 | | diff --git a/doc/source/netscript/netscriptadvancedfunctions.rst b/doc/source/netscript/netscriptadvancedfunctions.rst index bdbd428b1..d41cc060b 100644 --- a/doc/source/netscript/netscriptadvancedfunctions.rst +++ b/doc/source/netscript/netscriptadvancedfunctions.rst @@ -10,33 +10,14 @@ getBitNodeMultipliers .. js:function:: getBitNodeMultipliers() Returns an object containing the current BitNode multipliers. This function requires Source-File 5 in order - to run. The multipliers are returned in integer forms (e.g. 1.5 instead of 150%). The multipliers represent + to run. The multipliers are returned in decimal forms (e.g. 1.5 instead of 150%). The multipliers represent the difference between the current BitNode and the original BitNode (BitNode-1). For example, if the *CrimeMoney* multiplier has a value of 0.1, then that means that committing crimes in the current BitNode - will only give 10% of the money you would have received in BitNode-1. The object has the following structure, - (subject to change in the future):: + will only give 10% of the money you would have received in BitNode-1. - { - ServerMaxMoney: 1, - ServerStartingMoney: 1, - ServerGrowthRate: 1, - ServerWeakenRate: 1, - ServerStartingSecurity: 1, - ManualHackMoney: 1, - ScriptHackMoney: 1, - CompanyWorkMoney: 1, - CrimeMoney: 1, - HacknetNodeMoney: 1, - CompanyWorkExpGain: 1, - ClassGymExpGain: 1, - FactionWorkExpGain: 1, - HackExpGain: 1, - CrimeExpGain: 1, - FactionWorkRepGain: 1, - FactionPassiveRepGain: 1, - AugmentationRepCost: 1, - AugmentationMoneyCost: 1, - } + The structure of the returned object is subject to change as BitNode multipliers get added to the game. + Refer to the `source code here `_ + to see the name of the BitNode multipliers. Example:: diff --git a/package-lock.json b/package-lock.json index 9bbc44011..f0c79f49b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1259,7 +1259,6 @@ "anymatch": "2.0.0", "async-each": "1.0.1", "braces": "2.3.2", - "fsevents": "1.2.4", "glob-parent": "3.1.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -3777,535 +3776,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.12.1", - "node-pre-gyp": "0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.2.4" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "2.1.2" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.2.4" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.2", - "rc": "1.2.7", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.5.1", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true, - "dev": true - } - } - }, "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", @@ -10642,6 +10112,14 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -10675,14 +10153,6 @@ } } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, "stringify-entities": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz", diff --git a/src/BitNode/BitNode.js b/src/BitNode/BitNode.ts similarity index 89% rename from src/BitNode/BitNode.js rename to src/BitNode/BitNode.ts index bb0c74d1e..acb832db0 100644 --- a/src/BitNode/BitNode.js +++ b/src/BitNode/BitNode.ts @@ -1,15 +1,33 @@ import { BitNodeMultipliers } from "./BitNodeMultipliers"; -import { Player } from "../Player"; +import { IPlayer } from "../PersonObjects/IPlayer"; +import { IMap } from "../types"; -function BitNode(n, name, desc="", info="") { - this.number = n; - this.name = name; - this.desc = desc; - this.info = info; +class BitNode { + // A short description, or tagline, about the BitNode + desc: string; + + // A long, detailed overview of the BitNode + info: string; + + // Name of BitNode + name: string; + + // BitNode number + number: number; + + + constructor(n: number, name: string, desc: string="", info: string="") { + this.number = n; + this.name = name; + this.desc = desc; + this.info = info; + } } -let BitNodes = {}; -function initBitNodes() { + +export let BitNodes: IMap = {}; + +export function initBitNodes() { BitNodes = {}; BitNodes["BitNode1"] = new BitNode(1, "Source Genesis", "The original BitNode", "The first BitNode created by the Enders to imprison the minds of humans. It became " + @@ -216,9 +234,9 @@ function initBitNodes() { BitNodes["BitNode24"] = new BitNode(24, "", "COMING SOON"); } -function initBitNodeMultipliers() { - if (Player.bitNodeN == null) { - Player.bitNodeN = 1; +export function initBitNodeMultipliers(p: IPlayer) { + if (p.bitNodeN == null) { + p.bitNodeN = 1; } for (var mult in BitNodeMultipliers) { if (BitNodeMultipliers.hasOwnProperty(mult)) { @@ -226,7 +244,7 @@ function initBitNodeMultipliers() { } } - switch (Player.bitNodeN) { + switch (p.bitNodeN) { case 1: //Source Genesis (every multiplier is 1) break; case 2: //Rise of the Underworld @@ -279,8 +297,8 @@ function initBitNodeMultipliers() { BitNodeMultipliers.CorporationValuation = 0.5; break; case 6: //Bladeburner - BitNodeMultipliers.HackingLevelMultiplier = 0.4; - BitNodeMultipliers.ServerMaxMoney = 0.5; + BitNodeMultipliers.HackingLevelMultiplier = 0.35; + BitNodeMultipliers.ServerMaxMoney = 0.4; BitNodeMultipliers.ServerStartingMoney = 0.5; BitNodeMultipliers.ServerStartingSecurity = 1.5; BitNodeMultipliers.ScriptHackMoney = 0.5; @@ -291,13 +309,14 @@ function initBitNodeMultipliers() { BitNodeMultipliers.HacknetNodeMoney = 0.2; BitNodeMultipliers.FactionPassiveRepGain = 0; BitNodeMultipliers.HackExpGain = 0.25; + BitNodeMultipliers.DaedalusAugsRequirement = 1.166; // Results in 35 Augs needed break; case 7: //Bladeburner 2079 BitNodeMultipliers.BladeburnerRank = 0.6; BitNodeMultipliers.BladeburnerSkillCost = 2; BitNodeMultipliers.AugmentationMoneyCost = 3; - BitNodeMultipliers.HackingLevelMultiplier = 0.4; - BitNodeMultipliers.ServerMaxMoney = 0.5; + BitNodeMultipliers.HackingLevelMultiplier = 0.35; + BitNodeMultipliers.ServerMaxMoney = 0.4; BitNodeMultipliers.ServerStartingMoney = 0.5; BitNodeMultipliers.ServerStartingSecurity = 1.5; BitNodeMultipliers.ScriptHackMoney = 0.5; @@ -308,6 +327,7 @@ function initBitNodeMultipliers() { BitNodeMultipliers.HacknetNodeMoney = 0.2; BitNodeMultipliers.FactionPassiveRepGain = 0; BitNodeMultipliers.HackExpGain = 0.25; + BitNodeMultipliers.DaedalusAugsRequirement = 1.166; // Results in 35 Augs needed break; case 8: //Ghost of Wall Street BitNodeMultipliers.ScriptHackMoney = 0; @@ -321,48 +341,57 @@ function initBitNodeMultipliers() { BitNodeMultipliers.CodingContractMoney = 0; break; case 10: // Digital Carbon - BitNodeMultipliers.HackingLevelMultiplier = 0.2; - BitNodeMultipliers.StrengthLevelMultiplier = 0.4; - BitNodeMultipliers.DefenseLevelMultiplier = 0.4; + BitNodeMultipliers.HackingLevelMultiplier = 0.2; + BitNodeMultipliers.StrengthLevelMultiplier = 0.4; + BitNodeMultipliers.DefenseLevelMultiplier = 0.4; BitNodeMultipliers.DexterityLevelMultiplier = 0.4; - BitNodeMultipliers.AgilityLevelMultiplier = 0.4; - BitNodeMultipliers.CharismaLevelMultiplier = 0.4; - BitNodeMultipliers.CompanyWorkMoney = 0.5; - BitNodeMultipliers.CrimeMoney = 0.5; - BitNodeMultipliers.HacknetNodeMoney = 0.5; - BitNodeMultipliers.ManualHackMoney = 0.5; - BitNodeMultipliers.ScriptHackMoney = 0.5; - BitNodeMultipliers.CodingContractMoney = 0.5; - BitNodeMultipliers.InfiltrationMoney = 0.5; - BitNodeMultipliers.CorporationValuation = 0.5; - BitNodeMultipliers.AugmentationMoneyCost = 5; - BitNodeMultipliers.AugmentationRepCost = 2; - BitNodeMultipliers.PurchasedServerCost = 5; - BitNodeMultipliers.PurchasedServerLimit = 0.6; - BitNodeMultipliers.PurchasedServerMaxRam = 0.5; + BitNodeMultipliers.AgilityLevelMultiplier = 0.4; + BitNodeMultipliers.CharismaLevelMultiplier = 0.4; + BitNodeMultipliers.CompanyWorkMoney = 0.5; + BitNodeMultipliers.CrimeMoney = 0.5; + BitNodeMultipliers.HacknetNodeMoney = 0.5; + BitNodeMultipliers.ManualHackMoney = 0.5; + BitNodeMultipliers.ScriptHackMoney = 0.5; + BitNodeMultipliers.CodingContractMoney = 0.5; + BitNodeMultipliers.InfiltrationMoney = 0.5; + BitNodeMultipliers.CorporationValuation = 0.5; + BitNodeMultipliers.AugmentationMoneyCost = 5; + BitNodeMultipliers.AugmentationRepCost = 2; + BitNodeMultipliers.HomeComputerRamCost = 1.5; + BitNodeMultipliers.PurchasedServerCost = 5; + BitNodeMultipliers.PurchasedServerLimit = 0.6; + BitNodeMultipliers.PurchasedServerMaxRam = 0.5; break; case 11: //The Big Crash - BitNodeMultipliers.ServerMaxMoney = 0.1; - BitNodeMultipliers.ServerStartingMoney = 0.1; - BitNodeMultipliers.ServerGrowthRate = 0.5; - BitNodeMultipliers.ServerWeakenRate = 2; - BitNodeMultipliers.CrimeMoney = 3; - BitNodeMultipliers.CompanyWorkMoney = 0.5; - BitNodeMultipliers.HacknetNodeMoney = 0.1; - BitNodeMultipliers.AugmentationMoneyCost = 2; - BitNodeMultipliers.InfiltrationMoney = 2.5; - BitNodeMultipliers.InfiltrationRep = 2.5; - BitNodeMultipliers.CorporationValuation = 0.01; + BitNodeMultipliers.ServerMaxMoney = 0.1; + BitNodeMultipliers.ServerStartingMoney = 0.1; + BitNodeMultipliers.ServerGrowthRate = 0.5; + BitNodeMultipliers.ServerWeakenRate = 2; + BitNodeMultipliers.CrimeMoney = 3; + BitNodeMultipliers.CompanyWorkMoney = 0.5; + BitNodeMultipliers.HacknetNodeMoney = 0.1; + BitNodeMultipliers.AugmentationMoneyCost = 2; + BitNodeMultipliers.InfiltrationMoney = 2.5; + BitNodeMultipliers.InfiltrationRep = 2.5; + BitNodeMultipliers.CorporationValuation = 0.01; + BitNodeMultipliers.CodingContractMoney = 0.5; + BitNodeMultipliers.FourSigmaMarketDataCost = 4; + BitNodeMultipliers.FourSigmaMarketDataApiCost = 4; break; case 12: //The Recursion var sf12Lvl = 0; - for (var i = 0; i < Player.sourceFiles.length; i++) { - if (Player.sourceFiles[i].n === 12) { - sf12Lvl = Player.sourceFiles[i].lvl; + for (var i = 0; i < p.sourceFiles.length; i++) { + if (p.sourceFiles[i].n === 12) { + sf12Lvl = p.sourceFiles[i].lvl; } } var inc = Math.pow(1.02, sf12Lvl); var dec = 1/inc; + + // Multiplier for number of augs needed for Daedalus increases + // up to a maximum of 1.34, which results in 40 Augs required + BitNodeMultipliers.DaedalusAugsRequirement = Math.min(inc, 1.34); + BitNodeMultipliers.HackingLevelMultiplier = dec; BitNodeMultipliers.StrengthLevelMultiplier = dec; BitNodeMultipliers.DefenseLevelMultiplier = dec; @@ -378,6 +407,8 @@ function initBitNodeMultipliers() { //Does not scale, otherwise security might start at 300+ BitNodeMultipliers.ServerStartingSecurity = 1.5; + BitNodeMultipliers.HomeComputerRamCost = inc; + BitNodeMultipliers.PurchasedServerCost = inc; BitNodeMultipliers.PurchasedServerLimit = dec; BitNodeMultipliers.PurchasedServerMaxRam = dec; @@ -404,6 +435,9 @@ function initBitNodeMultipliers() { BitNodeMultipliers.InfiltrationMoney = dec; BitNodeMultipliers.InfiltrationRep = dec; + BitNodeMultipliers.FourSigmaMarketDataCost = inc; + BitNodeMultipliers.FourSigmaMarketDataApiCost = inc; + BitNodeMultipliers.CorporationValuation = dec; BitNodeMultipliers.BladeburnerRank = dec; @@ -414,7 +448,3 @@ function initBitNodeMultipliers() { break; } } - -export {initBitNodes, - BitNodes, - initBitNodeMultipliers}; diff --git a/src/BitNode/BitNodeMultipliers.ts b/src/BitNode/BitNodeMultipliers.ts index 0e579c11a..e6d66062c 100644 --- a/src/BitNode/BitNodeMultipliers.ts +++ b/src/BitNode/BitNodeMultipliers.ts @@ -69,6 +69,11 @@ interface IBitNodeMultipliers { */ CrimeMoney: number; + /** + * Influences how many Augmentations you need in order to get invited to the Daedalus faction + */ + DaedalusAugsRequirement: number; + /** * Influences how quickly the player's defense level (not exp) scales */ @@ -94,6 +99,16 @@ interface IBitNodeMultipliers { */ FactionWorkRepGain: number; + /** + * Influences how much it costs to unlock the stock market's 4S Market Data API + */ + FourSigmaMarketDataApiCost: number; + + /** + * Influences how much it costs to unlock the stock market's 4S Market Data (NOT API) + */ + FourSigmaMarketDataCost: number; + /** * Influences the experienced gained when hacking a server. */ @@ -109,6 +124,11 @@ interface IBitNodeMultipliers { */ HacknetNodeMoney: number; + /** + * Influences how much money it costs to upgrade your home computer's RAM + */ + HomeComputerRamCost: number; + /** * Influences how much money is gained when the player infiltrates a company. */ @@ -178,6 +198,9 @@ interface IBitNodeMultipliers { * Influences how quickly the player's strength level (not exp) scales */ StrengthLevelMultiplier: number; + + // Index signature + [key: string]: number; } /** @@ -185,48 +208,55 @@ interface IBitNodeMultipliers { */ // tslint:disable-next-line:variable-name export const BitNodeMultipliers: IBitNodeMultipliers = { - HackingLevelMultiplier: 1, - StrengthLevelMultiplier: 1, - DefenseLevelMultiplier: 1, - DexterityLevelMultiplier: 1, - AgilityLevelMultiplier: 1, - CharismaLevelMultiplier: 1, + HackingLevelMultiplier: 1, + StrengthLevelMultiplier: 1, + DefenseLevelMultiplier: 1, + DexterityLevelMultiplier: 1, + AgilityLevelMultiplier: 1, + CharismaLevelMultiplier: 1, - ServerGrowthRate: 1, - ServerMaxMoney: 1, - ServerStartingMoney: 1, - ServerStartingSecurity: 1, - ServerWeakenRate: 1, + ServerGrowthRate: 1, + ServerMaxMoney: 1, + ServerStartingMoney: 1, + ServerStartingSecurity: 1, + ServerWeakenRate: 1, - PurchasedServerCost: 1, - PurchasedServerLimit: 1, - PurchasedServerMaxRam: 1, + HomeComputerRamCost: 1, - CompanyWorkMoney: 1, - CrimeMoney: 1, - HacknetNodeMoney: 1, - ManualHackMoney: 1, - ScriptHackMoney: 1, - CodingContractMoney: 1, + PurchasedServerCost: 1, + PurchasedServerLimit: 1, + PurchasedServerMaxRam: 1, - ClassGymExpGain: 1, - CompanyWorkExpGain: 1, - CrimeExpGain: 1, - FactionWorkExpGain: 1, - HackExpGain: 1, + CompanyWorkMoney: 1, + CrimeMoney: 1, + HacknetNodeMoney: 1, + ManualHackMoney: 1, + ScriptHackMoney: 1, + CodingContractMoney: 1, - FactionPassiveRepGain: 1, - FactionWorkRepGain: 1, - RepToDonateToFaction: 1, + ClassGymExpGain: 1, + CompanyWorkExpGain: 1, + CrimeExpGain: 1, + FactionWorkExpGain: 1, + HackExpGain: 1, - AugmentationMoneyCost: 1, - AugmentationRepCost: 1, + FactionPassiveRepGain: 1, + FactionWorkRepGain: 1, + RepToDonateToFaction: 1, - InfiltrationMoney: 1, - InfiltrationRep: 1, + AugmentationMoneyCost: 1, + AugmentationRepCost: 1, - CorporationValuation: 1, + InfiltrationMoney: 1, + InfiltrationRep: 1, - BladeburnerRank: 1, - BladeburnerSkillCost: 1, + FourSigmaMarketDataCost: 1, + FourSigmaMarketDataApiCost: 1, + + CorporationValuation: 1, + + BladeburnerRank: 1, + BladeburnerSkillCost: 1, + + DaedalusAugsRequirement: 1, }; diff --git a/src/Constants.ts b/src/Constants.ts index 83264a5d3..ac291503f 100644 --- a/src/Constants.ts +++ b/src/Constants.ts @@ -274,7 +274,7 @@ export let CONSTANTS: IMap = { /* Coding Contract Constants */ CodingContractBaseFactionRepGain: 2500, CodingContractBaseCompanyRepGain: 4000, - CodingContractBaseMoneyGain: 50e6, + CodingContractBaseMoneyGain: 75e6, // BitNode/Source-File related stuff TotalNumBitNodes: 24, @@ -510,25 +510,17 @@ export let CONSTANTS: IMap = { LatestUpdate: ` - v0.43.1 - * Terminal changes: - ** Quoted arguments are now properly parsed. (e.g. 'run f.script "this is one argument"' will be correctly parsed) - ** Errors are now shown in red text - ** 'unalias' command now has a different format and no longer needs the quotations - ** Bug Fix: Fixed several edge cases where autocomplete wasnt working properly + v0.44.0 + * Added new BitNode multipliers: + ** HomeComputerRamCost - Affects how much it costs to upgrade home computer's RAM + ** DaedalusAugsRequirement - Affects how many Augmentations you need in order to get invited to Daedalus + ** FourSigmaMarketDataCost - Affects how much it costs to unlock the stock market's 4S Market Data + ** FourSigmaMarketDataApiCost - Affects how much it costs to unlock the stock market's 4S Market Data API - * Added two new Bladeburner skills for increasing money and experience gain - * Made some minor adjustments to Bladeburner UI - * Corporation "Smart Factories" and "Smart Storage" upgrades have slightly lower price multipliers - * Added nFormat Netscript function - * Added 6 new Coding Contract problems - * Updated documentation with list of all Coding Contract problems - * Minor improvements for 'Active Scripts' UI - * Implemented several optimizations for active scripts. The game should now use less memory and the savefile should be slightly smaller when there are many scripts running - * Bug Fix: A Stock Forecast should no longer go above 1 (i.e. 100%) - * Bug Fix: The cost of Resleeves should no longer be affected by buying Augs - * Bug Fix: Duplicate Sleeves now use their own stats to determine crime success rate, instead of the host consciousness' stats - * Bug Fix: You can now call the prompt() Netscript function from multiple scripts simultaneously + * A few minor changes to BitNode multipliers across the board (mostly for the new multipliers) + * 'The Covenant' now requires 20 total Augmentations to get invited, rather than 30 + * You can now purchase permanent Duplicate Sleeves from 'The Covenant'. This requires Source-File 10, and you must be in BN-10 or after + * Increased the money gained from Coding Contracts by 50% ` } diff --git a/src/Faction/FactionHelpers.js b/src/Faction/FactionHelpers.js index 281764481..3fbf25487 100644 --- a/src/Faction/FactionHelpers.js +++ b/src/Faction/FactionHelpers.js @@ -12,6 +12,9 @@ import { HackingMission, setInMission } from "../Missions"; import { Player } from "../Player"; import { PurchaseAugmentationsOrderSetting } from "../Settings/SettingEnums"; import { Settings } from "../Settings/Settings"; +import { SourceFileFlags } from "../SourceFile/SourceFileFlags"; + +import { createPurchaseSleevesFromCovenantPopup } from "../PersonObjects/Sleeve/SleeveCovenantPurchases"; import {Page, routing} from "../ui/navigationTracking"; import {numeralWrapper} from "../ui/numeralFormat"; @@ -57,6 +60,9 @@ function displayFactionContent(factionName) { if (faction == null) { throw new Error("Invalid factionName passed into displayFactionContent: " + factionName); } + if (!faction.isMember) { + throw new Error("Not a member of this faction, cannot display faction information"); + } var factionInfo = faction.getInfo(); removeChildrenFromElement(Engine.Display.factionContent); @@ -108,9 +114,7 @@ function displayFactionContent(factionName) { elements.push(createElement("br")); //Hacking Mission Option - var hackMissionDiv = createElement("div", { - id:"faction-hack-mission-div", class:"faction-work-div", - }); + var hackMissionDiv = createElement("div", { class:"faction-work-div" }); var hackMissionDivWrapper = createElement("div", {class:"faction-work-div-wrapper"}); hackMissionDiv.appendChild(hackMissionDivWrapper); hackMissionDivWrapper.appendChild(createElement("a", { @@ -131,9 +135,7 @@ function displayFactionContent(factionName) { elements.push(hackMissionDiv); //Hacking Contracts Option - var hackDiv = createElement("div", { - id:"faction-hack-div", class:"faction-work-div", - }); + var hackDiv = createElement("div", { class:"faction-work-div", }); var hackDivWrapper = createElement("div", {class:"faction-work-div-wrapper"}); hackDiv.appendChild(hackDivWrapper); hackDivWrapper.appendChild(createElement("a", { @@ -152,9 +154,7 @@ function displayFactionContent(factionName) { elements.push(hackDiv); //Field Work Option - var fieldWorkDiv = createElement("div", { - id:"faction-fieldwork-div", class:"faction-work-div" - }); + var fieldWorkDiv = createElement("div", { class:"faction-work-div" }); var fieldWorkDivWrapper = createElement("div", {class:"faction-work-div-wrapper"}); fieldWorkDiv.appendChild(fieldWorkDivWrapper); fieldWorkDivWrapper.appendChild(createElement("a", { @@ -173,9 +173,7 @@ function displayFactionContent(factionName) { elements.push(fieldWorkDiv); //Security Work Option - var securityWorkDiv = createElement("div", { - id:"faction-securitywork-div", class:"faction-work-div" - }); + var securityWorkDiv = createElement("div", { class:"faction-work-div" }); var securityWorkDivWrapper = createElement("div", {class:"faction-work-div-wrapper"}); securityWorkDiv.appendChild(securityWorkDivWrapper); securityWorkDivWrapper.appendChild(createElement("a", { @@ -194,9 +192,7 @@ function displayFactionContent(factionName) { elements.push(securityWorkDiv); //Donate for reputation - var donateDiv = createElement("div", { - id:"faction-donate-div", class:"faction-work-div" - }); + var donateDiv = createElement("div", { class:"faction-work-div" }); var donateDivWrapper = createElement("div", {class:"faction-work-div-wrapper"}); donateDiv.appendChild(donateDivWrapper); var donateRepGain = createElement("p", { @@ -247,12 +243,13 @@ function displayFactionContent(factionName) { "your abilities.

" })); elements.push(createElement("a", { - class:"a-link-button", innerText:"Purchase Augmentations", + class:"std-button", + innerText:"Purchase Augmentations", + margin: "5px", clickListener:()=>{ Engine.hideAllContent(); Engine.Display.factionAugmentationsContent.style.display = "block"; - displayFactionAugmentations(factionName); return false; } @@ -338,10 +335,26 @@ function displayFactionContent(factionName) { return; } - if (!faction.isMember) { - throw new Error("Not a member of this faction, cannot display faction information"); - } + // Purchase Sleeves from Covenant + if (Player.bitNodeN >= 10 && SourceFileFlags[10]) { + const covenantPurchaseSleevesDiv = createElement("div", { class: "faction-work-div" }); + const covenantPurchaseSleevesDivWrapper = createElement("div", { class: "faction-wkro-div-wrapper" }); + covenantPurchaseSleevesDiv.appendChild(covenantPurchaseSleevesDivWrapper); + covenantPurchaseSleevesDivWrapper.appendChild(createElement("button", { + class: "std-button", + innerText: "Purchase Duplicate Sleeves", + clickListener: () => { + createPurchaseSleevesFromCovenantPopup(Player); + } + })); + covenantPurchaseSleevesDivWrapper.appendChild(createElement("p", { + innerText: "Purchase Duplicate Sleeves. These are permanent! You can purchase up to 5 total.", + })); + elements.push(covenantPurchaseSleevesDiv); + } + + // Determine if actions should be possible donateDiv.style.display = faction.favor >= Math.floor(CONSTANTS.BaseFavorToDonate * BitNodeMultipliers.RepToDonateToFaction) ? "inline" : "none"; hackMissionDiv.style.display = factionInfo.offerHackingMission ? "inline": "none"; diff --git a/src/NetscriptFunctions.js b/src/NetscriptFunctions.js index b51a1c22b..5ff052abc 100644 --- a/src/NetscriptFunctions.js +++ b/src/NetscriptFunctions.js @@ -51,6 +51,8 @@ import {StockMarket, StockSymbols, SymbolToStockMap, sellStock, updateStockPlayerPosition, shortStock, sellShort, OrderTypes, PositionTypes, placeOrder, cancelOrder} from "./StockMarket/StockMarket"; +import { getStockmarket4SDataCost, + getStockMarket4STixApiCost } from "./StockMarket/StockMarketCosts"; import {numeralWrapper} from "./ui/numeralFormat"; import {post} from "./ui/postToTerminal"; import {TextFile, getTextFile, createTextFile} from "./TextFile"; @@ -1847,7 +1849,7 @@ function NetscriptFunctions(workerScript) { return true; } - if (Player.money.lt(CONSTANTS.MarketData4SCost)) { + if (Player.money.lt(getStockMarket4SDataCost())) { if (workerScript.shouldLog("purchase4SMarketData")) { workerScript.log("Failed to purchase 4S Market Data - Not enough money"); } @@ -1855,7 +1857,7 @@ function NetscriptFunctions(workerScript) { } Player.has4SData = true; - Player.loseMoney(CONSTANTS.MarketData4SCost); + Player.loseMoney(getStockMarket4SDataCost()); if (workerScript.shouldLog("purchase4SMarketData")) { workerScript.log("Purchased 4S Market Data"); } @@ -1878,7 +1880,7 @@ function NetscriptFunctions(workerScript) { return true; } - if (Player.money.lt(CONSTANTS.MarketDataTixApi4SCost)) { + if (Player.money.lt(getStockMarket4STixApiCost())) { if (workerScript.shouldLog("purchase4SMarketDataTixApi")) { workerScript.log("Failed to purchase 4S Market Data TIX API - Not enough money"); } @@ -1886,7 +1888,7 @@ function NetscriptFunctions(workerScript) { } Player.has4SDataTixApi = true; - Player.loseMoney(CONSTANTS.MarketDataTixApi4SCost); + Player.loseMoney(getStockMarket4STixApiCost()); if (workerScript.shouldLog("purchase4SMarketDataTixApi")) { workerScript.log("Purchased 4S Market Data TIX API"); } diff --git a/src/PersonObjects/IPlayer.ts b/src/PersonObjects/IPlayer.ts index 80b842a28..3325bd274 100644 --- a/src/PersonObjects/IPlayer.ts +++ b/src/PersonObjects/IPlayer.ts @@ -15,6 +15,7 @@ export interface IPlayer { // Class members augmentations: IPlayerOwnedAugmentation[]; bladeburner: any; + bitNodeN: number; companyName: string; corporation: any; factions: string[]; diff --git a/src/Player.js b/src/Player.js index 630b5b21a..61cc7abd5 100644 --- a/src/Player.js +++ b/src/Player.js @@ -438,13 +438,13 @@ PlayerObject.prototype.getHomeComputer = function() { PlayerObject.prototype.getUpgradeHomeRamCost = function() { //Calculate how many times ram has been upgraded (doubled) - const currentRam = Player.getHomeComputer().maxRam; + const currentRam = this.getHomeComputer().maxRam; const numUpgrades = Math.log2(currentRam); //Calculate cost //Have cost increase by some percentage each time RAM has been upgraded const mult = Math.pow(1.58, numUpgrades); - var cost = currentRam * CONSTANTS.BaseCostFor1GBOfRamHome * mult; + var cost = currentRam * CONSTANTS.BaseCostFor1GBOfRamHome * mult * BitNodeMultipliers.HomeComputerRamCost; return cost; } @@ -2044,7 +2044,7 @@ PlayerObject.prototype.checkForFactionInvitations = function() { //Daedalus var daedalusFac = Factions["Daedalus"]; if (!daedalusFac.isBanned && !daedalusFac.isMember && !daedalusFac.alreadyInvited && - numAugmentations >= 30 && + numAugmentations >= Math.round(30 * BitNodeMultipliers.DaedalusAugsRequirement) && this.money.gte(100000000000) && (this.hacking_skill >= 2500 || (this.strength >= 1500 && this.defense >= 1500 && @@ -2055,7 +2055,7 @@ PlayerObject.prototype.checkForFactionInvitations = function() { //The Covenant var covenantFac = Factions["The Covenant"]; if (!covenantFac.isBanned && !covenantFac.isMember && !covenantFac.alreadyInvited && - numAugmentations >= 30 && + numAugmentations >= 20 && this.money.gte(75000000000) && this.hacking_skill >= 850 && this.strength >= 850 && diff --git a/src/Prestige.js b/src/Prestige.js index a71e322a7..bda6724a7 100755 --- a/src/Prestige.js +++ b/src/Prestige.js @@ -55,7 +55,7 @@ function prestigeAugmentation() { Engine.loadTerminalContent(); routing.navigateTo(Page.Terminal); - initBitNodeMultipliers(); + initBitNodeMultipliers(Player); Player.prestigeAugmentation(); @@ -175,7 +175,7 @@ function prestigeAugmentation() { //Prestige by destroying Bit Node and gaining a Source File function prestigeSourceFile() { - initBitNodeMultipliers(); + initBitNodeMultipliers(Player); updateSourceFileFlags(Player); Player.prestigeSourceFile(); diff --git a/src/StockMarket/StockMarket.js b/src/StockMarket/StockMarket.js index 4e3ebe3b4..8a3080a77 100644 --- a/src/StockMarket/StockMarket.js +++ b/src/StockMarket/StockMarket.js @@ -1,4 +1,6 @@ import {Stock} from "./Stock"; +import { getStockMarket4SDataCost, + getStockMarket4STixApiCost } from "./StockMarketCosts"; import {CONSTANTS} from "../Constants"; import {Locations} from "../Locations"; @@ -767,13 +769,13 @@ function displayStockMarketContent() { //Purchase Four Sigma Market Data Feed var marketDataButton = clearEventListeners("stock-market-buy-4s-data"); - stylePurchaseButton(marketDataButton, CONSTANTS.MarketData4SCost, Player.has4SData, - "Buy 4S Market Data Access - " + numeralWrapper.format(CONSTANTS.MarketData4SCost, '($0.000a)'), + stylePurchaseButton(marketDataButton, getStockMarket4SDataCost(), Player.has4SData, + "Buy 4S Market Data Access - " + numeralWrapper.format(getStockMarket4SDataCost(), '($0.000a)'), "4S Market Data - Purchased"); marketDataButton.addEventListener("click", function() { - if (Player.money.lt(CONSTANTS.MarketData4SCost)) { return false; } + if (Player.money.lt(getStockMarket4SDataCost())) { return false; } Player.has4SData = true; - Player.loseMoney(CONSTANTS.MarketData4SCost); + Player.loseMoney(getStockMarket4SDataCost()); displayStockMarketContent(); return false; }); @@ -806,14 +808,14 @@ function displayStockMarketContent() { //Purchase Four Sigma Market Data TIX API (Requires TIX API Access) var marketDataTixButton = clearEventListeners("stock-market-buy-4s-tix-api"); - stylePurchaseButton(marketDataTixButton, CONSTANTS.MarketDataTixApi4SCost, Player.has4SDataTixApi, - "Buy 4S Market Data TIX API Access - " + numeralWrapper.format(CONSTANTS.MarketDataTixApi4SCost, '($0.000a)'), + stylePurchaseButton(marketDataTixButton, getStockMarket4STixApiCost(), Player.has4SDataTixApi, + "Buy 4S Market Data TIX API Access - " + numeralWrapper.format(getStockMarket4STixApiCost(), '($0.000a)'), "4S Market Data TIX API - Purchased"); if (Player.hasTixApiAccess) { marketDataTixButton.addEventListener("click", function() { - if (Player.money.lt(CONSTANTS.MarketDataTixApi4SCost)) { return false; } + if (Player.money.lt(getStockMarket4STixApiCost())) { return false; } Player.has4SDataTixApi = true; - Player.loseMoney(CONSTANTS.MarketDataTixApi4SCost); + Player.loseMoney(getStockMarket4STixApiCost()); displayStockMarketContent(); return false; }); diff --git a/src/StockMarket/StockMarketCosts.ts b/src/StockMarket/StockMarketCosts.ts new file mode 100644 index 000000000..699cd2088 --- /dev/null +++ b/src/StockMarket/StockMarketCosts.ts @@ -0,0 +1,18 @@ +import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers"; +import { CONSTANTS } from "../Constants"; + +export function getStockMarketAccountCost(): number { + return CONSTANTS.WSEAccountCost; +} + +export function getStockMarketTixApiCost(): number { + return CONSTANTS.TIXAPICost; +} + +export function getStockMarket4SDataCost(): number { + return CONSTANTS.MarketData4SCost * BitNodeMultipliers.FourSigmaMarketDataCost; +} + +export function getStockMarket4STixApiCost(): number { + return CONSTANTS.MarketDataTixApi4SCost * BitNodeMultipliers.FourSigmaMarketDataApiCost; +} diff --git a/src/engine.js b/src/engine.js index ad29afe8b..6c3ca4388 100644 --- a/src/engine.js +++ b/src/engine.js @@ -1275,7 +1275,7 @@ const Engine = { if (loadGame(saveString)) { console.log("Loaded game from save"); initBitNodes(); - initBitNodeMultipliers(); + initBitNodeMultipliers(Player); initSourceFiles(); Engine.setDisplayElements(); //Sets variables for important DOM elements Engine.init(); //Initialize buttons, work, etc. @@ -1397,7 +1397,7 @@ const Engine = { //No save found, start new game console.log("Initializing new game"); initBitNodes(); - initBitNodeMultipliers(); + initBitNodeMultipliers(Player); initSourceFiles(); initSpecialServerIps(); Engine.setDisplayElements(); //Sets variables for important DOM elements